appium-uiautomator2-driver 2.22.1 → 2.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +75 -0
- package/build/lib/commands/actions.js +1 -1
- package/build/lib/commands/actions.js.map +1 -1
- package/build/lib/commands/alert.js +1 -1
- package/build/lib/commands/alert.js.map +1 -1
- package/build/lib/commands/app-strings.js +1 -1
- package/build/lib/commands/app-strings.js.map +1 -1
- package/build/lib/commands/element.js +1 -1
- package/build/lib/commands/element.js.map +1 -1
- package/build/lib/commands/find.js +1 -1
- package/build/lib/commands/find.js.map +1 -1
- package/build/lib/commands/general.js +7 -2
- package/build/lib/commands/general.js.map +1 -1
- package/build/lib/commands/index.js +1 -1
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/screenshot.js +1 -1
- package/build/lib/commands/screenshot.js.map +1 -1
- package/build/lib/commands/viewport.js +1 -1
- package/build/lib/commands/viewport.js.map +1 -1
- package/build/lib/css-converter.js +1 -1
- package/build/lib/css-converter.js.map +1 -1
- package/build/lib/desired-caps.js +1 -1
- package/build/lib/desired-caps.js.map +1 -1
- package/build/lib/driver.js +1 -1
- package/build/lib/driver.js.map +1 -1
- package/build/lib/helpers.js +1 -1
- package/build/lib/helpers.js.map +1 -1
- package/build/lib/uiautomator2.js +1 -1
- package/build/lib/uiautomator2.js.map +1 -1
- package/lib/commands/general.js +6 -0
- package/npm-shrinkwrap.json +281 -20
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"css-converter.js","names":["_cssSelectorParser","require","_lodash","_driver","parser","CssSelectorParser","registerSelectorPseudos","registerNestingOperators","registerAttrEqualityMods","enableSubstitutes","RESOURCE_ID","ID_LOCATOR_PATTERN","BOOLEAN_ATTRS","NUMERIC_ATTRS","STR_ATTRS","ALL_ATTRS","ATTRIBUTE_ALIASES","toSnakeCase","str","tokens","split","map","charAt","toUpperCase","slice","toLowerCase","out","join","assertGetBool","css","_css$value","val","value","includes","Error","name","assertGetAttrName","attrName","officialAttr","aliasAttrs","getWordMatcherRegex","word","escapeRegExp","CssConverter","constructor","selector","pkg","formatIdLocator","locator","test","parseAttr","cssAttr","valueType","methodName","operator","parsePseudo","cssPseudo","pseudoName","parseCssRule","cssRule","nestingOperator","uiAutomatorSelector","tagName","androidClass","classNames","cssClassNames","push","id","attrs","attr","pseudos","pseudo","rule","parseCssObject","type","selectors","toUiAutomatorSelector","cssObj","parse","e","errors","InvalidSelectorError","_default","exports","default"],"sources":["../../lib/css-converter.js"],"sourcesContent":["import { CssSelectorParser } from 'css-selector-parser';\nimport { escapeRegExp } from 'lodash';\nimport { errors } from 'appium/driver';\n\nconst parser = new CssSelectorParser();\nparser.registerSelectorPseudos('has');\nparser.registerNestingOperators('>', '+', '~');\nparser.registerAttrEqualityMods('^', '$', '*', '~');\nparser.enableSubstitutes();\n\nconst RESOURCE_ID = 'resource-id';\nconst ID_LOCATOR_PATTERN = /^[a-zA-Z_][a-zA-Z0-9._]*:id\\/[\\S]+$/;\n\nconst BOOLEAN_ATTRS = [\n 'checkable', 'checked', 'clickable', 'enabled', 'focusable',\n 'focused', 'long-clickable', 'scrollable', 'selected',\n];\n\nconst NUMERIC_ATTRS = [\n 'index', 'instance',\n];\n\nconst STR_ATTRS = [\n 'description', RESOURCE_ID, 'text', 'class-name', 'package-name'\n];\n\nconst ALL_ATTRS = [\n ...BOOLEAN_ATTRS,\n ...NUMERIC_ATTRS,\n ...STR_ATTRS,\n];\n\nconst ATTRIBUTE_ALIASES = [\n [RESOURCE_ID, ['id']],\n ['description', [\n 'content-description', 'content-desc',\n 'desc', 'accessibility-id',\n ]],\n ['index', ['nth-child']],\n];\n\n/**\n * Convert hyphen separated word to snake case\n *\n * @param {string} str\n * @returns {string} The hyphen separated word translated to snake case\n */\nfunction toSnakeCase (str) {\n if (!str) {\n return '';\n }\n const tokens = str.split('-').map((str) => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase());\n const out = tokens.join('');\n return out.charAt(0).toLowerCase() + out.slice(1);\n}\n\n/**\n * @typedef {Object} CssNameValueObject\n * @property {?name} name The name of the CSS object\n * @property {?string} value The value of the CSS object\n */\n\n/**\n * Get the boolean from a CSS object. If empty, return true. If not true/false/empty, throw exception\n *\n * @param {CssNameValueObject} css A CSS object that has 'name' and 'value'\n * @returns {string} Either 'true' or 'false'. If value is empty, return 'true'\n */\nfunction assertGetBool (css) {\n const val = css.value?.toLowerCase() || 'true'; // an omitted boolean attribute means 'true' (e.g.: input[checked] means checked is true)\n if (['true', 'false'].includes(val)) {\n return val;\n }\n throw new Error(`'${css.name}' must be true, false or empty. Found '${css.value}'`);\n}\n\n/**\n * Get the canonical form of a CSS attribute name\n *\n * Converts to lowercase and if an attribute name is an alias for something else, return\n * what it is an alias for\n *\n * @param {Object} css CSS object\n * @returns {string} The canonical attribute name\n */\nfunction assertGetAttrName (css) {\n const attrName = css.name.toLowerCase();\n\n // Check if it's supported and if it is, return it\n if (ALL_ATTRS.includes(attrName)) {\n return attrName.toLowerCase();\n }\n\n // If attrName is an alias for something else, return that\n for (const [officialAttr, aliasAttrs] of ATTRIBUTE_ALIASES) {\n if (aliasAttrs.includes(attrName)) {\n return officialAttr;\n }\n }\n throw new Error(`'${attrName}' is not a valid attribute. ` +\n `Supported attributes are '${ALL_ATTRS.join(', ')}'`);\n}\n\n/**\n * Get a regex that matches a whole word. For the ~= CSS attribute selector.\n *\n * @param {string} word\n * @returns {string} A regex \"word\" matcher\n */\nfunction getWordMatcherRegex (word) {\n return `\\\\b(\\\\w*${escapeRegExp(word)}\\\\w*)\\\\b`;\n}\n\n/**\n * @typedef {Object} CssAttr\n * @property {?string} valueType Type of attribute (must be string or empty)\n * @property {?string} value Value of the attribute\n * @property {?string} operator The operator between value and value type (=, *=, , ^=, $=)\n */\n\n/**\n * @typedef {Object} CssRule\n * @property {?string} nestingOperator The nesting operator (aka: combinator https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors)\n * @property {?string} tagName The tag name (aka: type selector https://developer.mozilla.org/en-US/docs/Web/CSS/Type_selectors)\n * @property {?string[]} classNames An array of CSS class names\n * @property {?CssAttr[]} attrs An array of CSS attributes\n * @property {?CssPseudo[]} attrs An array of CSS pseudos\n * @property {?string} id CSS identifier\n * @property {?CssRule} rule A descendant of this CSS rule\n */\n\n/**\n * @typedef {Object} CssObject\n * @property {?string} type Type of CSS object. 'rule', 'ruleset' or 'selectors'\n */\n\n/**\n * @typedef {Object} CssPseudo\n * @property {?string} valueType The type of CSS pseudo selector (https://www.npmjs.com/package/css-selector-parser for reference)\n * @property {?string} name The name of the pseudo selector\n * @property {?string} value The value of the pseudo selector\n */\n\nclass CssConverter {\n\n constructor (selector, pkg) {\n this.selector = selector;\n this.pkg = pkg;\n }\n\n /**\n * Add `<pkgName>:id/` prefix to beginning of string if it's not there already\n *\n * @param {string} locator The initial locator\n * @returns {string} String with `<pkgName>:id/` prepended (if it wasn't already)\n */\n formatIdLocator (locator) {\n return ID_LOCATOR_PATTERN.test(locator)\n ? locator\n : `${this.pkg || 'android'}:id/${locator}`;\n }\n\n /**\n * Convert a CSS attribute into a UiSelector method call\n *\n * @param {CssAttr} cssAttr CSS attribute object\n * @returns {string} CSS attribute parsed as UiSelector\n */\n parseAttr (cssAttr) {\n if (cssAttr.valueType && cssAttr.valueType !== 'string') {\n throw new Error(`'${cssAttr.name}=${cssAttr.value}' is an invalid attribute. ` +\n `Only 'string' and empty attribute types are supported. Found '${cssAttr.valueType}'`);\n }\n const attrName = assertGetAttrName(cssAttr);\n const methodName = toSnakeCase(attrName);\n\n // Validate that it's a supported attribute\n if (!STR_ATTRS.includes(attrName) && !BOOLEAN_ATTRS.includes(attrName)) {\n throw new Error(`'${attrName}' is not supported. Supported attributes are ` +\n `'${[...STR_ATTRS, ...BOOLEAN_ATTRS].join(', ')}'`);\n }\n\n // Parse boolean, if it's a boolean attribute\n if (BOOLEAN_ATTRS.includes(attrName)) {\n return `.${methodName}(${assertGetBool(cssAttr)})`;\n }\n\n // Otherwise parse as string\n let value = cssAttr.value || '';\n if (attrName === RESOURCE_ID) {\n value = this.formatIdLocator(value);\n }\n if (value === '') {\n return `.${methodName}Matches(\"\")`;\n }\n\n switch (cssAttr.operator) {\n case '=':\n return `.${methodName}(\"${value}\")`;\n case '*=':\n if (['description', 'text'].includes(attrName)) {\n return `.${methodName}Contains(\"${value}\")`;\n }\n return `.${methodName}Matches(\"${escapeRegExp(value)}\")`;\n case '^=':\n if (['description', 'text'].includes(attrName)) {\n return `.${methodName}StartsWith(\"${value}\")`;\n }\n return `.${methodName}Matches(\"^${escapeRegExp(value)}\")`;\n case '$=':\n return `.${methodName}Matches(\"${escapeRegExp(value)}$\")`;\n case '~=':\n return `.${methodName}Matches(\"${getWordMatcherRegex(value)}\")`;\n default:\n // Unreachable, but adding error in case a new CSS attribute is added.\n throw new Error(`Unsupported CSS attribute operator '${cssAttr.operator}'. ` +\n ` '=', '*=', '^=', '$=' and '~=' are supported.`);\n }\n }\n\n /**\n * Convert a CSS pseudo class to a UiSelector\n *\n * @param {CssPseudo} cssPseudo CSS Pseudo class\n * @returns {string} Pseudo selector parsed as UiSelector\n */\n parsePseudo (cssPseudo) {\n if (cssPseudo.valueType && cssPseudo.valueType !== 'string') {\n throw new Error(`'${cssPseudo.name}=${cssPseudo.value}'. ` +\n `Unsupported css pseudo class value type: '${cssPseudo.valueType}'. Only 'string' type or empty is supported.`);\n }\n\n const pseudoName = assertGetAttrName(cssPseudo);\n\n if (BOOLEAN_ATTRS.includes(pseudoName)) {\n return `.${toSnakeCase(pseudoName)}(${assertGetBool(cssPseudo)})`;\n }\n\n if (NUMERIC_ATTRS.includes(pseudoName)) {\n return `.${pseudoName}(${cssPseudo.value})`;\n }\n }\n\n /**\n * Convert a CSS rule to a UiSelector\n * @param {CssRule} cssRule CSS rule definition\n */\n parseCssRule (cssRule) {\n const { nestingOperator } = cssRule;\n if (nestingOperator && nestingOperator !== ' ') {\n throw new Error(`'${nestingOperator}' is not a supported combinator. ` +\n `Only child combinator (>) and descendant combinator are supported.`);\n }\n\n let uiAutomatorSelector = 'new UiSelector()';\n if (cssRule.tagName && cssRule.tagName !== '*') {\n let androidClass = [cssRule.tagName];\n if (cssRule.classNames) {\n for (const cssClassNames of cssRule.classNames) {\n androidClass.push(cssClassNames);\n }\n uiAutomatorSelector += `.className(\"${androidClass.join('.')}\")`;\n } else {\n uiAutomatorSelector += `.classNameMatches(\"${cssRule.tagName}\")`;\n }\n } else if (cssRule.classNames) {\n uiAutomatorSelector += `.classNameMatches(\"${cssRule.classNames.join('\\\\.')}\")`;\n }\n if (cssRule.id) {\n uiAutomatorSelector += `.resourceId(\"${this.formatIdLocator(cssRule.id)}\")`;\n }\n if (cssRule.attrs) {\n for (const attr of cssRule.attrs) {\n uiAutomatorSelector += this.parseAttr(attr);\n }\n }\n if (cssRule.pseudos) {\n for (const pseudo of cssRule.pseudos) {\n uiAutomatorSelector += this.parsePseudo(pseudo);\n }\n }\n if (cssRule.rule) {\n uiAutomatorSelector += `.childSelector(${this.parseCssRule(cssRule.rule)})`;\n }\n return uiAutomatorSelector;\n }\n\n /**\n * Convert CSS object to UiAutomator2 selector\n * @param {CssObject} css CSS object\n * @returns {string} The CSS object parsed as a UiSelector\n */\n parseCssObject (css) {\n switch (css.type) {\n case 'rule':\n return this.parseCssRule(css);\n case 'ruleSet':\n return this.parseCssObject(css.rule);\n case 'selectors':\n return css.selectors.map((selector) => this.parseCssObject(selector)).join('; ');\n\n default:\n // This is never reachable, but if it ever is do this.\n throw new Error(`UiAutomator does not support '${css.type}' css. Only supports 'rule', 'ruleSet', 'selectors' `);\n }\n }\n\n /**\n * Convert a CSS selector to a UiAutomator2 selector\n *\n * @returns {string} The CSS selector converted to a UiSelector\n */\n toUiAutomatorSelector () {\n let cssObj;\n try {\n cssObj = parser.parse(this.selector);\n } catch (e) {\n throw new errors.InvalidSelectorError(`Invalid CSS selector '${this.selector}'. Reason: '${e}'`);\n }\n try {\n return this.parseCssObject(cssObj);\n } catch (e) {\n throw new errors.InvalidSelectorError(`Unsupported CSS selector '${this.selector}'. Reason: '${e}'`);\n }\n }\n}\n\nexport default CssConverter;"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"css-converter.js","names":["_cssSelectorParser","require","_lodash","_driver","parser","CssSelectorParser","registerSelectorPseudos","registerNestingOperators","registerAttrEqualityMods","enableSubstitutes","RESOURCE_ID","ID_LOCATOR_PATTERN","BOOLEAN_ATTRS","NUMERIC_ATTRS","STR_ATTRS","ALL_ATTRS","ATTRIBUTE_ALIASES","toSnakeCase","str","tokens","split","map","charAt","toUpperCase","slice","toLowerCase","out","join","assertGetBool","css","_css$value","val","value","includes","Error","name","assertGetAttrName","attrName","officialAttr","aliasAttrs","getWordMatcherRegex","word","escapeRegExp","CssConverter","constructor","selector","pkg","formatIdLocator","locator","test","parseAttr","cssAttr","valueType","methodName","operator","parsePseudo","cssPseudo","pseudoName","parseCssRule","cssRule","nestingOperator","uiAutomatorSelector","tagName","androidClass","classNames","cssClassNames","push","id","attrs","attr","pseudos","pseudo","rule","parseCssObject","type","selectors","toUiAutomatorSelector","cssObj","parse","e","errors","InvalidSelectorError","_default","exports","default"],"sources":["../../lib/css-converter.js"],"sourcesContent":["import { CssSelectorParser } from 'css-selector-parser';\nimport { escapeRegExp } from 'lodash';\nimport { errors } from 'appium/driver';\n\nconst parser = new CssSelectorParser();\nparser.registerSelectorPseudos('has');\nparser.registerNestingOperators('>', '+', '~');\nparser.registerAttrEqualityMods('^', '$', '*', '~');\nparser.enableSubstitutes();\n\nconst RESOURCE_ID = 'resource-id';\nconst ID_LOCATOR_PATTERN = /^[a-zA-Z_][a-zA-Z0-9._]*:id\\/[\\S]+$/;\n\nconst BOOLEAN_ATTRS = [\n 'checkable', 'checked', 'clickable', 'enabled', 'focusable',\n 'focused', 'long-clickable', 'scrollable', 'selected',\n];\n\nconst NUMERIC_ATTRS = [\n 'index', 'instance',\n];\n\nconst STR_ATTRS = [\n 'description', RESOURCE_ID, 'text', 'class-name', 'package-name'\n];\n\nconst ALL_ATTRS = [\n ...BOOLEAN_ATTRS,\n ...NUMERIC_ATTRS,\n ...STR_ATTRS,\n];\n\nconst ATTRIBUTE_ALIASES = [\n [RESOURCE_ID, ['id']],\n ['description', [\n 'content-description', 'content-desc',\n 'desc', 'accessibility-id',\n ]],\n ['index', ['nth-child']],\n];\n\n/**\n * Convert hyphen separated word to snake case\n *\n * @param {string} str\n * @returns {string} The hyphen separated word translated to snake case\n */\nfunction toSnakeCase (str) {\n if (!str) {\n return '';\n }\n const tokens = str.split('-').map((str) => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase());\n const out = tokens.join('');\n return out.charAt(0).toLowerCase() + out.slice(1);\n}\n\n/**\n * @typedef {Object} CssNameValueObject\n * @property {?name} name The name of the CSS object\n * @property {?string} value The value of the CSS object\n */\n\n/**\n * Get the boolean from a CSS object. If empty, return true. If not true/false/empty, throw exception\n *\n * @param {CssNameValueObject} css A CSS object that has 'name' and 'value'\n * @returns {string} Either 'true' or 'false'. If value is empty, return 'true'\n */\nfunction assertGetBool (css) {\n const val = css.value?.toLowerCase() || 'true'; // an omitted boolean attribute means 'true' (e.g.: input[checked] means checked is true)\n if (['true', 'false'].includes(val)) {\n return val;\n }\n throw new Error(`'${css.name}' must be true, false or empty. Found '${css.value}'`);\n}\n\n/**\n * Get the canonical form of a CSS attribute name\n *\n * Converts to lowercase and if an attribute name is an alias for something else, return\n * what it is an alias for\n *\n * @param {Object} css CSS object\n * @returns {string} The canonical attribute name\n */\nfunction assertGetAttrName (css) {\n const attrName = css.name.toLowerCase();\n\n // Check if it's supported and if it is, return it\n if (ALL_ATTRS.includes(attrName)) {\n return attrName.toLowerCase();\n }\n\n // If attrName is an alias for something else, return that\n for (const [officialAttr, aliasAttrs] of ATTRIBUTE_ALIASES) {\n if (aliasAttrs.includes(attrName)) {\n return officialAttr;\n }\n }\n throw new Error(`'${attrName}' is not a valid attribute. ` +\n `Supported attributes are '${ALL_ATTRS.join(', ')}'`);\n}\n\n/**\n * Get a regex that matches a whole word. For the ~= CSS attribute selector.\n *\n * @param {string} word\n * @returns {string} A regex \"word\" matcher\n */\nfunction getWordMatcherRegex (word) {\n return `\\\\b(\\\\w*${escapeRegExp(word)}\\\\w*)\\\\b`;\n}\n\n/**\n * @typedef {Object} CssAttr\n * @property {?string} valueType Type of attribute (must be string or empty)\n * @property {?string} value Value of the attribute\n * @property {?string} operator The operator between value and value type (=, *=, , ^=, $=)\n */\n\n/**\n * @typedef {Object} CssRule\n * @property {?string} nestingOperator The nesting operator (aka: combinator https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors)\n * @property {?string} tagName The tag name (aka: type selector https://developer.mozilla.org/en-US/docs/Web/CSS/Type_selectors)\n * @property {?string[]} classNames An array of CSS class names\n * @property {?CssAttr[]} attrs An array of CSS attributes\n * @property {?CssPseudo[]} attrs An array of CSS pseudos\n * @property {?string} id CSS identifier\n * @property {?CssRule} rule A descendant of this CSS rule\n */\n\n/**\n * @typedef {Object} CssObject\n * @property {?string} type Type of CSS object. 'rule', 'ruleset' or 'selectors'\n */\n\n/**\n * @typedef {Object} CssPseudo\n * @property {?string} valueType The type of CSS pseudo selector (https://www.npmjs.com/package/css-selector-parser for reference)\n * @property {?string} name The name of the pseudo selector\n * @property {?string} value The value of the pseudo selector\n */\n\nclass CssConverter {\n\n constructor (selector, pkg) {\n this.selector = selector;\n this.pkg = pkg;\n }\n\n /**\n * Add `<pkgName>:id/` prefix to beginning of string if it's not there already\n *\n * @param {string} locator The initial locator\n * @returns {string} String with `<pkgName>:id/` prepended (if it wasn't already)\n */\n formatIdLocator (locator) {\n return ID_LOCATOR_PATTERN.test(locator)\n ? locator\n : `${this.pkg || 'android'}:id/${locator}`;\n }\n\n /**\n * Convert a CSS attribute into a UiSelector method call\n *\n * @param {CssAttr} cssAttr CSS attribute object\n * @returns {string} CSS attribute parsed as UiSelector\n */\n parseAttr (cssAttr) {\n if (cssAttr.valueType && cssAttr.valueType !== 'string') {\n throw new Error(`'${cssAttr.name}=${cssAttr.value}' is an invalid attribute. ` +\n `Only 'string' and empty attribute types are supported. Found '${cssAttr.valueType}'`);\n }\n const attrName = assertGetAttrName(cssAttr);\n const methodName = toSnakeCase(attrName);\n\n // Validate that it's a supported attribute\n if (!STR_ATTRS.includes(attrName) && !BOOLEAN_ATTRS.includes(attrName)) {\n throw new Error(`'${attrName}' is not supported. Supported attributes are ` +\n `'${[...STR_ATTRS, ...BOOLEAN_ATTRS].join(', ')}'`);\n }\n\n // Parse boolean, if it's a boolean attribute\n if (BOOLEAN_ATTRS.includes(attrName)) {\n return `.${methodName}(${assertGetBool(cssAttr)})`;\n }\n\n // Otherwise parse as string\n let value = cssAttr.value || '';\n if (attrName === RESOURCE_ID) {\n value = this.formatIdLocator(value);\n }\n if (value === '') {\n return `.${methodName}Matches(\"\")`;\n }\n\n switch (cssAttr.operator) {\n case '=':\n return `.${methodName}(\"${value}\")`;\n case '*=':\n if (['description', 'text'].includes(attrName)) {\n return `.${methodName}Contains(\"${value}\")`;\n }\n return `.${methodName}Matches(\"${escapeRegExp(value)}\")`;\n case '^=':\n if (['description', 'text'].includes(attrName)) {\n return `.${methodName}StartsWith(\"${value}\")`;\n }\n return `.${methodName}Matches(\"^${escapeRegExp(value)}\")`;\n case '$=':\n return `.${methodName}Matches(\"${escapeRegExp(value)}$\")`;\n case '~=':\n return `.${methodName}Matches(\"${getWordMatcherRegex(value)}\")`;\n default:\n // Unreachable, but adding error in case a new CSS attribute is added.\n throw new Error(`Unsupported CSS attribute operator '${cssAttr.operator}'. ` +\n ` '=', '*=', '^=', '$=' and '~=' are supported.`);\n }\n }\n\n /**\n * Convert a CSS pseudo class to a UiSelector\n *\n * @param {CssPseudo} cssPseudo CSS Pseudo class\n * @returns {string} Pseudo selector parsed as UiSelector\n */\n parsePseudo (cssPseudo) {\n if (cssPseudo.valueType && cssPseudo.valueType !== 'string') {\n throw new Error(`'${cssPseudo.name}=${cssPseudo.value}'. ` +\n `Unsupported css pseudo class value type: '${cssPseudo.valueType}'. Only 'string' type or empty is supported.`);\n }\n\n const pseudoName = assertGetAttrName(cssPseudo);\n\n if (BOOLEAN_ATTRS.includes(pseudoName)) {\n return `.${toSnakeCase(pseudoName)}(${assertGetBool(cssPseudo)})`;\n }\n\n if (NUMERIC_ATTRS.includes(pseudoName)) {\n return `.${pseudoName}(${cssPseudo.value})`;\n }\n }\n\n /**\n * Convert a CSS rule to a UiSelector\n * @param {CssRule} cssRule CSS rule definition\n */\n parseCssRule (cssRule) {\n const { nestingOperator } = cssRule;\n if (nestingOperator && nestingOperator !== ' ') {\n throw new Error(`'${nestingOperator}' is not a supported combinator. ` +\n `Only child combinator (>) and descendant combinator are supported.`);\n }\n\n let uiAutomatorSelector = 'new UiSelector()';\n if (cssRule.tagName && cssRule.tagName !== '*') {\n let androidClass = [cssRule.tagName];\n if (cssRule.classNames) {\n for (const cssClassNames of cssRule.classNames) {\n androidClass.push(cssClassNames);\n }\n uiAutomatorSelector += `.className(\"${androidClass.join('.')}\")`;\n } else {\n uiAutomatorSelector += `.classNameMatches(\"${cssRule.tagName}\")`;\n }\n } else if (cssRule.classNames) {\n uiAutomatorSelector += `.classNameMatches(\"${cssRule.classNames.join('\\\\.')}\")`;\n }\n if (cssRule.id) {\n uiAutomatorSelector += `.resourceId(\"${this.formatIdLocator(cssRule.id)}\")`;\n }\n if (cssRule.attrs) {\n for (const attr of cssRule.attrs) {\n uiAutomatorSelector += this.parseAttr(attr);\n }\n }\n if (cssRule.pseudos) {\n for (const pseudo of cssRule.pseudos) {\n uiAutomatorSelector += this.parsePseudo(pseudo);\n }\n }\n if (cssRule.rule) {\n uiAutomatorSelector += `.childSelector(${this.parseCssRule(cssRule.rule)})`;\n }\n return uiAutomatorSelector;\n }\n\n /**\n * Convert CSS object to UiAutomator2 selector\n * @param {CssObject} css CSS object\n * @returns {string} The CSS object parsed as a UiSelector\n */\n parseCssObject (css) {\n switch (css.type) {\n case 'rule':\n return this.parseCssRule(css);\n case 'ruleSet':\n return this.parseCssObject(css.rule);\n case 'selectors':\n return css.selectors.map((selector) => this.parseCssObject(selector)).join('; ');\n\n default:\n // This is never reachable, but if it ever is do this.\n throw new Error(`UiAutomator does not support '${css.type}' css. Only supports 'rule', 'ruleSet', 'selectors' `);\n }\n }\n\n /**\n * Convert a CSS selector to a UiAutomator2 selector\n *\n * @returns {string} The CSS selector converted to a UiSelector\n */\n toUiAutomatorSelector () {\n let cssObj;\n try {\n cssObj = parser.parse(this.selector);\n } catch (e) {\n throw new errors.InvalidSelectorError(`Invalid CSS selector '${this.selector}'. Reason: '${e}'`);\n }\n try {\n return this.parseCssObject(cssObj);\n } catch (e) {\n throw new errors.InvalidSelectorError(`Unsupported CSS selector '${this.selector}'. Reason: '${e}'`);\n }\n }\n}\n\nexport default CssConverter;"],"mappings":"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"}
|
|
@@ -70,4 +70,4 @@ let desiredCapConstraints = {};
|
|
|
70
70
|
Object.assign(desiredCapConstraints, uiautomatorCapConstraints, _appiumAndroidDriver.commonCapConstraints);
|
|
71
71
|
var _default = desiredCapConstraints;
|
|
72
72
|
exports.default = _default;
|
|
73
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
73
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYXBwaXVtQW5kcm9pZERyaXZlciIsInJlcXVpcmUiLCJ1aWF1dG9tYXRvckNhcENvbnN0cmFpbnRzIiwiYXBwIiwicHJlc2VuY2UiLCJpc1N0cmluZyIsImF1dG9tYXRpb25OYW1lIiwiYnJvd3Nlck5hbWUiLCJsYXVuY2hUaW1lb3V0IiwiaXNOdW1iZXIiLCJza2lwVW5sb2NrIiwiaXNCb29sZWFuIiwidWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCIsInVpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0IiwidWlhdXRvbWF0b3IyU2VydmVyUmVhZFRpbWVvdXQiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwic3lzdGVtUG9ydCIsIm1qcGVnU2VydmVyUG9ydCIsIm1qcGVnU2NyZWVuc2hvdFVybCIsInNraXBTZXJ2ZXJJbnN0YWxsYXRpb24iLCJhbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQiLCJ1c2VyUHJvZmlsZSIsImFwcFdhaXRGb3JMYXVuY2giLCJkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSIsImZvcmNlQXBwTGF1bmNoIiwic2hvdWxkVGVybWluYXRlQXBwIiwiZGVzaXJlZENhcENvbnN0cmFpbnRzIiwiT2JqZWN0IiwiYXNzaWduIiwiY29tbW9uQ2FwQ29uc3RyYWludHMiLCJfZGVmYXVsdCIsImV4cG9ydHMiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2Rlc2lyZWQtY2Fwcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21tb25DYXBDb25zdHJhaW50cyB9IGZyb20gJ2FwcGl1bS1hbmRyb2lkLWRyaXZlcic7XG5cbmxldCB1aWF1dG9tYXRvckNhcENvbnN0cmFpbnRzID0ge1xuICBhcHA6IHtcbiAgICBwcmVzZW5jZTogdHJ1ZSxcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBhdXRvbWF0aW9uTmFtZToge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIGJyb3dzZXJOYW1lOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgbGF1bmNoVGltZW91dDoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIHNraXBVbmxvY2s6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgdWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dDoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIHVpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0OiB7XG4gICAgaXNOdW1iZXI6IHRydWVcbiAgfSxcbiAgdWlhdXRvbWF0b3IyU2VydmVyUmVhZFRpbWVvdXQ6IHtcbiAgICBpc051bWJlcjogdHJ1ZVxuICB9LFxuICBkaXNhYmxlV2luZG93QW5pbWF0aW9uOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIHN5c3RlbVBvcnQ6IHtcbiAgICBpc051bWJlcjogdHJ1ZVxuICB9LFxuICBtanBlZ1NlcnZlclBvcnQ6IHtcbiAgICBpc051bWJlcjogdHJ1ZVxuICB9LFxuICBtanBlZ1NjcmVlbnNob3RVcmw6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBza2lwU2VydmVySW5zdGFsbGF0aW9uOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIGFuZHJvaWRDb3ZlcmFnZUVuZEludGVudDoge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIHVzZXJQcm9maWxlOiB7XG4gICAgaXNOdW1iZXI6IHRydWVcbiAgfSxcbiAgYXBwV2FpdEZvckxhdW5jaDoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICBkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZToge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICBmb3JjZUFwcExhdW5jaDoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICBzaG91bGRUZXJtaW5hdGVBcHA6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfVxufTtcblxubGV0IGRlc2lyZWRDYXBDb25zdHJhaW50cyA9IHt9O1xuT2JqZWN0LmFzc2lnbihcbiAgZGVzaXJlZENhcENvbnN0cmFpbnRzLFxuICB1aWF1dG9tYXRvckNhcENvbnN0cmFpbnRzLFxuICBjb21tb25DYXBDb25zdHJhaW50c1xuKTtcblxuZXhwb3J0IGRlZmF1bHQgZGVzaXJlZENhcENvbnN0cmFpbnRzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsSUFBQUEsb0JBQUEsR0FBQUMsT0FBQTtBQUVBLElBQUlDLHlCQUF5QixHQUFHO0VBQzlCQyxHQUFHLEVBQUU7SUFDSEMsUUFBUSxFQUFFLElBQUk7SUFDZEMsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEQyxjQUFjLEVBQUU7SUFDZEQsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNERSxXQUFXLEVBQUU7SUFDWEYsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNERyxhQUFhLEVBQUU7SUFDYkMsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEQyxVQUFVLEVBQUU7SUFDVkMsU0FBUyxFQUFFO0VBQ2IsQ0FBQztFQUNEQywrQkFBK0IsRUFBRTtJQUMvQkgsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNESSxnQ0FBZ0MsRUFBRTtJQUNoQ0osUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNESyw2QkFBNkIsRUFBRTtJQUM3QkwsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNETSxzQkFBc0IsRUFBRTtJQUN0QkosU0FBUyxFQUFFO0VBQ2IsQ0FBQztFQUNESyxVQUFVLEVBQUU7SUFDVlAsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEUSxlQUFlLEVBQUU7SUFDZlIsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEUyxrQkFBa0IsRUFBRTtJQUNsQmIsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEYyxzQkFBc0IsRUFBRTtJQUN0QlIsU0FBUyxFQUFFO0VBQ2IsQ0FBQztFQUNEUyx3QkFBd0IsRUFBRTtJQUN4QmYsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEZ0IsV0FBVyxFQUFFO0lBQ1haLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRGEsZ0JBQWdCLEVBQUU7SUFDaEJYLFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDRFksbUNBQW1DLEVBQUU7SUFDbkNaLFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDRGEsY0FBYyxFQUFFO0lBQ2RiLFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDRGMsa0JBQWtCLEVBQUU7SUFDbEJkLFNBQVMsRUFBRTtFQUNiO0FBQ0YsQ0FBQztBQUVELElBQUllLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUM5QkMsTUFBTSxDQUFDQyxNQUFNLENBQ1hGLHFCQUFxQixFQUNyQnhCLHlCQUF5QixFQUN6QjJCLHlDQUNGLENBQUM7QUFBQyxJQUFBQyxRQUFBLEdBRWFKLHFCQUFxQjtBQUFBSyxPQUFBLENBQUFDLE9BQUEsR0FBQUYsUUFBQSJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"desired-caps.js","names":["_appiumAndroidDriver","require","uiautomatorCapConstraints","app","presence","isString","automationName","browserName","launchTimeout","isNumber","skipUnlock","isBoolean","uiautomator2ServerLaunchTimeout","uiautomator2ServerInstallTimeout","uiautomator2ServerReadTimeout","disableWindowAnimation","systemPort","mjpegServerPort","mjpegScreenshotUrl","skipServerInstallation","androidCoverageEndIntent","userProfile","appWaitForLaunch","disableSuppressAccessibilityService","forceAppLaunch","shouldTerminateApp","desiredCapConstraints","Object","assign","commonCapConstraints","_default","exports","default"],"sources":["../../lib/desired-caps.js"],"sourcesContent":["import { commonCapConstraints } from 'appium-android-driver';\n\nlet uiautomatorCapConstraints = {\n app: {\n presence: true,\n isString: true\n },\n automationName: {\n isString: true\n },\n browserName: {\n isString: true\n },\n launchTimeout: {\n isNumber: true\n },\n skipUnlock: {\n isBoolean: true\n },\n uiautomator2ServerLaunchTimeout: {\n isNumber: true\n },\n uiautomator2ServerInstallTimeout: {\n isNumber: true\n },\n uiautomator2ServerReadTimeout: {\n isNumber: true\n },\n disableWindowAnimation: {\n isBoolean: true\n },\n systemPort: {\n isNumber: true\n },\n mjpegServerPort: {\n isNumber: true\n },\n mjpegScreenshotUrl: {\n isString: true\n },\n skipServerInstallation: {\n isBoolean: true\n },\n androidCoverageEndIntent: {\n isString: true\n },\n userProfile: {\n isNumber: true\n },\n appWaitForLaunch: {\n isBoolean: true\n },\n disableSuppressAccessibilityService: {\n isBoolean: true\n },\n forceAppLaunch: {\n isBoolean: true\n },\n shouldTerminateApp: {\n isBoolean: true\n }\n};\n\nlet desiredCapConstraints = {};\nObject.assign(\n desiredCapConstraints,\n uiautomatorCapConstraints,\n commonCapConstraints\n);\n\nexport default desiredCapConstraints;\n"],"mappings":";;;;;;;AAAA,IAAAA,oBAAA,GAAAC,OAAA;AAEA,IAAIC,yBAAyB,GAAG;EAC9BC,GAAG,EAAE;IACHC,QAAQ,EAAE,IAAI;IACdC,QAAQ,EAAE;EACZ,CAAC;EACDC,cAAc,EAAE;IACdD,QAAQ,EAAE;EACZ,CAAC;EACDE,WAAW,EAAE;IACXF,QAAQ,EAAE;EACZ,CAAC;EACDG,aAAa,EAAE;IACbC,QAAQ,EAAE;EACZ,CAAC;EACDC,UAAU,EAAE;IACVC,SAAS,EAAE;EACb,CAAC;EACDC,+BAA+B,EAAE;IAC/BH,QAAQ,EAAE;EACZ,CAAC;EACDI,gCAAgC,EAAE;IAChCJ,QAAQ,EAAE;EACZ,CAAC;EACDK,6BAA6B,EAAE;IAC7BL,QAAQ,EAAE;EACZ,CAAC;EACDM,sBAAsB,EAAE;IACtBJ,SAAS,EAAE;EACb,CAAC;EACDK,UAAU,EAAE;IACVP,QAAQ,EAAE;EACZ,CAAC;EACDQ,eAAe,EAAE;IACfR,QAAQ,EAAE;EACZ,CAAC;EACDS,kBAAkB,EAAE;IAClBb,QAAQ,EAAE;EACZ,CAAC;EACDc,sBAAsB,EAAE;IACtBR,SAAS,EAAE;EACb,CAAC;EACDS,wBAAwB,EAAE;IACxBf,QAAQ,EAAE;EACZ,CAAC;EACDgB,WAAW,EAAE;IACXZ,QAAQ,EAAE;EACZ,CAAC;EACDa,gBAAgB,EAAE;IAChBX,SAAS,EAAE;EACb,CAAC;EACDY,mCAAmC,EAAE;IACnCZ,SAAS,EAAE;EACb,CAAC;EACDa,cAAc,EAAE;IACdb,SAAS,EAAE;EACb,CAAC;EACDc,kBAAkB,EAAE;IAClBd,SAAS,EAAE;EACb;AACF,CAAC;AAED,IAAIe,qBAAqB,GAAG,CAAC,CAAC;AAC9BC,MAAM,CAACC,MAAM,CACXF,qBAAqB,EACrBxB,yBAAyB,EACzB2B,
|
|
1
|
+
{"version":3,"file":"desired-caps.js","names":["_appiumAndroidDriver","require","uiautomatorCapConstraints","app","presence","isString","automationName","browserName","launchTimeout","isNumber","skipUnlock","isBoolean","uiautomator2ServerLaunchTimeout","uiautomator2ServerInstallTimeout","uiautomator2ServerReadTimeout","disableWindowAnimation","systemPort","mjpegServerPort","mjpegScreenshotUrl","skipServerInstallation","androidCoverageEndIntent","userProfile","appWaitForLaunch","disableSuppressAccessibilityService","forceAppLaunch","shouldTerminateApp","desiredCapConstraints","Object","assign","commonCapConstraints","_default","exports","default"],"sources":["../../lib/desired-caps.js"],"sourcesContent":["import { commonCapConstraints } from 'appium-android-driver';\n\nlet uiautomatorCapConstraints = {\n app: {\n presence: true,\n isString: true\n },\n automationName: {\n isString: true\n },\n browserName: {\n isString: true\n },\n launchTimeout: {\n isNumber: true\n },\n skipUnlock: {\n isBoolean: true\n },\n uiautomator2ServerLaunchTimeout: {\n isNumber: true\n },\n uiautomator2ServerInstallTimeout: {\n isNumber: true\n },\n uiautomator2ServerReadTimeout: {\n isNumber: true\n },\n disableWindowAnimation: {\n isBoolean: true\n },\n systemPort: {\n isNumber: true\n },\n mjpegServerPort: {\n isNumber: true\n },\n mjpegScreenshotUrl: {\n isString: true\n },\n skipServerInstallation: {\n isBoolean: true\n },\n androidCoverageEndIntent: {\n isString: true\n },\n userProfile: {\n isNumber: true\n },\n appWaitForLaunch: {\n isBoolean: true\n },\n disableSuppressAccessibilityService: {\n isBoolean: true\n },\n forceAppLaunch: {\n isBoolean: true\n },\n shouldTerminateApp: {\n isBoolean: true\n }\n};\n\nlet desiredCapConstraints = {};\nObject.assign(\n desiredCapConstraints,\n uiautomatorCapConstraints,\n commonCapConstraints\n);\n\nexport default desiredCapConstraints;\n"],"mappings":";;;;;;;AAAA,IAAAA,oBAAA,GAAAC,OAAA;AAEA,IAAIC,yBAAyB,GAAG;EAC9BC,GAAG,EAAE;IACHC,QAAQ,EAAE,IAAI;IACdC,QAAQ,EAAE;EACZ,CAAC;EACDC,cAAc,EAAE;IACdD,QAAQ,EAAE;EACZ,CAAC;EACDE,WAAW,EAAE;IACXF,QAAQ,EAAE;EACZ,CAAC;EACDG,aAAa,EAAE;IACbC,QAAQ,EAAE;EACZ,CAAC;EACDC,UAAU,EAAE;IACVC,SAAS,EAAE;EACb,CAAC;EACDC,+BAA+B,EAAE;IAC/BH,QAAQ,EAAE;EACZ,CAAC;EACDI,gCAAgC,EAAE;IAChCJ,QAAQ,EAAE;EACZ,CAAC;EACDK,6BAA6B,EAAE;IAC7BL,QAAQ,EAAE;EACZ,CAAC;EACDM,sBAAsB,EAAE;IACtBJ,SAAS,EAAE;EACb,CAAC;EACDK,UAAU,EAAE;IACVP,QAAQ,EAAE;EACZ,CAAC;EACDQ,eAAe,EAAE;IACfR,QAAQ,EAAE;EACZ,CAAC;EACDS,kBAAkB,EAAE;IAClBb,QAAQ,EAAE;EACZ,CAAC;EACDc,sBAAsB,EAAE;IACtBR,SAAS,EAAE;EACb,CAAC;EACDS,wBAAwB,EAAE;IACxBf,QAAQ,EAAE;EACZ,CAAC;EACDgB,WAAW,EAAE;IACXZ,QAAQ,EAAE;EACZ,CAAC;EACDa,gBAAgB,EAAE;IAChBX,SAAS,EAAE;EACb,CAAC;EACDY,mCAAmC,EAAE;IACnCZ,SAAS,EAAE;EACb,CAAC;EACDa,cAAc,EAAE;IACdb,SAAS,EAAE;EACb,CAAC;EACDc,kBAAkB,EAAE;IAClBd,SAAS,EAAE;EACb;AACF,CAAC;AAED,IAAIe,qBAAqB,GAAG,CAAC,CAAC;AAC9BC,MAAM,CAACC,MAAM,CACXF,qBAAqB,EACrBxB,yBAAyB,EACzB2B,yCACF,CAAC;AAAC,IAAAC,QAAA,GAEaJ,qBAAqB;AAAAK,OAAA,CAAAC,OAAA,GAAAF,QAAA"}
|
package/build/lib/driver.js
CHANGED
|
@@ -517,4 +517,4 @@ for (let [cmd, fn] of _lodash.default.toPairs(_index.default)) {
|
|
|
517
517
|
}
|
|
518
518
|
var _default = AndroidUiautomator2Driver;
|
|
519
519
|
exports.default = _default;
|
|
520
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiX3VpYXV0b21hdG9yIiwiX21ldGhvZE1hcCIsIl9zdXBwb3J0IiwiX2FzeW5jYm94IiwiX2JsdWViaXJkIiwiX2luZGV4IiwiX2FwcGl1bUFkYiIsIl9oZWxwZXJzIiwiX2FwcGl1bUFuZHJvaWREcml2ZXIiLCJfZGVzaXJlZENhcHMiLCJfcG9ydHNjYW5uZXIiLCJfb3MiLCJfcGF0aCIsIl9leHRlbnNpb25zIiwiaGVscGVycyIsIk9iamVjdCIsImFzc2lnbiIsInVpYXV0b21hdG9yMkhlbHBlcnMiLCJhbmRyb2lkSGVscGVycyIsIkRFVklDRV9QT1JUX1JBTkdFIiwiREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRCIsInV0aWwiLCJnZXRMb2NrRmlsZUd1YXJkIiwicGF0aCIsInJlc29sdmUiLCJvcyIsInRtcGRpciIsInRpbWVvdXQiLCJ0cnlSZWNvdmVyeSIsIkRFVklDRV9QT1JUIiwiTUpQRUdfU0VSVkVSX0RFVklDRV9QT1JUIiwiTE9DQUxIT1NUX0lQNCIsIk5PX1BST1hZIiwiUmVnRXhwIiwiQ0hST01FX05PX1BST1hZIiwiTUVNT0laRURfRlVOQ1RJT05TIiwiQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlciIsIkJhc2VEcml2ZXIiLCJuZXdNZXRob2RNYXAiLCJjb25zdHJ1Y3RvciIsIm9wdHMiLCJzaG91bGRWYWxpZGF0ZUNhcHMiLCJzaGVsbCIsImxvY2F0b3JTdHJhdGVnaWVzIiwiZGVzaXJlZENhcENvbnN0cmFpbnRzIiwidWlhdXRvbWF0b3IyIiwiandwUHJveHlBY3RpdmUiLCJqd3BQcm94eUF2b2lkIiwiYXBrU3RyaW5ncyIsInNldHRpbmdzIiwiRGV2aWNlU2V0dGluZ3MiLCJpZ25vcmVVbmltcG9ydGFudFZpZXdzIiwiYWxsb3dJbnZpc2libGVFbGVtZW50cyIsIm9uU2V0dGluZ3NVcGRhdGUiLCJiaW5kIiwiY2hyb21lZHJpdmVyIiwic2Vzc2lvbkNocm9tZWRyaXZlcnMiLCJmbiIsIl8iLCJtZW1vaXplIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsImNhcHMiLCJjcmVhdGVTZXNzaW9uIiwiYXJncyIsInNlc3Npb25JZCIsInNlcnZlckRldGFpbHMiLCJwbGF0Zm9ybSIsIndlYlN0b3JhZ2VFbmFibGVkIiwidGFrZXNTY3JlZW5zaG90IiwiamF2YXNjcmlwdEVuYWJsZWQiLCJkYXRhYmFzZUVuYWJsZWQiLCJuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQiLCJsb2NhdGlvbkNvbnRleHRFbmFibGVkIiwid2FybmluZ3MiLCJkZXNpcmVkIiwiY3VyQ29udGV4dCIsImRlZmF1bHRDb250ZXh0TmFtZSIsImRlZmF1bHRPcHRzIiwiZnVsbFJlc2V0IiwiYXV0b0xhdW5jaCIsImFkYlBvcnQiLCJERUZBVUxUX0FEQl9QT1JUIiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiZGVmYXVsdHMiLCJpc0Nocm9tZVNlc3Npb24iLCJsb2ciLCJpbmZvIiwicGtnIiwiYWN0aXZpdHkiLCJnZXRDaHJvbWVQa2ciLCJicm93c2VyTmFtZSIsImFwcFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsInJlYm9vdCIsInNldEF2ZEZyb21DYXBhYmlsaXRpZXMiLCJhcHAiLCJjb25maWd1cmVBcHAiLCJBUEtfRVhURU5TSU9OIiwiQVBLU19FWFRFTlNJT04iLCJjaGVja0FwcFByZXNlbnQiLCJzdGFydFVpQXV0b21hdG9yMlNlc3Npb24iLCJmaWxsRGV2aWNlRGV0YWlscyIsIm1qcGVnU2NyZWVuc2hvdFVybCIsIm1qcGVnU3RyZWFtIiwibWpwZWciLCJNSnBlZ1N0cmVhbSIsInN0YXJ0IiwiZSIsImRlbGV0ZVNlc3Npb24iLCJwaXhlbFJhdGlvIiwiZ2V0RGV2aWNlUGl4ZWxSYXRpbyIsInN0YXRCYXJIZWlnaHQiLCJnZXRTdGF0dXNCYXJIZWlnaHQiLCJ2aWV3cG9ydFJlY3QiLCJnZXRWaWV3UG9ydFJlY3QiLCJkcml2ZXJEYXRhIiwiZ2V0U2Vzc2lvbiIsInNlc3Npb25EYXRhIiwiZGVidWciLCJ1aWEyRGF0YSIsImp3cHJveHkiLCJjb21tYW5kIiwiaXNFbXVsYXRvciIsImFkYiIsImF2ZCIsImRldmljZU5hbWUiLCJlcnJvckFuZFRocm93IiwicGxhdGZvcm1WZXJzaW9uIiwiYXZkRGV2aWNlIiwicmVwbGFjZSIsImFsbG9jYXRlU3lzdGVtUG9ydCIsImZvcndhcmRQb3J0IiwibG9jYWxQb3J0IiwiY2hlY2tQb3J0U3RhdHVzIiwic3lzdGVtUG9ydCIsIl9oYXNTeXN0ZW1Qb3J0SW5DYXBzIiwic3RhcnRQb3J0IiwiZW5kUG9ydCIsImZpbmRBUG9ydE5vdEluVXNlIiwicmVsZWFzZVN5c3RlbVBvcnQiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsImFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0IiwibWpwZWdTZXJ2ZXJQb3J0IiwicmVsZWFzZU1qcGVnU2VydmVyUG9ydCIsInVkaWQiLCJlbVBvcnQiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJjcmVhdGVBREIiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwic2V0SGlkZGVuQXBpUG9saWN5IiwiaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IiLCJoYXNWYWx1ZSIsImdwc0VuYWJsZWQiLCJ0b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyIiwid2FybiIsImFwcEluZm8iLCJnZXRMYXVuY2hJbmZvIiwiY3VyRGV2aWNlSWQiLCJkZXZpY2VVRElEIiwiaW5pdERldmljZSIsImluaXRVaUF1dG9tYXRvcjJTZXJ2ZXIiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwiaXNBbmltYXRpb25PbiIsInNldEFuaW1hdGlvblN0YXRlIiwiX3dhc1dpbmRvd0FuaW1hdGlvbkRpc2FibGVkIiwiaW5pdEFVVCIsInN0YXJ0U2Vzc2lvbiIsImFkZERldmljZUluZm9Ub0NhcHMiLCJza2lwVW5sb2NrIiwidW5sb2NrIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwiZW5zdXJlQXBwU3RhcnRzIiwib3JpZW50YXRpb24iLCJzZXRPcmllbnRhdGlvbiIsImF1dG9XZWJ2aWV3Iiwidmlld05hbWUiLCJkZWZhdWx0V2Vidmlld05hbWUiLCJhdXRvV2Vidmlld1RpbWVvdXQiLCJyZXRyeUludGVydmFsIiwic2V0Q29udGV4dCIsImFwaVZlcnNpb24iLCJtYW51ZmFjdHVyZXIiLCJtb2RlbCIsInJlYWxEaXNwbGF5U2l6ZSIsImRpc3BsYXlEZW5zaXR5IiwibW9iaWxlR2V0RGV2aWNlSW5mbyIsImRldmljZUFwaUxldmVsIiwicGFyc2VJbnQiLCJkZXZpY2VTY3JlZW5TaXplIiwiZGV2aWNlU2NyZWVuRGVuc2l0eSIsImRldmljZU1vZGVsIiwiZGV2aWNlTWFudWZhY3R1cmVyIiwidWlhdXRvbWF0b3IyT3B0cyIsImhvc3QiLCJyZW1vdGVBZGJIb3N0IiwiZGV2aWNlUG9ydCIsImFwayIsInRtcERpciIsImRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlIiwicmVhZFRpbWVvdXQiLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJSZWFkVGltZW91dCIsIlVpQXV0b21hdG9yMlNlcnZlciIsInByb3h5UmVxUmVzIiwicHJveHlDb21tYW5kIiwic2tpcFNlcnZlckluc3RhbGxhdGlvbiIsImluc3RhbGxTZXJ2ZXJBcGsiLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJJbnN0YWxsVGltZW91dCIsImFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCIsIlNFVFRJTkdTX0hFTFBFUl9QS0dfSUQiLCJTRVJWRVJfUEFDS0FHRV9JRCIsIlNFUlZFUl9URVNUX1BBQ0tBR0VfSUQiLCJzdGRlcnIiLCJtZXNzYWdlIiwidW5pbnN0YWxsT3RoZXJQYWNrYWdlcyIsInBhcnNlQXJyYXkiLCJvdGhlckFwcHMiLCJCIiwiYWxsIiwibWFwIiwiaW5zdGFsbE90aGVyQXBrcyIsIm5vUmVzZXQiLCJpc0FwcEluc3RhbGxlZCIsIm5vU2lnbiIsImNoZWNrQXBrQ2VydCIsInJlcXVpcmVEZWZhdWx0Q2VydCIsInNpZ25BcHAiLCJza2lwVW5pbnN0YWxsIiwidW5pbnN0YWxsQXBrIiwiaW5zdGFsbEFwayIsImZhc3RSZXNldCIsInJlc2V0QXBwIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJhbmRyb2lkQ292ZXJhZ2UiLCJmb3JjZUFwcExhdW5jaCIsInByb2Nlc3NFeGlzdHMiLCJzdGFydEFwcCIsImFjdGlvbiIsImludGVudEFjdGlvbiIsImNhdGVnb3J5IiwiaW50ZW50Q2F0ZWdvcnkiLCJmbGFncyIsImludGVudEZsYWdzIiwid2FpdFBrZyIsIndhaXRBY3Rpdml0eSIsIndhaXRGb3JMYXVuY2giLCJhcHBXYWl0Rm9yTGF1bmNoIiwid2FpdER1cmF0aW9uIiwiYXBwV2FpdER1cmF0aW9uIiwib3B0aW9uYWxJbnRlbnRBcmd1bWVudHMiLCJzdG9wQXBwIiwiZG9udFN0b3BBcHBPblJlc2V0IiwicmV0cnkiLCJ1c2VyIiwidXNlclByb2ZpbGUiLCJzY3JlZW5SZWNvcmRpbmdTdG9wVGFza3MiLCJpc0VtcHR5IiwiX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwibW9iaWxlSXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nIiwibW9iaWxlU3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZyIsIl9zY3JlZW5TdHJlYW1pbmdQcm9wcyIsIm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmciLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJzdG9wQ2hyb21lZHJpdmVyUHJveGllcyIsImVyciIsInRhc2siLCJpZ24iLCJlbmRBbmRyb2lkQ292ZXJhZ2UiLCJhbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQiLCJicm9hZGNhc3QiLCJzaG91bGRUZXJtaW5hdGVBcHAiLCJmb3JjZVN0b3AiLCJzdG9wTG9nY2F0IiwiZXJyb3IiLCJzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5IiwiYXZkTmFtZSIsImtpbGxFbXVsYXRvciIsInN0b3AiLCJmcyIsImV4aXN0cyIsIndyYXBCb290c3RyYXBEaXNjb25uZWN0Iiwid3JhcHBlZCIsInJlc3RhcnQiLCJwcm94eUFjdGl2ZSIsImNhblByb3h5IiwiZ2V0UHJveHlBdm9pZExpc3QiLCJuYXRpdmVXZWJTY3JlZW5zaG90IiwiaXNDaHJvbWVCcm93c2VyIiwiZXhwb3J0cyIsImNtZCIsInRvUGFpcnMiLCJhbmRyb2lkQ29tbWFuZHMiLCJwcm90b3R5cGUiLCJjb21tYW5kcyIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9kcml2ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEJhc2VEcml2ZXIsIERldmljZVNldHRpbmdzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQge1xuICBVaUF1dG9tYXRvcjJTZXJ2ZXIsIFNFUlZFUl9QQUNLQUdFX0lELCBTRVJWRVJfVEVTVF9QQUNLQUdFX0lEXG59IGZyb20gJy4vdWlhdXRvbWF0b3IyJztcbmltcG9ydCB7IG5ld01ldGhvZE1hcCB9IGZyb20gJy4vbWV0aG9kLW1hcCc7XG5pbXBvcnQgeyBmcywgdXRpbCwgbWpwZWcgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGNvbW1hbmRzIGZyb20gJy4vY29tbWFuZHMvaW5kZXgnO1xuaW1wb3J0IHsgREVGQVVMVF9BREJfUE9SVCB9IGZyb20gJ2FwcGl1bS1hZGInO1xuaW1wb3J0IHVpYXV0b21hdG9yMkhlbHBlcnMgZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IGFuZHJvaWRIZWxwZXJzLCBhbmRyb2lkQ29tbWFuZHMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIH0gZnJvbSAnYXBwaXVtLWFuZHJvaWQtZHJpdmVyJztcbmltcG9ydCBkZXNpcmVkQ2FwQ29uc3RyYWludHMgZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuaW1wb3J0IHsgZmluZEFQb3J0Tm90SW5Vc2UsIGNoZWNrUG9ydFN0YXR1cyB9IGZyb20gJ3BvcnRzY2FubmVyJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEFQS19FWFRFTlNJT04sIEFQS1NfRVhURU5TSU9OIH0gZnJvbSAnLi9leHRlbnNpb25zJztcblxuXG5jb25zdCBoZWxwZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgdWlhdXRvbWF0b3IySGVscGVycywgYW5kcm9pZEhlbHBlcnMpO1xuXG4vLyBUaGUgcmFuZ2Ugb2YgcG9ydHMgd2UgY2FuIHVzZSBvbiB0aGUgc3lzdGVtIGZvciBjb21tdW5pY2F0aW5nIHRvIHRoZVxuLy8gVWlBdXRvbWF0b3IyIEhUVFAgc2VydmVyIG9uIHRoZSBkZXZpY2VcbmNvbnN0IERFVklDRV9QT1JUX1JBTkdFID0gWzgyMDAsIDgyOTldO1xuXG4vLyBUaGUgZ3VhcmQgaXMgbmVlZGVkIHRvIGF2b2lkIGR5bmFtaWMgc3lzdGVtIHBvcnQgYWxsb2NhdGlvbiBjb25mbGljdHMgZm9yXG4vLyBwYXJhbGxlbCBkcml2ZXIgc2Vzc2lvbnNcbmNvbnN0IERFVklDRV9QT1JUX0FMTE9DQVRJT05fR1VBUkQgPSB1dGlsLmdldExvY2tGaWxlR3VhcmQoXG4gIHBhdGgucmVzb2x2ZShvcy50bXBkaXIoKSwgJ3VpYTJfZGV2aWNlX3BvcnRfZ3VhcmQnKSxcbiAge3RpbWVvdXQ6IDI1LCB0cnlSZWNvdmVyeTogdHJ1ZX1cbik7XG5cbi8vIFRoaXMgaXMgdGhlIHBvcnQgdGhhdCBVaUF1dG9tYXRvcjIgbGlzdGVucyB0byBvbiB0aGUgZGV2aWNlLiBXZSB3aWxsIGZvcndhcmRcbi8vIG9uZSBvZiB0aGUgcG9ydHMgYWJvdmUgb24gdGhlIHN5c3RlbSB0byB0aGlzIHBvcnQgb24gdGhlIGRldmljZS5cbmNvbnN0IERFVklDRV9QT1JUID0gNjc5MDtcbi8vIFRoaXMgaXMgdGhlIHBvcnQgdGhhdCB0aGUgVWlBdXRvbWF0b3IyIE1KUEVHIHNlcnZlciBsaXN0ZW5zIHRvIG9uIHRoZSBkZXZpY2UuXG4vLyBXZSB3aWxsIGZvcndhcmQgb25lIG9mIHRoZSBwb3J0cyBhYm92ZSBvbiB0aGUgc3lzdGVtIHRvIHRoaXMgcG9ydCBvbiB0aGVcbi8vIGRldmljZS5cbmNvbnN0IE1KUEVHX1NFUlZFUl9ERVZJQ0VfUE9SVCA9IDc4MTA7XG5cbmNvbnN0IExPQ0FMSE9TVF9JUDQgPSAnMTI3LjAuMC4xJztcblxuLy8gTk9fUFJPWFkgY29udGFpbnMgdGhlIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBVaUF1dG9tYXRvcjIgc2VydmVyLlxuLy8gVE9ETzogIEFkZCB0aGUgbGlzdCBvZiBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gVWlBdXRvbWF0b3IyIHNlcnZlci5cbi8vIFRPRE86IE5lZWQgdG8gc2VncmVnYXRlIHRoZSBwYXRocyBiZXR0ZXIgd2F5IHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMgd2hlcmV2ZXIgYXBwbGljYWJsZS5cbi8vIChOb3Qgc2VncmVnYXRpbmcgcmlnaHQgYXdheSBiZWNhdXNlIG1vcmUgcGF0aHMgdG8gYmUgYWRkZWQgaW4gdGhlIE5PX1BST1hZIGxpc3QpXG5jb25zdCBOT19QUk9YWSA9IFtcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vKD8hLiovKScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYWxlcnRfW14vXSsnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FsZXJ0L1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vW14vXSsvY3VycmVudF9hY3Rpdml0eScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL1teL10rL2N1cnJlbnRfcGFja2FnZScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0cycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9hdHRyaWJ1dGUnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvZGlzcGxheWVkJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL2VuYWJsZWQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvbG9jYXRpb25faW5fdmlldycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9uYW1lJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL3NjcmVlbnNob3QnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvc2VsZWN0ZWQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2ltZS9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9jYXRpb24nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2NyZWVuc2hvdCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdGltZW91dHMnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3VybCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL1teL10rX2FsZXJ0JCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FjdGlvbnMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hbGVydC9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcC9bXi9dJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL1teL10rL3N0YXJ0X2FjdGl2aXR5JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9jb21wYXJlX2ltYWdlcycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvKD8hc2V0X2NsaXBib2FyZClbXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9lbGVtZW50L1teL10rL3JlcGxhY2VfdmFsdWUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZWxlbWVudC9bXi9dKy92YWx1ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9nZXRQZXJmb3JtYW5jZURhdGEnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vcGVyZm9ybWFuY2VEYXRhL3R5cGVzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2V4ZWN1dGVfZHJpdmVyJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3N0YXJ0X3JlY29yZGluZ19zY3JlZW4nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc3RvcF9yZWNvcmRpbmdfc2NyZWVuJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtLy4qZXZlbnQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2ltZS9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2tleXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2NhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RpbWVvdXRzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvbXVsdGkvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL3BlcmZvcm0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy91cmwnKV0sXG5cbiAgLy8gTUpTT05XUCBjb21tYW5kc1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cvdHlwZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZV9hc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZycpXSxcbiAgLy8gVzNDIGNvbW1hbmRzXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nL3R5cGVzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy93aW5kb3cvcmVjdCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvYXN5bmMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL3N5bmMnKV0sXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZycpXSxcbl07XG5cbi8vIFRoaXMgaXMgYSBzZXQgb2YgbWV0aG9kcyBhbmQgcGF0aHMgdGhhdCB3ZSBuZXZlciB3YW50IHRvIHByb3h5IHRvIENocm9tZWRyaXZlci5cbmNvbnN0IENIUk9NRV9OT19QUk9YWSA9IFtcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL3JlY3QnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvbXVsdGkvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL3BlcmZvcm0nKV0sXG5cbiAgLy8gdGhpcyBpcyBuZWVkZWQgdG8gbWFrZSB0aGUgbW9iaWxlOiBjb21tYW5kcyB3b3JraW5nIGluIHdlYiBjb250ZXh0XG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcblxuICAvLyBNSlNPTldQIGNvbW1hbmRzXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZy90eXBlcyQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2ckJyldLFxuICAvLyBXM0MgY29tbWFuZHNcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2cvdHlwZXMkJyldLFxuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2ckJyldLFxuXTtcblxuY29uc3QgTUVNT0laRURfRlVOQ1RJT05TID0gW1xuICAnZ2V0U3RhdHVzQmFySGVpZ2h0JyxcbiAgJ2dldERldmljZVBpeGVsUmF0aW8nLFxuXTtcblxuY2xhc3MgQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlciBleHRlbmRzIEJhc2VEcml2ZXIge1xuXG4gIHN0YXRpYyBuZXdNZXRob2RNYXAgPSBuZXdNZXRob2RNYXA7XG5cbiAgY29uc3RydWN0b3IgKG9wdHMgPSB7fSwgc2hvdWxkVmFsaWRhdGVDYXBzID0gdHJ1ZSkge1xuICAgIC8vIGBzaGVsbGAgb3ZlcndyaXRlcyBhZGIuc2hlbGwsIHNvIHJlbW92ZVxuICAgIGRlbGV0ZSBvcHRzLnNoZWxsO1xuXG4gICAgc3VwZXIob3B0cywgc2hvdWxkVmFsaWRhdGVDYXBzKTtcbiAgICB0aGlzLmxvY2F0b3JTdHJhdGVnaWVzID0gW1xuICAgICAgJ3hwYXRoJyxcbiAgICAgICdpZCcsXG4gICAgICAnY2xhc3MgbmFtZScsXG4gICAgICAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgICAnY3NzIHNlbGVjdG9yJyxcbiAgICAgICctYW5kcm9pZCB1aWF1dG9tYXRvcidcbiAgICBdO1xuICAgIHRoaXMuZGVzaXJlZENhcENvbnN0cmFpbnRzID0gZGVzaXJlZENhcENvbnN0cmFpbnRzO1xuICAgIHRoaXMudWlhdXRvbWF0b3IyID0gbnVsbDtcbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gTk9fUFJPWFk7XG4gICAgdGhpcy5hcGtTdHJpbmdzID0ge307IC8vIG1hcCBvZiBsYW5ndWFnZSAtPiBzdHJpbmdzIG9ialxuXG4gICAgdGhpcy5zZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncyh7aWdub3JlVW5pbXBvcnRhbnRWaWV3czogZmFsc2UsIGFsbG93SW52aXNpYmxlRWxlbWVudHM6IGZhbHNlfSxcbiAgICAgICAgdGhpcy5vblNldHRpbmdzVXBkYXRlLmJpbmQodGhpcykpO1xuICAgIC8vIGhhbmRsZSB3ZWJ2aWV3IG1lY2hhbmljcyBmcm9tIEFuZHJvaWREcml2ZXJcbiAgICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gICAgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVycyA9IHt9O1xuXG4gICAgLy8gbWVtb2l6ZSBmdW5jdGlvbnMgaGVyZSwgc28gdGhhdCB0aGV5IGFyZSBkb25lIG9uIGEgcGVyLWluc3RhbmNlIGJhc2lzXG4gICAgZm9yIChjb25zdCBmbiBvZiBNRU1PSVpFRF9GVU5DVElPTlMpIHtcbiAgICAgIHRoaXNbZm5dID0gXy5tZW1vaXplKHRoaXNbZm5dKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gICAgcmV0dXJuIHN1cGVyLnZhbGlkYXRlRGVzaXJlZENhcHMoY2FwcykgJiYgYW5kcm9pZEhlbHBlcnMudmFsaWRhdGVEZXNpcmVkQ2FwcyhjYXBzKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKC4uLmFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVE9ETyBoYW5kbGUgb3RoZXJTZXNzaW9uRGF0YSBmb3IgbXVsdGlwbGUgc2Vzc2lvbnNcbiAgICAgIGxldCBbc2Vzc2lvbklkLCBjYXBzXSA9IGF3YWl0IHN1cGVyLmNyZWF0ZVNlc3Npb24oLi4uYXJncyk7XG5cbiAgICAgIGxldCBzZXJ2ZXJEZXRhaWxzID0ge1xuICAgICAgICBwbGF0Zm9ybTogJ0xJTlVYJyxcbiAgICAgICAgd2ViU3RvcmFnZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0YWtlc1NjcmVlbnNob3Q6IHRydWUsXG4gICAgICAgIGphdmFzY3JpcHRFbmFibGVkOiB0cnVlLFxuICAgICAgICBkYXRhYmFzZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxvY2F0aW9uQ29udGV4dEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB3YXJuaW5nczoge30sXG4gICAgICAgIGRlc2lyZWQ6IHRoaXMuY2FwcyxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FwcyA9IE9iamVjdC5hc3NpZ24oc2VydmVyRGV0YWlscywgdGhpcy5jYXBzKTtcblxuICAgICAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5kZWZhdWx0Q29udGV4dE5hbWUoKTtcblxuICAgICAgbGV0IGRlZmF1bHRPcHRzID0ge1xuICAgICAgICBmdWxsUmVzZXQ6IGZhbHNlLFxuICAgICAgICBhdXRvTGF1bmNoOiB0cnVlLFxuICAgICAgICBhZGJQb3J0OiBERUZBVUxUX0FEQl9QT1JULFxuICAgICAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQ6IDkwMDAwXG4gICAgICB9O1xuICAgICAgXy5kZWZhdWx0cyh0aGlzLm9wdHMsIGRlZmF1bHRPcHRzKTtcblxuICAgICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oXCJXZSdyZSBnb2luZyB0byBydW4gYSBDaHJvbWUtYmFzZWQgc2Vzc2lvblwiKTtcbiAgICAgICAgbGV0IHtwa2csIGFjdGl2aXR5fSA9IGhlbHBlcnMuZ2V0Q2hyb21lUGtnKHRoaXMub3B0cy5icm93c2VyTmFtZSk7XG4gICAgICAgIHRoaXMub3B0cy5hcHBQYWNrYWdlID0gdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBwa2c7XG4gICAgICAgIHRoaXMub3B0cy5hcHBBY3Rpdml0eSA9IHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSA9IGFjdGl2aXR5O1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBDaHJvbWUtdHlwZSBwYWNrYWdlIGFuZCBhY3Rpdml0eSBhcmUgJHtwa2d9IGFuZCAke2FjdGl2aXR5fWApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLnJlYm9vdCkge1xuICAgICAgICB0aGlzLnNldEF2ZEZyb21DYXBhYmlsaXRpZXMoY2Fwcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdHMuYXBwKSB7XG4gICAgICAgIC8vIGZpbmQgYW5kIGNvcHksIG9yIGRvd25sb2FkIGFuZCB1bnppcCBhbiBhcHAgdXJsIG9yIHBhdGhcbiAgICAgICAgdGhpcy5vcHRzLmFwcCA9IGF3YWl0IHRoaXMuaGVscGVycy5jb25maWd1cmVBcHAodGhpcy5vcHRzLmFwcCwgW0FQS19FWFRFTlNJT04sIEFQS1NfRVhURU5TSU9OXSk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBQcmVzZW50KCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICAgIC8vIHRoZSBhcHAgaXNuJ3QgYW4gYWN0dWFsIGFwcCBmaWxlIGJ1dCByYXRoZXIgc29tZXRoaW5nIHdlIHdhbnQgdG9cbiAgICAgICAgLy8gYXNzdW1lIGlzIG9uIHRoZSBkZXZpY2UgYW5kIGp1c3QgbGF1bmNoIHZpYSB0aGUgYXBwUGFja2FnZVxuICAgICAgICB0aGlzLmxvZy5pbmZvKGBTdGFydGluZyAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nIGRpcmVjdGx5IG9uIHRoZSBkZXZpY2VgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYE5laXRoZXIgJ2FwcCcgbm9yICdhcHBQYWNrYWdlJyB3YXMgc2V0LiBTdGFydGluZyBVaUF1dG9tYXRvcjIgYCArXG4gICAgICAgICAgJ3dpdGhvdXQgdGhlIHRhcmdldCBhcHBsaWNhdGlvbicpO1xuICAgICAgfVxuICAgICAgdGhpcy5vcHRzLmFkYlBvcnQgPSB0aGlzLm9wdHMuYWRiUG9ydCB8fCBERUZBVUxUX0FEQl9QT1JUO1xuXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0VWlBdXRvbWF0b3IyU2Vzc2lvbigpO1xuICAgICAgYXdhaXQgdGhpcy5maWxsRGV2aWNlRGV0YWlscygpO1xuICAgICAgaWYgKHRoaXMub3B0cy5tanBlZ1NjcmVlbnNob3RVcmwpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3RhcnRpbmcgTUpQRUcgc3RyZWFtIHJlYWRpbmcgVVJMOiAnJHt0aGlzLm9wdHMubWpwZWdTY3JlZW5zaG90VXJsfSdgKTtcbiAgICAgICAgdGhpcy5tanBlZ1N0cmVhbSA9IG5ldyBtanBlZy5NSnBlZ1N0cmVhbSh0aGlzLm9wdHMubWpwZWdTY3JlZW5zaG90VXJsKTtcbiAgICAgICAgYXdhaXQgdGhpcy5tanBlZ1N0cmVhbS5zdGFydCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtzZXNzaW9uSWQsIHRoaXMuY2Fwc107XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZpbGxEZXZpY2VEZXRhaWxzICgpIHtcbiAgICB0aGlzLmNhcHMucGl4ZWxSYXRpbyA9IGF3YWl0IHRoaXMuZ2V0RGV2aWNlUGl4ZWxSYXRpbygpO1xuICAgIHRoaXMuY2Fwcy5zdGF0QmFySGVpZ2h0ID0gYXdhaXQgdGhpcy5nZXRTdGF0dXNCYXJIZWlnaHQoKTtcbiAgICB0aGlzLmNhcHMudmlld3BvcnRSZWN0ID0gYXdhaXQgdGhpcy5nZXRWaWV3UG9ydFJlY3QoKTtcbiAgfVxuXG4gIGdldCBkcml2ZXJEYXRhICgpIHtcbiAgICAvLyBUT0RPIGZpbGwgb3V0IHJlc291cmNlIGluZm8gaGVyZVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGFzeW5jIGdldFNlc3Npb24gKCkge1xuICAgIGxldCBzZXNzaW9uRGF0YSA9IGF3YWl0IHN1cGVyLmdldFNlc3Npb24oKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnR2V0dGluZyBzZXNzaW9uIGRldGFpbHMgZnJvbSBzZXJ2ZXIgdG8gbWl4IGluJyk7XG4gICAgbGV0IHVpYTJEYXRhID0gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvJywgJ0dFVCcsIHt9KTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc2Vzc2lvbkRhdGEsIHVpYTJEYXRhKTtcbiAgfVxuXG4gIGlzRW11bGF0b3IgKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzRW11bGF0b3IodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gIH1cblxuICBzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIChjYXBzKSB7XG4gICAgaWYgKHRoaXMub3B0cy5hdmQpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ2F2ZCBuYW1lIGRlZmluZWQsIGlnbm9yaW5nIGRldmljZSBuYW1lIGFuZCBwbGF0Zm9ybSB2ZXJzaW9uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY2Fwcy5kZXZpY2VOYW1lKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBkZXZpY2VOYW1lIHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiByZWJvb3Qgb3B0aW9uIGlzIGVuYWJsZXMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghY2Fwcy5wbGF0Zm9ybVZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnYXZkIG9yIHBsYXRmb3JtVmVyc2lvbiBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVkJyk7XG4gICAgICB9XG4gICAgICBsZXQgYXZkRGV2aWNlID0gY2Fwcy5kZXZpY2VOYW1lLnJlcGxhY2UoL1teYS16QS1aMC05Xy5dL2csICctJyk7XG4gICAgICB0aGlzLm9wdHMuYXZkID0gYCR7YXZkRGV2aWNlfV9fJHtjYXBzLnBsYXRmb3JtVmVyc2lvbn1gO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFsbG9jYXRlU3lzdGVtUG9ydCAoKSB7XG4gICAgY29uc3QgZm9yd2FyZFBvcnQgPSBhc3luYyAobG9jYWxQb3J0KSA9PiB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgRm9yd2FyZGluZyBVaUF1dG9tYXRvcjIgU2VydmVyIHBvcnQgJHtERVZJQ0VfUE9SVH0gdG8gbG9jYWwgcG9ydCAke2xvY2FsUG9ydH1gKTtcbiAgICAgIGlmICgoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKGxvY2FsUG9ydCwgTE9DQUxIT1NUX0lQNCkpID09PSAnb3BlbicpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVWlBdXRvbWF0b3IyIFNlcnZlciBjYW5ub3Qgc3RhcnQgYmVjYXVzZSB0aGUgbG9jYWwgcG9ydCAjJHtsb2NhbFBvcnR9IGlzIGJ1c3kuIGAgK1xuICAgICAgICAgIGBNYWtlIHN1cmUgdGhlIHBvcnQgeW91IHByb3ZpZGUgdmlhICdzeXN0ZW1Qb3J0JyBjYXBhYmlsaXR5IGlzIG5vdCBvY2N1cGllZC4gYCArXG4gICAgICAgICAgYFRoaXMgc2l0dWF0aW9uIG1pZ2h0IG9mdGVuIGJlIGEgcmVzdWx0IG9mIGFuIGluYWNjdXJhdGUgc2Vzc2lvbnMgbWFuYWdlbWVudCwgZS5nLiBgICtcbiAgICAgICAgICBgb2xkIGF1dG9tYXRpb24gc2Vzc2lvbnMgb24gdGhlIHNhbWUgZGV2aWNlIG11c3QgYWx3YXlzIGJlIGNsb3NlZCBiZWZvcmUgc3RhcnRpbmcgbmV3IG9uZXMuYCk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYi5mb3J3YXJkUG9ydChsb2NhbFBvcnQsIERFVklDRV9QT1JUKTtcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMub3B0cy5zeXN0ZW1Qb3J0KSB7XG4gICAgICB0aGlzLl9oYXNTeXN0ZW1Qb3J0SW5DYXBzID0gdHJ1ZTtcbiAgICAgIHJldHVybiBhd2FpdCBmb3J3YXJkUG9ydCh0aGlzLm9wdHMuc3lzdGVtUG9ydCk7XG4gICAgfVxuXG4gICAgYXdhaXQgREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBbc3RhcnRQb3J0LCBlbmRQb3J0XSA9IERFVklDRV9QT1JUX1JBTkdFO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5vcHRzLnN5c3RlbVBvcnQgPSBhd2FpdCBmaW5kQVBvcnROb3RJblVzZShzdGFydFBvcnQsIGVuZFBvcnQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KFxuICAgICAgICAgIGBDYW5ub3QgZmluZCBhbnkgZnJlZSBwb3J0IGluIHJhbmdlICR7c3RhcnRQb3J0fS4uJHtlbmRQb3J0fX0uIGAgK1xuICAgICAgICAgIGBQbGVhc2Ugc2V0IHRoZSBhdmFpbGFibGUgcG9ydCBudW1iZXIgYnkgcHJvdmlkaW5nIHRoZSBzeXN0ZW1Qb3J0IGNhcGFiaWxpdHkgb3IgYCArXG4gICAgICAgICAgYGRvdWJsZSBjaGVjayB0aGUgcHJvY2Vzc2VzIHRoYXQgYXJlIGxvY2tpbmcgcG9ydHMgd2l0aGluIHRoaXMgcmFuZ2UgYW5kIHRlcm1pbmF0ZSBgICtcbiAgICAgICAgICBgdGhlc2Ugd2hpY2ggYXJlIG5vdCBuZWVkZWQgYW55bW9yZWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgZm9yd2FyZFBvcnQodGhpcy5vcHRzLnN5c3RlbVBvcnQpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcmVsZWFzZVN5c3RlbVBvcnQgKCkge1xuICAgIGlmICghdGhpcy5vcHRzLnN5c3RlbVBvcnQgfHwgIXRoaXMuYWRiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2hhc1N5c3RlbVBvcnRJbkNhcHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnJlbW92ZVBvcnRGb3J3YXJkKHRoaXMub3B0cy5zeXN0ZW1Qb3J0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRChhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmFkYi5yZW1vdmVQb3J0Rm9yd2FyZCh0aGlzLm9wdHMuc3lzdGVtUG9ydCkpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0ICgpIHtcbiAgICBpZiAodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yd2FyZFBvcnQodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCwgTUpQRUdfU0VSVkVSX0RFVklDRV9QT1JUKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyByZWxlYXNlTWpwZWdTZXJ2ZXJQb3J0ICgpIHtcbiAgICBpZiAodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIucmVtb3ZlUG9ydEZvcndhcmQodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRVaUF1dG9tYXRvcjJTZXNzaW9uICgpIHtcbiAgICAvLyBnZXQgZGV2aWNlIHVkaWQgZm9yIHRoaXMgc2Vzc2lvblxuICAgIGxldCB7dWRpZCwgZW1Qb3J0fSA9IGF3YWl0IGhlbHBlcnMuZ2V0RGV2aWNlSW5mb0Zyb21DYXBzKHRoaXMub3B0cyk7XG4gICAgdGhpcy5vcHRzLnVkaWQgPSB1ZGlkO1xuICAgIHRoaXMub3B0cy5lbVBvcnQgPSBlbVBvcnQ7XG5cbiAgICAvLyBub3cgdGhhdCB3ZSBrbm93IG91ciBqYXZhIHZlcnNpb24gYW5kIGRldmljZSBpbmZvLCB3ZSBjYW4gY3JlYXRlIG91clxuICAgIC8vIEFEQiBpbnN0YW5jZVxuICAgIHRoaXMuYWRiID0gYXdhaXQgYW5kcm9pZEhlbHBlcnMuY3JlYXRlQURCKHRoaXMub3B0cyk7XG5cbiAgICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG5cbiAgICBpZiAoYXBpTGV2ZWwgPCAyMSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnVUlBdXRvbWF0b3IyIGlzIG9ubHkgc3VwcG9ydGVkIHNpbmNlIEFuZHJvaWQgNS4wIChMb2xsaXBvcCkuICcgK1xuICAgICAgICAnWW91IGNvdWxkIHN0aWxsIHVzZSBvdGhlciBzdXBwb3J0ZWQgYmFja2VuZHMgaW4gb3JkZXIgdG8gYXV0b21hdGUgb2xkZXIgQW5kcm9pZCB2ZXJzaW9ucy4nKTtcbiAgICB9XG5cbiAgICBpZiAoYXBpTGV2ZWwgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICB0aGlzLmxvZy5pbmZvKCdSZWxheGluZyBoaWRkZW4gYXBpIHBvbGljeScpO1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0SGlkZGVuQXBpUG9saWN5KCcxJywgISF0aGlzLm9wdHMuaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIHdlIGhhdmUgdG8gZW5hYmxlL2Rpc2FibGUgZ3BzIGJlZm9yZSBydW5uaW5nIHRoZSBhcHBsaWNhdGlvblxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMub3B0cy5ncHNFbmFibGVkKSkge1xuICAgICAgaWYgKHRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYFRyeWluZyB0byAke3RoaXMub3B0cy5ncHNFbmFibGVkID8gJ2VuYWJsZScgOiAnZGlzYWJsZSd9IGdwcyBsb2NhdGlvbiBwcm92aWRlcmApO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi50b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyKHRoaXMub3B0cy5ncHNFbmFibGVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFNvcnJ5ISAnZ3BzRW5hYmxlZCcgY2FwYWJpbGl0eSBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFwcFBhY2thZ2UgZXQgYWwgZnJvbSBtYW5pZmVzdCBpZiBuZWNlc3NhcnlcbiAgICBjb25zdCBhcHBJbmZvID0gYXdhaXQgaGVscGVycy5nZXRMYXVuY2hJbmZvKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIC8vIGFuZCBnZXQgaXQgb250byBvdXIgJ29wdHMnIG9iamVjdCBzbyB3ZSB1c2UgaXQgZnJvbSBub3cgb25cbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0cywgYXBwSW5mbyB8fCB7fSk7XG5cbiAgICAvLyBzZXQgYWN0dWFsIGRldmljZSBuYW1lLCB1ZGlkLCBwbGF0Zm9ybSB2ZXJzaW9uLCBzY3JlZW4gc2l6ZSwgc2NyZWVuIGRlbnNpdHksIG1vZGVsIGFuZCBtYW51ZmFjdHVyZXIgZGV0YWlsc1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VOYW1lID0gdGhpcy5hZGIuY3VyRGV2aWNlSWQ7XG4gICAgdGhpcy5jYXBzLmRldmljZVVESUQgPSB0aGlzLm9wdHMudWRpZDtcblxuICAgIC8vIHN0YXJ0IGFuIGF2ZCwgc2V0IHRoZSBsYW5ndWFnZS9sb2NhbGUsIHBpY2sgYW4gZW11bGF0b3IsIGV0Yy4uLlxuICAgIC8vIFRPRE8gd2l0aCBtdWx0aXBsZSBkZXZpY2VzIHdlJ2xsIG5lZWQgdG8gcGFyYW1ldGVyaXplIHRoaXNcbiAgICBhd2FpdCBoZWxwZXJzLmluaXREZXZpY2UodGhpcy5hZGIsIHRoaXMub3B0cyk7XG5cbiAgICAvLyBQcmVwYXJlIHRoZSBkZXZpY2UgYnkgZm9yd2FyZGluZyB0aGUgVWlBdXRvbWF0b3IyIHBvcnRcbiAgICAvLyBUaGlzIGNhbGwgbXV0YXRlcyB0aGlzLm9wdHMuc3lzdGVtUG9ydCBpZiBpdCBpcyBub3Qgc2V0IGV4cGxpY2l0bHlcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlU3lzdGVtUG9ydCgpO1xuXG4gICAgLy8gUHJlcGFyZSB0aGUgZGV2aWNlIGJ5IGZvcndhcmRpbmcgdGhlIFVpQXV0b21hdG9yMiBNSlBFRyBzZXJ2ZXIgcG9ydCAoaWZcbiAgICAvLyBhcHBsaWNhYmxlKVxuICAgIGF3YWl0IHRoaXMuYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQoKTtcblxuICAgIC8vIHNldCB1cCB0aGUgbW9kaWZpZWQgVWlBdXRvbWF0b3IyIHNlcnZlciBldGNcbiAgICBhd2FpdCB0aGlzLmluaXRVaUF1dG9tYXRvcjJTZXJ2ZXIoKTtcblxuICAgIC8vIFNob3VsZCBiZSBhZnRlciBpbnN0YWxsaW5nIGlvLmFwcGl1bS5zZXR0aW5ncyBpbiBoZWxwZXJzLmluaXREZXZpY2VcbiAgICBpZiAodGhpcy5vcHRzLmRpc2FibGVXaW5kb3dBbmltYXRpb24gJiYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCAyNikpIHsgLy8gQVBJIGxldmVsIDI2IGlzIEFuZHJvaWQgOC4wLlxuICAgICAgLy8gR3JhbnRpbmcgYW5kcm9pZC5wZXJtaXNzaW9uLlNFVF9BTklNQVRJT05fU0NBTEUgaXMgbmVjZXNzYXJ5IHRvIGhhbmRsZSBhbmltYXRpb25zIHVuZGVyIEFQSSBsZXZlbCAyNlxuICAgICAgLy8gUmVhZCBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9wdWxsLzExNjQwI2lzc3VlY29tbWVudC00MzgyNjA0NzdcbiAgICAgIC8vIGAtLW5vLXdpbmRvdy1hbmltYXRpb25gIHdvcmtzIG92ZXIgQW5kcm9pZCA4IHRvIGRpc2FibGUgYWxsIG9mIGFuaW1hdGlvbnNcbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5pc0FuaW1hdGlvbk9uKCkpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnRGlzYWJsaW5nIGFuaW1hdGlvbiB2aWEgaW8uYXBwaXVtLnNldHRpbmdzJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnV2luZG93IGFuaW1hdGlvbiBpcyBhbHJlYWR5IGRpc2FibGVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2V0IHVwIGFwcCB1bmRlciB0ZXN0XG4gICAgLy8gcHJlcGFyZSBvdXIgYWN0dWFsIEFVVCwgZ2V0IGl0IG9uIHRoZSBkZXZpY2UsIGV0Yy4uLlxuICAgIGF3YWl0IHRoaXMuaW5pdEFVVCgpO1xuXG4gICAgLy8gQWRkaW5nIEFVVCBwYWNrYWdlIG5hbWUgaW4gdGhlIGNhcGFiaWxpdGllcyBpZiBwYWNrYWdlIG5hbWUgbm90IGV4aXN0IGluIGNhcHNcbiAgICBpZiAoIXRoaXMuY2Fwcy5hcHBQYWNrYWdlICYmIGFwcEluZm8pIHtcbiAgICAgIHRoaXMuY2Fwcy5hcHBQYWNrYWdlID0gYXBwSW5mby5hcHBQYWNrYWdlO1xuICAgIH1cblxuICAgIC8vIGxhdW5jaCBVaUF1dG9tYXRvcjIgYW5kIHdhaXQgdGlsbCBpdHMgb25saW5lIGFuZCB3ZSBoYXZlIGEgc2Vzc2lvblxuICAgIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLnN0YXJ0U2Vzc2lvbih0aGlzLmNhcHMpO1xuXG4gICAgYXdhaXQgdGhpcy5hZGREZXZpY2VJbmZvVG9DYXBzKCk7XG5cbiAgICAvLyBVbmxvY2sgdGhlIGRldmljZSBhZnRlciB0aGUgc2Vzc2lvbiBpcyBzdGFydGVkLlxuICAgIGlmICghdGhpcy5vcHRzLnNraXBVbmxvY2spIHtcbiAgICAgIC8vIHVubG9jayB0aGUgZGV2aWNlIHRvIHByZXBhcmUgaXQgZm9yIHRlc3RpbmdcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5sb2NrKHRoaXMsIHRoaXMuYWRiLCB0aGlzLmNhcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgJ3NraXBVbmxvY2snIGNhcGFiaWxpdHkgc2V0LCBzbyBza2lwcGluZyBkZXZpY2UgdW5sb2NrYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7IC8vIHN0YXJ0IGEgY2hyb21lZHJpdmVyIHNlc3Npb25cbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRDaHJvbWVTZXNzaW9uKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRzLmF1dG9MYXVuY2ggJiYgdGhpcy5vcHRzLmFwcFBhY2thZ2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQXBwU3RhcnRzKCk7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIGluaXRpYWwgb3JpZW50YXRpb24gaXMgcmVxdWVzdGVkLCBzZXQgaXRcbiAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMub3JpZW50YXRpb24pKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBpbml0aWFsIG9yaWVudGF0aW9uIHRvICcke3RoaXMub3B0cy5vcmllbnRhdGlvbn0nYCk7XG4gICAgICBhd2FpdCB0aGlzLnNldE9yaWVudGF0aW9uKHRoaXMub3B0cy5vcmllbnRhdGlvbik7XG4gICAgfVxuXG4gICAgLy8gaWYgd2Ugd2FudCB0byBpbW1lZGlhdGVseSBnZXQgaW50byBhIHdlYnZpZXcsIHNldCBvdXIgY29udGV4dFxuICAgIC8vIGFwcHJvcHJpYXRlbHlcbiAgICBpZiAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3KSB7XG4gICAgICBjb25zdCB2aWV3TmFtZSA9IHRoaXMuZGVmYXVsdFdlYnZpZXdOYW1lKCk7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5vcHRzLmF1dG9XZWJ2aWV3VGltZW91dCB8fCAyMDAwO1xuICAgICAgdGhpcy5sb2cuaW5mbyhgU2V0dGluZyBhdXRvIHdlYnZpZXcgdG8gY29udGV4dCAnJHt2aWV3TmFtZX0nIHdpdGggdGltZW91dCAke3RpbWVvdXR9bXNgKTtcbiAgICAgIGF3YWl0IHJldHJ5SW50ZXJ2YWwodGltZW91dCAvIDUwMCwgNTAwLCB0aGlzLnNldENvbnRleHQuYmluZCh0aGlzKSwgdmlld05hbWUpO1xuICAgIH1cblxuICAgIC8vIG5vdyB0aGF0IGV2ZXJ5dGhpbmcgaGFzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LCB0dXJuIG9uIHByb3h5aW5nIHNvIGFsbFxuICAgIC8vIHN1YnNlcXVlbnQgc2Vzc2lvbiByZXF1ZXN0cyBnbyBzdHJhaWdodCB0by9mcm9tIHVpYXV0b21hdG9yMlxuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSB0cnVlO1xuICB9XG5cbiAgYXN5bmMgYWRkRGV2aWNlSW5mb1RvQ2FwcyAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXBpVmVyc2lvbixcbiAgICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICAgIG1hbnVmYWN0dXJlcixcbiAgICAgIG1vZGVsLFxuICAgICAgcmVhbERpc3BsYXlTaXplLFxuICAgICAgZGlzcGxheURlbnNpdHksXG4gICAgfSA9IGF3YWl0IHRoaXMubW9iaWxlR2V0RGV2aWNlSW5mbygpO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VBcGlMZXZlbCA9IHBhcnNlSW50KGFwaVZlcnNpb24sIDEwKTtcbiAgICB0aGlzLmNhcHMucGxhdGZvcm1WZXJzaW9uID0gcGxhdGZvcm1WZXJzaW9uO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VTY3JlZW5TaXplID0gcmVhbERpc3BsYXlTaXplO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VTY3JlZW5EZW5zaXR5ID0gZGlzcGxheURlbnNpdHk7XG4gICAgdGhpcy5jYXBzLmRldmljZU1vZGVsID0gbW9kZWw7XG4gICAgdGhpcy5jYXBzLmRldmljZU1hbnVmYWN0dXJlciA9IG1hbnVmYWN0dXJlcjtcbiAgfVxuXG4gIGFzeW5jIGluaXRVaUF1dG9tYXRvcjJTZXJ2ZXIgKCkge1xuICAgIC8vIGJyb2tlbiBvdXQgZm9yIHJlYWRhYmlsaXR5XG4gICAgY29uc3QgdWlhdXRvbWF0b3IyT3B0cyA9IHtcbiAgICAgIGhvc3Q6IHRoaXMub3B0cy5yZW1vdGVBZGJIb3N0IHx8IHRoaXMub3B0cy5ob3N0IHx8IExPQ0FMSE9TVF9JUDQsXG4gICAgICBzeXN0ZW1Qb3J0OiB0aGlzLm9wdHMuc3lzdGVtUG9ydCxcbiAgICAgIGRldmljZVBvcnQ6IERFVklDRV9QT1JULFxuICAgICAgYWRiOiB0aGlzLmFkYixcbiAgICAgIGFwazogdGhpcy5vcHRzLmFwcCxcbiAgICAgIHRtcERpcjogdGhpcy5vcHRzLnRtcERpcixcbiAgICAgIGFwcFBhY2thZ2U6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgICAgYXBwQWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgIGRpc2FibGVXaW5kb3dBbmltYXRpb246ICEhdGhpcy5vcHRzLmRpc2FibGVXaW5kb3dBbmltYXRpb24sXG4gICAgICBkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZTogdGhpcy5vcHRzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlLFxuICAgICAgcmVhZFRpbWVvdXQ6IHRoaXMub3B0cy51aWF1dG9tYXRvcjJTZXJ2ZXJSZWFkVGltZW91dCxcbiAgICB9O1xuICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgcGFja2FnZSBhbmQgYWN0aXZpdHksIHdlIGNhbiBjcmVhdGUgYW4gaW5zdGFuY2Ugb2ZcbiAgICAvLyB1aWF1dG9tYXRvcjIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgb3B0aW9uc1xuICAgIHRoaXMudWlhdXRvbWF0b3IyID0gbmV3IFVpQXV0b21hdG9yMlNlcnZlcih0aGlzLmxvZywgdWlhdXRvbWF0b3IyT3B0cyk7XG4gICAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMudWlhdXRvbWF0b3IyLnByb3h5UmVxUmVzLmJpbmQodGhpcy51aWF1dG9tYXRvcjIpO1xuICAgIHRoaXMucHJveHlDb21tYW5kID0gdGhpcy51aWF1dG9tYXRvcjIucHJveHlDb21tYW5kLmJpbmQodGhpcy51aWF1dG9tYXRvcjIpO1xuXG4gICAgaWYgKHRoaXMub3B0cy5za2lwU2VydmVySW5zdGFsbGF0aW9uKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGAnc2tpcFNlcnZlckluc3RhbGxhdGlvbicgaXMgc2V0LiBTa2lwcGluZyBVSUF1dG9tYXRvcjIgc2VydmVyIGluc3RhbGxhdGlvbi5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuaW5zdGFsbFNlcnZlckFwayh0aGlzLm9wdHMudWlhdXRvbWF0b3IyU2VydmVySW5zdGFsbFRpbWVvdXQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuYWRkVG9EZXZpY2VJZGxlV2hpdGVsaXN0KFxuICAgICAgICAgIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIFNFUlZFUl9QQUNLQUdFX0lELCBTRVJWRVJfVEVTVF9QQUNLQUdFX0lELFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3QgYWRkIHNlcnZlciBwYWNrYWdlcyB0byB0aGUgRG96ZSB3aGl0ZWxpc3QuIE9yaWdpbmFsIGVycm9yOiBgICtcbiAgICAgICAgICAoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5pdEFVVCAoKSB7XG4gICAgLy8gVW5pbnN0YWxsIGFueSB1bmluc3RhbGxPdGhlclBhY2thZ2VzIHdoaWNoIHdlcmUgc3BlY2lmaWVkIGluIGNhcHNcbiAgICBpZiAodGhpcy5vcHRzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyhcbiAgICAgICAgdGhpcy5hZGIsXG4gICAgICAgIGhlbHBlcnMucGFyc2VBcnJheSh0aGlzLm9wdHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyksXG4gICAgICAgIFtTRVRUSU5HU19IRUxQRVJfUEtHX0lELCBTRVJWRVJfUEFDS0FHRV9JRCwgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCBhbnkgXCJvdGhlckFwcHNcIiB0aGF0IHdlcmUgc3BlY2lmaWVkIGluIGNhcHNcbiAgICBpZiAodGhpcy5vcHRzLm90aGVyQXBwcykge1xuICAgICAgbGV0IG90aGVyQXBwcztcbiAgICAgIHRyeSB7XG4gICAgICAgIG90aGVyQXBwcyA9IGhlbHBlcnMucGFyc2VBcnJheSh0aGlzLm9wdHMub3RoZXJBcHBzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ291bGQgbm90IHBhcnNlIFwib3RoZXJBcHBzXCIgY2FwYWJpbGl0eTogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICBvdGhlckFwcHMgPSBhd2FpdCBCLmFsbChvdGhlckFwcHNcbiAgICAgICAgLm1hcCgoYXBwKSA9PiB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKGFwcCwgW0FQS19FWFRFTlNJT04sIEFQS1NfRVhURU5TSU9OXSkpKTtcbiAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbE90aGVyQXBrcyhvdGhlckFwcHMsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdHMuYXBwKSB7XG4gICAgICBpZiAodGhpcy5vcHRzLm5vUmVzZXQgJiYgIShhd2FpdCB0aGlzLmFkYi5pc0FwcEluc3RhbGxlZCh0aGlzLm9wdHMuYXBwUGFja2FnZSkpXG4gICAgICAgICAgfHwgIXRoaXMub3B0cy5ub1Jlc2V0KSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRzLm5vU2lnbiAmJiAhYXdhaXQgdGhpcy5hZGIuY2hlY2tBcGtDZXJ0KHRoaXMub3B0cy5hcHAsIHRoaXMub3B0cy5hcHBQYWNrYWdlLCB7XG4gICAgICAgICAgcmVxdWlyZURlZmF1bHRDZXJ0OiBmYWxzZSxcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICBhd2FpdCBoZWxwZXJzLnNpZ25BcHAodGhpcy5hZGIsIHRoaXMub3B0cy5hcHApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5vcHRzLnNraXBVbmluc3RhbGwpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbEFwayh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCdub1Jlc2V0IGhhcyBiZWVuIHJlcXVlc3RlZCBhbmQgdGhlIGFwcCBpcyBhbHJlYWR5IGluc3RhbGxlZC4gRG9pbmcgbm90aGluZycpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdGdWxsIHJlc2V0IHJlcXVpcmVzIGFuIGFwcCBjYXBhYmlsaXR5LCB1c2UgZmFzdFJlc2V0IGlmIGFwcCBpcyBub3QgcHJvdmlkZWQnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nLmRlYnVnKCdObyBhcHAgY2FwYWJpbGl0eS4gQXNzdW1pbmcgaXQgaXMgYWxyZWFkeSBvbiB0aGUgZGV2aWNlJyk7XG4gICAgICBpZiAodGhpcy5vcHRzLmZhc3RSZXNldCAmJiB0aGlzLm9wdHMuYXBwUGFja2FnZSkge1xuICAgICAgICBhd2FpdCBoZWxwZXJzLnJlc2V0QXBwKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGVuc3VyZUFwcFN0YXJ0cyAoKSB7XG4gICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgYW4gYWN0aXZpdHkgYW5kIHBhY2thZ2UgdG8gd2FpdCBmb3JcbiAgICBjb25zdCBhcHBXYWl0UGFja2FnZSA9IHRoaXMub3B0cy5hcHBXYWl0UGFja2FnZSB8fCB0aGlzLm9wdHMuYXBwUGFja2FnZTtcbiAgICBjb25zdCBhcHBXYWl0QWN0aXZpdHkgPSB0aGlzLm9wdHMuYXBwV2FpdEFjdGl2aXR5IHx8IHRoaXMub3B0cy5hcHBBY3Rpdml0eTtcblxuICAgIHRoaXMubG9nLmluZm8oYFN0YXJ0aW5nICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfS8ke3RoaXMub3B0cy5hcHBBY3Rpdml0eX0gYCArXG4gICAgICBgYW5kIHdhaXRpbmcgZm9yICcke2FwcFdhaXRQYWNrYWdlfS8ke2FwcFdhaXRBY3Rpdml0eX0nYCk7XG5cbiAgICBpZiAodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgYW5kcm9pZENvdmVyYWdlIGlzIGNvbmZpZ3VyZWQuIGAgK1xuICAgICAgICBgIFN0YXJ0aW5nIGluc3RydW1lbnRhdGlvbiBvZiAnJHt0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlfScuLi5gKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmFuZHJvaWRDb3ZlcmFnZSh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlLCBhcHBXYWl0UGFja2FnZSwgYXBwV2FpdEFjdGl2aXR5KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5ub1Jlc2V0ICYmICF0aGlzLm9wdHMuZm9yY2VBcHBMYXVuY2hcbiAgICAgICAgJiYgYXdhaXQgdGhpcy5hZGIucHJvY2Vzc0V4aXN0cyh0aGlzLm9wdHMuYXBwUGFja2FnZSkpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYCcke3RoaXMub3B0cy5hcHBQYWNrYWdlfScgaXMgYWxyZWFkeSBydW5uaW5nIGFuZCBub1Jlc2V0IGlzIGVuYWJsZWQuIGAgK1xuICAgICAgICBgU2V0IGZvcmNlQXBwTGF1bmNoIGNhcGFiaWxpdHkgdG8gdHJ1ZSBpZiB0aGUgYXBwIG11c3QgYmUgZm9yY2VmdWxseSByZXN0YXJ0ZWQgb24gc2Vzc2lvbiBzdGFydHVwLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmFkYi5zdGFydEFwcCh7XG4gICAgICBwa2c6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgICAgYWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgIGFjdGlvbjogdGhpcy5vcHRzLmludGVudEFjdGlvbiB8fCAnYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4nLFxuICAgICAgY2F0ZWdvcnk6IHRoaXMub3B0cy5pbnRlbnRDYXRlZ29yeSB8fCAnYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVInLFxuICAgICAgZmxhZ3M6IHRoaXMub3B0cy5pbnRlbnRGbGFncyB8fCAnMHgxMDIwMDAwMCcsIC8vIEZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgfCBGTEFHX0FDVElWSVRZX1JFU0VUX1RBU0tfSUZfTkVFREVEXG4gICAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgICB3YWl0QWN0aXZpdHk6IHRoaXMub3B0cy5hcHBXYWl0QWN0aXZpdHksXG4gICAgICB3YWl0Rm9yTGF1bmNoOiB0aGlzLm9wdHMuYXBwV2FpdEZvckxhdW5jaCxcbiAgICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICAgIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzOiB0aGlzLm9wdHMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHMsXG4gICAgICBzdG9wQXBwOiB0aGlzLm9wdHMuZm9yY2VBcHBMYXVuY2ggfHwgIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQsXG4gICAgICByZXRyeTogdHJ1ZSxcbiAgICAgIHVzZXI6IHRoaXMub3B0cy51c2VyUHJvZmlsZSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdEZWxldGluZyBVaUF1dG9tYXRvcjIgc2Vzc2lvbicpO1xuXG4gICAgY29uc3Qgc2NyZWVuUmVjb3JkaW5nU3RvcFRhc2tzID0gW2FzeW5jICgpID0+IHtcbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcFJlY29yZGluZ1NjcmVlbigpO1xuICAgICAgfVxuICAgIH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLm1vYmlsZUlzTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nUnVubmluZygpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZygpO1xuICAgICAgfVxuICAgIH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmcoKTtcbiAgICAgIH1cbiAgICB9XTtcblxuICAgIGF3YWl0IGFuZHJvaWRIZWxwZXJzLnJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyh0aGlzLnNlcnZlciwgdGhpcy5zZXNzaW9uSWQpO1xuXG4gICAgaWYgKHRoaXMudWlhdXRvbWF0b3IyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BDaHJvbWVkcml2ZXJQcm94aWVzKCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIHN0b3AgQ2hyb21lRHJpdmVyIHByb3hpZXM6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5qd3BQcm94eUFjdGl2ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmRlbGV0ZVNlc3Npb24oKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIHByb3h5IGRlbGV0ZVNlc3Npb24gdG8gVWlBdXRvbWF0b3IyOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnVpYXV0b21hdG9yMiA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLmFkYikge1xuICAgICAgYXdhaXQgQi5hbGwoc2NyZWVuUmVjb3JkaW5nU3RvcFRhc2tzLm1hcCgodGFzaykgPT4ge1xuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0YXNrKCk7XG4gICAgICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgICAgICB9KSgpO1xuICAgICAgfSkpO1xuXG4gICAgICBpZiAodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdTaHV0dGluZyBkb3duIHRoZSBhZGIgcHJvY2VzcyBvZiBpbnN0cnVtZW50YXRpb24uLi4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuZW5kQW5kcm9pZENvdmVyYWdlKCk7XG4gICAgICAgIC8vIFVzZSB0aGlzIGJyb2FkY2FzdCBpbnRlbnQgdG8gbm90aWZ5IGl0J3MgdGltZSB0byBkdW1wIGNvdmVyYWdlIHRvIGZpbGVcbiAgICAgICAgaWYgKHRoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBTZW5kaW5nIGludGVudCBicm9hZGNhc3QgJyR7dGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZUVuZEludGVudH0nIGF0IHRoZSBlbmQgb2YgaW5zdHJ1bWVudGluZy5gKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5icm9hZGNhc3QodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZUVuZEludGVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybignTm8gYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50IGlzIGNvbmZpZ3VyZWQgaW4gY2Fwcy4gUG9zc2libHkgeW91IGNhbm5vdCBnZXQgY292ZXJhZ2UgZmlsZS4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0Nocm9tZVNlc3Npb24gJiYgKCghdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldCAmJiAhdGhpcy5vcHRzLm5vUmVzZXQpXG4gICAgICAgICAgICB8fCAodGhpcy5vcHRzLm5vUmVzZXQgJiYgdGhpcy5vcHRzLnNob3VsZFRlcm1pbmF0ZUFwcCkpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmZvcmNlU3RvcCh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gZm9yY2Ugc3RvcCBhcHA6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ICYmICF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBDYXBhYmlsaXR5ICdmdWxsUmVzZXQnIHNldCB0byAndHJ1ZScsIFVuaW5zdGFsbGluZyAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nYCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gdW5pbnN0YWxsIGFwcDogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFRoaXMgdmFsdWUgY2FuIGJlIHRydWUgaWYgdGVzdCB0YXJnZXQgZGV2aWNlIGlzIDw9IDI2XG4gICAgICBpZiAodGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnUmVzdG9yaW5nIHdpbmRvdyBhbmltYXRpb24gc3RhdGUnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QW5pbWF0aW9uU3RhdGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zdG9wTG9nY2F0KCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbGVhc2VTeXN0ZW1Qb3J0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gcmVtb3ZlIHN5c3RlbSBwb3J0IGZvcndhcmQ6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgLy8gSWdub3JlLCB0aGlzIGJsb2NrIHdpbGwgYWxzbyBiZSBjYWxsZWQgd2hlbiB3ZSBmYWxsIGluIGNhdGNoIGJsb2NrXG4gICAgICAgIC8vIGFuZCBiZWZvcmUgZXZlbiBwb3J0IGZvcndhcmQuXG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbGVhc2VNanBlZ1NlcnZlclBvcnQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byByZW1vdmUgTUpQRUcgc2VydmVyIHBvcnQgZm9yd2FyZDogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAvLyBJZ25vcmUsIHRoaXMgYmxvY2sgd2lsbCBhbHNvIGJlIGNhbGxlZCB3aGVuIHdlIGZhbGwgaW4gY2F0Y2ggYmxvY2tcbiAgICAgICAgLy8gYW5kIGJlZm9yZSBldmVuIHBvcnQgZm9yd2FyZC5cbiAgICAgIH1cblxuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICAgIHRoaXMubG9nLmluZm8oJ1Jlc3RvcmluZyBoaWRkZW4gYXBpIHBvbGljeSB0byB0aGUgZGV2aWNlIGRlZmF1bHQgY29uZmlndXJhdGlvbicpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5KCEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgbGV0IGF2ZE5hbWUgPSB0aGlzLm9wdHMuYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBDbG9zaW5nIGVtdWxhdG9yICcke2F2ZE5hbWV9J2ApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmtpbGxFbXVsYXRvcihhdmROYW1lKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIGNsb3NlIGVtdWxhdG9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLm1qcGVnU3RyZWFtKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdDbG9zaW5nIE1KUEVHIHN0cmVhbScpO1xuICAgICAgdGhpcy5tanBlZ1N0cmVhbS5zdG9wKCk7XG4gICAgfVxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZVNlc3Npb24oKTtcbiAgfVxuXG4gIGFzeW5jIGNoZWNrQXBwUHJlc2VudCAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0NoZWNraW5nIHdoZXRoZXIgYXBwIGlzIGFjdHVhbGx5IHByZXNlbnQnKTtcbiAgICBpZiAoIShhd2FpdCBmcy5leGlzdHModGhpcy5vcHRzLmFwcCkpKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZmluZCBhcHAgYXBrIGF0ICcke3RoaXMub3B0cy5hcHB9J2ApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uU2V0dGluZ3NVcGRhdGUgKCkge1xuICAgIC8vIGludGVudGlvbmFsbHkgZG8gbm90aGluZyBoZXJlLCBzaW5jZSBjb21tYW5kcy51cGRhdGVTZXR0aW5ncyBwcm94aWVzXG4gICAgLy8gc2V0dGluZ3MgdG8gdGhlIHVpYXV0bzIgc2VydmVyIGFscmVhZHlcbiAgfVxuXG4gIC8vIE5lZWQgdG8gb3ZlcnJpZGUgYW5kcm9pZC1kcml2ZXIncyB2ZXJzaW9uIG9mIHRoaXMgc2luY2Ugd2UgZG9uJ3QgYWN0dWFsbHlcbiAgLy8gaGF2ZSBhIGJvb3RzdHJhcDsgaW5zdGVhZCB3ZSBqdXN0IHJlc3RhcnQgYWRiIGFuZCByZS1mb3J3YXJkIHRoZSBVaUF1dG9tYXRvcjJcbiAgLy8gcG9ydFxuICBhc3luYyB3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCAod3JhcHBlZCkge1xuICAgIGF3YWl0IHdyYXBwZWQoKTtcbiAgICBhd2FpdCB0aGlzLmFkYi5yZXN0YXJ0KCk7XG4gICAgYXdhaXQgdGhpcy5hbGxvY2F0ZVN5c3RlbVBvcnQoKTtcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0KCk7XG4gIH1cblxuICBwcm94eUFjdGl2ZSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGFsd2F5cyBoYXZlIGFuIGFjdGl2ZSBwcm94eSB0byB0aGUgVWlBdXRvbWF0b3IyIHNlcnZlclxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY2FuUHJveHkgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmNhblByb3h5KHNlc3Npb25JZCk7XG5cbiAgICAvLyB3ZSBjYW4gYWx3YXlzIHByb3h5IHRvIHRoZSB1aWF1dG9tYXRvcjIgc2VydmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXRQcm94eUF2b2lkTGlzdCAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIuZ2V0UHJveHlBdm9pZExpc3Qoc2Vzc2lvbklkKTtcbiAgICAvLyB3ZSBhcmUgbWFpbnRhaW5pbmcgdHdvIHNldHMgb2YgTk9fUFJPWFkgbGlzdHMsIG9uZSBmb3IgY2hyb21lZHJpdmVyKENIUk9NRV9OT19QUk9YWSlcbiAgICAvLyBhbmQgb25lIGZvciB1aWF1dG9tYXRvcjIoTk9fUFJPWFkpLCBiYXNlZCBvbiBjdXJyZW50IGNvbnRleHQgd2lsbCByZXR1cm4gcmVsYXRlZCBOT19QUk9YWSBsaXN0XG4gICAgaWYgKHV0aWwuaGFzVmFsdWUodGhpcy5jaHJvbWVkcml2ZXIpKSB7XG4gICAgICAvLyBpZiB0aGUgY3VycmVudCBjb250ZXh0IGlzIHdlYnZpZXcoY2hyb21lZHJpdmVyKSwgdGhlbiByZXR1cm4gQ0hST01FX05PX1BST1hZIGxpc3RcbiAgICAgIHRoaXMuandwUHJveHlBdm9pZCA9IENIUk9NRV9OT19QUk9YWTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5qd3BQcm94eUF2b2lkID0gTk9fUFJPWFk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdHMubmF0aXZlV2ViU2NyZWVuc2hvdCkge1xuICAgICAgdGhpcy5qd3BQcm94eUF2b2lkID0gWy4uLnRoaXMuandwUHJveHlBdm9pZCwgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2NyZWVuc2hvdCcpXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuandwUHJveHlBdm9pZDtcbiAgfVxuXG4gIGdldCBpc0Nocm9tZVNlc3Npb24gKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzQ2hyb21lQnJvd3Nlcih0aGlzLm9wdHMuYnJvd3Nlck5hbWUpO1xuICB9XG59XG5cbi8vIGZpcnN0IGFkZCB0aGUgYW5kcm9pZC1kcml2ZXIgY29tbWFuZHMgd2hpY2ggd2Ugd2lsbCBmYWxsIGJhY2sgdG9cbmZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoYW5kcm9pZENvbW1hbmRzKSkge1xuICBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG59XG5cbi8vIHRoZW4gb3ZlcndyaXRlIHdpdGggYW55IHVpYXV0b21hdG9yMi1zcGVjaWZpYyBjb21tYW5kc1xuZm9yIChsZXQgW2NtZCwgZm5dIG9mIF8udG9QYWlycyhjb21tYW5kcykpIHtcbiAgQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlci5wcm90b3R5cGVbY21kXSA9IGZuO1xufVxuXG5leHBvcnQgeyBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFlBQUEsR0FBQUYsT0FBQTtBQUdBLElBQUFHLFVBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFFBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFNBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFNBQUEsR0FBQVAsc0JBQUEsQ0FBQUMsT0FBQTtB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LENBQUMsRUFDN0QsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLCtDQUErQyxDQUFDLENBQUMsRUFDckUsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLDhDQUE4QyxDQUFDLENBQUMsRUFDcEUsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLGdDQUFnQyxDQUFDLENBQUMsRUFDdEQsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUMsRUFDL0MsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUMsRUFDL0MsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUMsRUFDakQsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUMsRUFDNUMsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUMsRUFDaEQsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLG9DQUFvQyxDQUFDLENBQUMsRUFDMUQsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUMsRUFDaEQsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLHFDQUFxQyxDQUFDLENBQUMsRUFDM0QsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLCtCQUErQixDQUFDLENBQUMsRUFDckQsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUMsRUFHM0MsQ0FBQyxLQUFLLEVBQUUsSUFBSUEsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUMsRUFDaEQsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUMsRUFDL0MsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLCtCQUErQixDQUFDLENBQUMsRUFDckQsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUMsRUFHM0MsQ0FBQyxLQUFLLEVBQUUsSUFBSUEsTUFBTSxDQUFDLDhCQUE4QixDQUFDLENBQUMsRUFDbkQsQ0FBQyxLQUFLLEVBQUUsSUFBSUEsTUFBTSxDQUFDLDZCQUE2QixDQUFDLENBQUMsRUFDbEQsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLCtCQUErQixDQUFDLENBQUMsRUFDckQsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLDhCQUE4QixDQUFDLENBQUMsRUFFcEQsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FDL0M7QUFHRCxNQUFNQyxlQUFlLEdBQUcsQ0FDdEIsQ0FBQyxLQUFLLEVBQUUsSUFBSUQsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUMsRUFDN0MsQ0FBQyxLQUFLLEVBQUUsSUFBSUEsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUMsRUFDOUMsQ0FBQyxLQUFLLEVBQUUsSUFBSUEsTUFBTSxDQUFDLG9DQUFvQyxDQUFDLENBQUMsRUFDekQsQ0FBQyxLQUFLLEVBQUUsSUFBSUEsTUFBTSxDQUFDLDZCQUE2QixDQUFDLENBQUMsRUFDbEQsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUMsRUFDOUMsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUMsRUFDL0MsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLDZCQUE2QixDQUFDLENBQUMsRUFDbkQsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLHFDQUFxQyxDQUFDLENBQUMsRUFDM0QsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLCtCQUErQixDQUFDLENBQUMsRUFHckQsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUMsRUFDaEQsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLDhCQUE4QixDQUFDLENBQUMsRUFHcEQsQ0FBQyxLQUFLLEVBQUUsSUFBSUEsTUFBTSxDQUFDLDRCQUE0QixDQUFDLENBQUMsRUFDakQsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUMsRUFHNUMsQ0FBQyxLQUFLLEVBQUUsSUFBSUEsTUFBTSxDQUFDLCtCQUErQixDQUFDLENBQUMsRUFFcEQsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FDaEQ7QUFFRCxNQUFNRSxrQkFBa0IsR0FBRyxDQUN6QixvQkFBb0IsRUFDcEIscUJBQXFCLENBQ3RCO0FBRUQsTUFBTUMseUJBQXlCLFNBQVNDLGtCQUFVLENBQUM7RUFFakQsT0FBT0MsWUFBWSxHQUFHQSx1QkFBWTtFQUVsQ0MsV0FBV0EsQ0FBRUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFQyxrQkFBa0IsR0FBRyxJQUFJLEVBQUU7SUFFakQsT0FBT0QsSUFBSSxDQUFDRSxLQUFLO0lBRWpCLEtBQUssQ0FBQ0YsSUFBSSxFQUFFQyxrQkFBa0IsQ0FBQztJQUMvQixJQUFJLENBQUNFLGlCQUFpQixHQUFHLENBQ3ZCLE9BQU8sRUFDUCxJQUFJLEVBQ0osWUFBWSxFQUNaLGtCQUFrQixFQUNsQixjQUFjLEVBQ2Qsc0JBQXNCLENBQ3ZCO0lBQ0QsSUFBSSxDQUFDQyxxQkFBcUIsR0FBR0Esb0JBQXFCO0lBQ2xELElBQUksQ0FBQ0MsWUFBWSxHQUFHLElBQUk7SUFDeEIsSUFBSSxDQUFDQyxjQUFjLEdBQUcsS0FBSztJQUMzQixJQUFJLENBQUNDLGFBQWEsR0FBR2YsUUFBUTtJQUM3QixJQUFJLENBQUNnQixVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBRXBCLElBQUksQ0FBQ0MsUUFBUSxHQUFHLElBQUlDLHNCQUFjLENBQUM7TUFBQ0Msc0JBQXNCLEVBQUUsS0FBSztNQUFFQyxzQkFBc0IsRUFBRTtJQUFLLENBQUMsRUFDN0YsSUFBSSxDQUFDQyxnQkFBZ0IsQ0FBQ0MsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXJDLElBQUksQ0FBQ0MsWUFBWSxHQUFHLElBQUk7SUFDeEIsSUFBSSxDQUFDQyxvQkFBb0IsR0FBRyxDQUFDLENBQUM7SUFHOUIsS0FBSyxNQUFNQyxFQUFFLElBQUl0QixrQkFBa0IsRUFBRTtNQUNuQyxJQUFJLENBQUNzQixFQUFFLENBQUMsR0FBR0MsZUFBQyxDQUFDQyxPQUFPLENBQUMsSUFBSSxDQUFDRixFQUFFLENBQUMsQ0FBQztJQUNoQztFQUNGO0VBRUFHLG1CQUFtQkEsQ0FBRUMsSUFBSSxFQUFFO0lBQ3pCLE9BQU8sS0FBSyxDQUFDRCxtQkFBbUIsQ0FBQ0MsSUFBSSxDQUFDLElBQUkzQyxtQ0FBYyxDQUFDMEMsbUJBQW1CLENBQUNDLElBQUksQ0FBQztFQUNwRjtFQUVBLE1BQU1DLGFBQWFBLENBQUUsR0FBR0MsSUFBSSxFQUFFO0lBQzVCLElBQUk7TUFFRixJQUFJLENBQUNDLFNBQVMsRUFBRUgsSUFBSSxDQUFDLEdBQUcsTUFBTSxLQUFLLENBQUNDLGFBQWEsQ0FBQyxHQUFHQyxJQUFJLENBQUM7TUFFMUQsSUFBSUUsYUFBYSxHQUFHO1FBQ2xCQyxRQUFRLEVBQUUsT0FBTztRQUNqQkMsaUJBQWlCLEVBQUUsS0FBSztRQUN4QkMsZUFBZSxFQUFFLElBQUk7UUFDckJDLGlCQUFpQixFQUFFLElBQUk7UUFDdkJDLGVBQWUsRUFBRSxLQUFLO1FBQ3RCQyx3QkFBd0IsRUFBRSxJQUFJO1FBQzlCQyxzQkFBc0IsRUFBRSxLQUFLO1FBQzdCQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ1pDLE9BQU8sRUFBRSxJQUFJLENBQUNiO01BQ2hCLENBQUM7TUFFRCxJQUFJLENBQUNBLElBQUksR0FBRzlDLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDaUQsYUFBYSxFQUFFLElBQUksQ0FBQ0osSUFBSSxDQUFDO01BRW5ELElBQUksQ0FBQ2MsVUFBVSxHQUFHLElBQUksQ0FBQ0Msa0JBQWtCLEVBQUU7TUFFM0MsSUFBSUMsV0FBVyxHQUFHO1FBQ2hCQyxTQUFTLEVBQUUsS0FBSztRQUNoQkMsVUFBVSxFQUFFLElBQUk7UUFDaEJDLE9BQU8sRUFBRUMsMkJBQWdCO1FBQ3pCQyxxQkFBcUIsRUFBRTtNQUN6QixDQUFDO01BQ0R4QixlQUFDLENBQUN5QixRQUFRLENBQUMsSUFBSSxDQUFDM0MsSUFBSSxFQUFFcUMsV0FBVyxDQUFDO01BRWxDLElBQUksSUFBSSxDQUFDTyxlQUFlLEVBQUU7UUFDeEIsSUFBSSxDQUFDQyxHQUFHLENBQUNDLElBQUksQ0FBQywyQ0FBMkMsQ0FBQztRQUMxRCxJQUFJO1VBQUNDLEdBQUc7VUFBRUM7UUFBUSxDQUFDLEdBQUcxRSxPQUFPLENBQUMyRSxZQUFZLENBQUMsSUFBSSxDQUFDakQsSUFBSSxDQUFDa0QsV0FBVyxDQUFDO1FBQ2pFLElBQUksQ0FBQ2xELElBQUksQ0FBQ21ELFVBQVUsR0FBRyxJQUFJLENBQUM5QixJQUFJLENBQUM4QixVQUFVLEdBQUdKLEdBQUc7UUFDakQsSUFBSSxDQUFDL0MsSUFBSSxDQUFDb0QsV0FBVyxHQUFHLElBQUksQ0FBQy9CLElBQUksQ0FBQytCLFdBQVcsR0FBR0osUUFBUTtRQUN4RCxJQUFJLENBQUNILEdBQUcsQ0FBQ0MsSUFBSSxDQUFFLHdDQUF1Q0MsR0FBSSxRQUFPQyxRQUFTLEVBQUMsQ0FBQztNQUM5RTtNQUVBLElBQUksSUFBSSxDQUFDaEQsSUFBSSxDQUFDcUQsTUFBTSxFQUFFO1FBQ3BCLElBQUksQ0FBQ0Msc0JBQXNCLENBQUNqQyxJQUFJLENBQUM7TUFDbkM7TUFFQSxJQUFJLElBQUksQ0FBQ3JCLElBQUksQ0FBQ3VELEdBQUcsRUFBRTtRQUVqQixJQUFJLENBQUN2RCxJQUFJLENBQUN1RCxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUNqRixPQUFPLENBQUNrRixZQUFZLENBQUMsSUFBSSxDQUFDeEQsSUFBSSxDQUFDdUQsR0FBRyxFQUFFLENBQUNFLHlCQUFhLEVBQUVDLDBCQUFjLENBQUMsQ0FBQztRQUMvRixNQUFNLElBQUksQ0FBQ0MsZUFBZSxFQUFFO01BQzlCLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQzNELElBQUksQ0FBQ21ELFVBQVUsRUFBRTtRQUcvQixJQUFJLENBQUNOLEdBQUcsQ0FBQ0MsSUFBSSxDQUFFLGFBQVksSUFBSSxDQUFDOUMsSUFBSSxDQUFDbUQsVUFBVywwQkFBeUIsQ0FBQztNQUM1RSxDQUFDLE1BQU07UUFDTCxJQUFJLENBQUNOLEdBQUcsQ0FBQ0MsSUFBSSxDQUFFLGdFQUErRCxHQUM1RSxnQ0FBZ0MsQ0FBQztNQUNyQztNQUNBLElBQUksQ0FBQzlDLElBQUksQ0FBQ3dDLE9BQU8sR0FBRyxJQUFJLENBQUN4QyxJQUFJLENBQUN3QyxPQUFPLElBQUlDLDJCQUFnQjtNQUV6RCxNQUFNLElBQUksQ0FBQ21CLHdCQUF3QixFQUFFO01BQ3JDLE1BQU0sSUFBSSxDQUFDQyxpQkFBaUIsRUFBRTtNQUM5QixJQUFJLElBQUksQ0FBQzdELElBQUksQ0FBQzhELGtCQUFrQixFQUFFO1FBQ2hDLElBQUksQ0FBQ2pCLEdBQUcsQ0FBQ0MsSUFBSSxDQUFFLHVDQUFzQyxJQUFJLENBQUM5QyxJQUFJLENBQUM4RCxrQkFBbUIsR0FBRSxDQUFDO1FBQ3JGLElBQUksQ0FBQ0MsV0FBVyxHQUFHLElBQUlDLGNBQUssQ0FBQ0MsV0FBVyxDQUFDLElBQUksQ0FBQ2pFLElBQUksQ0FBQzhELGtCQUFrQixDQUFDO1FBQ3RFLE1BQU0sSUFBSSxDQUFDQyxXQUFXLENBQUNHLEtBQUssRUFBRTtNQUNoQztNQUNBLE9BQU8sQ0FBQzFDLFNBQVMsRUFBRSxJQUFJLENBQUNILElBQUksQ0FBQztJQUMvQixDQUFDLENBQUMsT0FBTzhDLENBQUMsRUFBRTtNQUNWLE1BQU0sSUFBSSxDQUFDQyxhQUFhLEVBQUU7TUFDMUIsTUFBTUQsQ0FBQztJQUNUO0VBQ0Y7RUFFQSxNQUFNTixpQkFBaUJBLENBQUEsRUFBSTtJQUN6QixJQUFJLENBQUN4QyxJQUFJLENBQUNnRCxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUNDLG1CQUFtQixFQUFFO0lBQ3ZELElBQUksQ0FBQ2pELElBQUksQ0FBQ2tELGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQ0Msa0JBQWtCLEVBQUU7SUFDekQsSUFBSSxDQUFDbkQsSUFBSSxDQUFDb0QsWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDQyxlQUFlLEVBQUU7RUFDdkQ7RUFFQSxJQUFJQyxVQUFVQSxDQUFBLEVBQUk7SUFFaEIsT0FBTyxDQUFDLENBQUM7RUFDWDtFQUVBLE1BQU1DLFVBQVVBLENBQUEsRUFBSTtJQUNsQixJQUFJQyxXQUFXLEdBQUcsTUFBTSxLQUFLLENBQUNELFVBQVUsRUFBRTtJQUMxQyxJQUFJLENBQUMvQixHQUFHLENBQUNpQyxLQUFLLENBQUMsK0NBQStDLENBQUM7SUFDL0QsSUFBSUMsUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDMUUsWUFBWSxDQUFDMkUsT0FBTyxDQUFDQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RSxPQUFPMUcsTUFBTSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUVxRyxXQUFXLEVBQUVFLFFBQVEsQ0FBQztFQUNqRDtFQUVBRyxVQUFVQSxDQUFBLEVBQUk7SUFDWixPQUFPNUcsT0FBTyxDQUFDNEcsVUFBVSxDQUFDLElBQUksQ0FBQ0MsR0FBRyxFQUFFLElBQUksQ0FBQ25GLElBQUksQ0FBQztFQUNoRDtFQUVBc0Qsc0JBQXNCQSxDQUFFakMsSUFBSSxFQUFFO0lBQzVCLElBQUksSUFBSSxDQUFDckIsSUFBSSxDQUFDb0YsR0FBRyxFQUFFO01BQ2pCLElBQUksQ0FBQ3ZDLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDLDZEQUE2RCxDQUFDO0lBQzlFLENBQUMsTUFBTTtNQUNMLElBQUksQ0FBQ3pCLElBQUksQ0FBQ2dFLFVBQVUsRUFBRTtRQUNwQixJQUFJLENBQUN4QyxHQUFHLENBQUN5QyxhQUFhLENBQUMscUVBQXFFLENBQUM7TUFDL0Y7TUFDQSxJQUFJLENBQUNqRSxJQUFJLENBQUNrRSxlQUFlLEVBQUU7UUFDekIsSUFBSSxDQUFDMUMsR0FBRyxDQUFDeUMsYUFBYSxDQUFDLDBFQUEwRSxDQUFDO01BQ3BHO01BQ0EsSUFBSUUsU0FBUyxHQUFHbkUsSUFBSSxDQUFDZ0UsVUFBVSxDQUFDSSxPQUFPLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDO01BQy9ELElBQUksQ0FBQ3pGLElBQUksQ0FBQ29GLEdBQUcsR0FBSSxHQUFFSSxTQUFVLEtBQUluRSxJQUFJLENBQUNrRSxlQUFnQixFQUFDO0lBQ3pEO0VBQ0Y7RUFFQSxNQUFNRyxrQkFBa0JBLENBQUEsRUFBSTtJQUMxQixNQUFNQyxXQUFXLEdBQUcsTUFBT0MsU0FBUyxJQUFLO01BQ3ZDLElBQUksQ0FBQy9DLEdBQUcsQ0FBQ2lDLEtBQUssQ0FBRSx1Q0FBc0N6RixXQUFZLGtCQUFpQnVHLFNBQVUsRUFBQyxDQUFDO01BQy9GLElBQUksQ0FBQyxNQUFNLElBQUFDLDRCQUFlLEVBQUNELFNBQVMsRUFBRXJHLGFBQWEsQ0FBQyxNQUFNLE1BQU0sRUFBRTtRQUNoRSxJQUFJLENBQUNzRCxHQUFHLENBQUN5QyxhQUFhLENBQUUsNERBQTJETSxTQUFVLFlBQVcsR0FDckcsOEVBQTZFLEdBQzdFLG9GQUFtRixHQUNuRiw0RkFBMkYsQ0FBQztNQUNqRztNQUNBLE1BQU0sSUFBSSxDQUFDVCxHQUFHLENBQUNRLFdBQVcsQ0FBQ0MsU0FBUyxFQUFFdkcsV0FBVyxDQUFDO0lBQ3BELENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQ1csSUFBSSxDQUFDOEYsVUFBVSxFQUFFO01BQ3hCLElBQUksQ0FBQ0Msb0JBQW9CLEdBQUcsSUFBSTtNQUNoQyxPQUFPLE1BQU1KLFdBQVcsQ0FBQyxJQUFJLENBQUMzRixJQUFJLENBQUM4RixVQUFVLENBQUM7SUFDaEQ7SUFFQSxNQUFNbEgsNEJBQTRCLENBQUMsWUFBWTtNQUM3QyxNQUFNLENBQUNvSCxTQUFTLEVBQUVDLE9BQU8sQ0FBQyxHQUFHdEgsaUJBQWlCO01BQzlDLElBQUk7UUFDRixJQUFJLENBQUNxQixJQUFJLENBQUM4RixVQUFVLEdBQUcsTUFBTSxJQUFBSSw4QkFBaUIsRUFBQ0YsU0FBUyxFQUFFQyxPQUFPLENBQUM7TUFDcEUsQ0FBQyxDQUFDLE9BQU85QixDQUFDLEVBQUU7UUFDVixJQUFJLENBQUN0QixHQUFHLENBQUN5QyxhQUFhLENBQ25CLHNDQUFxQ1UsU0FBVSxLQUFJQyxPQUFRLEtBQUksR0FDL0QsaUZBQWdGLEdBQ2hGLG9GQUFtRixHQUNuRixvQ0FBbUMsQ0FBQztNQUN6QztNQUNBLE1BQU1OLFdBQVcsQ0FBQyxJQUFJLENBQUMzRixJQUFJLENBQUM4RixVQUFVLENBQUM7SUFDekMsQ0FBQyxDQUFDO0VBQ0o7RUFFQSxNQUFNSyxpQkFBaUJBLENBQUEsRUFBSTtJQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDbkcsSUFBSSxDQUFDOEYsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDWCxHQUFHLEVBQUU7TUFDdEM7SUFDRjtJQUVBLElBQUksSUFBSSxDQUFDWSxvQkFBb0IsRUFBRTtNQUM3QixNQUFNLElBQUksQ0FBQ1osR0FBRyxDQUFDaUIsaUJBQWlCLENBQUMsSUFBSSxDQUFDcEcsSUFBSSxDQUFDOEYsVUFBVSxDQUFDO0lBQ3hELENBQUMsTUFBTTtNQUNMLE1BQU1sSCw0QkFBNEIsQ0FBQyxZQUFZLE1BQU0sSUFBSSxDQUFDdUcsR0FBRyxDQUFDaUIsaUJBQWlCLENBQUMsSUFBSSxDQUFDcEcsSUFBSSxDQUFDOEYsVUFBVSxDQUFDLENBQUM7SUFDeEc7RUFDRjtFQUVBLE1BQU1PLHVCQUF1QkEsQ0FBQSxFQUFJO0lBQy9CLElBQUksSUFBSSxDQUFDckcsSUFBSSxDQUFDc0csZUFBZSxFQUFFO01BQzdCLE1BQU0sSUFBSSxDQUFDbkIsR0FBRyxDQUFDUSxXQUFXLENBQUMsSUFBSSxDQUFDM0YsSUFBSSxDQUFDc0csZUFBZSxFQUFFaEgsd0JBQXdCLENBQUM7SUFDakY7RUFDRjtFQUVBLE1BQU1pSCxzQkFBc0JBLENBQUEsRUFBSTtJQUM5QixJQUFJLElBQUksQ0FBQ3ZHLElBQUksQ0FBQ3NHLGVBQWUsRUFBRTtNQUM3QixNQUFNLElBQUksQ0FBQ25CLEdBQUcsQ0FBQ2lCLGlCQUFpQixDQUFDLElBQUksQ0FBQ3BHLElBQUksQ0FBQ3NHLGVBQWUsQ0FBQztJQUM3RDtFQUNGO0VBRUEsTUFBTTFDLHdCQUF3QkEsQ0FBQSxFQUFJO0lBRWhDLElBQUk7TUFBQzRDLElBQUk7TUFBRUM7SUFBTSxDQUFDLEdBQUcsTUFBTW5JLE9BQU8sQ0FBQ29JLHFCQUFxQixDQUFDLElBQUksQ0FBQzFHLElBQUksQ0FBQztJQUNuRSxJQUFJLENBQUNBLElBQUksQ0FBQ3dHLElBQUksR0FBR0EsSUFBSTtJQUNyQixJQUFJLENBQUN4RyxJQUFJLENBQUN5RyxNQUFNLEdBQUdBLE1BQU07SUFJekIsSUFBSSxDQUFDdEIsR0FBRyxHQUFHLE1BQU16RyxtQ0FBYyxDQUFDaUksU0FBUyxDQUFDLElBQUksQ0FBQzNHLElBQUksQ0FBQztJQUVwRCxNQUFNNEcsUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDekIsR0FBRyxDQUFDMEIsV0FBVyxFQUFFO0lBRTdDLElBQUlELFFBQVEsR0FBRyxFQUFFLEVBQUU7TUFDakIsSUFBSSxDQUFDL0QsR0FBRyxDQUFDeUMsYUFBYSxDQUFDLCtEQUErRCxHQUNwRiwyRkFBMkYsQ0FBQztJQUNoRztJQUVBLElBQUlzQixRQUFRLElBQUksRUFBRSxFQUFFO01BQ2xCLElBQUksQ0FBQy9ELEdBQUcsQ0FBQ0MsSUFBSSxDQUFDLDRCQUE0QixDQUFDO01BQzNDLE1BQU0sSUFBSSxDQUFDcUMsR0FBRyxDQUFDMkIsa0JBQWtCLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUM5RyxJQUFJLENBQUMrRywwQkFBMEIsQ0FBQztJQUNoRjtJQUdBLElBQUlsSSxhQUFJLENBQUNtSSxRQUFRLENBQUMsSUFBSSxDQUFDaEgsSUFBSSxDQUFDaUgsVUFBVSxDQUFDLEVBQUU7TUFDdkMsSUFBSSxJQUFJLENBQUMvQixVQUFVLEVBQUUsRUFBRTtRQUNyQixJQUFJLENBQUNyQyxHQUFHLENBQUNDLElBQUksQ0FBRSxhQUFZLElBQUksQ0FBQzlDLElBQUksQ0FBQ2lILFVBQVUsR0FBRyxRQUFRLEdBQUcsU0FBVSx3QkFBdUIsQ0FBQztRQUMvRixNQUFNLElBQUksQ0FBQzlCLEdBQUcsQ0FBQytCLHlCQUF5QixDQUFDLElBQUksQ0FBQ2xILElBQUksQ0FBQ2lILFVBQVUsQ0FBQztNQUNoRSxDQUFDLE1BQU07UUFDTCxJQUFJLENBQUNwRSxHQUFHLENBQUNzRSxJQUFJLENBQUUsZ0VBQStELENBQUM7TUFDakY7SUFDRjtJQUdBLE1BQU1DLE9BQU8sR0FBRyxNQUFNOUksT0FBTyxDQUFDK0ksYUFBYSxDQUFDLElBQUksQ0FBQ2xDLEdBQUcsRUFBRSxJQUFJLENBQUNuRixJQUFJLENBQUM7SUFFaEV6QixNQUFNLENBQUNDLE1BQU0sQ0FBQyxJQUFJLENBQUN3QixJQUFJLEVBQUVvSCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7SUFHdkMsSUFBSSxDQUFDL0YsSUFBSSxDQUFDZ0UsVUFBVSxHQUFHLElBQUksQ0FBQ0YsR0FBRyxDQUFDbUMsV0FBVztJQUMzQyxJQUFJLENBQUNqRyxJQUFJLENBQUNrRyxVQUFVLEdBQUcsSUFBSSxDQUFDdkgsSUFBSSxDQUFDd0csSUFBSTtJQUlyQyxNQUFNbEksT0FBTyxDQUFDa0osVUFBVSxDQUFDLElBQUksQ0FBQ3JDLEdBQUcsRUFBRSxJQUFJLENBQUNuRixJQUFJLENBQUM7SUFJN0MsTUFBTSxJQUFJLENBQUMwRixrQkFBa0IsRUFBRTtJQUkvQixNQUFNLElBQUksQ0FBQ1csdUJBQXVCLEVBQUU7SUFHcEMsTUFBTSxJQUFJLENBQUNvQixzQkFBc0IsRUFBRTtJQUduQyxJQUFJLElBQUksQ0FBQ3pILElBQUksQ0FBQzBILHNCQUFzQixJQUFLLE9BQU0sSUFBSSxDQUFDdkMsR0FBRyxDQUFDMEIsV0FBVyxFQUFFLElBQUcsRUFBRyxFQUFFO01BSTNFLElBQUksTUFBTSxJQUFJLENBQUMxQixHQUFHLENBQUN3QyxhQUFhLEVBQUUsRUFBRTtRQUNsQyxJQUFJLENBQUM5RSxHQUFHLENBQUNDLElBQUksQ0FBQyw0Q0FBNEMsQ0FBQztRQUMzRCxNQUFNLElBQUksQ0FBQ3FDLEdBQUcsQ0FBQ3lDLGlCQUFpQixDQUFDLEtBQUssQ0FBQztRQUN2QyxJQUFJLENBQUNDLDJCQUEyQixHQUFHLElBQUk7TUFDekMsQ0FBQyxNQUFNO1FBQ0wsSUFBSSxDQUFDaEYsR0FBRyxDQUFDQyxJQUFJLENBQUMsc0NBQXNDLENBQUM7TUFDdkQ7SUFDRjtJQUlBLE1BQU0sSUFBSSxDQUFDZ0YsT0FBTyxFQUFFO0lBR3BCLElBQUksQ0FBQyxJQUFJLENBQUN6RyxJQUFJLENBQUM4QixVQUFVLElBQUlpRSxPQUFPLEVBQUU7TUFDcEMsSUFBSSxDQUFDL0YsSUFBSSxDQUFDOEIsVUFBVSxHQUFHaUUsT0FBTyxDQUFDakUsVUFBVTtJQUMzQztJQUdBLE1BQU0sSUFBSSxDQUFDOUMsWUFBWSxDQUFDMEgsWUFBWSxDQUFDLElBQUksQ0FBQzFHLElBQUksQ0FBQztJQUUvQyxNQUFNLElBQUksQ0FBQzJHLG1CQUFtQixFQUFFO0lBR2hDLElBQUksQ0FBQyxJQUFJLENBQUNoSSxJQUFJLENBQUNpSSxVQUFVLEVBQUU7TUFFekIsTUFBTTNKLE9BQU8sQ0FBQzRKLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDL0MsR0FBRyxFQUFFLElBQUksQ0FBQzlELElBQUksQ0FBQztJQUNqRCxDQUFDLE1BQU07TUFDTCxJQUFJLENBQUN3QixHQUFHLENBQUNpQyxLQUFLLENBQUUsd0RBQXVELENBQUM7SUFDMUU7SUFFQSxJQUFJLElBQUksQ0FBQ2xDLGVBQWUsRUFBRTtNQUN4QixNQUFNLElBQUksQ0FBQ3VGLGtCQUFrQixDQUFDLElBQUksQ0FBQztJQUNyQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUNuSSxJQUFJLENBQUN1QyxVQUFVLElBQUksSUFBSSxDQUFDdkMsSUFBSSxDQUFDbUQsVUFBVSxFQUFFO01BQ3ZELE1BQU0sSUFBSSxDQUFDaUYsZUFBZSxFQUFFO0lBQzlCO0lBR0EsSUFBSXZKLGFBQUksQ0FBQ21JLFFBQVEsQ0FBQyxJQUFJLENBQUNoSCxJQUFJLENBQUNxSSxXQUFXLENBQUMsRUFBRTtNQUN4QyxJQUFJLENBQUN4RixHQUFHLENBQUNpQyxLQUFLLENBQUUsbUNBQWtDLElBQUksQ0FBQzlFLElBQUksQ0FBQ3FJLFdBQVksR0FBRSxDQUFDO01BQzNFLE1BQU0sSUFBSSxDQUFDQyxjQUFjLENBQUMsSUFBSSxDQUFDdEksSUFBSSxDQUFDcUksV0FBVyxDQUFDO0lBQ2xEO0lBSUEsSUFBSSxJQUFJLENBQUNySSxJQUFJLENBQUN1SSxXQUFXLEVBQUU7TUFDekIsTUFBTUMsUUFBUSxHQUFHLElBQUksQ0FBQ0Msa0JBQWtCLEVBQUU7TUFDMUMsTUFBTXRKLE9BQU8sR0FBRyxJQUFJLENBQUNhLElBQUksQ0FBQzBJLGtCQUFrQixJQUFJLElBQUk7TUFDcEQsSUFBSSxDQUFDN0YsR0FBRyxDQUFDQyxJQUFJLENBQUUsb0NBQW1DMEYsUUFBUyxrQkFBaUJySixPQUFRLElBQUcsQ0FBQztNQUN4RixNQUFNLElBQUF3Six1QkFBYSxFQUFDeEosT0FBTyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDeUosVUFBVSxDQUFDOUgsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFMEgsUUFBUSxDQUFDO0lBQy9FO0lBSUEsSUFBSSxDQUFDbEksY0FBYyxHQUFHLElBQUk7RUFDNUI7RUFFQSxNQUFNMEgsbUJBQW1CQSxDQUFBLEVBQUk7SUFDM0IsTUFBTTtNQUNKYSxVQUFVO01BQ1Z0RCxlQUFlO01BQ2Z1RCxZQUFZO01BQ1pDLEtBQUs7TUFDTEMsZUFBZTtNQUNmQztJQUNGLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQ0MsbUJBQW1CLEVBQUU7SUFDcEMsSUFBSSxDQUFDN0gsSUFBSSxDQUFDOEgsY0FBYyxHQUFHQyxRQUFRLENBQUNQLFVBQVUsRUFBRSxFQUFFLENBQUM7SUFDbkQsSUFBSSxDQUFDeEgsSUFBSSxDQUFDa0UsZUFBZSxHQUFHQSxlQUFlO0lBQzNDLElBQUksQ0FBQ2xFLElBQUksQ0FBQ2dJLGdCQUFnQixHQUFHTCxlQUFlO0lBQzVDLElBQUksQ0FBQzNILElBQUksQ0FBQ2lJLG1CQUFtQixHQUFHTCxjQUFjO0lBQzlDLElBQUksQ0FBQzVILElBQUksQ0FBQ2tJLFdBQVcsR0FBR1IsS0FBSztJQUM3QixJQUFJLENBQUMxSCxJQUFJLENBQUNtSSxrQkFBa0IsR0FBR1YsWUFBWTtFQUM3QztFQUVBLE1BQU1yQixzQkFBc0JBLENBQUEsRUFBSTtJQUU5QixNQUFNZ0MsZ0JBQWdCLEdBQUc7TUFDdkJDLElBQUksRUFBRSxJQUFJLENBQUMxSixJQUFJLENBQUMySixhQUFhLElBQUksSUFBSSxDQUFDM0osSUFBSSxDQUFDMEosSUFBSSxJQUFJbkssYUFBYTtNQUNoRXVHLFVBQVUsRUFBRSxJQUFJLENBQUM5RixJQUFJLENBQUM4RixVQUFVO01BQ2hDOEQsVUFBVSxFQUFFdkssV0FBVztNQUN2QjhGLEdBQUcsRUFBRSxJQUFJLENBQUNBLEdBQUc7TUFDYjBFLEdBQUcsRUFBRSxJQUFJLENBQUM3SixJQUFJLENBQUN1RCxHQUFHO01BQ2xCdUcsTUFBTSxFQUFFLElBQUksQ0FBQzlKLElBQUksQ0FBQzhKLE1BQU07TUFDeEIzRyxVQUFVLEVBQUUsSUFBSSxDQUFDbkQsSUFBSSxDQUFDbUQsVUFBVTtNQUNoQ0MsV0FBVyxFQUFFLElBQUksQ0FBQ3BELElBQUksQ0FBQ29ELFdBQVc7TUFDbENzRSxzQkFBc0IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDMUgsSUFBSSxDQUFDMEgsc0JBQXNCO01BQzFEcUMsbUNBQW1DLEVBQUUsSUFBSSxDQUFDL0osSUFBSSxDQUFDK0osbUNBQW1DO01BQ2xGQyxXQUFXLEVBQUUsSUFBSSxDQUFDaEssSUFBSSxDQUFDaUs7SUFDekIsQ0FBQztJQUdELElBQUksQ0FBQzVKLFlBQVksR0FBRyxJQUFJNkosK0JBQWtCLENBQUMsSUFBSSxDQUFDckgsR0FBRyxFQUFFNEcsZ0JBQWdCLENBQUM7SUFDdEUsSUFBSSxDQUFDVSxXQUFXLEdBQUcsSUFBSSxDQUFDOUosWUFBWSxDQUFDOEosV0FBVyxDQUFDckosSUFBSSxDQUFDLElBQUksQ0FBQ1QsWUFBWSxDQUFDO0lBQ3hFLElBQUksQ0FBQytKLFlBQVksR0FBRyxJQUFJLENBQUMvSixZQUFZLENBQUMrSixZQUFZLENBQUN0SixJQUFJLENBQUMsSUFBSSxDQUFDVCxZQUFZLENBQUM7SUFFMUUsSUFBSSxJQUFJLENBQUNMLElBQUksQ0FBQ3FLLHNCQUFzQixFQUFFO01BQ3BDLElBQUksQ0FBQ3hILEdBQUcsQ0FBQ0MsSUFBSSxDQUFFLDZFQUE0RSxDQUFDO0lBQzlGLENBQUMsTUFBTTtNQUNMLE1BQU0sSUFBSSxDQUFDekMsWUFBWSxDQUFDaUssZ0JBQWdCLENBQUMsSUFBSSxDQUFDdEssSUFBSSxDQUFDdUssZ0NBQWdDLENBQUM7TUFDcEYsSUFBSTtRQUNGLE1BQU0sSUFBSSxDQUFDcEYsR0FBRyxDQUFDcUYsd0JBQXdCLENBQ3JDQywyQ0FBc0IsRUFBRUMsOEJBQWlCLEVBQUVDLG1DQUFzQixDQUNsRTtNQUNILENBQUMsQ0FBQyxPQUFPeEcsQ0FBQyxFQUFFO1FBQ1YsSUFBSSxDQUFDdEIsR0FBRyxDQUFDc0UsSUFBSSxDQUFFLG9FQUFtRSxJQUMvRWhELENBQUMsQ0FBQ3lHLE1BQU0sSUFBSXpHLENBQUMsQ0FBQzBHLE9BQU8sQ0FBQyxDQUFDO01BQzVCO0lBQ0Y7RUFDRjtFQUVBLE1BQU0vQyxPQUFPQSxDQUFBLEVBQUk7SUFFZixJQUFJLElBQUksQ0FBQzlILElBQUksQ0FBQzhLLHNCQUFzQixFQUFFO01BQ3BDLE1BQU14TSxPQUFPLENBQUN3TSxzQkFBc0IsQ0FDbEMsSUFBSSxDQUFDM0YsR0FBRyxFQUNSN0csT0FBTyxDQUFDeU0sVUFBVSxDQUFDLElBQUksQ0FBQy9LLElBQUksQ0FBQzhLLHNCQUFzQixDQUFDLEVBQ3BELENBQUNMLDJDQUFzQixFQUFFQyw4QkFBaUIsRUFBRUMsbUNBQXNCLENBQUMsQ0FDcEU7SUFDSDtJQUdBLElBQUksSUFBSSxDQUFDM0ssSUFBSSxDQUFDZ0wsU0FBUyxFQUFFO01BQ3ZCLElBQUlBLFNBQVM7TUFDYixJQUFJO1FBQ0ZBLFNBQVMsR0FBRzFNLE9BQU8sQ0FBQ3lNLFVBQVUsQ0FBQyxJQUFJLENBQUMvSyxJQUFJLENBQUNnTCxTQUFTLENBQUM7TUFDckQsQ0FBQyxDQUFDLE9BQU83RyxDQUFDLEVBQUU7UUFDVixJQUFJLENBQUN0QixHQUFHLENBQUN5QyxhQUFhLENBQUUsMkNBQTBDbkIsQ0FBQyxDQUFDMEcsT0FBUSxFQUFDLENBQUM7TUFDaEY7TUFDQUcsU0FBUyxHQUFHLE1BQU1DLGlCQUFDLENBQUNDLEdBQUcsQ0FBQ0YsU0FBUyxDQUM5QkcsR0FBRyxDQUFFNUgsR0FBRyxJQUFLLElBQUksQ0FBQ2pGLE9BQU8sQ0FBQ2tGLFlBQVksQ0FBQ0QsR0FBRyxFQUFFLENBQUNFLHlCQUFhLEVBQUVDLDBCQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDakYsTUFBTXBGLE9BQU8sQ0FBQzhNLGdCQUFnQixDQUFDSixTQUFTLEVBQUUsSUFBSSxDQUFDN0YsR0FBRyxFQUFFLElBQUksQ0FBQ25GLElBQUksQ0FBQztJQUNoRTtJQUVBLElBQUksSUFBSSxDQUFDQSxJQUFJLENBQUN1RCxHQUFHLEVBQUU7TUFDakIsSUFBSSxJQUFJLENBQUN2RCxJQUFJLENBQUNxTCxPQUFPLElBQUksRUFBRSxNQUFNLElBQUksQ0FBQ2xHLEdBQUcsQ0FBQ21HLGNBQWMsQ0FBQyxJQUFJLENBQUN0TCxJQUFJLENBQUNtRCxVQUFVLENBQUMsQ0FBQyxJQUN4RSxDQUFDLElBQUksQ0FBQ25ELElBQUksQ0FBQ3FMLE9BQU8sRUFBRTtRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDckwsSUFBSSxDQUFDdUwsTUFBTSxJQUFJLEVBQUMsTUFBTSxJQUFJLENBQUNwRyxHQUFHLENBQUNxRyxZQUFZLENBQUMsSUFBSSxDQUFDeEwsSUFBSSxDQUFDdUQsR0FBRyxFQUFFLElBQUksQ0FBQ3ZELElBQUksQ0FBQ21ELFVBQVUsRUFBRTtVQUN6RnNJLGtCQUFrQixFQUFFO1FBQ3RCLENBQUMsQ0FBQyxHQUFFO1VBQ0YsTUFBTW5OLE9BQU8sQ0FBQ29OLE9BQU8sQ0FBQyxJQUFJLENBQUN2RyxHQUFHLEVBQUUsSUFBSSxDQUFDbkYsSUFBSSxDQUFDdUQsR0FBRyxDQUFDO1FBQ2hEO1FBQ0EsSUFBSSxDQUFDLElBQUksQ0FBQ3ZELElBQUksQ0FBQzJMLGFBQWEsRUFBRTtVQUM1QixNQUFNLElBQUksQ0FBQ3hHLEdBQUcsQ0FBQ3lHLFlBQVksQ0FBQyxJQUFJLENBQUM1TCxJQUFJLENBQUNtRCxVQUFVLENBQUM7UUFDbkQ7UUFDQSxNQUFNN0UsT0FBTyxDQUFDdU4sVUFBVSxDQUFDLElBQUksQ0FBQzFHLEdBQUcsRUFBRSxJQUFJLENBQUNuRixJQUFJLENBQUM7TUFDL0MsQ0FBQyxNQUFNO1FBQ0wsSUFBSSxDQUFDNkMsR0FBRyxDQUFDaUMsS0FBSyxDQUFDLDRFQUE0RSxDQUFDO01BQzlGO0lBQ0YsQ0FBQyxNQUFNO01BQ0wsSUFBSSxJQUFJLENBQUM5RSxJQUFJLENBQUNzQyxTQUFTLEVBQUU7UUFDdkIsSUFBSSxDQUFDTyxHQUFHLENBQUN5QyxhQUFhLENBQUMsNkVBQTZFLENBQUM7TUFDdkc7TUFDQSxJQUFJLENBQUN6QyxHQUFHLENBQUNpQyxLQUFLLENBQUMseURBQXlELENBQUM7TUFDekUsSUFBSSxJQUFJLENBQUM5RSxJQUFJLENBQUM4TCxTQUFTLElBQUksSUFBSSxDQUFDOUwsSUFBSSxDQUFDbUQsVUFBVSxFQUFFO1FBQy9DLE1BQU03RSxPQUFPLENBQUN5TixRQUFRLENBQUMsSUFBSSxDQUFDNUcsR0FBRyxFQUFFLElBQUksQ0FBQ25GLElBQUksQ0FBQztNQUM3QztJQUNGO0VBQ0Y7RUFFQSxNQUFNb0ksZUFBZUEsQ0FBQSxFQUFJO0lBRXZCLE1BQU00RCxjQUFjLEdBQUcsSUFBSSxDQUFDaE0sSUFBSSxDQUFDZ00sY0FBYyxJQUFJLElBQUksQ0FBQ2hNLElBQUksQ0FBQ21ELFVBQVU7SUFDdkUsTUFBTThJLGVBQWUsR0FBRyxJQUFJLENBQUNqTSxJQUFJLENBQUNpTSxlQUFlLElBQUksSUFBSSxDQUFDak0sSUFBSSxDQUFDb0QsV0FBVztJQUUxRSxJQUFJLENBQUNQLEdBQUcsQ0FBQ0MsSUFBSSxDQUFFLGFBQVksSUFBSSxDQUFDOUMsSUFBSSxDQUFDbUQsVUFBVyxJQUFHLElBQUksQ0FBQ25ELElBQUksQ0FBQ29ELFdBQVksR0FBRSxHQUN4RSxvQkFBbUI0SSxjQUFlLElBQUdDLGVBQWdCLEdBQUUsQ0FBQztJQUUzRCxJQUFJLElBQUksQ0FBQzVLLElBQUksQ0FBQzZLLGVBQWUsRUFBRTtNQUM3QixJQUFJLENBQUNySixHQUFHLENBQUNDLElBQUksQ0FBRSxpQ0FBZ0MsR0FDNUMsaUNBQWdDLElBQUksQ0FBQ3pCLElBQUksQ0FBQzZLLGVBQWdCLE1BQUssQ0FBQztNQUNuRSxNQUFNLElBQUksQ0FBQy9HLEdBQUcsQ0FBQytHLGVBQWUsQ0FBQyxJQUFJLENBQUM3SyxJQUFJLENBQUM2SyxlQUFlLEVBQUVGLGNBQWMsRUFBRUMsZUFBZSxDQUFDO01BQzFGO0lBQ0Y7SUFDQSxJQUFJLElBQUksQ0FBQ2pNLElBQUksQ0FBQ3FMLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQ3JMLElBQUksQ0FBQ21NLGNBQWMsS0FDM0MsTUFBTSxJQUFJLENBQUNoSCxHQUFHLENBQUNpSCxhQUFhLENBQUMsSUFBSSxDQUFDcE0sSUFBSSxDQUFDbUQsVUFBVSxDQUFDLEdBQUU7TUFDekQsSUFBSSxDQUFDTixHQUFHLENBQUNDLElBQUksQ0FBRSxJQUFHLElBQUksQ0FBQzlDLElBQUksQ0FBQ21ELFVBQVcsK0NBQThDLEdBQ2xGLG1HQUFrRyxDQUFDO01BQ3RHO0lBQ0Y7SUFDQSxNQUFNLElBQUksQ0FBQ2dDLEdBQUcsQ0FBQ2tILFFBQVEsQ0FBQztNQUN0QnRKLEdBQUcsRUFBRSxJQUFJLENBQUMvQyxJQUFJLENBQUNtRCxVQUFVO01BQ3pCSCxRQUFRLEVBQUUsSUFBSSxDQUFDaEQsSUFBSSxDQUFDb0QsV0FBVztNQUMvQmtKLE1BQU0sRUFBRSxJQUFJLENBQUN0TSxJQUFJLENBQUN1TSxZQUFZLElBQUksNEJBQTRCO01BQzlEQyxRQUFRLEVBQUUsSUFBSSxDQUFDeE0sSUFBSSxDQUFDeU0sY0FBYyxJQUFJLGtDQUFrQztNQUN4RUMsS0FBSyxFQUFFLElBQUksQ0FBQzFNLElBQUksQ0FBQzJNLFdBQVcsSUFBSSxZQUFZO01BQzVDQyxPQUFPLEVBQUUsSUFBSSxDQUFDNU0sSUFBSSxDQUFDZ00sY0FBYztNQUNqQ2EsWUFBWSxFQUFFLElBQUksQ0FBQzdNLElBQUksQ0FBQ2lNLGVBQWU7TUFDdkNhLGFBQWEsRUFBRSxJQUFJLENBQUM5TSxJQUFJLENBQUMrTSxnQkFBZ0I7TUFDekNDLFlBQVksRUFBRSxJQUFJLENBQUNoTixJQUFJLENBQUNpTixlQUFlO01BQ3ZDQyx1QkFBdUIsRUFBRSxJQUFJLENBQUNsTixJQUFJLENBQUNrTix1QkFBdUI7TUFDMURDLE9BQU8sRUFBRSxJQUFJLENBQUNuTixJQUFJLENBQUNtTSxjQUFjLElBQUksQ0FBQyxJQUFJLENBQUNuTSxJQUFJLENBQUNvTixrQkFBa0I7TUFDbEVDLEtBQUssRUFBRSxJQUFJO01BQ1hDLElBQUksRUFBRSxJQUFJLENBQUN0TixJQUFJLENBQUN1TjtJQUNsQixDQUFDLENBQUM7RUFDSjtFQUVBLE1BQU1uSixhQUFhQSxDQUFBLEVBQUk7SUFDckIsSUFBSSxDQUFDdkIsR0FBRyxDQUFDaUMsS0FBSyxDQUFDLCtCQUErQixDQUFDO0lBRS9DLE1BQU0wSSx3QkFBd0IsR0FBRyxDQUFDLFlBQVk7TUFDNUMsSUFBSSxDQUFDdE0sZUFBQyxDQUFDdU0sT0FBTyxDQUFDLElBQUksQ0FBQ0MsMEJBQTBCLENBQUMsRUFBRTtRQUMvQyxNQUFNLElBQUksQ0FBQ0MsbUJBQW1CLEVBQUU7TUFDbEM7SUFDRixDQUFDLEVBQUUsWUFBWTtNQUNiLElBQUksTUFBTSxJQUFJLENBQUNDLHVDQUF1QyxFQUFFLEVBQUU7UUFDeEQsTUFBTSxJQUFJLENBQUNDLGtDQUFrQyxFQUFFO01BQ2pEO0lBQ0YsQ0FBQyxFQUFFLFlBQVk7TUFDYixJQUFJLENBQUMzTSxlQUFDLENBQUN1TSxPQUFPLENBQUMsSUFBSSxDQUFDSyxxQkFBcUIsQ0FBQyxFQUFFO1FBQzFDLE1BQU0sSUFBSSxDQUFDQyx5QkFBeUIsRUFBRTtNQUN4QztJQUNGLENBQUMsQ0FBQztJQUVGLE1BQU1yUCxtQ0FBYyxDQUFDc1AsaUNBQWlDLENBQUMsSUFBSSxDQUFDQyxNQUFNLEVBQUUsSUFBSSxDQUFDek0sU0FBUyxDQUFDO0lBRW5GLElBQUksSUFBSSxDQUFDbkIsWUFBWSxFQUFFO01BQ3JCLElBQUk7UUFDRixNQUFNLElBQUksQ0FBQzZOLHVCQUF1QixFQUFFO01BQ3RDLENBQUMsQ0FBQyxPQUFPQyxHQUFHLEVBQUU7UUFDWixJQUFJLENBQUN0TCxHQUFHLENBQUNzRSxJQUFJLENBQUUsd0NBQXVDZ0gsR0FBRyxDQUFDdEQsT0FBUSxFQUFDLENBQUM7TUFDdEU7TUFDQSxJQUFJLElBQUksQ0FBQ3ZLLGNBQWMsRUFBRTtRQUN2QixJQUFJO1VBQ0YsTUFBTSxJQUFJLENBQUNELFlBQVksQ0FBQytELGFBQWEsRUFBRTtRQUN6QyxDQUFDLENBQUMsT0FBTytKLEdBQUcsRUFBRTtVQUNaLElBQUksQ0FBQ3RMLEdBQUcsQ0FBQ3NFLElBQUksQ0FBRSxrREFBaURnSCxHQUFHLENBQUN0RCxPQUFRLEVBQUMsQ0FBQztRQUNoRjtNQUNGO01BQ0EsSUFBSSxDQUFDeEssWUFBWSxHQUFHLElBQUk7SUFDMUI7SUFDQSxJQUFJLENBQUNDLGNBQWMsR0FBRyxLQUFLO0lBRTNCLElBQUksSUFBSSxDQUFDNkUsR0FBRyxFQUFFO01BQ1osTUFBTThGLGlCQUFDLENBQUNDLEdBQUcsQ0FBQ3NDLHdCQUF3QixDQUFDckMsR0FBRyxDQUFFaUQsSUFBSSxJQUFLO1FBQ2pELENBQUMsWUFBWTtVQUNYLElBQUk7WUFDRixNQUFNQSxJQUFJLEVBQUU7VUFDZCxDQUFDLENBQUMsT0FBT0MsR0FBRyxFQUFFLENBQUM7UUFDakIsQ0FBQyxHQUFHO01BQ04sQ0FBQyxDQUFDLENBQUM7TUFFSCxJQUFJLElBQUksQ0FBQ2hOLElBQUksQ0FBQzZLLGVBQWUsRUFBRTtRQUM3QixJQUFJLENBQUNySixHQUFHLENBQUNDLElBQUksQ0FBQyxxREFBcUQsQ0FBQztRQUNwRSxNQUFNLElBQUksQ0FBQ3FDLEdBQUcsQ0FBQ21KLGtCQUFrQixFQUFFO1FBRW5DLElBQUksSUFBSSxDQUFDak4sSUFBSSxDQUFDa04sd0JBQXdCLEVBQUU7VUFDdEMsSUFBSSxDQUFDMUwsR0FBRyxDQUFDQyxJQUFJLENBQUUsNkJBQTRCLElBQUksQ0FBQ3pCLElBQUksQ0FBQ2tOLHdCQUF5QixnQ0FBK0IsQ0FBQztVQUM5RyxNQUFNLElBQUksQ0FBQ3BKLEdBQUcsQ0FBQ3FKLFNBQVMsQ0FBQyxJQUFJLENBQUNuTixJQUFJLENBQUNrTix3QkFBd0IsQ0FBQztRQUM5RCxDQUFDLE1BQU07VUFDTCxJQUFJLENBQUMxTCxHQUFHLENBQUNzRSxJQUFJLENBQUMsMkZBQTJGLENBQUM7UUFDNUc7TUFDRjtNQUNBLElBQUksSUFBSSxDQUFDbkgsSUFBSSxDQUFDbUQsVUFBVSxFQUFFO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUNQLGVBQWUsS0FBTSxDQUFDLElBQUksQ0FBQzVDLElBQUksQ0FBQ29OLGtCQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDcE4sSUFBSSxDQUFDcUwsT0FBTyxJQUMxRSxJQUFJLENBQUNyTCxJQUFJLENBQUNxTCxPQUFPLElBQUksSUFBSSxDQUFDckwsSUFBSSxDQUFDeU8sa0JBQW1CLENBQUMsRUFBRTtVQUMzRCxJQUFJO1lBQ0YsTUFBTSxJQUFJLENBQUN0SixHQUFHLENBQUN1SixTQUFTLENBQUMsSUFBSSxDQUFDMU8sSUFBSSxDQUFDbUQsVUFBVSxDQUFDO1VBQ2hELENBQUMsQ0FBQyxPQUFPZ0wsR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDdEwsR0FBRyxDQUFDc0UsSUFBSSxDQUFFLDZCQUE0QmdILEdBQUcsQ0FBQ3RELE9BQVEsRUFBQyxDQUFDO1VBQzNEO1FBQ0Y7UUFDQSxJQUFJLElBQUksQ0FBQzdLLElBQUksQ0FBQ3NDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQ3RDLElBQUksQ0FBQzJMLGFBQWEsRUFBRTtVQUNuRCxJQUFJLENBQUM5SSxHQUFHLENBQUNpQyxLQUFLLENBQUUsdURBQXNELElBQUksQ0FBQzlFLElBQUksQ0FBQ21ELFVBQVcsR0FBRSxDQUFDO1VBQzlGLElBQUk7WUFDRixNQUFNLElBQUksQ0FBQ2dDLEdBQUcsQ0FBQ3lHLFlBQVksQ0FBQyxJQUFJLENBQUM1TCxJQUFJLENBQUNtRCxVQUFVLENBQUM7VUFDbkQsQ0FBQyxDQUFDLE9BQU9nTCxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUN0TCxHQUFHLENBQUNzRSxJQUFJLENBQUUsNEJBQTJCZ0gsR0FBRyxDQUFDdEQsT0FBUSxFQUFDLENBQUM7VUFDMUQ7UUFDRjtNQUNGO01BRUEsSUFBSSxJQUFJLENBQUNoRCwyQkFBMkIsRUFBRTtRQUNwQyxJQUFJLENBQUNoRixHQUFHLENBQUNDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQztRQUNqRCxNQUFNLElBQUksQ0FBQ3FDLEdBQUcsQ0FBQ3lDLGlCQUFpQixDQUFDLElBQUksQ0FBQztNQUN4QztNQUNBLE1BQU0sSUFBSSxDQUFDekMsR0FBRyxDQUFDd0osVUFBVSxFQUFFO01BQzNCLElBQUk7UUFDRixNQUFNLElBQUksQ0FBQ3hJLGlCQUFpQixFQUFFO01BQ2hDLENBQUMsQ0FBQyxPQUFPeUksS0FBSyxFQUFFO1FBQ2QsSUFBSSxDQUFDL0wsR0FBRyxDQUFDc0UsSUFBSSxDQUFFLHlDQUF3Q3lILEtBQUssQ0FBQy9ELE9BQVEsRUFBQyxDQUFDO01BR3pFO01BQ0EsSUFBSTtRQUNGLE1BQU0sSUFBSSxDQUFDdEUsc0JBQXNCLEVBQUU7TUFDckMsQ0FBQyxDQUFDLE9BQU9xSSxLQUFLLEVBQUU7UUFDZCxJQUFJLENBQUMvTCxHQUFHLENBQUNzRSxJQUFJLENBQUUsK0NBQThDeUgsS0FBSyxDQUFDL0QsT0FBUSxFQUFDLENBQUM7TUFHL0U7TUFFQSxJQUFJLE9BQU0sSUFBSSxDQUFDMUYsR0FBRyxDQUFDMEIsV0FBVyxFQUFFLEtBQUksRUFBRSxFQUFFO1FBQ3RDLElBQUksQ0FBQ2hFLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDLGlFQUFpRSxDQUFDO1FBQ2hGLE1BQU0sSUFBSSxDQUFDcUMsR0FBRyxDQUFDMEoseUJBQXlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzdPLElBQUksQ0FBQytHLDBCQUEwQixDQUFDO01BQ2xGO01BRUEsSUFBSSxJQUFJLENBQUMvRyxJQUFJLENBQUNxRCxNQUFNLEVBQUU7UUFDcEIsSUFBSXlMLE9BQU8sR0FBRyxJQUFJLENBQUM5TyxJQUFJLENBQUNvRixHQUFHLENBQUNLLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQzVDLEdBQUcsQ0FBQ2lDLEtBQUssQ0FBRSxxQkFBb0JnSyxPQUFRLEdBQUUsQ0FBQztRQUMvQyxJQUFJO1VBQ0YsTUFBTSxJQUFJLENBQUMzSixHQUFHLENBQUM0SixZQUFZLENBQUNELE9BQU8sQ0FBQztRQUN0QyxDQUFDLENBQUMsT0FBT1gsR0FBRyxFQUFFO1VBQ1osSUFBSSxDQUFDdEwsR0FBRyxDQUFDc0UsSUFBSSxDQUFFLDZCQUE0QmdILEdBQUcsQ0FBQ3RELE9BQVEsRUFBQyxDQUFDO1FBQzNEO01BQ0Y7SUFDRjtJQUNBLElBQUksSUFBSSxDQUFDOUcsV0FBVyxFQUFFO01BQ3BCLElBQUksQ0FBQ2xCLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDLHNCQUFzQixDQUFDO01BQ3JDLElBQUksQ0FBQ2lCLFdBQVcsQ0FBQ2lMLElBQUksRUFBRTtJQUN6QjtJQUNBLE1BQU0sS0FBSyxDQUFDNUssYUFBYSxFQUFFO0VBQzdCO0VBRUEsTUFBTVQsZUFBZUEsQ0FBQSxFQUFJO0lBQ3ZCLElBQUksQ0FBQ2QsR0FBRyxDQUFDaUMsS0FBSyxDQUFDLDBDQUEwQyxDQUFDO0lBQzFELElBQUksRUFBRSxNQUFNbUssV0FBRSxDQUFDQyxNQUFNLENBQUMsSUFBSSxDQUFDbFAsSUFBSSxDQUFDdUQsR0FBRyxDQUFDLENBQUMsRUFBRTtNQUNyQyxJQUFJLENBQUNWLEdBQUcsQ0FBQ3lDLGFBQWEsQ0FBRSw4QkFBNkIsSUFBSSxDQUFDdEYsSUFBSSxDQUFDdUQsR0FBSSxHQUFFLENBQUM7SUFDeEU7RUFDRjtFQUVBLE1BQU0xQyxnQkFBZ0JBLENBQUEsRUFBSSxDQUcxQjtFQUtBLE1BQU1zTyx1QkFBdUJBLENBQUVDLE9BQU8sRUFBRTtJQUN0QyxNQUFNQSxPQUFPLEVBQUU7SUFDZixNQUFNLElBQUksQ0FBQ2pLLEdBQUcsQ0FBQ2tLLE9BQU8sRUFBRTtJQUN4QixNQUFNLElBQUksQ0FBQzNKLGtCQUFrQixFQUFFO0lBQy9CLE1BQU0sSUFBSSxDQUFDVyx1QkFBdUIsRUFBRTtFQUN0QztFQUVBaUosV0FBV0EsQ0FBRTlOLFNBQVMsRUFBRTtJQUN0QixLQUFLLENBQUM4TixXQUFXLENBQUM5TixTQUFTLENBQUM7SUFHNUIsT0FBTyxJQUFJO0VBQ2I7RUFFQStOLFFBQVFBLENBQUUvTixTQUFTLEVBQUU7SUFDbkIsS0FBSyxDQUFDK04sUUFBUSxDQUFDL04sU0FBUyxDQUFDO0lBR3pCLE9BQU8sSUFBSTtFQUNiO0VBRUFnTyxpQkFBaUJBLENBQUVoTyxTQUFTLEVBQUU7SUFDNUIsS0FBSyxDQUFDZ08saUJBQWlCLENBQUNoTyxTQUFTLENBQUM7SUFHbEMsSUFBSTNDLGFBQUksQ0FBQ21JLFFBQVEsQ0FBQyxJQUFJLENBQUNqRyxZQUFZLENBQUMsRUFBRTtNQUVwQyxJQUFJLENBQUNSLGFBQWEsR0FBR2IsZUFBZTtJQUN0QyxDQUFDLE1BQU07TUFDTCxJQUFJLENBQUNhLGFBQWEsR0FBR2YsUUFBUTtJQUMvQjtJQUNBLElBQUksSUFBSSxDQUFDUSxJQUFJLENBQUN5UCxtQkFBbUIsRUFBRTtNQUNqQyxJQUFJLENBQUNsUCxhQUFhLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQ0EsYUFBYSxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUlkLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUM7SUFDakc7SUFFQSxPQUFPLElBQUksQ0FBQ2MsYUFBYTtFQUMzQjtFQUVBLElBQUlxQyxlQUFlQSxDQUFBLEVBQUk7SUFDckIsT0FBT3RFLE9BQU8sQ0FBQ29SLGVBQWUsQ0FBQyxJQUFJLENBQUMxUCxJQUFJLENBQUNrRCxXQUFXLENBQUM7RUFDdkQ7QUFDRjtBQUFDeU0sT0FBQSxDQUFBL1AseUJBQUEsR0FBQUEseUJBQUE7QUFHRCxLQUFLLElBQUksQ0FBQ2dRLEdBQUcsRUFBRTNPLEVBQUUsQ0FBQyxJQUFJQyxlQUFDLENBQUMyTyxPQUFPLENBQUNDLG9DQUFlLENBQUMsRUFBRTtFQUNoRGxRLHlCQUF5QixDQUFDbVEsU0FBUyxDQUFDSCxHQUFHLENBQUMsR0FBRzNPLEVBQUU7QUFDL0M7QUFHQSxLQUFLLElBQUksQ0FBQzJPLEdBQUcsRUFBRTNPLEVBQUUsQ0FBQyxJQUFJQyxlQUFDLENBQUMyTyxPQUFPLENBQUNHLGNBQVEsQ0FBQyxFQUFFO0VBQ3pDcFEseUJBQXlCLENBQUNtUSxTQUFTLENBQUNILEdBQUcsQ0FBQyxHQUFHM08sRUFBRTtBQUMvQztBQUFDLElBQUFnUCxRQUFBLEdBR2NyUSx5QkFBeUI7QUFBQStQLE9BQUEsQ0FBQU8sT0FBQSxHQUFBRCxRQUFBIn0=
|
|
520
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiX3VpYXV0b21hdG9yIiwiX21ldGhvZE1hcCIsIl9zdXBwb3J0IiwiX2FzeW5jYm94IiwiX2JsdWViaXJkIiwiX2luZGV4IiwiX2FwcGl1bUFkYiIsIl9oZWxwZXJzIiwiX2FwcGl1bUFuZHJvaWREcml2ZXIiLCJfZGVzaXJlZENhcHMiLCJfcG9ydHNjYW5uZXIiLCJfb3MiLCJfcGF0aCIsIl9leHRlbnNpb25zIiwiaGVscGVycyIsIk9iamVjdCIsImFzc2lnbiIsInVpYXV0b21hdG9yMkhlbHBlcnMiLCJhbmRyb2lkSGVscGVycyIsIkRFVklDRV9QT1JUX1JBTkdFIiwiREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRCIsInV0aWwiLCJnZXRMb2NrRmlsZUd1YXJkIiwicGF0aCIsInJlc29sdmUiLCJvcyIsInRtcGRpciIsInRpbWVvdXQiLCJ0cnlSZWNvdmVyeSIsIkRFVklDRV9QT1JUIiwiTUpQRUdfU0VSVkVSX0RFVklDRV9QT1JUIiwiTE9DQUxIT1NUX0lQNCIsIk5PX1BST1hZIiwiUmVnRXhwIiwiQ0hST01FX05PX1BST1hZIiwiTUVNT0laRURfRlVOQ1RJT05TIiwiQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlciIsIkJhc2VEcml2ZXIiLCJuZXdNZXRob2RNYXAiLCJjb25zdHJ1Y3RvciIsIm9wdHMiLCJzaG91bGRWYWxpZGF0ZUNhcHMiLCJzaGVsbCIsImxvY2F0b3JTdHJhdGVnaWVzIiwiZGVzaXJlZENhcENvbnN0cmFpbnRzIiwidWlhdXRvbWF0b3IyIiwiandwUHJveHlBY3RpdmUiLCJqd3BQcm94eUF2b2lkIiwiYXBrU3RyaW5ncyIsInNldHRpbmdzIiwiRGV2aWNlU2V0dGluZ3MiLCJpZ25vcmVVbmltcG9ydGFudFZpZXdzIiwiYWxsb3dJbnZpc2libGVFbGVtZW50cyIsIm9uU2V0dGluZ3NVcGRhdGUiLCJiaW5kIiwiY2hyb21lZHJpdmVyIiwic2Vzc2lvbkNocm9tZWRyaXZlcnMiLCJmbiIsIl8iLCJtZW1vaXplIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsImNhcHMiLCJjcmVhdGVTZXNzaW9uIiwiYXJncyIsInNlc3Npb25JZCIsInNlcnZlckRldGFpbHMiLCJwbGF0Zm9ybSIsIndlYlN0b3JhZ2VFbmFibGVkIiwidGFrZXNTY3JlZW5zaG90IiwiamF2YXNjcmlwdEVuYWJsZWQiLCJkYXRhYmFzZUVuYWJsZWQiLCJuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQiLCJsb2NhdGlvbkNvbnRleHRFbmFibGVkIiwid2FybmluZ3MiLCJkZXNpcmVkIiwiY3VyQ29udGV4dCIsImRlZmF1bHRDb250ZXh0TmFtZSIsImRlZmF1bHRPcHRzIiwiZnVsbFJlc2V0IiwiYXV0b0xhdW5jaCIsImFkYlBvcnQiLCJERUZBVUxUX0FEQl9QT1JUIiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiZGVmYXVsdHMiLCJpc0Nocm9tZVNlc3Npb24iLCJsb2ciLCJpbmZvIiwicGtnIiwiYWN0aXZpdHkiLCJnZXRDaHJvbWVQa2ciLCJicm93c2VyTmFtZSIsImFwcFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsInJlYm9vdCIsInNldEF2ZEZyb21DYXBhYmlsaXRpZXMiLCJhcHAiLCJjb25maWd1cmVBcHAiLCJBUEtfRVhURU5TSU9OIiwiQVBLU19FWFRFTlNJT04iLCJjaGVja0FwcFByZXNlbnQiLCJzdGFydFVpQXV0b21hdG9yMlNlc3Npb24iLCJmaWxsRGV2aWNlRGV0YWlscyIsIm1qcGVnU2NyZWVuc2hvdFVybCIsIm1qcGVnU3RyZWFtIiwibWpwZWciLCJNSnBlZ1N0cmVhbSIsInN0YXJ0IiwiZSIsImRlbGV0ZVNlc3Npb24iLCJwaXhlbFJhdGlvIiwiZ2V0RGV2aWNlUGl4ZWxSYXRpbyIsInN0YXRCYXJIZWlnaHQiLCJnZXRTdGF0dXNCYXJIZWlnaHQiLCJ2aWV3cG9ydFJlY3QiLCJnZXRWaWV3UG9ydFJlY3QiLCJkcml2ZXJEYXRhIiwiZ2V0U2Vzc2lvbiIsInNlc3Npb25EYXRhIiwiZGVidWciLCJ1aWEyRGF0YSIsImp3cHJveHkiLCJjb21tYW5kIiwiaXNFbXVsYXRvciIsImFkYiIsImF2ZCIsImRldmljZU5hbWUiLCJlcnJvckFuZFRocm93IiwicGxhdGZvcm1WZXJzaW9uIiwiYXZkRGV2aWNlIiwicmVwbGFjZSIsImFsbG9jYXRlU3lzdGVtUG9ydCIsImZvcndhcmRQb3J0IiwibG9jYWxQb3J0IiwiY2hlY2tQb3J0U3RhdHVzIiwic3lzdGVtUG9ydCIsIl9oYXNTeXN0ZW1Qb3J0SW5DYXBzIiwic3RhcnRQb3J0IiwiZW5kUG9ydCIsImZpbmRBUG9ydE5vdEluVXNlIiwicmVsZWFzZVN5c3RlbVBvcnQiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsImFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0IiwibWpwZWdTZXJ2ZXJQb3J0IiwicmVsZWFzZU1qcGVnU2VydmVyUG9ydCIsInVkaWQiLCJlbVBvcnQiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJjcmVhdGVBREIiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwic2V0SGlkZGVuQXBpUG9saWN5IiwiaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IiLCJoYXNWYWx1ZSIsImdwc0VuYWJsZWQiLCJ0b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyIiwid2FybiIsImFwcEluZm8iLCJnZXRMYXVuY2hJbmZvIiwiY3VyRGV2aWNlSWQiLCJkZXZpY2VVRElEIiwiaW5pdERldmljZSIsImluaXRVaUF1dG9tYXRvcjJTZXJ2ZXIiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwiaXNBbmltYXRpb25PbiIsInNldEFuaW1hdGlvblN0YXRlIiwiX3dhc1dpbmRvd0FuaW1hdGlvbkRpc2FibGVkIiwiaW5pdEFVVCIsInN0YXJ0U2Vzc2lvbiIsImFkZERldmljZUluZm9Ub0NhcHMiLCJza2lwVW5sb2NrIiwidW5sb2NrIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwiZW5zdXJlQXBwU3RhcnRzIiwib3JpZW50YXRpb24iLCJzZXRPcmllbnRhdGlvbiIsImF1dG9XZWJ2aWV3Iiwidmlld05hbWUiLCJkZWZhdWx0V2Vidmlld05hbWUiLCJhdXRvV2Vidmlld1RpbWVvdXQiLCJyZXRyeUludGVydmFsIiwic2V0Q29udGV4dCIsImFwaVZlcnNpb24iLCJtYW51ZmFjdHVyZXIiLCJtb2RlbCIsInJlYWxEaXNwbGF5U2l6ZSIsImRpc3BsYXlEZW5zaXR5IiwibW9iaWxlR2V0RGV2aWNlSW5mbyIsImRldmljZUFwaUxldmVsIiwicGFyc2VJbnQiLCJkZXZpY2VTY3JlZW5TaXplIiwiZGV2aWNlU2NyZWVuRGVuc2l0eSIsImRldmljZU1vZGVsIiwiZGV2aWNlTWFudWZhY3R1cmVyIiwidWlhdXRvbWF0b3IyT3B0cyIsImhvc3QiLCJyZW1vdGVBZGJIb3N0IiwiZGV2aWNlUG9ydCIsImFwayIsInRtcERpciIsImRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlIiwicmVhZFRpbWVvdXQiLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJSZWFkVGltZW91dCIsIlVpQXV0b21hdG9yMlNlcnZlciIsInByb3h5UmVxUmVzIiwicHJveHlDb21tYW5kIiwic2tpcFNlcnZlckluc3RhbGxhdGlvbiIsImluc3RhbGxTZXJ2ZXJBcGsiLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJJbnN0YWxsVGltZW91dCIsImFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCIsIlNFVFRJTkdTX0hFTFBFUl9QS0dfSUQiLCJTRVJWRVJfUEFDS0FHRV9JRCIsIlNFUlZFUl9URVNUX1BBQ0tBR0VfSUQiLCJzdGRlcnIiLCJtZXNzYWdlIiwidW5pbnN0YWxsT3RoZXJQYWNrYWdlcyIsInBhcnNlQXJyYXkiLCJvdGhlckFwcHMiLCJCIiwiYWxsIiwibWFwIiwiaW5zdGFsbE90aGVyQXBrcyIsIm5vUmVzZXQiLCJpc0FwcEluc3RhbGxlZCIsIm5vU2lnbiIsImNoZWNrQXBrQ2VydCIsInJlcXVpcmVEZWZhdWx0Q2VydCIsInNpZ25BcHAiLCJza2lwVW5pbnN0YWxsIiwidW5pbnN0YWxsQXBrIiwiaW5zdGFsbEFwayIsImZhc3RSZXNldCIsInJlc2V0QXBwIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJhbmRyb2lkQ292ZXJhZ2UiLCJmb3JjZUFwcExhdW5jaCIsInByb2Nlc3NFeGlzdHMiLCJzdGFydEFwcCIsImFjdGlvbiIsImludGVudEFjdGlvbiIsImNhdGVnb3J5IiwiaW50ZW50Q2F0ZWdvcnkiLCJmbGFncyIsImludGVudEZsYWdzIiwid2FpdFBrZyIsIndhaXRBY3Rpdml0eSIsIndhaXRGb3JMYXVuY2giLCJhcHBXYWl0Rm9yTGF1bmNoIiwid2FpdER1cmF0aW9uIiwiYXBwV2FpdER1cmF0aW9uIiwib3B0aW9uYWxJbnRlbnRBcmd1bWVudHMiLCJzdG9wQXBwIiwiZG9udFN0b3BBcHBPblJlc2V0IiwicmV0cnkiLCJ1c2VyIiwidXNlclByb2ZpbGUiLCJzY3JlZW5SZWNvcmRpbmdTdG9wVGFza3MiLCJpc0VtcHR5IiwiX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwibW9iaWxlSXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nIiwibW9iaWxlU3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZyIsIl9zY3JlZW5TdHJlYW1pbmdQcm9wcyIsIm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmciLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJzdG9wQ2hyb21lZHJpdmVyUHJveGllcyIsImVyciIsInRhc2siLCJpZ24iLCJlbmRBbmRyb2lkQ292ZXJhZ2UiLCJhbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQiLCJicm9hZGNhc3QiLCJzaG91bGRUZXJtaW5hdGVBcHAiLCJmb3JjZVN0b3AiLCJzdG9wTG9nY2F0IiwiZXJyb3IiLCJzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5IiwiYXZkTmFtZSIsImtpbGxFbXVsYXRvciIsInN0b3AiLCJmcyIsImV4aXN0cyIsIndyYXBCb290c3RyYXBEaXNjb25uZWN0Iiwid3JhcHBlZCIsInJlc3RhcnQiLCJwcm94eUFjdGl2ZSIsImNhblByb3h5IiwiZ2V0UHJveHlBdm9pZExpc3QiLCJuYXRpdmVXZWJTY3JlZW5zaG90IiwiaXNDaHJvbWVCcm93c2VyIiwiZXhwb3J0cyIsImNtZCIsInRvUGFpcnMiLCJhbmRyb2lkQ29tbWFuZHMiLCJwcm90b3R5cGUiLCJjb21tYW5kcyIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9kcml2ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEJhc2VEcml2ZXIsIERldmljZVNldHRpbmdzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQge1xuICBVaUF1dG9tYXRvcjJTZXJ2ZXIsIFNFUlZFUl9QQUNLQUdFX0lELCBTRVJWRVJfVEVTVF9QQUNLQUdFX0lEXG59IGZyb20gJy4vdWlhdXRvbWF0b3IyJztcbmltcG9ydCB7IG5ld01ldGhvZE1hcCB9IGZyb20gJy4vbWV0aG9kLW1hcCc7XG5pbXBvcnQgeyBmcywgdXRpbCwgbWpwZWcgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGNvbW1hbmRzIGZyb20gJy4vY29tbWFuZHMvaW5kZXgnO1xuaW1wb3J0IHsgREVGQVVMVF9BREJfUE9SVCB9IGZyb20gJ2FwcGl1bS1hZGInO1xuaW1wb3J0IHVpYXV0b21hdG9yMkhlbHBlcnMgZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IGFuZHJvaWRIZWxwZXJzLCBhbmRyb2lkQ29tbWFuZHMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIH0gZnJvbSAnYXBwaXVtLWFuZHJvaWQtZHJpdmVyJztcbmltcG9ydCBkZXNpcmVkQ2FwQ29uc3RyYWludHMgZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuaW1wb3J0IHsgZmluZEFQb3J0Tm90SW5Vc2UsIGNoZWNrUG9ydFN0YXR1cyB9IGZyb20gJ3BvcnRzY2FubmVyJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEFQS19FWFRFTlNJT04sIEFQS1NfRVhURU5TSU9OIH0gZnJvbSAnLi9leHRlbnNpb25zJztcblxuXG5jb25zdCBoZWxwZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgdWlhdXRvbWF0b3IySGVscGVycywgYW5kcm9pZEhlbHBlcnMpO1xuXG4vLyBUaGUgcmFuZ2Ugb2YgcG9ydHMgd2UgY2FuIHVzZSBvbiB0aGUgc3lzdGVtIGZvciBjb21tdW5pY2F0aW5nIHRvIHRoZVxuLy8gVWlBdXRvbWF0b3IyIEhUVFAgc2VydmVyIG9uIHRoZSBkZXZpY2VcbmNvbnN0IERFVklDRV9QT1JUX1JBTkdFID0gWzgyMDAsIDgyOTldO1xuXG4vLyBUaGUgZ3VhcmQgaXMgbmVlZGVkIHRvIGF2b2lkIGR5bmFtaWMgc3lzdGVtIHBvcnQgYWxsb2NhdGlvbiBjb25mbGljdHMgZm9yXG4vLyBwYXJhbGxlbCBkcml2ZXIgc2Vzc2lvbnNcbmNvbnN0IERFVklDRV9QT1JUX0FMTE9DQVRJT05fR1VBUkQgPSB1dGlsLmdldExvY2tGaWxlR3VhcmQoXG4gIHBhdGgucmVzb2x2ZShvcy50bXBkaXIoKSwgJ3VpYTJfZGV2aWNlX3BvcnRfZ3VhcmQnKSxcbiAge3RpbWVvdXQ6IDI1LCB0cnlSZWNvdmVyeTogdHJ1ZX1cbik7XG5cbi8vIFRoaXMgaXMgdGhlIHBvcnQgdGhhdCBVaUF1dG9tYXRvcjIgbGlzdGVucyB0byBvbiB0aGUgZGV2aWNlLiBXZSB3aWxsIGZvcndhcmRcbi8vIG9uZSBvZiB0aGUgcG9ydHMgYWJvdmUgb24gdGhlIHN5c3RlbSB0byB0aGlzIHBvcnQgb24gdGhlIGRldmljZS5cbmNvbnN0IERFVklDRV9QT1JUID0gNjc5MDtcbi8vIFRoaXMgaXMgdGhlIHBvcnQgdGhhdCB0aGUgVWlBdXRvbWF0b3IyIE1KUEVHIHNlcnZlciBsaXN0ZW5zIHRvIG9uIHRoZSBkZXZpY2UuXG4vLyBXZSB3aWxsIGZvcndhcmQgb25lIG9mIHRoZSBwb3J0cyBhYm92ZSBvbiB0aGUgc3lzdGVtIHRvIHRoaXMgcG9ydCBvbiB0aGVcbi8vIGRldmljZS5cbmNvbnN0IE1KUEVHX1NFUlZFUl9ERVZJQ0VfUE9SVCA9IDc4MTA7XG5cbmNvbnN0IExPQ0FMSE9TVF9JUDQgPSAnMTI3LjAuMC4xJztcblxuLy8gTk9fUFJPWFkgY29udGFpbnMgdGhlIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBVaUF1dG9tYXRvcjIgc2VydmVyLlxuLy8gVE9ETzogIEFkZCB0aGUgbGlzdCBvZiBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gVWlBdXRvbWF0b3IyIHNlcnZlci5cbi8vIFRPRE86IE5lZWQgdG8gc2VncmVnYXRlIHRoZSBwYXRocyBiZXR0ZXIgd2F5IHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMgd2hlcmV2ZXIgYXBwbGljYWJsZS5cbi8vIChOb3Qgc2VncmVnYXRpbmcgcmlnaHQgYXdheSBiZWNhdXNlIG1vcmUgcGF0aHMgdG8gYmUgYWRkZWQgaW4gdGhlIE5PX1BST1hZIGxpc3QpXG5jb25zdCBOT19QUk9YWSA9IFtcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vKD8hLiovKScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYWxlcnRfW14vXSsnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FsZXJ0L1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vW14vXSsvY3VycmVudF9hY3Rpdml0eScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL1teL10rL2N1cnJlbnRfcGFja2FnZScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0cycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9hdHRyaWJ1dGUnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvZGlzcGxheWVkJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL2VuYWJsZWQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvbG9jYXRpb25faW5fdmlldycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9uYW1lJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL3NjcmVlbnNob3QnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvc2VsZWN0ZWQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2ltZS9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9jYXRpb24nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2NyZWVuc2hvdCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdGltZW91dHMnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3VybCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL1teL10rX2FsZXJ0JCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FjdGlvbnMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hbGVydC9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcC9bXi9dJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL1teL10rL3N0YXJ0X2FjdGl2aXR5JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9jb21wYXJlX2ltYWdlcycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvKD8hc2V0X2NsaXBib2FyZClbXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9lbGVtZW50L1teL10rL3JlcGxhY2VfdmFsdWUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZWxlbWVudC9bXi9dKy92YWx1ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9nZXRQZXJmb3JtYW5jZURhdGEnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vcGVyZm9ybWFuY2VEYXRhL3R5cGVzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2V4ZWN1dGVfZHJpdmVyJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3N0YXJ0X3JlY29yZGluZ19zY3JlZW4nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc3RvcF9yZWNvcmRpbmdfc2NyZWVuJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtLy4qZXZlbnQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2ltZS9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2tleXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2NhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RpbWVvdXRzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvbXVsdGkvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL3BlcmZvcm0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy91cmwnKV0sXG5cbiAgLy8gTUpTT05XUCBjb21tYW5kc1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cvdHlwZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZV9hc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZycpXSxcbiAgLy8gVzNDIGNvbW1hbmRzXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nL3R5cGVzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy93aW5kb3cvcmVjdCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvYXN5bmMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL3N5bmMnKV0sXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZycpXSxcbl07XG5cbi8vIFRoaXMgaXMgYSBzZXQgb2YgbWV0aG9kcyBhbmQgcGF0aHMgdGhhdCB3ZSBuZXZlciB3YW50IHRvIHByb3h5IHRvIENocm9tZWRyaXZlci5cbmNvbnN0IENIUk9NRV9OT19QUk9YWSA9IFtcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL3JlY3QnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvbXVsdGkvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL3BlcmZvcm0nKV0sXG5cbiAgLy8gdGhpcyBpcyBuZWVkZWQgdG8gbWFrZSB0aGUgbW9iaWxlOiBjb21tYW5kcyB3b3JraW5nIGluIHdlYiBjb250ZXh0XG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcblxuICAvLyBNSlNPTldQIGNvbW1hbmRzXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZy90eXBlcyQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2ckJyldLFxuICAvLyBXM0MgY29tbWFuZHNcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2cvdHlwZXMkJyldLFxuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2ckJyldLFxuXTtcblxuY29uc3QgTUVNT0laRURfRlVOQ1RJT05TID0gW1xuICAnZ2V0U3RhdHVzQmFySGVpZ2h0JyxcbiAgJ2dldERldmljZVBpeGVsUmF0aW8nLFxuXTtcblxuY2xhc3MgQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlciBleHRlbmRzIEJhc2VEcml2ZXIge1xuXG4gIHN0YXRpYyBuZXdNZXRob2RNYXAgPSBuZXdNZXRob2RNYXA7XG5cbiAgY29uc3RydWN0b3IgKG9wdHMgPSB7fSwgc2hvdWxkVmFsaWRhdGVDYXBzID0gdHJ1ZSkge1xuICAgIC8vIGBzaGVsbGAgb3ZlcndyaXRlcyBhZGIuc2hlbGwsIHNvIHJlbW92ZVxuICAgIGRlbGV0ZSBvcHRzLnNoZWxsO1xuXG4gICAgc3VwZXIob3B0cywgc2hvdWxkVmFsaWRhdGVDYXBzKTtcbiAgICB0aGlzLmxvY2F0b3JTdHJhdGVnaWVzID0gW1xuICAgICAgJ3hwYXRoJyxcbiAgICAgICdpZCcsXG4gICAgICAnY2xhc3MgbmFtZScsXG4gICAgICAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgICAnY3NzIHNlbGVjdG9yJyxcbiAgICAgICctYW5kcm9pZCB1aWF1dG9tYXRvcidcbiAgICBdO1xuICAgIHRoaXMuZGVzaXJlZENhcENvbnN0cmFpbnRzID0gZGVzaXJlZENhcENvbnN0cmFpbnRzO1xuICAgIHRoaXMudWlhdXRvbWF0b3IyID0gbnVsbDtcbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gTk9fUFJPWFk7XG4gICAgdGhpcy5hcGtTdHJpbmdzID0ge307IC8vIG1hcCBvZiBsYW5ndWFnZSAtPiBzdHJpbmdzIG9ialxuXG4gICAgdGhpcy5zZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncyh7aWdub3JlVW5pbXBvcnRhbnRWaWV3czogZmFsc2UsIGFsbG93SW52aXNpYmxlRWxlbWVudHM6IGZhbHNlfSxcbiAgICAgICAgdGhpcy5vblNldHRpbmdzVXBkYXRlLmJpbmQodGhpcykpO1xuICAgIC8vIGhhbmRsZSB3ZWJ2aWV3IG1lY2hhbmljcyBmcm9tIEFuZHJvaWREcml2ZXJcbiAgICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gICAgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVycyA9IHt9O1xuXG4gICAgLy8gbWVtb2l6ZSBmdW5jdGlvbnMgaGVyZSwgc28gdGhhdCB0aGV5IGFyZSBkb25lIG9uIGEgcGVyLWluc3RhbmNlIGJhc2lzXG4gICAgZm9yIChjb25zdCBmbiBvZiBNRU1PSVpFRF9GVU5DVElPTlMpIHtcbiAgICAgIHRoaXNbZm5dID0gXy5tZW1vaXplKHRoaXNbZm5dKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gICAgcmV0dXJuIHN1cGVyLnZhbGlkYXRlRGVzaXJlZENhcHMoY2FwcykgJiYgYW5kcm9pZEhlbHBlcnMudmFsaWRhdGVEZXNpcmVkQ2FwcyhjYXBzKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKC4uLmFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVE9ETyBoYW5kbGUgb3RoZXJTZXNzaW9uRGF0YSBmb3IgbXVsdGlwbGUgc2Vzc2lvbnNcbiAgICAgIGxldCBbc2Vzc2lvbklkLCBjYXBzXSA9IGF3YWl0IHN1cGVyLmNyZWF0ZVNlc3Npb24oLi4uYXJncyk7XG5cbiAgICAgIGxldCBzZXJ2ZXJEZXRhaWxzID0ge1xuICAgICAgICBwbGF0Zm9ybTogJ0xJTlVYJyxcbiAgICAgICAgd2ViU3RvcmFnZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0YWtlc1NjcmVlbnNob3Q6IHRydWUsXG4gICAgICAgIGphdmFzY3JpcHRFbmFibGVkOiB0cnVlLFxuICAgICAgICBkYXRhYmFzZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxvY2F0aW9uQ29udGV4dEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB3YXJuaW5nczoge30sXG4gICAgICAgIGRlc2lyZWQ6IHRoaXMuY2FwcyxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FwcyA9IE9iamVjdC5hc3NpZ24oc2VydmVyRGV0YWlscywgdGhpcy5jYXBzKTtcblxuICAgICAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5kZWZhdWx0Q29udGV4dE5hbWUoKTtcblxuICAgICAgbGV0IGRlZmF1bHRPcHRzID0ge1xuICAgICAgICBmdWxsUmVzZXQ6IGZhbHNlLFxuICAgICAgICBhdXRvTGF1bmNoOiB0cnVlLFxuICAgICAgICBhZGJQb3J0OiBERUZBVUxUX0FEQl9QT1JULFxuICAgICAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQ6IDkwMDAwXG4gICAgICB9O1xuICAgICAgXy5kZWZhdWx0cyh0aGlzLm9wdHMsIGRlZmF1bHRPcHRzKTtcblxuICAgICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oXCJXZSdyZSBnb2luZyB0byBydW4gYSBDaHJvbWUtYmFzZWQgc2Vzc2lvblwiKTtcbiAgICAgICAgbGV0IHtwa2csIGFjdGl2aXR5fSA9IGhlbHBlcnMuZ2V0Q2hyb21lUGtnKHRoaXMub3B0cy5icm93c2VyTmFtZSk7XG4gICAgICAgIHRoaXMub3B0cy5hcHBQYWNrYWdlID0gdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBwa2c7XG4gICAgICAgIHRoaXMub3B0cy5hcHBBY3Rpdml0eSA9IHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSA9IGFjdGl2aXR5O1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBDaHJvbWUtdHlwZSBwYWNrYWdlIGFuZCBhY3Rpdml0eSBhcmUgJHtwa2d9IGFuZCAke2FjdGl2aXR5fWApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLnJlYm9vdCkge1xuICAgICAgICB0aGlzLnNldEF2ZEZyb21DYXBhYmlsaXRpZXMoY2Fwcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdHMuYXBwKSB7XG4gICAgICAgIC8vIGZpbmQgYW5kIGNvcHksIG9yIGRvd25sb2FkIGFuZCB1bnppcCBhbiBhcHAgdXJsIG9yIHBhdGhcbiAgICAgICAgdGhpcy5vcHRzLmFwcCA9IGF3YWl0IHRoaXMuaGVscGVycy5jb25maWd1cmVBcHAodGhpcy5vcHRzLmFwcCwgW0FQS19FWFRFTlNJT04sIEFQS1NfRVhURU5TSU9OXSk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBQcmVzZW50KCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICAgIC8vIHRoZSBhcHAgaXNuJ3QgYW4gYWN0dWFsIGFwcCBmaWxlIGJ1dCByYXRoZXIgc29tZXRoaW5nIHdlIHdhbnQgdG9cbiAgICAgICAgLy8gYXNzdW1lIGlzIG9uIHRoZSBkZXZpY2UgYW5kIGp1c3QgbGF1bmNoIHZpYSB0aGUgYXBwUGFja2FnZVxuICAgICAgICB0aGlzLmxvZy5pbmZvKGBTdGFydGluZyAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nIGRpcmVjdGx5IG9uIHRoZSBkZXZpY2VgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYE5laXRoZXIgJ2FwcCcgbm9yICdhcHBQYWNrYWdlJyB3YXMgc2V0LiBTdGFydGluZyBVaUF1dG9tYXRvcjIgYCArXG4gICAgICAgICAgJ3dpdGhvdXQgdGhlIHRhcmdldCBhcHBsaWNhdGlvbicpO1xuICAgICAgfVxuICAgICAgdGhpcy5vcHRzLmFkYlBvcnQgPSB0aGlzLm9wdHMuYWRiUG9ydCB8fCBERUZBVUxUX0FEQl9QT1JUO1xuXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0VWlBdXRvbWF0b3IyU2Vzc2lvbigpO1xuICAgICAgYXdhaXQgdGhpcy5maWxsRGV2aWNlRGV0YWlscygpO1xuICAgICAgaWYgKHRoaXMub3B0cy5tanBlZ1NjcmVlbnNob3RVcmwpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3RhcnRpbmcgTUpQRUcgc3RyZWFtIHJlYWRpbmcgVVJMOiAnJHt0aGlzLm9wdHMubWpwZWdTY3JlZW5zaG90VXJsfSdgKTtcbiAgICAgICAgdGhpcy5tanBlZ1N0cmVhbSA9IG5ldyBtanBlZy5NSnBlZ1N0cmVhbSh0aGlzLm9wdHMubWpwZWdTY3JlZW5zaG90VXJsKTtcbiAgICAgICAgYXdhaXQgdGhpcy5tanBlZ1N0cmVhbS5zdGFydCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtzZXNzaW9uSWQsIHRoaXMuY2Fwc107XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZpbGxEZXZpY2VEZXRhaWxzICgpIHtcbiAgICB0aGlzLmNhcHMucGl4ZWxSYXRpbyA9IGF3YWl0IHRoaXMuZ2V0RGV2aWNlUGl4ZWxSYXRpbygpO1xuICAgIHRoaXMuY2Fwcy5zdGF0QmFySGVpZ2h0ID0gYXdhaXQgdGhpcy5nZXRTdGF0dXNCYXJIZWlnaHQoKTtcbiAgICB0aGlzLmNhcHMudmlld3BvcnRSZWN0ID0gYXdhaXQgdGhpcy5nZXRWaWV3UG9ydFJlY3QoKTtcbiAgfVxuXG4gIGdldCBkcml2ZXJEYXRhICgpIHtcbiAgICAvLyBUT0RPIGZpbGwgb3V0IHJlc291cmNlIGluZm8gaGVyZVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGFzeW5jIGdldFNlc3Npb24gKCkge1xuICAgIGxldCBzZXNzaW9uRGF0YSA9IGF3YWl0IHN1cGVyLmdldFNlc3Npb24oKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnR2V0dGluZyBzZXNzaW9uIGRldGFpbHMgZnJvbSBzZXJ2ZXIgdG8gbWl4IGluJyk7XG4gICAgbGV0IHVpYTJEYXRhID0gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvJywgJ0dFVCcsIHt9KTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc2Vzc2lvbkRhdGEsIHVpYTJEYXRhKTtcbiAgfVxuXG4gIGlzRW11bGF0b3IgKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzRW11bGF0b3IodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gIH1cblxuICBzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIChjYXBzKSB7XG4gICAgaWYgKHRoaXMub3B0cy5hdmQpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ2F2ZCBuYW1lIGRlZmluZWQsIGlnbm9yaW5nIGRldmljZSBuYW1lIGFuZCBwbGF0Zm9ybSB2ZXJzaW9uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY2Fwcy5kZXZpY2VOYW1lKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBkZXZpY2VOYW1lIHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiByZWJvb3Qgb3B0aW9uIGlzIGVuYWJsZXMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghY2Fwcy5wbGF0Zm9ybVZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnYXZkIG9yIHBsYXRmb3JtVmVyc2lvbiBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVkJyk7XG4gICAgICB9XG4gICAgICBsZXQgYXZkRGV2aWNlID0gY2Fwcy5kZXZpY2VOYW1lLnJlcGxhY2UoL1teYS16QS1aMC05Xy5dL2csICctJyk7XG4gICAgICB0aGlzLm9wdHMuYXZkID0gYCR7YXZkRGV2aWNlfV9fJHtjYXBzLnBsYXRmb3JtVmVyc2lvbn1gO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFsbG9jYXRlU3lzdGVtUG9ydCAoKSB7XG4gICAgY29uc3QgZm9yd2FyZFBvcnQgPSBhc3luYyAobG9jYWxQb3J0KSA9PiB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgRm9yd2FyZGluZyBVaUF1dG9tYXRvcjIgU2VydmVyIHBvcnQgJHtERVZJQ0VfUE9SVH0gdG8gbG9jYWwgcG9ydCAke2xvY2FsUG9ydH1gKTtcbiAgICAgIGlmICgoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKGxvY2FsUG9ydCwgTE9DQUxIT1NUX0lQNCkpID09PSAnb3BlbicpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVWlBdXRvbWF0b3IyIFNlcnZlciBjYW5ub3Qgc3RhcnQgYmVjYXVzZSB0aGUgbG9jYWwgcG9ydCAjJHtsb2NhbFBvcnR9IGlzIGJ1c3kuIGAgK1xuICAgICAgICAgIGBNYWtlIHN1cmUgdGhlIHBvcnQgeW91IHByb3ZpZGUgdmlhICdzeXN0ZW1Qb3J0JyBjYXBhYmlsaXR5IGlzIG5vdCBvY2N1cGllZC4gYCArXG4gICAgICAgICAgYFRoaXMgc2l0dWF0aW9uIG1pZ2h0IG9mdGVuIGJlIGEgcmVzdWx0IG9mIGFuIGluYWNjdXJhdGUgc2Vzc2lvbnMgbWFuYWdlbWVudCwgZS5nLiBgICtcbiAgICAgICAgICBgb2xkIGF1dG9tYXRpb24gc2Vzc2lvbnMgb24gdGhlIHNhbWUgZGV2aWNlIG11c3QgYWx3YXlzIGJlIGNsb3NlZCBiZWZvcmUgc3RhcnRpbmcgbmV3IG9uZXMuYCk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYi5mb3J3YXJkUG9ydChsb2NhbFBvcnQsIERFVklDRV9QT1JUKTtcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMub3B0cy5zeXN0ZW1Qb3J0KSB7XG4gICAgICB0aGlzLl9oYXNTeXN0ZW1Qb3J0SW5DYXBzID0gdHJ1ZTtcbiAgICAgIHJldHVybiBhd2FpdCBmb3J3YXJkUG9ydCh0aGlzLm9wdHMuc3lzdGVtUG9ydCk7XG4gICAgfVxuXG4gICAgYXdhaXQgREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBbc3RhcnRQb3J0LCBlbmRQb3J0XSA9IERFVklDRV9QT1JUX1JBTkdFO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5vcHRzLnN5c3RlbVBvcnQgPSBhd2FpdCBmaW5kQVBvcnROb3RJblVzZShzdGFydFBvcnQsIGVuZFBvcnQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KFxuICAgICAgICAgIGBDYW5ub3QgZmluZCBhbnkgZnJlZSBwb3J0IGluIHJhbmdlICR7c3RhcnRQb3J0fS4uJHtlbmRQb3J0fX0uIGAgK1xuICAgICAgICAgIGBQbGVhc2Ugc2V0IHRoZSBhdmFpbGFibGUgcG9ydCBudW1iZXIgYnkgcHJvdmlkaW5nIHRoZSBzeXN0ZW1Qb3J0IGNhcGFiaWxpdHkgb3IgYCArXG4gICAgICAgICAgYGRvdWJsZSBjaGVjayB0aGUgcHJvY2Vzc2VzIHRoYXQgYXJlIGxvY2tpbmcgcG9ydHMgd2l0aGluIHRoaXMgcmFuZ2UgYW5kIHRlcm1pbmF0ZSBgICtcbiAgICAgICAgICBgdGhlc2Ugd2hpY2ggYXJlIG5vdCBuZWVkZWQgYW55bW9yZWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgZm9yd2FyZFBvcnQodGhpcy5vcHRzLnN5c3RlbVBvcnQpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcmVsZWFzZVN5c3RlbVBvcnQgKCkge1xuICAgIGlmICghdGhpcy5vcHRzLnN5c3RlbVBvcnQgfHwgIXRoaXMuYWRiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2hhc1N5c3RlbVBvcnRJbkNhcHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnJlbW92ZVBvcnRGb3J3YXJkKHRoaXMub3B0cy5zeXN0ZW1Qb3J0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRChhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmFkYi5yZW1vdmVQb3J0Rm9yd2FyZCh0aGlzLm9wdHMuc3lzdGVtUG9ydCkpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0ICgpIHtcbiAgICBpZiAodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yd2FyZFBvcnQodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCwgTUpQRUdfU0VSVkVSX0RFVklDRV9QT1JUKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyByZWxlYXNlTWpwZWdTZXJ2ZXJQb3J0ICgpIHtcbiAgICBpZiAodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIucmVtb3ZlUG9ydEZvcndhcmQodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRVaUF1dG9tYXRvcjJTZXNzaW9uICgpIHtcbiAgICAvLyBnZXQgZGV2aWNlIHVkaWQgZm9yIHRoaXMgc2Vzc2lvblxuICAgIGxldCB7dWRpZCwgZW1Qb3J0fSA9IGF3YWl0IGhlbHBlcnMuZ2V0RGV2aWNlSW5mb0Zyb21DYXBzKHRoaXMub3B0cyk7XG4gICAgdGhpcy5vcHRzLnVkaWQgPSB1ZGlkO1xuICAgIHRoaXMub3B0cy5lbVBvcnQgPSBlbVBvcnQ7XG5cbiAgICAvLyBub3cgdGhhdCB3ZSBrbm93IG91ciBqYXZhIHZlcnNpb24gYW5kIGRldmljZSBpbmZvLCB3ZSBjYW4gY3JlYXRlIG91clxuICAgIC8vIEFEQiBpbnN0YW5jZVxuICAgIHRoaXMuYWRiID0gYXdhaXQgYW5kcm9pZEhlbHBlcnMuY3JlYXRlQURCKHRoaXMub3B0cyk7XG5cbiAgICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG5cbiAgICBpZiAoYXBpTGV2ZWwgPCAyMSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnVUlBdXRvbWF0b3IyIGlzIG9ubHkgc3VwcG9ydGVkIHNpbmNlIEFuZHJvaWQgNS4wIChMb2xsaXBvcCkuICcgK1xuICAgICAgICAnWW91IGNvdWxkIHN0aWxsIHVzZSBvdGhlciBzdXBwb3J0ZWQgYmFja2VuZHMgaW4gb3JkZXIgdG8gYXV0b21hdGUgb2xkZXIgQW5kcm9pZCB2ZXJzaW9ucy4nKTtcbiAgICB9XG5cbiAgICBpZiAoYXBpTGV2ZWwgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICB0aGlzLmxvZy5pbmZvKCdSZWxheGluZyBoaWRkZW4gYXBpIHBvbGljeScpO1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0SGlkZGVuQXBpUG9saWN5KCcxJywgISF0aGlzLm9wdHMuaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIHdlIGhhdmUgdG8gZW5hYmxlL2Rpc2FibGUgZ3BzIGJlZm9yZSBydW5uaW5nIHRoZSBhcHBsaWNhdGlvblxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMub3B0cy5ncHNFbmFibGVkKSkge1xuICAgICAgaWYgKHRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYFRyeWluZyB0byAke3RoaXMub3B0cy5ncHNFbmFibGVkID8gJ2VuYWJsZScgOiAnZGlzYWJsZSd9IGdwcyBsb2NhdGlvbiBwcm92aWRlcmApO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi50b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyKHRoaXMub3B0cy5ncHNFbmFibGVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFNvcnJ5ISAnZ3BzRW5hYmxlZCcgY2FwYWJpbGl0eSBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFwcFBhY2thZ2UgZXQgYWwgZnJvbSBtYW5pZmVzdCBpZiBuZWNlc3NhcnlcbiAgICBjb25zdCBhcHBJbmZvID0gYXdhaXQgaGVscGVycy5nZXRMYXVuY2hJbmZvKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIC8vIGFuZCBnZXQgaXQgb250byBvdXIgJ29wdHMnIG9iamVjdCBzbyB3ZSB1c2UgaXQgZnJvbSBub3cgb25cbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0cywgYXBwSW5mbyB8fCB7fSk7XG5cbiAgICAvLyBzZXQgYWN0dWFsIGRldmljZSBuYW1lLCB1ZGlkLCBwbGF0Zm9ybSB2ZXJzaW9uLCBzY3JlZW4gc2l6ZSwgc2NyZWVuIGRlbnNpdHksIG1vZGVsIGFuZCBtYW51ZmFjdHVyZXIgZGV0YWlsc1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VOYW1lID0gdGhpcy5hZGIuY3VyRGV2aWNlSWQ7XG4gICAgdGhpcy5jYXBzLmRldmljZVVESUQgPSB0aGlzLm9wdHMudWRpZDtcblxuICAgIC8vIHN0YXJ0IGFuIGF2ZCwgc2V0IHRoZSBsYW5ndWFnZS9sb2NhbGUsIHBpY2sgYW4gZW11bGF0b3IsIGV0Yy4uLlxuICAgIC8vIFRPRE8gd2l0aCBtdWx0aXBsZSBkZXZpY2VzIHdlJ2xsIG5lZWQgdG8gcGFyYW1ldGVyaXplIHRoaXNcbiAgICBhd2FpdCBoZWxwZXJzLmluaXREZXZpY2UodGhpcy5hZGIsIHRoaXMub3B0cyk7XG5cbiAgICAvLyBQcmVwYXJlIHRoZSBkZXZpY2UgYnkgZm9yd2FyZGluZyB0aGUgVWlBdXRvbWF0b3IyIHBvcnRcbiAgICAvLyBUaGlzIGNhbGwgbXV0YXRlcyB0aGlzLm9wdHMuc3lzdGVtUG9ydCBpZiBpdCBpcyBub3Qgc2V0IGV4cGxpY2l0bHlcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlU3lzdGVtUG9ydCgpO1xuXG4gICAgLy8gUHJlcGFyZSB0aGUgZGV2aWNlIGJ5IGZvcndhcmRpbmcgdGhlIFVpQXV0b21hdG9yMiBNSlBFRyBzZXJ2ZXIgcG9ydCAoaWZcbiAgICAvLyBhcHBsaWNhYmxlKVxuICAgIGF3YWl0IHRoaXMuYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQoKTtcblxuICAgIC8vIHNldCB1cCB0aGUgbW9kaWZpZWQgVWlBdXRvbWF0b3IyIHNlcnZlciBldGNcbiAgICBhd2FpdCB0aGlzLmluaXRVaUF1dG9tYXRvcjJTZXJ2ZXIoKTtcblxuICAgIC8vIFNob3VsZCBiZSBhZnRlciBpbnN0YWxsaW5nIGlvLmFwcGl1bS5zZXR0aW5ncyBpbiBoZWxwZXJzLmluaXREZXZpY2VcbiAgICBpZiAodGhpcy5vcHRzLmRpc2FibGVXaW5kb3dBbmltYXRpb24gJiYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCAyNikpIHsgLy8gQVBJIGxldmVsIDI2IGlzIEFuZHJvaWQgOC4wLlxuICAgICAgLy8gR3JhbnRpbmcgYW5kcm9pZC5wZXJtaXNzaW9uLlNFVF9BTklNQVRJT05fU0NBTEUgaXMgbmVjZXNzYXJ5IHRvIGhhbmRsZSBhbmltYXRpb25zIHVuZGVyIEFQSSBsZXZlbCAyNlxuICAgICAgLy8gUmVhZCBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9wdWxsLzExNjQwI2lzc3VlY29tbWVudC00MzgyNjA0NzdcbiAgICAgIC8vIGAtLW5vLXdpbmRvdy1hbmltYXRpb25gIHdvcmtzIG92ZXIgQW5kcm9pZCA4IHRvIGRpc2FibGUgYWxsIG9mIGFuaW1hdGlvbnNcbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5pc0FuaW1hdGlvbk9uKCkpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnRGlzYWJsaW5nIGFuaW1hdGlvbiB2aWEgaW8uYXBwaXVtLnNldHRpbmdzJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnV2luZG93IGFuaW1hdGlvbiBpcyBhbHJlYWR5IGRpc2FibGVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2V0IHVwIGFwcCB1bmRlciB0ZXN0XG4gICAgLy8gcHJlcGFyZSBvdXIgYWN0dWFsIEFVVCwgZ2V0IGl0IG9uIHRoZSBkZXZpY2UsIGV0Yy4uLlxuICAgIGF3YWl0IHRoaXMuaW5pdEFVVCgpO1xuXG4gICAgLy8gQWRkaW5nIEFVVCBwYWNrYWdlIG5hbWUgaW4gdGhlIGNhcGFiaWxpdGllcyBpZiBwYWNrYWdlIG5hbWUgbm90IGV4aXN0IGluIGNhcHNcbiAgICBpZiAoIXRoaXMuY2Fwcy5hcHBQYWNrYWdlICYmIGFwcEluZm8pIHtcbiAgICAgIHRoaXMuY2Fwcy5hcHBQYWNrYWdlID0gYXBwSW5mby5hcHBQYWNrYWdlO1xuICAgIH1cblxuICAgIC8vIGxhdW5jaCBVaUF1dG9tYXRvcjIgYW5kIHdhaXQgdGlsbCBpdHMgb25saW5lIGFuZCB3ZSBoYXZlIGEgc2Vzc2lvblxuICAgIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLnN0YXJ0U2Vzc2lvbih0aGlzLmNhcHMpO1xuXG4gICAgYXdhaXQgdGhpcy5hZGREZXZpY2VJbmZvVG9DYXBzKCk7XG5cbiAgICAvLyBVbmxvY2sgdGhlIGRldmljZSBhZnRlciB0aGUgc2Vzc2lvbiBpcyBzdGFydGVkLlxuICAgIGlmICghdGhpcy5vcHRzLnNraXBVbmxvY2spIHtcbiAgICAgIC8vIHVubG9jayB0aGUgZGV2aWNlIHRvIHByZXBhcmUgaXQgZm9yIHRlc3RpbmdcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5sb2NrKHRoaXMsIHRoaXMuYWRiLCB0aGlzLmNhcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgJ3NraXBVbmxvY2snIGNhcGFiaWxpdHkgc2V0LCBzbyBza2lwcGluZyBkZXZpY2UgdW5sb2NrYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7IC8vIHN0YXJ0IGEgY2hyb21lZHJpdmVyIHNlc3Npb25cbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRDaHJvbWVTZXNzaW9uKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRzLmF1dG9MYXVuY2ggJiYgdGhpcy5vcHRzLmFwcFBhY2thZ2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQXBwU3RhcnRzKCk7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIGluaXRpYWwgb3JpZW50YXRpb24gaXMgcmVxdWVzdGVkLCBzZXQgaXRcbiAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMub3JpZW50YXRpb24pKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBpbml0aWFsIG9yaWVudGF0aW9uIHRvICcke3RoaXMub3B0cy5vcmllbnRhdGlvbn0nYCk7XG4gICAgICBhd2FpdCB0aGlzLnNldE9yaWVudGF0aW9uKHRoaXMub3B0cy5vcmllbnRhdGlvbik7XG4gICAgfVxuXG4gICAgLy8gaWYgd2Ugd2FudCB0byBpbW1lZGlhdGVseSBnZXQgaW50byBhIHdlYnZpZXcsIHNldCBvdXIgY29udGV4dFxuICAgIC8vIGFwcHJvcHJpYXRlbHlcbiAgICBpZiAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3KSB7XG4gICAgICBjb25zdCB2aWV3TmFtZSA9IHRoaXMuZGVmYXVsdFdlYnZpZXdOYW1lKCk7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5vcHRzLmF1dG9XZWJ2aWV3VGltZW91dCB8fCAyMDAwO1xuICAgICAgdGhpcy5sb2cuaW5mbyhgU2V0dGluZyBhdXRvIHdlYnZpZXcgdG8gY29udGV4dCAnJHt2aWV3TmFtZX0nIHdpdGggdGltZW91dCAke3RpbWVvdXR9bXNgKTtcbiAgICAgIGF3YWl0IHJldHJ5SW50ZXJ2YWwodGltZW91dCAvIDUwMCwgNTAwLCB0aGlzLnNldENvbnRleHQuYmluZCh0aGlzKSwgdmlld05hbWUpO1xuICAgIH1cblxuICAgIC8vIG5vdyB0aGF0IGV2ZXJ5dGhpbmcgaGFzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LCB0dXJuIG9uIHByb3h5aW5nIHNvIGFsbFxuICAgIC8vIHN1YnNlcXVlbnQgc2Vzc2lvbiByZXF1ZXN0cyBnbyBzdHJhaWdodCB0by9mcm9tIHVpYXV0b21hdG9yMlxuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSB0cnVlO1xuICB9XG5cbiAgYXN5bmMgYWRkRGV2aWNlSW5mb1RvQ2FwcyAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXBpVmVyc2lvbixcbiAgICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICAgIG1hbnVmYWN0dXJlcixcbiAgICAgIG1vZGVsLFxuICAgICAgcmVhbERpc3BsYXlTaXplLFxuICAgICAgZGlzcGxheURlbnNpdHksXG4gICAgfSA9IGF3YWl0IHRoaXMubW9iaWxlR2V0RGV2aWNlSW5mbygpO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VBcGlMZXZlbCA9IHBhcnNlSW50KGFwaVZlcnNpb24sIDEwKTtcbiAgICB0aGlzLmNhcHMucGxhdGZvcm1WZXJzaW9uID0gcGxhdGZvcm1WZXJzaW9uO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VTY3JlZW5TaXplID0gcmVhbERpc3BsYXlTaXplO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VTY3JlZW5EZW5zaXR5ID0gZGlzcGxheURlbnNpdHk7XG4gICAgdGhpcy5jYXBzLmRldmljZU1vZGVsID0gbW9kZWw7XG4gICAgdGhpcy5jYXBzLmRldmljZU1hbnVmYWN0dXJlciA9IG1hbnVmYWN0dXJlcjtcbiAgfVxuXG4gIGFzeW5jIGluaXRVaUF1dG9tYXRvcjJTZXJ2ZXIgKCkge1xuICAgIC8vIGJyb2tlbiBvdXQgZm9yIHJlYWRhYmlsaXR5XG4gICAgY29uc3QgdWlhdXRvbWF0b3IyT3B0cyA9IHtcbiAgICAgIGhvc3Q6IHRoaXMub3B0cy5yZW1vdGVBZGJIb3N0IHx8IHRoaXMub3B0cy5ob3N0IHx8IExPQ0FMSE9TVF9JUDQsXG4gICAgICBzeXN0ZW1Qb3J0OiB0aGlzLm9wdHMuc3lzdGVtUG9ydCxcbiAgICAgIGRldmljZVBvcnQ6IERFVklDRV9QT1JULFxuICAgICAgYWRiOiB0aGlzLmFkYixcbiAgICAgIGFwazogdGhpcy5vcHRzLmFwcCxcbiAgICAgIHRtcERpcjogdGhpcy5vcHRzLnRtcERpcixcbiAgICAgIGFwcFBhY2thZ2U6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgICAgYXBwQWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgIGRpc2FibGVXaW5kb3dBbmltYXRpb246ICEhdGhpcy5vcHRzLmRpc2FibGVXaW5kb3dBbmltYXRpb24sXG4gICAgICBkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZTogdGhpcy5vcHRzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlLFxuICAgICAgcmVhZFRpbWVvdXQ6IHRoaXMub3B0cy51aWF1dG9tYXRvcjJTZXJ2ZXJSZWFkVGltZW91dCxcbiAgICB9O1xuICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgcGFja2FnZSBhbmQgYWN0aXZpdHksIHdlIGNhbiBjcmVhdGUgYW4gaW5zdGFuY2Ugb2ZcbiAgICAvLyB1aWF1dG9tYXRvcjIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgb3B0aW9uc1xuICAgIHRoaXMudWlhdXRvbWF0b3IyID0gbmV3IFVpQXV0b21hdG9yMlNlcnZlcih0aGlzLmxvZywgdWlhdXRvbWF0b3IyT3B0cyk7XG4gICAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMudWlhdXRvbWF0b3IyLnByb3h5UmVxUmVzLmJpbmQodGhpcy51aWF1dG9tYXRvcjIpO1xuICAgIHRoaXMucHJveHlDb21tYW5kID0gdGhpcy51aWF1dG9tYXRvcjIucHJveHlDb21tYW5kLmJpbmQodGhpcy51aWF1dG9tYXRvcjIpO1xuXG4gICAgaWYgKHRoaXMub3B0cy5za2lwU2VydmVySW5zdGFsbGF0aW9uKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGAnc2tpcFNlcnZlckluc3RhbGxhdGlvbicgaXMgc2V0LiBTa2lwcGluZyBVSUF1dG9tYXRvcjIgc2VydmVyIGluc3RhbGxhdGlvbi5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuaW5zdGFsbFNlcnZlckFwayh0aGlzLm9wdHMudWlhdXRvbWF0b3IyU2VydmVySW5zdGFsbFRpbWVvdXQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuYWRkVG9EZXZpY2VJZGxlV2hpdGVsaXN0KFxuICAgICAgICAgIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIFNFUlZFUl9QQUNLQUdFX0lELCBTRVJWRVJfVEVTVF9QQUNLQUdFX0lELFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3QgYWRkIHNlcnZlciBwYWNrYWdlcyB0byB0aGUgRG96ZSB3aGl0ZWxpc3QuIE9yaWdpbmFsIGVycm9yOiBgICtcbiAgICAgICAgICAoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5pdEFVVCAoKSB7XG4gICAgLy8gVW5pbnN0YWxsIGFueSB1bmluc3RhbGxPdGhlclBhY2thZ2VzIHdoaWNoIHdlcmUgc3BlY2lmaWVkIGluIGNhcHNcbiAgICBpZiAodGhpcy5vcHRzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyhcbiAgICAgICAgdGhpcy5hZGIsXG4gICAgICAgIGhlbHBlcnMucGFyc2VBcnJheSh0aGlzLm9wdHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyksXG4gICAgICAgIFtTRVRUSU5HU19IRUxQRVJfUEtHX0lELCBTRVJWRVJfUEFDS0FHRV9JRCwgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCBhbnkgXCJvdGhlckFwcHNcIiB0aGF0IHdlcmUgc3BlY2lmaWVkIGluIGNhcHNcbiAgICBpZiAodGhpcy5vcHRzLm90aGVyQXBwcykge1xuICAgICAgbGV0IG90aGVyQXBwcztcbiAgICAgIHRyeSB7XG4gICAgICAgIG90aGVyQXBwcyA9IGhlbHBlcnMucGFyc2VBcnJheSh0aGlzLm9wdHMub3RoZXJBcHBzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ291bGQgbm90IHBhcnNlIFwib3RoZXJBcHBzXCIgY2FwYWJpbGl0eTogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICBvdGhlckFwcHMgPSBhd2FpdCBCLmFsbChvdGhlckFwcHNcbiAgICAgICAgLm1hcCgoYXBwKSA9PiB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKGFwcCwgW0FQS19FWFRFTlNJT04sIEFQS1NfRVhURU5TSU9OXSkpKTtcbiAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbE90aGVyQXBrcyhvdGhlckFwcHMsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdHMuYXBwKSB7XG4gICAgICBpZiAodGhpcy5vcHRzLm5vUmVzZXQgJiYgIShhd2FpdCB0aGlzLmFkYi5pc0FwcEluc3RhbGxlZCh0aGlzLm9wdHMuYXBwUGFja2FnZSkpXG4gICAgICAgICAgfHwgIXRoaXMub3B0cy5ub1Jlc2V0KSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRzLm5vU2lnbiAmJiAhYXdhaXQgdGhpcy5hZGIuY2hlY2tBcGtDZXJ0KHRoaXMub3B0cy5hcHAsIHRoaXMub3B0cy5hcHBQYWNrYWdlLCB7XG4gICAgICAgICAgcmVxdWlyZURlZmF1bHRDZXJ0OiBmYWxzZSxcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICBhd2FpdCBoZWxwZXJzLnNpZ25BcHAodGhpcy5hZGIsIHRoaXMub3B0cy5hcHApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5vcHRzLnNraXBVbmluc3RhbGwpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbEFwayh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCdub1Jlc2V0IGhhcyBiZWVuIHJlcXVlc3RlZCBhbmQgdGhlIGFwcCBpcyBhbHJlYWR5IGluc3RhbGxlZC4gRG9pbmcgbm90aGluZycpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdGdWxsIHJlc2V0IHJlcXVpcmVzIGFuIGFwcCBjYXBhYmlsaXR5LCB1c2UgZmFzdFJlc2V0IGlmIGFwcCBpcyBub3QgcHJvdmlkZWQnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nLmRlYnVnKCdObyBhcHAgY2FwYWJpbGl0eS4gQXNzdW1pbmcgaXQgaXMgYWxyZWFkeSBvbiB0aGUgZGV2aWNlJyk7XG4gICAgICBpZiAodGhpcy5vcHRzLmZhc3RSZXNldCAmJiB0aGlzLm9wdHMuYXBwUGFja2FnZSkge1xuICAgICAgICBhd2FpdCBoZWxwZXJzLnJlc2V0QXBwKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGVuc3VyZUFwcFN0YXJ0cyAoKSB7XG4gICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgYW4gYWN0aXZpdHkgYW5kIHBhY2thZ2UgdG8gd2FpdCBmb3JcbiAgICBjb25zdCBhcHBXYWl0UGFja2FnZSA9IHRoaXMub3B0cy5hcHBXYWl0UGFja2FnZSB8fCB0aGlzLm9wdHMuYXBwUGFja2FnZTtcbiAgICBjb25zdCBhcHBXYWl0QWN0aXZpdHkgPSB0aGlzLm9wdHMuYXBwV2FpdEFjdGl2aXR5IHx8IHRoaXMub3B0cy5hcHBBY3Rpdml0eTtcblxuICAgIHRoaXMubG9nLmluZm8oYFN0YXJ0aW5nICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfS8ke3RoaXMub3B0cy5hcHBBY3Rpdml0eX0gYCArXG4gICAgICBgYW5kIHdhaXRpbmcgZm9yICcke2FwcFdhaXRQYWNrYWdlfS8ke2FwcFdhaXRBY3Rpdml0eX0nYCk7XG5cbiAgICBpZiAodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgYW5kcm9pZENvdmVyYWdlIGlzIGNvbmZpZ3VyZWQuIGAgK1xuICAgICAgICBgIFN0YXJ0aW5nIGluc3RydW1lbnRhdGlvbiBvZiAnJHt0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlfScuLi5gKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmFuZHJvaWRDb3ZlcmFnZSh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlLCBhcHBXYWl0UGFja2FnZSwgYXBwV2FpdEFjdGl2aXR5KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5ub1Jlc2V0ICYmICF0aGlzLm9wdHMuZm9yY2VBcHBMYXVuY2hcbiAgICAgICAgJiYgYXdhaXQgdGhpcy5hZGIucHJvY2Vzc0V4aXN0cyh0aGlzLm9wdHMuYXBwUGFja2FnZSkpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYCcke3RoaXMub3B0cy5hcHBQYWNrYWdlfScgaXMgYWxyZWFkeSBydW5uaW5nIGFuZCBub1Jlc2V0IGlzIGVuYWJsZWQuIGAgK1xuICAgICAgICBgU2V0IGZvcmNlQXBwTGF1bmNoIGNhcGFiaWxpdHkgdG8gdHJ1ZSBpZiB0aGUgYXBwIG11c3QgYmUgZm9yY2VmdWxseSByZXN0YXJ0ZWQgb24gc2Vzc2lvbiBzdGFydHVwLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmFkYi5zdGFydEFwcCh7XG4gICAgICBwa2c6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgICAgYWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgIGFjdGlvbjogdGhpcy5vcHRzLmludGVudEFjdGlvbiB8fCAnYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4nLFxuICAgICAgY2F0ZWdvcnk6IHRoaXMub3B0cy5pbnRlbnRDYXRlZ29yeSB8fCAnYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVInLFxuICAgICAgZmxhZ3M6IHRoaXMub3B0cy5pbnRlbnRGbGFncyB8fCAnMHgxMDIwMDAwMCcsIC8vIEZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgfCBGTEFHX0FDVElWSVRZX1JFU0VUX1RBU0tfSUZfTkVFREVEXG4gICAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgICB3YWl0QWN0aXZpdHk6IHRoaXMub3B0cy5hcHBXYWl0QWN0aXZpdHksXG4gICAgICB3YWl0Rm9yTGF1bmNoOiB0aGlzLm9wdHMuYXBwV2FpdEZvckxhdW5jaCxcbiAgICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICAgIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzOiB0aGlzLm9wdHMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHMsXG4gICAgICBzdG9wQXBwOiB0aGlzLm9wdHMuZm9yY2VBcHBMYXVuY2ggfHwgIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQsXG4gICAgICByZXRyeTogdHJ1ZSxcbiAgICAgIHVzZXI6IHRoaXMub3B0cy51c2VyUHJvZmlsZSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdEZWxldGluZyBVaUF1dG9tYXRvcjIgc2Vzc2lvbicpO1xuXG4gICAgY29uc3Qgc2NyZWVuUmVjb3JkaW5nU3RvcFRhc2tzID0gW2FzeW5jICgpID0+IHtcbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcFJlY29yZGluZ1NjcmVlbigpO1xuICAgICAgfVxuICAgIH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLm1vYmlsZUlzTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nUnVubmluZygpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZygpO1xuICAgICAgfVxuICAgIH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmcoKTtcbiAgICAgIH1cbiAgICB9XTtcblxuICAgIGF3YWl0IGFuZHJvaWRIZWxwZXJzLnJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyh0aGlzLnNlcnZlciwgdGhpcy5zZXNzaW9uSWQpO1xuXG4gICAgaWYgKHRoaXMudWlhdXRvbWF0b3IyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BDaHJvbWVkcml2ZXJQcm94aWVzKCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIHN0b3AgQ2hyb21lRHJpdmVyIHByb3hpZXM6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5qd3BQcm94eUFjdGl2ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmRlbGV0ZVNlc3Npb24oKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIHByb3h5IGRlbGV0ZVNlc3Npb24gdG8gVWlBdXRvbWF0b3IyOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnVpYXV0b21hdG9yMiA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLmFkYikge1xuICAgICAgYXdhaXQgQi5hbGwoc2NyZWVuUmVjb3JkaW5nU3RvcFRhc2tzLm1hcCgodGFzaykgPT4ge1xuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0YXNrKCk7XG4gICAgICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgICAgICB9KSgpO1xuICAgICAgfSkpO1xuXG4gICAgICBpZiAodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdTaHV0dGluZyBkb3duIHRoZSBhZGIgcHJvY2VzcyBvZiBpbnN0cnVtZW50YXRpb24uLi4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuZW5kQW5kcm9pZENvdmVyYWdlKCk7XG4gICAgICAgIC8vIFVzZSB0aGlzIGJyb2FkY2FzdCBpbnRlbnQgdG8gbm90aWZ5IGl0J3MgdGltZSB0byBkdW1wIGNvdmVyYWdlIHRvIGZpbGVcbiAgICAgICAgaWYgKHRoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBTZW5kaW5nIGludGVudCBicm9hZGNhc3QgJyR7dGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZUVuZEludGVudH0nIGF0IHRoZSBlbmQgb2YgaW5zdHJ1bWVudGluZy5gKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5icm9hZGNhc3QodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZUVuZEludGVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybignTm8gYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50IGlzIGNvbmZpZ3VyZWQgaW4gY2Fwcy4gUG9zc2libHkgeW91IGNhbm5vdCBnZXQgY292ZXJhZ2UgZmlsZS4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0Nocm9tZVNlc3Npb24gJiYgKCghdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldCAmJiAhdGhpcy5vcHRzLm5vUmVzZXQpXG4gICAgICAgICAgICB8fCAodGhpcy5vcHRzLm5vUmVzZXQgJiYgdGhpcy5vcHRzLnNob3VsZFRlcm1pbmF0ZUFwcCkpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmZvcmNlU3RvcCh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gZm9yY2Ugc3RvcCBhcHA6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ICYmICF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBDYXBhYmlsaXR5ICdmdWxsUmVzZXQnIHNldCB0byAndHJ1ZScsIFVuaW5zdGFsbGluZyAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nYCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gdW5pbnN0YWxsIGFwcDogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFRoaXMgdmFsdWUgY2FuIGJlIHRydWUgaWYgdGVzdCB0YXJnZXQgZGV2aWNlIGlzIDw9IDI2XG4gICAgICBpZiAodGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnUmVzdG9yaW5nIHdpbmRvdyBhbmltYXRpb24gc3RhdGUnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QW5pbWF0aW9uU3RhdGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zdG9wTG9nY2F0KCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbGVhc2VTeXN0ZW1Qb3J0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gcmVtb3ZlIHN5c3RlbSBwb3J0IGZvcndhcmQ6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgLy8gSWdub3JlLCB0aGlzIGJsb2NrIHdpbGwgYWxzbyBiZSBjYWxsZWQgd2hlbiB3ZSBmYWxsIGluIGNhdGNoIGJsb2NrXG4gICAgICAgIC8vIGFuZCBiZWZvcmUgZXZlbiBwb3J0IGZvcndhcmQuXG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbGVhc2VNanBlZ1NlcnZlclBvcnQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byByZW1vdmUgTUpQRUcgc2VydmVyIHBvcnQgZm9yd2FyZDogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAvLyBJZ25vcmUsIHRoaXMgYmxvY2sgd2lsbCBhbHNvIGJlIGNhbGxlZCB3aGVuIHdlIGZhbGwgaW4gY2F0Y2ggYmxvY2tcbiAgICAgICAgLy8gYW5kIGJlZm9yZSBldmVuIHBvcnQgZm9yd2FyZC5cbiAgICAgIH1cblxuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICAgIHRoaXMubG9nLmluZm8oJ1Jlc3RvcmluZyBoaWRkZW4gYXBpIHBvbGljeSB0byB0aGUgZGV2aWNlIGRlZmF1bHQgY29uZmlndXJhdGlvbicpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5KCEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgbGV0IGF2ZE5hbWUgPSB0aGlzLm9wdHMuYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBDbG9zaW5nIGVtdWxhdG9yICcke2F2ZE5hbWV9J2ApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmtpbGxFbXVsYXRvcihhdmROYW1lKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIGNsb3NlIGVtdWxhdG9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLm1qcGVnU3RyZWFtKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdDbG9zaW5nIE1KUEVHIHN0cmVhbScpO1xuICAgICAgdGhpcy5tanBlZ1N0cmVhbS5zdG9wKCk7XG4gICAgfVxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZVNlc3Npb24oKTtcbiAgfVxuXG4gIGFzeW5jIGNoZWNrQXBwUHJlc2VudCAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0NoZWNraW5nIHdoZXRoZXIgYXBwIGlzIGFjdHVhbGx5IHByZXNlbnQnKTtcbiAgICBpZiAoIShhd2FpdCBmcy5leGlzdHModGhpcy5vcHRzLmFwcCkpKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZmluZCBhcHAgYXBrIGF0ICcke3RoaXMub3B0cy5hcHB9J2ApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uU2V0dGluZ3NVcGRhdGUgKCkge1xuICAgIC8vIGludGVudGlvbmFsbHkgZG8gbm90aGluZyBoZXJlLCBzaW5jZSBjb21tYW5kcy51cGRhdGVTZXR0aW5ncyBwcm94aWVzXG4gICAgLy8gc2V0dGluZ3MgdG8gdGhlIHVpYXV0bzIgc2VydmVyIGFscmVhZHlcbiAgfVxuXG4gIC8vIE5lZWQgdG8gb3ZlcnJpZGUgYW5kcm9pZC1kcml2ZXIncyB2ZXJzaW9uIG9mIHRoaXMgc2luY2Ugd2UgZG9uJ3QgYWN0dWFsbHlcbiAgLy8gaGF2ZSBhIGJvb3RzdHJhcDsgaW5zdGVhZCB3ZSBqdXN0IHJlc3RhcnQgYWRiIGFuZCByZS1mb3J3YXJkIHRoZSBVaUF1dG9tYXRvcjJcbiAgLy8gcG9ydFxuICBhc3luYyB3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCAod3JhcHBlZCkge1xuICAgIGF3YWl0IHdyYXBwZWQoKTtcbiAgICBhd2FpdCB0aGlzLmFkYi5yZXN0YXJ0KCk7XG4gICAgYXdhaXQgdGhpcy5hbGxvY2F0ZVN5c3RlbVBvcnQoKTtcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0KCk7XG4gIH1cblxuICBwcm94eUFjdGl2ZSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGFsd2F5cyBoYXZlIGFuIGFjdGl2ZSBwcm94eSB0byB0aGUgVWlBdXRvbWF0b3IyIHNlcnZlclxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY2FuUHJveHkgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmNhblByb3h5KHNlc3Npb25JZCk7XG5cbiAgICAvLyB3ZSBjYW4gYWx3YXlzIHByb3h5IHRvIHRoZSB1aWF1dG9tYXRvcjIgc2VydmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXRQcm94eUF2b2lkTGlzdCAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIuZ2V0UHJveHlBdm9pZExpc3Qoc2Vzc2lvbklkKTtcbiAgICAvLyB3ZSBhcmUgbWFpbnRhaW5pbmcgdHdvIHNldHMgb2YgTk9fUFJPWFkgbGlzdHMsIG9uZSBmb3IgY2hyb21lZHJpdmVyKENIUk9NRV9OT19QUk9YWSlcbiAgICAvLyBhbmQgb25lIGZvciB1aWF1dG9tYXRvcjIoTk9fUFJPWFkpLCBiYXNlZCBvbiBjdXJyZW50IGNvbnRleHQgd2lsbCByZXR1cm4gcmVsYXRlZCBOT19QUk9YWSBsaXN0XG4gICAgaWYgKHV0aWwuaGFzVmFsdWUodGhpcy5jaHJvbWVkcml2ZXIpKSB7XG4gICAgICAvLyBpZiB0aGUgY3VycmVudCBjb250ZXh0IGlzIHdlYnZpZXcoY2hyb21lZHJpdmVyKSwgdGhlbiByZXR1cm4gQ0hST01FX05PX1BST1hZIGxpc3RcbiAgICAgIHRoaXMuandwUHJveHlBdm9pZCA9IENIUk9NRV9OT19QUk9YWTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5qd3BQcm94eUF2b2lkID0gTk9fUFJPWFk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdHMubmF0aXZlV2ViU2NyZWVuc2hvdCkge1xuICAgICAgdGhpcy5qd3BQcm94eUF2b2lkID0gWy4uLnRoaXMuandwUHJveHlBdm9pZCwgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2NyZWVuc2hvdCcpXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuandwUHJveHlBdm9pZDtcbiAgfVxuXG4gIGdldCBpc0Nocm9tZVNlc3Npb24gKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzQ2hyb21lQnJvd3Nlcih0aGlzLm9wdHMuYnJvd3Nlck5hbWUpO1xuICB9XG59XG5cbi8vIGZpcnN0IGFkZCB0aGUgYW5kcm9pZC1kcml2ZXIgY29tbWFuZHMgd2hpY2ggd2Ugd2lsbCBmYWxsIGJhY2sgdG9cbmZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoYW5kcm9pZENvbW1hbmRzKSkge1xuICBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG59XG5cbi8vIHRoZW4gb3ZlcndyaXRlIHdpdGggYW55IHVpYXV0b21hdG9yMi1zcGVjaWZpYyBjb21tYW5kc1xuZm9yIChsZXQgW2NtZCwgZm5dIG9mIF8udG9QYWlycyhjb21tYW5kcykpIHtcbiAgQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlci5wcm90b3R5cGVbY21kXSA9IGZuO1xufVxuXG5leHBvcnQgeyBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFlBQUEsR0FBQUYsT0FBQTtBQUdBLElBQUFHLFVBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFFBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFNBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFNBQUEsR0FBQVAsc0JBQUEsQ0FBQUMsT0FBQTtB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LENBQUMsQ0FBQyxFQUM3RCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsK0NBQStDLENBQUMsQ0FBQyxFQUNyRSxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsOENBQThDLENBQUMsQ0FBQyxFQUNwRSxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxFQUN0RCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQyxFQUMvQyxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQyxFQUMvQyxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxFQUNqRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxFQUM1QyxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxFQUNoRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxFQUMxRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxFQUNoRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMscUNBQXFDLENBQUMsQ0FBQyxFQUMzRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQyxFQUNyRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQyxFQUczQyxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxFQUNoRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQyxFQUMvQyxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQyxFQUNyRCxDQUFDLE1BQU0sRUFBRSxJQUFJ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
|