\n Total expenditures: \n ${formatCurrency(supp.total())}\n \n
`;\n },\n linkEditBtns() {\n let btns = document.querySelectorAll('.edit-supp');\n btns.forEach(btn => {\n btn.addEventListener('click', function () {\n visitPage('new-inits');\n });\n });\n },\n update() {\n const suppDiv = document.querySelector('#supp-stats');\n suppDiv.innerHTML = this.html();\n this.linkEditBtns();\n }\n};\n/* harmony default export */ const supp_section = (SuppSection);\n;// CONCATENATED MODULE: ./src/js/components/sidebar/sidebar.js\n\n\n\n\n// fetch CSS variables saved in :root\nconst root = document.documentElement;\nconst sideBarWidth = getComputedStyle(root).getPropertyValue('--sidebar-width').trim();\nfunction hideSidebar() {\n document.getElementById('sidebar-panel').style.display = 'none';\n document.getElementById('main-panel').style.width = '100%';\n document.querySelector('header').style.width = '100%';\n}\nfunction showSidebar() {\n const sidebar = document.getElementById('sidebar-panel');\n const mainPanel = document.getElementById('main-panel');\n const header = document.querySelector('header');\n\n // update values\n updateTotals();\n sidebar.style.display = 'block'; // Show the sidebar\n\n // Calculate the remaining width for the main panel and header\n var contentWidth = document.documentElement.clientWidth;\n mainPanel.style.width = `${contentWidth - parseInt(sideBarWidth, 10)}px`;\n header.style.width = `${contentWidth - parseInt(sideBarWidth, 10)}px`;\n\n // add event listener to resize content if window is adjusted\n window.addEventListener('resize', showSidebar);\n}\nfunction updateSidebarTitle(new_title) {\n document.getElementById('sidebar-title').textContent = new_title;\n}\nfunction updateTotals() {\n supp_section.update();\n BaselineSection.update();\n}\nfunction resetAll() {\n localStorage.clear();\n // reset all stats to 0\n updateTotals();\n}\nconst Sidebar = {\n SuppSection: supp_section,\n BaselineSection: BaselineSection,\n hide: hideSidebar,\n show: showSidebar,\n updateTitle: updateSidebarTitle,\n updateTotals: updateTotals,\n reset: resetAll\n};\n/* harmony default export */ const components_sidebar_sidebar = (Sidebar);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/nav_buttons/nav_buttons.css\nvar nav_buttons = __webpack_require__(595);\n;// CONCATENATED MODULE: ./src/js/components/nav_buttons/nav_buttons.css\n\n \n \n \n \n \n \n \n \n \n\nvar nav_buttons_options = {};\n\nnav_buttons_options.styleTagTransform = (styleTagTransform_default());\nnav_buttons_options.setAttributes = (setAttributesWithoutAttributes_default());\nnav_buttons_options.insert = insertBySelector_default().bind(null, \"head\");\nnav_buttons_options.domAPI = (styleDomAPI_default());\nnav_buttons_options.insertStyleElement = (insertStyleElement_default());\n\nvar nav_buttons_update = injectStylesIntoStyleTag_default()(nav_buttons/* default */.A, nav_buttons_options);\n\n\n\n\n /* harmony default export */ const nav_buttons_nav_buttons = (nav_buttons/* default */.A && nav_buttons/* default */.A.locals ? nav_buttons/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/nav_buttons/nav_buttons.js\n// nav_buttons.js\n\n\nfunction initializeNavButtons() {\n // initialize last button\n const last_btn = document.getElementById('btn-last');\n last_btn.addEventListener('click', lastPage);\n // initialize next button\n const next_btn = document.getElementById('btn-next');\n next_btn.addEventListener('click', nextPage);\n}\nfunction nav_buttons_disable(button_id) {\n const button = document.getElementById(button_id);\n button.classList.add('disabled');\n button.disabled = true; // Also disable it at the DOM level\n}\nfunction nav_buttons_enable(button_id) {\n const button = document.getElementById(button_id);\n button.classList.remove('disabled');\n button.disabled = false; // Enable it at the DOM level\n}\nconst Next = {\n disable: function () {\n nav_buttons_disable('btn-next');\n },\n enable: function () {\n nav_buttons_enable('btn-next');\n },\n addAction: function (fn) {\n document.querySelector(`#btn-next`).addEventListener('click', fn);\n },\n removeAction: function (fn) {\n document.querySelector(`#btn-next`).removeEventListener('click', fn);\n }\n};\nconst Last = {\n disable: function () {\n nav_buttons_disable('btn-last');\n },\n enable: function () {\n nav_buttons_enable('btn-last');\n }\n};\nconst NavButtons = {\n hide: function () {\n document.getElementById('nav-btns').style.display = 'none';\n },\n show: function () {\n document.getElementById('nav-btns').style.display = 'block';\n initializeNavButtons();\n },\n Next: Next,\n Last: Last\n};\n/* harmony default export */ const components_nav_buttons_nav_buttons = (NavButtons);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/body/body.css\nvar body = __webpack_require__(9);\n;// CONCATENATED MODULE: ./src/js/components/body/body.css\n\n \n \n \n \n \n \n \n \n \n\nvar body_options = {};\n\nbody_options.styleTagTransform = (styleTagTransform_default());\nbody_options.setAttributes = (setAttributesWithoutAttributes_default());\nbody_options.insert = insertBySelector_default().bind(null, \"head\");\nbody_options.domAPI = (styleDomAPI_default());\nbody_options.insertStyleElement = (insertStyleElement_default());\n\nvar body_update = injectStylesIntoStyleTag_default()(body/* default */.A, body_options);\n\n\n\n\n /* harmony default export */ const body_body = (body/* default */.A && body/* default */.A.locals ? body/* default */.A.locals : undefined);\n\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/accordion/accordion.css\nvar accordion = __webpack_require__(995);\n;// CONCATENATED MODULE: ./src/js/components/accordion/accordion.css\n\n \n \n \n \n \n \n \n \n \n\nvar accordion_options = {};\n\naccordion_options.styleTagTransform = (styleTagTransform_default());\naccordion_options.setAttributes = (setAttributesWithoutAttributes_default());\naccordion_options.insert = insertBySelector_default().bind(null, \"head\");\naccordion_options.domAPI = (styleDomAPI_default());\naccordion_options.insertStyleElement = (insertStyleElement_default());\n\nvar accordion_update = injectStylesIntoStyleTag_default()(accordion/* default */.A, accordion_options);\n\n\n\n\n /* harmony default export */ const accordion_accordion = (accordion/* default */.A && accordion/* default */.A.locals ? accordion/* default */.A.locals : undefined);\n\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/table/table.css\nvar table = __webpack_require__(279);\n;// CONCATENATED MODULE: ./src/js/components/table/table.css\n\n \n \n \n \n \n \n \n \n \n\nvar table_options = {};\n\ntable_options.styleTagTransform = (styleTagTransform_default());\ntable_options.setAttributes = (setAttributesWithoutAttributes_default());\ntable_options.insert = insertBySelector_default().bind(null, \"head\");\ntable_options.domAPI = (styleDomAPI_default());\ntable_options.insertStyleElement = (insertStyleElement_default());\n\nvar table_update = injectStylesIntoStyleTag_default()(table/* default */.A, table_options);\n\n\n\n\n /* harmony default export */ const table_table = (table/* default */.A && table/* default */.A.locals ? table/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/headers.js\nfunction addTableHeaders(cols) {\n // Get the table element by its ID\n const table = document.getElementById('main-table');\n\n // Create a table header row element\n const headerRow = document.createElement('tr');\n cols.forEach(col => {\n // Create a header cell element\n const headerCell = document.createElement('th');\n headerCell.textContent = col['title'];\n headerCell.classList.add(col['className']);\n\n // Append the header cell to the header row\n headerRow.appendChild(headerCell);\n });\n\n // Append the header row to the table header\n let thead = table.querySelector('thead');\n thead.appendChild(headerRow);\n}\nconst Header = {\n add: function (header_array) {\n addTableHeaders(header_array);\n }\n};\n/* harmony default export */ const headers = (Header);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/rows.js\n\n\nasync function addNewRow(data_dictionary, columns = []) {\n // Get the table element by its ID\n const table = document.getElementById('main-table');\n\n // check if header has already been added\n let header_row = table.querySelector('thead tr');\n if (!header_row) {\n headers.add(columns);\n header_row = table.querySelector('thead tr');\n }\n\n // initialize new row of data\n const new_row = document.createElement('tr');\n\n // go through each header and add the right cell value depending on its class\n let thElements = header_row.querySelectorAll('th');\n thElements.forEach(header_cell => {\n // Create new cell and add it to the row\n const newCell = document.createElement('td');\n new_row.appendChild(newCell);\n // if the data has an appropriate class, add the info to the cell. \n // Otherwise, keep empty cell\n Object.keys(data_dictionary).forEach(className => {\n if (header_cell.classList.contains(className)) {\n newCell.textContent = data_dictionary[className];\n newCell.classList.add(className);\n }\n });\n });\n\n // Append the new row to the table body\n let tbody = table.querySelector('tbody');\n tbody.appendChild(new_row);\n}\nfunction saveRowEdits(row) {\n var cells = row.querySelectorAll('td');\n cells.forEach(cell => {\n // save dropdown values\n if (cell.querySelector('select')) {\n var serviceSelector = cell.querySelector('select');\n cell.textContent = serviceSelector.value;\n } else if (cell.querySelector('input')) {\n // save new entered value in textbox\n var textbox = cell.querySelector('input');\n var enteredValue = textbox.value;\n // update display and format with currency if relevant\n if (cell.classList.contains('cost')) {\n // if cost, remove commas first\n enteredValue = enteredValue.replaceAll(',', '');\n cell.textContent = formatCurrency(enteredValue);\n // set value attribute to the new user input\n cell.setAttribute('value', enteredValue);\n } else {\n cell.textContent = enteredValue;\n }\n } else if (cell.querySelector('textarea')) {\n // save new entered value in textbox\n var enteredValue = cell.querySelector('textarea').value;\n cell.textContent = enteredValue;\n }\n });\n}\nconst Rows = {\n add: function (data_dictionary, cols) {\n addNewRow(data_dictionary, cols);\n },\n saveEdits: function (row) {\n saveRowEdits(row);\n }\n};\n/* harmony default export */ const rows = (Rows);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/buttons.js\n\nfunction hideButton(className) {\n return function () {\n var buttons = document.getElementsByClassName(className);\n for (var i = 0; i < buttons.length; i++) {\n buttons[i].style.display = 'none';\n }\n };\n}\nfunction showButton(className) {\n return function () {\n var buttons = document.getElementsByClassName(className);\n for (var i = 0; i < buttons.length; i++) {\n buttons[i].style.display = 'inline';\n }\n };\n}\nfunction updateButtonText(className, text) {\n document.querySelector(`.${className}`).textContent = text;\n}\nfunction handleRowEdit(actionOnClick, updateCallback = null) {\n // attach an event listener to each edit button in every row\n var editButtons = document.getElementsByClassName('btn-edit');\n for (var i = 0; i < editButtons.length; i++) {\n editButtons[i].addEventListener('click', async function (event) {\n // Determine what was clicked on within the table\n var rowToEdit = event.target.closest('tr');\n // mark row as being edited\n rowToEdit.classList.add('active-editing');\n\n // turn relevant entries into textboxes, usually\n actionOnClick();\n\n // hide edit buttons\n Edit.hide();\n if (updateCallback) {\n initializeConfirmButton(updateCallback);\n }\n });\n }\n ;\n}\nfunction initializeConfirmButton(updateCallback) {\n // get element and add listener for click\n var rowToEdit = document.querySelector('.active-editing');\n const confirm_btn = rowToEdit.querySelector(\".btn-confirm\");\n // show the row's confirm button\n confirm_btn.style.display = 'block';\n confirm_btn.addEventListener('click', function () {\n ;\n // save row edits\n rows.saveEdits(rowToEdit);\n // update values in sidebar\n updateCallback();\n // make row no longer green\n rowToEdit.classList.remove('active-editing');\n // show edit buttons and hide confirm buttons\n Edit.show();\n Confirm.hide();\n });\n}\nconst Edit = {\n html: '',\n hide: hideButton('btn-edit'),\n show: showButton('btn-edit'),\n init: function (actionOnClick, updateCallback) {\n handleRowEdit(actionOnClick, updateCallback);\n }\n};\nconst Delete = {\n html: '',\n hide: hideButton('btn-delete'),\n show: showButton('btn-delete')\n};\nconst Confirm = {\n html: '',\n hide: hideButton('btn-confirm'),\n show: showButton('btn-confirm')\n};\nconst AddRow = {\n hide: hideButton('btn-add'),\n show: showButton('btn-add'),\n updateText: function (text) {\n updateButtonText('btn-add', text);\n }\n};\nconst buttons_Buttons = {\n Delete: Delete,\n Edit: Edit,\n Confirm: Confirm,\n AddRow: AddRow,\n edit_confirm_btns: Edit.html + Confirm.html,\n all_btns: Delete.html + Edit.html + Confirm.html\n};\n/* harmony default export */ const subcomponents_buttons = (buttons_Buttons);\n;// CONCATENATED MODULE: ./src/js/components/form/subcomponents/dropdown.js\nfunction createDropdown(dataArray) {\n // Creating a select element\n const selectElement = document.createElement('select');\n\n // add a default blank option to the dataArray\n dataArray = [''].concat(dataArray);\n\n // Looping through the array and creating an option for each element\n dataArray.forEach(item => {\n const optionElement = document.createElement('option');\n optionElement.value = item;\n optionElement.textContent = item;\n selectElement.appendChild(optionElement); // Appending the option to the select\n });\n\n // Return the select element so it can be appended to the document\n return selectElement;\n}\nconst Dropdown = {\n create: function (dataArray) {\n return createDropdown(dataArray);\n }\n};\n/* harmony default export */ const subcomponents_dropdown = (Dropdown);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/cells.js\n\n\n\n\n// return cell value attribute or 0 if it does not exist\nfunction getCellValue(row, className) {\n var cell = row.querySelector(`.${className}`);\n var cellValue = cell ? cell.getAttribute('value') : null;\n return cellValue ? parseFloat(cellValue) : 0;\n}\n\n// return text in cell\nfunction getCellText(row, className) {\n var cell = row.querySelector(`.${className}`);\n if (cell) {\n return cell.textContent;\n } else {\n //console.log(`Error retrieving cell text for class ${className}`);\n return '';\n }\n}\nfunction updateTableCell(row, col_class, new_value) {\n const cell = row.querySelector(`.${col_class}`);\n cell.setAttribute('value', new_value);\n cell.textContent = formatCurrency(new_value);\n}\nfunction createEditableCell(cellClass, isCost, type = 'input') {\n // get cell\n const cell = document.querySelector(`.active-editing td.${cellClass}`);\n // Create an input element to edit the value\n var textbox = document.createElement(type);\n if (type == 'input') {\n textbox.type = 'text';\n }\n ;\n if (isCost) {\n var value = cell.getAttribute('value');\n textbox.value = displayWithCommas(value);\n } else {\n textbox.value = cell.textContent;\n }\n // Clear the current content and append the textbox to the cell\n cell.innerHTML = '';\n cell.appendChild(textbox);\n}\nfunction cells_createDropdown(cellClass, optionArray) {\n // get cell\n const cell = document.querySelector(`.active-editing td.${cellClass}`);\n // add service dropdown\n const dropdown = subcomponents_dropdown.create(optionArray);\n dropdown.value = cell.textContent;\n // Clear the current content and append the textbox to the cell\n cell.innerHTML = '';\n cell.appendChild(dropdown);\n}\nconst Cell = {\n getValue: function (row, className) {\n return getCellValue(row, className);\n },\n getText: function (row, className) {\n return getCellText(row, className);\n },\n updateValue: function (row, col_class, new_value) {\n updateTableCell(row, col_class, new_value);\n },\n createTextbox: function (className, isCost, type) {\n createEditableCell(className, isCost, type);\n },\n createServiceDropdown: () => {\n cells_createDropdown('service', services.list());\n },\n createDropdown: cells_createDropdown\n};\n/* harmony default export */ const cells = (Cell);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/columns.js\n\n\n// position is index at which new column will be inserted\nfunction addCol(position, htmlContent = '', headerTitle = '') {\n // Get the table element by its ID\n let table = document.getElementById('main-table');\n\n // Validate position\n let maxPosition = table.rows[0].cells.length;\n if (position < 0 || position > maxPosition) {\n console.error(`Position ${position} is out of bounds.`);\n return;\n }\n\n // Insert the header if provided\n let thead = table.tHead;\n if (headerTitle && thead) {\n let th = document.createElement('th');\n th.innerHTML = headerTitle; // Use innerHTML to insert HTML content\n thead.rows[0].insertBefore(th, thead.rows[0].cells[position]);\n }\n\n // Insert new cells into each row of the table body\n let tbody = table.tBodies[0];\n if (tbody) {\n for (let i = 0; i < tbody.rows.length; i++) {\n let row = tbody.rows[i];\n let td = document.createElement('td');\n td.innerHTML = htmlContent; // Use innerHTML to insert HTML content\n row.insertBefore(td, row.cells[position]);\n }\n }\n}\nfunction ncols() {\n const table = document.getElementById('main-table');\n // Ensure that the row exists before counting the columns\n return table.rows[0].cells.length;\n}\nfunction addColToEnd(htmlContents = [], headerTitle = '') {\n // count columns and add new column to the end\n const position = ncols('main-table');\n addCol(position, htmlContents, headerTitle);\n}\nfunction assignClassToColumn(headerName, className) {\n // Get the table element by its ID\n let table = document.getElementById('main-table');\n\n // Find the index of the column by its header name\n const thead = table.tHead;\n let headerCellIndex = -1;\n const headerCells = thead.rows[0].cells; // Assuming the first row contains header cells (
)\n for (let i = 0; i < headerCells.length; i++) {\n if (headerCells[i].textContent.trim() === headerName) {\n // assign the class to the header cell\n headerCells[i].classList.add(className);\n headerCellIndex = i;\n break;\n }\n }\n\n // error check\n if (headerCellIndex === -1) {\n console.error(`No header found with name \"${headerName}\"`);\n return;\n }\n\n // Assign the class to each cell in the specified column index within the tbody\n let tbody = table.tBodies[0];\n if (tbody) {\n let bodyRows = tbody.rows;\n for (let row of bodyRows) {\n if (row.cells[headerCellIndex]) {\n row.cells[headerCellIndex].classList.add(className);\n }\n }\n }\n}\nfunction addCostClass(headerName) {\n assignClassToColumn(headerName, 'cost');\n\n // Get all the cells with the specified class name\n const cells = document.querySelectorAll(`td.cost`);\n cells.forEach(cell => {\n // Get the current text content of the cell and assign it to 'value' attribute\n if (!cell.getAttribute('value')) {\n const cellText = cell.textContent.trim();\n const cellValue = isNaN(cellText) || cellText === '' ? 0 : parseFloat(cellText);\n cell.setAttribute('value', cellValue);\n\n // Now format the text content like currency and replace it in the cell\n const formattedCurrency = formatCurrency(parseFloat(cellValue));\n cell.textContent = formattedCurrency;\n }\n });\n}\nfunction assignColumnClasses(columnDefinitions) {\n columnDefinitions.forEach(column => {\n // Assign class to column\n assignClassToColumn(column.title, column.className);\n\n // If the column is a cost column, add the specific cost class\n if (column.isCost) {\n addCostClass(column.title);\n }\n\n // show the column\n if (!column.hide) {\n showColumnByTitle(column.title);\n }\n });\n}\nfunction hideColumn(index) {\n var table = document.getElementById('main-table');\n var rows = table.rows;\n for (var i = 0; i < rows.length; i++) {\n var cells = rows[i].cells;\n if (cells.length > index) {\n cells[index].style.display = 'none';\n }\n }\n}\n\n// Function to show a specific column\nfunction showColumn(index) {\n var table = document.getElementById('main-table');\n var rows = table.rows;\n for (var i = 0; i < rows.length; i++) {\n var cells = rows[i].cells;\n if (cells.length > index) {\n cells[index].style.display = 'table-cell';\n }\n }\n}\n\n// Function to get the column index by title\nfunction getColumnIndexByTitle(table, title) {\n var headers = table.querySelectorAll('th');\n for (var i = 0; i < headers.length; i++) {\n if (headers[i].innerText === title) {\n return i;\n }\n }\n return -1; // Column not found\n}\n\n// Function to hide a column by title\nfunction hideColumnByTitle(title) {\n var table = document.getElementById('main-table');\n var index = getColumnIndexByTitle(table, title);\n if (index !== -1) {\n hideColumn(index);\n } else {\n console.log(`Column with title \"${title}\" not found.`);\n }\n}\n\n// Function to show a column by title\nfunction showColumnByTitle(title) {\n var table = document.getElementById('main-table');\n var index = getColumnIndexByTitle(table, title);\n if (index !== -1) {\n showColumn(index);\n } else {\n console.log(`Column with title \"${title}\" not found.`);\n }\n}\nconst Column = {\n add: function (position, htmlContent, headerTitle) {\n return addCol(position, htmlContent, headerTitle);\n },\n addAtEnd: function (htmlContent, headerTitle) {\n return addColToEnd(htmlContent, headerTitle);\n },\n assignClasses: function (column_definitions) {\n return assignColumnClasses(column_definitions);\n },\n hide: function (colName) {\n hideColumnByTitle(colName);\n },\n show: function (colName) {\n showColumnByTitle(colName);\n }\n};\n/* harmony default export */ const columns = (Column);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/data.js\n\n\n\n\nfunction fillTable(data) {\n try {\n const table = document.getElementById('main-table');\n const thead = table.querySelector('thead');\n const tbody = table.querySelector('tbody');\n\n // clear existing data\n thead.innerHTML = '';\n tbody.innerHTML = '';\n\n // Create table header row\n const headerRow = document.createElement('tr');\n Object.keys(data[0]).forEach(key => {\n const header = document.createElement('th');\n header.textContent = key;\n headerRow.appendChild(header);\n });\n thead.appendChild(headerRow);\n\n // Create table body rows\n data.forEach(item => {\n const row = document.createElement('tr');\n Object.values(item).forEach(val => {\n const cell = document.createElement('td');\n cell.innerHTML = val;\n row.appendChild(cell);\n });\n tbody.appendChild(row);\n });\n } catch (error) {\n console.error('No table saved in localStorage:', error);\n }\n}\nasync function loadFromStorage() {\n // look up table name in storage\n if (current_fund.number()) {\n var key = `${current_page.load()}_${current_fund.number()}`;\n } else {\n var key = current_page.load();\n }\n // load from local storage\n const data = localStorage.getItem(key);\n // if nothing in storage, return a zero\n if (!data) {\n return 0;\n } else {\n // otherwise, fill table in HTML and return success (1)\n components_table_table.show();\n fillTable(await JSON.parse(data));\n return 1;\n }\n}\nfunction loadFunds() {\n // get list of funds from storage\n const fundDict = fund_lookup_table.retrieve();\n // build out data in correct format\n const ret = [];\n Object.keys(fundDict).forEach(key => {\n // determine if the fund has already been edited\n if (fundDict[key]['viewed']) {\n // todo: add a checkmark here\n ret.push({\n 'Fund': ` \n \n ${fundDict[key]['name']}\n `\n });\n } else {\n ret.push({\n 'Fund': ` \n ${fundDict[key]['name']}\n `\n });\n }\n });\n fillTable(ret);\n}\nfunction getColumnIndexByClass(tbody, className) {\n const firstRow = tbody.rows[0];\n if (!firstRow) return -1; // Return -1 if there's no row to examine\n for (let cellIndex = 0; cellIndex < firstRow.cells.length; cellIndex++) {\n if (firstRow.cells[cellIndex].classList.contains(className)) {\n return cellIndex;\n }\n }\n return -1; // Return -1 if class name not found\n}\n\n// function sort(primaryClass, secondaryClass) {\n// const table = document.getElementById('main-table');\n// const tbody = table.tBodies[0];\n// const rows = Array.from(tbody.rows);\n\n// // Get the column indices by class name\n// const primaryColIndex = getColumnIndexByClass(tbody, primaryClass);\n// const secondaryColIndex = getColumnIndexByClass(tbody, secondaryClass);\n\n// // exit if classes don't exist\n// if (primaryColIndex === -1 ) {\n// console.error(`Column class ${classA} not found in table`);\n// return; \n// } else if (secondaryColIndex === -1) {\n// console.error(`Column class ${classB} not found in table`);\n// return; \n// }\n\n// // Sort the rows based on the text content of the cells\n// rows.sort((rowA, rowB) => {\n// // Primary column comparison\n// const primaryA = unformatCurrency(rowA.cells[primaryColIndex].textContent);\n// const primaryB = unformatCurrency(rowB.cells[primaryColIndex].textContent);\n\n// if (primaryA < primaryB) return -1;\n// if (primaryA > primaryB) return 1;\n\n// // Secondary column comparison (if primary is equal)\n// const secondaryA = unformatCurrency(rowA.cells[secondaryColIndex].textContent);\n// const secondaryB = unformatCurrency(rowB.cells[secondaryColIndex].textContent);\n\n// if (secondaryA < secondaryB) return -1;\n// if (secondaryA > secondaryB) return 1;\n\n// // If both columns are equal\n// return 0;\n// });\n\n// // Reattach sorted rows to the table body\n// rows.forEach((row) => tbody.appendChild(row));\n// }\n\nconst Data = {\n load: loadFromStorage,\n loadFunds: loadFunds,\n sort: function (colA, colB) {\n sort(colA, colB);\n }\n};\n/* harmony default export */ const data = (Data);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/filters.js\n// Helper functions & constants\n\n// object to hold all current filter statuses\nconst filterSettings = {\n 'approp-name': '',\n 'cc-name': '',\n 'object-name': '',\n 'object-category': ''\n};\n\n// helper function to filter data based on all filters\nfunction filterData() {\n // Get all rows in the table\n const rows = document.querySelectorAll('#main-table tbody tr');\n\n // Iterate through each row and determine if it should be hidden or shown\n rows.forEach(row => {\n let isVisible = true;\n\n // Check each filter setting against the row's cells\n for (const [filterId, filterValue] of Object.entries(filterSettings)) {\n const cell = row.querySelector(`.${filterId}`);\n\n // only show row if values pass through all filters \n if (filterValue && cell && cell.textContent.trim() !== filterValue) {\n isVisible = false;\n break;\n }\n }\n\n // Show or hide the row based on visibility\n row.classList.toggle('hidden', !isVisible);\n });\n}\nconst Filter = {\n html(filterLabel, filterClass) {\n // basic html with only 'All' option\n return `\n `;\n },\n addOption(filterClass, option) {\n // Add another option to the dropdown for the filter\n const filterObj = document.querySelector(`#filter-${filterClass}`);\n const optionObj = document.createElement('option');\n optionObj.value = option;\n optionObj.textContent = option;\n filterObj.appendChild(optionObj);\n },\n add(filterLabel, filterClass) {\n // create a div to contain the html and insert inside filter-container\n const filterContainer = document.querySelector('#filter-container');\n const filterDiv = document.createElement('div');\n filterDiv.innerHTML = this.html(filterLabel, filterClass);\n filterContainer.appendChild(filterDiv);\n // add all relevant options from that column in the table\n this.addAllOptions(filterClass);\n // Bind change event to the select element\n filterDiv.querySelector('.filter-dropdown').addEventListener('change', event => {\n // Update filter settings\n filterSettings[filterClass] = event.target.value;\n // Apply all filters\n filterData();\n });\n },\n addAllOptions(filterClass) {\n // get matching column from table\n const column = document.querySelectorAll(`#main-table td.${filterClass}`);\n\n // Use a Set to store unique values in the column of interest\n const uniqueValues = new Set();\n\n // Iterate over the NodeList to get the unique values\n column.forEach(td => {\n // Add each textContent to the Set\n uniqueValues.add(td.textContent.trim());\n });\n // add all values as options to the filter dropdown\n uniqueValues.forEach(option => {\n this.addOption(filterClass, option);\n });\n },\n deleteAll() {\n document.querySelector('#filter-container').innerHTML = '';\n },\n updateOptions(filterClass) {\n const filterObj = document.querySelector(`#filter-${filterClass}`);\n if (filterObj) {\n // Clear all existing options except for the default 'All' option\n filterObj.options.length = 1;\n // Add new options\n this.addAllOptions(filterClass);\n }\n }\n};\n/* harmony default export */ const filters = (Filter);\n;// CONCATENATED MODULE: ./src/js/models/gold_book.js\n// the Gold Book contains a lookup table for each job code, which maps to the BU, the job title, and the fringe rate\n\nconst GoldBook = {\n init(sheet) {\n // Convert sheet to JSON, with no automatic header row parsing\n const rawData = XLSX.utils.sheet_to_json(sheet, {\n header: 1,\n defval: ''\n });\n\n // Assuming header is the second row (index 1), and data starts at the third row (index 2)\n const headers = rawData[1];\n const data = rawData.slice(2);\n\n // Store headers and data in localStorage\n localStorage.setItem('goldbook_headers', JSON.stringify(headers));\n localStorage.setItem('goldbook_data', JSON.stringify(data));\n },\n fetch() {\n const headers = JSON.parse(localStorage.getItem('goldbook_headers'));\n const data = JSON.parse(localStorage.getItem('goldbook_data'));\n return {\n headers,\n data\n };\n },\n fetchByCode(job_code) {\n const {\n headers,\n data\n } = this.fetch();\n\n // Create a map of column names to their respective indices\n const headerMap = headers.reduce((acc, header, index) => {\n acc[header] = index;\n return acc;\n }, {});\n return data.filter(row => row[headerMap['Job Code']] == job_code);\n },\n getHeaderIX(header_name) {\n const {\n headers\n } = this.fetch();\n const headerMap = headers.reduce((acc, header, index) => {\n acc[header] = index;\n return acc;\n }, {});\n return headerMap[header_name];\n },\n lookupByJobCode(job_code, header_name) {\n const codeData = this.fetchByCode(job_code);\n if (codeData.length > 0) {\n return codeData[0][this.getHeaderIX(header_name)];\n }\n return null;\n },\n getTitle(job_code) {\n return this.lookupByJobCode(job_code, 'Job Description');\n },\n getFringeRate(job_code) {\n return parseFloat(this.lookupByJobCode(job_code, 'Fringe Rate'));\n },\n codeExists(job_code) {\n return this.fetchByCode(job_code).length > 0;\n },\n // method to add GoldBook data as a new sheet to the workbook\n xlsx() {\n const {\n headers,\n data\n } = this.fetch();\n\n // Combine headers and data into one array\n const combinedData = [headers].concat(data);\n\n // Create a worksheet\n return XLSX.utils.aoa_to_sheet(combinedData);\n }\n};\n/* harmony default export */ const gold_book = (GoldBook);\n;// CONCATENATED MODULE: ./src/js/utils/XLSX_handlers.js\n\n\n\n\n\n\n\n// Helper functions\n\n/**\r\n * Deletes the top rows until a row containing complete data is found.\r\n * @param {Array} data - The raw data extracted from the sheet.\r\n * @returns {Array} - The cleaned data with incomplete top rows removed.\r\n */\nfunction deleteTopRowsUntilFullData(data) {\n let fullDataRowFound = false;\n while (!fullDataRowFound && data.length > 0) {\n const row = data[0]; // Get the top row\n let hasAllData = true;\n for (const cell of row) {\n if (cell == null || cell === '') {\n hasAllData = false;\n break;\n }\n }\n if (hasAllData && row.length > 1) {\n fullDataRowFound = true;\n } else {\n // delete the top row if it's not the header row\n data.shift();\n }\n }\n return data;\n}\n\n/**\r\n * Reads the workbook from the provided array buffer.\r\n * @param {ArrayBuffer} arrayBuffer - The array buffer containing the workbook data.\r\n * @returns {Object} - The parsed workbook.\r\n */\nfunction readWorkbook(arrayBuffer) {\n return XLSX.read(arrayBuffer, {\n type: 'array'\n });\n}\n\n/**\r\n * Processes sheets to be split by fund and saves the relevant data.\r\n * @param {string} sheetName - The name of the sheet being processed.\r\n * @param {Object} sheet - The sheet object from the workbook.\r\n */\nfunction processSheet(sheetName, sheet) {\n // Read in sheets\n const rawData = XLSX.utils.sheet_to_json(sheet, {\n header: 1,\n defval: ''\n });\n\n // Clean the data by removing top rows with incomplete data\n const dataRows = deleteTopRowsUntilFullData(rawData);\n\n // Get new headers\n const headers = dataRows[0];\n const fundIndex = headers.indexOf('Fund');\n if (fundIndex === -1) {\n console.error(`No 'Fund' column found in sheet ${sheetName}`);\n return;\n }\n\n // Save a dictionary of data for each fund for each sheet\n const fundData = {};\n dataRows.forEach(row => {\n const fund = row[fundIndex];\n if (fund && fund !== \"Fund\") {\n if (!fundData[fund]) {\n fundData[fund] = [];\n }\n const rowData = {};\n headers.forEach((header, index) => {\n rowData[removeNewLines(header)] = row[index];\n });\n fundData[fund].push(rowData);\n }\n });\n\n // Save fund number and name as we go along\n fund_lookup_table.update(fundData);\n console.log('updating fund lookup table');\n Object.keys(fundData).forEach(fund => {\n const key = `${SHEETS[sheetName]}_${fund}`;\n localStorage.setItem(key, JSON.stringify(fundData[fund]));\n });\n}\n\n/**\r\n * Processes the 'Drop-Down Menus' sheet to extract services data.\r\n * @param {Object} sheet - The sheet object from the workbook.\r\n */\nfunction processDropDownMenusSheet(sheet) {\n const sheetData = XLSX.utils.sheet_to_json(sheet, {\n header: 1\n });\n const headerRow = sheetData[0];\n const servicesIndex = headerRow.indexOf('Services');\n\n // save drop down menu for later excel downloads\n localStorage.setItem('dropdowns', JSON.stringify(sheetData));\n if (servicesIndex === -1) {\n console.error('Header \"Services\" not found');\n } else {\n const servicesColumn = sheetData.slice(1).map(row => row[servicesIndex]);\n const cleanedServicesColumn = servicesColumn.filter(value => value != null);\n services.save(cleanedServicesColumn);\n }\n}\n\n/**\r\n * Processes the 'Dept Summary' sheet to get and save the target for the general fund.\r\n * @param {Object} sheet - The sheet object from the workbook.\r\n */\nfunction processDeptSummarySheet(sheet) {\n if (sheet[TARGET_CELL_ADDRESS]) {\n const cellValue = sheet[TARGET_CELL_ADDRESS].v; // Access the cell value\n localStorage.setItem('target', cellValue);\n } else {\n console.error(`Cell ${TARGET_CELL_ADDRESS} not found`);\n }\n\n // save the sheet to add to future excel downloads\n const sheetData = XLSX.utils.sheet_to_json(sheet, {\n header: 1\n });\n // TODO: remove excess empty rows\n const newSheetData = sheetData.map(row => row.slice(0, 3));\n localStorage.setItem('dept-summary', JSON.stringify(newSheetData));\n}\n\n/**\r\n * Processes the 'FY{FISCAL_YEAR} Gold Book' sheet to initialize the Gold Book.\r\n * @param {Object} sheet - The sheet object from the workbook.\r\n */\nfunction processGoldBookSheet(sheet) {\n gold_book.init(sheet);\n}\nfunction processNewInitsSheet(sheet) {\n // Read in sheets\n const rawData = XLSX.utils.sheet_to_json(sheet, {\n header: 1,\n defval: ''\n });\n\n // Clean the data by removing top rows with incomplete data\n const dataRows = deleteTopRowsUntilFullData(rawData);\n\n // Get new headers\n const headers = dataRows[0];\n // final data output\n let fullData = [];\n\n // Convert data to JSON form and filter out rows where first value is missing\n dataRows.slice(1).forEach(row => {\n // Skip headers row\n // skip any empty rows at the end\n if (row[0] != '' && row[0] != '-') {\n const rowData = {};\n headers.forEach((header, index) => {\n rowData[removeNewLines(header)] = row[index];\n });\n // only keep supplemental initiatives \n if (rowData['Baseline or Supplemental'].includes('Supplemental')) {\n fullData.push(rowData);\n }\n }\n });\n // save in local storage\n localStorage.setItem('new-inits', JSON.stringify(fullData));\n}\n\n// Main function to read and process the workbook\nfunction processWorkbook(arrayBuffer) {\n const workbook = readWorkbook(arrayBuffer);\n workbook.SheetNames.forEach(sheetName => {\n // Only convert sheets we need; treat new inits separately because they shouldn't save by fund\n if (sheetName == Object.keys(SHEETS)[4]) {\n const sheet = workbook.Sheets[sheetName];\n processNewInitsSheet(sheet);\n } else if (Object.keys(SHEETS).includes(sheetName)) {\n const sheet = workbook.Sheets[sheetName];\n processSheet(sheetName, sheet);\n } else if (sheetName === 'Drop-Down Menus') {\n const sheet = workbook.Sheets[sheetName];\n processDropDownMenusSheet(sheet);\n } else if (sheetName === 'Dept Summary') {\n const sheet = workbook.Sheets[sheetName];\n processDeptSummarySheet(sheet);\n } else if (sheetName === `FY${FISCAL_YEAR} Gold Book`) {\n const sheet = workbook.Sheets[sheetName];\n processGoldBookSheet(sheet);\n }\n });\n console.log('all excel data saved');\n}\n\n// Utility function to append a sheet to the workbook if data is present\nfunction appendSheetToWorkbook(workbook, data, sheetName) {\n if (data.length > 0) {\n const sheet = XLSX.utils.json_to_sheet(data);\n XLSX.utils.book_append_sheet(workbook, sheet, sheetName);\n }\n}\nfunction downloadXLSX() {\n // grab data from baseline object\n const baseline = new models_baseline();\n const workbook = XLSX.utils.book_new(); // Create a new workbook\n\n // Initialize sheet data based on the names of each tab in the Excel doc\n const sheetData = Object.keys(SHEETS).reduce((acc, key) => {\n acc[key] = [];\n return acc;\n }, {});\n\n // Aggregate all rows across funds and combine for each tab\n baseline.funds.forEach(fund => {\n Object.keys(SHEETS).forEach(sheetName => {\n if (fund[SHEETS[sheetName]] && fund[SHEETS[sheetName]].table) {\n sheetData[sheetName].push(...fund[SHEETS[sheetName]].table);\n }\n });\n });\n\n // Add initiatives data (which isn't stored by fund)\n sheetData[Object.keys(SHEETS)[4]] = JSON.parse(localStorage.getItem('new-inits'));\n\n // Create a tab for each table\n Object.keys(sheetData).forEach(sheetName => {\n appendSheetToWorkbook(workbook, sheetData[sheetName], sheetName);\n });\n\n // Add a tab for the GoldBook\n XLSX.utils.book_append_sheet(workbook, gold_book.xlsx(), `FY${FISCAL_YEAR} Gold Book`);\n\n // add a tab for the drop downs and dept summary (just targets)\n writeJSONtoNewTab('dropdowns', 'Drop-Down Menus', workbook);\n writeJSONtoNewTab('dept-summary', 'Dept Summary', workbook);\n\n // Generate a downloadable file\n const wbout = XLSX.write(workbook, {\n bookType: 'xlsx',\n type: 'array'\n });\n const blob = new Blob([wbout], {\n type: 'application/octet-stream'\n });\n\n // Create a link and trigger the download\n const link = document.createElement(\"a\");\n link.href = URL.createObjectURL(blob);\n link.download = \"Filled_Detail_Sheet.xlsx\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n}\nfunction writeJSONtoNewTab(storage_key, tab_name, workbook) {\n const data = JSON.parse(localStorage.getItem(storage_key));\n console.log(data);\n const worksheet = XLSX.utils.aoa_to_sheet(data);\n XLSX.utils.book_append_sheet(workbook, worksheet, tab_name);\n}\nfunction excelSerialDateToJSDate(serial) {\n if (!serial) {\n return null;\n }\n ;\n // Excel considers 1900-01-01 as day 1, but JavaScript's Date considers\n // 1970-01-01 as day 0. Therefore, we calculate the number of milliseconds\n // between 1900-01-01 and 1970-01-01.\n const excelEpoch = new Date(Date.UTC(1899, 11, 30)); // JavaScript Consider December month as '11'\n\n // Calculate the JS date by adding serial days to the epoch date\n const date = new Date(excelEpoch.getTime() + serial * 24 * 60 * 60 * 1000);\n\n // Set the time part to zero (midnight)\n date.setUTCHours(0, 0, 0, 0);\n\n // Return the date part of the ISO string\n return date.toISOString().split('T')[0];\n}\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/tooltip/tooltip.css\nvar tooltip = __webpack_require__(843);\n;// CONCATENATED MODULE: ./src/js/components/tooltip/tooltip.css\n\n \n \n \n \n \n \n \n \n \n\nvar tooltip_options = {};\n\ntooltip_options.styleTagTransform = (styleTagTransform_default());\ntooltip_options.setAttributes = (setAttributesWithoutAttributes_default());\ntooltip_options.insert = insertBySelector_default().bind(null, \"head\");\ntooltip_options.domAPI = (styleDomAPI_default());\ntooltip_options.insertStyleElement = (insertStyleElement_default());\n\nvar tooltip_update = injectStylesIntoStyleTag_default()(tooltip/* default */.A, tooltip_options);\n\n\n\n\n /* harmony default export */ const tooltip_tooltip = (tooltip/* default */.A && tooltip/* default */.A.locals ? tooltip/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/tooltip/tooltip.js\n\n\n\n\n\n\nfunction hideTooltip() {\n document.getElementById('tooltip').style.visibility = 'hidden';\n}\nfunction showTooltip() {\n document.getElementById('tooltip').style.visibility = 'visible';\n}\nfunction editTooltipText(newText) {\n // edit text to display inside tooltip\n const tooltip = document.getElementById('tooltip');\n tooltip.innerHTML = newText;\n}\nfunction showAccountString(row) {\n const approp = cells.getText(row, 'approp-name');\n const cc = cells.getText(row, 'cc-name');\n const obj = cells.getText(row, 'object-name');\n const fund = cells.getText(row, 'fund-name');\n var message = `Fund: ${fund} \n Appropriation: ${approp} \n Cost Center: ${cc}`;\n if (obj) {\n message += ` Object: ${obj}`;\n }\n message += ` If you believe this account string is incorrect, please leave a comment \n in the comment column.`;\n editTooltipText(message);\n}\nfunction showSalaryProjection(row) {\n const general_increase = cells.getText(row, 'general-increase-rate');\n const merit_increase = cells.getText(row, 'merit-increase-rate');\n const current_salary = cells.getValue(row, 'current-salary');\n const proj_salary = cells.getValue(row, 'avg-salary');\n if (current_salary) {\n var message = `The average salary/wage for this position was \n ${formatCurrency(current_salary)} as of September 20${FISCAL_YEAR - 2}. \n Given a ${general_increase * 100}% general increase rate and a ${merit_increase * 100}% \n merit increase, the FY${FISCAL_YEAR} projection for this position's average \n annual salary/wage is ${formatCurrency(proj_salary)}. This projection takes into \n account the number of vacant vs. full positions.`;\n } else {\n var message = `The average salary/wage for this position was \n unknown as of September 20${FISCAL_YEAR - 2}, or the position\n did not exist. The FY${FISCAL_YEAR} projection for this position's \n average annual salary/wage is ${formatCurrency(proj_salary)}.`;\n }\n editTooltipText(message);\n}\nfunction showFinalPersonnelCost(row) {\n const proj_salary = cells.getValue(row, 'avg-salary');\n const ftes = cells.getText(row, 'baseline-ftes');\n const fringe = parseFloat(cells.getText(row, 'fringe'));\n const avg_benefits = proj_salary * fringe;\n const message = `The total cost captures ${ftes} position(s) at\n an annual salary/wage of ${formatCurrency(proj_salary)}, \n plus fringe benefits that cost ${formatCurrency(avg_benefits)} \n per position per year, on average.`;\n editTooltipText(message);\n}\nfunction showFICA(row) {\n const fica = parseFloat(cells.getText(row, 'fica'));\n const ficaPercentage = (fica * 100).toFixed(2);\n const message = `This total is overtime / holiday / shift premium pay, plus FICA (payroll tax), \n which is ${ficaPercentage}% for this cost center.`;\n editTooltipText(message);\n}\nfunction showCPA(row) {\n const cpa = parseFloat(cells.getText(row, 'cpa'));\n const description = cells.getText(row, 'cpa-description');\n const vendor = cells.getText(row, 'vendor');\n var contract_end = cells.getText(row, 'contract-end');\n // convert to normal date format from excel \n contract_end = excelSerialDateToJSDate(contract_end);\n const remaining = cells.getValue(row, 'remaining');\n if (cpa) {\n var message = `CPA #${cpa}`;\n } else {\n var message = `No CPA`;\n }\n if (vendor) {\n message += ` Vendor: ${vendor}`;\n }\n ;\n if (description) {\n message += ` Description: ${description}`;\n }\n ;\n if (contract_end) {\n message += ` Contract End Date: ${contract_end}`;\n }\n if (remaining) {\n message += ` Amount Remaining on Contract: ${formatCurrency(remaining)}`;\n }\n editTooltipText(message);\n}\nfunction tooltip_link(element, displayFn) {\n // add class to show cell with an underline, etc\n element.classList.add('tooltip-cell');\n\n // Create and append (detail)\n const detail = document.createElement('span');\n detail.classList.add('detail');\n detail.textContent = '(detail)';\n element.appendChild(detail);\n\n // add event listener to show tooltip on mouseover\n element.addEventListener('click', function (event) {\n const row = event.target.closest('tr');\n displayFn(row);\n showTooltip();\n });\n // and hide when mouse moves off\n element.addEventListener('mouseout', function () {\n hideTooltip();\n });\n // Update tooltip position on mouse move\n element.addEventListener('mousemove', function (event) {\n const tooltip = document.getElementById('tooltip');\n tooltip.style.top = event.clientY + 10 + 'px';\n tooltip.style.left = event.clientX + 10 + 'px';\n });\n}\nfunction linkAccountStringCol() {\n // get all relevant cells\n document.querySelectorAll('td.account-string').forEach(cell => {\n tooltip_link(cell, showAccountString);\n });\n}\nfunction linkSalaryCol() {\n // get all relevant cells\n document.querySelectorAll('td.avg-salary').forEach(cell => {\n tooltip_link(cell, showSalaryProjection);\n });\n}\nfunction linkTotalPersonnelCostCol() {\n // get all relevant cells\n document.querySelectorAll('td.total-baseline').forEach(cell => {\n tooltip_link(cell, showFinalPersonnelCost);\n });\n}\nfunction linkTotalOTCol() {\n // get all relevant cells\n document.querySelectorAll('td.total').forEach(cell => {\n tooltip_link(cell, showFICA);\n });\n}\nfunction linkCPACol() {\n // get all relevant cells\n document.querySelectorAll('td.cpa').forEach(cell => {\n tooltip_link(cell, showCPA);\n });\n}\nconst Tooltip = {\n hide: hideTooltip,\n show: showTooltip,\n linkAll: () => {\n linkAccountStringCol();\n switch (current_page.load()) {\n case 'personnel':\n // linkAccountStringCol();\n linkSalaryCol();\n linkTotalPersonnelCostCol();\n break;\n case 'overtime':\n linkTotalOTCol();\n // linkAccountStringCol();\n break;\n case 'nonpersonnel':\n // linkAccountStringCol();\n linkCPACol();\n break;\n // case 'revenue':\n // linkAccountStringCol();\n // break;\n // case 'new-inits':\n // linkAccountStringCol();\n // break;\n default:\n break;\n }\n },\n unlink: function () {\n let details = document.querySelectorAll('.detail');\n details.forEach(span => {\n span.remove();\n });\n }\n};\n/* harmony default export */ const components_tooltip_tooltip = (Tooltip);\n;// CONCATENATED MODULE: ./src/js/utils/JSON_data_handlers.js\nasync function fetchJSON(jsonFilePath) {\n return fetch(jsonFilePath).then(response => {\n if (!response.ok) {\n throw new Error('Network response was not ok');\n }\n return response.json();\n });\n}\nfunction convertToJSON(table, colsToRemove = []) {\n const rows = table.rows;\n // Extract headers from the first row\n const headerRow = rows[0].cells;\n const headers = [];\n for (let j = 0; j < headerRow.length; j++) {\n headers.push(headerRow[j].innerText);\n }\n\n // initialize data\n var tableData = [];\n for (var i = 1; i < rows.length; i++) {\n const cols = rows[i].cells;\n const rowData = {};\n headers.forEach((header, index) => {\n if (colsToRemove.includes(header)) {\n return;\n } else if (cols[index].classList.contains('cost')) {\n rowData[header] = cols[index].getAttribute('value');\n } else {\n rowData[header] = cols[index].innerText;\n }\n });\n tableData.push(rowData);\n }\n return JSON.stringify(tableData);\n}\n;// CONCATENATED MODULE: ./src/js/components/table/table.js\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction adjustTableWidth(width_pct) {\n const table = document.getElementById('main-table');\n table.style.width = width_pct;\n}\nfunction showTable() {\n const tableContainer = document.querySelector('.table-container');\n tableContainer.innerHTML = Table.html;\n const table = document.getElementById('main-table');\n table.style.display = 'table';\n}\nfunction hideTable() {\n // delete table object from table container\n const tableContainer = document.querySelector('.table-container');\n tableContainer.innerHTML = '';\n subcomponents_buttons.AddRow.hide();\n}\nfunction saveTableData() {\n // remove the detail text\n components_tooltip_tooltip.unlink();\n // get table\n var table = document.getElementById('main-table');\n // determine save_as name\n if (current_fund.number()) {\n var save_as = `${current_page.load()}_${current_fund.number()}`;\n } else {\n var save_as = current_page.load();\n }\n localStorage.setItem(save_as, convertToJSON(table, ['Edit']));\n // update sidebar with new data\n components_sidebar_sidebar.updateTotals();\n // relink, depending on page\n components_tooltip_tooltip.linkAll();\n}\nconst Table = {\n html: `\n
\n \n \n
`,\n Buttons: subcomponents_buttons,\n Cell: cells,\n Columns: columns,\n Header: headers,\n Rows: rows,\n Data: data,\n Filter: filters,\n // functions\n adjustWidth: function (width_pct) {\n adjustTableWidth(width_pct);\n },\n clear: hideTable,\n hide: hideTable,\n show: showTable,\n save: saveTableData\n};\n/* harmony default export */ const components_table_table = (Table);\n;// CONCATENATED MODULE: ./src/js/components/accordion/accordion.js\n\n\n\n\n\nfunction redirectForEdit() {\n const row = document.querySelector(`.active-editing`);\n const table = row.parentElement;\n const section = table.closest('.summary-container');\n // new initiative edits should all redirect to the new-inits page\n if (section.id == 'supp-accordion') {\n visitPage('new-inits');\n } else {\n // Split the string into parts using '-' as the delimiter; retain fund as 1st numeric segment\n const fund = table.id.split('-')[1];\n current_fund.update(fund);\n const lineItem = row.querySelector('.line-item').textContent;\n // visit the correct page for editing\n switch (lineItem) {\n case 'Personnel Expenditures':\n visitPage('personnel');\n break;\n case 'Non-Personnel Expenditures':\n visitPage('nonpersonnel');\n break;\n case 'Revenues':\n visitPage('revenue');\n break;\n case 'Overtime Expenditures':\n visitPage('overtime');\n break;\n default:\n console.error('Name of line item in table does not match a page destination.');\n }\n }\n}\nconst ExpenseTable = {\n table_id: account_string => {\n return `table-${account_string}`;\n },\n init(account_string) {\n // create empty table and put it in the accordion\n var table = document.createElement('table');\n table.id = this.table_id(account_string);\n table.classList.add('accordion-table');\n var parent = document.querySelector(`#string_${account_string}_content .accordion-body`);\n parent.appendChild(table);\n },\n createNewCell(content, row, className) {\n const newCell = document.createElement('td');\n newCell.innerHTML = content;\n newCell.classList.add(className);\n row.appendChild(newCell);\n },\n addRow(account_string, row_name, number) {\n var table = document.getElementById(this.table_id(account_string));\n var new_row = document.createElement('tr');\n table.appendChild(new_row);\n // Create a cell for the line item label\n this.createNewCell(row_name, new_row, 'line-item');\n // create a cell for the amount\n this.createNewCell(formatCurrency(number), new_row, 'cost');\n // create Edit button \n var button = '';\n if (row_name != 'Net Expenditures (Revenues)') {\n button = components_table_table.Buttons.Edit.html;\n }\n this.createNewCell(button, new_row);\n },\n fillFromFund(fund) {\n // use just fund as account string to initialize table inside accordion\n this.init(fund);\n const fundObject = new models_fund(fund);\n\n // Add a row for each appropriation in the fund\n const id = cleanString(fund);\n fundObject.getAppropriations().forEach(appropObj => {\n // if the total for the appropriation is > $0, add an accordion for all the CCs\n if (appropObj.total() != 0) {\n Item.add(appropObj.accountString(), `#string_${id}_content .accordion-body`);\n Item.updateHeader(appropObj.name(), appropObj.accountString(), appropObj.total());\n this.fillFromApprop(appropObj);\n }\n });\n },\n fillFromApprop(appropObj) {\n // initialize the table object\n this.init(appropObj.accountString());\n // add a collapsible row for each cost center\n appropObj.getCostCenters().forEach(ccObj => {\n if (ccObj.getTotal() != 0) {\n Item.add(ccObj.accountString(), `#string_${appropObj.accountString()}_content .accordion-body`);\n Item.updateHeader(ccObj.getName(), ccObj.accountString(), ccObj.getTotal());\n this.fillFromCC(ccObj);\n }\n });\n },\n fillFromCC(ccObj) {\n // initialize a table and summarize the line items\n this.init(ccObj.accountString());\n this.addRow(ccObj.accountString(), 'Personnel Expenditures', ccObj.getPersonnelCost());\n this.addRow(ccObj.accountString(), 'Overtime Expenditures', ccObj.getOvertimeCost());\n this.addRow(ccObj.accountString(), 'Non-Personnel Expenditures', ccObj.getNonPersonnelCost());\n this.addRow(ccObj.accountString(), 'Revenues', ccObj.getRevenue());\n this.addRow(ccObj.accountString(), 'Net Expenditures (Revenues)', ccObj.getTotal());\n },\n fillFromInit(program) {\n // Fill out info for each supplemental init\n this.init(program.id());\n this.addRow(program.id(), 'Estimated Revenue', program.revenue());\n this.addRow(program.id(), 'Personnel Expenditures', program.personnel());\n this.addRow(program.id(), 'Non-Personnel Operating', program.operating());\n this.addRow(program.id(), 'Non-Personnel Capital', program.capital());\n this.addRow(program.id(), 'Total Expenditures', program.total());\n }\n};\nconst Item = {\n accountString(fund, approp = '', cc = '') {\n var account_string = cleanString(fund);\n if (approp) {\n account_string += approp;\n }\n ;\n if (cc) {\n account_string += cc;\n }\n ;\n return account_string;\n },\n html(account_string) {\n return `
\n \n
\n
\n \n
`;\n },\n add: function (account_string, accordion_query) {\n // get accordion and add a new item to it\n const parent = document.querySelector(accordion_query);\n const item_element = document.createElement('div');\n item_element.classList.add('accordion-item');\n item_element.innerHTML = this.html(account_string);\n parent.appendChild(item_element);\n },\n ExpenseTable: ExpenseTable,\n updateHeader: function (title, account_string, new_amount) {\n const header_btn = document.querySelector(`#string_${account_string}_header button`);\n header_btn.querySelector('span.name').textContent = title;\n header_btn.querySelector('span.amount').textContent = formatCurrency(new_amount);\n }\n};\nconst AddInitButton = {\n init() {\n const btn = document.querySelector('.btn-add-init');\n btn.addEventListener('click', function () {\n visitPage('new-inits');\n });\n }\n};\nconst Accordion = {\n Item: Item,\n AddInitButton: AddInitButton,\n hide: function () {\n document.querySelector('#accordion-div').style.display = 'none';\n // reset to delete content\n document.querySelector('#baseline-accordion .summary-accordion').innerHTML = '';\n document.querySelector('#supp-accordion .summary-accordion').innerHTML = '';\n },\n show: function () {\n document.querySelector('#accordion-div').style.display = 'block';\n },\n async createBaseline() {\n var funds = fund_lookup_table.listFunds();\n funds.forEach(fund => {\n Item.add(fund, '#baseline-accordion .summary-accordion');\n Item.ExpenseTable.fillFromFund(fund);\n const fundObject = new models_fund(fund);\n Item.updateHeader(`Fund ${fund_lookup_table.getName(fund)}`, fund, fundObject.getTotal());\n });\n\n // color-code GF baseline\n const GF = new models_fund(1000);\n // text to color code\n let topline = document.querySelector('#string_1000_header .amount');\n if (GF.getTotal() <= models_baseline.target()) {\n topline.style.color = 'green';\n topline.style.weight = 4;\n } else {\n topline.style.color = 'red';\n }\n },\n createSupp() {\n const supp = new supplemental();\n supp.initiatives.forEach(program => {\n Item.add(program.id(), '#supp-accordion .summary-accordion');\n Item.ExpenseTable.fillFromInit(program);\n Item.updateHeader(program.name, program.id(), program.total());\n });\n },\n updateTopLines() {\n // adjuse baseline\n // const baseline = new Baseline;\n const baseline = new models_baseline();\n const baselineAmount = document.querySelector('#baseline-title .top-line-amount');\n baselineAmount.textContent = formatCurrency(baseline.total());\n // adjust supplementals\n const supp = new supplemental();\n const suppAmount = document.querySelector('#supp-title .top-line-amount');\n suppAmount.textContent = formatCurrency(supp.total());\n },\n build() {\n this.createBaseline();\n this.createSupp();\n // initialize edit buttons\n components_table_table.Buttons.Edit.init(redirectForEdit);\n this.AddInitButton.init();\n this.updateTopLines();\n }\n};\n/* harmony default export */ const components_accordion_accordion = (Accordion);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/file_upload/file_upload.css\nvar file_upload = __webpack_require__(39);\n;// CONCATENATED MODULE: ./src/js/components/file_upload/file_upload.css\n\n \n \n \n \n \n \n \n \n \n\nvar file_upload_options = {};\n\nfile_upload_options.styleTagTransform = (styleTagTransform_default());\nfile_upload_options.setAttributes = (setAttributesWithoutAttributes_default());\nfile_upload_options.insert = insertBySelector_default().bind(null, \"head\");\nfile_upload_options.domAPI = (styleDomAPI_default());\nfile_upload_options.insertStyleElement = (insertStyleElement_default());\n\nvar file_upload_update = injectStylesIntoStyleTag_default()(file_upload/* default */.A, file_upload_options);\n\n\n\n\n /* harmony default export */ const file_upload_file_upload = (file_upload/* default */.A && file_upload/* default */.A.locals ? file_upload/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/file_upload/file_upload.js\n// file_upload.js\n\n\n\nconst FileUpload = {\n init: function () {\n components_nav_buttons_nav_buttons.Next.disable();\n const inputObject = document.getElementById('file-input');\n inputObject.addEventListener('change', function (event) {\n readXL(event);\n });\n },\n show: function () {\n const inputObject = document.getElementById('file-input');\n inputObject.style.display = '';\n },\n hide: function () {\n const inputObject = document.getElementById('file-input');\n inputObject.style.display = 'none';\n }\n};\nfunction readXL(event) {\n const file = event.target.files[0]; // read uploaded file\n const spinner = document.getElementById('upload-spinner'); // get the spinner element\n\n if (file) {\n // Show the spinner\n spinner.style.display = 'block';\n\n // read in new data\n const reader = new FileReader();\n reader.onload = function (e) {\n const arrayBuffer = e.target.result;\n try {\n processWorkbook(arrayBuffer);\n\n // Hide the spinner once processing is done\n spinner.style.display = 'none';\n components_nav_buttons_nav_buttons.Next.enable(); // Enable the next button after processing\n } catch (error) {\n console.error('Error processing workbook:', error);\n\n // Hide the spinner in case of an error\n spinner.style.display = 'none';\n components_nav_buttons_nav_buttons.Next.enable(); // Ensure the button is re-enabled in case of an error\n }\n };\n reader.onerror = function (err) {\n console.error('Error reading file:', err);\n\n // Hide the spinner in case of an error\n spinner.style.display = 'none';\n components_nav_buttons_nav_buttons.Next.enable(); // Ensure the button is re-enabled in case of an error\n };\n reader.readAsArrayBuffer(file); // Read the file as an ArrayBuffer\n }\n}\n/* harmony default export */ const components_file_upload_file_upload = (FileUpload);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/modal/modal.css\nvar modal = __webpack_require__(95);\n;// CONCATENATED MODULE: ./src/js/components/modal/modal.css\n\n \n \n \n \n \n \n \n \n \n\nvar modal_options = {};\n\nmodal_options.styleTagTransform = (styleTagTransform_default());\nmodal_options.setAttributes = (setAttributesWithoutAttributes_default());\nmodal_options.insert = insertBySelector_default().bind(null, \"head\");\nmodal_options.domAPI = (styleDomAPI_default());\nmodal_options.insertStyleElement = (insertStyleElement_default());\n\nvar modal_update = injectStylesIntoStyleTag_default()(modal/* default */.A, modal_options);\n\n\n\n\n /* harmony default export */ const modal_modal = (modal/* default */.A && modal/* default */.A.locals ? modal/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/modal/modal.js\n\nfunction clearModal() {\n updateModalTitle('');\n document.getElementById('modal-body').innerHTML = '';\n}\nfunction hideModal() {\n $('#main-modal').modal('hide');\n}\nfunction showModal() {\n $('#main-modal').modal('show');\n}\nfunction showModalHandler() {\n showModal('main-modal');\n}\nconst Submit = {\n handler: null,\n init: function (onSubmit) {\n const modal = document.getElementById('main-modal');\n\n // Deinitialize first to avoid multiple bindings\n this.deinit();\n this.handler = function (event) {\n event.preventDefault();\n onSubmit(event);\n };\n\n // Adding the handler as the event listener\n modal.addEventListener('submit', this.handler);\n\n // add event listener to enable close x\n const x = modal.querySelector('#modal-close-x');\n x.addEventListener('click', hideModal);\n },\n deinit: function () {\n const modal = document.getElementById('main-modal');\n if (this.handler !== null) {\n // Removing the event listener and clear the handler\n modal.removeEventListener('submit', this.handler);\n this.handler = null;\n }\n\n // remove event listener to enable close x\n const x = modal.querySelector('#modal-close-x');\n x.removeEventListener('click', hideModal);\n }\n};\nconst Link = {\n add: function (button_id) {\n document.getElementById(button_id).addEventListener('click', showModalHandler);\n },\n remove: function (button_id) {\n document.getElementById(button_id).removeEventListener('click', showModalHandler);\n }\n};\nfunction updateModalTitle(title) {\n document.getElementById('modal-title').textContent = title;\n}\nconst Title = {\n update: function (title) {\n updateModalTitle(title);\n }\n};\nconst Modal = {\n hide: hideModal,\n show: showModal,\n clear: clearModal,\n Title: Title,\n Link: Link,\n Submit: Submit\n};\n/* harmony default export */ const components_modal_modal = (Modal);\n;// CONCATENATED MODULE: ./src/js/components/body/body.js\n\n\n\n\n\n\n\n\n\n\nfunction resetPage() {\n // hide everything in the body\n components_welcome_welcome.hide();\n components_modal_modal.clear();\n components_modal_modal.hide();\n components_nav_buttons_nav_buttons.hide();\n js_components_prompt_prompt.hide();\n components_table_table.hide();\n components_sidebar_sidebar.hide();\n components_accordion_accordion.hide();\n components_file_upload_file_upload.hide();\n components_tooltip_tooltip.hide();\n\n // reset filter dropdowns\n components_table_table.Filter.deleteAll();\n js_components_prompt_prompt.Buttons.reset();\n // disable submit button\n components_modal_modal.Submit.deinit();\n}\nconst Body = {\n reset: resetPage\n};\n/* harmony default export */ const components_body_body = (Body);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/header/header.css\nvar header = __webpack_require__(107);\n;// CONCATENATED MODULE: ./src/js/components/header/header.css\n\n \n \n \n \n \n \n \n \n \n\nvar header_options = {};\n\nheader_options.styleTagTransform = (styleTagTransform_default());\nheader_options.setAttributes = (setAttributesWithoutAttributes_default());\nheader_options.insert = insertBySelector_default().bind(null, \"head\");\nheader_options.domAPI = (styleDomAPI_default());\nheader_options.insertStyleElement = (insertStyleElement_default());\n\nvar header_update = injectStylesIntoStyleTag_default()(header/* default */.A, header_options);\n\n\n\n\n /* harmony default export */ const header_header = (header/* default */.A && header/* default */.A.locals ? header/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/header/header.js\n\n\n\nconst header_Title = {\n update: function (title) {\n document.getElementById(\"title\").textContent = title;\n },\n default() {\n this.update(`FY${FISCAL_YEAR} Budget Request`);\n }\n};\nconst Subtitle = {\n update: function (subtitle) {\n // get current fund\n var fund = current_fund.name();\n if (fund) {\n var subtitle = `${subtitle}: ${fund}`;\n }\n document.getElementById(\"subtitle\").textContent = subtitle;\n }\n};\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/form/form.css\nvar form_form = __webpack_require__(109);\n;// CONCATENATED MODULE: ./src/js/components/form/form.css\n\n \n \n \n \n \n \n \n \n \n\nvar form_options = {};\n\nform_options.styleTagTransform = (styleTagTransform_default());\nform_options.setAttributes = (setAttributesWithoutAttributes_default());\nform_options.insert = insertBySelector_default().bind(null, \"head\");\nform_options.domAPI = (styleDomAPI_default());\nform_options.insertStyleElement = (insertStyleElement_default());\n\nvar form_update = injectStylesIntoStyleTag_default()(form_form/* default */.A, form_options);\n\n\n\n\n /* harmony default export */ const components_form_form = (form_form/* default */.A && form_form/* default */.A.locals ? form_form/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/form/subcomponents/fields.js\n// function to add questions to forms\n\n\n\n// inputType is for validation ('number' or 'text', etc)\nfunction appendFormElement(label, inputEl, inputId, required) {\n // change if we want forms elsewhere\n const form = document.getElementById('new-form');\n\n // create outer wrapper for element\n const wrapper = document.createElement('div');\n\n // label question\n const labelEl = document.createElement('label');\n labelEl.textContent = label;\n\n // mark as required if applicable\n inputEl.required = required;\n\n // If an ID is provided, set it on the element\n if (inputId) {\n //inputEl.id = `input-${inputId}`;\n inputEl.id = inputId;\n }\n\n // create validation text/ a place to display errors\n const validationText = document.createElement('p');\n validationText.id = `${inputId}-validation`;\n validationText.classList.add('error-message');\n validationText.style.color = 'red';\n\n // add elements\n wrapper.appendChild(labelEl);\n wrapper.appendChild(inputEl);\n wrapper.appendChild(validationText);\n form.appendChild(wrapper);\n}\nconst NewField = {\n shortText: function (label, inputId, required = false) {\n const inputEl = document.createElement('input');\n inputEl.type = 'text';\n appendFormElement(label, inputEl, inputId, required);\n },\n longText: function (label, inputId, required = false) {\n const inputEl = document.createElement('textarea');\n appendFormElement(label, inputEl, inputId, required);\n },\n numericInput: function (label, inputId, required = false) {\n const inputEl = document.createElement('input');\n inputEl.type = 'number';\n appendFormElement(label, inputEl, inputId, required);\n },\n dropdown: function (label, inputId, optionArray, required = false) {\n var inputEl = subcomponents_dropdown.create(optionArray);\n appendFormElement(label, inputEl, inputId, required);\n }\n};\n/* harmony default export */ const fields = (NewField);\n;// CONCATENATED MODULE: ./src/js/components/form/subcomponents/submit.js\nfunction addSubmitButtonToForm(form_id) {\n // Find the form by its ID\n const form = document.getElementById(form_id);\n\n // Create the container `div` for the button\n const buttonContainer = document.createElement('div');\n buttonContainer.id = 'submit-btn-container';\n\n // Create the submit input\n const submitInput = document.createElement('input');\n submitInput.className = 'btn btn-submit'; // Use appropriate class for your design\n submitInput.type = 'submit';\n submitInput.value = 'Submit';\n\n // Append the submit input to the container\n buttonContainer.appendChild(submitInput);\n\n // Append the container to the form\n form.appendChild(buttonContainer);\n}\nconst SubmitButton = {\n add: function () {\n addSubmitButtonToForm('new-form');\n }\n};\n/* harmony default export */ const subcomponents_submit = (SubmitButton);\n;// CONCATENATED MODULE: ./src/js/components/form/form.js\n\n\n\n\nfunction fetchAllResponses(event) {\n // Assuming `event.target` is the form itself\n const form = event.target;\n\n // Initialize an empty array to hold the input values\n let formData = {};\n\n // Loop through each form element\n for (let i = 0; i < form.elements.length; i++) {\n const element = form.elements[i];\n\n // Exclude elements that aren't inputs, textareas, or select\n if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA' || element.tagName === 'SELECT') {\n // Exclude input types that are not considered for submission (such as `submit`)\n if (element.type !== 'submit' && element.type !== 'button') {\n formData[element.id] = element.value;\n }\n }\n }\n form.reset();\n return formData;\n}\nfunction addForm(element_id = 'modal-body', form_id = 'new-form') {\n const target_elem = document.getElementById(element_id);\n\n // create form\n const form = document.createElement('form');\n form.setAttribute('id', form_id);\n\n // Append the form to the modal body\n target_elem.appendChild(form);\n}\nconst Form = {\n new: function (parent_elem_id) {\n addForm(parent_elem_id, 'new-form');\n },\n fetchAllResponses: function (event) {\n return fetchAllResponses(event);\n },\n NewField: fields,\n Dropdown: subcomponents_dropdown,\n SubmitButton: subcomponents_submit\n};\n/* harmony default export */ const js_components_form_form = (Form);\n;// CONCATENATED MODULE: ./src/js/views/view_class.js\n\n\n\n\n\n\n\n\n\nclass View {\n constructor() {\n // page state in local storage\n this.page_state = '';\n\n // whether to display\n this.navButtons = true;\n this.sidebar = true;\n\n // text to show in the prompt area\n this.prompt = null;\n\n // subtitle text\n this.subtitle = '';\n\n // table object of class ViewTable or null\n this.table = null;\n }\n visit() {\n // update page state\n current_page.update(this.page_state);\n\n // start with a blank page\n components_body_body.reset();\n\n // add default title\n header_Title.default();\n\n // default to showing navbuttons\n if (this.navButtons) {\n components_nav_buttons_nav_buttons.show();\n }\n ;\n\n // default to showing sidebar\n if (this.sidebar) {\n components_sidebar_sidebar.show();\n }\n ;\n\n // initialize prompt text and buttons\n if (this.prompt) {\n js_components_prompt_prompt.Text.update(this.prompt);\n }\n ;\n\n // initialize table\n if (this.table) {\n this.table.build();\n }\n\n // show page subtitle\n if (this.subtitle) {\n Subtitle.update(this.subtitle);\n }\n ;\n }\n cleanup() {\n return;\n }\n}\nclass ViewTable {\n constructor() {\n // Ensure methods retain the correct `this` context\n this.submitNewRow = this.submitNewRow.bind(this);\n this.columns = [{\n title: 'Account String',\n className: 'account-string'\n }, {\n title: 'Appropriation Name',\n className: 'approp-name',\n hide: true\n }, {\n title: 'Appropriation',\n className: 'approp',\n hide: true\n }, {\n title: 'Cost Center Name',\n className: 'cc-name',\n hide: true\n }, {\n title: 'Cost Center',\n className: 'cc',\n hide: true\n }, {\n title: 'Fund Name',\n className: 'fund-name',\n hide: true\n }, {\n title: 'Fund',\n className: 'fund',\n hide: true\n }, {\n title: 'Edit',\n className: 'edit'\n }];\n\n // whether to add an edit column\n this.addEdit = true;\n\n // message to show if there's no saved data\n this.noDataMessage = null;\n\n // text to show for new row button\n this.addButtonText = null;\n\n // whether to show as a datatable\n this.dataTable = true;\n }\n async refreshData() {\n // check for data\n await components_table_table.Data.load();\n\n // create a datatable object\n if (this.dataTable) {\n this.initDataTable();\n }\n\n // add an edit column if needed\n if (this.addEdit) {\n components_table_table.Columns.addAtEnd(components_table_table.Buttons.edit_confirm_btns, 'Edit');\n // activate edit buttons\n components_table_table.Buttons.Edit.init(this.actionOnEdit, this.updateTable);\n }\n\n // assign the correct classes based on the table columns\n components_table_table.Columns.assignClasses(this.columns);\n\n // Apply any update function to make sure sidebar is up to date\n this.updateTable();\n // add any newly created cc or approp to the filters\n this.updateFilters();\n }\n async build() {\n // build table from local storage and initialize edit buttons\n\n // add the add new row button if needed\n if (this.addButtonText) {\n this.setUpForm();\n }\n\n // check for data\n if (await components_table_table.Data.load()) {\n // if there's data, update the table and add filters \n this.addFilters();\n await this.refreshData();\n } else {\n // show a message if there's no saved table data for the selected fund\n if (this.noDataMessage) {\n js_components_prompt_prompt.Text.update(this.noDataMessage);\n }\n }\n }\n addFilters() {\n // Add all relevant filters to table\n if (this.columns.some(column => column.className === 'approp-name')) {\n components_table_table.Filter.add('Appropriation', 'approp-name');\n }\n if (this.columns.some(column => column.className === 'cc-name')) {\n components_table_table.Filter.add('Cost Center', 'cc-name');\n }\n if (this.columns.some(column => column.className === 'object-name')) {\n components_table_table.Filter.add('Object', 'object-name');\n }\n ;\n if (this.columns.some(column => column.className === 'object-category')) {\n components_table_table.Filter.add('Object Category', 'object-category');\n }\n }\n updateFilters() {\n // update filters with any new values\n if (this.columns.some(column => column.className === 'approp-name')) {\n components_table_table.Filter.updateOptions('Appropriation', 'approp-name');\n }\n if (this.columns.some(column => column.className === 'cc-name')) {\n components_table_table.Filter.updateOptions('Cost Center', 'cc-name');\n }\n if (this.columns.some(column => column.className === 'object-name')) {\n components_table_table.Filter.updateOptions('object-name');\n }\n ;\n if (this.columns.some(column => column.className === 'object-category')) {\n components_table_table.Filter.updateOptions('object-category');\n }\n }\n initDataTable() {\n components_table_table.adjustWidth('100%');\n // Initialize Datatables\n if (!$.fn.dataTable.isDataTable('#main-table')) {\n $('#main-table').DataTable({\n paging: false,\n // Disable pagination\n info: false,\n // Disable table information display\n searching: false // Disable the search bar\n });\n }\n ;\n }\n\n // placeholder for action on row edit click\n actionOnEdit() {\n return;\n }\n\n // update function for the sidebar; default to just saving the table\n updateTable() {\n components_table_table.save();\n }\n\n // extra questions of the form to add a new row\n addCustomQuestions() {\n return;\n }\n addValidationListener(inputId, fieldLabel, validationId, length) {\n const inputElement = document.getElementById(inputId);\n inputElement.addEventListener('change', function () {\n if (inputElement.value === 'Add new') {\n // Add a new field after the selected element\n js_components_form_form.NewField.shortText(`Type new ${fieldLabel}:`, inputId.slice(0, -5), true);\n let newInputElement = document.getElementById(inputId.slice(0, -5)); // Remove '-name' suffix\n inputElement.parentElement.insertAdjacentElement('afterend', newInputElement.parentElement);\n\n // Add an event listener for validation on the new input field\n newInputElement.addEventListener('blur', function () {\n let validationText = document.getElementById(validationId);\n validationText.textContent = '';\n if (newInputElement.value.length !== length) {\n validationText.textContent = `${fieldLabel} codes must be exactly ${length} numbers.`;\n } else if (isNaN(Number(newInputElement.value))) {\n validationText.textContent = `${fieldLabel} codes must be numeric.`;\n }\n });\n } else {\n // Remove the new input field if 'Add new' is not selected\n let newInputElement = document.getElementById(inputId.slice(0, -5));\n if (newInputElement) {\n newInputElement.parentElement.innerHTML = '';\n }\n }\n });\n }\n\n // Modified addModalValidation method\n addModalValidation() {\n this.addValidationListener('approp-name', 'Appropriation', 'approp-validation', 5);\n this.addValidationListener('cc-name', 'Cost Center', 'cc-validation', 6);\n }\n setUpForm() {\n // show add button\n components_table_table.Buttons.AddRow.show();\n components_table_table.Buttons.AddRow.updateText(this.addButtonText);\n\n // set up modal for form when add button is pressed\n components_modal_modal.clear();\n components_modal_modal.Link.add('add-btn');\n components_modal_modal.Title.update(this.addButtonText);\n\n // create form\n js_components_form_form.new('modal-body');\n\n // add custom questions\n this.addCustomQuestions();\n // any validation or special functions\n this.addModalValidation();\n // add submit button\n js_components_form_form.SubmitButton.add();\n\n // Initialize form submission to table data\n components_modal_modal.Submit.init(this.submitNewRow);\n }\n editColumns(responses) {\n // if a new appropriation was entered, fix it\n if (responses['approp']) {\n responses['approp-name'] = `${responses['approp']} - New`;\n }\n ;\n // same for cost center\n if (responses['cc']) {\n responses['cc-name'] = `${responses['cc']} - New`;\n }\n ;\n\n // get numbers from account string names\n if (responses['fund-name']) {\n responses['fund'] = account_string.getNumber(responses['fund-name']);\n }\n ;\n if (responses['approp-name']) {\n responses['approp'] = account_string.getNumber(responses['approp-name']);\n }\n ;\n if (responses['cc-name']) {\n responses['cc'] = account_string.getNumber(responses['cc-name']);\n }\n ;\n if (responses['object-name']) {\n responses['object'] = account_string.getNumber(responses['object-name']);\n }\n ;\n responses['account-string'] = account_string.build(responses['approp-name'], responses['cc-name'], responses['object-name'], responses['fund']);\n return responses;\n }\n submitNewRow(event) {\n // get answers from form, hide form, show answers in table\n var responses = js_components_form_form.fetchAllResponses(event);\n\n // edit inputs from modal\n responses = this.editColumns(responses);\n\n // make sure it's not an empty response\n if (Object.values(responses)[0] != '') {\n // change page view\n components_modal_modal.hide();\n\n // add data to table\n components_table_table.Rows.add(responses, this.columns);\n components_table_table.save();\n\n // rebuild table\n this.refreshData();\n }\n }\n}\n;// CONCATENATED MODULE: ./src/js/views/00_welcome.js\n\n\n\n\nclass WelcomeView extends View {\n constructor() {\n super();\n this.page_state = 'welcome';\n this.subtitle = 'Welcome';\n this.sidebar = false;\n this.navButtons = false;\n this.prompt = `This tool will help you prepare your budget request submission for fiscal year \n 20${FISCAL_YEAR}. Start by uploading the detail sheet sent to you by your budget analyst. This\n tool will use the data in that sheet to pre-fill your submission with last year's request.\n
\n Then, you will be guided through each fund to make any adjustments from last year's request. \n As you \n make these adjustments, you will see a sidebar tracking your total expenditures by fund and your target\n baseline for the general fund. \n
\n Once you get through all funds and set your request at or below the \n target, you will be able to download a filled version of the Excel detail sheet. Downloading \n this file is the only permanent way to save your progress.`;\n }\n visit() {\n super.visit();\n\n // show welcome section\n components_welcome_welcome.show();\n\n // initialize links in buttons\n document.getElementById('step-upload').addEventListener('click', () => visitPage('upload'));\n // document.getElementById('step-initiatives').addEventListener('click', () => visitPage('new-inits'));\n // document.getElementById('step-revenue').addEventListener('click', () => visitPage('baseline-landing'));\n // document.getElementById('step-finish').addEventListener('click', () => visitPage('summary'));\n }\n}\n/* harmony default export */ const _00_welcome = (WelcomeView);\n;// CONCATENATED MODULE: ./src/js/views/01_upload.js\n\n\nclass UploadView extends View {\n constructor() {\n super();\n this.page_state = 'upload';\n this.prompt = `Upload the baseline detail sheet given by your budget analyst.`;\n this.subtitle = 'Excel Upload';\n this.sidebar = false;\n }\n visit() {\n super.visit();\n components_file_upload_file_upload.show();\n components_file_upload_file_upload.init();\n }\n}\n/* harmony default export */ const _01_upload = (UploadView);\n;// CONCATENATED MODULE: ./src/js/views/02_baseline_landing.js\n\n\n\n\nclass FundView extends View {\n constructor() {\n super();\n this.page_state = 'baseline-landing';\n this.prompt = `We will now ask you a series of questions about your BASELINE budget request.\n At the end, we will ask you about any new initiatives (ie. supplemental requests).\n Select one of your funds then click continue.`;\n this.subtitle = 'Baseline Budget Request';\n this.table = new FundTable();\n this.sidebar = false;\n this.dataTable = false;\n }\n visit() {\n // remove fund selection\n localStorage.setItem(\"fund\", '');\n super.visit();\n }\n}\nclass FundTable extends ViewTable {\n constructor() {\n super();\n\n // add additional revenue columns to the table\n this.columns = [{\n title: 'Fund',\n className: 'fund-name'\n }];\n this.noDataMessage = 'No funds found.';\n this.addEdit = false;\n }\n build() {\n // load in fund data\n components_table_table.show();\n components_table_table.Data.loadFunds();\n components_table_table.Columns.assignClasses(this.columns);\n components_table_table.adjustWidth('30%');\n\n // disable next button until a fund is selected\n components_nav_buttons_nav_buttons.Next.disable();\n allowRowSelection();\n }\n}\nfunction allowRowSelection() {\n var tableRows = document.querySelectorAll(\"tbody tr\");\n\n // enable highlight on hover and on select\n tableRows.forEach(function (row) {\n row.addEventListener('mouseover', function () {\n this.classList.add('hover-effect');\n });\n row.addEventListener('mouseout', function () {\n this.classList.remove('hover-effect');\n });\n row.addEventListener('click', function () {\n selectFund(tableRows, this);\n });\n });\n}\nfunction selectFund(tableRows, selected_row) {\n // remove selected class from any other rows\n tableRows.forEach(function (tableRow) {\n tableRow.classList = '';\n });\n\n // add selected class to clicked row\n selected_row.classList.add('selected');\n\n // get fund and save selected fund\n var fund = selected_row.querySelector('.fund-name').textContent;\n var fundNumber = parseInt(fund);\n current_fund.update(fundNumber);\n\n // enable next step\n components_nav_buttons_nav_buttons.Next.enable();\n}\n/* harmony default export */ const _02_baseline_landing = (FundView);\n;// CONCATENATED MODULE: ./src/js/views/03_revenue.js\n\n\nclass RevenueView extends View {\n constructor(fiscal_year) {\n super();\n this.page_state = 'revenue';\n this.prompt = `Review and edit revenue line items. If you change the estimate or \n notice an error in an account string, please note it in the notes column. Click edit \n to change values in a row.`;\n this.subtitle = 'Revenues';\n this.table = new RevenueTable(fiscal_year);\n }\n}\nclass RevenueTable extends ViewTable {\n constructor(fiscal_year) {\n super();\n\n // add additional revenue columns to the table\n this.columns = this.columns.concat([{\n title: 'Recurring or One-Time',\n className: 'recurring'\n }, {\n title: 'Object Category',\n className: 'object-category'\n }, {\n title: `FY${fiscal_year} Departmental Estimate`,\n className: 'request',\n isCost: true\n }, {\n title: 'Departmental Estimate Notes',\n className: 'notes'\n },\n // hidden\n {\n title: 'Object Name',\n className: 'object-name',\n hide: true\n }, {\n title: 'Object',\n className: 'object',\n hide: true\n }]);\n this.noDataMessage = 'No revenues for this fund.';\n }\n\n // action on row edit click: make cells editable\n actionOnEdit() {\n // only allow edits in the notes box\n components_table_table.Cell.createTextbox('notes', false, 'textarea');\n }\n}\n/* harmony default export */ const _03_revenue = (RevenueView);\n;// CONCATENATED MODULE: ./src/js/views/04_personnel.js\n\n\n\n\n\n\n\nclass PersonnelView extends View {\n constructor(fiscal_year) {\n super();\n this.page_state = 'personnel';\n this.prompt = `\n This table displays the number of FTEs in each job code for in your department's \n current (amended) FY25 budget. To make edits to the number of positions, click the\n \"Edit\" button on the row you would like to edit. The \"Total Cost\" column and the \n summary sidebar will also update to reflect any edits.`;\n this.subtitle = 'Personnel';\n this.table = new PersonnelTable(fiscal_year);\n }\n}\nclass PersonnelTable extends ViewTable {\n constructor(fiscal_year) {\n super();\n this.fiscal_year = fiscal_year;\n // add additional personnel columns to the table\n this.columns = this.columns.concat([{\n title: 'Job Title',\n className: 'job-name'\n }, {\n title: 'Job Code',\n className: 'job-code'\n }, {\n title: 'Employee Type',\n className: 'employee-type'\n }, {\n title: 'Service',\n className: 'service'\n }, {\n title: `FY${this.fiscal_year} Requested FTE`,\n className: 'baseline-ftes'\n }, {\n title: `FY${this.fiscal_year} Projected Average Salary/Wage`,\n className: 'avg-salary',\n isCost: true\n }, {\n title: 'Total Sal/Wag & Ben Request',\n className: 'total-baseline',\n isCost: true\n }, {\n title: 'Departmental Request Notes',\n className: 'notes'\n },\n // hidden columns\n {\n title: 'Fringe Benefits Rate',\n className: 'fringe',\n hide: true\n }, {\n title: 'General Increase Rate',\n className: 'general-increase-rate',\n hide: true\n }, {\n title: 'Step/Merit Increase Rate',\n className: 'merit-increase-rate',\n hide: true\n }, {\n title: `Average Salary/Wage as of 9/1/20${this.fiscal_year - 2}`,\n className: 'current-salary',\n isCost: true,\n hide: true\n }]);\n this.noDataMessage = 'No personnel expenditures for this fund.';\n this.addButtonText = 'Add new job';\n }\n\n // action on row edit click: make cells editable\n actionOnEdit() {\n components_table_table.Cell.createTextbox('baseline-ftes');\n components_table_table.Cell.createServiceDropdown(services.list());\n components_table_table.Cell.createTextbox('notes', false, 'textarea');\n }\n updateTable() {\n // calculate for each row\n let rows = document.getElementsByTagName('tr');\n for (let i = 1; i < rows.length; i++) {\n // fetch values for calculations\n let avg_salary = components_table_table.Cell.getValue(rows[i], 'avg-salary');\n let fringe = parseFloat(components_table_table.Cell.getText(rows[i], 'fringe'));\n let baseline_ftes = components_table_table.Cell.getText(rows[i], 'baseline-ftes');\n\n // calcuate #FTEs x average salary + COLA adjustments + merit adjustments + fringe\n let total_baseline_cost = avg_salary * baseline_ftes * (1 + fringe);\n\n // update total column\n components_table_table.Cell.updateValue(rows[i], 'total-baseline', total_baseline_cost);\n }\n\n // Save the table after all updates are done\n components_table_table.save();\n }\n addCustomQuestions() {\n // form questions to add a new job\n js_components_form_form.NewField.shortText('Job Code:', 'job-code', true);\n js_components_form_form.NewField.shortText('Job Title:', 'job-name', true);\n js_components_form_form.NewField.dropdown('Employee Type:', 'employee-type', EMPLOYEE_TYPES, true), js_components_form_form.NewField.dropdown('Appropriation:', 'approp-name', fund_lookup_table.getApprops('Add new'), true);\n js_components_form_form.NewField.dropdown('Cost Center:', 'cc-name', fund_lookup_table.getCostCenters('Add new'), true);\n js_components_form_form.NewField.dropdown('Service', 'service', services.list(), true);\n js_components_form_form.NewField.shortText('Number of FTEs requested:', 'baseline-ftes', true);\n js_components_form_form.NewField.shortText(`Projected average salary IN FISCAL YEAR ${this.fiscal_year}:`, 'avg-salary', true);\n //Form.NewField.shortText(`Expected fringe rate (as a percentage)`, 'fringe', true);\n }\n addModalValidation() {\n super.addModalValidation();\n\n // lock the job description \n const jobDescription = document.getElementById('job-name');\n jobDescription.readOnly = true;\n // give a message if attempt to edit\n const nameValidationText = document.getElementById('job-name-validation');\n jobDescription.addEventListener('click', function () {\n nameValidationText.textContent = 'This field is not editable and will auto-fill from the job code above.';\n });\n // hide message on blur\n jobDescription.addEventListener('blur', function () {\n nameValidationText.textContent = '';\n });\n\n // confirm that entered job code is in the gold book\n const jobCodeInput = document.getElementById('job-code');\n jobCodeInput.addEventListener('blur', function () {\n // get entered job code\n const jobCode = jobCodeInput.value;\n // get validation text element\n const validationText = document.getElementById('job-code-validation');\n if (!gold_book.codeExists(jobCode)) {\n // if the job code doesn't exist, show an error message\n validationText.textContent = 'This job code does not exist in the current Gold Book. Please enter another code.';\n // and clear any previous entry in the job title \n jobDescription.value = '';\n } else {\n // if it does exist, change the job title accordingly\n jobDescription.value = gold_book.getTitle(jobCode);\n // and clear any error messages\n validationText.textContent = '';\n }\n });\n }\n editColumns(responses) {\n responses = super.editColumns(responses);\n // edit inputs from modal\n responses['avg-salary'] = unformatCurrency(responses['avg-salary']);\n // use gold book to look up info based on job code\n responses['job-name'] = gold_book.getTitle(responses['job-code']);\n responses['fringe'] = gold_book.getFringeRate(responses['job-code']);\n return responses;\n }\n}\n/* harmony default export */ const _04_personnel = (PersonnelView);\n;// CONCATENATED MODULE: ./src/js/views/05_overtime.js\n\n\n\n\n\n\nclass OvertimeView extends View {\n constructor(fiscal_year) {\n super();\n this.page_state = 'overtime';\n this.prompt = `\n Please see your baseline overtime / holiday pay / shift premiums in the table below.\n Make any edits and continue.`;\n this.subtitle = 'Overtime Estimates';\n this.table = new OvertimeTable(fiscal_year);\n }\n}\nclass OvertimeTable extends ViewTable {\n constructor(fiscal_year) {\n super();\n\n // add additional OT columns to the table\n this.columns = this.columns.concat([{\n title: 'Service',\n className: 'service'\n }, {\n title: 'Recurring or One-Time',\n className: 'recurring'\n }, {\n title: 'Departmental Request OT/SP/Hol',\n className: 'OT-pay',\n isCost: true\n }, {\n title: `FY${fiscal_year} Total OT/SP/Hol + FICA Request`,\n className: 'total',\n isCost: true\n }, {\n title: 'Object Name',\n className: 'object-name'\n }, {\n title: 'Departmental Request Notes',\n className: 'notes'\n },\n // hidden columns\n {\n title: 'FICA Rate',\n className: 'fica',\n hide: true\n }]);\n this.noDataMessage = 'No overtime expenditures for this fund.';\n this.addButtonText = 'Add new cost center';\n }\n\n // action on row edit click: make cells editable\n actionOnEdit() {\n components_table_table.Cell.createTextbox('OT-pay', true);\n components_table_table.Cell.createServiceDropdown(services.list());\n components_table_table.Cell.createDropdown('recurring', ['One-Time', 'Recurring']);\n components_table_table.Cell.createDropdown('object-name', OT_OBJECTS);\n components_table_table.Cell.createTextbox('notes');\n }\n updateTable() {\n // calculate for each row\n let rows = document.getElementsByTagName('tr');\n for (let i = 1; i < rows.length; i++) {\n // fetch values for calculations\n let OT_salary = components_table_table.Cell.getValue(rows[i], 'OT-pay');\n let fica_rate = components_table_table.Cell.getText(rows[i], 'fica');\n\n // add salary and wages and fringe benefits (FICA)\n let row_total = OT_salary * (1 + parseFloat(fica_rate));\n\n // update total\n components_table_table.Cell.updateValue(rows[i], 'total', row_total);\n }\n\n // Save the table after all updates are done\n components_table_table.save();\n }\n addCustomQuestions() {\n // form questions to add a new job\n js_components_form_form.NewField.dropdown('Appropriation:', 'approp-name', fund_lookup_table.getApprops('Add new'), true);\n js_components_form_form.NewField.dropdown('Cost Center:', 'cc-name', fund_lookup_table.getCostCenters('Add new'), true);\n js_components_form_form.NewField.dropdown('Object (salary or wage):', 'object-name', OT_OBJECTS, true);\n js_components_form_form.NewField.dropdown('Service', 'service', services.list(), true);\n js_components_form_form.NewField.dropdown('Recurring or One-Time', 'recurring', ['Recurring', 'One-Time'], true);\n js_components_form_form.NewField.shortText('Overtime amount requested:', 'OT-pay', true);\n }\n editColumns(responses) {\n responses = super.editColumns(responses);\n // edit inputs from modal\n responses['OT-pay'] = unformatCurrency(responses['OT-pay']);\n responses['fica'] = 0.0765;\n return responses;\n }\n}\n/* harmony default export */ const _05_overtime = (OvertimeView);\n;// CONCATENATED MODULE: ./src/js/views/06_nonpersonnel.js\n\n\n\n\n\n\nclass NonPersonnelView extends View {\n constructor(fiscal_year) {\n super();\n this.page_state = 'nonpersonnel';\n this.prompt = `Review and edit non-personnel line items. The CPA numbers are the \n Contract and Procurement Account numbers. Click on the 'detail' link for a CPA \n to see the contract details. Some line items won't have a CPA number.`;\n this.subtitle = 'Non-Personnel';\n this.table = new NonPersonnelTable(fiscal_year);\n }\n}\nclass NonPersonnelTable extends ViewTable {\n constructor(fiscal_year) {\n super();\n\n // add additional personnel columns to the table\n this.columns = this.columns.concat([{\n title: `FY${fiscal_year} Departmental Request Total`,\n className: 'request',\n isCost: true\n }, {\n title: 'Service',\n className: 'service'\n }, {\n title: 'Recurring or One-Time',\n className: 'recurring'\n }, {\n title: 'Vendor Name',\n className: 'vendor'\n }, {\n title: 'CPA #',\n className: 'cpa'\n },\n // hidden columns\n {\n title: 'End Date',\n className: 'contract-end',\n hide: true\n }, {\n title: 'BPA/CPA Amount Remaining',\n className: 'remaining',\n isCost: true,\n hide: true\n }, {\n title: 'Object Name',\n className: 'object-name',\n hide: true\n }, {\n title: 'Object',\n className: 'object',\n hide: true\n }, {\n title: 'Object Category',\n className: 'object-category',\n hide: true\n }, {\n title: 'BPA/CPA Description',\n className: 'cpa-description',\n hide: true\n }, {\n title: 'Departmental Request Notes',\n className: 'notes'\n }]);\n this.noDataMessage = 'No non-personnel expenditures for this fund.';\n this.addButtonText = 'Add new non-personnel item';\n }\n\n // action on row edit click: make cells editable\n actionOnEdit() {\n components_table_table.Cell.createTextbox('request', true);\n components_table_table.Cell.createServiceDropdown();\n components_table_table.Cell.createDropdown('recurring', ['One-Time', 'Recurring']);\n components_table_table.Cell.createTextbox('notes');\n }\n addCustomQuestions() {\n // form questions to add a new row\n js_components_form_form.NewField.dropdown('Appropriation:', 'approp-name', fund_lookup_table.getApprops('Add new'), true);\n js_components_form_form.NewField.dropdown('Cost Center:', 'cc-name', fund_lookup_table.getCostCenters('Add new'), true);\n js_components_form_form.NewField.dropdown('Object Category:', 'object-category', OBJ_CATEGORIES.list, true);\n // TODO: maybe give dropdown based on selected obj category\n js_components_form_form.NewField.shortText('Object Number (if known):', 'object', false);\n js_components_form_form.NewField.dropdown('Service', 'service', services.list(), true);\n js_components_form_form.NewField.longText('Describe your new request:', 'cpa-description', true);\n js_components_form_form.NewField.dropdown('Recurring or One-Time', 'recurring', ['Recurring', 'One-Time'], true);\n js_components_form_form.NewField.shortText('Amount requested:', 'request', true);\n }\n editColumns(responses) {\n responses = super.editColumns(responses);\n responses['avg-salary'] = unformatCurrency(responses['avg-salary']);\n responses['fringe'] = parseFloat(responses['fringe']) / 100;\n return responses;\n }\n}\n/* harmony default export */ const _06_nonpersonnel = (NonPersonnelView);\n;// CONCATENATED MODULE: ./src/js/views/07_new_initiatives.js\n\n\n\n\n\n\nconst dropdownOptions = ['N/A', 'One-Time', 'Recurring'];\n\n// set up page and initialize all buttons\nclass InitiativesView extends View {\n constructor() {\n super();\n this.page_state = 'new-inits';\n this.prompt = `\n This is the place to propose new initiatives for FY${FISCAL_YEAR}.\n New initiative submissions will count as supplemental line items and will be the starting \n point for a conversation with both OB and ODFS, who will help with the details.`;\n this.subtitle = 'New Initiatives';\n this.table = new InitiativesTable();\n }\n visit() {\n // remove fund selection\n localStorage.setItem(\"fund\", '');\n super.visit();\n }\n}\nclass InitiativesTable extends ViewTable {\n constructor() {\n super();\n\n // add additional columns to the table\n this.columns = [{\n title: 'Fund',\n className: 'fund'\n }, {\n title: 'Supplemental Initiative',\n className: 'init-name'\n }, {\n title: 'Total Initiative Request',\n className: 'total',\n isCost: true\n },\n // { title: 'Personnel FTE', className: 'ftes'},\n {\n title: 'Personnel Salary & Benefits',\n className: 'personnel',\n isCost: true\n }, {\n title: 'Non-Personnel Operating',\n className: 'nonpersonnel',\n isCost: true\n }, {\n title: 'Non-Personnel Capital',\n className: 'nonpersonnel-capital',\n isCost: true\n },\n // { title: 'Revenue', className: 'revenue', isCost: true },\n // { title: 'Revenue Type', className: 'rev-type' },\n {\n title: 'Description & Justification',\n className: 'notes'\n }, {\n title: 'Recurring or One-Time',\n className: 'rev-type'\n }, {\n title: 'Edit',\n className: 'edit'\n }];\n this.addButtonText = 'Add new initiative';\n }\n addCustomQuestions() {\n // general questions\n js_components_form_form.NewField.shortText('Initiative Name:', 'init-name', true);\n js_components_form_form.NewField.longText('What is the business case for the Initiative?', 'q1', true);\n js_components_form_form.NewField.longText(`Why is the initiative needed? What is the value-add to residents? \n What is the Department’s plan for implementing the Initiative?`, 'q2', true);\n js_components_form_form.NewField.longText(`Why can’t the Initiative be funded with the Department’s baseline budget?`, 'q3', true);\n js_components_form_form.NewField.dropdown(`Is this initiative one-time or recurring?`, 'rev-type', dropdownOptions);\n\n // Account string info\n js_components_form_form.NewField.dropdown('Fund:', 'fund-name', fund_lookup_table.listFundNames(), true);\n\n // Numbers\n js_components_form_form.NewField.numericInput('What is your ballpark estimate of TOTAL ADDITONAL expenses associated with this initiative?', 'total', false);\n js_components_form_form.NewField.numericInput('Estimate of ADDITONAL personnel cost?', 'personnel', false);\n js_components_form_form.NewField.numericInput('Estimate of ADDITONAL nonpersonnel operating cost?', 'nonpersonnel', false);\n js_components_form_form.NewField.numericInput('Estimate of ADDITONAL nonpersonnel capital costs?', 'nonpersonnel-capital', false);\n js_components_form_form.NewField.numericInput('Estimate of ADDITONAL revenue (if applicable)?', 'revenue', false);\n }\n editColumns(responses) {\n responses['fund'] = account_string.getNumber(responses['fund-name']);\n responses['notes'] = `${responses['q1']} ${responses['q2']} ${responses['q3']}`;\n return responses;\n }\n addModalValidation() {\n return;\n }\n\n // action on row edit click: make cells editable\n actionOnEdit() {\n components_table_table.Cell.createTextbox('total', true);\n // Table.Cell.createTextbox('revenue', true);\n components_table_table.Cell.createTextbox('personnel', true);\n components_table_table.Cell.createTextbox('nonpersonnel', true);\n components_table_table.Cell.createTextbox('init-name');\n components_table_table.Cell.createDropdown('rev-type', dropdownOptions);\n components_table_table.Cell.createTextbox('notes');\n }\n}\n/* harmony default export */ const _07_new_initiatives = (InitiativesView);\n;// CONCATENATED MODULE: ./src/js/views/08_summary.js\n\n\n\n\n\n\n\n\nfunction compareToTarget() {\n const baseline = new models_baseline();\n if (baseline.genFundTotal() <= models_baseline.target()) {\n js_components_prompt_prompt.Text.update(`Congrats! Your General Fund budget is below your target! \n Edit any line items below or download your completed Excel.`);\n } else {\n js_components_prompt_prompt.Text.update(`Your General Fund budget is above your GF target of ${formatCurrency(models_baseline.target())}. \n Please expand the summary table below and edit line items until you meet your target. \n When you meet the target, you will be able to download the Excel sheet.`);\n js_components_prompt_prompt.Buttons.Right.disable();\n }\n js_components_prompt_prompt.show();\n}\nfunction returnToWelcome() {\n const welcome = new _00_welcome();\n const left = document.getElementById('option1');\n welcome.visit();\n}\n;\nclass SummaryView extends View {\n constructor() {\n super();\n this.page_state = 'summary';\n this.subtitle = 'Summary';\n this.sidebar = false;\n }\n visit() {\n super.visit();\n\n // reset fund\n current_fund.reset();\n\n // show summary accordion\n Accordion.build();\n Accordion.show();\n\n // add prompt buttons\n js_components_prompt_prompt.Buttons.Right.updateText('Download Excel');\n js_components_prompt_prompt.Buttons.Left.updateText('Start over with new Excel upload');\n // add button links\n js_components_prompt_prompt.Buttons.Left.addAction(returnToWelcome);\n js_components_prompt_prompt.Buttons.Right.addAction(downloadXLSX);\n\n // update prompt text depending on target matching\n compareToTarget();\n }\n cleanup() {\n // delete event listeners\n js_components_prompt_prompt.Buttons.Left.removeAction(returnToWelcome);\n js_components_prompt_prompt.Buttons.Right.removeAction(downloadXLSX);\n js_components_prompt_prompt.Buttons.Right.enable();\n }\n}\n/* harmony default export */ const _08_summary = (SummaryView);\n;// CONCATENATED MODULE: ./src/js/views/view_logic.js\n\n\n\n\n\n\n\n\n\n\n\n\n// Initialize pages globally once\nconst PAGES = {\n 'welcome': new _00_welcome(),\n 'upload': new _01_upload(),\n 'baseline-landing': new _02_baseline_landing(),\n 'revenue': new _03_revenue(FISCAL_YEAR),\n 'personnel': new _04_personnel(FISCAL_YEAR),\n 'overtime': new _05_overtime(FISCAL_YEAR),\n 'nonpersonnel': new _06_nonpersonnel(FISCAL_YEAR),\n 'new-inits': new _07_new_initiatives(),\n 'summary': new _08_summary()\n};\nfunction visitPage(new_page_key) {\n var page_state = current_page.load();\n\n // Perform cleanup from the current page\n if (PAGES[page_state]) {\n PAGES[page_state].cleanup();\n }\n if (PAGES[new_page_key]) {\n PAGES[new_page_key].visit();\n } else {\n console.error(`No page initializer found for state: ${new_page_key}`);\n }\n}\nfunction nextPage() {\n var page_state = current_page.load();\n const keys = Object.keys(PAGES);\n const currentIndex = keys.indexOf(page_state);\n const returnPages = ['revenue', 'nonpersonnel', 'new-inits', 'overtime', 'personnel'];\n if (!fund_lookup_table.fundsLeft() && returnPages.includes(current_page.load())) {\n visitPage('summary');\n return;\n }\n if (current_page.load() == 'nonpersonnel') {\n fund_lookup_table.editFund(current_fund.number());\n if (fund_lookup_table.fundsLeft()) {\n visitPage('baseline-landing');\n return;\n }\n }\n if (currentIndex >= 0 && currentIndex < keys.length - 1) {\n const nextKey = keys[currentIndex + 1];\n visitPage(nextKey);\n }\n}\nfunction lastPage() {\n var page_state = current_page.load();\n const keys = Object.keys(PAGES);\n const currentIndex = keys.indexOf(page_state);\n if (current_page.load() == 'new-inits') {\n visitPage('baseline-landing');\n return;\n }\n if (currentIndex >= 1) {\n const lastKey = keys[currentIndex - 1];\n visitPage(lastKey);\n }\n}\n;// CONCATENATED MODULE: ./src/js/models/current_page.js\n\nconst CurrentPage = {\n update: function (page) {\n localStorage.setItem('page_state', page);\n },\n load: function () {\n const pageState = localStorage.getItem('page_state');\n return pageState !== null ? pageState : 'welcome';\n },\n visit: function () {\n visitPage(this.load());\n }\n};\n/* harmony default export */ const current_page = (CurrentPage);\n;// CONCATENATED MODULE: ./src/js/utils/storage_utils.js\nfunction getLocalStorageSize() {\n let total = 0;\n for (let key in localStorage) {\n if (localStorage.hasOwnProperty(key)) {\n let keySize = key.length * 2; // each character is 2 bytes\n let valueSize = localStorage[key].length * 2; // each character is 2 bytes\n total += keySize + valueSize;\n }\n }\n return formatBytes(total);\n}\nfunction formatBytes(bytes, decimals = 2) {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n}\n;// CONCATENATED MODULE: ./src/js/init.js\n// Import styles\n\n\n// Import functions\n\n\n\n// Initialize only once when the document is fully loaded\ndocument.addEventListener('DOMContentLoaded', function () {\n current_page.visit();\n console.log('Local Storage Used:', getLocalStorageSize());\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODYzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hCQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDZkE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFRQTs7QUFFQTtBQUNBO0FBV0E7Ozs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hCQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDOUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUMvSEE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDbEJBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDekNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBOztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQ2xOQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUMxREE7O0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOztBQy9EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNUQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOztBQzNDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDbkRBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeEJBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDN0JBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDN0VBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQ3ZHQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7O0FDekJBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOztBQzNFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNyTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTs7QUMvSUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQ3ZHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQzVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7OztBQzFSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUM3TUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDN0VBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7O0FDck9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQ25GQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7OztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeEJBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeEJBOztBQUVBOztBQUVBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUM1REE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBOztBQ3pCQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBOztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBOztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBS0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQzlTQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTs7QUM1Q0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7QUMzRkE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQzNDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQzVJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDM0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUMxRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7O0FDdEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEZBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDZkE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2Nzcy9jb21tb24uY3NzPzhmZjYiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3dlbGNvbWUvd2VsY29tZS5jc3M/ZGVlMSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvd2VsY29tZS93ZWxjb21lLmpzPzUzNWEiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb25zdGFudHMvYnVkZ2V0X2NvbnN0YW50cy5qcz8xNTAyIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9wcm9tcHQvcHJvbXB0LmNzcz8zMjhiIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9wcm9tcHQvc3ViY29tcG9uZW50cy90ZXh0LmpzP2Y2ZGYiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3Byb21wdC9zdWJjb21wb25lbnRzL2J1dHRvbnMuanM/OGQzYiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvcHJvbXB0L3Byb21wdC5qcz9hNzcxIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9zaWRlYmFyL3NpZGViYXIuY3NzPzNiYzciLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb25zdGFudHMvZXhjZWxfY29uc3RhbnRzLmpzP2Y2ODciLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb25zdGFudHMvaW5kZXguanM/MjVjNCIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3V0aWxzL2NvbW1vbl91dGlscy5qcz80NGYyIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvbW9kZWxzL2Z1bmRfbG9va3VwX3RhYmxlLmpzP2RjNjYiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9tb2RlbHMvY3VycmVudF9mdW5kLmpzP2U2ZGIiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9tb2RlbHMvYWNjb3VudF9zdHJpbmcuanM/NmM4ZCIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL21vZGVscy9mdW5kLmpzPzZjZmEiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9tb2RlbHMvYmFzZWxpbmUuanM/ZDQ5NCIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL21vZGVscy9pbml0aWF0aXZlLmpzP2Y5NmEiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9tb2RlbHMvc2VydmljZXMuanM/MTM5ZiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL21vZGVscy9zdXBwbGVtZW50YWwuanM/OTljZSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL21vZGVscy9pbmRleC5qcz8wNWUxIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9zaWRlYmFyL3N1YmNvbXBvbmVudHMvYmFzZWxpbmVfc2VjdGlvbi5qcz8xM2JkIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9zaWRlYmFyL3N1YmNvbXBvbmVudHMvc3VwcF9zZWN0aW9uLmpzPzBjNGUiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3NpZGViYXIvc2lkZWJhci5qcz84MGYwIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9uYXZfYnV0dG9ucy9uYXZfYnV0dG9ucy5jc3M/NzA3ZiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanM/YWJkMSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvYm9keS9ib2R5LmNzcz9kMWM3Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9hY2NvcmRpb24vYWNjb3JkaW9uLmNzcz81YTZjIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy90YWJsZS90YWJsZS5jc3M/Nzg0YyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvdGFibGUvc3ViY29tcG9uZW50cy9oZWFkZXJzLmpzPzE2MjMiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3N1YmNvbXBvbmVudHMvcm93cy5qcz9mYjc5Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy90YWJsZS9zdWJjb21wb25lbnRzL2J1dHRvbnMuanM/Yzk5MiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvZm9ybS9zdWJjb21wb25lbnRzL2Ryb3Bkb3duLmpzP2JhNmIiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3N1YmNvbXBvbmVudHMvY2VsbHMuanM/NzNjYiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvdGFibGUvc3ViY29tcG9uZW50cy9jb2x1bW5zLmpzPzY3NGEiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3N1YmNvbXBvbmVudHMvZGF0YS5qcz9kOWI2Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy90YWJsZS9zdWJjb21wb25lbnRzL2ZpbHRlcnMuanM/YWVjYyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL21vZGVscy9nb2xkX2Jvb2suanM/NjZjNSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3V0aWxzL1hMU1hfaGFuZGxlcnMuanM/YmE4YSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvdG9vbHRpcC90b29sdGlwLmNzcz9iYzhjIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy90b29sdGlwL3Rvb2x0aXAuanM/ZDIzYyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3V0aWxzL0pTT05fZGF0YV9oYW5kbGVycy5qcz9jOWQyIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy90YWJsZS90YWJsZS5qcz8zMDcxIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9hY2NvcmRpb24vYWNjb3JkaW9uLmpzPzFmMzciLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2ZpbGVfdXBsb2FkL2ZpbGVfdXBsb2FkLmNzcz9kYjA5Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9maWxlX3VwbG9hZC9maWxlX3VwbG9hZC5qcz81MTg4Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9tb2RhbC9tb2RhbC5jc3M/NDBkYiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvbW9kYWwvbW9kYWwuanM/NTUzMyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvYm9keS9ib2R5LmpzP2Y5YmEiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuY3NzPzcyZDciLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuanM/YTBhNSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvZm9ybS9mb3JtLmNzcz81NDE1Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9mb3JtL3N1YmNvbXBvbmVudHMvZmllbGRzLmpzPzQ1OWYiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2Zvcm0vc3ViY29tcG9uZW50cy9zdWJtaXQuanM/YzU5NiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvZm9ybS9mb3JtLmpzP2Q5NDIiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy92aWV3X2NsYXNzLmpzP2E3OWUiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wMF93ZWxjb21lLmpzPzA4YmIiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wMV91cGxvYWQuanM/YzQ0OCIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzAyX2Jhc2VsaW5lX2xhbmRpbmcuanM/N2I4ZSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzAzX3JldmVudWUuanM/Yjg3OCIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzA0X3BlcnNvbm5lbC5qcz9mYmZmIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3MvMDVfb3ZlcnRpbWUuanM/YmY3MCIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzA2X25vbnBlcnNvbm5lbC5qcz80ZDNkIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3MvMDdfbmV3X2luaXRpYXRpdmVzLmpzPzQxYTciLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wOF9zdW1tYXJ5LmpzPzhiMzIiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy92aWV3X2xvZ2ljLmpzPzQ2YzYiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9tb2RlbHMvY3VycmVudF9wYWdlLmpzP2ZmYjAiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy91dGlscy9zdG9yYWdlX3V0aWxzLmpzP2ZkZjQiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9pbml0LmpzPzFiMmEiXSwic291cmNlc0NvbnRlbnQiOlsiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2NvbW1vbi5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9jb21tb24uY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3dlbGNvbWUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vd2VsY29tZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJpbXBvcnQgJy4vd2VsY29tZS5jc3MnO1xyXG5cclxuLy8gSGlkZSBhbmQgdW5oaWRlIHdlbGNvbWUgYnV0dG9uc1xyXG5mdW5jdGlvbiB1bmhpZGVXZWxjb21lQnV0dG9ucygpe1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ3ZWxjb21lLXBhZ2VcIikuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcclxufVxyXG5mdW5jdGlvbiBoaWRlV2VsY29tZUJ1dHRvbnMoKXtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwid2VsY29tZS1wYWdlXCIpLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFdlbGNvbWUgPSB7XHJcbiAgICBzaG93OiB1bmhpZGVXZWxjb21lQnV0dG9ucyxcclxuICAgIGhpZGUgOiBoaWRlV2VsY29tZUJ1dHRvbnNcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV2VsY29tZTsiLCIvLyBTZXQgdG8gZXF1YWwgY3VycmVudCBmaXNjYWwgeWVhclxyXG5leHBvcnQgdmFyIEZJU0NBTF9ZRUFSID0gJzI2JztcclxuXHJcbi8vIG9iamVjdCBjYXRlZ29yaWVzIChmcm9tIG9iaiBwYXJ0IG9mIGFjY291bnQgc3RyaW5nKVxyXG5leHBvcnQgY29uc3QgT0JKX0NBVEVHT1JJRVMgPSB7XHJcbiAgICBsaXN0IDogW1xyXG4gICAgICAgIC8vICdTYWxhcmllcyAmIFdhZ2VzJyxcclxuICAgICAgICAvLyAnRW1wbG95ZWUgQmVuZWZpdHMnLFxyXG4gICAgICAgICdQcm9mZXNzaW9uYWwgJiBDb250cmFjdHVhbCBTZXJ2aWNlcycsXHJcbiAgICAgICAgJ09wZXJhdGluZyBTdXBwbGllcycsXHJcbiAgICAgICAgJ09wZXJhdGluZyBTZXJ2aWNlcycsXHJcbiAgICAgICAgJ0VxdWlwbWVudCBBY3F1aXNpdGlvbicsXHJcbiAgICAgICAgJ0NhcGl0YWwgT3V0bGF5cycsXHJcbiAgICAgICAgJ0ZpeGVkIENoYXJnZXMnLFxyXG4gICAgICAgICdPdGhlciBFeHBlbnNlcydcclxuICAgIF1cclxufVxyXG5cclxuLy8gZnJvbSB0aGUgZHJvcC1kb3duIG1lbnVcclxuZXhwb3J0IGNvbnN0IEVNUExPWUVFX1RZUEVTID0gW1xyXG4gICAgJ1JlZ3VsYXInLFxyXG4gICAgJ1RBU1MnLFxyXG4gICAgJ1NlYXNvbmFsJyxcclxuICAgICdVbmlmb3JtIEZpcmUnLFxyXG4gICAgJ1VuaWZvcm0gUG9saWNlJyxcclxuICAgICdBcHBvaW50ZWQnLFxyXG4gICAgJ0VsZWN0ZWQnLFxyXG4gICAgJ0xvbmcgVGVybSBEaXNhYmlsaXR5J1xyXG5dXHJcblxyXG5leHBvcnQgY29uc3QgT1RfT0JKRUNUUyA9IFtcclxuICAgICc2MDEzMDAgLSBTYWxhci1PdmVydGltZS1HZW4gQ2l0eScsIFxyXG4gICAgJzYwMTMwNSAtIFNhbGFyaWVzLU92ZXJ0aW1lLVBvbGljZSBVbmlmJyxcclxuICAgICc2MDEzMTAgLSBTYWxhcmllcy1PdmVydGltZS1GaXJlIFVuaWYnLFxyXG4gICAgJzYwMjMwMCAtIFdhZ2VzLU92ZXJ0aW1lLUdlbiBDaXR5J1xyXG5dIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Byb21wdC5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9wcm9tcHQuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiZnVuY3Rpb24gc2hvd1Byb21wdCgpe1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJwcm9tcHQtZGl2XCIpLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhpZGVQcm9tcHQoKXtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9tcHQtZGl2Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxufVxyXG5cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVByb21wdChwcm9tcHQpe1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb21wdCcpLmlubmVySFRNTCA9IHByb21wdDtcclxuICAgIHNob3dQcm9tcHQoKTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFRleHQgPSB7XHJcbiAgICBzaG93IDogc2hvd1Byb21wdCxcclxuICAgIGhpZGUgOiBoaWRlUHJvbXB0LFxyXG4gICAgdXBkYXRlIDogZnVuY3Rpb24odGV4dCkgeyB1cGRhdGVQcm9tcHQodGV4dCkgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBUZXh0OyIsImZ1bmN0aW9uIHNob3dQcm9tcHRCdXR0b24oaWQpe1xyXG4gICAgLy8gbWFrZSBidXR0b25zIHZpc2libGVcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZSc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVByb21wdEJ1dHRvbihpZCwgdGV4dCl7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkudGV4dENvbnRlbnQgPSB0ZXh0O1xyXG4gICAgc2hvd1Byb21wdEJ1dHRvbihpZCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhpZGVQcm9tcHRCdXR0b24oaWQpe1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVuY2xpY2tBbGwoKXtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHRpb24xJykuY2xhc3NMaXN0LnJlbW92ZSgnY2xpY2tlZCcpO1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29wdGlvbjInKS5jbGFzc0xpc3QucmVtb3ZlKCdjbGlja2VkJyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFwcGx5Q2xpY2tlZFN0eWxlKGJ1dHRvbil7XHJcbiAgICB1bmNsaWNrQWxsKCk7XHJcbiAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnY2xpY2tlZCcpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhZGRQcm9tcHRCdXR0b25BY3Rpb24oYnV0dG9uX2lkLCBhY3Rpb25fZm4pe1xyXG4gICAgY29uc3QgYnV0dG9uRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJ1dHRvbl9pZCk7XHJcbiAgICBidXR0b25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYWN0aW9uX2ZuKTtcclxuICAgIGJ1dHRvbkVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpe1xyXG4gICAgICAgIGFwcGx5Q2xpY2tlZFN0eWxlKHRoaXMpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlbW92ZVByb21wdEJ1dHRvbkFjdGlvbihidXR0b25faWQsIGFjdGlvbl9mbil7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidXR0b25faWQpLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYWN0aW9uX2ZuKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZGlzYWJsZShidXR0b25faWQpe1xyXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7YnV0dG9uX2lkfWApLmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGVuYWJsZShidXR0b25faWQpe1xyXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7YnV0dG9uX2lkfWApLmNsYXNzTGlzdC5yZW1vdmUoJ2Rpc2FibGVkJyk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBMZWZ0ID0ge1xyXG4gICAgc2hvdyA6IGZ1bmN0aW9uKCkgeyBzaG93UHJvbXB0QnV0dG9uKCdvcHRpb24xJykgfSxcclxuICAgIGhpZGUgOiBmdW5jdGlvbigpIHsgaGlkZVByb21wdEJ1dHRvbignb3B0aW9uMScpIH0sXHJcbiAgICB1cGRhdGVUZXh0IDogZnVuY3Rpb24odGV4dCkgeyB1cGRhdGVQcm9tcHRCdXR0b24oJ29wdGlvbjEnLCB0ZXh0KSB9LFxyXG4gICAgYWRkQWN0aW9uIDogZnVuY3Rpb24oYWN0aW9uX2ZuKSB7IGFkZFByb21wdEJ1dHRvbkFjdGlvbignb3B0aW9uMScsIGFjdGlvbl9mbikgfSxcclxuICAgIHJlbW92ZUFjdGlvbiA6IGZ1bmN0aW9uKGFjdGlvbl9mbikgeyByZW1vdmVQcm9tcHRCdXR0b25BY3Rpb24oJ29wdGlvbjEnLCBhY3Rpb25fZm4pIH0sXHJcbiAgICBkaXNhYmxlIDogZnVuY3Rpb24oKSB7IGRpc2FibGUoJ29wdGlvbjEnKSB9LFxyXG4gICAgZW5hYmxlIDogZnVuY3Rpb24oKSB7IGVuYWJsZSgnb3B0aW9uMScpIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFJpZ2h0ID0ge1xyXG4gICAgc2hvdyA6IGZ1bmN0aW9uKCkgeyBzaG93UHJvbXB0QnV0dG9uKCdvcHRpb24yJykgfSxcclxuICAgIGhpZGUgOiBmdW5jdGlvbigpIHsgaGlkZVByb21wdEJ1dHRvbignb3B0aW9uMicpIH0sXHJcbiAgICB1cGRhdGVUZXh0IDogZnVuY3Rpb24odGV4dCkgeyB1cGRhdGVQcm9tcHRCdXR0b24oJ29wdGlvbjInLCB0ZXh0KSB9LFxyXG4gICAgYWRkQWN0aW9uIDogZnVuY3Rpb24oYWN0aW9uX2ZuKSB7IGFkZFByb21wdEJ1dHRvbkFjdGlvbignb3B0aW9uMicsIGFjdGlvbl9mbikgfSxcclxuICAgIHJlbW92ZUFjdGlvbiA6IGZ1bmN0aW9uKGFjdGlvbl9mbikgeyByZW1vdmVQcm9tcHRCdXR0b25BY3Rpb24oJ29wdGlvbjInLCBhY3Rpb25fZm4pIH0sXHJcbiAgICBkaXNhYmxlIDogZnVuY3Rpb24oKSB7IGRpc2FibGUoJ29wdGlvbjInKSB9LFxyXG4gICAgZW5hYmxlIDogZnVuY3Rpb24oKSB7IGVuYWJsZSgnb3B0aW9uMicpIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IEJ1dHRvbnMgPSB7XHJcbiAgICBMZWZ0IDogTGVmdCxcclxuICAgIFJpZ2h0IDogUmlnaHQsXHJcbiAgICBzaG93IDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgc2hvd1Byb21wdEJ1dHRvbignb3B0aW9uMScpO1xyXG4gICAgICAgIHNob3dQcm9tcHRCdXR0b24oJ29wdGlvbjInKTtcclxuICAgIH0sXHJcbiAgICBoaWRlIDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaGlkZVByb21wdEJ1dHRvbignb3B0aW9uMScpO1xyXG4gICAgICAgIGhpZGVQcm9tcHRCdXR0b24oJ29wdGlvbjInKTtcclxuICAgIH0sXHJcbiAgICByZXNldCA6IHVuY2xpY2tBbGxcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQnV0dG9uczsiLCJpbXBvcnQgJy4vcHJvbXB0LmNzcyc7XHJcblxyXG5pbXBvcnQgVGV4dCBmcm9tIFwiLi9zdWJjb21wb25lbnRzL3RleHQuanNcIjtcclxuaW1wb3J0IEJ1dHRvbnMgZnJvbSBcIi4vc3ViY29tcG9uZW50cy9idXR0b25zLmpzXCI7XHJcblxyXG5leHBvcnQgY29uc3QgUHJvbXB0ID0ge1xyXG4gICAgVGV4dCA6IFRleHQsXHJcbiAgICBCdXR0b25zIDogQnV0dG9ucyxcclxuICAgIGhpZGUgOiBmdW5jdGlvbigpe1xyXG4gICAgICAgIFRleHQuaGlkZSgpO1xyXG4gICAgICAgIEJ1dHRvbnMuaGlkZSgpO1xyXG4gICAgfSxcclxuICAgIHNob3cgOiBmdW5jdGlvbigpe1xyXG4gICAgICAgIFRleHQuc2hvdygpO1xyXG4gICAgICAgIEJ1dHRvbnMuc2hvdygpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQcm9tcHQiLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc2lkZWJhci5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zaWRlYmFyLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsImltcG9ydCB7IEZJU0NBTF9ZRUFSIH0gZnJvbSBcIi4vYnVkZ2V0X2NvbnN0YW50c1wiO1xyXG5cclxuLy8gc2hlZXRzIHRvIGV4cGVjdCBvbiBkZXRhaWwgc2hlZXRcclxuZXhwb3J0IGNvbnN0IFNIRUVUUyA9IHtcclxuICAgICdGVEUsIFNhbGFyeS1XYWdlLCAmIEJlbmVmaXRzJyA6ICdwZXJzb25uZWwnICxcclxuICAgICdPdmVydGltZSAmIE90aGVyIFBlcnNvbm5lbCcgOiAnb3ZlcnRpbWUnLFxyXG4gICAgJ05vbi1QZXJzb25uZWwnIDogJ25vbnBlcnNvbm5lbCcsXHJcbiAgICAnUmV2ZW51ZScgOiAncmV2ZW51ZScsXHJcbiAgICAnSW5pdGlhdGl2ZXMgU3VtbWFyeSc6ICduZXctaW5pdHMnXHJcbn1cclxuXHJcbi8vIHdoZXJlIHRvIGZpbmQgdGhlIGdlbmVyYWwgZnVuZCB0YXJnZXRcclxuZXhwb3J0IGNvbnN0IFRBUkdFVF9DRUxMX0FERFJFU1MgPSAnQzE0J1xyXG5cclxuZXhwb3J0IGNvbnN0IFRPVEFMX0NPTFVNTlMgPSB7XHJcbiAgICAncGVyc29ubmVsJzogJ1RvdGFsIFNhbC9XYWcgJiBCZW4gUmVxdWVzdCcsXHJcbiAgICAnb3ZlcnRpbWUnOmBGWSR7RklTQ0FMX1lFQVJ9IFRvdGFsIE9UL1NQL0hvbCArIEZJQ0EgUmVxdWVzdGAsXHJcbiAgICAnbm9ucGVyc29ubmVsJzogYEZZJHtGSVNDQUxfWUVBUn0gRGVwYXJ0bWVudGFsIFJlcXVlc3QgVG90YWxgLFxyXG4gICAgJ3JldmVudWUnOiBgRlkke0ZJU0NBTF9ZRUFSfSBEZXBhcnRtZW50YWwgRXN0aW1hdGVgLFxyXG4gICAgJ25ldy1pbml0cyc6IGBUb3RhbCBJbml0aWF0aXZlIFJlcXVlc3RgXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgTkVXX0lOSVRfQ09MUyA9IHtcclxuICAgICdwZXJzb25uZWwnIDogJ1BlcnNvbm5lbCBTYWxhcnkgJiBCZW5lZml0cycsXHJcbiAgICAnb3BlcmF0aW5nJyA6ICdOb24tUGVyc29ubmVsIE9wZXJhdGluZycsXHJcbiAgICAnY2FwaXRhbCcgOiAnTm9uLVBlcnNvbm5lbCBDYXBpdGFsJyxcclxuICAgICdyZXZlbnVlJyA6ICdSZXZlbnVlJyxcclxuICAgICduYW1lJyA6ICdTdXBwbGVtZW50YWwgSW5pdGlhdGl2ZScsXHJcbiAgICAndG90YWwnIDogVE9UQUxfQ09MVU1OU1snbmV3LWluaXRzJ11cclxufSIsImV4cG9ydCAqIGZyb20gJy4vYnVkZ2V0X2NvbnN0YW50cyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZXhjZWxfY29uc3RhbnRzJzsiLCIvLyBGdW5jdGlvbiB0byBmb3JtYXQgbnVtYmVyIGFzIGN1cnJlbmN5XHJcbmV4cG9ydCBjb25zdCBmb3JtYXRDdXJyZW5jeSA9IChhbW91bnQsIHJldHVybl96ZXJvID0gZmFsc2UpID0+IHtcclxuICAgIHZhciBhbW91bnQgPSBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoYW1vdW50KSk7XHJcbiAgICBpZiAoYW1vdW50ID09IE5hTil7XHJcbiAgICAgICAgcmV0dXJuIFwiJCAtXCJcclxuICAgIH1cclxuICAgIGlmIChhbW91bnQgPCAwKXtcclxuICAgICAgICByZXR1cm4gJygkJyArIGFtb3VudC50b1N0cmluZygpLnJlcGxhY2UoL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csICcsJykgKyAnKSc7XHJcbiAgICB9IGVsc2UgaWYgKGFtb3VudCA9PSAwKSB7XHJcbiAgICAgICAgaWYgKHJldHVybl96ZXJvKXtcclxuICAgICAgICAgICAgcmV0dXJuICckMCc7ICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gXCIkIC1cIlxyXG4gICAgfVxyXG4gICAgcmV0dXJuICckJyArIGFtb3VudC50b1N0cmluZygpLnJlcGxhY2UoL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csICcsJyk7XHJcbn0gO1xyXG5cclxuLy8gZnVuY3Rpb24gdG8gY29udmVydCBmb3JtYXR0ZWQgbnVtYmVyIHRvIGEgZmxvYXRcclxuZXhwb3J0IGNvbnN0IHVuZm9ybWF0Q3VycmVuY3kgPSAoZm9ybWF0dGVkQW1vdW50KSA9PiB7XHJcbiAgICBpZiAoIWZvcm1hdHRlZEFtb3VudCkgeyByZXR1cm4gMCB9O1xyXG4gICAgLy8gUmVtb3ZlIGFueSBjdXJyZW5jeSBzeW1ib2xzIGFuZCBjb21tYXNcclxuICAgIGxldCBudW1lcmljYWxQYXJ0ID0gZm9ybWF0dGVkQW1vdW50LnJlcGxhY2UoL1teMC05Li1dKy9nLCBcIlwiKTtcclxuICAgIGlmIChudW1lcmljYWxQYXJ0ID09ICctJyl7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFyc2VGbG9hdChudW1lcmljYWxQYXJ0KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkaXNwbGF5V2l0aENvbW1hcyh2YWx1ZSkge1xyXG4gICAgaWYgKHZhbHVlID09IDApe1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZvcm1hdEN1cnJlbmN5KHZhbHVlKS5yZXBsYWNlKCckJywgJycpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5TdHJpbmcoc3RyKXtcclxuICAgIHJldHVybiBzdHIudG9Mb3dlckNhc2UoKS5yZXBsYWNlQWxsKCcgJywgJy0nKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU5ld0xpbmVzKHN0cil7XHJcbiAgICAvLyByZXBsYWNlIGFsbCBuZXcgbGluZXMgd2l0aCBzcGFjZXNcclxuICAgIHN0ciA9IHN0ci5yZXBsYWNlQWxsKC9bXFxyXFxuXSsvZywgXCIgXCIpO1xyXG4gICAgLy8gcmVtb3ZlIGFueSBleHRyYSBzcGFjZXMgb3IgdHJhaWxpbmcvbGVhZGluZyB3aGl0ZXNwYWNlXHJcbiAgICBzdHIgPSBzdHIucmVwbGFjZUFsbCgnICAnLCAnICcpO1xyXG4gICAgc3RyID0gc3RyLnJlcGxhY2VBbGwoJyAgJywgJyAnKTtcclxuICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJyk7XHJcbiAgICByZXR1cm4gc3RyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY29sU3VtKHRhYmxlLCBjb2xOYW1lKSB7XHJcbiAgICAvLyBmaWxsIHdpdGggemVybyB1bnRpbCB0aGVyZSBpcyBzb21ldGhpbmcgc2F2ZWQgaW4gc3RvcmFnZVxyXG4gICAgaWYoIXRhYmxlIHx8IHRhYmxlID09ICcnKXsgXHJcbiAgICAgICAgcmV0dXJuIDA7IFxyXG4gICAgfVxyXG4gICAgY29uc3QgaGVhZGVycyA9IE9iamVjdC5rZXlzKHRhYmxlWzBdKTtcclxuICAgIGlmIChoZWFkZXJzLmluY2x1ZGVzKGNvbE5hbWUpKSB7XHJcbiAgICAgICAgbGV0IHN1bSA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJsZS5sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IE1hdGgucm91bmQocGFyc2VGbG9hdCh0YWJsZVtpXVtjb2xOYW1lXSkpO1xyXG4gICAgICAgICAgICAvLyB0cmVhdCBOYU4gKG5vbi1udW1lcmljcykgYXMgemVyb2VzXHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSkgeyBzdW0gKz0gdmFsdWU7IH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN1bTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gY29uc29sZS5lcnJvcihgQ291bGQgbm90IGZpbmQgZXhwZWN0ZWQgdG90YWwgY29sdW1uIGluIHNhdmVkIGRhdGEgZm9yICR7bmFtZX0uIFJldHVybmluZyAwLiBTZWUgU3RvcmVkVGFibGUudG90YWxDb2woKSBzd2l0Y2guYCk7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5pcXVlVmFsdWVzKGRhdGEsIGtleSkge1xyXG4gICAgY29uc3QgdmFsdWVzID0gZGF0YS5tYXAob2JqID0+IG9ialtrZXldKTtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodmFsdWVzKSk7XHJcbn1cclxuIiwiaW1wb3J0IEN1cnJlbnRGdW5kIGZyb20gXCIuL2N1cnJlbnRfZnVuZFwiO1xyXG5pbXBvcnQgeyBnZXRVbmlxdWVWYWx1ZXMgfSBmcm9tIFwiLi4vdXRpbHMvY29tbW9uX3V0aWxzXCI7XHJcblxyXG5leHBvcnQgY29uc3QgRnVuZExvb2t1cFRhYmxlID0ge1xyXG4gICAgcmV0cmlldmUgOiBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZnVuZC1sb29rdXAtdGFibGUnKSkgfHwge307XHJcbiAgICB9LFxyXG4gICAgc2F2ZSA6IGZ1bmN0aW9uKGZ1bmREaWN0KXtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZnVuZC1sb29rdXAtdGFibGUnLCBKU09OLnN0cmluZ2lmeShmdW5kRGljdCkpO1xyXG4gICAgfSxcclxuXHJcbiAgICB1cGRhdGUgOiBmdW5jdGlvbihmdW5kRGF0YSl7XHJcbiAgICAgICAgLy8gcmVzZXRcclxuICAgICAgICB0aGlzLnJlc2V0KCk7XHJcbiAgICAgICAgLy8gZmlsbCBpbiB3aXRoIGRhdGEgc3RvcmVkIGluIGZ1bmREYXRlXHJcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLnJldHJpZXZlKCk7XHJcbiAgICAgICAgZm9yIChsZXQgZnVuZCBvZiBPYmplY3Qua2V5cyhmdW5kRGF0YSkpe1xyXG5cclxuICAgICAgICAgICAgLy8gYWRkIHRvIGxvb2t1cCB0YWJsZSBpZiBub3QgaW4gdGhlcmUgYWxyZWFkeVxyXG4gICAgICAgICAgICBpZiAoIXRhYmxlW2Z1bmRdKXtcclxuICAgICAgICAgICAgICAgIC8vIGdldCBmdW5kIG5hbWVcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZ1bmROYW1lID0gZnVuZERhdGFbZnVuZF1bMF1bJ0Z1bmQgTmFtZSddO1xyXG4gICAgICAgICAgICAgICAgLy8gYWRkIGZ1bmQgdG8gZGljdGlvbmFyeVxyXG4gICAgICAgICAgICAgICAgdGFibGVbZnVuZF0gPSB7fTtcclxuICAgICAgICAgICAgICAgIHRhYmxlW2Z1bmRdWyduYW1lJ10gPSBmdW5kTmFtZTtcclxuICAgICAgICAgICAgICAgIHRhYmxlW2Z1bmRdWyd2aWV3ZWQnXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLy8gYnVpbGQgbGlzdHMgb2YgdW5pcXVlIGNvc3QgY2VudGVycyBhbmQgYXBwcm9wcmlhdGlvbnNcclxuICAgICAgICAgICAgICAgIHRhYmxlW2Z1bmRdWydhcHByb3AnXSA9IGdldFVuaXF1ZVZhbHVlcyhmdW5kRGF0YVtmdW5kXSwgJ0FwcHJvcHJpYXRpb24gTmFtZScpO1xyXG4gICAgICAgICAgICAgICAgdGFibGVbZnVuZF1bJ2NjJ10gPSBnZXRVbmlxdWVWYWx1ZXMoZnVuZERhdGFbZnVuZF0sICdDb3N0IENlbnRlciBOYW1lJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc2F2ZSBhbnkgdXBkYXRlc1xyXG4gICAgICAgIHRoaXMuc2F2ZSh0YWJsZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldEFsbDogZnVuY3Rpb24oa2V5KSB7XHJcbiAgICAgICAgLy8gZnVuY3Rpb24gdG8gYWdncmVnYXRlIGFsbCBhcHByb3BzIG9yIENDcyBmb3IgZXZlcnkgZnVuZCBpbiBvbmUgYXJyYXlcclxuICAgICAgICBjb25zdCBmdW5kcyA9IHRoaXMucmV0cmlldmUoKTtcclxuICAgICAgICBjb25zdCByZXQgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IGZ1bmQgaW4gZnVuZHMpIHtcclxuICAgICAgICAgICAgaWYgKGZ1bmRzLmhhc093blByb3BlcnR5KGZ1bmQpKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpIGluIGZ1bmRzW2Z1bmRdW2tleV0pe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKGZ1bmRzW2Z1bmRdW2tleV1baV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldENvc3RDZW50ZXJzIDogZnVuY3Rpb24oIGV4dHJhT3B0aW9uICkge1xyXG4gICAgICAgIC8vIGdldCBjdXJyZW50IGZ1bmRcclxuICAgICAgICBjb25zdCBmdW5kID0gQ3VycmVudEZ1bmQubnVtYmVyKClcclxuICAgICAgICBsZXQgcmV0ID0gW107XHJcbiAgICAgICAgaWYgKHRoaXMucmV0cmlldmUoKVtmdW5kXSl7XHJcbiAgICAgICAgICAgIHJldCA9IHRoaXMucmV0cmlldmUoKVtmdW5kXVsnY2MnXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBpZiBubyBmdW5kIChpZS4gd2UncmUgb24gdGhlIG5ldyBpbml0aWF0aXZlIHBhZ2UpLCByZXR1cm4gYWxsIG9wdGlvbnNcclxuICAgICAgICAgICAgcmV0ID0gdGhpcy5nZXRBbGwoJ2NjJyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvLyBhZGQgZXh0cmEgb3B0aW9uIGlmIGdpdmVuXHJcbiAgICAgICAgaWYgKGV4dHJhT3B0aW9uKSB7XHJcbiAgICAgICAgICAgIHJldC5wdXNoKGV4dHJhT3B0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0QXBwcm9wcyA6IGZ1bmN0aW9uKCBleHRyYU9wdGlvbiApIHtcclxuICAgICAgICAvLyBnZXQgY3VycmVudCBmdW5kXHJcbiAgICAgICAgY29uc3QgZnVuZCA9IEN1cnJlbnRGdW5kLm51bWJlcigpXHJcbiAgICAgICAgbGV0IHJldCA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLnJldHJpZXZlKClbZnVuZF0pe1xyXG4gICAgICAgICAgICByZXQgPSB0aGlzLnJldHJpZXZlKClbZnVuZF1bJ2FwcHJvcCddO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGlmIG5vIGZ1bmQgKGllLiB3ZSdyZSBvbiB0aGUgbmV3IGluaXRpYXRpdmUgcGFnZSksIHJldHVybiBhbGwgb3B0aW9uc1xyXG4gICAgICAgICAgICByZXQgPSB0aGlzLmdldEFsbCgnYXBwcm9wJyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvLyBhZGQgZXh0cmEgb3B0aW9uIGlmIGdpdmVuXHJcbiAgICAgICAgaWYgKGV4dHJhT3B0aW9uKSB7XHJcbiAgICAgICAgICAgIHJldC5wdXNoKGV4dHJhT3B0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgIH0sXHJcblxyXG4gICAgcmVzZXQgOiBmdW5jdGlvbigpIHtcclxuICAgICAgICB0aGlzLnNhdmUoe30pO1xyXG4gICAgfSxcclxuICAgIGdldE5hbWUgOiBmdW5jdGlvbihudW1iZXIpe1xyXG4gICAgICAgIGlmKCFudW1iZXIgfHwgIXRoaXMucmV0cmlldmUoKSkgeyByZXR1cm4gJycgfTtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZXRyaWV2ZSgpW251bWJlcl1bJ25hbWUnXTtcclxuICAgIH0sXHJcbiAgICBsaXN0RnVuZHMgOiBmdW5jdGlvbigpe1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnJldHJpZXZlKCkpO1xyXG4gICAgfSxcclxuICAgIGxpc3RGdW5kTmFtZXMgOiBmdW5jdGlvbigpe1xyXG4gICAgICAgIGNvbnN0IGZ1bmRzID0gdGhpcy5yZXRyaWV2ZSgpO1xyXG4gICAgICAgIC8vIGluaXRpYWxpemUgYXJyYXlcclxuICAgICAgICB2YXIgcmV0ID0gW107XHJcbiAgICAgICAgT2JqZWN0LmtleXMoZnVuZHMpLmZvckVhY2goIChmdW5kX251bWJlcikgPT4ge1xyXG4gICAgICAgICAgICB2YXIgZnVuZF9uYW1lID0gZnVuZHNbZnVuZF9udW1iZXJdWyduYW1lJ107XHJcbiAgICAgICAgICAgIHJldC5wdXNoKGZ1bmRfbmFtZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgIH0sXHJcbiAgICBlZGl0RnVuZCA6IGZ1bmN0aW9uKGZ1bmQpe1xyXG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5yZXRyaWV2ZSgpO1xyXG4gICAgICAgIGlmICh0YWJsZVtmdW5kXSl7XHJcbiAgICAgICAgICAgIHRhYmxlW2Z1bmRdWyd2aWV3ZWQnXSA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZSh0YWJsZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gZnVuZCBzZWxlY3RlZC4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICB9LFxyXG4gICAgbGlzdFVuZWRpdGVkRnVuZHMgOiBmdW5jdGlvbigpe1xyXG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5yZXRyaWV2ZSgpO1xyXG4gICAgICAgIGNvbnN0IHJldCA9IFtdO1xyXG4gICAgICAgIHRoaXMubGlzdEZ1bmRzKCkuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXRhYmxlW2tleV1bJ3ZpZXdlZCddKXtcclxuICAgICAgICAgICAgICAgIHJldC5wdXNoKGtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgfSxcclxuICAgIGZ1bmRzTGVmdCA6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmxpc3RVbmVkaXRlZEZ1bmRzKCkubGVuZ3RoID4gMCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEZ1bmRMb29rdXBUYWJsZSIsIlxyXG5pbXBvcnQgRnVuZExvb2t1cFRhYmxlIGZyb20gXCIuL2Z1bmRfbG9va3VwX3RhYmxlXCI7XHJcblxyXG5leHBvcnQgY29uc3QgQ3VycmVudEZ1bmQgPSB7XHJcbiAgICB1cGRhdGUgOiBmdW5jdGlvbihmdW5kKXtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZnVuZCcsIGZ1bmQpO1xyXG4gICAgfSxcclxuICAgIG51bWJlciA6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiZnVuZFwiKTtcclxuICAgIH0sXHJcbiAgICBuYW1lIDogZnVuY3Rpb24oKXtcclxuICAgICAgICByZXR1cm4gRnVuZExvb2t1cFRhYmxlLmdldE5hbWUoIHRoaXMubnVtYmVyKCkpO1xyXG4gICAgfSxcclxuICAgIHJlc2V0IDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGUoJycpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDdXJyZW50RnVuZDsiLCJpbXBvcnQgQ3VycmVudEZ1bmQgZnJvbSBcIi4vY3VycmVudF9mdW5kXCI7XHJcblxyXG5leHBvcnQgY29uc3QgQWNjb3VudFN0cmluZyA9IHtcclxuICAgIGdldE51bWJlcjogZnVuY3Rpb24oaW5wdXQpIHtcclxuICAgICAgICAvLyBpc29sYXRlIHRoZSBudW1lcmljYWwgcGFydCBvZiBhIGFwcHJvcHJpYXRpb24vY29zdCBjZW50ZXIvb2JqZWN0XHJcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBpbnB1dC5tYXRjaCgvXlxcZCsvKTtcclxuICAgICAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFswXSA6IG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIGJ1aWxkIDogZnVuY3Rpb24oYXBwcm9wLCBjYywgb2JqID0gbnVsbCwgZnVuZCA9IG51bGwpIHtcclxuICAgICAgICAvLyBwdXQgdG9nZXRoZXIgYWNjb3VudCBzdHJpbmcgZnVuZC1hcHByb3AtY29zdGNlbnRlclstb2JqXSAodyBvcHRpb25hbCBvYmplY3QpXHJcbiAgICAgICAgaWYgKCFmdW5kKSB7IGZ1bmQgPSBDdXJyZW50RnVuZC5udW1iZXIoKSB9O1xyXG4gICAgICAgIC8vIGhpdHMgZXJyb3IgaGVyZVxyXG4gICAgICAgIGFwcHJvcCA9IHRoaXMuZ2V0TnVtYmVyKGFwcHJvcCk7XHJcbiAgICAgICAgY2MgPSB0aGlzLmdldE51bWJlcihjYyk7XHJcbiAgICAgICAgdmFyIHN0cmluZyA9IGAke2Z1bmR9LSR7YXBwcm9wfS0ke2NjfWA7XHJcbiAgICAgICAgc3RyaW5nID0gb2JqID8gYCR7c3RyaW5nfS0ke3RoaXMuZ2V0TnVtYmVyKG9iail9YCA6IHN0cmluZztcclxuICAgICAgICByZXR1cm4gc3RyaW5nO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRBY2NvdW50U3RyaW5nU2VjdGlvbiA6IGZ1bmN0aW9uKGFjY291bnRfc3RyaW5nLCBzZWN0aW9uKSB7XHJcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBhY2NvdW50X3N0cmluZy5zcGxpdChcIi1cIik7XHJcbiAgICAgICAgcmV0dXJuIHNlY3Rpb25zLmxlbmd0aCA+IHNlY3Rpb24gPyBzZWN0aW9uc1tzZWN0aW9uXSA6IG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIGZ1bmQgOiBmdW5jdGlvbihhY2NvdW50X3N0cmluZykgeyBcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRBY2NvdW50U3RyaW5nU2VjdGlvbihhY2NvdW50X3N0cmluZywgMCkgXHJcbiAgICB9LFxyXG5cclxuICAgIGFwcHJvcCA6IGZ1bmN0aW9uKGFjY291bnRfc3RyaW5nKSB7IFxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjY291bnRTdHJpbmdTZWN0aW9uKGFjY291bnRfc3RyaW5nLCAxKSBcclxuICAgIH0sXHJcblxyXG4gICAgY29zdENlbnRlciA6IGZ1bmN0aW9uKGFjY291bnRfc3RyaW5nKSB7IFxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjY291bnRTdHJpbmdTZWN0aW9uKGFjY291bnRfc3RyaW5nLCAyKSBcclxuICAgIH0sXHJcblxyXG4gICAgb2JqZWN0IDogZnVuY3Rpb24oYWNjb3VudF9zdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRBY2NvdW50U3RyaW5nU2VjdGlvbihhY2NvdW50X3N0cmluZywgMykgXHJcbiAgICB9LFxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBY2NvdW50U3RyaW5nOyIsIlxyXG5pbXBvcnQgeyBjb2xTdW0gfSBmcm9tIFwiLi4vdXRpbHMvY29tbW9uX3V0aWxzXCI7XHJcbmltcG9ydCB7IFRPVEFMX0NPTFVNTlMgfSBmcm9tICcuLi9jb25zdGFudHMvJztcclxuXHJcbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB1bmlxdWUgbGlzdCBvZiBhcHByb3ByaWF0aW9ucyByZXByZXNlbnRlZCBpbiBhIHRhYmxlXHJcbmZ1bmN0aW9uIGZldGNoVmFsdWVTZXQodGFibGUsIGtleSkge1xyXG5cclxuICAgIC8vIElGIHRoZXJlJ3Mgbm8gZGF0YSwgcmV0dXJuIGFuIGVtcHR5IGxpc3RcclxuICAgIGlmKCF0YWJsZSl7XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFVzZSBhIFNldCB0byBzdG9yZSB1bmlxdWUgdmFsdWVzXHJcbiAgICBjb25zdCB1bmlxVmFsdWVzID0gbmV3IFNldCgpO1xyXG4gIFxyXG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggb2JqZWN0IGluIHRoZSB0YWJsZVxyXG4gICAgdGFibGUuZm9yRWFjaChyb3cgPT4ge1xyXG4gICAgICBpZiAocm93W2tleV0pIHtcclxuICAgICAgICB1bmlxVmFsdWVzLmFkZChyb3dba2V5XSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIFxyXG4gICAgLy8gQ29udmVydCB0aGUgU2V0IHRvIGFuIGFycmF5IGlmIG5lZWRlZFxyXG4gICAgcmV0dXJuIHVuaXFWYWx1ZXM7XHJcbiAgfVxyXG5cclxuLy8gQ2xhc3MgdG8gaG9sZCBpbmZvcm1hdGlvbiBvbiBhIHNwZWNpZmljIGZ1bmQgYW5kIHRhYmxlXHJcbmNsYXNzIFN0b3JlZFRhYmxlIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhZ2UsIGZ1bmQpe1xyXG4gICAgICAgIHRoaXMubmFtZSA9IGAke3BhZ2V9XyR7ZnVuZH1gO1xyXG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XHJcbiAgICAgICAgdGhpcy50YWJsZSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5uYW1lKSk7XHJcbiAgICAgICAgdGhpcy5hcHByb3BzID0gZmV0Y2hWYWx1ZVNldCh0aGlzLnRhYmxlLCAnQXBwcm9wcmlhdGlvbicpO1xyXG4gICAgICAgIHRoaXMuY2MgPSBmZXRjaFZhbHVlU2V0KHRoaXMudGFibGUsICdDb3N0IENlbnRlcicpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICB0b3RhbENvbCgpIHtcclxuICAgICAgICByZXR1cm4gVE9UQUxfQ09MVU1OU1t0aGlzLnBhZ2VdO1xyXG4gICAgfVxyXG4gICAgZ2V0U3VtKCkge1xyXG4gICAgICAgIC8vIGZpbGwgd2l0aCB6ZXJvIHVudGlsIHRoZXJlIGlzIHNvbWV0aGluZyBzYXZlZCBpbiBzdG9yYWdlXHJcbiAgICAgICAgcmV0dXJuIGNvbFN1bSh0aGlzLnRhYmxlLCB0aGlzLnRvdGFsQ29sKCksIHRoaXMubmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8ga2V5IGlzIHRoZSBjb2x1bW4gdG8gZmlsdGVyIG9uIChpZS4gQ29zdCBDZW50ZXIpXHJcbiAgICBmaWx0ZXIoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIGlmICh0aGlzLnRhYmxlKXtcclxuICAgICAgICAgICAgLy8gcmVhc3NpZ24gdW5kZXJseWluZyBkYXRhIGluIG9iamVjdCBpZiB0aGVyZSdzIGRhdGEgdG8gZmlsdGVyXHJcbiAgICAgICAgICAgIHRoaXMudGFibGUgPSB0aGlzLnRhYmxlLmZpbHRlcihyb3cgPT4geyAgIFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb3dba2V5XSkgJiYgKHJvd1trZXldID09IHZhbHVlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIENvc3RDZW50ZXJ7XHJcbiAgICBjb25zdHJ1Y3RvcihmdW5kLCBhcHByb3AsIGNjKXtcclxuICAgICAgICBjb25zdCBBcHByb3BPYmogPSBuZXcgQXBwcm9wcmlhdGlvbihmdW5kLCBhcHByb3ApO1xyXG4gICAgICAgIHRoaXMucGVyc29ubmVsID0gQXBwcm9wT2JqLnBlcnNvbm5lbC5maWx0ZXIoJ0Nvc3QgQ2VudGVyJywgY2MpO1xyXG4gICAgICAgIHRoaXMubm9ucGVyc29ubmVsID0gQXBwcm9wT2JqLm5vbnBlcnNvbm5lbC5maWx0ZXIoJ0Nvc3QgQ2VudGVyJywgY2MpO1xyXG4gICAgICAgIHRoaXMub3ZlcnRpbWUgPSBBcHByb3BPYmoub3ZlcnRpbWUuZmlsdGVyKCdDb3N0IENlbnRlcicsIGNjKTtcclxuICAgICAgICB0aGlzLnJldmVudWUgPSBBcHByb3BPYmoucmV2ZW51ZS5maWx0ZXIoJ0Nvc3QgQ2VudGVyJywgY2MpO1xyXG4gICAgICAgIHRoaXMuY2MgPSBjYztcclxuICAgICAgICB0aGlzLmFjY291bnRfc3RyaW5nID0gYCR7QXBwcm9wT2JqLmFjY291bnRTdHJpbmcoKX0tJHtjY31gO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFBlcnNvbm5lbENvc3QoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGVyc29ubmVsLmdldFN1bSgpOyBcclxuICAgIH1cclxuXHJcbiAgICBnZXRPdmVydGltZUNvc3QoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3ZlcnRpbWUuZ2V0U3VtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Tm9uUGVyc29ubmVsQ29zdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ub25wZXJzb25uZWwuZ2V0U3VtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UmV2ZW51ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZXZlbnVlLmdldFN1bSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFRvdGFsKCkgeyBcclxuICAgICAgICAvLyBvbmx5IHN1bSBleHBlbmRpdHVyZXMsIG5vdCBuZXQgb2YgcmV2ZW51ZVxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldE5vblBlcnNvbm5lbENvc3QoKSArIHRoaXMuZ2V0T3ZlcnRpbWVDb3N0KCkgKyB0aGlzLmdldFBlcnNvbm5lbENvc3QoKTsgXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TmFtZSgpe1xyXG4gICAgICAgIC8vIGp1c3QgZ3JhYiB0aGUgdmFsdWUgaW4gdGhlIGFwcHJvcCBuYW1lIGNvbHVtbiBmb3IgdGhlIGZpcnN0IHJvdyBvZiB0aGUgZmlyc3Qgbm9uLWVtcHR5IHRhYmxlXHJcbiAgICAgICAgY29uc3QgdGFibGVzID0gW3RoaXMubm9ucGVyc29ubmVsLnRhYmxlLCB0aGlzLnBlcnNvbm5lbC50YWJsZSwgdGhpcy5vdmVydGltZS50YWJsZSwgdGhpcy5yZXZlbnVlLnRhYmxlXTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgdGFibGUgb2YgdGFibGVzKSB7XHJcbiAgICAgICAgICBpZiAodGFibGUubGVuZ3RoID4gMCAmJiB0YWJsZVswXVsnQ29zdCBDZW50ZXIgTmFtZSddKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnQ29zdCBDZW50ZXIgJyArIHRhYmxlWzBdWydDb3N0IENlbnRlciBOYW1lJ107XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgLy8gSWYgYWxsIHRhYmxlcyBhcmUgZW1wdHksIHJldHVybiAnJ1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH0gIFxyXG5cclxuICAgIGFjY291bnRTdHJpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNjb3VudF9zdHJpbmc7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBcHByb3ByaWF0aW9uIHtcclxuICAgIGNvbnN0cnVjdG9yKGZ1bmQsIGFwcHJvcCl7XHJcbiAgICAgICAgY29uc3QgZnVuZE9iaiA9IG5ldyBGdW5kKGZ1bmQpO1xyXG4gICAgICAgIHRoaXMucGVyc29ubmVsID0gZnVuZE9iai5wZXJzb25uZWwuZmlsdGVyKCdBcHByb3ByaWF0aW9uJywgYXBwcm9wKTtcclxuICAgICAgICB0aGlzLm5vbnBlcnNvbm5lbCA9IGZ1bmRPYmoubm9ucGVyc29ubmVsLmZpbHRlcignQXBwcm9wcmlhdGlvbicsIGFwcHJvcCk7XHJcbiAgICAgICAgdGhpcy5vdmVydGltZSA9IGZ1bmRPYmoub3ZlcnRpbWUuZmlsdGVyKCdBcHByb3ByaWF0aW9uJywgYXBwcm9wKTtcclxuICAgICAgICB0aGlzLnJldmVudWUgPSBmdW5kT2JqLnJldmVudWUuZmlsdGVyKCdBcHByb3ByaWF0aW9uJywgYXBwcm9wKTtcclxuICAgICAgICAvLyBvd24gZGF0YVxyXG4gICAgICAgIHRoaXMuYXBwcm9wID0gYXBwcm9wO1xyXG4gICAgICAgIHRoaXMuZnVuZCA9IGZ1bmRPYmouZnVuZDtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29zdENlbnRlcnMoKXtcclxuICAgICAgICAvLyBidWlsZCBhIHNldCBvZiB1bmlxdWUgYXBwcm9wcmlhdGlvbnMgYWNyb3NzIGFsbCBsaW5lIGl0ZW1zIGZvciB0aGUgZnVuZFxyXG4gICAgICAgIGNvbnN0IGNjID0gbmV3IFNldChbLi4udGhpcy5wZXJzb25uZWwuY2MsXHJcbiAgICAgICAgICAgIC4uLnRoaXMub3ZlcnRpbWUuY2MsIFxyXG4gICAgICAgICAgICAuLi50aGlzLm5vbnBlcnNvbm5lbC5jYywgXHJcbiAgICAgICAgICAgIC4uLnRoaXMucmV2ZW51ZS5jY10pO1xyXG5cclxuICAgICAgICAvLyBpbml0aWFsaXplIGEgbGlzdCBwbGFjZWhvbGRlciBmb3IgdGhlIGFwcHJvcHJpYXRpb25zIG9iamVjdHNcclxuICAgICAgICBjb25zdCBjY0xpc3QgPSBbXTtcclxuICAgICAgICAvLyBidWlsZCBvdXQgbGlzdFxyXG4gICAgICAgIGNjLmZvckVhY2gobnVtID0+IHtcclxuICAgICAgICAgICAgY2NMaXN0LnB1c2gobmV3IENvc3RDZW50ZXIodGhpcy5mdW5kLCB0aGlzLmFwcHJvcCwgbnVtKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGNjTGlzdDtcclxuICAgIH1cclxuXHJcbiAgICB0b3RhbCgpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbm5lbC5nZXRTdW0oKSArIHRoaXMub3ZlcnRpbWUuZ2V0U3VtKCkgKyB0aGlzLm5vbnBlcnNvbm5lbC5nZXRTdW0oKTtcclxuICAgIH1cclxuXHJcbiAgICBuYW1lKCl7XHJcbiAgICAgICAgLy8ganVzdCBncmFiIHRoZSB2YWx1ZSBpbiB0aGUgYXBwcm9wIG5hbWUgY29sdW1uIGZvciB0aGUgZmlyc3Qgcm93IG9mIHRoZSBmaXJzdCBub24tZW1wdHkgdGFibGVcclxuICAgICAgICBjb25zdCB0YWJsZXMgPSBbdGhpcy5ub25wZXJzb25uZWwudGFibGUsIHRoaXMucGVyc29ubmVsLnRhYmxlLCB0aGlzLm92ZXJ0aW1lLnRhYmxlLCB0aGlzLnJldmVudWUudGFibGVdO1xyXG5cclxuICAgICAgICBmb3IgKGxldCB0YWJsZSBvZiB0YWJsZXMpIHtcclxuICAgICAgICAgIGlmICh0YWJsZS5sZW5ndGggPiAwICYmIHRhYmxlWzBdWydBcHByb3ByaWF0aW9uIE5hbWUnXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ0FwcHJvcHJpYXRpb24gJyArIHRhYmxlWzBdWydBcHByb3ByaWF0aW9uIE5hbWUnXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAvLyBJZiBhbGwgdGFibGVzIGFyZSBlbXB0eSwgcmV0dXJuICcnXHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgfSAgXHJcblxyXG4gICAgYWNjb3VudFN0cmluZygpe1xyXG4gICAgICAgIHJldHVybiBgJHt0aGlzLmZ1bmR9LSR7dGhpcy5hcHByb3B9YDtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcbi8vIEhvbGRzIGFsbCB0aGUgZGV0YWlsZWQgZGF0YSBmb3Igb25lIGZ1bmQncyBidWRnZXRcclxuZXhwb3J0IGNsYXNzIEZ1bmQge1xyXG4gICAgY29uc3RydWN0b3IoZnVuZCl7XHJcbiAgICAgICAgdGhpcy5mdW5kID0gZnVuZDtcclxuICAgICAgICB0aGlzLnBlcnNvbm5lbCA9IG5ldyBTdG9yZWRUYWJsZSgncGVyc29ubmVsJywgZnVuZCk7XHJcbiAgICAgICAgdGhpcy5vdmVydGltZSA9IG5ldyBTdG9yZWRUYWJsZSgnb3ZlcnRpbWUnLCBmdW5kKTtcclxuICAgICAgICB0aGlzLm5vbnBlcnNvbm5lbCA9IG5ldyBTdG9yZWRUYWJsZSgnbm9ucGVyc29ubmVsJywgZnVuZCk7XHJcbiAgICAgICAgdGhpcy5yZXZlbnVlID0gbmV3IFN0b3JlZFRhYmxlKCdyZXZlbnVlJywgZnVuZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QXBwcm9wcmlhdGlvbnMoKXtcclxuICAgICAgICAvLyBidWlsZCBhIHNldCBvZiB1bmlxdWUgYXBwcm9wcmlhdGlvbnMgYWNyb3NzIGFsbCBsaW5lIGl0ZW1zIGZvciB0aGUgZnVuZFxyXG4gICAgICAgIGNvbnN0IGFwcHJvcHMgPSBuZXcgU2V0KFsuLi50aGlzLnBlcnNvbm5lbC5hcHByb3BzLFxyXG4gICAgICAgICAgICAuLi50aGlzLm92ZXJ0aW1lLmFwcHJvcHMsIFxyXG4gICAgICAgICAgICAuLi50aGlzLm5vbnBlcnNvbm5lbC5hcHByb3BzLCBcclxuICAgICAgICAgICAgLi4udGhpcy5yZXZlbnVlLmFwcHJvcHNdKTtcclxuXHJcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSBhIGxpc3QgcGxhY2Vob2xkZXIgZm9yIHRoZSBhcHByb3ByaWF0aW9ucyBvYmplY3RzXHJcbiAgICAgICAgY29uc3QgYXBwcm9wc0xpc3QgPSBbXTtcclxuICAgICAgICAvLyBidWlsZCBvdXQgbGlzdFxyXG4gICAgICAgIGFwcHJvcHMuZm9yRWFjaChhcHByb3AgPT4ge1xyXG4gICAgICAgICAgICBhcHByb3BzTGlzdC5wdXNoKCBuZXcgQXBwcm9wcmlhdGlvbih0aGlzLmZ1bmQsIGFwcHJvcCkgKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gYXBwcm9wc0xpc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UGVyc29ubmVsQ29zdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wZXJzb25uZWwuZ2V0U3VtKCk7IFxyXG4gICAgfVxyXG5cclxuICAgIGdldE92ZXJ0aW1lQ29zdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vdmVydGltZS5nZXRTdW0oKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXROb25QZXJzb25uZWxDb3N0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5vbnBlcnNvbm5lbC5nZXRTdW0oKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRSZXZlbnVlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJldmVudWUuZ2V0U3VtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VG90YWwoKSB7IFxyXG4gICAgICAgIC8vIG9ubHkgc3VtIGV4cGVuZGl0dXJlcywgbm90IG5ldCBvZiByZXZlbnVlXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Tm9uUGVyc29ubmVsQ29zdCgpICsgdGhpcy5nZXRPdmVydGltZUNvc3QoKSArIHRoaXMuZ2V0UGVyc29ubmVsQ29zdCgpOyBcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRnVuZDsiLCJpbXBvcnQgRnVuZCBmcm9tIFwiLi9mdW5kLmpzXCI7XHJcbmltcG9ydCBGdW5kTG9va3VwVGFibGUgZnJvbSBcIi4vZnVuZF9sb29rdXBfdGFibGUuanNcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgQmFzZWxpbmUge1xyXG4gICAgLy8gYmFzZWxpbmUgd2lsbCBqdXN0IGNvbnRhaW4gYSBsaXN0IG9mIGZ1bmRzLCBlYWNoIHdpdGhcclxuICAgIC8vIHJ1bm5pbmcgdGFsbGllcyBmb3IgdGhlaXIgYnVkZ2V0c1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgY29uc3QgYWxsRnVuZHMgPSBGdW5kTG9va3VwVGFibGUubGlzdEZ1bmRzKCk7XHJcbiAgICAgICAgdGhpcy5mdW5kcyA9IFtdO1xyXG4gICAgICAgIGFsbEZ1bmRzLmZvckVhY2goKGZ1bmQpID0+IHsgXHJcbiAgICAgICAgICAgIHRoaXMuZnVuZHMucHVzaChuZXcgRnVuZChmdW5kKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9IFxyXG5cclxuICAgIHN0YXRpYyB0YXJnZXQoKSB7IHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndGFyZ2V0JykgfTtcclxuXHJcbiAgICBwZXJzb25uZWwoKSB7XHJcbiAgICAgICAgbGV0IHRvdGFsID0gMDtcclxuICAgICAgICB0aGlzLmZ1bmRzLmZvckVhY2goZnVuZCA9PiB7XHJcbiAgICAgICAgICAgIHRvdGFsICs9IGZ1bmQuZ2V0UGVyc29ubmVsQ29zdCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0b3RhbDtcclxuICAgIH1cclxuXHJcbiAgICBvdmVydGltZSgpIHtcclxuICAgICAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgICAgIHRoaXMuZnVuZHMuZm9yRWFjaChmdW5kID0+IHtcclxuICAgICAgICAgICAgdG90YWwgKz0gZnVuZC5nZXRPdmVydGltZUNvc3QoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdG90YWw7XHJcbiAgICB9XHJcblxyXG4gICAgbm9ucGVyc29ubmVsKCkge1xyXG4gICAgICAgIGxldCB0b3RhbCA9IDA7XHJcbiAgICAgICAgdGhpcy5mdW5kcy5mb3JFYWNoKGZ1bmQgPT4ge1xyXG4gICAgICAgICAgICB0b3RhbCArPSBmdW5kLmdldE5vblBlcnNvbm5lbENvc3QoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdG90YWw7XHJcbiAgICB9XHJcblxyXG4gICAgcmV2ZW51ZSgpIHtcclxuICAgICAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgICAgIHRoaXMuZnVuZHMuZm9yRWFjaChmdW5kID0+IHtcclxuICAgICAgICAgICAgdG90YWwgKz0gZnVuZC5nZXRSZXZlbnVlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRvdGFsO1xyXG4gICAgfVxyXG5cclxuICAgIHRvdGFsKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5vbnBlcnNvbm5lbCgpICsgdGhpcy5wZXJzb25uZWwoKSArIHRoaXMub3ZlcnRpbWUoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZW5GdW5kVG90YWwoKSB7XHJcbiAgICAgICAgY29uc3QgR0YgPSBuZXcgRnVuZCgxMDAwKTtcclxuICAgICAgICByZXR1cm4gR0YuZ2V0VG90YWwoKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmFzZWxpbmU7IiwiXHJcbi8vIGRhdGEgc3RydWN0dXJlIHRvIGhvbGQgaW5mb3JtYXRpb24gb24gbmV3IGluaXRpYXRpdmVzXHJcblxyXG5pbXBvcnQgeyBORVdfSU5JVF9DT0xTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgeyBjbGVhblN0cmluZyB9IGZyb20gXCIuLi91dGlscy9jb21tb25fdXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBJbml0aWF0aXZlIHtcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3Iocm93KSB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gcm93O1xyXG4gICAgICAgIHRoaXMubmFtZSA9IHJvd1tORVdfSU5JVF9DT0xTWyduYW1lJ11dO1xyXG4gICAgfVxyXG5cclxuICAgIGlkKCkge1xyXG4gICAgICAgIGxldCBoYXNoID0gNTM4MTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubmFtZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBoYXNoID0gKGhhc2ggPDwgNSkgKyBoYXNoICsgdGhpcy5uYW1lLmNoYXJDb2RlQXQoaSk7ICAvLyBoYXNoICogMzMgKyBjXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBoYXNoID4+PiAwOyAgLy8gRW5zdXJlIHBvc2l0aXZlIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyXHJcbiAgICB9XHJcblxyXG4gICAgcGVyc29ubmVsKCkgeyBcclxuICAgICAgICBpZiAodGhpcy5kYXRhW05FV19JTklUX0NPTFNbJ3BlcnNvbm5lbCddXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhW05FV19JTklUX0NPTFNbJ3BlcnNvbm5lbCddXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb3BlcmF0aW5nKCkgeyBcclxuICAgICAgICBpZiAodGhpcy5kYXRhW05FV19JTklUX0NPTFNbJ29wZXJhdGluZyddXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhW05FV19JTklUX0NPTFNbJ29wZXJhdGluZyddXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2FwaXRhbCgpIHsgXHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YVtORVdfSU5JVF9DT0xTWydjYXBpdGFsJ11dKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFbTkVXX0lOSVRfQ09MU1snY2FwaXRhbCddXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV2ZW51ZSgpIHsgXHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YVtORVdfSU5JVF9DT0xTWydyZXZlbnVlJ11dKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFbTkVXX0lOSVRfQ09MU1sncmV2ZW51ZSddXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdG90YWwoKSB7IFxyXG4gICAgICAgIGlmICh0aGlzLmRhdGFbTkVXX0lOSVRfQ09MU1sndG90YWwnXV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtORVdfSU5JVF9DT0xTWyd0b3RhbCddXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBJbml0aWF0aXZlOyIsIi8vIGRhdGEgc3RydWN0dXJlIHRvIHNhdmUgdGhlIHBvc3NpYmxlIHNlcnZpY2Ugb3B0aW9ucyBmb3IgdGhlIGRlcGFydG1lbnRcclxuZXhwb3J0IGNvbnN0IFNlcnZpY2VzID0ge1xyXG4gICAgc2F2ZSA6IGZ1bmN0aW9uKHNlcnZpY2VzKXtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnc2VydmljZXMtbGlzdCcsIEpTT04uc3RyaW5naWZ5KHNlcnZpY2VzKSk7XHJcbiAgICB9LFxyXG4gICAgbGlzdCA6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3NlcnZpY2VzLWxpc3QnKSkgfHwge307XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNlcnZpY2VzOyIsIlxyXG5pbXBvcnQgSW5pdGlhdGl2ZSBmcm9tIFwiLi9pbml0aWF0aXZlLmpzXCI7XHJcbmltcG9ydCB7IGNvbFN1bSB9IGZyb20gXCIuLi91dGlscy9jb21tb25fdXRpbHMuanNcIjtcclxuaW1wb3J0IHsgTkVXX0lOSVRfQ09MUywgVE9UQUxfQ09MVU1OUyB9IGZyb20gXCIuLi9jb25zdGFudHMvZXhjZWxfY29uc3RhbnRzLmpzXCI7XHJcblxyXG4vLyBkYXRhIHN0cnVjdHVyZSB0byBob2xkIHN1cHBsZW1lbnRhbCByZXF1ZXN0c1xyXG5leHBvcnQgY2xhc3MgU3VwcGxlbWVudGFsIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMudGFibGUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCduZXctaW5pdHMnKSk7XHJcbiAgICAgICAgdGhpcy5pbml0aWF0aXZlcyA9IFtdO1xyXG4gICAgICAgIGlmKHRoaXMudGFibGUpe1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlLmZvckVhY2goKHJvdykgPT4geyBcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhdGl2ZXMucHVzaChuZXcgSW5pdGlhdGl2ZShyb3cpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldEluaXRzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlLm1hcCgoaXRlbSkgPT4geyByZXR1cm4gaXRlbVtORVdfSU5JVF9DT0xTWyduYW1lJ11dIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHBlcnNvbm5lbCgpIHtcclxuICAgICAgICByZXR1cm4gY29sU3VtKHRoaXMudGFibGUsIE5FV19JTklUX0NPTFNbJ3BlcnNvbm5lbCddKTtcclxuICAgIH1cclxuXHJcbiAgICBvcGVyYXRpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbFN1bSh0aGlzLnRhYmxlLCBORVdfSU5JVF9DT0xTWydvcGVyYXRpbmcnXSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2FwaXRhbCgpIHtcclxuICAgICAgICByZXR1cm4gY29sU3VtKHRoaXMudGFibGUsIE5FV19JTklUX0NPTFNbJ2NhcGl0YWwnXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV2ZW51ZSgpIHtcclxuICAgICAgICByZXR1cm4gY29sU3VtKHRoaXMudGFibGUsIE5FV19JTklUX0NPTFNbJ3JldmVudWUnXSk7XHJcbiAgICB9XHJcblxyXG4gICAgdG90YWwoKXtcclxuICAgICAgICByZXR1cm4gY29sU3VtKHRoaXMudGFibGUsIFRPVEFMX0NPTFVNTlNbJ25ldy1pbml0cyddKTtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN1cHBsZW1lbnRhbDsiLCIvLyBtb2RlbHMvaW5kZXguanNcclxuXHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQWNjb3VudFN0cmluZyB9IGZyb20gJy4vYWNjb3VudF9zdHJpbmcuanMnO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIEJhc2VsaW5lIH0gZnJvbSAnLi9iYXNlbGluZS5qcyc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ3VycmVudEZ1bmQgfSBmcm9tICcuL2N1cnJlbnRfZnVuZC5qcyc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ3VycmVudFBhZ2UgfSBmcm9tICcuL2N1cnJlbnRfcGFnZS5qcyc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRnVuZCB9IGZyb20gJy4vZnVuZC5qcyc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRnVuZExvb2t1cFRhYmxlIH0gZnJvbSAnLi9mdW5kX2xvb2t1cF90YWJsZS5qcyc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSW5pdGlhdGl2ZSB9IGZyb20gJy4vaW5pdGlhdGl2ZS5qcyc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU2VydmljZXMgfSBmcm9tICcuL3NlcnZpY2VzLmpzJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBTdXBwbGVtZW50YWwgfSBmcm9tICcuL3N1cHBsZW1lbnRhbC5qcyc7XHJcbiIsImltcG9ydCB7IEZJU0NBTF9ZRUFSIH0gZnJvbSBcIi4uLy4uLy4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgeyBCYXNlbGluZSwgRnVuZExvb2t1cFRhYmxlLCBGdW5kLCBDdXJyZW50RnVuZCB9IGZyb20gXCIuLi8uLi8uLi9tb2RlbHNcIjtcclxuaW1wb3J0IHsgZm9ybWF0Q3VycmVuY3kgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvY29tbW9uX3V0aWxzXCI7XHJcbmltcG9ydCB7IHZpc2l0UGFnZSB9IGZyb20gXCIuLi8uLi8uLi92aWV3cy92aWV3X2xvZ2ljXCI7XHJcblxyXG5leHBvcnQgY29uc3QgQmFzZWxpbmVTZWN0aW9uID0ge1xyXG4gICAgX2RhdGE6IG5ldyBCYXNlbGluZSgpLFxyXG4gICAgX2dlbkZ1bmQgOiBuZXcgRnVuZCgxMDAwKSxcclxuXHJcbiAgICBnZXQgZGF0YSgpIHtcclxuICAgICAgICB0aGlzLl9kYXRhID0gbmV3IEJhc2VsaW5lKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XHJcbiAgICB9LFxyXG5cclxuICAgIHNldCBkYXRhKG5ld0RhdGEpIHtcclxuICAgICAgICB0aGlzLl9kYXRhID0gbmV3RGF0YTtcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0IGdlbkZ1bmQoKSB7XHJcbiAgICAgICAgdGhpcy5fZ2VuRnVuZCA9IG5ldyBGdW5kKDEwMDApO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZW5GdW5kO1xyXG4gICAgfSxcclxuXHJcbiAgICBzZXQgZ2VuRnVuZChuZXdGdW5kKSB7XHJcbiAgICAgICAgdGhpcy5fZ2VuRnVuZCA9IG5ld0Z1bmQ7XHJcbiAgICB9LFxyXG5cclxuICAgIHRhcmdldF9odG1sKCkge1xyXG4gICAgICAgIHJldHVybiBgXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9J3NpZGViYXItc3RhdC1saW5lJyBpZD1cInRhcmdldFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0LWxhYmVsXCI+Rlkke0ZJU0NBTF9ZRUFSfSBHZW5lcmFsIEZ1bmQgYmFzZWxpbmUgdGFyZ2V0Ojwvc3Bhbj4gXHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXRcIj4ke2Zvcm1hdEN1cnJlbmN5KEJhc2VsaW5lLnRhcmdldCgpKX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPSdzaWRlYmFyLXN0YXQtbGluZScgaWQ9XCJHRi10b3RhbFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0LWxhYmVsXCI+Q3VycmVudCBHRiBiYXNlbGluZTo8L3NwYW4+IFxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0XCI+JHtmb3JtYXRDdXJyZW5jeSh0aGlzLmdlbkZ1bmQuZ2V0VG90YWwoKSl9PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGJyPmA7XHJcbiAgICB9LFxyXG4gICAgXHJcbiAgICBmdW5kX2h0bWwoZnVuZCkge1xyXG4gICAgICAgIHJldHVybiBgXHJcbiAgICAgICAgICAgIDxoNj4ke0Z1bmRMb29rdXBUYWJsZS5nZXROYW1lKGZ1bmQuZnVuZCl9PC9oNj5cclxuICAgICAgICAgICAgPGhyPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPSdzaWRlYmFyLXN0YXQtbGluZSByZXZlbnVlJz5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdC1sYWJlbFwiPlByb2plY3RlZCByZXZlbnVlczo8L3NwYW4+IFxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0XCI+JHtmb3JtYXRDdXJyZW5jeShmdW5kLmdldFJldmVudWUoKSl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZWRpdCBlZGl0LWljb25cIiB0aXRsZT1cIkVkaXRcIj48L2k+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPSdzaWRlYmFyLXN0YXQtbGluZSBwZXJzb25uZWwnPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0LWxhYmVsXCI+UGVyc29ubmVsIGNvc3Q6PC9zcGFuPiBcclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdFwiPiR7Zm9ybWF0Q3VycmVuY3koZnVuZC5nZXRQZXJzb25uZWxDb3N0KCkpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWVkaXQgZWRpdC1pY29uXCIgdGl0bGU9XCJFZGl0XCI+PC9pPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz0nc2lkZWJhci1zdGF0LWxpbmUgb3ZlcnRpbWUnPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0LWxhYmVsXCI+T3ZlcnRpbWUgY29zdDo8L3NwYW4+IFxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0XCI+JHtmb3JtYXRDdXJyZW5jeShmdW5kLmdldE92ZXJ0aW1lQ29zdCgpKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1lZGl0IGVkaXQtaWNvblwiIHRpdGxlPVwiRWRpdFwiPjwvaT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9J3NpZGViYXItc3RhdC1saW5lIG5vbnBlcnNvbm5lbCc+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXQtbGFiZWxcIj5Ob24tcGVyc29ubmVsIGNvc3Q6PC9zcGFuPiBcclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdFwiPiR7Zm9ybWF0Q3VycmVuY3koZnVuZC5nZXROb25QZXJzb25uZWxDb3N0KCkpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWVkaXQgZWRpdC1pY29uXCIgdGl0bGU9XCJFZGl0XCI+PC9pPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz0nc2lkZWJhci1zdGF0LWxpbmUgZnVuZC10b3RhbCc+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXQtbGFiZWxcIj5Ub3RhbCBleHBlbmRpdHVyZXM6PC9zcGFuPiBcclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdFwiPiR7Zm9ybWF0Q3VycmVuY3koZnVuZC5nZXRUb3RhbCgpKX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8YnI+YDtcclxuICAgIH0sXHJcblxyXG4gICAgbGlua0VkaXRCdG5zKCkge1xyXG4gICAgICAgIGxldCBidG5zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmVkaXQtaWNvbicpO1xyXG4gICAgICAgIGJ0bnMuZm9yRWFjaCgoYnRuKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIEdldCB0aGUgZnVuZCBmcm9tIHRoZSBkaXYgdGhlIGJ1dHRvbiBpcyBpblxyXG4gICAgICAgICAgICBsZXQgZnVuZCA9IGJ0bi5jbG9zZXN0KCcuZnVuZC1kaXYnKS5pZC5yZXBsYWNlKCdmdW5kXycsICcnKTtcclxuICAgICAgICAgICAgbGV0IHBhZ2UgPSBidG4uY2xvc2VzdCgnLnNpZGViYXItc3RhdC1saW5lJykuY2xhc3NMaXN0WzFdO1xyXG4gICAgXHJcbiAgICAgICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgQ3VycmVudEZ1bmQudXBkYXRlKGZ1bmQpO1xyXG4gICAgICAgICAgICAgICAgdmlzaXRQYWdlKHBhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgdXBkYXRlKCkge1xyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lRGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Jhc2VsaW5lLXN0YXRzJyk7XHJcbiAgICAgICAgYmFzZWxpbmVEaXYuaW5uZXJIVE1MID0gdGhpcy50YXJnZXRfaHRtbCgpO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGEuZnVuZHMuZm9yRWFjaCgoZnVuZCkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgZnVuZERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgICAgICBmdW5kRGl2LmlkID0gYGZ1bmRfJHtmdW5kLmZ1bmR9YDtcclxuICAgICAgICAgICAgZnVuZERpdi5jbGFzc0xpc3QuYWRkKCdmdW5kLWRpdicpO1xyXG4gICAgICAgICAgICBmdW5kRGl2LmlubmVySFRNTCA9IHRoaXMuZnVuZF9odG1sKGZ1bmQpO1xyXG4gICAgICAgICAgICBiYXNlbGluZURpdi5hcHBlbmRDaGlsZChmdW5kRGl2KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYodGhpcy5nZW5GdW5kLmdldFRvdGFsKCkgPD0gQmFzZWxpbmUudGFyZ2V0KCkpe1xyXG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjR0YtdG90YWwgLnN0YXQnKS5zdHlsZS5jb2xvciA9IFwiZ3JlZW5cIjtcclxuICAgICAgICAgICAgLy8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Z1bmRfMTAwMCAuc2lkZWJhci1zdGF0LWxpbmU6bGFzdC1vZi10eXBlIC5zdGF0Jykuc3R5bGUuY29sb3IgPSBcImdyZWVuXCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0dGLXRvdGFsIC5zdGF0Jykuc3R5bGUuY29sb3IgPSBcInJlZFwiO1xyXG4gICAgICAgICAgICAvLyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZnVuZF8xMDAwIC5zaWRlYmFyLXN0YXQtbGluZTpsYXN0LW9mLXR5cGUgLnN0YXQnKS5zdHlsZS5jb2xvciA9IFwicmVkXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGlua0VkaXRCdG5zKCk7XHJcbiAgICB9XHJcbn07IiwiaW1wb3J0IHsgU3VwcGxlbWVudGFsIH0gZnJvbSBcIi4uLy4uLy4uL21vZGVsc1wiO1xyXG5pbXBvcnQgeyBmb3JtYXRDdXJyZW5jeSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jb21tb25fdXRpbHNcIjtcclxuaW1wb3J0IHsgdmlzaXRQYWdlIH0gZnJvbSBcIi4uLy4uLy4uL3ZpZXdzL3ZpZXdfbG9naWNcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBTdXBwU2VjdGlvbiA9IHtcclxuICAgIGh0bWwoKSB7XHJcbiAgICAgICAgdmFyIHN1cHAgPSBuZXcgU3VwcGxlbWVudGFsO1xyXG4gICAgICAgIHJldHVybiBgXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9J3NpZGViYXItc3RhdC1saW5lJyBpZD1cInN1cHAtcmV2ZW51ZVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0LWxhYmVsXCI+RXN0aW1hdGVkIFJldmVudWVzOjwvc3Bhbj4gXHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXRcIj4ke2Zvcm1hdEN1cnJlbmN5KHN1cHAucmV2ZW51ZSgpKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1lZGl0IGVkaXQtc3VwcFwiIHRpdGxlPVwiRWRpdFwiPjwvaT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9J3NpZGViYXItc3RhdC1saW5lJyBpZD1cInN1cHAtZXhwZW5zZXNcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdC1sYWJlbFwiPlBlcnNvbm5lbCBjb3N0Ojwvc3Bhbj4gXHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXRcIj4ke2Zvcm1hdEN1cnJlbmN5KHN1cHAucGVyc29ubmVsKCkpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWVkaXQgZWRpdC1zdXBwXCIgdGl0bGU9XCJFZGl0XCI+PC9pPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz0nc2lkZWJhci1zdGF0LWxpbmUnIGlkPVwic3VwcC1leHBlbnNlc1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0LWxhYmVsXCI+Tm9uLVBlcnNvbm5lbCBPcGVyYXRpbmc6PC9zcGFuPiBcclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdFwiPiR7Zm9ybWF0Q3VycmVuY3koc3VwcC5vcGVyYXRpbmcoKSl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZWRpdCBlZGl0LXN1cHBcIiB0aXRsZT1cIkVkaXRcIj48L2k+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPSdzaWRlYmFyLXN0YXQtbGluZScgaWQ9XCJzdXBwLWV4cGVuc2VzXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXQtbGFiZWxcIj5Ob24tUGVyc29ubmVsIENhcGl0YWw6PC9zcGFuPiBcclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdFwiPiR7Zm9ybWF0Q3VycmVuY3koc3VwcC5jYXBpdGFsKCkpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWVkaXQgZWRpdC1zdXBwXCIgdGl0bGU9XCJFZGl0XCI+PC9pPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz0nc2lkZWJhci1zdGF0LWxpbmUnIGlkPVwic3VwcC1leHBlbnNlc1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0LWxhYmVsXCI+VG90YWwgZXhwZW5kaXR1cmVzOjwvc3Bhbj4gXHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXRcIj4ke2Zvcm1hdEN1cnJlbmN5KHN1cHAudG90YWwoKSl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZWRpdCBlZGl0LXN1cHBcIiB0aXRsZT1cIkVkaXRcIj48L2k+XHJcbiAgICAgICAgICAgIDwvZGl2PmBcclxuICAgIH0sXHJcblxyXG4gICAgbGlua0VkaXRCdG5zKCkge1xyXG4gICAgICAgIGxldCBidG5zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmVkaXQtc3VwcCcpO1xyXG4gICAgICAgIGJ0bnMuZm9yRWFjaCgoYnRuKSA9PiB7XHJcbiAgICAgICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgdmlzaXRQYWdlKCduZXctaW5pdHMnKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIHVwZGF0ZSgpIHtcclxuICAgICAgICBjb25zdCBzdXBwRGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3N1cHAtc3RhdHMnKTtcclxuICAgICAgICBzdXBwRGl2LmlubmVySFRNTCA9IHRoaXMuaHRtbCgpO1xyXG4gICAgICAgIHRoaXMubGlua0VkaXRCdG5zKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN1cHBTZWN0aW9uOyIsImltcG9ydCAnLi9zaWRlYmFyLmNzcydcclxuaW1wb3J0IHsgQmFzZWxpbmVTZWN0aW9uIH0gZnJvbSAnLi9zdWJjb21wb25lbnRzL2Jhc2VsaW5lX3NlY3Rpb24nO1xyXG5cclxuaW1wb3J0IFN1cHBTZWN0aW9uIGZyb20gJy4vc3ViY29tcG9uZW50cy9zdXBwX3NlY3Rpb24nXHJcblxyXG4vLyBmZXRjaCBDU1MgdmFyaWFibGVzIHNhdmVkIGluIDpyb290XHJcbmNvbnN0IHJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XHJcbmNvbnN0IHNpZGVCYXJXaWR0aCA9IGdldENvbXB1dGVkU3R5bGUocm9vdCkuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zaWRlYmFyLXdpZHRoJykudHJpbSgpO1xyXG5cclxuZnVuY3Rpb24gaGlkZVNpZGViYXIoKSB7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2lkZWJhci1wYW5lbCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi1wYW5lbCcpLnN0eWxlLndpZHRoID0gJzEwMCUnOyBcclxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWRlcicpLnN0eWxlLndpZHRoID0gJzEwMCUnXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dTaWRlYmFyKCkge1xyXG4gICAgY29uc3Qgc2lkZWJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaWRlYmFyLXBhbmVsJyk7XHJcbiAgICBjb25zdCBtYWluUGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi1wYW5lbCcpO1xyXG4gICAgY29uc3QgaGVhZGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZGVyJyk7XHJcblxyXG4gICAgLy8gdXBkYXRlIHZhbHVlc1xyXG4gICAgdXBkYXRlVG90YWxzKCk7XHJcbiAgICBzaWRlYmFyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOyAvLyBTaG93IHRoZSBzaWRlYmFyXHJcbiAgICBcclxuICAgIC8vIENhbGN1bGF0ZSB0aGUgcmVtYWluaW5nIHdpZHRoIGZvciB0aGUgbWFpbiBwYW5lbCBhbmQgaGVhZGVyXHJcbiAgICB2YXIgY29udGVudFdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xyXG4gICAgbWFpblBhbmVsLnN0eWxlLndpZHRoID0gYCR7Y29udGVudFdpZHRoIC0gcGFyc2VJbnQoc2lkZUJhcldpZHRoLCAxMCl9cHhgOyBcclxuICAgIGhlYWRlci5zdHlsZS53aWR0aCA9IGAke2NvbnRlbnRXaWR0aCAtIHBhcnNlSW50KHNpZGVCYXJXaWR0aCwgMTApfXB4YDsgXHJcblxyXG4gICAgLy8gYWRkIGV2ZW50IGxpc3RlbmVyIHRvIHJlc2l6ZSBjb250ZW50IGlmIHdpbmRvdyBpcyBhZGp1c3RlZFxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHNob3dTaWRlYmFyKTtcclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlU2lkZWJhclRpdGxlKG5ld190aXRsZSl7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2lkZWJhci10aXRsZScpLnRleHRDb250ZW50ID0gbmV3X3RpdGxlO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVUb3RhbHMoKXtcclxuICAgIFN1cHBTZWN0aW9uLnVwZGF0ZSgpO1xyXG4gICAgQmFzZWxpbmVTZWN0aW9uLnVwZGF0ZSgpO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZXNldEFsbCgpe1xyXG4gICAgbG9jYWxTdG9yYWdlLmNsZWFyKCk7XHJcbiAgICAvLyByZXNldCBhbGwgc3RhdHMgdG8gMFxyXG4gICAgdXBkYXRlVG90YWxzKCk7XHJcbn1cclxuXHJcbmNvbnN0IFNpZGViYXIgPSB7XHJcbiAgICBTdXBwU2VjdGlvbiA6IFN1cHBTZWN0aW9uLFxyXG4gICAgQmFzZWxpbmVTZWN0aW9uIDogQmFzZWxpbmVTZWN0aW9uLFxyXG4gICAgaGlkZTogaGlkZVNpZGViYXIsXHJcbiAgICBzaG93OiBzaG93U2lkZWJhcixcclxuICAgIHVwZGF0ZVRpdGxlOiB1cGRhdGVTaWRlYmFyVGl0bGUsXHJcbiAgICB1cGRhdGVUb3RhbHM6IHVwZGF0ZVRvdGFscyxcclxuICAgIHJlc2V0OiByZXNldEFsbFxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgU2lkZWJhcjsiLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbmF2X2J1dHRvbnMuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbmF2X2J1dHRvbnMuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiLy8gbmF2X2J1dHRvbnMuanNcclxuaW1wb3J0ICcuL25hdl9idXR0b25zLmNzcyc7XHJcbmltcG9ydCB7IG5leHRQYWdlLCBsYXN0UGFnZSB9IGZyb20gJy4uLy4uL3ZpZXdzL3ZpZXdfbG9naWMuanMnO1xyXG5cclxuZnVuY3Rpb24gaW5pdGlhbGl6ZU5hdkJ1dHRvbnMoKSB7XHJcbiAgICAvLyBpbml0aWFsaXplIGxhc3QgYnV0dG9uXHJcbiAgICBjb25zdCBsYXN0X2J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG4tbGFzdCcpO1xyXG4gICAgbGFzdF9idG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsYXN0UGFnZSk7IFxyXG4gICAgLy8gaW5pdGlhbGl6ZSBuZXh0IGJ1dHRvblxyXG4gICAgY29uc3QgbmV4dF9idG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuLW5leHQnKTtcclxuICAgIG5leHRfYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbmV4dFBhZ2UpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBkaXNhYmxlKGJ1dHRvbl9pZCkge1xyXG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYnV0dG9uX2lkKTtcclxuICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdkaXNhYmxlZCcpO1xyXG4gICAgYnV0dG9uLmRpc2FibGVkID0gdHJ1ZTsgLy8gQWxzbyBkaXNhYmxlIGl0IGF0IHRoZSBET00gbGV2ZWxcclxufVxyXG5cclxuZnVuY3Rpb24gZW5hYmxlKGJ1dHRvbl9pZCkge1xyXG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYnV0dG9uX2lkKTtcclxuICAgIGJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdkaXNhYmxlZCcpO1xyXG4gICAgYnV0dG9uLmRpc2FibGVkID0gZmFsc2U7IC8vIEVuYWJsZSBpdCBhdCB0aGUgRE9NIGxldmVsXHJcbn1cclxuXHJcbmNvbnN0IE5leHQgPSB7XHJcbiAgICBkaXNhYmxlOiBmdW5jdGlvbigpIHsgZGlzYWJsZSgnYnRuLW5leHQnKTsgfSxcclxuICAgIGVuYWJsZTogZnVuY3Rpb24oKSB7IGVuYWJsZSgnYnRuLW5leHQnKTsgfSxcclxuICAgIGFkZEFjdGlvbjogZnVuY3Rpb24oZm4pIHtcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjYnRuLW5leHRgKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZuKTtcclxuICAgIH0sXHJcbiAgICByZW1vdmVBY3Rpb246IGZ1bmN0aW9uKGZuKSB7XHJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgI2J0bi1uZXh0YCkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmbik7XHJcbiAgICB9LFxyXG59O1xyXG5cclxuY29uc3QgTGFzdCA9IHtcclxuICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkgeyBkaXNhYmxlKCdidG4tbGFzdCcpOyB9LFxyXG4gICAgZW5hYmxlOiBmdW5jdGlvbigpIHsgZW5hYmxlKCdidG4tbGFzdCcpOyB9LFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IE5hdkJ1dHRvbnMgPSB7XHJcbiAgICBoaWRlOiBmdW5jdGlvbigpIHtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmF2LWJ0bnMnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgfSxcclxuICAgIHNob3c6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduYXYtYnRucycpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgIGluaXRpYWxpemVOYXZCdXR0b25zKCk7XHJcbiAgICB9LFxyXG4gICAgTmV4dDogTmV4dCxcclxuICAgIExhc3Q6IExhc3QsXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOYXZCdXR0b25zOyIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9ib2R5LmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2JvZHkuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2FjY29yZGlvbi5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9hY2NvcmRpb24uY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3RhYmxlLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3RhYmxlLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsImZ1bmN0aW9uIGFkZFRhYmxlSGVhZGVycyhjb2xzKXtcclxuXHJcbiAgICAvLyBHZXQgdGhlIHRhYmxlIGVsZW1lbnQgYnkgaXRzIElEXHJcbiAgICBjb25zdCB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXRhYmxlJyk7XHJcbiAgICBcclxuICAgIC8vIENyZWF0ZSBhIHRhYmxlIGhlYWRlciByb3cgZWxlbWVudFxyXG4gICAgY29uc3QgaGVhZGVyUm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTtcclxuXHJcbiAgICBjb2xzLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICAvLyBDcmVhdGUgYSBoZWFkZXIgY2VsbCBlbGVtZW50XHJcbiAgICAgICAgY29uc3QgaGVhZGVyQ2VsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RoJyk7XHJcbiAgICAgICAgaGVhZGVyQ2VsbC50ZXh0Q29udGVudCA9IGNvbFsndGl0bGUnXTtcclxuICAgICAgICBoZWFkZXJDZWxsLmNsYXNzTGlzdC5hZGQoY29sWydjbGFzc05hbWUnXSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQXBwZW5kIHRoZSBoZWFkZXIgY2VsbCB0byB0aGUgaGVhZGVyIHJvd1xyXG4gICAgICAgIGhlYWRlclJvdy5hcHBlbmRDaGlsZChoZWFkZXJDZWxsKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIEFwcGVuZCB0aGUgaGVhZGVyIHJvdyB0byB0aGUgdGFibGUgaGVhZGVyXHJcbiAgICBsZXQgdGhlYWQgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0aGVhZCcpO1xyXG4gICAgdGhlYWQuYXBwZW5kQ2hpbGQoaGVhZGVyUm93KTtcclxufVxyXG5cclxuY29uc3QgSGVhZGVyID0ge1xyXG4gICAgYWRkOiBmdW5jdGlvbihoZWFkZXJfYXJyYXkpe1xyXG4gICAgICAgIGFkZFRhYmxlSGVhZGVycyhoZWFkZXJfYXJyYXkpXHJcbiAgICB9XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBIZWFkZXI7IiwiaW1wb3J0IEhlYWRlciBmcm9tIFwiLi9oZWFkZXJzLmpzXCI7XHJcbmltcG9ydCB7IGZvcm1hdEN1cnJlbmN5IH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2NvbW1vbl91dGlscy5qc1wiO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gYWRkTmV3Um93KGRhdGFfZGljdGlvbmFyeSwgY29sdW1ucyA9IFtdKXtcclxuICAgIFxyXG4gICAgLy8gR2V0IHRoZSB0YWJsZSBlbGVtZW50IGJ5IGl0cyBJRFxyXG4gICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG5cclxuICAgIC8vIGNoZWNrIGlmIGhlYWRlciBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkXHJcbiAgICBsZXQgaGVhZGVyX3JvdyA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3RoZWFkIHRyJyk7XHJcbiAgICBpZiAoIWhlYWRlcl9yb3cpIHtcclxuICAgICAgICBIZWFkZXIuYWRkKGNvbHVtbnMpO1xyXG4gICAgICAgIGhlYWRlcl9yb3cgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0aGVhZCB0cicpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGluaXRpYWxpemUgbmV3IHJvdyBvZiBkYXRhXHJcbiAgICBjb25zdCBuZXdfcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTtcclxuXHJcbiAgICAvLyBnbyB0aHJvdWdoIGVhY2ggaGVhZGVyIGFuZCBhZGQgdGhlIHJpZ2h0IGNlbGwgdmFsdWUgZGVwZW5kaW5nIG9uIGl0cyBjbGFzc1xyXG4gICAgbGV0IHRoRWxlbWVudHMgPSBoZWFkZXJfcm93LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoJyk7XHJcbiAgICB0aEVsZW1lbnRzLmZvckVhY2goIChoZWFkZXJfY2VsbCkgPT4ge1xyXG4gICAgICAgIC8vIENyZWF0ZSBuZXcgY2VsbCBhbmQgYWRkIGl0IHRvIHRoZSByb3dcclxuICAgICAgICBjb25zdCBuZXdDZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTtcclxuICAgICAgICBuZXdfcm93LmFwcGVuZENoaWxkKG5ld0NlbGwpO1xyXG4gICAgICAgIC8vIGlmIHRoZSBkYXRhIGhhcyBhbiBhcHByb3ByaWF0ZSBjbGFzcywgYWRkIHRoZSBpbmZvIHRvIHRoZSBjZWxsLiBcclxuICAgICAgICAvLyBPdGhlcndpc2UsIGtlZXAgZW1wdHkgY2VsbFxyXG4gICAgICAgIE9iamVjdC5rZXlzKGRhdGFfZGljdGlvbmFyeSkuZm9yRWFjaCggKGNsYXNzTmFtZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaGVhZGVyX2NlbGwuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkgKXtcclxuICAgICAgICAgICAgICAgIG5ld0NlbGwudGV4dENvbnRlbnQgPSBkYXRhX2RpY3Rpb25hcnlbY2xhc3NOYW1lXTtcclxuICAgICAgICAgICAgICAgIG5ld0NlbGwuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBBcHBlbmQgdGhlIG5ldyByb3cgdG8gdGhlIHRhYmxlIGJvZHlcclxuICAgIGxldCB0Ym9keSA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5Jyk7XHJcbiAgICB0Ym9keS5hcHBlbmRDaGlsZChuZXdfcm93KTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2F2ZVJvd0VkaXRzKHJvdyl7XHJcbiAgICB2YXIgY2VsbHMgPSByb3cucXVlcnlTZWxlY3RvckFsbCgndGQnKVxyXG4gICAgY2VsbHMuZm9yRWFjaCggY2VsbCA9PiB7XHJcbiAgICAgICAgLy8gc2F2ZSBkcm9wZG93biB2YWx1ZXNcclxuICAgICAgICBpZiAoY2VsbC5xdWVyeVNlbGVjdG9yKCdzZWxlY3QnKSl7XHJcbiAgICAgICAgICAgIHZhciBzZXJ2aWNlU2VsZWN0b3IgPSBjZWxsLnF1ZXJ5U2VsZWN0b3IoJ3NlbGVjdCcpO1xyXG4gICAgICAgICAgICBjZWxsLnRleHRDb250ZW50ID0gc2VydmljZVNlbGVjdG9yLnZhbHVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY2VsbC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpKSB7XHJcbiAgICAgICAgICAgIC8vIHNhdmUgbmV3IGVudGVyZWQgdmFsdWUgaW4gdGV4dGJveFxyXG4gICAgICAgICAgICB2YXIgdGV4dGJveCA9IGNlbGwucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcclxuICAgICAgICAgICAgdmFyIGVudGVyZWRWYWx1ZSA9IHRleHRib3gudmFsdWU7XHJcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBkaXNwbGF5IGFuZCBmb3JtYXQgd2l0aCBjdXJyZW5jeSBpZiByZWxldmFudFxyXG4gICAgICAgICAgICBpZiAoIGNlbGwuY2xhc3NMaXN0LmNvbnRhaW5zKCdjb3N0JykgKXtcclxuICAgICAgICAgICAgICAgIC8vIGlmIGNvc3QsIHJlbW92ZSBjb21tYXMgZmlyc3RcclxuICAgICAgICAgICAgICAgIGVudGVyZWRWYWx1ZSA9IGVudGVyZWRWYWx1ZS5yZXBsYWNlQWxsKCcsJywgJycpO1xyXG4gICAgICAgICAgICAgICAgY2VsbC50ZXh0Q29udGVudCA9IGZvcm1hdEN1cnJlbmN5KGVudGVyZWRWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAvLyBzZXQgdmFsdWUgYXR0cmlidXRlIHRvIHRoZSBuZXcgdXNlciBpbnB1dFxyXG4gICAgICAgICAgICAgICAgY2VsbC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgZW50ZXJlZFZhbHVlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNlbGwudGV4dENvbnRlbnQgPSBlbnRlcmVkVmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKGNlbGwucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKSl7XHJcbiAgICAgICAgICAgIC8vIHNhdmUgbmV3IGVudGVyZWQgdmFsdWUgaW4gdGV4dGJveFxyXG4gICAgICAgICAgICB2YXIgZW50ZXJlZFZhbHVlID0gY2VsbC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpLnZhbHVlO1xyXG4gICAgICAgICAgICBjZWxsLnRleHRDb250ZW50ID0gZW50ZXJlZFZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH0pXHJcbn1cclxuXHJcbmNvbnN0IFJvd3MgPSB7XHJcbiAgICBhZGQgOiBmdW5jdGlvbihkYXRhX2RpY3Rpb25hcnksIGNvbHMpe1xyXG4gICAgICAgIGFkZE5ld1JvdyhkYXRhX2RpY3Rpb25hcnksIGNvbHMpXHJcbiAgICB9LFxyXG4gICAgc2F2ZUVkaXRzIDogZnVuY3Rpb24ocm93KXtcclxuICAgICAgICBzYXZlUm93RWRpdHMocm93KVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSb3dzOyIsImltcG9ydCBSb3dzIGZyb20gJy4vcm93cy5qcydcclxuXHJcbmZ1bmN0aW9uIGhpZGVCdXR0b24oY2xhc3NOYW1lKXtcclxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcclxuICAgICAgICB2YXIgYnV0dG9ucyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1dHRvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgYnV0dG9uc1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd0J1dHRvbihjbGFzc05hbWUpe1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHZhciBidXR0b25zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWUpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnV0dG9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBidXR0b25zW2ldLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZUJ1dHRvblRleHQoY2xhc3NOYW1lLCB0ZXh0KXtcclxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2NsYXNzTmFtZX1gKS50ZXh0Q29udGVudCA9IHRleHQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhbmRsZVJvd0VkaXQoYWN0aW9uT25DbGljaywgdXBkYXRlQ2FsbGJhY2sgPSBudWxsKXtcclxuICAgIC8vIGF0dGFjaCBhbiBldmVudCBsaXN0ZW5lciB0byBlYWNoIGVkaXQgYnV0dG9uIGluIGV2ZXJ5IHJvd1xyXG4gICAgdmFyIGVkaXRCdXR0b25zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYnRuLWVkaXQnKTtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWRpdEJ1dHRvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBlZGl0QnV0dG9uc1tpXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jIGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIC8vIERldGVybWluZSB3aGF0IHdhcyBjbGlja2VkIG9uIHdpdGhpbiB0aGUgdGFibGVcclxuICAgICAgICAgICAgdmFyIHJvd1RvRWRpdCA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCd0cicpO1xyXG4gICAgICAgICAgICAvLyBtYXJrIHJvdyBhcyBiZWluZyBlZGl0ZWRcclxuICAgICAgICAgICAgcm93VG9FZGl0LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZS1lZGl0aW5nJyk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyB0dXJuIHJlbGV2YW50IGVudHJpZXMgaW50byB0ZXh0Ym94ZXMsIHVzdWFsbHlcclxuICAgICAgICAgICAgYWN0aW9uT25DbGljaygpO1xyXG5cclxuICAgICAgICAgICAgLy8gaGlkZSBlZGl0IGJ1dHRvbnNcclxuICAgICAgICAgICAgRWRpdC5oaWRlKCk7XHJcbiAgICAgICAgICAgIGlmKHVwZGF0ZUNhbGxiYWNrKXtcclxuICAgICAgICAgICAgICAgIGluaXRpYWxpemVDb25maXJtQnV0dG9uKHVwZGF0ZUNhbGxiYWNrKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbmZpcm1CdXR0b24odXBkYXRlQ2FsbGJhY2spe1xyXG4gICAgLy8gZ2V0IGVsZW1lbnQgYW5kIGFkZCBsaXN0ZW5lciBmb3IgY2xpY2tcclxuICAgIHZhciByb3dUb0VkaXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYWN0aXZlLWVkaXRpbmcnKTtcclxuICAgIGNvbnN0IGNvbmZpcm1fYnRuID0gcm93VG9FZGl0LnF1ZXJ5U2VsZWN0b3IoXCIuYnRuLWNvbmZpcm1cIik7XHJcbiAgICAvLyBzaG93IHRoZSByb3cncyBjb25maXJtIGJ1dHRvblxyXG4gICAgY29uZmlybV9idG4uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICBjb25maXJtX2J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCl7O1xyXG4gICAgICAgIC8vIHNhdmUgcm93IGVkaXRzXHJcbiAgICAgICAgUm93cy5zYXZlRWRpdHMocm93VG9FZGl0KTtcclxuICAgICAgICAvLyB1cGRhdGUgdmFsdWVzIGluIHNpZGViYXJcclxuICAgICAgICB1cGRhdGVDYWxsYmFjaygpO1xyXG4gICAgICAgIC8vIG1ha2Ugcm93IG5vIGxvbmdlciBncmVlblxyXG4gICAgICAgIHJvd1RvRWRpdC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUtZWRpdGluZycpO1xyXG4gICAgICAgIC8vIHNob3cgZWRpdCBidXR0b25zIGFuZCBoaWRlIGNvbmZpcm0gYnV0dG9uc1xyXG4gICAgICAgIEVkaXQuc2hvdygpO1xyXG4gICAgICAgIENvbmZpcm0uaGlkZSgpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmNvbnN0IEVkaXQgPSB7XHJcbiAgICBodG1sOiAnPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZWRpdFwiPkVkaXQgcm93PC9idXR0b24+JyxcclxuICAgIGhpZGU6IGhpZGVCdXR0b24oJ2J0bi1lZGl0JyksXHJcbiAgICBzaG93OiBzaG93QnV0dG9uKCdidG4tZWRpdCcpLFxyXG4gICAgaW5pdCA6IGZ1bmN0aW9uKGFjdGlvbk9uQ2xpY2ssIHVwZGF0ZUNhbGxiYWNrKXtcclxuICAgICAgICBoYW5kbGVSb3dFZGl0KGFjdGlvbk9uQ2xpY2ssIHVwZGF0ZUNhbGxiYWNrKVxyXG4gICAgfVxyXG59O1xyXG5cclxuY29uc3QgRGVsZXRlID0ge1xyXG4gICAgaHRtbDogJzxidXR0b24gY2xhc3M9XCJidG4gYnRuLWRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPicsXHJcbiAgICBoaWRlOiBoaWRlQnV0dG9uKCdidG4tZGVsZXRlJyksXHJcbiAgICBzaG93OiBzaG93QnV0dG9uKCdidG4tZGVsZXRlJylcclxufTtcclxuXHJcbmNvbnN0IENvbmZpcm0gPSB7XHJcbiAgICBodG1sOiAnPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tY29uZmlybVwiPkNvbmZpcm08L2J1dHRvbj4nLFxyXG4gICAgaGlkZTogaGlkZUJ1dHRvbignYnRuLWNvbmZpcm0nKSxcclxuICAgIHNob3c6IHNob3dCdXR0b24oJ2J0bi1jb25maXJtJylcclxufTtcclxuXHJcbmNvbnN0IEFkZFJvdyA9IHtcclxuICAgIGhpZGU6IGhpZGVCdXR0b24oJ2J0bi1hZGQnKSxcclxuICAgIHNob3c6IHNob3dCdXR0b24oJ2J0bi1hZGQnKSxcclxuICAgIHVwZGF0ZVRleHQ6IGZ1bmN0aW9uKHRleHQpe1xyXG4gICAgICAgIHVwZGF0ZUJ1dHRvblRleHQoJ2J0bi1hZGQnLCB0ZXh0KTtcclxuICAgIH1cclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBCdXR0b25zID0ge1xyXG4gICAgRGVsZXRlOiBEZWxldGUsXHJcbiAgICBFZGl0IDogRWRpdCxcclxuICAgIENvbmZpcm0gOiBDb25maXJtLFxyXG4gICAgQWRkUm93IDogQWRkUm93LFxyXG4gICAgZWRpdF9jb25maXJtX2J0bnMgOiBFZGl0Lmh0bWwgKyBDb25maXJtLmh0bWwgLFxyXG4gICAgYWxsX2J0bnMgOiBEZWxldGUuaHRtbCArIEVkaXQuaHRtbCArIENvbmZpcm0uaHRtbFxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCdXR0b25zOyIsImZ1bmN0aW9uIGNyZWF0ZURyb3Bkb3duKGRhdGFBcnJheSkge1xyXG5cclxuICAvLyBDcmVhdGluZyBhIHNlbGVjdCBlbGVtZW50XHJcbiAgY29uc3Qgc2VsZWN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlbGVjdCcpO1xyXG5cclxuICAvLyBhZGQgYSBkZWZhdWx0IGJsYW5rIG9wdGlvbiB0byB0aGUgZGF0YUFycmF5XHJcbiAgZGF0YUFycmF5ID0gWycnXS5jb25jYXQoZGF0YUFycmF5KTtcclxuXHJcbiAgLy8gTG9vcGluZyB0aHJvdWdoIHRoZSBhcnJheSBhbmQgY3JlYXRpbmcgYW4gb3B0aW9uIGZvciBlYWNoIGVsZW1lbnRcclxuICBkYXRhQXJyYXkuZm9yRWFjaChpdGVtID0+IHtcclxuICAgIGNvbnN0IG9wdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcclxuICAgIG9wdGlvbkVsZW1lbnQudmFsdWUgPSBpdGVtO1xyXG4gICAgb3B0aW9uRWxlbWVudC50ZXh0Q29udGVudCA9IGl0ZW07XHJcbiAgICBzZWxlY3RFbGVtZW50LmFwcGVuZENoaWxkKG9wdGlvbkVsZW1lbnQpOyAvLyBBcHBlbmRpbmcgdGhlIG9wdGlvbiB0byB0aGUgc2VsZWN0XHJcbiAgfSk7XHJcblxyXG4gIC8vIFJldHVybiB0aGUgc2VsZWN0IGVsZW1lbnQgc28gaXQgY2FuIGJlIGFwcGVuZGVkIHRvIHRoZSBkb2N1bWVudFxyXG4gIHJldHVybiBzZWxlY3RFbGVtZW50O1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IERyb3Bkb3duID0ge1xyXG4gICAgY3JlYXRlIDogZnVuY3Rpb24oZGF0YUFycmF5KSB7IHJldHVybiBjcmVhdGVEcm9wZG93bihkYXRhQXJyYXkpIH0sXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IERyb3Bkb3duOyIsImltcG9ydCB7IGZvcm1hdEN1cnJlbmN5LCBkaXNwbGF5V2l0aENvbW1hcyB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jb21tb25fdXRpbHMuanNcIjtcclxuaW1wb3J0IFNlcnZpY2VzIGZyb20gXCIuLi8uLi8uLi9tb2RlbHMvc2VydmljZXMuanNcIjtcclxuaW1wb3J0IERyb3Bkb3duIGZyb20gXCIuLi8uLi9mb3JtL3N1YmNvbXBvbmVudHMvZHJvcGRvd24uanNcIjtcclxuXHJcbi8vIHJldHVybiBjZWxsIHZhbHVlIGF0dHJpYnV0ZSBvciAwIGlmIGl0IGRvZXMgbm90IGV4aXN0XHJcbmZ1bmN0aW9uIGdldENlbGxWYWx1ZShyb3csIGNsYXNzTmFtZSkge1xyXG4gICAgdmFyIGNlbGwgPSByb3cucXVlcnlTZWxlY3RvcihgLiR7Y2xhc3NOYW1lfWApO1xyXG4gICAgdmFyIGNlbGxWYWx1ZSA9IGNlbGwgPyBjZWxsLmdldEF0dHJpYnV0ZSgndmFsdWUnKSA6IG51bGw7XHJcbiAgICByZXR1cm4gY2VsbFZhbHVlID8gcGFyc2VGbG9hdChjZWxsVmFsdWUpIDogMDtcclxufVxyXG5cclxuLy8gcmV0dXJuIHRleHQgaW4gY2VsbFxyXG5mdW5jdGlvbiBnZXRDZWxsVGV4dChyb3csIGNsYXNzTmFtZSkge1xyXG4gICAgdmFyIGNlbGwgPSByb3cucXVlcnlTZWxlY3RvcihgLiR7Y2xhc3NOYW1lfWApO1xyXG4gICAgaWYgKGNlbGwpIHtcclxuICAgICAgICByZXR1cm4gY2VsbC50ZXh0Q29udGVudDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgRXJyb3IgcmV0cmlldmluZyBjZWxsIHRleHQgZm9yIGNsYXNzICR7Y2xhc3NOYW1lfWApO1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlVGFibGVDZWxsKHJvdywgY29sX2NsYXNzLCBuZXdfdmFsdWUpe1xyXG4gICAgY29uc3QgY2VsbCA9IHJvdy5xdWVyeVNlbGVjdG9yKGAuJHtjb2xfY2xhc3N9YCk7XHJcbiAgICBjZWxsLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBuZXdfdmFsdWUpO1xyXG4gICAgY2VsbC50ZXh0Q29udGVudCA9IGZvcm1hdEN1cnJlbmN5KG5ld192YWx1ZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUVkaXRhYmxlQ2VsbChjZWxsQ2xhc3MsIGlzQ29zdCwgdHlwZSA9ICdpbnB1dCcpe1xyXG4gICAgLy8gZ2V0IGNlbGxcclxuICAgIGNvbnN0IGNlbGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuYWN0aXZlLWVkaXRpbmcgdGQuJHtjZWxsQ2xhc3N9YCk7XHJcbiAgICAvLyBDcmVhdGUgYW4gaW5wdXQgZWxlbWVudCB0byBlZGl0IHRoZSB2YWx1ZVxyXG4gICAgdmFyIHRleHRib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUpO1xyXG4gICAgaWYgKHR5cGUgPT0gJ2lucHV0Jyl7XHJcbiAgICAgICAgdGV4dGJveC50eXBlID0gJ3RleHQnO1xyXG4gICAgfTtcclxuICAgIGlmIChpc0Nvc3Qpe1xyXG4gICAgICAgIHZhciB2YWx1ZSA9IGNlbGwuZ2V0QXR0cmlidXRlKCd2YWx1ZScpO1xyXG4gICAgICAgIHRleHRib3gudmFsdWUgPSBkaXNwbGF5V2l0aENvbW1hcyh2YWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRleHRib3gudmFsdWUgPSBjZWxsLnRleHRDb250ZW50O1xyXG4gICAgfVxyXG4gICAgLy8gQ2xlYXIgdGhlIGN1cnJlbnQgY29udGVudCBhbmQgYXBwZW5kIHRoZSB0ZXh0Ym94IHRvIHRoZSBjZWxsXHJcbiAgICBjZWxsLmlubmVySFRNTCA9ICcnO1xyXG4gICAgY2VsbC5hcHBlbmRDaGlsZCh0ZXh0Ym94KTtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlRHJvcGRvd24oY2VsbENsYXNzLCBvcHRpb25BcnJheSl7XHJcbiAgICAvLyBnZXQgY2VsbFxyXG4gICAgY29uc3QgY2VsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC5hY3RpdmUtZWRpdGluZyB0ZC4ke2NlbGxDbGFzc31gKTtcclxuICAgIC8vIGFkZCBzZXJ2aWNlIGRyb3Bkb3duXHJcbiAgICBjb25zdCBkcm9wZG93biA9IERyb3Bkb3duLmNyZWF0ZShvcHRpb25BcnJheSk7XHJcbiAgICBkcm9wZG93bi52YWx1ZSA9IGNlbGwudGV4dENvbnRlbnQ7XHJcbiAgICAvLyBDbGVhciB0aGUgY3VycmVudCBjb250ZW50IGFuZCBhcHBlbmQgdGhlIHRleHRib3ggdG8gdGhlIGNlbGxcclxuICAgIGNlbGwuaW5uZXJIVE1MID0gJyc7XHJcbiAgICBjZWxsLmFwcGVuZENoaWxkKGRyb3Bkb3duKTtcclxufVxyXG5cclxuY29uc3QgQ2VsbCA9IHtcclxuICAgIGdldFZhbHVlOiBmdW5jdGlvbihyb3csIGNsYXNzTmFtZSkge1xyXG4gICAgICAgIHJldHVybiBnZXRDZWxsVmFsdWUocm93LCBjbGFzc05hbWUpOyBcclxuICAgIH0sXHJcbiAgICBnZXRUZXh0OiBmdW5jdGlvbihyb3csIGNsYXNzTmFtZSkge1xyXG4gICAgICAgIHJldHVybiBnZXRDZWxsVGV4dChyb3csIGNsYXNzTmFtZSk7IFxyXG4gICAgfSxcclxuICAgIHVwZGF0ZVZhbHVlOiBmdW5jdGlvbihyb3csIGNvbF9jbGFzcywgbmV3X3ZhbHVlKSB7XHJcbiAgICAgICAgdXBkYXRlVGFibGVDZWxsKHJvdywgY29sX2NsYXNzLCBuZXdfdmFsdWUpOyBcclxuICAgIH0sXHJcbiAgICBjcmVhdGVUZXh0Ym94IDogZnVuY3Rpb24oY2xhc3NOYW1lLCBpc0Nvc3QsIHR5cGUpIHtcclxuICAgICAgICBjcmVhdGVFZGl0YWJsZUNlbGwoY2xhc3NOYW1lLCBpc0Nvc3QsIHR5cGUpXHJcbiAgICB9LFxyXG4gICAgY3JlYXRlU2VydmljZURyb3Bkb3duIDogICgpID0+IHsgY3JlYXRlRHJvcGRvd24oJ3NlcnZpY2UnLCBTZXJ2aWNlcy5saXN0KCkpIH0sXHJcbiAgICBjcmVhdGVEcm9wZG93biA6IGNyZWF0ZURyb3Bkb3duXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDZWxsOyIsImltcG9ydCB7IGZvcm1hdEN1cnJlbmN5IH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2NvbW1vbl91dGlscy5qc1wiO1xyXG5cclxuLy8gcG9zaXRpb24gaXMgaW5kZXggYXQgd2hpY2ggbmV3IGNvbHVtbiB3aWxsIGJlIGluc2VydGVkXHJcbmZ1bmN0aW9uIGFkZENvbChwb3NpdGlvbiwgaHRtbENvbnRlbnQgPSAnJywgaGVhZGVyVGl0bGUgPSAnJykge1xyXG4gICAgLy8gR2V0IHRoZSB0YWJsZSBlbGVtZW50IGJ5IGl0cyBJRFxyXG4gICAgbGV0IHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcclxuXHJcbiAgICAvLyBWYWxpZGF0ZSBwb3NpdGlvblxyXG4gICAgbGV0IG1heFBvc2l0aW9uID0gdGFibGUucm93c1swXS5jZWxscy5sZW5ndGg7XHJcbiAgICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID4gbWF4UG9zaXRpb24pIHtcclxuICAgICAgY29uc29sZS5lcnJvcihgUG9zaXRpb24gJHtwb3NpdGlvbn0gaXMgb3V0IG9mIGJvdW5kcy5gKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgLy8gSW5zZXJ0IHRoZSBoZWFkZXIgaWYgcHJvdmlkZWRcclxuICAgIGxldCB0aGVhZCA9IHRhYmxlLnRIZWFkO1xyXG4gICAgaWYgKGhlYWRlclRpdGxlICYmIHRoZWFkKSB7XHJcbiAgICAgIGxldCB0aCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RoJyk7XHJcbiAgICAgIHRoLmlubmVySFRNTCA9IGhlYWRlclRpdGxlOyAvLyBVc2UgaW5uZXJIVE1MIHRvIGluc2VydCBIVE1MIGNvbnRlbnRcclxuICAgICAgdGhlYWQucm93c1swXS5pbnNlcnRCZWZvcmUodGgsIHRoZWFkLnJvd3NbMF0uY2VsbHNbcG9zaXRpb25dKTtcclxuICAgIH1cclxuICBcclxuICAgIC8vIEluc2VydCBuZXcgY2VsbHMgaW50byBlYWNoIHJvdyBvZiB0aGUgdGFibGUgYm9keVxyXG4gICAgbGV0IHRib2R5ID0gdGFibGUudEJvZGllc1swXTtcclxuICAgIGlmICh0Ym9keSkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRib2R5LnJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgcm93ID0gdGJvZHkucm93c1tpXTtcclxuICAgICAgICBsZXQgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpO1xyXG4gICAgICAgIHRkLmlubmVySFRNTCA9IGh0bWxDb250ZW50OyAvLyBVc2UgaW5uZXJIVE1MIHRvIGluc2VydCBIVE1MIGNvbnRlbnRcclxuICAgICAgICByb3cuaW5zZXJ0QmVmb3JlKHRkLCByb3cuY2VsbHNbcG9zaXRpb25dKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBuY29scygpe1xyXG4gICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG4gICAgLy8gRW5zdXJlIHRoYXQgdGhlIHJvdyBleGlzdHMgYmVmb3JlIGNvdW50aW5nIHRoZSBjb2x1bW5zXHJcbiAgICByZXR1cm4gdGFibGUucm93c1swXS5jZWxscy5sZW5ndGg7XHJcbn1cclxuICBcclxuZnVuY3Rpb24gYWRkQ29sVG9FbmQoaHRtbENvbnRlbnRzID0gW10sIGhlYWRlclRpdGxlID0gJycpe1xyXG4gICAgLy8gY291bnQgY29sdW1ucyBhbmQgYWRkIG5ldyBjb2x1bW4gdG8gdGhlIGVuZFxyXG4gICAgY29uc3QgcG9zaXRpb24gPSBuY29scygnbWFpbi10YWJsZScpO1xyXG4gICAgYWRkQ29sKHBvc2l0aW9uLCBodG1sQ29udGVudHMsIGhlYWRlclRpdGxlKTtcclxufVxyXG5cclxuZnVuY3Rpb24gYXNzaWduQ2xhc3NUb0NvbHVtbihoZWFkZXJOYW1lLCBjbGFzc05hbWUpIHtcclxuICAgIC8vIEdldCB0aGUgdGFibGUgZWxlbWVudCBieSBpdHMgSURcclxuICAgIGxldCB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXRhYmxlJyk7XHJcblxyXG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiBieSBpdHMgaGVhZGVyIG5hbWVcclxuICAgIGNvbnN0IHRoZWFkID0gdGFibGUudEhlYWQ7XHJcbiAgICBsZXQgaGVhZGVyQ2VsbEluZGV4ID0gLTE7XHJcbiAgICBjb25zdCBoZWFkZXJDZWxscyA9IHRoZWFkLnJvd3NbMF0uY2VsbHM7IC8vIEFzc3VtaW5nIHRoZSBmaXJzdCByb3cgY29udGFpbnMgaGVhZGVyIGNlbGxzICg8dGg+KVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJDZWxscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmIChoZWFkZXJDZWxsc1tpXS50ZXh0Q29udGVudC50cmltKCkgPT09IGhlYWRlck5hbWUpIHtcclxuICAgICAgICAgICAgLy8gYXNzaWduIHRoZSBjbGFzcyB0byB0aGUgaGVhZGVyIGNlbGxcclxuICAgICAgICAgICAgaGVhZGVyQ2VsbHNbaV0uY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xyXG4gICAgICAgICAgICBoZWFkZXJDZWxsSW5kZXggPSBpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXJyb3IgY2hlY2tcclxuICAgIGlmIChoZWFkZXJDZWxsSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgTm8gaGVhZGVyIGZvdW5kIHdpdGggbmFtZSBcIiR7aGVhZGVyTmFtZX1cImApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICBcclxuICAgIC8vIEFzc2lnbiB0aGUgY2xhc3MgdG8gZWFjaCBjZWxsIGluIHRoZSBzcGVjaWZpZWQgY29sdW1uIGluZGV4IHdpdGhpbiB0aGUgdGJvZHlcclxuICAgIGxldCB0Ym9keSA9IHRhYmxlLnRCb2RpZXNbMF07XHJcbiAgICBpZiAodGJvZHkpIHtcclxuICAgICAgbGV0IGJvZHlSb3dzID0gdGJvZHkucm93cztcclxuICAgICAgZm9yIChsZXQgcm93IG9mIGJvZHlSb3dzKSB7XHJcbiAgICAgICAgaWYgKHJvdy5jZWxsc1toZWFkZXJDZWxsSW5kZXhdKSB7XHJcbiAgICAgICAgICByb3cuY2VsbHNbaGVhZGVyQ2VsbEluZGV4XS5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuZnVuY3Rpb24gYWRkQ29zdENsYXNzKGhlYWRlck5hbWUpe1xyXG4gICAgYXNzaWduQ2xhc3NUb0NvbHVtbiggaGVhZGVyTmFtZSwgJ2Nvc3QnKTtcclxuXHJcbiAgICAvLyBHZXQgYWxsIHRoZSBjZWxscyB3aXRoIHRoZSBzcGVjaWZpZWQgY2xhc3MgbmFtZVxyXG4gICAgY29uc3QgY2VsbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGB0ZC5jb3N0YCk7XHJcbiAgICAgIFxyXG4gICAgY2VsbHMuZm9yRWFjaChjZWxsID0+IHtcclxuICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdGV4dCBjb250ZW50IG9mIHRoZSBjZWxsIGFuZCBhc3NpZ24gaXQgdG8gJ3ZhbHVlJyBhdHRyaWJ1dGVcclxuICAgICAgICBpZiAoIWNlbGwuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKXtcclxuICAgICAgICAgICAgY29uc3QgY2VsbFRleHQgPSBjZWxsLnRleHRDb250ZW50LnRyaW0oKTtcclxuICAgICAgICAgICAgY29uc3QgY2VsbFZhbHVlID0gaXNOYU4oY2VsbFRleHQpIHx8IGNlbGxUZXh0ID09PSAnJyA/IDAgOiBwYXJzZUZsb2F0KGNlbGxUZXh0KTtcclxuICAgICAgICAgICAgY2VsbC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgY2VsbFZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIE5vdyBmb3JtYXQgdGhlIHRleHQgY29udGVudCBsaWtlIGN1cnJlbmN5IGFuZCByZXBsYWNlIGl0IGluIHRoZSBjZWxsXHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZEN1cnJlbmN5ID0gZm9ybWF0Q3VycmVuY3kocGFyc2VGbG9hdChjZWxsVmFsdWUpKTtcclxuICAgICAgICAgICAgY2VsbC50ZXh0Q29udGVudCA9IGZvcm1hdHRlZEN1cnJlbmN5O1xyXG4gICAgICAgIH1cclxuICAgICAgXHJcbiAgICB9KTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFzc2lnbkNvbHVtbkNsYXNzZXMoY29sdW1uRGVmaW5pdGlvbnMpIHtcclxuICAgIGNvbHVtbkRlZmluaXRpb25zLmZvckVhY2goY29sdW1uID0+IHtcclxuICAgICAgICAvLyBBc3NpZ24gY2xhc3MgdG8gY29sdW1uXHJcbiAgICAgICAgYXNzaWduQ2xhc3NUb0NvbHVtbihjb2x1bW4udGl0bGUsIGNvbHVtbi5jbGFzc05hbWUpO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgY29sdW1uIGlzIGEgY29zdCBjb2x1bW4sIGFkZCB0aGUgc3BlY2lmaWMgY29zdCBjbGFzc1xyXG4gICAgICAgIGlmIChjb2x1bW4uaXNDb3N0KSB7XHJcbiAgICAgICAgICAgIGFkZENvc3RDbGFzcyhjb2x1bW4udGl0bGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc2hvdyB0aGUgY29sdW1uXHJcbiAgICAgICAgaWYgKCFjb2x1bW4uaGlkZSl7XHJcbiAgICAgICAgICAgIHNob3dDb2x1bW5CeVRpdGxlKGNvbHVtbi50aXRsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhpZGVDb2x1bW4oaW5kZXgpIHtcclxuICB2YXIgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG4gIHZhciByb3dzID0gdGFibGUucm93cztcclxuXHJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHZhciBjZWxscyA9IHJvd3NbaV0uY2VsbHM7XHJcbiAgICAgIGlmIChjZWxscy5sZW5ndGggPiBpbmRleCkge1xyXG4gICAgICAgICAgY2VsbHNbaW5kZXhdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vIEZ1bmN0aW9uIHRvIHNob3cgYSBzcGVjaWZpYyBjb2x1bW5cclxuZnVuY3Rpb24gc2hvd0NvbHVtbihpbmRleCkge1xyXG4gIHZhciB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXRhYmxlJyk7XHJcbiAgdmFyIHJvd3MgPSB0YWJsZS5yb3dzO1xyXG5cclxuICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdmFyIGNlbGxzID0gcm93c1tpXS5jZWxscztcclxuICAgICAgaWYgKGNlbGxzLmxlbmd0aCA+IGluZGV4KSB7XHJcbiAgICAgICAgICBjZWxsc1tpbmRleF0uc3R5bGUuZGlzcGxheSA9ICd0YWJsZS1jZWxsJztcclxuICAgICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8gRnVuY3Rpb24gdG8gZ2V0IHRoZSBjb2x1bW4gaW5kZXggYnkgdGl0bGVcclxuZnVuY3Rpb24gZ2V0Q29sdW1uSW5kZXhCeVRpdGxlKHRhYmxlLCB0aXRsZSkge1xyXG4gIHZhciBoZWFkZXJzID0gdGFibGUucXVlcnlTZWxlY3RvckFsbCgndGgnKTtcclxuICBmb3IgKHZhciBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKGhlYWRlcnNbaV0uaW5uZXJUZXh0ID09PSB0aXRsZSkge1xyXG4gICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIC0xOyAvLyBDb2x1bW4gbm90IGZvdW5kXHJcbn1cclxuXHJcbi8vIEZ1bmN0aW9uIHRvIGhpZGUgYSBjb2x1bW4gYnkgdGl0bGVcclxuZnVuY3Rpb24gaGlkZUNvbHVtbkJ5VGl0bGUodGl0bGUpIHtcclxuICB2YXIgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG4gIHZhciBpbmRleCA9IGdldENvbHVtbkluZGV4QnlUaXRsZSh0YWJsZSwgdGl0bGUpO1xyXG4gIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgaGlkZUNvbHVtbihpbmRleCk7XHJcbiAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5sb2coYENvbHVtbiB3aXRoIHRpdGxlIFwiJHt0aXRsZX1cIiBub3QgZm91bmQuYCk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyBGdW5jdGlvbiB0byBzaG93IGEgY29sdW1uIGJ5IHRpdGxlXHJcbmZ1bmN0aW9uIHNob3dDb2x1bW5CeVRpdGxlKHRpdGxlKSB7XHJcbiAgdmFyIHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcclxuICB2YXIgaW5kZXggPSBnZXRDb2x1bW5JbmRleEJ5VGl0bGUodGFibGUsIHRpdGxlKTtcclxuICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgIHNob3dDb2x1bW4oaW5kZXgpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBDb2x1bW4gd2l0aCB0aXRsZSBcIiR7dGl0bGV9XCIgbm90IGZvdW5kLmApO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbmNvbnN0IENvbHVtbiA9IHtcclxuICBhZGQ6IGZ1bmN0aW9uKHBvc2l0aW9uLCBodG1sQ29udGVudCwgaGVhZGVyVGl0bGUpIHtcclxuICAgICAgcmV0dXJuIGFkZENvbChwb3NpdGlvbiwgaHRtbENvbnRlbnQsIGhlYWRlclRpdGxlKTtcclxuICB9LFxyXG4gIGFkZEF0RW5kOiBmdW5jdGlvbihodG1sQ29udGVudCwgaGVhZGVyVGl0bGUpIHtcclxuICAgICAgcmV0dXJuIGFkZENvbFRvRW5kKGh0bWxDb250ZW50LCBoZWFkZXJUaXRsZSk7XHJcbiAgfSxcclxuICBhc3NpZ25DbGFzc2VzOiBmdW5jdGlvbihjb2x1bW5fZGVmaW5pdGlvbnMpIHtcclxuICAgICAgcmV0dXJuIGFzc2lnbkNvbHVtbkNsYXNzZXMoY29sdW1uX2RlZmluaXRpb25zKTtcclxuICB9LFxyXG4gIGhpZGUgOiBmdW5jdGlvbihjb2xOYW1lKSB7XHJcbiAgICAgIGhpZGVDb2x1bW5CeVRpdGxlKGNvbE5hbWUpO1xyXG4gIH0sXHJcbiAgc2hvdyA6IGZ1bmN0aW9uKGNvbE5hbWUpIHtcclxuICAgICAgc2hvd0NvbHVtbkJ5VGl0bGUoY29sTmFtZSk7XHJcbiAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ29sdW1uOyIsImltcG9ydCBGdW5kTG9va3VwVGFibGUgZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2Z1bmRfbG9va3VwX3RhYmxlLmpzJztcclxuaW1wb3J0IEN1cnJlbnRGdW5kIGZyb20gJy4uLy4uLy4uL21vZGVscy9jdXJyZW50X2Z1bmQuanMnXHJcbmltcG9ydCBDdXJyZW50UGFnZSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvY3VycmVudF9wYWdlLmpzJ1xyXG5pbXBvcnQgVGFibGUgZnJvbSAnLi4vdGFibGUuanMnO1xyXG5cclxuZnVuY3Rpb24gZmlsbFRhYmxlKGRhdGEpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG4gICAgICAgIGNvbnN0IHRoZWFkID0gdGFibGUucXVlcnlTZWxlY3RvcigndGhlYWQnKTtcclxuICAgICAgICBjb25zdCB0Ym9keSA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5Jyk7XHJcblxyXG4gICAgICAgIC8vIGNsZWFyIGV4aXN0aW5nIGRhdGFcclxuICAgICAgICB0aGVhZC5pbm5lckhUTUwgPSAnJztcclxuICAgICAgICB0Ym9keS5pbm5lckhUTUwgPSAnJztcclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIHRhYmxlIGhlYWRlciByb3dcclxuICAgICAgICBjb25zdCBoZWFkZXJSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKGRhdGFbMF0pLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGgnKTtcclxuICAgICAgICAgICAgaGVhZGVyLnRleHRDb250ZW50ID0ga2V5O1xyXG4gICAgICAgICAgICBoZWFkZXJSb3cuYXBwZW5kQ2hpbGQoaGVhZGVyKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGVhZC5hcHBlbmRDaGlsZChoZWFkZXJSb3cpO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgdGFibGUgYm9keSByb3dzXHJcbiAgICAgICAgZGF0YS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpO1xyXG4gICAgICAgICAgICBPYmplY3QudmFsdWVzKGl0ZW0pLmZvckVhY2godmFsID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpO1xyXG4gICAgICAgICAgICAgICAgY2VsbC5pbm5lckhUTUwgPSB2YWw7XHJcbiAgICAgICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoY2VsbCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0Ym9keS5hcHBlbmRDaGlsZChyb3cpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSBjYXRjaChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHRhYmxlIHNhdmVkIGluIGxvY2FsU3RvcmFnZTonLCBlcnJvcik7XHJcbiAgICB9XHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGxvYWRGcm9tU3RvcmFnZSgpe1xyXG4gICAgLy8gbG9vayB1cCB0YWJsZSBuYW1lIGluIHN0b3JhZ2VcclxuICAgIGlmIChDdXJyZW50RnVuZC5udW1iZXIoKSl7XHJcbiAgICAgICAgdmFyIGtleSA9IGAke0N1cnJlbnRQYWdlLmxvYWQoKX1fJHtDdXJyZW50RnVuZC5udW1iZXIoKX1gO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB2YXIga2V5ID0gQ3VycmVudFBhZ2UubG9hZCgpO1xyXG4gICAgfVxyXG4gICAgLy8gbG9hZCBmcm9tIGxvY2FsIHN0b3JhZ2VcclxuICAgIGNvbnN0IGRhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xyXG4gICAgLy8gaWYgbm90aGluZyBpbiBzdG9yYWdlLCByZXR1cm4gYSB6ZXJvXHJcbiAgICBpZiAoICFkYXRhICkge1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBvdGhlcndpc2UsIGZpbGwgdGFibGUgaW4gSFRNTCBhbmQgcmV0dXJuIHN1Y2Nlc3MgKDEpXHJcbiAgICAgICAgVGFibGUuc2hvdygpO1xyXG4gICAgICAgIGZpbGxUYWJsZShhd2FpdCBKU09OLnBhcnNlKGRhdGEpKTtcclxuICAgICAgICByZXR1cm4gMTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbmZ1bmN0aW9uIGxvYWRGdW5kcygpe1xyXG4gICAgLy8gZ2V0IGxpc3Qgb2YgZnVuZHMgZnJvbSBzdG9yYWdlXHJcbiAgICBjb25zdCBmdW5kRGljdCA9IEZ1bmRMb29rdXBUYWJsZS5yZXRyaWV2ZSgpO1xyXG4gICAgLy8gYnVpbGQgb3V0IGRhdGEgaW4gY29ycmVjdCBmb3JtYXRcclxuICAgIGNvbnN0IHJldCA9IFtdO1xyXG4gICAgT2JqZWN0LmtleXMoZnVuZERpY3QpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAvLyBkZXRlcm1pbmUgaWYgdGhlIGZ1bmQgaGFzIGFscmVhZHkgYmVlbiBlZGl0ZWRcclxuICAgICAgICBpZiAoZnVuZERpY3Rba2V5XVsndmlld2VkJ10pe1xyXG4gICAgICAgICAgICAvLyB0b2RvOiBhZGQgYSBjaGVja21hcmsgaGVyZVxyXG4gICAgICAgICAgICByZXQucHVzaCh7J0Z1bmQnIDogIGA8c3BhbiBjbGFzcyA9ICd2aWV3ZWQtZnVuZCc+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGVja1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtmdW5kRGljdFtrZXldWyduYW1lJ119XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPmB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXQucHVzaCh7J0Z1bmQnIDogYDxzcGFuIGNsYXNzID0gJ3Vudmlld2VkLWZ1bmQnPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtmdW5kRGljdFtrZXldWyduYW1lJ119XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPmB9KTsgICBcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIGZpbGxUYWJsZShyZXQpO1xyXG59XHJcblxyXG5cclxuZnVuY3Rpb24gZ2V0Q29sdW1uSW5kZXhCeUNsYXNzKHRib2R5LCBjbGFzc05hbWUpIHtcclxuICBjb25zdCBmaXJzdFJvdyA9IHRib2R5LnJvd3NbMF07XHJcbiAgaWYgKCFmaXJzdFJvdykgcmV0dXJuIC0xOyAvLyBSZXR1cm4gLTEgaWYgdGhlcmUncyBubyByb3cgdG8gZXhhbWluZVxyXG4gIGZvciAobGV0IGNlbGxJbmRleCA9IDA7IGNlbGxJbmRleCA8IGZpcnN0Um93LmNlbGxzLmxlbmd0aDsgY2VsbEluZGV4KyspIHtcclxuICAgICAgaWYgKGZpcnN0Um93LmNlbGxzW2NlbGxJbmRleF0uY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkpIHtcclxuICAgICAgICAgIHJldHVybiBjZWxsSW5kZXg7XHJcbiAgICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIC0xOyAvLyBSZXR1cm4gLTEgaWYgY2xhc3MgbmFtZSBub3QgZm91bmRcclxufVxyXG5cclxuLy8gZnVuY3Rpb24gc29ydChwcmltYXJ5Q2xhc3MsIHNlY29uZGFyeUNsYXNzKSB7XHJcbi8vICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG4vLyAgIGNvbnN0IHRib2R5ID0gdGFibGUudEJvZGllc1swXTtcclxuLy8gICBjb25zdCByb3dzID0gQXJyYXkuZnJvbSh0Ym9keS5yb3dzKTtcclxuXHJcbi8vICAgLy8gR2V0IHRoZSBjb2x1bW4gaW5kaWNlcyBieSBjbGFzcyBuYW1lXHJcbi8vICAgY29uc3QgcHJpbWFyeUNvbEluZGV4ID0gZ2V0Q29sdW1uSW5kZXhCeUNsYXNzKHRib2R5LCBwcmltYXJ5Q2xhc3MpO1xyXG4vLyAgIGNvbnN0IHNlY29uZGFyeUNvbEluZGV4ID0gZ2V0Q29sdW1uSW5kZXhCeUNsYXNzKHRib2R5LCBzZWNvbmRhcnlDbGFzcyk7XHJcblxyXG4vLyAgIC8vIGV4aXQgaWYgY2xhc3NlcyBkb24ndCBleGlzdFxyXG4vLyAgIGlmIChwcmltYXJ5Q29sSW5kZXggPT09IC0xICkge1xyXG4vLyAgICAgICBjb25zb2xlLmVycm9yKGBDb2x1bW4gY2xhc3MgJHtjbGFzc0F9IG5vdCBmb3VuZCBpbiB0YWJsZWApO1xyXG4vLyAgICAgICByZXR1cm47IFxyXG4vLyAgIH0gZWxzZSBpZiAoc2Vjb25kYXJ5Q29sSW5kZXggPT09IC0xKSB7XHJcbi8vICAgICAgIGNvbnNvbGUuZXJyb3IoYENvbHVtbiBjbGFzcyAke2NsYXNzQn0gbm90IGZvdW5kIGluIHRhYmxlYCk7XHJcbi8vICAgICAgIHJldHVybjsgXHJcbi8vICAgfVxyXG5cclxuLy8gICAvLyBTb3J0IHRoZSByb3dzIGJhc2VkIG9uIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGNlbGxzXHJcbi8vICAgcm93cy5zb3J0KChyb3dBLCByb3dCKSA9PiB7XHJcbi8vICAgICAgIC8vIFByaW1hcnkgY29sdW1uIGNvbXBhcmlzb25cclxuLy8gICAgICAgY29uc3QgcHJpbWFyeUEgPSB1bmZvcm1hdEN1cnJlbmN5KHJvd0EuY2VsbHNbcHJpbWFyeUNvbEluZGV4XS50ZXh0Q29udGVudCk7XHJcbi8vICAgICAgIGNvbnN0IHByaW1hcnlCID0gdW5mb3JtYXRDdXJyZW5jeShyb3dCLmNlbGxzW3ByaW1hcnlDb2xJbmRleF0udGV4dENvbnRlbnQpO1xyXG5cclxuLy8gICAgICAgaWYgKHByaW1hcnlBIDwgcHJpbWFyeUIpIHJldHVybiAtMTtcclxuLy8gICAgICAgaWYgKHByaW1hcnlBID4gcHJpbWFyeUIpIHJldHVybiAxO1xyXG5cclxuLy8gICAgICAgLy8gU2Vjb25kYXJ5IGNvbHVtbiBjb21wYXJpc29uIChpZiBwcmltYXJ5IGlzIGVxdWFsKVxyXG4vLyAgICAgICBjb25zdCBzZWNvbmRhcnlBID0gdW5mb3JtYXRDdXJyZW5jeShyb3dBLmNlbGxzW3NlY29uZGFyeUNvbEluZGV4XS50ZXh0Q29udGVudCk7XHJcbi8vICAgICAgIGNvbnN0IHNlY29uZGFyeUIgPSB1bmZvcm1hdEN1cnJlbmN5KHJvd0IuY2VsbHNbc2Vjb25kYXJ5Q29sSW5kZXhdLnRleHRDb250ZW50KTtcclxuXHJcbi8vICAgICAgIGlmIChzZWNvbmRhcnlBIDwgc2Vjb25kYXJ5QikgcmV0dXJuIC0xO1xyXG4vLyAgICAgICBpZiAoc2Vjb25kYXJ5QSA+IHNlY29uZGFyeUIpIHJldHVybiAxO1xyXG5cclxuLy8gICAgICAgLy8gSWYgYm90aCBjb2x1bW5zIGFyZSBlcXVhbFxyXG4vLyAgICAgICByZXR1cm4gMDtcclxuLy8gICB9KTtcclxuXHJcbi8vICAgLy8gUmVhdHRhY2ggc29ydGVkIHJvd3MgdG8gdGhlIHRhYmxlIGJvZHlcclxuLy8gICByb3dzLmZvckVhY2goKHJvdykgPT4gdGJvZHkuYXBwZW5kQ2hpbGQocm93KSk7XHJcbi8vIH1cclxuXHJcblxyXG5leHBvcnQgY29uc3QgRGF0YSA9IHtcclxuICAgIGxvYWQgOiBsb2FkRnJvbVN0b3JhZ2UsXHJcbiAgICBsb2FkRnVuZHMgOiBsb2FkRnVuZHMsXHJcbiAgICBzb3J0IDogZnVuY3Rpb24oY29sQSwgY29sQikgeyBzb3J0KGNvbEEsIGNvbEIpIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRGF0YTsiLCIvLyBIZWxwZXIgZnVuY3Rpb25zICYgY29uc3RhbnRzXHJcblxyXG4vLyBvYmplY3QgdG8gaG9sZCBhbGwgY3VycmVudCBmaWx0ZXIgc3RhdHVzZXNcclxuY29uc3QgZmlsdGVyU2V0dGluZ3MgPSB7XHJcbiAgICAnYXBwcm9wLW5hbWUnOiAnJyxcclxuICAgICdjYy1uYW1lJzogJycsXHJcbiAgICAnb2JqZWN0LW5hbWUnOiAnJyxcclxuICAgICdvYmplY3QtY2F0ZWdvcnknOiAnJ1xyXG59O1xyXG5cclxuLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGZpbHRlciBkYXRhIGJhc2VkIG9uIGFsbCBmaWx0ZXJzXHJcbmZ1bmN0aW9uIGZpbHRlckRhdGEoKSB7XHJcbiAgICAvLyBHZXQgYWxsIHJvd3MgaW4gdGhlIHRhYmxlXHJcbiAgICBjb25zdCByb3dzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI21haW4tdGFibGUgdGJvZHkgdHInKTtcclxuICAgIFxyXG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggcm93IGFuZCBkZXRlcm1pbmUgaWYgaXQgc2hvdWxkIGJlIGhpZGRlbiBvciBzaG93blxyXG4gICAgcm93cy5mb3JFYWNoKHJvdyA9PiB7XHJcbiAgICAgICAgbGV0IGlzVmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQ2hlY2sgZWFjaCBmaWx0ZXIgc2V0dGluZyBhZ2FpbnN0IHRoZSByb3cncyBjZWxsc1xyXG4gICAgICAgIGZvciAoY29uc3QgW2ZpbHRlcklkLCBmaWx0ZXJWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmlsdGVyU2V0dGluZ3MpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSByb3cucXVlcnlTZWxlY3RvcihgLiR7ZmlsdGVySWR9YCk7XHJcblxyXG4gICAgICAgICAgICAvLyBvbmx5IHNob3cgcm93IGlmIHZhbHVlcyBwYXNzIHRocm91Z2ggYWxsIGZpbHRlcnMgXHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZSAmJiBjZWxsICYmIChjZWxsLnRleHRDb250ZW50LnRyaW0oKSAhPT0gZmlsdGVyVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICBpc1Zpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9IFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2hvdyBvciBoaWRlIHRoZSByb3cgYmFzZWQgb24gdmlzaWJpbGl0eVxyXG4gICAgICAgIHJvdy5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLCAhaXNWaXNpYmxlKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5jb25zdCBGaWx0ZXIgPSB7XHJcbiAgICBodG1sKGZpbHRlckxhYmVsLCBmaWx0ZXJDbGFzcykge1xyXG4gICAgICAgIC8vIGJhc2ljIGh0bWwgd2l0aCBvbmx5ICdBbGwnIG9wdGlvblxyXG4gICAgICAgIHJldHVybiBgPGxhYmVsIGZvcj1cImZpbHRlci0ke2ZpbHRlckNsYXNzfVwiPkZpbHRlciBieSAke2ZpbHRlckxhYmVsfTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImZpbHRlci0ke2ZpbHRlckNsYXNzfVwiIGNsYXNzPVwiZmlsdGVyLWRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkFsbDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+YFxyXG4gICAgfSxcclxuXHJcbiAgICBhZGRPcHRpb24oZmlsdGVyQ2xhc3MsIG9wdGlvbikge1xyXG4gICAgICAgIC8vIEFkZCBhbm90aGVyIG9wdGlvbiB0byB0aGUgZHJvcGRvd24gZm9yIHRoZSBmaWx0ZXJcclxuICAgICAgICBjb25zdCBmaWx0ZXJPYmogPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjZmlsdGVyLSR7ZmlsdGVyQ2xhc3N9YCk7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9uT2JqID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XHJcbiAgICAgICAgb3B0aW9uT2JqLnZhbHVlID0gb3B0aW9uO1xyXG4gICAgICAgIG9wdGlvbk9iai50ZXh0Q29udGVudCA9IG9wdGlvbjtcclxuICAgICAgICBmaWx0ZXJPYmouYXBwZW5kQ2hpbGQob3B0aW9uT2JqKTtcclxuICAgIH0sXHJcblxyXG4gICAgYWRkKGZpbHRlckxhYmVsLCBmaWx0ZXJDbGFzcykge1xyXG4gICAgICAgIC8vIGNyZWF0ZSBhIGRpdiB0byBjb250YWluIHRoZSBodG1sIGFuZCBpbnNlcnQgaW5zaWRlIGZpbHRlci1jb250YWluZXJcclxuICAgICAgICBjb25zdCBmaWx0ZXJDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZmlsdGVyLWNvbnRhaW5lcicpO1xyXG4gICAgICAgIGNvbnN0IGZpbHRlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGZpbHRlckRpdi5pbm5lckhUTUwgPSB0aGlzLmh0bWwoZmlsdGVyTGFiZWwsIGZpbHRlckNsYXNzKTtcclxuICAgICAgICBmaWx0ZXJDb250YWluZXIuYXBwZW5kQ2hpbGQoZmlsdGVyRGl2KTtcclxuICAgICAgICAvLyBhZGQgYWxsIHJlbGV2YW50IG9wdGlvbnMgZnJvbSB0aGF0IGNvbHVtbiBpbiB0aGUgdGFibGVcclxuICAgICAgICB0aGlzLmFkZEFsbE9wdGlvbnMoZmlsdGVyQ2xhc3MpO1xyXG4gICAgICAgIC8vIEJpbmQgY2hhbmdlIGV2ZW50IHRvIHRoZSBzZWxlY3QgZWxlbWVudFxyXG4gICAgICAgIGZpbHRlckRpdi5xdWVyeVNlbGVjdG9yKCcuZmlsdGVyLWRyb3Bkb3duJykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICAvLyBVcGRhdGUgZmlsdGVyIHNldHRpbmdzXHJcbiAgICAgICAgICAgIGZpbHRlclNldHRpbmdzW2ZpbHRlckNsYXNzXSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICAgICAgICAgICAgLy8gQXBwbHkgYWxsIGZpbHRlcnNcclxuICAgICAgICAgICAgZmlsdGVyRGF0YSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICBhZGRBbGxPcHRpb25zKGZpbHRlckNsYXNzKSB7XHJcbiAgICAgICAgLy8gZ2V0IG1hdGNoaW5nIGNvbHVtbiBmcm9tIHRhYmxlXHJcbiAgICAgICAgY29uc3QgY29sdW1uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgI21haW4tdGFibGUgdGQuJHtmaWx0ZXJDbGFzc31gKTtcclxuXHJcbiAgICAgICAgLy8gVXNlIGEgU2V0IHRvIHN0b3JlIHVuaXF1ZSB2YWx1ZXMgaW4gdGhlIGNvbHVtbiBvZiBpbnRlcmVzdFxyXG4gICAgICAgIGNvbnN0IHVuaXF1ZVZhbHVlcyA9IG5ldyBTZXQoKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIE5vZGVMaXN0IHRvIGdldCB0aGUgdW5pcXVlIHZhbHVlc1xyXG4gICAgICAgIGNvbHVtbi5mb3JFYWNoKHRkID0+IHtcclxuICAgICAgICAgICAgLy8gQWRkIGVhY2ggdGV4dENvbnRlbnQgdG8gdGhlIFNldFxyXG4gICAgICAgICAgICB1bmlxdWVWYWx1ZXMuYWRkKHRkLnRleHRDb250ZW50LnRyaW0oKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gYWRkIGFsbCB2YWx1ZXMgYXMgb3B0aW9ucyB0byB0aGUgZmlsdGVyIGRyb3Bkb3duXHJcbiAgICAgICAgdW5pcXVlVmFsdWVzLmZvckVhY2gob3B0aW9uID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hZGRPcHRpb24oZmlsdGVyQ2xhc3MsIG9wdGlvbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIGRlbGV0ZUFsbCgpe1xyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaWx0ZXItY29udGFpbmVyJykuaW5uZXJIVE1MID0gJyc7XHJcbiAgICB9LFxyXG5cclxuICAgIHVwZGF0ZU9wdGlvbnMoZmlsdGVyQ2xhc3MpIHtcclxuICAgICAgICBjb25zdCBmaWx0ZXJPYmogPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjZmlsdGVyLSR7ZmlsdGVyQ2xhc3N9YCk7XHJcbiAgICAgICAgaWYgKGZpbHRlck9iaikge1xyXG4gICAgICAgICAgICAvLyBDbGVhciBhbGwgZXhpc3Rpbmcgb3B0aW9ucyBleGNlcHQgZm9yIHRoZSBkZWZhdWx0ICdBbGwnIG9wdGlvblxyXG4gICAgICAgICAgICBmaWx0ZXJPYmoub3B0aW9ucy5sZW5ndGggPSAxO1xyXG4gICAgICAgICAgICAvLyBBZGQgbmV3IG9wdGlvbnNcclxuICAgICAgICAgICAgdGhpcy5hZGRBbGxPcHRpb25zKGZpbHRlckNsYXNzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEZpbHRlcjsiLCIvLyB0aGUgR29sZCBCb29rIGNvbnRhaW5zIGEgbG9va3VwIHRhYmxlIGZvciBlYWNoIGpvYiBjb2RlLCB3aGljaCBtYXBzIHRvIHRoZSBCVSwgdGhlIGpvYiB0aXRsZSwgYW5kIHRoZSBmcmluZ2UgcmF0ZVxyXG5cclxuY29uc3QgR29sZEJvb2sgPSB7XHJcbiAgICBpbml0KHNoZWV0KSB7XHJcbiAgICAgICAgLy8gQ29udmVydCBzaGVldCB0byBKU09OLCB3aXRoIG5vIGF1dG9tYXRpYyBoZWFkZXIgcm93IHBhcnNpbmdcclxuICAgICAgICBjb25zdCByYXdEYXRhID0gWExTWC51dGlscy5zaGVldF90b19qc29uKHNoZWV0LCB7IGhlYWRlcjogMSwgZGVmdmFsOiAnJyB9KTtcclxuXHJcbiAgICAgICAgLy8gQXNzdW1pbmcgaGVhZGVyIGlzIHRoZSBzZWNvbmQgcm93IChpbmRleCAxKSwgYW5kIGRhdGEgc3RhcnRzIGF0IHRoZSB0aGlyZCByb3cgKGluZGV4IDIpXHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHJhd0RhdGFbMV07XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHJhd0RhdGEuc2xpY2UoMik7IFxyXG5cclxuICAgICAgICAvLyBTdG9yZSBoZWFkZXJzIGFuZCBkYXRhIGluIGxvY2FsU3RvcmFnZVxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdnb2xkYm9va19oZWFkZXJzJywgSlNPTi5zdHJpbmdpZnkoaGVhZGVycykpO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdnb2xkYm9va19kYXRhJywgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgfSxcclxuXHJcbiAgICBmZXRjaCgpIHtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZ29sZGJvb2tfaGVhZGVycycpKTtcclxuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZ29sZGJvb2tfZGF0YScpKTtcclxuICAgICAgICByZXR1cm4geyBoZWFkZXJzLCBkYXRhIH07XHJcbiAgICB9LFxyXG5cclxuICAgIGZldGNoQnlDb2RlKGpvYl9jb2RlKSB7XHJcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzLCBkYXRhIH0gPSB0aGlzLmZldGNoKCk7XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSBhIG1hcCBvZiBjb2x1bW4gbmFtZXMgdG8gdGhlaXIgcmVzcGVjdGl2ZSBpbmRpY2VzXHJcbiAgICAgICAgY29uc3QgaGVhZGVyTWFwID0gaGVhZGVycy5yZWR1Y2UoKGFjYywgaGVhZGVyLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBhY2NbaGVhZGVyXSA9IGluZGV4O1xyXG4gICAgICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICAgIH0sIHt9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGEuZmlsdGVyKHJvdyA9PiByb3dbaGVhZGVyTWFwWydKb2IgQ29kZSddXSA9PSBqb2JfY29kZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIFxyXG4gICAgZ2V0SGVhZGVySVgoaGVhZGVyX25hbWUpe1xyXG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gdGhpcy5mZXRjaCgpO1xyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJNYXAgPSBoZWFkZXJzLnJlZHVjZSgoYWNjLCBoZWFkZXIsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgYWNjW2hlYWRlcl0gPSBpbmRleDtcclxuICAgICAgICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICAgICAgICB9LCB7fSk7XHJcbiAgICAgICAgcmV0dXJuIGhlYWRlck1hcFtoZWFkZXJfbmFtZV07XHJcbiAgICB9LFxyXG5cclxuICAgIGxvb2t1cEJ5Sm9iQ29kZShqb2JfY29kZSwgaGVhZGVyX25hbWUpe1xyXG4gICAgICAgIGNvbnN0IGNvZGVEYXRhID0gdGhpcy5mZXRjaEJ5Q29kZShqb2JfY29kZSk7XHJcblxyXG4gICAgICAgIGlmIChjb2RlRGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb2RlRGF0YVswXVt0aGlzLmdldEhlYWRlcklYKGhlYWRlcl9uYW1lKV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRUaXRsZShqb2JfY29kZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cEJ5Sm9iQ29kZShqb2JfY29kZSwgJ0pvYiBEZXNjcmlwdGlvbicpO1xyXG4gICAgfSxcclxuXHJcblxyXG4gICAgZ2V0RnJpbmdlUmF0ZShqb2JfY29kZSkge1xyXG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHRoaXMubG9va3VwQnlKb2JDb2RlKGpvYl9jb2RlLCAnRnJpbmdlIFJhdGUnKSk7XHJcbiAgICB9LFxyXG5cclxuICAgIGNvZGVFeGlzdHMoam9iX2NvZGUpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoQnlDb2RlKGpvYl9jb2RlKS5sZW5ndGggPiAwO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBtZXRob2QgdG8gYWRkIEdvbGRCb29rIGRhdGEgYXMgYSBuZXcgc2hlZXQgdG8gdGhlIHdvcmtib29rXHJcbiAgICB4bHN4KCkge1xyXG4gICAgICAgIGNvbnN0IHsgaGVhZGVycywgZGF0YSB9ID0gdGhpcy5mZXRjaCgpO1xyXG5cclxuICAgICAgICAvLyBDb21iaW5lIGhlYWRlcnMgYW5kIGRhdGEgaW50byBvbmUgYXJyYXlcclxuICAgICAgICBjb25zdCBjb21iaW5lZERhdGEgPSBbaGVhZGVyc10uY29uY2F0KGRhdGEpO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgYSB3b3Jrc2hlZXRcclxuICAgICAgICByZXR1cm4gWExTWC51dGlscy5hb2FfdG9fc2hlZXQoY29tYmluZWREYXRhKTtcclxuICAgIH1cclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEdvbGRCb29rOyIsIlxyXG5cclxuaW1wb3J0IHsgU0hFRVRTLCBUQVJHRVRfQ0VMTF9BRERSRVNTLCBGSVNDQUxfWUVBUiB9IGZyb20gJy4uL2NvbnN0YW50cy8nO1xyXG5pbXBvcnQgRnVuZExvb2t1cFRhYmxlIGZyb20gJy4uL21vZGVscy9mdW5kX2xvb2t1cF90YWJsZS5qcyc7XHJcbmltcG9ydCB7IHJlbW92ZU5ld0xpbmVzIH0gZnJvbSAnLi9jb21tb25fdXRpbHMuanMnO1xyXG5pbXBvcnQgQmFzZWxpbmUgZnJvbSAnLi4vbW9kZWxzL2Jhc2VsaW5lLmpzJztcclxuaW1wb3J0IFNlcnZpY2VzIGZyb20gJy4uL21vZGVscy9zZXJ2aWNlcy5qcyc7XHJcbmltcG9ydCBHb2xkQm9vayBmcm9tICcuLi9tb2RlbHMvZ29sZF9ib29rLmpzJztcclxuXHJcblxyXG4vLyBIZWxwZXIgZnVuY3Rpb25zXHJcblxyXG4vKipcclxuICogRGVsZXRlcyB0aGUgdG9wIHJvd3MgdW50aWwgYSByb3cgY29udGFpbmluZyBjb21wbGV0ZSBkYXRhIGlzIGZvdW5kLlxyXG4gKiBAcGFyYW0ge0FycmF5fSBkYXRhIC0gVGhlIHJhdyBkYXRhIGV4dHJhY3RlZCBmcm9tIHRoZSBzaGVldC5cclxuICogQHJldHVybnMge0FycmF5fSAtIFRoZSBjbGVhbmVkIGRhdGEgd2l0aCBpbmNvbXBsZXRlIHRvcCByb3dzIHJlbW92ZWQuXHJcbiAqL1xyXG5mdW5jdGlvbiBkZWxldGVUb3BSb3dzVW50aWxGdWxsRGF0YShkYXRhKSB7XHJcbiAgICBsZXQgZnVsbERhdGFSb3dGb3VuZCA9IGZhbHNlO1xyXG5cclxuICAgIHdoaWxlICghZnVsbERhdGFSb3dGb3VuZCAmJiBkYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCByb3cgPSBkYXRhWzBdOyAvLyBHZXQgdGhlIHRvcCByb3dcclxuICAgICAgICBsZXQgaGFzQWxsRGF0YSA9IHRydWU7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiByb3cpIHtcclxuICAgICAgICAgICAgaWYgKGNlbGwgPT0gbnVsbCB8fCBjZWxsID09PSAnJykge1xyXG4gICAgICAgICAgICAgICAgaGFzQWxsRGF0YSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChoYXNBbGxEYXRhICYmIHJvdy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIGZ1bGxEYXRhUm93Rm91bmQgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGRlbGV0ZSB0aGUgdG9wIHJvdyBpZiBpdCdzIG5vdCB0aGUgaGVhZGVyIHJvd1xyXG4gICAgICAgICAgICBkYXRhLnNoaWZ0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkYXRhO1xyXG59XHJcblxyXG4vKipcclxuICogUmVhZHMgdGhlIHdvcmtib29rIGZyb20gdGhlIHByb3ZpZGVkIGFycmF5IGJ1ZmZlci5cclxuICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyYXlCdWZmZXIgLSBUaGUgYXJyYXkgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHdvcmtib29rIGRhdGEuXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IC0gVGhlIHBhcnNlZCB3b3JrYm9vay5cclxuICovXHJcbmZ1bmN0aW9uIHJlYWRXb3JrYm9vayhhcnJheUJ1ZmZlcikge1xyXG4gICAgcmV0dXJuIFhMU1gucmVhZChhcnJheUJ1ZmZlciwgeyB0eXBlOiAnYXJyYXknIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogUHJvY2Vzc2VzIHNoZWV0cyB0byBiZSBzcGxpdCBieSBmdW5kIGFuZCBzYXZlcyB0aGUgcmVsZXZhbnQgZGF0YS5cclxuICogQHBhcmFtIHtzdHJpbmd9IHNoZWV0TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzaGVldCBiZWluZyBwcm9jZXNzZWQuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBzaGVldCAtIFRoZSBzaGVldCBvYmplY3QgZnJvbSB0aGUgd29ya2Jvb2suXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzU2hlZXQoc2hlZXROYW1lLCBzaGVldCkge1xyXG4gICAgLy8gUmVhZCBpbiBzaGVldHNcclxuICAgIGNvbnN0IHJhd0RhdGEgPSBYTFNYLnV0aWxzLnNoZWV0X3RvX2pzb24oc2hlZXQsIHsgaGVhZGVyOiAxLCBkZWZ2YWw6ICcnIH0pO1xyXG4gICAgXHJcbiAgICAvLyBDbGVhbiB0aGUgZGF0YSBieSByZW1vdmluZyB0b3Agcm93cyB3aXRoIGluY29tcGxldGUgZGF0YVxyXG4gICAgY29uc3QgZGF0YVJvd3MgPSBkZWxldGVUb3BSb3dzVW50aWxGdWxsRGF0YShyYXdEYXRhKTtcclxuXHJcbiAgICAvLyBHZXQgbmV3IGhlYWRlcnNcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBkYXRhUm93c1swXTtcclxuICAgIGNvbnN0IGZ1bmRJbmRleCA9IGhlYWRlcnMuaW5kZXhPZignRnVuZCcpO1xyXG4gICAgaWYgKGZ1bmRJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGBObyAnRnVuZCcgY29sdW1uIGZvdW5kIGluIHNoZWV0ICR7c2hlZXROYW1lfWApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTYXZlIGEgZGljdGlvbmFyeSBvZiBkYXRhIGZvciBlYWNoIGZ1bmQgZm9yIGVhY2ggc2hlZXRcclxuICAgIGNvbnN0IGZ1bmREYXRhID0ge307XHJcblxyXG4gICAgZGF0YVJvd3MuZm9yRWFjaChyb3cgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZ1bmQgPSByb3dbZnVuZEluZGV4XTtcclxuICAgICAgICBpZihmdW5kICYmIGZ1bmQgIT09IFwiRnVuZFwiKXtcclxuICAgICAgICAgICAgaWYgKCFmdW5kRGF0YVtmdW5kXSkge1xyXG4gICAgICAgICAgICAgICAgZnVuZERhdGFbZnVuZF0gPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCByb3dEYXRhID0ge307XHJcbiAgICAgICAgICAgIGhlYWRlcnMuZm9yRWFjaCgoaGVhZGVyLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcm93RGF0YVtyZW1vdmVOZXdMaW5lcyhoZWFkZXIpXSA9IHJvd1tpbmRleF07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBmdW5kRGF0YVtmdW5kXS5wdXNoKHJvd0RhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFNhdmUgZnVuZCBudW1iZXIgYW5kIG5hbWUgYXMgd2UgZ28gYWxvbmdcclxuICAgIEZ1bmRMb29rdXBUYWJsZS51cGRhdGUoZnVuZERhdGEpOyAgIFxyXG4gICAgY29uc29sZS5sb2coJ3VwZGF0aW5nIGZ1bmQgbG9va3VwIHRhYmxlJyk7ICAgICAgIFxyXG5cclxuICAgIE9iamVjdC5rZXlzKGZ1bmREYXRhKS5mb3JFYWNoKGZ1bmQgPT4ge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGAke1NIRUVUU1tzaGVldE5hbWVdfV8ke2Z1bmR9YDtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KGZ1bmREYXRhW2Z1bmRdKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFByb2Nlc3NlcyB0aGUgJ0Ryb3AtRG93biBNZW51cycgc2hlZXQgdG8gZXh0cmFjdCBzZXJ2aWNlcyBkYXRhLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gc2hlZXQgLSBUaGUgc2hlZXQgb2JqZWN0IGZyb20gdGhlIHdvcmtib29rLlxyXG4gKi9cclxuZnVuY3Rpb24gcHJvY2Vzc0Ryb3BEb3duTWVudXNTaGVldChzaGVldCkge1xyXG4gICAgY29uc3Qgc2hlZXREYXRhID0gWExTWC51dGlscy5zaGVldF90b19qc29uKHNoZWV0LCB7IGhlYWRlcjogMSB9KTtcclxuICAgIGNvbnN0IGhlYWRlclJvdyA9IHNoZWV0RGF0YVswXTtcclxuICAgIGNvbnN0IHNlcnZpY2VzSW5kZXggPSBoZWFkZXJSb3cuaW5kZXhPZignU2VydmljZXMnKTtcclxuXHJcbiAgICAvLyBzYXZlIGRyb3AgZG93biBtZW51IGZvciBsYXRlciBleGNlbCBkb3dubG9hZHNcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdkcm9wZG93bnMnLCBKU09OLnN0cmluZ2lmeShzaGVldERhdGEpKTtcclxuXHJcbiAgICBpZiAoc2VydmljZXNJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdIZWFkZXIgXCJTZXJ2aWNlc1wiIG5vdCBmb3VuZCcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBzZXJ2aWNlc0NvbHVtbiA9IHNoZWV0RGF0YS5zbGljZSgxKS5tYXAocm93ID0+IHJvd1tzZXJ2aWNlc0luZGV4XSk7XHJcbiAgICAgICAgY29uc3QgY2xlYW5lZFNlcnZpY2VzQ29sdW1uID0gc2VydmljZXNDb2x1bW4uZmlsdGVyKHZhbHVlID0+IHZhbHVlICE9IG51bGwpO1xyXG4gICAgICAgIFNlcnZpY2VzLnNhdmUoY2xlYW5lZFNlcnZpY2VzQ29sdW1uKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFByb2Nlc3NlcyB0aGUgJ0RlcHQgU3VtbWFyeScgc2hlZXQgdG8gZ2V0IGFuZCBzYXZlIHRoZSB0YXJnZXQgZm9yIHRoZSBnZW5lcmFsIGZ1bmQuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBzaGVldCAtIFRoZSBzaGVldCBvYmplY3QgZnJvbSB0aGUgd29ya2Jvb2suXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzRGVwdFN1bW1hcnlTaGVldChzaGVldCkge1xyXG4gICAgaWYoc2hlZXRbVEFSR0VUX0NFTExfQUREUkVTU10pIHtcclxuICAgICAgICBjb25zdCBjZWxsVmFsdWUgPSBzaGVldFtUQVJHRVRfQ0VMTF9BRERSRVNTXS52OyAvLyBBY2Nlc3MgdGhlIGNlbGwgdmFsdWVcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndGFyZ2V0JywgY2VsbFZhbHVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgQ2VsbCAke1RBUkdFVF9DRUxMX0FERFJFU1N9IG5vdCBmb3VuZGApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHNhdmUgdGhlIHNoZWV0IHRvIGFkZCB0byBmdXR1cmUgZXhjZWwgZG93bmxvYWRzXHJcbiAgICBjb25zdCBzaGVldERhdGEgPSBYTFNYLnV0aWxzLnNoZWV0X3RvX2pzb24oc2hlZXQsIHsgaGVhZGVyOiAxIH0pO1xyXG4gICAgLy8gVE9ETzogcmVtb3ZlIGV4Y2VzcyBlbXB0eSByb3dzXHJcbiAgICBjb25zdCBuZXdTaGVldERhdGEgPSBzaGVldERhdGEubWFwKHJvdyA9PiByb3cuc2xpY2UoMCwgMykpO1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2RlcHQtc3VtbWFyeScsIEpTT04uc3RyaW5naWZ5KG5ld1NoZWV0RGF0YSkpO1xyXG59XHJcblxyXG4vKipcclxuICogUHJvY2Vzc2VzIHRoZSAnRll7RklTQ0FMX1lFQVJ9IEdvbGQgQm9vaycgc2hlZXQgdG8gaW5pdGlhbGl6ZSB0aGUgR29sZCBCb29rLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gc2hlZXQgLSBUaGUgc2hlZXQgb2JqZWN0IGZyb20gdGhlIHdvcmtib29rLlxyXG4gKi9cclxuZnVuY3Rpb24gcHJvY2Vzc0dvbGRCb29rU2hlZXQoc2hlZXQpIHtcclxuICAgIEdvbGRCb29rLmluaXQoc2hlZXQpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwcm9jZXNzTmV3SW5pdHNTaGVldChzaGVldCl7XHJcbiAgICAvLyBSZWFkIGluIHNoZWV0c1xyXG4gICAgY29uc3QgcmF3RGF0YSA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbihzaGVldCwgeyBoZWFkZXI6IDEsIGRlZnZhbDogJycgfSk7XHJcbiAgICBcclxuICAgIC8vIENsZWFuIHRoZSBkYXRhIGJ5IHJlbW92aW5nIHRvcCByb3dzIHdpdGggaW5jb21wbGV0ZSBkYXRhXHJcbiAgICBjb25zdCBkYXRhUm93cyA9IGRlbGV0ZVRvcFJvd3NVbnRpbEZ1bGxEYXRhKHJhd0RhdGEpO1xyXG5cclxuICAgIC8vIEdldCBuZXcgaGVhZGVyc1xyXG4gICAgY29uc3QgaGVhZGVycyA9IGRhdGFSb3dzWzBdO1xyXG4gICAgLy8gZmluYWwgZGF0YSBvdXRwdXRcclxuICAgIGxldCBmdWxsRGF0YSA9IFtdXHJcbiAgICBcclxuICAgIC8vIENvbnZlcnQgZGF0YSB0byBKU09OIGZvcm0gYW5kIGZpbHRlciBvdXQgcm93cyB3aGVyZSBmaXJzdCB2YWx1ZSBpcyBtaXNzaW5nXHJcbiAgICBkYXRhUm93cy5zbGljZSgxKS5mb3JFYWNoKHJvdyA9PiB7IC8vIFNraXAgaGVhZGVycyByb3dcclxuICAgICAgICAvLyBza2lwIGFueSBlbXB0eSByb3dzIGF0IHRoZSBlbmRcclxuICAgICAgICBpZiAoKHJvd1swXSAhPSAnJykgJiYgKHJvd1swXSAhPSAnLScpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvd0RhdGEgPSB7fTtcclxuICAgICAgICAgICAgaGVhZGVycy5mb3JFYWNoKChoZWFkZXIsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICByb3dEYXRhW3JlbW92ZU5ld0xpbmVzKGhlYWRlcildID0gcm93W2luZGV4XTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vIG9ubHkga2VlcCBzdXBwbGVtZW50YWwgaW5pdGlhdGl2ZXMgXHJcbiAgICAgICAgICAgIGlmIChyb3dEYXRhWydCYXNlbGluZSBvciBTdXBwbGVtZW50YWwnXS5pbmNsdWRlcygnU3VwcGxlbWVudGFsJykpe1xyXG4gICAgICAgICAgICAgICAgZnVsbERhdGEucHVzaChyb3dEYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLy8gc2F2ZSBpbiBsb2NhbCBzdG9yYWdlXHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbmV3LWluaXRzJywgSlNPTi5zdHJpbmdpZnkoZnVsbERhdGEpKTtcclxufVxyXG5cclxuLy8gTWFpbiBmdW5jdGlvbiB0byByZWFkIGFuZCBwcm9jZXNzIHRoZSB3b3JrYm9va1xyXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc1dvcmtib29rKGFycmF5QnVmZmVyKSB7XHJcbiAgICBjb25zdCB3b3JrYm9vayA9IHJlYWRXb3JrYm9vayhhcnJheUJ1ZmZlcik7XHJcblxyXG4gICAgd29ya2Jvb2suU2hlZXROYW1lcy5mb3JFYWNoKHNoZWV0TmFtZSA9PiB7XHJcbiAgICAgICAgLy8gT25seSBjb252ZXJ0IHNoZWV0cyB3ZSBuZWVkOyB0cmVhdCBuZXcgaW5pdHMgc2VwYXJhdGVseSBiZWNhdXNlIHRoZXkgc2hvdWxkbid0IHNhdmUgYnkgZnVuZFxyXG4gICAgICAgIGlmIChzaGVldE5hbWUgPT0gT2JqZWN0LmtleXMoU0hFRVRTKVs0XSkge1xyXG4gICAgICAgICAgICBjb25zdCBzaGVldCA9IHdvcmtib29rLlNoZWV0c1tzaGVldE5hbWVdO1xyXG4gICAgICAgICAgICBwcm9jZXNzTmV3SW5pdHNTaGVldChzaGVldCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChPYmplY3Qua2V5cyhTSEVFVFMpLmluY2x1ZGVzKHNoZWV0TmFtZSkpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2hlZXQgPSB3b3JrYm9vay5TaGVldHNbc2hlZXROYW1lXTtcclxuICAgICAgICAgICAgcHJvY2Vzc1NoZWV0KHNoZWV0TmFtZSwgc2hlZXQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc2hlZXROYW1lID09PSAnRHJvcC1Eb3duIE1lbnVzJykge1xyXG4gICAgICAgICAgICBjb25zdCBzaGVldCA9IHdvcmtib29rLlNoZWV0c1tzaGVldE5hbWVdO1xyXG4gICAgICAgICAgICBwcm9jZXNzRHJvcERvd25NZW51c1NoZWV0KHNoZWV0KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHNoZWV0TmFtZSA9PT0gJ0RlcHQgU3VtbWFyeScpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2hlZXQgPSB3b3JrYm9vay5TaGVldHNbc2hlZXROYW1lXTtcclxuICAgICAgICAgICAgcHJvY2Vzc0RlcHRTdW1tYXJ5U2hlZXQoc2hlZXQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc2hlZXROYW1lID09PSBgRlkke0ZJU0NBTF9ZRUFSfSBHb2xkIEJvb2tgKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNoZWV0ID0gd29ya2Jvb2suU2hlZXRzW3NoZWV0TmFtZV07XHJcbiAgICAgICAgICAgIHByb2Nlc3NHb2xkQm9va1NoZWV0KHNoZWV0KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zb2xlLmxvZygnYWxsIGV4Y2VsIGRhdGEgc2F2ZWQnKTtcclxufVxyXG5cclxuLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBhcHBlbmQgYSBzaGVldCB0byB0aGUgd29ya2Jvb2sgaWYgZGF0YSBpcyBwcmVzZW50XHJcbmZ1bmN0aW9uIGFwcGVuZFNoZWV0VG9Xb3JrYm9vayh3b3JrYm9vaywgZGF0YSwgc2hlZXROYW1lKSB7XHJcbiAgICBpZiAoZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3Qgc2hlZXQgPSBYTFNYLnV0aWxzLmpzb25fdG9fc2hlZXQoZGF0YSk7XHJcbiAgICAgICAgWExTWC51dGlscy5ib29rX2FwcGVuZF9zaGVldCh3b3JrYm9vaywgc2hlZXQsIHNoZWV0TmFtZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZFhMU1goKSB7XHJcbiAgICAvLyBncmFiIGRhdGEgZnJvbSBiYXNlbGluZSBvYmplY3RcclxuICAgIGNvbnN0IGJhc2VsaW5lID0gbmV3IEJhc2VsaW5lKCk7XHJcbiAgICBjb25zdCB3b3JrYm9vayA9IFhMU1gudXRpbHMuYm9va19uZXcoKTsgLy8gQ3JlYXRlIGEgbmV3IHdvcmtib29rXHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSBzaGVldCBkYXRhIGJhc2VkIG9uIHRoZSBuYW1lcyBvZiBlYWNoIHRhYiBpbiB0aGUgRXhjZWwgZG9jXHJcbiAgICBjb25zdCBzaGVldERhdGEgPSBPYmplY3Qua2V5cyhTSEVFVFMpLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcclxuICAgICAgICBhY2Nba2V5XSA9IFtdO1xyXG4gICAgICAgIHJldHVybiBhY2M7XHJcbiAgICB9LCB7fSk7XHJcblxyXG4gICAgLy8gQWdncmVnYXRlIGFsbCByb3dzIGFjcm9zcyBmdW5kcyBhbmQgY29tYmluZSBmb3IgZWFjaCB0YWJcclxuICAgIGJhc2VsaW5lLmZ1bmRzLmZvckVhY2goZnVuZCA9PiB7XHJcbiAgICAgICAgT2JqZWN0LmtleXMoU0hFRVRTKS5mb3JFYWNoKHNoZWV0TmFtZSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChmdW5kW1NIRUVUU1tzaGVldE5hbWVdXSAmJiBmdW5kW1NIRUVUU1tzaGVldE5hbWVdXS50YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgc2hlZXREYXRhW3NoZWV0TmFtZV0ucHVzaCguLi5mdW5kW1NIRUVUU1tzaGVldE5hbWVdXS50YWJsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIEFkZCBpbml0aWF0aXZlcyBkYXRhICh3aGljaCBpc24ndCBzdG9yZWQgYnkgZnVuZClcclxuICAgIHNoZWV0RGF0YVtPYmplY3Qua2V5cyhTSEVFVFMpWzRdXSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ25ldy1pbml0cycpKTtcclxuXHJcbiAgICAvLyBDcmVhdGUgYSB0YWIgZm9yIGVhY2ggdGFibGVcclxuICAgIE9iamVjdC5rZXlzKHNoZWV0RGF0YSkuZm9yRWFjaChzaGVldE5hbWUgPT4ge1xyXG4gICAgICAgIGFwcGVuZFNoZWV0VG9Xb3JrYm9vayh3b3JrYm9vaywgc2hlZXREYXRhW3NoZWV0TmFtZV0sIHNoZWV0TmFtZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBBZGQgYSB0YWIgZm9yIHRoZSBHb2xkQm9va1xyXG4gICAgWExTWC51dGlscy5ib29rX2FwcGVuZF9zaGVldCh3b3JrYm9vaywgR29sZEJvb2sueGxzeCgpLCBgRlkke0ZJU0NBTF9ZRUFSfSBHb2xkIEJvb2tgKTtcclxuXHJcbiAgICAvLyBhZGQgYSB0YWIgZm9yIHRoZSBkcm9wIGRvd25zIGFuZCBkZXB0IHN1bW1hcnkgKGp1c3QgdGFyZ2V0cylcclxuICAgIHdyaXRlSlNPTnRvTmV3VGFiKCdkcm9wZG93bnMnLCAnRHJvcC1Eb3duIE1lbnVzJywgd29ya2Jvb2spOyBcclxuICAgIHdyaXRlSlNPTnRvTmV3VGFiKCdkZXB0LXN1bW1hcnknLCAnRGVwdCBTdW1tYXJ5Jywgd29ya2Jvb2spO1xyXG5cclxuICAgIC8vIEdlbmVyYXRlIGEgZG93bmxvYWRhYmxlIGZpbGVcclxuICAgIGNvbnN0IHdib3V0ID0gWExTWC53cml0ZSh3b3JrYm9vaywgeyBib29rVHlwZTogJ3hsc3gnLCB0eXBlOiAnYXJyYXknIH0pO1xyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFt3Ym91dF0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgfSk7XHJcblxyXG4gICAgLy8gQ3JlYXRlIGEgbGluayBhbmQgdHJpZ2dlciB0aGUgZG93bmxvYWRcclxuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcclxuICAgIGxpbmsuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICBsaW5rLmRvd25sb2FkID0gXCJGaWxsZWRfRGV0YWlsX1NoZWV0Lnhsc3hcIjtcclxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XHJcbiAgICBsaW5rLmNsaWNrKCk7XHJcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xyXG59XHJcblxyXG5mdW5jdGlvbiB3cml0ZUpTT050b05ld1RhYihzdG9yYWdlX2tleSwgdGFiX25hbWUsIHdvcmtib29rKXtcclxuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHN0b3JhZ2Vfa2V5KSk7XHJcbiAgICBjb25zb2xlLmxvZyhkYXRhKTtcclxuICAgIGNvbnN0IHdvcmtzaGVldCA9IFhMU1gudXRpbHMuYW9hX3RvX3NoZWV0KGRhdGEpO1xyXG4gICAgWExTWC51dGlscy5ib29rX2FwcGVuZF9zaGVldCh3b3JrYm9vaywgd29ya3NoZWV0LCB0YWJfbmFtZSk7IFxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZXhjZWxTZXJpYWxEYXRlVG9KU0RhdGUoc2VyaWFsKSB7XHJcblxyXG4gICAgaWYgKCFzZXJpYWwpIHsgcmV0dXJuIG51bGwgfTtcclxuICAgIC8vIEV4Y2VsIGNvbnNpZGVycyAxOTAwLTAxLTAxIGFzIGRheSAxLCBidXQgSmF2YVNjcmlwdCdzIERhdGUgY29uc2lkZXJzXHJcbiAgICAvLyAxOTcwLTAxLTAxIGFzIGRheSAwLiBUaGVyZWZvcmUsIHdlIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kc1xyXG4gICAgLy8gYmV0d2VlbiAxOTAwLTAxLTAxIGFuZCAxOTcwLTAxLTAxLlxyXG4gICAgY29uc3QgZXhjZWxFcG9jaCA9IG5ldyBEYXRlKERhdGUuVVRDKDE4OTksIDExLCAzMCkpOyAvLyBKYXZhU2NyaXB0IENvbnNpZGVyIERlY2VtYmVyIG1vbnRoIGFzICcxMSdcclxuICAgIFxyXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBKUyBkYXRlIGJ5IGFkZGluZyBzZXJpYWwgZGF5cyB0byB0aGUgZXBvY2ggZGF0ZVxyXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGV4Y2VsRXBvY2guZ2V0VGltZSgpICsgKHNlcmlhbCAqIDI0ICogNjAgKiA2MCAqIDEwMDApKTtcclxuICAgIFxyXG4gICAgLy8gU2V0IHRoZSB0aW1lIHBhcnQgdG8gemVybyAobWlkbmlnaHQpXHJcbiAgICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApO1xyXG4gICAgXHJcbiAgICAvLyBSZXR1cm4gdGhlIGRhdGUgcGFydCBvZiB0aGUgSVNPIHN0cmluZ1xyXG4gICAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xyXG59XHJcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90b29sdGlwLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Rvb2x0aXAuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiaW1wb3J0IHsgRklTQ0FMX1lFQVIgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvJztcclxuaW1wb3J0IENlbGwgZnJvbSAnLi4vdGFibGUvc3ViY29tcG9uZW50cy9jZWxscyc7XHJcbmltcG9ydCB7IGZvcm1hdEN1cnJlbmN5IH0gZnJvbSAnLi4vLi4vdXRpbHMvY29tbW9uX3V0aWxzJztcclxuaW1wb3J0IEN1cnJlbnRQYWdlIGZyb20gJy4uLy4uL21vZGVscy9jdXJyZW50X3BhZ2UnO1xyXG5pbXBvcnQgeyBleGNlbFNlcmlhbERhdGVUb0pTRGF0ZSB9IGZyb20gJy4uLy4uL3V0aWxzL1hMU1hfaGFuZGxlcnMnO1xyXG5cclxuaW1wb3J0ICcuL3Rvb2x0aXAuY3NzJ1xyXG5cclxuZnVuY3Rpb24gaGlkZVRvb2x0aXAoKSB7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbHRpcCcpLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd1Rvb2x0aXAoKSB7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbHRpcCcpLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGVkaXRUb29sdGlwVGV4dChuZXdUZXh0KXtcclxuICAgIC8vIGVkaXQgdGV4dCB0byBkaXNwbGF5IGluc2lkZSB0b29sdGlwXHJcbiAgICBjb25zdCB0b29sdGlwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2x0aXAnKTtcclxuICAgIHRvb2x0aXAuaW5uZXJIVE1MID0gbmV3VGV4dDtcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd0FjY291bnRTdHJpbmcocm93KXtcclxuICAgIGNvbnN0IGFwcHJvcCA9IENlbGwuZ2V0VGV4dChyb3csICdhcHByb3AtbmFtZScpO1xyXG4gICAgY29uc3QgY2MgPSAgQ2VsbC5nZXRUZXh0KHJvdywgJ2NjLW5hbWUnKTtcclxuICAgIGNvbnN0IG9iaiA9ICBDZWxsLmdldFRleHQocm93LCAnb2JqZWN0LW5hbWUnKTtcclxuICAgIGNvbnN0IGZ1bmQgPSBDZWxsLmdldFRleHQocm93LCAnZnVuZC1uYW1lJyk7XHJcbiAgICB2YXIgbWVzc2FnZSA9IFxyXG4gICAgICAgIGA8c3Ryb25nPkZ1bmQ8L3N0cm9uZz46ICR7ZnVuZH08YnI+XHJcbiAgICAgICAgPHN0cm9uZz5BcHByb3ByaWF0aW9uPC9zdHJvbmc+OiAke2FwcHJvcH08YnI+XHJcbiAgICAgICAgPHN0cm9uZz5Db3N0IENlbnRlcjwvc3Ryb25nPjogJHtjY31gO1xyXG4gICAgaWYgKG9iaikgeyBtZXNzYWdlICs9IGA8YnI+PHN0cm9uZz5PYmplY3Q8L3N0cm9uZz46ICR7b2JqfWB9XHJcbiAgICBtZXNzYWdlICs9IGA8YnI+IElmIHlvdSBiZWxpZXZlIHRoaXMgYWNjb3VudCBzdHJpbmcgaXMgaW5jb3JyZWN0LCBwbGVhc2UgbGVhdmUgYSBjb21tZW50IFxyXG4gICAgICAgIGluIHRoZSBjb21tZW50IGNvbHVtbi5gXHJcbiAgICBlZGl0VG9vbHRpcFRleHQobWVzc2FnZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dTYWxhcnlQcm9qZWN0aW9uKHJvdyl7XHJcbiAgICBjb25zdCBnZW5lcmFsX2luY3JlYXNlID0gQ2VsbC5nZXRUZXh0KHJvdywgJ2dlbmVyYWwtaW5jcmVhc2UtcmF0ZScpO1xyXG4gICAgY29uc3QgbWVyaXRfaW5jcmVhc2UgPSAgQ2VsbC5nZXRUZXh0KHJvdywgJ21lcml0LWluY3JlYXNlLXJhdGUnKTtcclxuICAgIGNvbnN0IGN1cnJlbnRfc2FsYXJ5ID0gQ2VsbC5nZXRWYWx1ZShyb3csICdjdXJyZW50LXNhbGFyeScpO1xyXG4gICAgY29uc3QgcHJval9zYWxhcnkgPSBDZWxsLmdldFZhbHVlKHJvdywgJ2F2Zy1zYWxhcnknKTtcclxuICAgIGlmIChjdXJyZW50X3NhbGFyeSl7XHJcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBgVGhlIGF2ZXJhZ2Ugc2FsYXJ5L3dhZ2UgZm9yIHRoaXMgcG9zaXRpb24gd2FzIFxyXG4gICAgICAgICAgICAke2Zvcm1hdEN1cnJlbmN5KGN1cnJlbnRfc2FsYXJ5KX0gYXMgb2YgU2VwdGVtYmVyIDIwJHtGSVNDQUxfWUVBUi0yfS4gXHJcbiAgICAgICAgICAgIEdpdmVuIGEgJHtnZW5lcmFsX2luY3JlYXNlKjEwMH0lIGdlbmVyYWwgaW5jcmVhc2UgcmF0ZSBhbmQgYSAke21lcml0X2luY3JlYXNlKjEwMH0lIFxyXG4gICAgICAgICAgICBtZXJpdCBpbmNyZWFzZSwgdGhlIEZZJHtGSVNDQUxfWUVBUn0gcHJvamVjdGlvbiBmb3IgdGhpcyBwb3NpdGlvbidzIGF2ZXJhZ2UgXHJcbiAgICAgICAgICAgIGFubnVhbCBzYWxhcnkvd2FnZSBpcyAke2Zvcm1hdEN1cnJlbmN5KHByb2pfc2FsYXJ5KX0uIFRoaXMgcHJvamVjdGlvbiB0YWtlcyBpbnRvIFxyXG4gICAgICAgICAgICBhY2NvdW50IHRoZSBudW1iZXIgb2YgdmFjYW50IHZzLiBmdWxsIHBvc2l0aW9ucy5gO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB2YXIgbWVzc2FnZSA9IGBUaGUgYXZlcmFnZSBzYWxhcnkvd2FnZSBmb3IgdGhpcyBwb3NpdGlvbiB3YXMgXHJcbiAgICAgICAgICAgIHVua25vd24gYXMgb2YgU2VwdGVtYmVyIDIwJHtGSVNDQUxfWUVBUi0yfSwgb3IgdGhlIHBvc2l0aW9uXHJcbiAgICAgICAgICAgIGRpZCBub3QgZXhpc3QuIFRoZSBGWSR7RklTQ0FMX1lFQVJ9IHByb2plY3Rpb24gZm9yIHRoaXMgcG9zaXRpb24ncyBcclxuICAgICAgICAgICAgYXZlcmFnZSBhbm51YWwgc2FsYXJ5L3dhZ2UgaXMgJHtmb3JtYXRDdXJyZW5jeShwcm9qX3NhbGFyeSl9LmBcclxuICAgIH1cclxuXHJcbiAgICBlZGl0VG9vbHRpcFRleHQobWVzc2FnZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dGaW5hbFBlcnNvbm5lbENvc3Qocm93KXtcclxuICAgIGNvbnN0IHByb2pfc2FsYXJ5ID0gQ2VsbC5nZXRWYWx1ZShyb3csICdhdmctc2FsYXJ5Jyk7XHJcbiAgICBjb25zdCBmdGVzID0gQ2VsbC5nZXRUZXh0KHJvdywgJ2Jhc2VsaW5lLWZ0ZXMnKTtcclxuICAgIGNvbnN0IGZyaW5nZSA9IHBhcnNlRmxvYXQoQ2VsbC5nZXRUZXh0KHJvdywgJ2ZyaW5nZScpKTtcclxuICAgIGNvbnN0IGF2Z19iZW5lZml0cyA9IHByb2pfc2FsYXJ5ICogZnJpbmdlO1xyXG4gICAgY29uc3QgbWVzc2FnZSA9IGBUaGUgdG90YWwgY29zdCBjYXB0dXJlcyAke2Z0ZXN9IHBvc2l0aW9uKHMpIGF0XHJcbiAgICAgICAgICAgICAgICAgICAgYW4gYW5udWFsIHNhbGFyeS93YWdlIG9mICR7Zm9ybWF0Q3VycmVuY3kocHJval9zYWxhcnkpfSwgXHJcbiAgICAgICAgICAgICAgICAgICAgcGx1cyBmcmluZ2UgYmVuZWZpdHMgdGhhdCBjb3N0ICR7Zm9ybWF0Q3VycmVuY3koYXZnX2JlbmVmaXRzKX0gXHJcbiAgICAgICAgICAgICAgICAgICAgcGVyIHBvc2l0aW9uIHBlciB5ZWFyLCBvbiBhdmVyYWdlLmBcclxuICAgIGVkaXRUb29sdGlwVGV4dChtZXNzYWdlKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd0ZJQ0Eocm93KXtcclxuICAgIGNvbnN0IGZpY2EgPSBwYXJzZUZsb2F0KENlbGwuZ2V0VGV4dChyb3csICdmaWNhJykpO1xyXG4gICAgY29uc3QgZmljYVBlcmNlbnRhZ2UgPSAoZmljYSAqIDEwMCkudG9GaXhlZCgyKTtcclxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgVGhpcyB0b3RhbCBpcyBvdmVydGltZSAvIGhvbGlkYXkgLyBzaGlmdCBwcmVtaXVtIHBheSwgcGx1cyBGSUNBIChwYXlyb2xsIHRheCksIFxyXG4gICAgICAgICAgICAgICAgICAgICB3aGljaCBpcyAke2ZpY2FQZXJjZW50YWdlfSUgZm9yIHRoaXMgY29zdCBjZW50ZXIuYFxyXG4gICAgZWRpdFRvb2x0aXBUZXh0KG1lc3NhZ2UpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93Q1BBKHJvdyl7XHJcbiAgICBjb25zdCBjcGEgPSBwYXJzZUZsb2F0KENlbGwuZ2V0VGV4dChyb3csICdjcGEnKSk7XHJcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IENlbGwuZ2V0VGV4dChyb3csICdjcGEtZGVzY3JpcHRpb24nKTtcclxuICAgIGNvbnN0IHZlbmRvciA9IENlbGwuZ2V0VGV4dChyb3csICd2ZW5kb3InKTtcclxuICAgIHZhciBjb250cmFjdF9lbmQgPSBDZWxsLmdldFRleHQocm93LCAnY29udHJhY3QtZW5kJyk7XHJcbiAgICAvLyBjb252ZXJ0IHRvIG5vcm1hbCBkYXRlIGZvcm1hdCBmcm9tIGV4Y2VsIFxyXG4gICAgY29udHJhY3RfZW5kID0gZXhjZWxTZXJpYWxEYXRlVG9KU0RhdGUoY29udHJhY3RfZW5kKTtcclxuICAgIGNvbnN0IHJlbWFpbmluZyA9IENlbGwuZ2V0VmFsdWUocm93LCAncmVtYWluaW5nJyk7XHJcbiAgICBpZiAoY3BhKSB7XHJcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBgPHN0cm9uZz5DUEEgIyR7Y3BhfTwvc3Ryb25nPmA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZhciBtZXNzYWdlID0gYE5vIENQQWA7XHJcbiAgICB9XHJcbiAgICBpZiAodmVuZG9yKSB7bWVzc2FnZSArPSBgPGJyPjxzdHJvbmc+VmVuZG9yPC9zdHJvbmc+OiAke3ZlbmRvcn1gfTtcclxuICAgIGlmIChkZXNjcmlwdGlvbikge21lc3NhZ2UgKz0gYDxicj48c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+OiAke2Rlc2NyaXB0aW9ufWB9O1xyXG4gICAgaWYgKGNvbnRyYWN0X2VuZCkge21lc3NhZ2UgKz0gYDxicj48c3Ryb25nPkNvbnRyYWN0IEVuZCBEYXRlPC9zdHJvbmc+OiAke2NvbnRyYWN0X2VuZH1gfVxyXG4gICAgaWYgKHJlbWFpbmluZykge21lc3NhZ2UgKz0gYDxicj48c3Ryb25nPkFtb3VudCBSZW1haW5pbmcgb24gQ29udHJhY3Q8L3N0cm9uZz46ICR7Zm9ybWF0Q3VycmVuY3kocmVtYWluaW5nKX1gfVxyXG5cclxuICAgIGVkaXRUb29sdGlwVGV4dChtZXNzYWdlKTtcclxufVxyXG5cclxuZnVuY3Rpb24gbGluayhlbGVtZW50LCBkaXNwbGF5Rm4pIHtcclxuXHJcbiAgICAvLyBhZGQgY2xhc3MgdG8gc2hvdyBjZWxsIHdpdGggYW4gdW5kZXJsaW5lLCBldGNcclxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndG9vbHRpcC1jZWxsJyk7XHJcblxyXG4gICAgLy8gQ3JlYXRlIGFuZCBhcHBlbmQgKGRldGFpbClcclxuICAgIGNvbnN0IGRldGFpbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgIGRldGFpbC5jbGFzc0xpc3QuYWRkKCdkZXRhaWwnKTtcclxuICAgIGRldGFpbC50ZXh0Q29udGVudCA9ICcoZGV0YWlsKSc7XHJcbiAgICBlbGVtZW50LmFwcGVuZENoaWxkKGRldGFpbCk7XHJcblxyXG4gICAgLy8gYWRkIGV2ZW50IGxpc3RlbmVyIHRvIHNob3cgdG9vbHRpcCBvbiBtb3VzZW92ZXJcclxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICBjb25zdCByb3cgPSBldmVudC50YXJnZXQuY2xvc2VzdCgndHInKTtcclxuICAgICAgICBkaXNwbGF5Rm4ocm93KTtcclxuICAgICAgICBzaG93VG9vbHRpcCgpO1xyXG4gICAgfSk7XHJcbiAgICAvLyBhbmQgaGlkZSB3aGVuIG1vdXNlIG1vdmVzIG9mZlxyXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBoaWRlVG9vbHRpcCgpO1xyXG4gICAgfSk7XHJcbiAgICAvLyBVcGRhdGUgdG9vbHRpcCBwb3NpdGlvbiBvbiBtb3VzZSBtb3ZlXHJcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgIGNvbnN0IHRvb2x0aXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbHRpcCcpO1xyXG4gICAgICAgIHRvb2x0aXAuc3R5bGUudG9wID0gKGV2ZW50LmNsaWVudFkgKyAxMCkgKyAncHgnO1xyXG4gICAgICAgIHRvb2x0aXAuc3R5bGUubGVmdCA9IChldmVudC5jbGllbnRYICsgMTApICsgJ3B4JztcclxuICAgIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBsaW5rQWNjb3VudFN0cmluZ0NvbCgpIHtcclxuICAgIC8vIGdldCBhbGwgcmVsZXZhbnQgY2VsbHNcclxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkLmFjY291bnQtc3RyaW5nJykuZm9yRWFjaCggKGNlbGwpID0+IHtcclxuICAgICAgICBsaW5rKGNlbGwsIHNob3dBY2NvdW50U3RyaW5nKTtcclxuICAgIH0pXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxpbmtTYWxhcnlDb2woKSB7XHJcbiAgICAvLyBnZXQgYWxsIHJlbGV2YW50IGNlbGxzXHJcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0ZC5hdmctc2FsYXJ5JykuZm9yRWFjaCggKGNlbGwpID0+IHtcclxuICAgICAgICBsaW5rKGNlbGwsIHNob3dTYWxhcnlQcm9qZWN0aW9uKTtcclxuICAgIH0pXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxpbmtUb3RhbFBlcnNvbm5lbENvc3RDb2woKSB7XHJcbiAgICAvLyBnZXQgYWxsIHJlbGV2YW50IGNlbGxzXHJcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0ZC50b3RhbC1iYXNlbGluZScpLmZvckVhY2goIChjZWxsKSA9PiB7XHJcbiAgICAgICAgbGluayhjZWxsLCBzaG93RmluYWxQZXJzb25uZWxDb3N0KTtcclxuICAgIH0pXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxpbmtUb3RhbE9UQ29sKCkge1xyXG4gICAgLy8gZ2V0IGFsbCByZWxldmFudCBjZWxsc1xyXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgndGQudG90YWwnKS5mb3JFYWNoKCAoY2VsbCkgPT4ge1xyXG4gICAgICAgIGxpbmsoY2VsbCwgc2hvd0ZJQ0EpO1xyXG4gICAgfSlcclxufVxyXG5cclxuZnVuY3Rpb24gbGlua0NQQUNvbCgpIHtcclxuICAgIC8vIGdldCBhbGwgcmVsZXZhbnQgY2VsbHNcclxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkLmNwYScpLmZvckVhY2goIChjZWxsKSA9PiB7XHJcbiAgICAgICAgbGluayhjZWxsLCBzaG93Q1BBKTtcclxuICAgIH0pXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBUb29sdGlwID0ge1xyXG5cclxuICAgIGhpZGUgOiBoaWRlVG9vbHRpcCxcclxuICAgIHNob3cgOiBzaG93VG9vbHRpcCxcclxuXHJcbiAgICBsaW5rQWxsIDogKCkgPT4ge1xyXG4gICAgICAgIGxpbmtBY2NvdW50U3RyaW5nQ29sKCk7XHJcbiAgICAgICAgc3dpdGNoKEN1cnJlbnRQYWdlLmxvYWQoKSl7XHJcbiAgICAgICAgICAgIGNhc2UgJ3BlcnNvbm5lbCcgOlxyXG4gICAgICAgICAgICAgICAgLy8gbGlua0FjY291bnRTdHJpbmdDb2woKTtcclxuICAgICAgICAgICAgICAgIGxpbmtTYWxhcnlDb2woKTtcclxuICAgICAgICAgICAgICAgIGxpbmtUb3RhbFBlcnNvbm5lbENvc3RDb2woKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdvdmVydGltZSc6XHJcbiAgICAgICAgICAgICAgICBsaW5rVG90YWxPVENvbCgpO1xyXG4gICAgICAgICAgICAgICAgLy8gbGlua0FjY291bnRTdHJpbmdDb2woKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdub25wZXJzb25uZWwnOlxyXG4gICAgICAgICAgICAgICAgLy8gbGlua0FjY291bnRTdHJpbmdDb2woKTtcclxuICAgICAgICAgICAgICAgIGxpbmtDUEFDb2woKTsgIFxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIC8vIGNhc2UgJ3JldmVudWUnOlxyXG4gICAgICAgICAgICAvLyAgICAgbGlua0FjY291bnRTdHJpbmdDb2woKTtcclxuICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAvLyBjYXNlICduZXctaW5pdHMnOlxyXG4gICAgICAgICAgICAvLyAgICAgbGlua0FjY291bnRTdHJpbmdDb2woKTtcclxuICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgdW5saW5rIDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgbGV0IGRldGFpbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZGV0YWlsJyk7XHJcbiAgICAgICAgZGV0YWlscy5mb3JFYWNoKCAoc3BhbikgPT4ge1xyXG4gICAgICAgICAgICBzcGFuLnJlbW92ZSgpO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRvb2x0aXAiLCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hKU09OKGpzb25GaWxlUGF0aCkge1xyXG4gIHJldHVybiBmZXRjaChqc29uRmlsZVBhdGgpXHJcbiAgICAudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05ldHdvcmsgcmVzcG9uc2Ugd2FzIG5vdCBvaycpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb0pTT04odGFibGUsIGNvbHNUb1JlbW92ZSA9IFtdKXtcclxuICAgIGNvbnN0IHJvd3MgPSB0YWJsZS5yb3dzO1xyXG4gICAgLy8gRXh0cmFjdCBoZWFkZXJzIGZyb20gdGhlIGZpcnN0IHJvd1xyXG4gICAgY29uc3QgaGVhZGVyUm93ID0gcm93c1swXS5jZWxscztcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBbXTtcclxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgaGVhZGVyUm93Lmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgaGVhZGVycy5wdXNoKGhlYWRlclJvd1tqXS5pbm5lclRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGluaXRpYWxpemUgZGF0YVxyXG4gICAgdmFyIHRhYmxlRGF0YSA9IFtdO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGNvbHMgPSByb3dzW2ldLmNlbGxzO1xyXG4gICAgICAgIGNvbnN0IHJvd0RhdGEgPSB7fTtcclxuICAgICAgICAgICAgaGVhZGVycy5mb3JFYWNoKChoZWFkZXIsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sc1RvUmVtb3ZlLmluY2x1ZGVzKGhlYWRlcikpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbHNbaW5kZXhdLmNsYXNzTGlzdC5jb250YWlucygnY29zdCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93RGF0YVtoZWFkZXJdID0gY29sc1tpbmRleF0uZ2V0QXR0cmlidXRlKCd2YWx1ZScpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByb3dEYXRhW2hlYWRlcl0gPSBjb2xzW2luZGV4XS5pbm5lclRleHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHRhYmxlRGF0YS5wdXNoKHJvd0RhdGEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRhYmxlRGF0YSk7XHJcbn1cclxuXHJcblxyXG4gICIsImltcG9ydCAnLi90YWJsZS5jc3MnO1xyXG5cclxuaW1wb3J0IEJ1dHRvbnMgZnJvbSAnLi9zdWJjb21wb25lbnRzL2J1dHRvbnMuanMnXHJcbmltcG9ydCBDZWxsIGZyb20gJy4vc3ViY29tcG9uZW50cy9jZWxscy5qcydcclxuaW1wb3J0IENvbHVtbnMgZnJvbSAnLi9zdWJjb21wb25lbnRzL2NvbHVtbnMuanMnXHJcbmltcG9ydCBIZWFkZXIgZnJvbSAnLi9zdWJjb21wb25lbnRzL2hlYWRlcnMuanMnXHJcbmltcG9ydCBSb3dzIGZyb20gJy4vc3ViY29tcG9uZW50cy9yb3dzLmpzJ1xyXG5pbXBvcnQgRGF0YSBmcm9tICcuL3N1YmNvbXBvbmVudHMvZGF0YS5qcydcclxuaW1wb3J0IEZpbHRlciBmcm9tICcuL3N1YmNvbXBvbmVudHMvZmlsdGVycy5qcyc7XHJcblxyXG5pbXBvcnQgVG9vbHRpcCBmcm9tICcuLi90b29sdGlwL3Rvb2x0aXAuanMnO1xyXG5pbXBvcnQgeyBjb252ZXJ0VG9KU09OIH0gZnJvbSBcIi4uLy4uL3V0aWxzL0pTT05fZGF0YV9oYW5kbGVycy5qc1wiO1xyXG5pbXBvcnQgU2lkZWJhciBmcm9tICcuLi9zaWRlYmFyL3NpZGViYXIuanMnO1xyXG5pbXBvcnQgQ3VycmVudEZ1bmQgZnJvbSAnLi4vLi4vbW9kZWxzL2N1cnJlbnRfZnVuZC5qcyc7XHJcbmltcG9ydCBDdXJyZW50UGFnZSBmcm9tICcuLi8uLi9tb2RlbHMvY3VycmVudF9wYWdlLmpzJztcclxuXHJcbmZ1bmN0aW9uIGFkanVzdFRhYmxlV2lkdGgod2lkdGhfcGN0KXtcclxuICAgIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcclxuICAgIHRhYmxlLnN0eWxlLndpZHRoID0gd2lkdGhfcGN0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93VGFibGUoKXtcclxuICAgIGNvbnN0IHRhYmxlQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRhYmxlLWNvbnRhaW5lcicpO1xyXG4gICAgdGFibGVDb250YWluZXIuaW5uZXJIVE1MID0gVGFibGUuaHRtbDtcclxuICAgIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcclxuICAgIHRhYmxlLnN0eWxlLmRpc3BsYXkgPSAndGFibGUnO1xyXG59XHJcblxyXG5mdW5jdGlvbiBoaWRlVGFibGUoKXtcclxuXHJcbiAgICAvLyBkZWxldGUgdGFibGUgb2JqZWN0IGZyb20gdGFibGUgY29udGFpbmVyXHJcbiAgICBjb25zdCB0YWJsZUNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50YWJsZS1jb250YWluZXInKTtcclxuICAgIHRhYmxlQ29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xyXG4gICAgQnV0dG9ucy5BZGRSb3cuaGlkZSgpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzYXZlVGFibGVEYXRhKCkge1xyXG4gICAgLy8gcmVtb3ZlIHRoZSBkZXRhaWwgdGV4dFxyXG4gICAgVG9vbHRpcC51bmxpbmsoKTtcclxuICAgIC8vIGdldCB0YWJsZVxyXG4gICAgdmFyIHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcclxuICAgIC8vIGRldGVybWluZSBzYXZlX2FzIG5hbWVcclxuICAgIGlmIChDdXJyZW50RnVuZC5udW1iZXIoKSkge1xyXG4gICAgICAgIHZhciBzYXZlX2FzID0gYCR7Q3VycmVudFBhZ2UubG9hZCgpfV8ke0N1cnJlbnRGdW5kLm51bWJlcigpfWA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZhciBzYXZlX2FzID0gQ3VycmVudFBhZ2UubG9hZCgpO1xyXG4gICAgfVxyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oc2F2ZV9hcywgY29udmVydFRvSlNPTih0YWJsZSwgWydFZGl0J10pKTtcclxuICAgIC8vIHVwZGF0ZSBzaWRlYmFyIHdpdGggbmV3IGRhdGFcclxuICAgIFNpZGViYXIudXBkYXRlVG90YWxzKCk7XHJcbiAgICAvLyByZWxpbmssIGRlcGVuZGluZyBvbiBwYWdlXHJcbiAgICBUb29sdGlwLmxpbmtBbGwoKTtcclxufVxyXG5cclxuY29uc3QgVGFibGUgPSB7XHJcbiAgICBodG1sIDogYFxyXG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLWJvcmRlcmVkIG10LTMgZGlzcGxheVwiIGlkPVwibWFpbi10YWJsZVwiPlxyXG4gICAgICAgICAgICA8dGhlYWQgY2xhc3M9XCJ0aGVhZC1kYXJrXCI+PC90aGVhZD5cclxuICAgICAgICAgICAgPHRib2R5PjwvdGJvZHk+XHJcbiAgICAgICAgPC90YWJsZT5gLFxyXG4gICAgQnV0dG9ucyA6IEJ1dHRvbnMsXHJcbiAgICBDZWxsIDogQ2VsbCxcclxuICAgIENvbHVtbnMgOiBDb2x1bW5zLFxyXG4gICAgSGVhZGVyIDogSGVhZGVyLFxyXG4gICAgUm93cyA6IFJvd3MsXHJcbiAgICBEYXRhIDogRGF0YSxcclxuICAgIEZpbHRlciA6IEZpbHRlcixcclxuICAgIC8vIGZ1bmN0aW9uc1xyXG4gICAgYWRqdXN0V2lkdGggOiBmdW5jdGlvbih3aWR0aF9wY3Qpe1xyXG4gICAgICAgIGFkanVzdFRhYmxlV2lkdGgod2lkdGhfcGN0KVxyXG4gICAgfSxcclxuICAgIGNsZWFyIDogaGlkZVRhYmxlLFxyXG4gICAgaGlkZSA6IGhpZGVUYWJsZSxcclxuICAgIHNob3cgOiBzaG93VGFibGUsXHJcbiAgICBzYXZlIDogc2F2ZVRhYmxlRGF0YVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBUYWJsZTsiLCJpbXBvcnQgJy4vYWNjb3JkaW9uLmNzcydcclxuXHJcblxyXG5pbXBvcnQge0Jhc2VsaW5lLCBDdXJyZW50RnVuZCwgRnVuZCwgU3VwcGxlbWVudGFsLCBGdW5kTG9va3VwVGFibGV9IGZyb20gJy4uLy4uL21vZGVscydcclxuaW1wb3J0IHsgZm9ybWF0Q3VycmVuY3ksIGNsZWFuU3RyaW5nIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NvbW1vbl91dGlscy5qc1wiO1xyXG5pbXBvcnQgVGFibGUgZnJvbSBcIi4uL3RhYmxlL3RhYmxlLmpzXCI7XHJcbmltcG9ydCB7IHZpc2l0UGFnZSB9IGZyb20gJy4uLy4uL3ZpZXdzL3ZpZXdfbG9naWMuanMnO1xyXG5cclxuZnVuY3Rpb24gcmVkaXJlY3RGb3JFZGl0KCl7XHJcbiAgICBjb25zdCByb3cgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuYWN0aXZlLWVkaXRpbmdgKTtcclxuICAgIGNvbnN0IHRhYmxlID0gcm93LnBhcmVudEVsZW1lbnQ7XHJcbiAgICBjb25zdCBzZWN0aW9uID0gdGFibGUuY2xvc2VzdCgnLnN1bW1hcnktY29udGFpbmVyJyk7XHJcbiAgICAvLyBuZXcgaW5pdGlhdGl2ZSBlZGl0cyBzaG91bGQgYWxsIHJlZGlyZWN0IHRvIHRoZSBuZXctaW5pdHMgcGFnZVxyXG4gICAgaWYgKHNlY3Rpb24uaWQgPT0gJ3N1cHAtYWNjb3JkaW9uJyl7XHJcbiAgICAgICAgdmlzaXRQYWdlKCduZXctaW5pdHMnKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIFNwbGl0IHRoZSBzdHJpbmcgaW50byBwYXJ0cyB1c2luZyAnLScgYXMgdGhlIGRlbGltaXRlcjsgcmV0YWluIGZ1bmQgYXMgMXN0IG51bWVyaWMgc2VnbWVudFxyXG4gICAgICAgIGNvbnN0IGZ1bmQgPSB0YWJsZS5pZC5zcGxpdCgnLScpWzFdXHJcbiAgICAgICAgXHJcbiAgICAgICAgQ3VycmVudEZ1bmQudXBkYXRlKGZ1bmQpO1xyXG4gICAgICAgIGNvbnN0IGxpbmVJdGVtID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy5saW5lLWl0ZW0nKS50ZXh0Q29udGVudDtcclxuICAgICAgICAvLyB2aXNpdCB0aGUgY29ycmVjdCBwYWdlIGZvciBlZGl0aW5nXHJcbiAgICAgICAgc3dpdGNoKGxpbmVJdGVtKXtcclxuICAgICAgICAgICAgY2FzZSAnUGVyc29ubmVsIEV4cGVuZGl0dXJlcyc6XHJcbiAgICAgICAgICAgICAgICB2aXNpdFBhZ2UoJ3BlcnNvbm5lbCcpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ05vbi1QZXJzb25uZWwgRXhwZW5kaXR1cmVzJzpcclxuICAgICAgICAgICAgICAgIHZpc2l0UGFnZSgnbm9ucGVyc29ubmVsJyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnUmV2ZW51ZXMnOlxyXG4gICAgICAgICAgICAgICAgdmlzaXRQYWdlKCdyZXZlbnVlJyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnT3ZlcnRpbWUgRXhwZW5kaXR1cmVzJzpcclxuICAgICAgICAgICAgICAgIHZpc2l0UGFnZSgnb3ZlcnRpbWUnKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignTmFtZSBvZiBsaW5lIGl0ZW0gaW4gdGFibGUgZG9lcyBub3QgbWF0Y2ggYSBwYWdlIGRlc3RpbmF0aW9uLicpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBFeHBlbnNlVGFibGUgPSB7XHJcbiAgICB0YWJsZV9pZCA6IChhY2NvdW50X3N0cmluZykgPT4geyByZXR1cm4gYHRhYmxlLSR7YWNjb3VudF9zdHJpbmd9YCB9LFxyXG4gICAgaW5pdChhY2NvdW50X3N0cmluZykge1xyXG4gICAgICAgIC8vIGNyZWF0ZSBlbXB0eSB0YWJsZSBhbmQgcHV0IGl0IGluIHRoZSBhY2NvcmRpb25cclxuICAgICAgICB2YXIgdGFibGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0YWJsZScpO1xyXG4gICAgICAgIHRhYmxlLmlkID0gdGhpcy50YWJsZV9pZChhY2NvdW50X3N0cmluZyk7XHJcbiAgICAgICAgdGFibGUuY2xhc3NMaXN0LmFkZCgnYWNjb3JkaW9uLXRhYmxlJyk7XHJcbiAgICAgICAgdmFyIHBhcmVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCNzdHJpbmdfJHthY2NvdW50X3N0cmluZ31fY29udGVudCAuYWNjb3JkaW9uLWJvZHlgKTtcclxuICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGFibGUpO1xyXG4gICAgfSxcclxuICAgIGNyZWF0ZU5ld0NlbGwoY29udGVudCwgcm93LCBjbGFzc05hbWUpIHtcclxuICAgICAgICBjb25zdCBuZXdDZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTtcclxuICAgICAgICBuZXdDZWxsLmlubmVySFRNTCA9IGNvbnRlbnQ7XHJcbiAgICAgICAgbmV3Q2VsbC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XHJcbiAgICAgICAgcm93LmFwcGVuZENoaWxkKG5ld0NlbGwpO1xyXG4gICAgfSxcclxuICAgIGFkZFJvdyhhY2NvdW50X3N0cmluZywgcm93X25hbWUsIG51bWJlcil7XHJcbiAgICAgICAgdmFyIHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy50YWJsZV9pZChhY2NvdW50X3N0cmluZykpO1xyXG4gICAgICAgIHZhciBuZXdfcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTtcclxuICAgICAgICB0YWJsZS5hcHBlbmRDaGlsZChuZXdfcm93KTtcclxuICAgICAgICAvLyBDcmVhdGUgYSBjZWxsIGZvciB0aGUgbGluZSBpdGVtIGxhYmVsXHJcbiAgICAgICAgdGhpcy5jcmVhdGVOZXdDZWxsKHJvd19uYW1lLCBuZXdfcm93LCAnbGluZS1pdGVtJyk7XHJcbiAgICAgICAgLy8gY3JlYXRlIGEgY2VsbCBmb3IgdGhlIGFtb3VudFxyXG4gICAgICAgIHRoaXMuY3JlYXRlTmV3Q2VsbChmb3JtYXRDdXJyZW5jeShudW1iZXIpLCBuZXdfcm93LCAnY29zdCcpO1xyXG4gICAgICAgIC8vIGNyZWF0ZSBFZGl0IGJ1dHRvbiBcclxuICAgICAgICB2YXIgYnV0dG9uID0gJyc7XHJcbiAgICAgICAgaWYgKHJvd19uYW1lICE9ICdOZXQgRXhwZW5kaXR1cmVzIChSZXZlbnVlcyknKXtcclxuICAgICAgICAgICAgYnV0dG9uID0gVGFibGUuQnV0dG9ucy5FZGl0Lmh0bWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3JlYXRlTmV3Q2VsbChidXR0b24sIG5ld19yb3cpO1xyXG4gICAgfSxcclxuICAgIGZpbGxGcm9tRnVuZChmdW5kKSB7XHJcbiAgICAgICAgLy8gdXNlIGp1c3QgZnVuZCBhcyBhY2NvdW50IHN0cmluZyB0byBpbml0aWFsaXplIHRhYmxlIGluc2lkZSBhY2NvcmRpb25cclxuICAgICAgICB0aGlzLmluaXQoZnVuZCk7XHJcbiAgICAgICAgY29uc3QgZnVuZE9iamVjdCA9IG5ldyBGdW5kKGZ1bmQpO1xyXG5cclxuICAgICAgICAvLyBBZGQgYSByb3cgZm9yIGVhY2ggYXBwcm9wcmlhdGlvbiBpbiB0aGUgZnVuZFxyXG4gICAgICAgIGNvbnN0IGlkID0gY2xlYW5TdHJpbmcoZnVuZCk7XHJcblxyXG4gICAgICAgIGZ1bmRPYmplY3QuZ2V0QXBwcm9wcmlhdGlvbnMoKS5mb3JFYWNoKCBhcHByb3BPYmogPT4ge1xyXG4gICAgICAgICAgICAvLyBpZiB0aGUgdG90YWwgZm9yIHRoZSBhcHByb3ByaWF0aW9uIGlzID4gJDAsIGFkZCBhbiBhY2NvcmRpb24gZm9yIGFsbCB0aGUgQ0NzXHJcbiAgICAgICAgICAgIGlmICggYXBwcm9wT2JqLnRvdGFsKCkgIT0gMCApe1xyXG4gICAgICAgICAgICAgICAgSXRlbS5hZGQoYXBwcm9wT2JqLmFjY291bnRTdHJpbmcoKSwgYCNzdHJpbmdfJHtpZH1fY29udGVudCAuYWNjb3JkaW9uLWJvZHlgKTtcclxuICAgICAgICAgICAgICAgIEl0ZW0udXBkYXRlSGVhZGVyKGFwcHJvcE9iai5uYW1lKCksIGFwcHJvcE9iai5hY2NvdW50U3RyaW5nKCksIGFwcHJvcE9iai50b3RhbCgpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsbEZyb21BcHByb3AoYXBwcm9wT2JqKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICB9LFxyXG4gICAgZmlsbEZyb21BcHByb3AoYXBwcm9wT2JqKXtcclxuICAgICAgICAvLyBpbml0aWFsaXplIHRoZSB0YWJsZSBvYmplY3RcclxuICAgICAgICB0aGlzLmluaXQoYXBwcm9wT2JqLmFjY291bnRTdHJpbmcoKSk7XHJcbiAgICAgICAgLy8gYWRkIGEgY29sbGFwc2libGUgcm93IGZvciBlYWNoIGNvc3QgY2VudGVyXHJcbiAgICAgICAgYXBwcm9wT2JqLmdldENvc3RDZW50ZXJzKCkuZm9yRWFjaCggY2NPYmogPT4ge1xyXG4gICAgICAgICAgICBpZiAoY2NPYmouZ2V0VG90YWwoKSAhPSAwICl7XHJcbiAgICAgICAgICAgICAgICBJdGVtLmFkZChjY09iai5hY2NvdW50U3RyaW5nKCksIGAjc3RyaW5nXyR7YXBwcm9wT2JqLmFjY291bnRTdHJpbmcoKX1fY29udGVudCAuYWNjb3JkaW9uLWJvZHlgKTtcclxuICAgICAgICAgICAgICAgIEl0ZW0udXBkYXRlSGVhZGVyKGNjT2JqLmdldE5hbWUoKSwgY2NPYmouYWNjb3VudFN0cmluZygpLCBjY09iai5nZXRUb3RhbCgpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsbEZyb21DQyhjY09iaik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIFxyXG4gICAgfSxcclxuICAgIGZpbGxGcm9tQ0MoY2NPYmope1xyXG4gICAgICAgIC8vIGluaXRpYWxpemUgYSB0YWJsZSBhbmQgc3VtbWFyaXplIHRoZSBsaW5lIGl0ZW1zXHJcbiAgICAgICAgdGhpcy5pbml0KGNjT2JqLmFjY291bnRTdHJpbmcoKSk7XHJcbiAgICAgICAgdGhpcy5hZGRSb3coY2NPYmouYWNjb3VudFN0cmluZygpLCAnUGVyc29ubmVsIEV4cGVuZGl0dXJlcycsIGNjT2JqLmdldFBlcnNvbm5lbENvc3QoKSk7XHJcbiAgICAgICAgdGhpcy5hZGRSb3coY2NPYmouYWNjb3VudFN0cmluZygpLCAnT3ZlcnRpbWUgRXhwZW5kaXR1cmVzJywgY2NPYmouZ2V0T3ZlcnRpbWVDb3N0KCkpO1xyXG4gICAgICAgIHRoaXMuYWRkUm93KGNjT2JqLmFjY291bnRTdHJpbmcoKSwgJ05vbi1QZXJzb25uZWwgRXhwZW5kaXR1cmVzJywgY2NPYmouZ2V0Tm9uUGVyc29ubmVsQ29zdCgpKTtcclxuICAgICAgICB0aGlzLmFkZFJvdyhjY09iai5hY2NvdW50U3RyaW5nKCksICdSZXZlbnVlcycsIGNjT2JqLmdldFJldmVudWUoKSk7XHJcbiAgICAgICAgdGhpcy5hZGRSb3coY2NPYmouYWNjb3VudFN0cmluZygpLCAnTmV0IEV4cGVuZGl0dXJlcyAoUmV2ZW51ZXMpJywgY2NPYmouZ2V0VG90YWwoKSk7XHJcbiAgICB9LFxyXG4gICAgZmlsbEZyb21Jbml0KHByb2dyYW0pIHtcclxuICAgICAgICAvLyBGaWxsIG91dCBpbmZvIGZvciBlYWNoIHN1cHBsZW1lbnRhbCBpbml0XHJcbiAgICAgICAgdGhpcy5pbml0KHByb2dyYW0uaWQoKSk7XHJcbiAgICAgICAgdGhpcy5hZGRSb3cocHJvZ3JhbS5pZCgpLCAnRXN0aW1hdGVkIFJldmVudWUnLCBwcm9ncmFtLnJldmVudWUoKSk7XHJcbiAgICAgICAgdGhpcy5hZGRSb3cocHJvZ3JhbS5pZCgpLCAnUGVyc29ubmVsIEV4cGVuZGl0dXJlcycsIHByb2dyYW0ucGVyc29ubmVsKCkpO1xyXG4gICAgICAgIHRoaXMuYWRkUm93KHByb2dyYW0uaWQoKSwgJ05vbi1QZXJzb25uZWwgT3BlcmF0aW5nJywgcHJvZ3JhbS5vcGVyYXRpbmcoKSk7XHJcbiAgICAgICAgdGhpcy5hZGRSb3cocHJvZ3JhbS5pZCgpLCAnTm9uLVBlcnNvbm5lbCBDYXBpdGFsJywgcHJvZ3JhbS5jYXBpdGFsKCkpO1xyXG4gICAgICAgIHRoaXMuYWRkUm93KHByb2dyYW0uaWQoKSwgJ1RvdGFsIEV4cGVuZGl0dXJlcycsIHByb2dyYW0udG90YWwoKSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IEl0ZW0gPSB7XHJcbiAgICBhY2NvdW50U3RyaW5nKGZ1bmQsIGFwcHJvcCA9ICcnLCBjYyA9ICcnKSB7XHJcbiAgICAgICAgdmFyIGFjY291bnRfc3RyaW5nID0gY2xlYW5TdHJpbmcoZnVuZCk7XHJcbiAgICAgICAgaWYgKGFwcHJvcCkgeyBhY2NvdW50X3N0cmluZyArPSBhcHByb3AgfTtcclxuICAgICAgICBpZiAoY2MpIHsgYWNjb3VudF9zdHJpbmcgKz0gY2MgfTtcclxuICAgICAgICByZXR1cm4gYWNjb3VudF9zdHJpbmc7XHJcbiAgICB9LFxyXG4gICAgaHRtbChhY2NvdW50X3N0cmluZyl7XHJcbiAgICAgICAgcmV0dXJuIGA8aDIgY2xhc3M9XCJhY2NvcmRpb24taGVhZGVyXCIgaWQ9XCJzdHJpbmdfJHthY2NvdW50X3N0cmluZ31faGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjY29yZGlvbi1idXR0b24gY29sbGFwc2VkXCIgdHlwZT1cImJ1dHRvblwiIGRhdGEtYnMtdG9nZ2xlPVwiY29sbGFwc2VcIiBkYXRhLWJzLXRhcmdldD1cIiNzdHJpbmdfJHthY2NvdW50X3N0cmluZ31fY29udGVudFwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIGFyaWEtY29udHJvbHM9XCJzdHJpbmdfJHthY2NvdW50X3N0cmluZ31cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYW1lXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFtb3VudFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwic3RyaW5nXyR7YWNjb3VudF9zdHJpbmd9X2NvbnRlbnRcIiBjbGFzcz1cImFjY29yZGlvbi1jb2xsYXBzZSBjb2xsYXBzZVwiIGFyaWEtbGFiZWxsZWRieT1cInN0cmluZ18ke2FjY291bnRfc3RyaW5nfV9oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWJvZHlcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PmBcclxuICAgIH0sXHJcbiAgICBhZGQgOiBmdW5jdGlvbihhY2NvdW50X3N0cmluZywgYWNjb3JkaW9uX3F1ZXJ5KSB7XHJcbiAgICAgICAgLy8gZ2V0IGFjY29yZGlvbiBhbmQgYWRkIGEgbmV3IGl0ZW0gdG8gaXRcclxuICAgICAgICBjb25zdCBwYXJlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGFjY29yZGlvbl9xdWVyeSk7XHJcbiAgICAgICAgY29uc3QgaXRlbV9lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgaXRlbV9lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FjY29yZGlvbi1pdGVtJyk7XHJcbiAgICAgICAgaXRlbV9lbGVtZW50LmlubmVySFRNTCA9IHRoaXMuaHRtbChhY2NvdW50X3N0cmluZyk7XHJcbiAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGl0ZW1fZWxlbWVudCk7XHJcbiAgICB9LFxyXG4gICAgRXhwZW5zZVRhYmxlIDogRXhwZW5zZVRhYmxlLFxyXG4gICAgdXBkYXRlSGVhZGVyIDogZnVuY3Rpb24odGl0bGUsIGFjY291bnRfc3RyaW5nLCBuZXdfYW1vdW50KSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVyX2J0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCNzdHJpbmdfJHthY2NvdW50X3N0cmluZ31faGVhZGVyIGJ1dHRvbmApO1xyXG4gICAgICAgIGhlYWRlcl9idG4ucXVlcnlTZWxlY3Rvcignc3Bhbi5uYW1lJykudGV4dENvbnRlbnQgPSB0aXRsZTtcclxuICAgICAgICBoZWFkZXJfYnRuLnF1ZXJ5U2VsZWN0b3IoJ3NwYW4uYW1vdW50JykudGV4dENvbnRlbnQgPSBmb3JtYXRDdXJyZW5jeShuZXdfYW1vdW50KTtcclxuICAgIH1cclxufVxyXG5cclxuY29uc3QgQWRkSW5pdEJ1dHRvbiA9IHtcclxuICAgIGluaXQoKSB7XHJcbiAgICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJ0bi1hZGQtaW5pdCcpO1xyXG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIHZpc2l0UGFnZSgnbmV3LWluaXRzJyk7XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IEFjY29yZGlvbiA9IHtcclxuICAgIEl0ZW0gOiBJdGVtLFxyXG4gICAgQWRkSW5pdEJ1dHRvbjogQWRkSW5pdEJ1dHRvbixcclxuICAgIGhpZGUgOiBmdW5jdGlvbigpe1xyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNhY2NvcmRpb24tZGl2Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAvLyByZXNldCB0byBkZWxldGUgY29udGVudFxyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiYXNlbGluZS1hY2NvcmRpb24gLnN1bW1hcnktYWNjb3JkaW9uJykuaW5uZXJIVE1MID0gJyc7XHJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3N1cHAtYWNjb3JkaW9uIC5zdW1tYXJ5LWFjY29yZGlvbicpLmlubmVySFRNTCA9ICcnO1xyXG4gICAgfSxcclxuICAgIHNob3cgOiBmdW5jdGlvbigpe1xyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNhY2NvcmRpb24tZGl2Jykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICB9LFxyXG4gICAgYXN5bmMgY3JlYXRlQmFzZWxpbmUoKXtcclxuICAgICAgICB2YXIgZnVuZHMgPSBGdW5kTG9va3VwVGFibGUubGlzdEZ1bmRzKCk7XHJcbiAgICAgICAgZnVuZHMuZm9yRWFjaChmdW5kID0+IHtcclxuICAgICAgICAgICAgSXRlbS5hZGQoZnVuZCwgJyNiYXNlbGluZS1hY2NvcmRpb24gLnN1bW1hcnktYWNjb3JkaW9uJyk7XHJcbiAgICAgICAgICAgIEl0ZW0uRXhwZW5zZVRhYmxlLmZpbGxGcm9tRnVuZChmdW5kKTtcclxuICAgICAgICAgICAgY29uc3QgZnVuZE9iamVjdCA9IG5ldyBGdW5kKGZ1bmQpO1xyXG4gICAgICAgICAgICBJdGVtLnVwZGF0ZUhlYWRlcihgRnVuZCAke0Z1bmRMb29rdXBUYWJsZS5nZXROYW1lKGZ1bmQpfWAsIGZ1bmQsIGZ1bmRPYmplY3QuZ2V0VG90YWwoKSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIGNvbG9yLWNvZGUgR0YgYmFzZWxpbmVcclxuICAgICAgICBjb25zdCBHRiA9IG5ldyBGdW5kKDEwMDApO1xyXG4gICAgICAgIC8vIHRleHQgdG8gY29sb3IgY29kZVxyXG4gICAgICAgIGxldCB0b3BsaW5lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3N0cmluZ18xMDAwX2hlYWRlciAuYW1vdW50Jyk7XHJcbiAgICAgICAgaWYgKEdGLmdldFRvdGFsKCkgPD0gQmFzZWxpbmUudGFyZ2V0KCkpe1xyXG4gICAgICAgICAgICB0b3BsaW5lLnN0eWxlLmNvbG9yID0gJ2dyZWVuJztcclxuICAgICAgICAgICAgdG9wbGluZS5zdHlsZS53ZWlnaHQgPSA0O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgdG9wbGluZS5zdHlsZS5jb2xvciA9ICdyZWQnO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICBjcmVhdGVTdXBwKCkge1xyXG4gICAgICAgIGNvbnN0IHN1cHAgPSBuZXcgU3VwcGxlbWVudGFsO1xyXG4gICAgICAgIHN1cHAuaW5pdGlhdGl2ZXMuZm9yRWFjaChwcm9ncmFtID0+IHtcclxuICAgICAgICAgICAgSXRlbS5hZGQocHJvZ3JhbS5pZCgpLCAnI3N1cHAtYWNjb3JkaW9uIC5zdW1tYXJ5LWFjY29yZGlvbicpO1xyXG4gICAgICAgICAgICBJdGVtLkV4cGVuc2VUYWJsZS5maWxsRnJvbUluaXQocHJvZ3JhbSk7XHJcbiAgICAgICAgICAgIEl0ZW0udXBkYXRlSGVhZGVyKHByb2dyYW0ubmFtZSwgcHJvZ3JhbS5pZCgpLCBwcm9ncmFtLnRvdGFsKCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSxcclxuICAgIHVwZGF0ZVRvcExpbmVzKCkge1xyXG4gICAgICAgIC8vIGFkanVzZSBiYXNlbGluZVxyXG4gICAgICAgIC8vIGNvbnN0IGJhc2VsaW5lID0gbmV3IEJhc2VsaW5lO1xyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lID0gbmV3IEJhc2VsaW5lO1xyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQW1vdW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Jhc2VsaW5lLXRpdGxlIC50b3AtbGluZS1hbW91bnQnKVxyXG4gICAgICAgIGJhc2VsaW5lQW1vdW50LnRleHRDb250ZW50ID0gZm9ybWF0Q3VycmVuY3koYmFzZWxpbmUudG90YWwoKSk7XHJcbiAgICAgICAgLy8gYWRqdXN0IHN1cHBsZW1lbnRhbHNcclxuICAgICAgICBjb25zdCBzdXBwID0gbmV3IFN1cHBsZW1lbnRhbDtcclxuICAgICAgICBjb25zdCBzdXBwQW1vdW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3N1cHAtdGl0bGUgLnRvcC1saW5lLWFtb3VudCcpXHJcbiAgICAgICAgc3VwcEFtb3VudC50ZXh0Q29udGVudCA9IGZvcm1hdEN1cnJlbmN5KHN1cHAudG90YWwoKSk7XHJcblxyXG4gICAgfSxcclxuICAgIGJ1aWxkKCkge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlQmFzZWxpbmUoKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZVN1cHAoKTtcclxuICAgICAgICAvLyBpbml0aWFsaXplIGVkaXQgYnV0dG9uc1xyXG4gICAgICAgIFRhYmxlLkJ1dHRvbnMuRWRpdC5pbml0KHJlZGlyZWN0Rm9yRWRpdCk7XHJcbiAgICAgICAgdGhpcy5BZGRJbml0QnV0dG9uLmluaXQoKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVRvcExpbmVzKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBBY2NvcmRpb247XHJcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9maWxlX3VwbG9hZC5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9maWxlX3VwbG9hZC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCIvLyBmaWxlX3VwbG9hZC5qc1xyXG5pbXBvcnQgJy4vZmlsZV91cGxvYWQuY3NzJztcclxuaW1wb3J0IHsgcHJvY2Vzc1dvcmtib29rIH0gZnJvbSBcIi4uLy4uL3V0aWxzL1hMU1hfaGFuZGxlcnMuanNcIjtcclxuaW1wb3J0IE5hdkJ1dHRvbnMgZnJvbSAnLi4vbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanMnO1xyXG5cclxuZXhwb3J0IGNvbnN0IEZpbGVVcGxvYWQgPSB7XHJcbiAgICBpbml0IDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgTmF2QnV0dG9ucy5OZXh0LmRpc2FibGUoKTtcclxuICAgICAgICBjb25zdCBpbnB1dE9iamVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLWlucHV0Jyk7XHJcbiAgICAgICAgaW5wdXRPYmplY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24oZXZlbnQpIHsgcmVhZFhMKGV2ZW50KSB9KTtcclxuICAgIH0sXHJcbiAgICBzaG93IDogZnVuY3Rpb24oKXtcclxuICAgICAgICBjb25zdCBpbnB1dE9iamVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLWlucHV0Jyk7XHJcbiAgICAgICAgaW5wdXRPYmplY3Quc3R5bGUuZGlzcGxheSA9ICcnO1xyXG4gICAgfSxcclxuICAgIGhpZGUgOiBmdW5jdGlvbigpe1xyXG4gICAgICAgIGNvbnN0IGlucHV0T2JqZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtaW5wdXQnKTtcclxuICAgICAgICBpbnB1dE9iamVjdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgfVxyXG59O1xyXG5cclxuZnVuY3Rpb24gcmVhZFhMKGV2ZW50KSB7XHJcbiAgICBjb25zdCBmaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdOyAvLyByZWFkIHVwbG9hZGVkIGZpbGVcclxuICAgIGNvbnN0IHNwaW5uZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkLXNwaW5uZXInKTsgLy8gZ2V0IHRoZSBzcGlubmVyIGVsZW1lbnRcclxuXHJcbiAgICBpZiAoZmlsZSkge1xyXG4gICAgICAgIC8vIFNob3cgdGhlIHNwaW5uZXJcclxuICAgICAgICBzcGlubmVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG5cclxuICAgICAgICAvLyByZWFkIGluIG5ldyBkYXRhXHJcbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGUudGFyZ2V0LnJlc3VsdDtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzV29ya2Jvb2soYXJyYXlCdWZmZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEhpZGUgdGhlIHNwaW5uZXIgb25jZSBwcm9jZXNzaW5nIGlzIGRvbmVcclxuICAgICAgICAgICAgICAgIHNwaW5uZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgICAgIE5hdkJ1dHRvbnMuTmV4dC5lbmFibGUoKTsgLy8gRW5hYmxlIHRoZSBuZXh0IGJ1dHRvbiBhZnRlciBwcm9jZXNzaW5nXHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIHdvcmtib29rOicsIGVycm9yKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBIaWRlIHRoZSBzcGlubmVyIGluIGNhc2Ugb2YgYW4gZXJyb3JcclxuICAgICAgICAgICAgICAgIHNwaW5uZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgICAgIE5hdkJ1dHRvbnMuTmV4dC5lbmFibGUoKTsgLy8gRW5zdXJlIHRoZSBidXR0b24gaXMgcmUtZW5hYmxlZCBpbiBjYXNlIG9mIGFuIGVycm9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5vbmVycm9yID0gZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlYWRpbmcgZmlsZTonLCBlcnIpO1xyXG5cclxuICAgICAgICAgICAgLy8gSGlkZSB0aGUgc3Bpbm5lciBpbiBjYXNlIG9mIGFuIGVycm9yXHJcbiAgICAgICAgICAgIHNwaW5uZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgTmF2QnV0dG9ucy5OZXh0LmVuYWJsZSgpOyAvLyBFbnN1cmUgdGhlIGJ1dHRvbiBpcyByZS1lbmFibGVkIGluIGNhc2Ugb2YgYW4gZXJyb3JcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7IC8vIFJlYWQgdGhlIGZpbGUgYXMgYW4gQXJyYXlCdWZmZXJcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRmlsZVVwbG9hZDsiLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbW9kYWwuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbW9kYWwuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiaW1wb3J0ICcuL21vZGFsLmNzcyc7XHJcblxyXG5mdW5jdGlvbiBjbGVhck1vZGFsKCkge1xyXG4gICAgdXBkYXRlTW9kYWxUaXRsZSgnJyk7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kYWwtYm9keScpLmlubmVySFRNTCA9ICcnO1xyXG59XHJcblxyXG5mdW5jdGlvbiBoaWRlTW9kYWwoKSB7XHJcbiAgICAkKCcjbWFpbi1tb2RhbCcpLm1vZGFsKCdoaWRlJyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dNb2RhbCgpIHtcclxuICAgICQoJyNtYWluLW1vZGFsJykubW9kYWwoJ3Nob3cnKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd01vZGFsSGFuZGxlcigpIHtcclxuICAgIHNob3dNb2RhbCgnbWFpbi1tb2RhbCcpO1xyXG59XHJcblxyXG5jb25zdCBTdWJtaXQgPSB7XHJcbiAgICBoYW5kbGVyOiBudWxsLFxyXG5cclxuICAgIGluaXQ6IGZ1bmN0aW9uKG9uU3VibWl0KSB7XHJcbiAgICAgICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi1tb2RhbCcpO1xyXG5cclxuICAgICAgICAvLyBEZWluaXRpYWxpemUgZmlyc3QgdG8gYXZvaWQgbXVsdGlwbGUgYmluZGluZ3NcclxuICAgICAgICB0aGlzLmRlaW5pdCgpO1xyXG5cclxuICAgICAgICB0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBvblN1Ym1pdChldmVudCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy8gQWRkaW5nIHRoZSBoYW5kbGVyIGFzIHRoZSBldmVudCBsaXN0ZW5lclxyXG4gICAgICAgIG1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIHRoaXMuaGFuZGxlcik7XHJcblxyXG4gICAgICAgIC8vIGFkZCBldmVudCBsaXN0ZW5lciB0byBlbmFibGUgY2xvc2UgeFxyXG4gICAgICAgIGNvbnN0IHggPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCcjbW9kYWwtY2xvc2UteCcpO1xyXG4gICAgICAgIHguYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoaWRlTW9kYWwpO1xyXG4gICAgfSxcclxuXHJcbiAgICBkZWluaXQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tbW9kYWwnKTtcclxuICAgICAgICBpZiAodGhpcy5oYW5kbGVyICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIFJlbW92aW5nIHRoZSBldmVudCBsaXN0ZW5lciBhbmQgY2xlYXIgdGhlIGhhbmRsZXJcclxuICAgICAgICAgICAgbW9kYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignc3VibWl0JywgdGhpcy5oYW5kbGVyKTtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVyID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHJlbW92ZSBldmVudCBsaXN0ZW5lciB0byBlbmFibGUgY2xvc2UgeFxyXG4gICAgICAgIGNvbnN0IHggPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCcjbW9kYWwtY2xvc2UteCcpO1xyXG4gICAgICAgIHgucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoaWRlTW9kYWwpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuY29uc3QgTGluayA9IHtcclxuICAgIGFkZCA6IGZ1bmN0aW9uKGJ1dHRvbl9pZCl7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYnV0dG9uX2lkKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNob3dNb2RhbEhhbmRsZXIpO1xyXG4gICAgfSxcclxuICAgIHJlbW92ZSA6IGZ1bmN0aW9uKGJ1dHRvbl9pZCl7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYnV0dG9uX2lkKS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHNob3dNb2RhbEhhbmRsZXIpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuZnVuY3Rpb24gdXBkYXRlTW9kYWxUaXRsZSh0aXRsZSkge1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSB0aXRsZTtcclxufVxyXG5cclxuY29uc3QgVGl0bGUgPSB7XHJcbiAgICB1cGRhdGUgOiBmdW5jdGlvbih0aXRsZSkge1xyXG4gICAgICAgIHVwZGF0ZU1vZGFsVGl0bGUodGl0bGUpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IE1vZGFsID0ge1xyXG4gICAgaGlkZTogaGlkZU1vZGFsLFxyXG4gICAgc2hvdzogc2hvd01vZGFsLFxyXG4gICAgY2xlYXI6IGNsZWFyTW9kYWwsXHJcbiAgICBUaXRsZTogVGl0bGUsXHJcbiAgICBMaW5rOiBMaW5rLFxyXG4gICAgU3VibWl0OiBTdWJtaXRcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1vZGFsOyIsImltcG9ydCAnLi9ib2R5LmNzcyc7XHJcblxyXG5pbXBvcnQgV2VsY29tZSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3dlbGNvbWUvd2VsY29tZS5qcydcclxuaW1wb3J0IEFjY29yZGlvbiBmcm9tICcuLi9hY2NvcmRpb24vYWNjb3JkaW9uLmpzJztcclxuaW1wb3J0IEZpbGVVcGxvYWQgZnJvbSAnLi4vZmlsZV91cGxvYWQvZmlsZV91cGxvYWQuanMnO1xyXG5pbXBvcnQgTW9kYWwgZnJvbSAnLi4vbW9kYWwvbW9kYWwuanMnO1xyXG5pbXBvcnQgTmF2QnV0dG9ucyBmcm9tICcuLi9uYXZfYnV0dG9ucy9uYXZfYnV0dG9ucy5qcyc7XHJcbmltcG9ydCBQcm9tcHQgZnJvbSAnLi4vcHJvbXB0L3Byb21wdC5qcyc7XHJcbmltcG9ydCBTaWRlYmFyIGZyb20gJy4uL3NpZGViYXIvc2lkZWJhci5qcyc7XHJcbmltcG9ydCBUYWJsZSBmcm9tICcuLi90YWJsZS90YWJsZS5qcyc7XHJcbmltcG9ydCBUb29sdGlwIGZyb20gJy4uL3Rvb2x0aXAvdG9vbHRpcC5qcyc7ICBcclxuXHJcbmZ1bmN0aW9uIHJlc2V0UGFnZSgpIHtcclxuICAgIC8vIGhpZGUgZXZlcnl0aGluZyBpbiB0aGUgYm9keVxyXG4gICAgV2VsY29tZS5oaWRlKCk7XHJcbiAgICBNb2RhbC5jbGVhcigpO1xyXG4gICAgTW9kYWwuaGlkZSgpO1xyXG4gICAgTmF2QnV0dG9ucy5oaWRlKCk7XHJcbiAgICBQcm9tcHQuaGlkZSgpO1xyXG4gICAgVGFibGUuaGlkZSgpO1xyXG4gICAgU2lkZWJhci5oaWRlKCk7XHJcbiAgICBBY2NvcmRpb24uaGlkZSgpO1xyXG4gICAgRmlsZVVwbG9hZC5oaWRlKCk7XHJcbiAgICBUb29sdGlwLmhpZGUoKTtcclxuXHJcbiAgICAvLyByZXNldCBmaWx0ZXIgZHJvcGRvd25zXHJcbiAgICBUYWJsZS5GaWx0ZXIuZGVsZXRlQWxsKCk7XHJcblxyXG4gICAgUHJvbXB0LkJ1dHRvbnMucmVzZXQoKTtcclxuICAgIC8vIGRpc2FibGUgc3VibWl0IGJ1dHRvblxyXG4gICAgTW9kYWwuU3VibWl0LmRlaW5pdCgpO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgQm9keSA9IHtcclxuICAgIHJlc2V0IDogcmVzZXRQYWdlXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJvZHk7IiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2hlYWRlci5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9oZWFkZXIuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiaW1wb3J0ICcuL2hlYWRlci5jc3MnO1xyXG5cclxuaW1wb3J0IEN1cnJlbnRGdW5kIGZyb20gJy4uLy4uL21vZGVscy9jdXJyZW50X2Z1bmQnO1xyXG5pbXBvcnQgeyBGSVNDQUxfWUVBUiB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XHJcblxyXG5leHBvcnQgY29uc3QgVGl0bGUgPSB7XHJcbiAgICB1cGRhdGUgOiBmdW5jdGlvbih0aXRsZSl7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0aXRsZVwiKS50ZXh0Q29udGVudCA9IHRpdGxlO1xyXG4gICAgfSxcclxuICAgIGRlZmF1bHQoKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGUoYEZZJHtGSVNDQUxfWUVBUn0gQnVkZ2V0IFJlcXVlc3RgKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgU3VidGl0bGUgPSB7XHJcbiAgICB1cGRhdGUgOiBmdW5jdGlvbihzdWJ0aXRsZSl7XHJcbiAgICAgICAgLy8gZ2V0IGN1cnJlbnQgZnVuZFxyXG4gICAgICAgIHZhciBmdW5kID0gQ3VycmVudEZ1bmQubmFtZSgpO1xyXG4gICAgICAgIGlmIChmdW5kKXtcclxuICAgICAgICAgICAgdmFyIHN1YnRpdGxlID0gYCR7c3VidGl0bGV9OiAke2Z1bmR9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzdWJ0aXRsZVwiKS50ZXh0Q29udGVudCA9IHN1YnRpdGxlO1xyXG4gICAgfVxyXG59IiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2Zvcm0uY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vZm9ybS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCIvLyBmdW5jdGlvbiB0byBhZGQgcXVlc3Rpb25zIHRvIGZvcm1zXHJcblxyXG5pbXBvcnQgRHJvcGRvd24gZnJvbSBcIi4vZHJvcGRvd25cIjtcclxuXHJcbi8vIGlucHV0VHlwZSBpcyBmb3IgdmFsaWRhdGlvbiAoJ251bWJlcicgb3IgJ3RleHQnLCBldGMpXHJcbmZ1bmN0aW9uIGFwcGVuZEZvcm1FbGVtZW50KGxhYmVsLCBpbnB1dEVsLCBpbnB1dElkLCByZXF1aXJlZCkge1xyXG5cclxuICAgIC8vIGNoYW5nZSBpZiB3ZSB3YW50IGZvcm1zIGVsc2V3aGVyZVxyXG4gICAgY29uc3QgZm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZXctZm9ybScpO1xyXG5cclxuICAgIC8vIGNyZWF0ZSBvdXRlciB3cmFwcGVyIGZvciBlbGVtZW50XHJcbiAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7ICBcclxuXHJcbiAgICAvLyBsYWJlbCBxdWVzdGlvblxyXG4gICAgY29uc3QgbGFiZWxFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XHJcbiAgICBsYWJlbEVsLnRleHRDb250ZW50ID0gbGFiZWw7XHJcblxyXG4gICAgLy8gbWFyayBhcyByZXF1aXJlZCBpZiBhcHBsaWNhYmxlXHJcbiAgICBpbnB1dEVsLnJlcXVpcmVkID0gcmVxdWlyZWQ7XHJcblxyXG4gICAgLy8gSWYgYW4gSUQgaXMgcHJvdmlkZWQsIHNldCBpdCBvbiB0aGUgZWxlbWVudFxyXG4gICAgaWYgKGlucHV0SWQpIHtcclxuICAgICAgICAvL2lucHV0RWwuaWQgPSBgaW5wdXQtJHtpbnB1dElkfWA7XHJcbiAgICAgICAgaW5wdXRFbC5pZCA9IGlucHV0SWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY3JlYXRlIHZhbGlkYXRpb24gdGV4dC8gYSBwbGFjZSB0byBkaXNwbGF5IGVycm9yc1xyXG4gICAgY29uc3QgdmFsaWRhdGlvblRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XHJcbiAgICB2YWxpZGF0aW9uVGV4dC5pZCA9IGAke2lucHV0SWR9LXZhbGlkYXRpb25gO1xyXG4gICAgdmFsaWRhdGlvblRleHQuY2xhc3NMaXN0LmFkZCgnZXJyb3ItbWVzc2FnZScpO1xyXG4gICAgdmFsaWRhdGlvblRleHQuc3R5bGUuY29sb3IgPSAncmVkJztcclxuICBcclxuICAgIC8vIGFkZCBlbGVtZW50c1xyXG4gICAgd3JhcHBlci5hcHBlbmRDaGlsZChsYWJlbEVsKTtcclxuICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoaW5wdXRFbCk7XHJcbiAgICB3cmFwcGVyLmFwcGVuZENoaWxkKHZhbGlkYXRpb25UZXh0KTtcclxuICAgIGZvcm0uYXBwZW5kQ2hpbGQod3JhcHBlcik7XHJcbn0gXHJcblxyXG5leHBvcnQgY29uc3QgTmV3RmllbGQgPSB7XHJcbiAgICBzaG9ydFRleHQgOiBmdW5jdGlvbihsYWJlbCwgaW5wdXRJZCwgcmVxdWlyZWQgPSBmYWxzZSkge1xyXG4gICAgICAgIGNvbnN0IGlucHV0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgICAgIGlucHV0RWwudHlwZSA9ICd0ZXh0JztcclxuICAgICAgICBhcHBlbmRGb3JtRWxlbWVudChsYWJlbCwgaW5wdXRFbCwgaW5wdXRJZCwgcmVxdWlyZWQpO1xyXG4gICAgfSxcclxuICAgIGxvbmdUZXh0IDogZnVuY3Rpb24obGFiZWwsIGlucHV0SWQsIHJlcXVpcmVkID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCBpbnB1dEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcclxuICAgICAgICBhcHBlbmRGb3JtRWxlbWVudChsYWJlbCwgaW5wdXRFbCwgaW5wdXRJZCwgcmVxdWlyZWQpO1xyXG4gICAgfSxcclxuICAgIG51bWVyaWNJbnB1dCA6IGZ1bmN0aW9uKGxhYmVsLCBpbnB1dElkLCByZXF1aXJlZCA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgaW5wdXRFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XHJcbiAgICAgICAgaW5wdXRFbC50eXBlID0gJ251bWJlcic7XHJcbiAgICAgICAgYXBwZW5kRm9ybUVsZW1lbnQobGFiZWwsIGlucHV0RWwsIGlucHV0SWQscmVxdWlyZWQpO1xyXG4gICAgfSxcclxuICAgIGRyb3Bkb3duIDogZnVuY3Rpb24obGFiZWwsIGlucHV0SWQsIG9wdGlvbkFycmF5LCByZXF1aXJlZCA9IGZhbHNlKXtcclxuICAgICAgICB2YXIgaW5wdXRFbCA9IERyb3Bkb3duLmNyZWF0ZShvcHRpb25BcnJheSk7XHJcbiAgICAgICAgYXBwZW5kRm9ybUVsZW1lbnQobGFiZWwsIGlucHV0RWwsIGlucHV0SWQsIHJlcXVpcmVkKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTmV3RmllbGQ7IiwiZnVuY3Rpb24gYWRkU3VibWl0QnV0dG9uVG9Gb3JtKGZvcm1faWQpIHtcclxuICAgIC8vIEZpbmQgdGhlIGZvcm0gYnkgaXRzIElEXHJcbiAgICBjb25zdCBmb3JtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9ybV9pZCk7XHJcbiAgXHJcbiAgICAvLyBDcmVhdGUgdGhlIGNvbnRhaW5lciBgZGl2YCBmb3IgdGhlIGJ1dHRvblxyXG4gICAgY29uc3QgYnV0dG9uQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICBidXR0b25Db250YWluZXIuaWQgPSAnc3VibWl0LWJ0bi1jb250YWluZXInO1xyXG4gICAgXHJcbiAgICAvLyBDcmVhdGUgdGhlIHN1Ym1pdCBpbnB1dFxyXG4gICAgY29uc3Qgc3VibWl0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgc3VibWl0SW5wdXQuY2xhc3NOYW1lID0gJ2J0biBidG4tc3VibWl0JzsgLy8gVXNlIGFwcHJvcHJpYXRlIGNsYXNzIGZvciB5b3VyIGRlc2lnblxyXG4gICAgc3VibWl0SW5wdXQudHlwZSA9ICdzdWJtaXQnO1xyXG4gICAgc3VibWl0SW5wdXQudmFsdWUgPSAnU3VibWl0JztcclxuXHJcbiAgICAvLyBBcHBlbmQgdGhlIHN1Ym1pdCBpbnB1dCB0byB0aGUgY29udGFpbmVyXHJcbiAgICBidXR0b25Db250YWluZXIuYXBwZW5kQ2hpbGQoc3VibWl0SW5wdXQpO1xyXG4gICAgXHJcbiAgICAvLyBBcHBlbmQgdGhlIGNvbnRhaW5lciB0byB0aGUgZm9ybVxyXG4gICAgZm9ybS5hcHBlbmRDaGlsZChidXR0b25Db250YWluZXIpO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgU3VibWl0QnV0dG9uID0ge1xyXG4gICAgYWRkIDogZnVuY3Rpb24oKSB7IGFkZFN1Ym1pdEJ1dHRvblRvRm9ybSgnbmV3LWZvcm0nKSB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN1Ym1pdEJ1dHRvbjsiLCJpbXBvcnQgJy4vZm9ybS5jc3MnO1xyXG5cclxuaW1wb3J0IERyb3Bkb3duIGZyb20gXCIuL3N1YmNvbXBvbmVudHMvZHJvcGRvd24uanNcIjtcclxuaW1wb3J0IE5ld0ZpZWxkIGZyb20gXCIuL3N1YmNvbXBvbmVudHMvZmllbGRzLmpzXCI7XHJcbmltcG9ydCBTdWJtaXRCdXR0b24gZnJvbSBcIi4vc3ViY29tcG9uZW50cy9zdWJtaXQuanNcIjtcclxuXHJcbmZ1bmN0aW9uIGZldGNoQWxsUmVzcG9uc2VzKGV2ZW50KSB7XHJcblxyXG4gICAgLy8gQXNzdW1pbmcgYGV2ZW50LnRhcmdldGAgaXMgdGhlIGZvcm0gaXRzZWxmXHJcbiAgICBjb25zdCBmb3JtID0gZXZlbnQudGFyZ2V0O1xyXG4gICAgXHJcbiAgICAvLyBJbml0aWFsaXplIGFuIGVtcHR5IGFycmF5IHRvIGhvbGQgdGhlIGlucHV0IHZhbHVlc1xyXG4gICAgbGV0IGZvcm1EYXRhID0ge307XHJcbiAgICBcclxuICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIGZvcm0gZWxlbWVudFxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBmb3JtLmVsZW1lbnRzW2ldO1xyXG4gICAgICBcclxuICAgICAgLy8gRXhjbHVkZSBlbGVtZW50cyB0aGF0IGFyZW4ndCBpbnB1dHMsIHRleHRhcmVhcywgb3Igc2VsZWN0XHJcbiAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcgfHxcclxuICAgICAgICAgIGVsZW1lbnQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyB8fFxyXG4gICAgICAgICAgZWxlbWVudC50YWdOYW1lID09PSAnU0VMRUNUJykge1xyXG4gICAgICAgIC8vIEV4Y2x1ZGUgaW5wdXQgdHlwZXMgdGhhdCBhcmUgbm90IGNvbnNpZGVyZWQgZm9yIHN1Ym1pc3Npb24gKHN1Y2ggYXMgYHN1Ym1pdGApXHJcbiAgICAgICAgaWYgKGVsZW1lbnQudHlwZSAhPT0gJ3N1Ym1pdCcgJiYgZWxlbWVudC50eXBlICE9PSAnYnV0dG9uJykge1xyXG4gICAgICAgICAgZm9ybURhdGFbZWxlbWVudC5pZF0gPSBlbGVtZW50LnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBmb3JtLnJlc2V0KCk7XHJcbiAgICByZXR1cm4gZm9ybURhdGE7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFkZEZvcm0oZWxlbWVudF9pZCA9ICdtb2RhbC1ib2R5JywgZm9ybV9pZCA9ICduZXctZm9ybScpIHtcclxuICBcclxuICBjb25zdCB0YXJnZXRfZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRfaWQpO1xyXG5cclxuICAvLyBjcmVhdGUgZm9ybVxyXG4gIGNvbnN0IGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7XHJcbiAgZm9ybS5zZXRBdHRyaWJ1dGUoJ2lkJywgZm9ybV9pZCk7XHJcblxyXG4gIC8vIEFwcGVuZCB0aGUgZm9ybSB0byB0aGUgbW9kYWwgYm9keVxyXG4gIHRhcmdldF9lbGVtLmFwcGVuZENoaWxkKGZvcm0pO1xyXG5cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IEZvcm0gPSB7XHJcbiAgbmV3IDogZnVuY3Rpb24ocGFyZW50X2VsZW1faWQpIHsgYWRkRm9ybShwYXJlbnRfZWxlbV9pZCwgJ25ldy1mb3JtJykgfSxcclxuICBmZXRjaEFsbFJlc3BvbnNlcyA6IGZ1bmN0aW9uKGV2ZW50KSB7IHJldHVybiBmZXRjaEFsbFJlc3BvbnNlcyhldmVudCkgfSxcclxuICBOZXdGaWVsZCA6IE5ld0ZpZWxkLFxyXG4gIERyb3Bkb3duIDogRHJvcGRvd24sXHJcbiAgU3VibWl0QnV0dG9uIDogU3VibWl0QnV0dG9uXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEZvcm07IiwiaW1wb3J0IFByb21wdCBmcm9tIFwiLi4vY29tcG9uZW50cy9wcm9tcHQvcHJvbXB0LmpzXCI7XHJcbmltcG9ydCBTaWRlYmFyIGZyb20gXCIuLi9jb21wb25lbnRzL3NpZGViYXIvc2lkZWJhci5qc1wiO1xyXG5pbXBvcnQgTmF2QnV0dG9ucyBmcm9tIFwiLi4vY29tcG9uZW50cy9uYXZfYnV0dG9ucy9uYXZfYnV0dG9ucy5qc1wiO1xyXG5pbXBvcnQgQm9keSBmcm9tIFwiLi4vY29tcG9uZW50cy9ib2R5L2JvZHkuanNcIjtcclxuaW1wb3J0IHsgU3VidGl0bGUsIFRpdGxlIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvaGVhZGVyL2hlYWRlci5qc1wiO1xyXG5pbXBvcnQgVGFibGUgZnJvbSBcIi4uL2NvbXBvbmVudHMvdGFibGUvdGFibGUuanNcIjtcclxuaW1wb3J0IEZvcm0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZm9ybS9mb3JtLmpzXCI7XHJcbmltcG9ydCBNb2RhbCBmcm9tIFwiLi4vY29tcG9uZW50cy9tb2RhbC9tb2RhbC5qc1wiO1xyXG5cclxuaW1wb3J0IHsgQ3VycmVudFBhZ2UsIEFjY291bnRTdHJpbmcgfSBmcm9tICcuLi9tb2RlbHMvJ1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBWaWV3IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICAvLyBwYWdlIHN0YXRlIGluIGxvY2FsIHN0b3JhZ2VcclxuICAgICAgICB0aGlzLnBhZ2Vfc3RhdGUgPSAnJztcclxuXHJcbiAgICAgICAgLy8gd2hldGhlciB0byBkaXNwbGF5XHJcbiAgICAgICAgdGhpcy5uYXZCdXR0b25zID0gdHJ1ZTsgXHJcbiAgICAgICAgdGhpcy5zaWRlYmFyID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gdGV4dCB0byBzaG93IGluIHRoZSBwcm9tcHQgYXJlYVxyXG4gICAgICAgIHRoaXMucHJvbXB0ID0gbnVsbDtcclxuXHJcbiAgICAgICAgLy8gc3VidGl0bGUgdGV4dFxyXG4gICAgICAgIHRoaXMuc3VidGl0bGUgPSAnJztcclxuXHJcbiAgICAgICAgLy8gdGFibGUgb2JqZWN0IG9mIGNsYXNzIFZpZXdUYWJsZSBvciBudWxsXHJcbiAgICAgICAgdGhpcy50YWJsZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdmlzaXQoKSB7XHJcbiAgICAgICAgLy8gdXBkYXRlIHBhZ2Ugc3RhdGVcclxuICAgICAgICBDdXJyZW50UGFnZS51cGRhdGUodGhpcy5wYWdlX3N0YXRlKTtcclxuXHJcbiAgICAgICAgLy8gc3RhcnQgd2l0aCBhIGJsYW5rIHBhZ2VcclxuICAgICAgICBCb2R5LnJlc2V0KCk7XHJcblxyXG4gICAgICAgIC8vIGFkZCBkZWZhdWx0IHRpdGxlXHJcbiAgICAgICAgVGl0bGUuZGVmYXVsdCgpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIGRlZmF1bHQgdG8gc2hvd2luZyBuYXZidXR0b25zXHJcbiAgICAgICAgaWYgKHRoaXMubmF2QnV0dG9ucykgeyBOYXZCdXR0b25zLnNob3coKTsgfTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBkZWZhdWx0IHRvIHNob3dpbmcgc2lkZWJhclxyXG4gICAgICAgIGlmICh0aGlzLnNpZGViYXIpIHsgU2lkZWJhci5zaG93KCkgfTtcclxuXHJcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSBwcm9tcHQgdGV4dCBhbmQgYnV0dG9uc1xyXG4gICAgICAgIGlmICh0aGlzLnByb21wdCkgeyBQcm9tcHQuVGV4dC51cGRhdGUodGhpcy5wcm9tcHQpIH07XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSB0YWJsZVxyXG4gICAgICAgIGlmICh0aGlzLnRhYmxlKSB7IHRoaXMudGFibGUuYnVpbGQoKTsgfVxyXG5cclxuICAgICAgICAvLyBzaG93IHBhZ2Ugc3VidGl0bGVcclxuICAgICAgICBpZiAodGhpcy5zdWJ0aXRsZSkgeyBTdWJ0aXRsZS51cGRhdGUodGhpcy5zdWJ0aXRsZSkgfTtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhbnVwKCkgeyByZXR1cm47IH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBWaWV3VGFibGUge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgLy8gRW5zdXJlIG1ldGhvZHMgcmV0YWluIHRoZSBjb3JyZWN0IGB0aGlzYCBjb250ZXh0XHJcbiAgICAgICAgdGhpcy5zdWJtaXROZXdSb3cgPSB0aGlzLnN1Ym1pdE5ld1Jvdy5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLmNvbHVtbnMgPSBbXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdBY2NvdW50IFN0cmluZycsIGNsYXNzTmFtZTogJ2FjY291bnQtc3RyaW5nJyB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnQXBwcm9wcmlhdGlvbiBOYW1lJywgY2xhc3NOYW1lOiAnYXBwcm9wLW5hbWUnLCBoaWRlOiB0cnVlIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdBcHByb3ByaWF0aW9uJywgY2xhc3NOYW1lOiAnYXBwcm9wJywgaGlkZTogdHJ1ZSB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnQ29zdCBDZW50ZXIgTmFtZScsIGNsYXNzTmFtZTogJ2NjLW5hbWUnLCAgaGlkZTogdHJ1ZSB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnQ29zdCBDZW50ZXInLCBjbGFzc05hbWU6ICdjYycsICBoaWRlOiB0cnVlIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdGdW5kIE5hbWUnLCBjbGFzc05hbWU6ICdmdW5kLW5hbWUnLCAgaGlkZTogdHJ1ZSB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnRnVuZCcsIGNsYXNzTmFtZTogJ2Z1bmQnLCAgaGlkZTogdHJ1ZSB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnRWRpdCcsIGNsYXNzTmFtZTogJ2VkaXQnIH0sXHJcbiAgICAgICAgXTtcclxuICAgICAgICBcclxuICAgICAgICAvLyB3aGV0aGVyIHRvIGFkZCBhbiBlZGl0IGNvbHVtblxyXG4gICAgICAgIHRoaXMuYWRkRWRpdCA9IHRydWUgO1xyXG5cclxuICAgICAgICAvLyBtZXNzYWdlIHRvIHNob3cgaWYgdGhlcmUncyBubyBzYXZlZCBkYXRhXHJcbiAgICAgICAgdGhpcy5ub0RhdGFNZXNzYWdlID0gbnVsbDtcclxuICAgXHJcbiAgICAgICAgLy8gdGV4dCB0byBzaG93IGZvciBuZXcgcm93IGJ1dHRvblxyXG4gICAgICAgIHRoaXMuYWRkQnV0dG9uVGV4dCA9IG51bGwgO1xyXG5cclxuICAgICAgICAvLyB3aGV0aGVyIHRvIHNob3cgYXMgYSBkYXRhdGFibGVcclxuICAgICAgICB0aGlzLmRhdGFUYWJsZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcmVmcmVzaERhdGEoKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIGRhdGFcclxuICAgICAgICBhd2FpdCBUYWJsZS5EYXRhLmxvYWQoKTtcclxuXHJcbiAgICAgICAgLy8gY3JlYXRlIGEgZGF0YXRhYmxlIG9iamVjdFxyXG4gICAgICAgIGlmKHRoaXMuZGF0YVRhYmxlKXt0aGlzLmluaXREYXRhVGFibGUoKX1cclxuXHJcbiAgICAgICAgLy8gYWRkIGFuIGVkaXQgY29sdW1uIGlmIG5lZWRlZFxyXG4gICAgICAgIGlmICh0aGlzLmFkZEVkaXQpIHsgXHJcbiAgICAgICAgICAgIFRhYmxlLkNvbHVtbnMuYWRkQXRFbmQoVGFibGUuQnV0dG9ucy5lZGl0X2NvbmZpcm1fYnRucywgJ0VkaXQnKTsgXHJcbiAgICAgICAgICAgIC8vIGFjdGl2YXRlIGVkaXQgYnV0dG9uc1xyXG4gICAgICAgICAgICBUYWJsZS5CdXR0b25zLkVkaXQuaW5pdCh0aGlzLmFjdGlvbk9uRWRpdCwgdGhpcy51cGRhdGVUYWJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIGFzc2lnbiB0aGUgY29ycmVjdCBjbGFzc2VzIGJhc2VkIG9uIHRoZSB0YWJsZSBjb2x1bW5zXHJcbiAgICAgICAgVGFibGUuQ29sdW1ucy5hc3NpZ25DbGFzc2VzKHRoaXMuY29sdW1ucyk7XHJcblxyXG4gICAgICAgIC8vIEFwcGx5IGFueSB1cGRhdGUgZnVuY3Rpb24gdG8gbWFrZSBzdXJlIHNpZGViYXIgaXMgdXAgdG8gZGF0ZVxyXG4gICAgICAgIHRoaXMudXBkYXRlVGFibGUoKTtcclxuICAgICAgICAvLyBhZGQgYW55IG5ld2x5IGNyZWF0ZWQgY2Mgb3IgYXBwcm9wIHRvIHRoZSBmaWx0ZXJzXHJcbiAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJzKCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGJ1aWxkKCkge1xyXG4gICAgICAgIC8vIGJ1aWxkIHRhYmxlIGZyb20gbG9jYWwgc3RvcmFnZSBhbmQgaW5pdGlhbGl6ZSBlZGl0IGJ1dHRvbnNcclxuXHJcbiAgICAgICAgLy8gYWRkIHRoZSBhZGQgbmV3IHJvdyBidXR0b24gaWYgbmVlZGVkXHJcbiAgICAgICAgaWYgKHRoaXMuYWRkQnV0dG9uVGV4dCkgeyBcclxuICAgICAgICAgICAgdGhpcy5zZXRVcEZvcm0oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNoZWNrIGZvciBkYXRhXHJcbiAgICAgICAgaWYoYXdhaXQgVGFibGUuRGF0YS5sb2FkKCkpIHsgIFxyXG4gICAgICAgICAgICAvLyBpZiB0aGVyZSdzIGRhdGEsIHVwZGF0ZSB0aGUgdGFibGUgYW5kIGFkZCBmaWx0ZXJzICBcclxuICAgICAgICAgICAgdGhpcy5hZGRGaWx0ZXJzKCk7ICBcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoRGF0YSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIHNob3cgYSBtZXNzYWdlIGlmIHRoZXJlJ3Mgbm8gc2F2ZWQgdGFibGUgZGF0YSBmb3IgdGhlIHNlbGVjdGVkIGZ1bmRcclxuICAgICAgICAgICAgaWYgKHRoaXMubm9EYXRhTWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgUHJvbXB0LlRleHQudXBkYXRlKHRoaXMubm9EYXRhTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYWRkRmlsdGVycygpIHtcclxuICAgICAgICAvLyBBZGQgYWxsIHJlbGV2YW50IGZpbHRlcnMgdG8gdGFibGVcclxuICAgICAgICBpZiAodGhpcy5jb2x1bW5zLnNvbWUoY29sdW1uID0+IGNvbHVtbi5jbGFzc05hbWUgPT09ICdhcHByb3AtbmFtZScpKXtcclxuICAgICAgICAgICAgVGFibGUuRmlsdGVyLmFkZCgnQXBwcm9wcmlhdGlvbicsICdhcHByb3AtbmFtZScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jb2x1bW5zLnNvbWUoY29sdW1uID0+IGNvbHVtbi5jbGFzc05hbWUgPT09ICdjYy1uYW1lJykpe1xyXG4gICAgICAgICAgICBUYWJsZS5GaWx0ZXIuYWRkKCdDb3N0IENlbnRlcicsICdjYy1uYW1lJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvbHVtbnMuc29tZShjb2x1bW4gPT4gY29sdW1uLmNsYXNzTmFtZSA9PT0gJ29iamVjdC1uYW1lJykpe1xyXG4gICAgICAgICAgICBUYWJsZS5GaWx0ZXIuYWRkKCdPYmplY3QnLCAnb2JqZWN0LW5hbWUnKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmICh0aGlzLmNvbHVtbnMuc29tZShjb2x1bW4gPT4gY29sdW1uLmNsYXNzTmFtZSA9PT0gJ29iamVjdC1jYXRlZ29yeScpKXtcclxuICAgICAgICAgICAgVGFibGUuRmlsdGVyLmFkZCgnT2JqZWN0IENhdGVnb3J5JywgJ29iamVjdC1jYXRlZ29yeScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVGaWx0ZXJzKCkge1xyXG4gICAgICAgIC8vIHVwZGF0ZSBmaWx0ZXJzIHdpdGggYW55IG5ldyB2YWx1ZXNcclxuICAgICAgICBpZiAodGhpcy5jb2x1bW5zLnNvbWUoY29sdW1uID0+IGNvbHVtbi5jbGFzc05hbWUgPT09ICdhcHByb3AtbmFtZScpKXtcclxuICAgICAgICAgICAgVGFibGUuRmlsdGVyLnVwZGF0ZU9wdGlvbnMoJ0FwcHJvcHJpYXRpb24nLCAnYXBwcm9wLW5hbWUnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucy5zb21lKGNvbHVtbiA9PiBjb2x1bW4uY2xhc3NOYW1lID09PSAnY2MtbmFtZScpKXtcclxuICAgICAgICAgICAgVGFibGUuRmlsdGVyLnVwZGF0ZU9wdGlvbnMoJ0Nvc3QgQ2VudGVyJywgJ2NjLW5hbWUnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucy5zb21lKGNvbHVtbiA9PiBjb2x1bW4uY2xhc3NOYW1lID09PSAnb2JqZWN0LW5hbWUnKSl7XHJcbiAgICAgICAgICAgIFRhYmxlLkZpbHRlci51cGRhdGVPcHRpb25zKCdvYmplY3QtbmFtZScpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucy5zb21lKGNvbHVtbiA9PiBjb2x1bW4uY2xhc3NOYW1lID09PSAnb2JqZWN0LWNhdGVnb3J5Jykpe1xyXG4gICAgICAgICAgICBUYWJsZS5GaWx0ZXIudXBkYXRlT3B0aW9ucygnb2JqZWN0LWNhdGVnb3J5Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXREYXRhVGFibGUoKSB7XHJcbiAgICAgICAgVGFibGUuYWRqdXN0V2lkdGgoJzEwMCUnKTtcclxuICAgICAgICAvLyBJbml0aWFsaXplIERhdGF0YWJsZXNcclxuICAgICAgICBpZiAoICEkLmZuLmRhdGFUYWJsZS5pc0RhdGFUYWJsZSgnI21haW4tdGFibGUnKSApIHtcclxuICAgICAgICAgICAgJCgnI21haW4tdGFibGUnKS5EYXRhVGFibGUoe1xyXG4gICAgICAgICAgICAgICAgcGFnaW5nOiBmYWxzZSwgLy8gRGlzYWJsZSBwYWdpbmF0aW9uXHJcbiAgICAgICAgICAgICAgICBpbmZvOiBmYWxzZSwgLy8gRGlzYWJsZSB0YWJsZSBpbmZvcm1hdGlvbiBkaXNwbGF5XHJcbiAgICAgICAgICAgICAgICBzZWFyY2hpbmc6IGZhbHNlIC8vIERpc2FibGUgdGhlIHNlYXJjaCBiYXJcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwbGFjZWhvbGRlciBmb3IgYWN0aW9uIG9uIHJvdyBlZGl0IGNsaWNrXHJcbiAgICBhY3Rpb25PbkVkaXQoKSB7IHJldHVybiB9XHJcblxyXG4gICAgLy8gdXBkYXRlIGZ1bmN0aW9uIGZvciB0aGUgc2lkZWJhcjsgZGVmYXVsdCB0byBqdXN0IHNhdmluZyB0aGUgdGFibGVcclxuICAgIHVwZGF0ZVRhYmxlKCkgeyBUYWJsZS5zYXZlKCkgfVxyXG5cclxuICAgIC8vIGV4dHJhIHF1ZXN0aW9ucyBvZiB0aGUgZm9ybSB0byBhZGQgYSBuZXcgcm93XHJcbiAgICBhZGRDdXN0b21RdWVzdGlvbnMoKSB7IHJldHVybiB9O1xyXG5cclxuICAgIGFkZFZhbGlkYXRpb25MaXN0ZW5lcihpbnB1dElkLCBmaWVsZExhYmVsLCB2YWxpZGF0aW9uSWQsIGxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpO1xyXG4gICAgICAgIGlucHV0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChpbnB1dEVsZW1lbnQudmFsdWUgPT09ICdBZGQgbmV3Jykge1xyXG4gICAgICAgICAgICAgICAgLy8gQWRkIGEgbmV3IGZpZWxkIGFmdGVyIHRoZSBzZWxlY3RlZCBlbGVtZW50XHJcbiAgICAgICAgICAgICAgICBGb3JtLk5ld0ZpZWxkLnNob3J0VGV4dChgVHlwZSBuZXcgJHtmaWVsZExhYmVsfTpgLCBpbnB1dElkLnNsaWNlKDAsIC01KSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgbmV3SW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5wdXRJZC5zbGljZSgwLCAtNSkpOyAgLy8gUmVtb3ZlICctbmFtZScgc3VmZml4XHJcbiAgICAgICAgICAgICAgICBpbnB1dEVsZW1lbnQucGFyZW50RWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgbmV3SW5wdXRFbGVtZW50LnBhcmVudEVsZW1lbnQpO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAvLyBBZGQgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHZhbGlkYXRpb24gb24gdGhlIG5ldyBpbnB1dCBmaWVsZFxyXG4gICAgICAgICAgICAgICAgbmV3SW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbGlkYXRpb25UZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodmFsaWRhdGlvbklkKTtcclxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGV4dC50ZXh0Q29udGVudCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdJbnB1dEVsZW1lbnQudmFsdWUubGVuZ3RoICE9PSBsZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblRleHQudGV4dENvbnRlbnQgPSBgJHtmaWVsZExhYmVsfSBjb2RlcyBtdXN0IGJlIGV4YWN0bHkgJHtsZW5ndGh9IG51bWJlcnMuYDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTmFOKE51bWJlcihuZXdJbnB1dEVsZW1lbnQudmFsdWUpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGV4dC50ZXh0Q29udGVudCA9IGAke2ZpZWxkTGFiZWx9IGNvZGVzIG11c3QgYmUgbnVtZXJpYy5gO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBuZXcgaW5wdXQgZmllbGQgaWYgJ0FkZCBuZXcnIGlzIG5vdCBzZWxlY3RlZFxyXG4gICAgICAgICAgICAgICAgbGV0IG5ld0lucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQuc2xpY2UoMCwgLTUpKTtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdJbnB1dEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdJbnB1dEVsZW1lbnQucGFyZW50RWxlbWVudC5pbm5lckhUTUwgPSAnJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBNb2RpZmllZCBhZGRNb2RhbFZhbGlkYXRpb24gbWV0aG9kXHJcbiAgICBhZGRNb2RhbFZhbGlkYXRpb24oKSB7XHJcbiAgICAgICAgdGhpcy5hZGRWYWxpZGF0aW9uTGlzdGVuZXIoJ2FwcHJvcC1uYW1lJywgJ0FwcHJvcHJpYXRpb24nLCAnYXBwcm9wLXZhbGlkYXRpb24nLCA1KTtcclxuICAgICAgICB0aGlzLmFkZFZhbGlkYXRpb25MaXN0ZW5lcignY2MtbmFtZScsICdDb3N0IENlbnRlcicsICdjYy12YWxpZGF0aW9uJywgNik7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VXBGb3JtKCkge1xyXG4gICAgICAgIC8vIHNob3cgYWRkIGJ1dHRvblxyXG4gICAgICAgIFRhYmxlLkJ1dHRvbnMuQWRkUm93LnNob3coKTtcclxuICAgICAgICBUYWJsZS5CdXR0b25zLkFkZFJvdy51cGRhdGVUZXh0KHRoaXMuYWRkQnV0dG9uVGV4dCk7XHJcblxyXG4gICAgICAgIC8vIHNldCB1cCBtb2RhbCBmb3IgZm9ybSB3aGVuIGFkZCBidXR0b24gaXMgcHJlc3NlZFxyXG4gICAgICAgIE1vZGFsLmNsZWFyKCk7XHJcbiAgICAgICAgTW9kYWwuTGluay5hZGQoJ2FkZC1idG4nKTtcclxuICAgICAgICBNb2RhbC5UaXRsZS51cGRhdGUodGhpcy5hZGRCdXR0b25UZXh0KTtcclxuXHJcbiAgICAgICAgLy8gY3JlYXRlIGZvcm1cclxuICAgICAgICBGb3JtLm5ldygnbW9kYWwtYm9keScpO1xyXG5cclxuICAgICAgICAvLyBhZGQgY3VzdG9tIHF1ZXN0aW9uc1xyXG4gICAgICAgIHRoaXMuYWRkQ3VzdG9tUXVlc3Rpb25zKCk7XHJcbiAgICAgICAgLy8gYW55IHZhbGlkYXRpb24gb3Igc3BlY2lhbCBmdW5jdGlvbnNcclxuICAgICAgICB0aGlzLmFkZE1vZGFsVmFsaWRhdGlvbigpO1xyXG4gICAgICAgIC8vIGFkZCBzdWJtaXQgYnV0dG9uXHJcbiAgICAgICAgRm9ybS5TdWJtaXRCdXR0b24uYWRkKCk7XHJcblxyXG4gICAgICAgIC8vIEluaXRpYWxpemUgZm9ybSBzdWJtaXNzaW9uIHRvIHRhYmxlIGRhdGFcclxuICAgICAgICBNb2RhbC5TdWJtaXQuaW5pdCh0aGlzLnN1Ym1pdE5ld1Jvdyk7XHJcbiAgICB9XHJcblxyXG4gICAgZWRpdENvbHVtbnMocmVzcG9uc2VzKSB7IFxyXG4gICAgICAgIC8vIGlmIGEgbmV3IGFwcHJvcHJpYXRpb24gd2FzIGVudGVyZWQsIGZpeCBpdFxyXG4gICAgICAgIGlmIChyZXNwb25zZXNbJ2FwcHJvcCddKXtcclxuICAgICAgICAgICAgcmVzcG9uc2VzWydhcHByb3AtbmFtZSddID0gYCR7cmVzcG9uc2VzWydhcHByb3AnXX0gLSBOZXdgO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gc2FtZSBmb3IgY29zdCBjZW50ZXJcclxuICAgICAgICBpZiAocmVzcG9uc2VzWydjYyddKXtcclxuICAgICAgICAgICAgcmVzcG9uc2VzWydjYy1uYW1lJ10gPSBgJHtyZXNwb25zZXNbJ2NjJ119IC0gTmV3YDtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBnZXQgbnVtYmVycyBmcm9tIGFjY291bnQgc3RyaW5nIG5hbWVzXHJcbiAgICAgICAgaWYocmVzcG9uc2VzWydmdW5kLW5hbWUnXSl7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlc1snZnVuZCddID0gQWNjb3VudFN0cmluZy5nZXROdW1iZXIocmVzcG9uc2VzWydmdW5kLW5hbWUnXSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZihyZXNwb25zZXNbJ2FwcHJvcC1uYW1lJ10pe1xyXG4gICAgICAgICAgICByZXNwb25zZXNbJ2FwcHJvcCddID0gQWNjb3VudFN0cmluZy5nZXROdW1iZXIocmVzcG9uc2VzWydhcHByb3AtbmFtZSddKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmKHJlc3BvbnNlc1snY2MtbmFtZSddKXtcclxuICAgICAgICAgICAgcmVzcG9uc2VzWydjYyddID0gQWNjb3VudFN0cmluZy5nZXROdW1iZXIocmVzcG9uc2VzWydjYy1uYW1lJ10pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYocmVzcG9uc2VzWydvYmplY3QtbmFtZSddKXtcclxuICAgICAgICAgICAgcmVzcG9uc2VzWydvYmplY3QnXSA9IEFjY291bnRTdHJpbmcuZ2V0TnVtYmVyKHJlc3BvbnNlc1snb2JqZWN0LW5hbWUnXSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXNwb25zZXNbJ2FjY291bnQtc3RyaW5nJ10gPSBcclxuICAgICAgICAgICAgQWNjb3VudFN0cmluZy5idWlsZChyZXNwb25zZXNbJ2FwcHJvcC1uYW1lJ10sIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlc1snY2MtbmFtZSddLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZXNbJ29iamVjdC1uYW1lJ10sIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlc1snZnVuZCddKTtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2VzO1xyXG4gICAgfVxyXG5cclxuICAgIHN1Ym1pdE5ld1JvdyhldmVudCkge1xyXG4gICAgICAgIC8vIGdldCBhbnN3ZXJzIGZyb20gZm9ybSwgaGlkZSBmb3JtLCBzaG93IGFuc3dlcnMgaW4gdGFibGVcclxuICAgICAgICB2YXIgcmVzcG9uc2VzID0gRm9ybS5mZXRjaEFsbFJlc3BvbnNlcyhldmVudCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gZWRpdCBpbnB1dHMgZnJvbSBtb2RhbFxyXG4gICAgICAgIHJlc3BvbnNlcyA9IHRoaXMuZWRpdENvbHVtbnMocmVzcG9uc2VzKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBtYWtlIHN1cmUgaXQncyBub3QgYW4gZW1wdHkgcmVzcG9uc2VcclxuICAgICAgICBpZiAoT2JqZWN0LnZhbHVlcyhyZXNwb25zZXMpWzBdICE9ICcnKXtcclxuXHJcbiAgICAgICAgICAgIC8vIGNoYW5nZSBwYWdlIHZpZXdcclxuICAgICAgICAgICAgTW9kYWwuaGlkZSgpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gYWRkIGRhdGEgdG8gdGFibGVcclxuICAgICAgICAgICAgVGFibGUuUm93cy5hZGQocmVzcG9uc2VzLCB0aGlzLmNvbHVtbnMpO1xyXG4gICAgICAgICAgICBUYWJsZS5zYXZlKCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyByZWJ1aWxkIHRhYmxlXHJcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaERhdGEoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59IiwiXHJcbmltcG9ydCBXZWxjb21lIGZyb20gJy4uL2NvbXBvbmVudHMvd2VsY29tZS93ZWxjb21lLmpzJztcclxuaW1wb3J0IHsgRklTQ0FMX1lFQVIgfSBmcm9tICcuLi9jb25zdGFudHMvYnVkZ2V0X2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IFZpZXcgfSBmcm9tICcuL3ZpZXdfY2xhc3MuanMnO1xyXG5pbXBvcnQgeyB2aXNpdFBhZ2UgfSBmcm9tICcuL3ZpZXdfbG9naWMuanMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFdlbGNvbWVWaWV3IGV4dGVuZHMgVmlldyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLnBhZ2Vfc3RhdGUgPSAnd2VsY29tZSc7XHJcbiAgICAgICAgdGhpcy5zdWJ0aXRsZSA9ICdXZWxjb21lJztcclxuICAgICAgICB0aGlzLnNpZGViYXIgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm5hdkJ1dHRvbnMgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnByb21wdCA9IGBUaGlzIHRvb2wgd2lsbCBoZWxwIHlvdSBwcmVwYXJlIHlvdXIgYnVkZ2V0IHJlcXVlc3Qgc3VibWlzc2lvbiBmb3IgZmlzY2FsIHllYXIgXHJcbiAgICAgICAgICAgIDIwJHtGSVNDQUxfWUVBUn0uIFN0YXJ0IGJ5IHVwbG9hZGluZyB0aGUgZGV0YWlsIHNoZWV0IHNlbnQgdG8geW91IGJ5IHlvdXIgYnVkZ2V0IGFuYWx5c3QuIFRoaXNcclxuICAgICAgICAgICAgdG9vbCB3aWxsIHVzZSB0aGUgZGF0YSBpbiB0aGF0IHNoZWV0IHRvIHByZS1maWxsIHlvdXIgc3VibWlzc2lvbiB3aXRoIGxhc3QgeWVhcidzIHJlcXVlc3QuXHJcbiAgICAgICAgICAgIDxicj48YnI+XHJcbiAgICAgICAgICAgIFRoZW4sIHlvdSB3aWxsIGJlIGd1aWRlZCB0aHJvdWdoIGVhY2ggZnVuZCB0byBtYWtlIGFueSBhZGp1c3RtZW50cyBmcm9tIGxhc3QgeWVhcidzIHJlcXVlc3QuIFxyXG4gICAgICAgICAgICBBcyB5b3UgXHJcbiAgICAgICAgICAgIG1ha2UgdGhlc2UgYWRqdXN0bWVudHMsIHlvdSB3aWxsIHNlZSBhIHNpZGViYXIgdHJhY2tpbmcgeW91ciB0b3RhbCBleHBlbmRpdHVyZXMgYnkgZnVuZCBhbmQgeW91ciB0YXJnZXRcclxuICAgICAgICAgICAgYmFzZWxpbmUgZm9yIHRoZSBnZW5lcmFsIGZ1bmQuIFxyXG4gICAgICAgICAgICA8YnI+PGJyPlxyXG4gICAgICAgICAgICBPbmNlIHlvdSBnZXQgdGhyb3VnaCBhbGwgZnVuZHMgYW5kIHNldCB5b3VyIHJlcXVlc3QgYXQgb3IgYmVsb3cgdGhlIFxyXG4gICAgICAgICAgICB0YXJnZXQsIHlvdSB3aWxsIGJlIGFibGUgdG8gZG93bmxvYWQgYSBmaWxsZWQgdmVyc2lvbiBvZiB0aGUgRXhjZWwgZGV0YWlsIHNoZWV0LiBEb3dubG9hZGluZyBcclxuICAgICAgICAgICAgdGhpcyBmaWxlIGlzIHRoZSBvbmx5IHBlcm1hbmVudCB3YXkgdG8gc2F2ZSB5b3VyIHByb2dyZXNzLmBcclxuICAgIH1cclxuXHJcbiAgICB2aXNpdCgpIHtcclxuICAgICAgICBzdXBlci52aXNpdCgpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIHNob3cgd2VsY29tZSBzZWN0aW9uXHJcbiAgICAgICAgV2VsY29tZS5zaG93KCk7XHJcblxyXG4gICAgICAgIC8vIGluaXRpYWxpemUgbGlua3MgaW4gYnV0dG9uc1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGVwLXVwbG9hZCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdmlzaXRQYWdlKCd1cGxvYWQnKSk7XHJcbiAgICAgICAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0ZXAtaW5pdGlhdGl2ZXMnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHZpc2l0UGFnZSgnbmV3LWluaXRzJykpO1xyXG4gICAgICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGVwLXJldmVudWUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHZpc2l0UGFnZSgnYmFzZWxpbmUtbGFuZGluZycpKTtcclxuICAgICAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RlcC1maW5pc2gnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHZpc2l0UGFnZSgnc3VtbWFyeScpKTtcclxuXHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBXZWxjb21lVmlldztcclxuIiwiaW1wb3J0IHsgVmlldyB9IGZyb20gJy4vdmlld19jbGFzcy5qcydcclxuXHJcbmltcG9ydCBGaWxlVXBsb2FkIGZyb20gXCIuLi9jb21wb25lbnRzL2ZpbGVfdXBsb2FkL2ZpbGVfdXBsb2FkLmpzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVXBsb2FkVmlldyBleHRlbmRzIFZpZXcge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5wYWdlX3N0YXRlID0gJ3VwbG9hZCc7XHJcbiAgICAgICAgdGhpcy5wcm9tcHQgPSBgVXBsb2FkIHRoZSBiYXNlbGluZSBkZXRhaWwgc2hlZXQgZ2l2ZW4gYnkgeW91ciBidWRnZXQgYW5hbHlzdC5gO1xyXG4gICAgICAgIHRoaXMuc3VidGl0bGUgPSAnRXhjZWwgVXBsb2FkJztcclxuICAgICAgICB0aGlzLnNpZGViYXIgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB2aXNpdCgpIHtcclxuICAgICAgICBzdXBlci52aXNpdCgpO1xyXG4gICAgICAgIEZpbGVVcGxvYWQuc2hvdygpO1xyXG4gICAgICAgIEZpbGVVcGxvYWQuaW5pdCgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBVcGxvYWRWaWV3OyIsImltcG9ydCBOYXZCdXR0b25zIGZyb20gXCIuLi9jb21wb25lbnRzL25hdl9idXR0b25zL25hdl9idXR0b25zLmpzXCI7XHJcbmltcG9ydCBUYWJsZSBmcm9tIFwiLi4vY29tcG9uZW50cy90YWJsZS90YWJsZS5qc1wiO1xyXG5pbXBvcnQgeyBWaWV3LCBWaWV3VGFibGUgfSBmcm9tICcuL3ZpZXdfY2xhc3MuanMnXHJcbmltcG9ydCBDdXJyZW50RnVuZCBmcm9tIFwiLi4vbW9kZWxzL2N1cnJlbnRfZnVuZC5qc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZ1bmRWaWV3IGV4dGVuZHMgVmlldyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLnBhZ2Vfc3RhdGUgPSAnYmFzZWxpbmUtbGFuZGluZyc7XHJcbiAgICAgICAgdGhpcy5wcm9tcHQgPSBgV2Ugd2lsbCBub3cgYXNrIHlvdSBhIHNlcmllcyBvZiBxdWVzdGlvbnMgYWJvdXQgeW91ciBCQVNFTElORSBidWRnZXQgcmVxdWVzdC5cclxuICAgICAgICAgICAgQXQgdGhlIGVuZCwgd2Ugd2lsbCBhc2sgeW91IGFib3V0IGFueSBuZXcgaW5pdGlhdGl2ZXMgKGllLiBzdXBwbGVtZW50YWwgcmVxdWVzdHMpLlxyXG4gICAgICAgICAgICBTZWxlY3Qgb25lIG9mIHlvdXIgZnVuZHMgdGhlbiBjbGljayBjb250aW51ZS5gO1xyXG4gICAgICAgIHRoaXMuc3VidGl0bGUgPSAnQmFzZWxpbmUgQnVkZ2V0IFJlcXVlc3QnO1xyXG4gICAgICAgIHRoaXMudGFibGUgPSBuZXcgRnVuZFRhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5zaWRlYmFyID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5kYXRhVGFibGUgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB2aXNpdCgpIHtcclxuICAgICAgICAvLyByZW1vdmUgZnVuZCBzZWxlY3Rpb25cclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImZ1bmRcIiwgJycpO1xyXG4gICAgICAgIHN1cGVyLnZpc2l0KCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIEZ1bmRUYWJsZSBleHRlbmRzIFZpZXdUYWJsZSB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgLy8gYWRkIGFkZGl0aW9uYWwgcmV2ZW51ZSBjb2x1bW5zIHRvIHRoZSB0YWJsZVxyXG4gICAgICAgIHRoaXMuY29sdW1ucyA9IFtcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0Z1bmQnLCBjbGFzc05hbWU6ICdmdW5kLW5hbWUnIH1cclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICB0aGlzLm5vRGF0YU1lc3NhZ2UgPSAnTm8gZnVuZHMgZm91bmQuJ1xyXG4gICAgICAgIHRoaXMuYWRkRWRpdCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGJ1aWxkKCl7XHJcbiAgICAgICAgLy8gbG9hZCBpbiBmdW5kIGRhdGFcclxuICAgICAgICBUYWJsZS5zaG93KCk7XHJcbiAgICAgICAgVGFibGUuRGF0YS5sb2FkRnVuZHMoKTtcclxuICAgICAgICBUYWJsZS5Db2x1bW5zLmFzc2lnbkNsYXNzZXModGhpcy5jb2x1bW5zKTtcclxuICAgICAgICBUYWJsZS5hZGp1c3RXaWR0aCgnMzAlJyk7XHJcblxyXG4gICAgICAgIC8vIGRpc2FibGUgbmV4dCBidXR0b24gdW50aWwgYSBmdW5kIGlzIHNlbGVjdGVkXHJcbiAgICAgICAgTmF2QnV0dG9ucy5OZXh0LmRpc2FibGUoKTtcclxuICAgICAgICBhbGxvd1Jvd1NlbGVjdGlvbigpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuZnVuY3Rpb24gYWxsb3dSb3dTZWxlY3Rpb24oKXtcclxuICAgIFxyXG4gICAgdmFyIHRhYmxlUm93cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0Ym9keSB0clwiKTtcclxuICAgIFxyXG4gICAgLy8gZW5hYmxlIGhpZ2hsaWdodCBvbiBob3ZlciBhbmQgb24gc2VsZWN0XHJcbiAgICB0YWJsZVJvd3MuZm9yRWFjaChmdW5jdGlvbihyb3cpIHtcclxuICAgICAgICByb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnaG92ZXItZWZmZWN0Jyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcm93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZSgnaG92ZXItZWZmZWN0Jyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcm93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdEZ1bmQodGFibGVSb3dzLCB0aGlzKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzZWxlY3RGdW5kKHRhYmxlUm93cywgc2VsZWN0ZWRfcm93KXtcclxuXHJcbiAgICAvLyByZW1vdmUgc2VsZWN0ZWQgY2xhc3MgZnJvbSBhbnkgb3RoZXIgcm93c1xyXG4gICAgdGFibGVSb3dzLmZvckVhY2goZnVuY3Rpb24odGFibGVSb3cpIHtcclxuICAgICAgICB0YWJsZVJvdy5jbGFzc0xpc3QgPSAnJztcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIGFkZCBzZWxlY3RlZCBjbGFzcyB0byBjbGlja2VkIHJvd1xyXG4gICAgc2VsZWN0ZWRfcm93LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XHJcblxyXG4gICAgLy8gZ2V0IGZ1bmQgYW5kIHNhdmUgc2VsZWN0ZWQgZnVuZFxyXG4gICAgdmFyIGZ1bmQgPSBzZWxlY3RlZF9yb3cucXVlcnlTZWxlY3RvcignLmZ1bmQtbmFtZScpLnRleHRDb250ZW50O1xyXG4gICAgdmFyIGZ1bmROdW1iZXIgPSBwYXJzZUludChmdW5kKTtcclxuICAgIEN1cnJlbnRGdW5kLnVwZGF0ZShmdW5kTnVtYmVyKTtcclxuXHJcbiAgICAvLyBlbmFibGUgbmV4dCBzdGVwXHJcbiAgICBOYXZCdXR0b25zLk5leHQuZW5hYmxlKCk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEZ1bmRWaWV3OyIsImltcG9ydCB7IFZpZXcsIFZpZXdUYWJsZSB9IGZyb20gJy4vdmlld19jbGFzcy5qcydcclxuXHJcbmltcG9ydCBUYWJsZSBmcm9tICcuLi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBSZXZlbnVlVmlldyBleHRlbmRzIFZpZXcge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGZpc2NhbF95ZWFyKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLnBhZ2Vfc3RhdGUgPSAncmV2ZW51ZSc7XHJcbiAgICAgICAgdGhpcy5wcm9tcHQgPSBgUmV2aWV3IGFuZCBlZGl0IHJldmVudWUgbGluZSBpdGVtcy4gSWYgeW91IGNoYW5nZSB0aGUgZXN0aW1hdGUgb3IgXHJcbiAgICAgICAgICAgIG5vdGljZSBhbiBlcnJvciBpbiBhbiBhY2NvdW50IHN0cmluZywgcGxlYXNlIG5vdGUgaXQgaW4gdGhlIG5vdGVzIGNvbHVtbi4gQ2xpY2sgZWRpdCBcclxuICAgICAgICAgICAgdG8gY2hhbmdlIHZhbHVlcyBpbiBhIHJvdy5gO1xyXG4gICAgICAgIHRoaXMuc3VidGl0bGUgPSAnUmV2ZW51ZXMnO1xyXG4gICAgICAgIHRoaXMudGFibGUgPSBuZXcgUmV2ZW51ZVRhYmxlKGZpc2NhbF95ZWFyKTtcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgUmV2ZW51ZVRhYmxlIGV4dGVuZHMgVmlld1RhYmxlIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihmaXNjYWxfeWVhcikge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIC8vIGFkZCBhZGRpdGlvbmFsIHJldmVudWUgY29sdW1ucyB0byB0aGUgdGFibGVcclxuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuY29uY2F0KFtcclxuICAgICAgICAgICAgeyB0aXRsZTogJ1JlY3VycmluZyBvciBPbmUtVGltZScsIGNsYXNzTmFtZTogJ3JlY3VycmluZyd9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnT2JqZWN0IENhdGVnb3J5JywgY2xhc3NOYW1lOiAnb2JqZWN0LWNhdGVnb3J5J30sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6IGBGWSR7ZmlzY2FsX3llYXJ9IERlcGFydG1lbnRhbCBFc3RpbWF0ZWAsIGNsYXNzTmFtZTogJ3JlcXVlc3QnLCBpc0Nvc3Q6IHRydWV9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnRGVwYXJ0bWVudGFsIEVzdGltYXRlIE5vdGVzJywgY2xhc3NOYW1lOiAnbm90ZXMnfSxcclxuICAgICAgICAgICAgLy8gaGlkZGVuXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdPYmplY3QgTmFtZScsIGNsYXNzTmFtZTogJ29iamVjdC1uYW1lJywgaGlkZTogdHJ1ZX0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdPYmplY3QnLCBjbGFzc05hbWU6ICdvYmplY3QnLCBoaWRlOiB0cnVlfSxcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgdGhpcy5ub0RhdGFNZXNzYWdlID0gJ05vIHJldmVudWVzIGZvciB0aGlzIGZ1bmQuJ1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFjdGlvbiBvbiByb3cgZWRpdCBjbGljazogbWFrZSBjZWxscyBlZGl0YWJsZVxyXG4gICAgYWN0aW9uT25FZGl0KCkgeyBcclxuICAgICAgICAvLyBvbmx5IGFsbG93IGVkaXRzIGluIHRoZSBub3RlcyBib3hcclxuICAgICAgICBUYWJsZS5DZWxsLmNyZWF0ZVRleHRib3goJ25vdGVzJywgZmFsc2UsICd0ZXh0YXJlYScpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZXZlbnVlVmlldzsiLCJpbXBvcnQgeyBWaWV3LCBWaWV3VGFibGUgfSBmcm9tICcuL3ZpZXdfY2xhc3MuanMnXHJcblxyXG5pbXBvcnQgVGFibGUgZnJvbSBcIi4uL2NvbXBvbmVudHMvdGFibGUvdGFibGUuanNcIjtcclxuaW1wb3J0IEZvcm0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZm9ybS9mb3JtLmpzXCI7XHJcblxyXG5pbXBvcnQgeyBTZXJ2aWNlcywgRnVuZExvb2t1cFRhYmxlIH0gZnJvbSAnLi4vbW9kZWxzLyc7XHJcbmltcG9ydCB7IHVuZm9ybWF0Q3VycmVuY3kgfSBmcm9tIFwiLi4vdXRpbHMvY29tbW9uX3V0aWxzLmpzXCI7XHJcbmltcG9ydCB7IEVNUExPWUVFX1RZUEVTIH0gZnJvbSAnLi4vY29uc3RhbnRzL2J1ZGdldF9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgR29sZEJvb2sgZnJvbSAnLi4vbW9kZWxzL2dvbGRfYm9vay5qcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgUGVyc29ubmVsVmlldyBleHRlbmRzIFZpZXcge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGZpc2NhbF95ZWFyKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLnBhZ2Vfc3RhdGUgPSAncGVyc29ubmVsJztcclxuICAgICAgICB0aGlzLnByb21wdCA9IGBcclxuICAgICAgICAgICAgVGhpcyB0YWJsZSBkaXNwbGF5cyB0aGUgbnVtYmVyIG9mIEZURXMgaW4gZWFjaCBqb2IgY29kZSBmb3IgaW4geW91ciBkZXBhcnRtZW50J3MgXHJcbiAgICAgICAgICAgIGN1cnJlbnQgKGFtZW5kZWQpIEZZMjUgYnVkZ2V0LiBUbyBtYWtlIGVkaXRzIHRvIHRoZSBudW1iZXIgb2YgcG9zaXRpb25zLCBjbGljayB0aGVcclxuICAgICAgICAgICAgXCJFZGl0XCIgYnV0dG9uIG9uIHRoZSByb3cgeW91IHdvdWxkIGxpa2UgdG8gZWRpdC4gVGhlIFwiVG90YWwgQ29zdFwiIGNvbHVtbiBhbmQgdGhlIFxyXG4gICAgICAgICAgICBzdW1tYXJ5IHNpZGViYXIgd2lsbCBhbHNvIHVwZGF0ZSB0byByZWZsZWN0IGFueSBlZGl0cy5gO1xyXG4gICAgICAgIHRoaXMuc3VidGl0bGUgPSAnUGVyc29ubmVsJztcclxuICAgICAgICB0aGlzLnRhYmxlID0gbmV3IFBlcnNvbm5lbFRhYmxlKGZpc2NhbF95ZWFyKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbmNsYXNzIFBlcnNvbm5lbFRhYmxlIGV4dGVuZHMgVmlld1RhYmxlIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihmaXNjYWxfeWVhcikge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5maXNjYWxfeWVhciA9IGZpc2NhbF95ZWFyO1xyXG4gICAgICAgIC8vIGFkZCBhZGRpdGlvbmFsIHBlcnNvbm5lbCBjb2x1bW5zIHRvIHRoZSB0YWJsZVxyXG4gICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5jb25jYXQoW1xyXG4gICAgICAgICAgICB7IHRpdGxlOiAnSm9iIFRpdGxlJywgY2xhc3NOYW1lOiAnam9iLW5hbWUnIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdKb2IgQ29kZScsIGNsYXNzTmFtZTogJ2pvYi1jb2RlJyB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnRW1wbG95ZWUgVHlwZScsIGNsYXNzTmFtZTogJ2VtcGxveWVlLXR5cGUnfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ1NlcnZpY2UnLCBjbGFzc05hbWU6ICdzZXJ2aWNlJyB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiBgRlkke3RoaXMuZmlzY2FsX3llYXJ9IFJlcXVlc3RlZCBGVEVgLCBjbGFzc05hbWU6ICdiYXNlbGluZS1mdGVzJyB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiBgRlkke3RoaXMuZmlzY2FsX3llYXJ9IFByb2plY3RlZCBBdmVyYWdlIFNhbGFyeS9XYWdlYCwgY2xhc3NOYW1lOiAnYXZnLXNhbGFyeScsIGlzQ29zdDogdHJ1ZSB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnVG90YWwgU2FsL1dhZyAmIEJlbiBSZXF1ZXN0JywgY2xhc3NOYW1lOiAndG90YWwtYmFzZWxpbmUnLCBpc0Nvc3Q6IHRydWUgfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0RlcGFydG1lbnRhbCBSZXF1ZXN0IE5vdGVzJywgY2xhc3NOYW1lOiAnbm90ZXMnfSxcclxuICAgICAgICAgICAgLy8gaGlkZGVuIGNvbHVtbnNcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0ZyaW5nZSBCZW5lZml0cyBSYXRlJywgY2xhc3NOYW1lOiAnZnJpbmdlJywgaGlkZTogdHJ1ZSB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnR2VuZXJhbCBJbmNyZWFzZSBSYXRlJywgY2xhc3NOYW1lOiAnZ2VuZXJhbC1pbmNyZWFzZS1yYXRlJywgaGlkZTogdHJ1ZX0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdTdGVwL01lcml0IEluY3JlYXNlIFJhdGUnLCBjbGFzc05hbWU6ICdtZXJpdC1pbmNyZWFzZS1yYXRlJywgaGlkZTogdHJ1ZX0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6IGBBdmVyYWdlIFNhbGFyeS9XYWdlIGFzIG9mIDkvMS8yMCR7dGhpcy5maXNjYWxfeWVhci0yfWAsIGNsYXNzTmFtZTogJ2N1cnJlbnQtc2FsYXJ5JywgaXNDb3N0OiB0cnVlLCBoaWRlOiB0cnVlfVxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICB0aGlzLm5vRGF0YU1lc3NhZ2UgPSAnTm8gcGVyc29ubmVsIGV4cGVuZGl0dXJlcyBmb3IgdGhpcyBmdW5kLidcclxuICAgICAgICB0aGlzLmFkZEJ1dHRvblRleHQgPSAnQWRkIG5ldyBqb2InIDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhY3Rpb24gb24gcm93IGVkaXQgY2xpY2s6IG1ha2UgY2VsbHMgZWRpdGFibGVcclxuICAgIGFjdGlvbk9uRWRpdCgpIHsgXHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVUZXh0Ym94KCdiYXNlbGluZS1mdGVzJyk7XHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVTZXJ2aWNlRHJvcGRvd24oU2VydmljZXMubGlzdCgpKTtcclxuICAgICAgICBUYWJsZS5DZWxsLmNyZWF0ZVRleHRib3goJ25vdGVzJywgZmFsc2UsICd0ZXh0YXJlYScpO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVRhYmxlKCl7XHJcbiAgICAgICAgLy8gY2FsY3VsYXRlIGZvciBlYWNoIHJvd1xyXG4gICAgICAgIGxldCByb3dzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RyJyk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCByb3dzLmxlbmd0aDsgaSsrKXtcclxuICAgICAgICAgICAgLy8gZmV0Y2ggdmFsdWVzIGZvciBjYWxjdWxhdGlvbnNcclxuICAgICAgICAgICAgbGV0IGF2Z19zYWxhcnkgPSBUYWJsZS5DZWxsLmdldFZhbHVlKHJvd3NbaV0sICdhdmctc2FsYXJ5Jyk7XHJcbiAgICAgICAgICAgIGxldCBmcmluZ2UgPSBwYXJzZUZsb2F0KFRhYmxlLkNlbGwuZ2V0VGV4dChyb3dzW2ldLCAnZnJpbmdlJykpO1xyXG4gICAgICAgICAgICBsZXQgYmFzZWxpbmVfZnRlcyA9IFRhYmxlLkNlbGwuZ2V0VGV4dChyb3dzW2ldLCAnYmFzZWxpbmUtZnRlcycpO1xyXG5cclxuICAgICAgICAgICAgLy8gY2FsY3VhdGUgI0ZURXMgeCBhdmVyYWdlIHNhbGFyeSArIENPTEEgYWRqdXN0bWVudHMgKyBtZXJpdCBhZGp1c3RtZW50cyArIGZyaW5nZVxyXG4gICAgICAgICAgICBsZXQgdG90YWxfYmFzZWxpbmVfY29zdCA9IGF2Z19zYWxhcnkgKiBiYXNlbGluZV9mdGVzICogKDEgKyBmcmluZ2UpO1xyXG5cclxuICAgICAgICAgICAgLy8gdXBkYXRlIHRvdGFsIGNvbHVtblxyXG4gICAgICAgICAgICBUYWJsZS5DZWxsLnVwZGF0ZVZhbHVlKHJvd3NbaV0sICd0b3RhbC1iYXNlbGluZScsIHRvdGFsX2Jhc2VsaW5lX2Nvc3QpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2F2ZSB0aGUgdGFibGUgYWZ0ZXIgYWxsIHVwZGF0ZXMgYXJlIGRvbmVcclxuICAgICAgICBUYWJsZS5zYXZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkQ3VzdG9tUXVlc3Rpb25zKCl7XHJcbiAgICAgICAgLy8gZm9ybSBxdWVzdGlvbnMgdG8gYWRkIGEgbmV3IGpvYlxyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuc2hvcnRUZXh0KCdKb2IgQ29kZTonLCAnam9iLWNvZGUnLCB0cnVlKTsgXHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5zaG9ydFRleHQoJ0pvYiBUaXRsZTonLCAnam9iLW5hbWUnLCB0cnVlKTsgXHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5kcm9wZG93bignRW1wbG95ZWUgVHlwZTonLCAnZW1wbG95ZWUtdHlwZScsIEVNUExPWUVFX1RZUEVTLCB0cnVlKSxcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLmRyb3Bkb3duKCdBcHByb3ByaWF0aW9uOicsICdhcHByb3AtbmFtZScsIEZ1bmRMb29rdXBUYWJsZS5nZXRBcHByb3BzKCdBZGQgbmV3JyksIHRydWUpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuZHJvcGRvd24oJ0Nvc3QgQ2VudGVyOicsICdjYy1uYW1lJywgRnVuZExvb2t1cFRhYmxlLmdldENvc3RDZW50ZXJzKCdBZGQgbmV3JyksIHRydWUpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuZHJvcGRvd24oJ1NlcnZpY2UnLCAnc2VydmljZScsIFNlcnZpY2VzLmxpc3QoKSwgdHJ1ZSk7XHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5zaG9ydFRleHQoJ051bWJlciBvZiBGVEVzIHJlcXVlc3RlZDonLCAnYmFzZWxpbmUtZnRlcycsIHRydWUpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuc2hvcnRUZXh0KGBQcm9qZWN0ZWQgYXZlcmFnZSBzYWxhcnkgSU4gRklTQ0FMIFlFQVIgJHt0aGlzLmZpc2NhbF95ZWFyfTpgLCAnYXZnLXNhbGFyeScsIHRydWUpO1xyXG4gICAgICAgIC8vRm9ybS5OZXdGaWVsZC5zaG9ydFRleHQoYEV4cGVjdGVkIGZyaW5nZSByYXRlIChhcyBhIHBlcmNlbnRhZ2UpYCwgJ2ZyaW5nZScsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZE1vZGFsVmFsaWRhdGlvbigpe1xyXG5cclxuICAgICAgICBzdXBlci5hZGRNb2RhbFZhbGlkYXRpb24oKTtcclxuXHJcbiAgICAgICAgLy8gbG9jayB0aGUgam9iIGRlc2NyaXB0aW9uIFxyXG4gICAgICAgIGNvbnN0IGpvYkRlc2NyaXB0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi1uYW1lJyk7XHJcbiAgICAgICAgam9iRGVzY3JpcHRpb24ucmVhZE9ubHkgPSB0cnVlO1xyXG4gICAgICAgIC8vIGdpdmUgYSBtZXNzYWdlIGlmIGF0dGVtcHQgdG8gZWRpdFxyXG4gICAgICAgIGNvbnN0IG5hbWVWYWxpZGF0aW9uVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItbmFtZS12YWxpZGF0aW9uJyk7XHJcbiAgICAgICAgam9iRGVzY3JpcHRpb24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbmFtZVZhbGlkYXRpb25UZXh0LnRleHRDb250ZW50ID0gJ1RoaXMgZmllbGQgaXMgbm90IGVkaXRhYmxlIGFuZCB3aWxsIGF1dG8tZmlsbCBmcm9tIHRoZSBqb2IgY29kZSBhYm92ZS4nO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIGhpZGUgbWVzc2FnZSBvbiBibHVyXHJcbiAgICAgICAgam9iRGVzY3JpcHRpb24uYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBuYW1lVmFsaWRhdGlvblRleHQudGV4dENvbnRlbnQgPSAnJztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gY29uZmlybSB0aGF0IGVudGVyZWQgam9iIGNvZGUgaXMgaW4gdGhlIGdvbGQgYm9va1xyXG4gICAgICAgIGNvbnN0IGpvYkNvZGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItY29kZScpO1xyXG4gICAgICAgIGpvYkNvZGVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvLyBnZXQgZW50ZXJlZCBqb2IgY29kZVxyXG4gICAgICAgICAgICBjb25zdCBqb2JDb2RlID0gam9iQ29kZUlucHV0LnZhbHVlO1xyXG4gICAgICAgICAgICAvLyBnZXQgdmFsaWRhdGlvbiB0ZXh0IGVsZW1lbnRcclxuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvblRleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLWNvZGUtdmFsaWRhdGlvbicpO1xyXG4gICAgICAgICAgICBpZiAoIUdvbGRCb29rLmNvZGVFeGlzdHMoam9iQ29kZSkpe1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGpvYiBjb2RlIGRvZXNuJ3QgZXhpc3QsIHNob3cgYW4gZXJyb3IgbWVzc2FnZVxyXG4gICAgICAgICAgICAgICAgdmFsaWRhdGlvblRleHQudGV4dENvbnRlbnQgPSAnVGhpcyBqb2IgY29kZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgY3VycmVudCBHb2xkIEJvb2suIFBsZWFzZSBlbnRlciBhbm90aGVyIGNvZGUuJztcclxuICAgICAgICAgICAgICAgIC8vIGFuZCBjbGVhciBhbnkgcHJldmlvdXMgZW50cnkgaW4gdGhlIGpvYiB0aXRsZSBcclxuICAgICAgICAgICAgICAgIGpvYkRlc2NyaXB0aW9uLnZhbHVlID0gJyc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiBpdCBkb2VzIGV4aXN0LCBjaGFuZ2UgdGhlIGpvYiB0aXRsZSBhY2NvcmRpbmdseVxyXG4gICAgICAgICAgICAgICAgam9iRGVzY3JpcHRpb24udmFsdWUgPSBHb2xkQm9vay5nZXRUaXRsZShqb2JDb2RlKTtcclxuICAgICAgICAgICAgICAgIC8vIGFuZCBjbGVhciBhbnkgZXJyb3IgbWVzc2FnZXNcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRpb25UZXh0LnRleHRDb250ZW50ID0gJyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBlZGl0Q29sdW1ucyhyZXNwb25zZXMpe1xyXG4gICAgICAgIHJlc3BvbnNlcyA9IHN1cGVyLmVkaXRDb2x1bW5zKHJlc3BvbnNlcyk7XHJcbiAgICAgICAgLy8gZWRpdCBpbnB1dHMgZnJvbSBtb2RhbFxyXG4gICAgICAgIHJlc3BvbnNlc1snYXZnLXNhbGFyeSddID0gdW5mb3JtYXRDdXJyZW5jeShyZXNwb25zZXNbJ2F2Zy1zYWxhcnknXSk7XHJcbiAgICAgICAgLy8gdXNlIGdvbGQgYm9vayB0byBsb29rIHVwIGluZm8gYmFzZWQgb24gam9iIGNvZGVcclxuICAgICAgICByZXNwb25zZXNbJ2pvYi1uYW1lJ10gPSBHb2xkQm9vay5nZXRUaXRsZShyZXNwb25zZXNbJ2pvYi1jb2RlJ10pO1xyXG4gICAgICAgIHJlc3BvbnNlc1snZnJpbmdlJ10gPSBHb2xkQm9vay5nZXRGcmluZ2VSYXRlKHJlc3BvbnNlc1snam9iLWNvZGUnXSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlcztcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUGVyc29ubmVsVmlldzsiLCJcclxuXHJcbmltcG9ydCB7IFZpZXcsIFZpZXdUYWJsZSB9IGZyb20gJy4vdmlld19jbGFzcy5qcydcclxuaW1wb3J0IFRhYmxlIGZyb20gJy4uL2NvbXBvbmVudHMvdGFibGUvdGFibGUuanMnO1xyXG5pbXBvcnQgRm9ybSBmcm9tICcuLi9jb21wb25lbnRzL2Zvcm0vZm9ybS5qcyc7XHJcbmltcG9ydCB7IEZ1bmRMb29rdXBUYWJsZSwgU2VydmljZXMgfSBmcm9tICcuLi9tb2RlbHMvJztcclxuaW1wb3J0IHsgdW5mb3JtYXRDdXJyZW5jeSB9IGZyb20gJy4uL3V0aWxzL2NvbW1vbl91dGlscy5qcyc7XHJcbmltcG9ydCB7IE9UX09CSkVDVFMgfSBmcm9tICcuLi9jb25zdGFudHMvJztcclxuXHJcbmV4cG9ydCBjbGFzcyBPdmVydGltZVZpZXcgZXh0ZW5kcyBWaWV3IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihmaXNjYWxfeWVhcikge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5wYWdlX3N0YXRlID0gJ292ZXJ0aW1lJztcclxuICAgICAgICB0aGlzLnByb21wdCA9IGBcclxuICAgICAgICAgICAgUGxlYXNlIHNlZSB5b3VyIGJhc2VsaW5lIG92ZXJ0aW1lIC8gaG9saWRheSBwYXkgLyBzaGlmdCBwcmVtaXVtcyBpbiB0aGUgdGFibGUgYmVsb3cuXHJcbiAgICAgICAgICAgIE1ha2UgYW55IGVkaXRzIGFuZCBjb250aW51ZS5gO1xyXG4gICAgICAgIHRoaXMuc3VidGl0bGUgPSAnT3ZlcnRpbWUgRXN0aW1hdGVzJztcclxuICAgICAgICB0aGlzLnRhYmxlID0gbmV3IE92ZXJ0aW1lVGFibGUoZmlzY2FsX3llYXIpO1xyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBPdmVydGltZVRhYmxlIGV4dGVuZHMgVmlld1RhYmxlIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihmaXNjYWxfeWVhcikge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIC8vIGFkZCBhZGRpdGlvbmFsIE9UIGNvbHVtbnMgdG8gdGhlIHRhYmxlXHJcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLmNvbmNhdChbXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdTZXJ2aWNlJywgY2xhc3NOYW1lOiAnc2VydmljZScgfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ1JlY3VycmluZyBvciBPbmUtVGltZScsIGNsYXNzTmFtZTogJ3JlY3VycmluZyd9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnRGVwYXJ0bWVudGFsIFJlcXVlc3QgT1QvU1AvSG9sJywgY2xhc3NOYW1lOiAnT1QtcGF5JywgaXNDb3N0OiB0cnVlIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6IGBGWSR7ZmlzY2FsX3llYXJ9IFRvdGFsIE9UL1NQL0hvbCArIEZJQ0EgUmVxdWVzdGAsIGNsYXNzTmFtZSA6ICd0b3RhbCcsIGlzQ29zdDogdHJ1ZX0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdPYmplY3QgTmFtZScsIGNsYXNzTmFtZTogJ29iamVjdC1uYW1lJ30sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdEZXBhcnRtZW50YWwgUmVxdWVzdCBOb3RlcycsIGNsYXNzTmFtZTogJ25vdGVzJ30sXHJcbiAgICAgICAgICAgIC8vIGhpZGRlbiBjb2x1bW5zXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdGSUNBIFJhdGUnLCBjbGFzc05hbWU6ICdmaWNhJywgaGlkZTogdHJ1ZX0sXHJcbiAgICAgICAgXSk7XHJcblxyXG4gICAgICAgIHRoaXMubm9EYXRhTWVzc2FnZSA9ICdObyBvdmVydGltZSBleHBlbmRpdHVyZXMgZm9yIHRoaXMgZnVuZC4nXHJcbiAgICAgICAgdGhpcy5hZGRCdXR0b25UZXh0ID0gJ0FkZCBuZXcgY29zdCBjZW50ZXInIDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhY3Rpb24gb24gcm93IGVkaXQgY2xpY2s6IG1ha2UgY2VsbHMgZWRpdGFibGVcclxuICAgIGFjdGlvbk9uRWRpdCgpIHsgXHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVUZXh0Ym94KCdPVC1wYXknLCB0cnVlKTtcclxuICAgICAgICBUYWJsZS5DZWxsLmNyZWF0ZVNlcnZpY2VEcm9wZG93bihTZXJ2aWNlcy5saXN0KCkpO1xyXG4gICAgICAgIFRhYmxlLkNlbGwuY3JlYXRlRHJvcGRvd24oJ3JlY3VycmluZycsIFsnT25lLVRpbWUnLCAnUmVjdXJyaW5nJ10pO1xyXG4gICAgICAgIFRhYmxlLkNlbGwuY3JlYXRlRHJvcGRvd24oJ29iamVjdC1uYW1lJywgT1RfT0JKRUNUUyk7XHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVUZXh0Ym94KCdub3RlcycpO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVRhYmxlKCl7XHJcblxyXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBmb3IgZWFjaCByb3dcclxuICAgICAgICBsZXQgcm93cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0cicpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcm93cy5sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgICAgIC8vIGZldGNoIHZhbHVlcyBmb3IgY2FsY3VsYXRpb25zXHJcbiAgICAgICAgICAgIGxldCBPVF9zYWxhcnkgPSBUYWJsZS5DZWxsLmdldFZhbHVlKHJvd3NbaV0sICdPVC1wYXknKTtcclxuICAgICAgICAgICAgbGV0IGZpY2FfcmF0ZSA9IFRhYmxlLkNlbGwuZ2V0VGV4dChyb3dzW2ldLCAnZmljYScpO1xyXG5cclxuICAgICAgICAgICAgLy8gYWRkIHNhbGFyeSBhbmQgd2FnZXMgYW5kIGZyaW5nZSBiZW5lZml0cyAoRklDQSlcclxuICAgICAgICAgICAgbGV0IHJvd190b3RhbCA9IE9UX3NhbGFyeSAqICgxICsgcGFyc2VGbG9hdChmaWNhX3JhdGUpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHVwZGF0ZSB0b3RhbFxyXG4gICAgICAgICAgICBUYWJsZS5DZWxsLnVwZGF0ZVZhbHVlKHJvd3NbaV0sICd0b3RhbCcsIHJvd190b3RhbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTYXZlIHRoZSB0YWJsZSBhZnRlciBhbGwgdXBkYXRlcyBhcmUgZG9uZVxyXG4gICAgICAgIFRhYmxlLnNhdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRDdXN0b21RdWVzdGlvbnMoKXtcclxuICAgICAgICAvLyBmb3JtIHF1ZXN0aW9ucyB0byBhZGQgYSBuZXcgam9iXHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5kcm9wZG93bignQXBwcm9wcmlhdGlvbjonLCAnYXBwcm9wLW5hbWUnLCBGdW5kTG9va3VwVGFibGUuZ2V0QXBwcm9wcygnQWRkIG5ldycpLCB0cnVlKTtcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLmRyb3Bkb3duKCdDb3N0IENlbnRlcjonLCAnY2MtbmFtZScsIEZ1bmRMb29rdXBUYWJsZS5nZXRDb3N0Q2VudGVycygnQWRkIG5ldycpLCB0cnVlKTtcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLmRyb3Bkb3duKCdPYmplY3QgKHNhbGFyeSBvciB3YWdlKTonLCAnb2JqZWN0LW5hbWUnLCBPVF9PQkpFQ1RTLCB0cnVlKTsgXHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5kcm9wZG93bignU2VydmljZScsICdzZXJ2aWNlJywgU2VydmljZXMubGlzdCgpLCB0cnVlKTtcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLmRyb3Bkb3duKCdSZWN1cnJpbmcgb3IgT25lLVRpbWUnLCAncmVjdXJyaW5nJywgWydSZWN1cnJpbmcnLCAnT25lLVRpbWUnXSwgdHJ1ZSk7XHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5zaG9ydFRleHQoJ092ZXJ0aW1lIGFtb3VudCByZXF1ZXN0ZWQ6JywgJ09ULXBheScsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGVkaXRDb2x1bW5zKHJlc3BvbnNlcyl7XHJcbiAgICAgICAgcmVzcG9uc2VzID0gc3VwZXIuZWRpdENvbHVtbnMocmVzcG9uc2VzKTtcclxuICAgICAgICAvLyBlZGl0IGlucHV0cyBmcm9tIG1vZGFsXHJcbiAgICAgICAgcmVzcG9uc2VzWydPVC1wYXknXSA9IHVuZm9ybWF0Q3VycmVuY3kocmVzcG9uc2VzWydPVC1wYXknXSk7XHJcbiAgICAgICAgcmVzcG9uc2VzWydmaWNhJ10gPSAwLjA3NjU7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlcztcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgT3ZlcnRpbWVWaWV3OyIsImltcG9ydCB7IFZpZXcsIFZpZXdUYWJsZSB9IGZyb20gJy4vdmlld19jbGFzcy5qcydcclxuaW1wb3J0IEZvcm0gZnJvbSAnLi4vY29tcG9uZW50cy9mb3JtL2Zvcm0uanMnO1xyXG5pbXBvcnQgVGFibGUgZnJvbSAnLi4vY29tcG9uZW50cy90YWJsZS90YWJsZS5qcyc7XHJcbmltcG9ydCB7IEZ1bmRMb29rdXBUYWJsZSwgU2VydmljZXMgfSBmcm9tICcuLi9tb2RlbHMvJztcclxuaW1wb3J0IHsgdW5mb3JtYXRDdXJyZW5jeSB9IGZyb20gJy4uL3V0aWxzL2NvbW1vbl91dGlscy5qcyc7XHJcbmltcG9ydCB7IE9CSl9DQVRFR09SSUVTIH0gZnJvbSAnLi4vY29uc3RhbnRzLyc7XHJcblxyXG5leHBvcnQgY2xhc3MgTm9uUGVyc29ubmVsVmlldyBleHRlbmRzIFZpZXcge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGZpc2NhbF95ZWFyKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLnBhZ2Vfc3RhdGUgPSAnbm9ucGVyc29ubmVsJztcclxuICAgICAgICB0aGlzLnByb21wdCA9IGBSZXZpZXcgYW5kIGVkaXQgbm9uLXBlcnNvbm5lbCBsaW5lIGl0ZW1zLiBUaGUgQ1BBIG51bWJlcnMgYXJlIHRoZSBcclxuICAgICAgICAgICAgQ29udHJhY3QgYW5kIFByb2N1cmVtZW50IEFjY291bnQgbnVtYmVycy4gQ2xpY2sgb24gdGhlICdkZXRhaWwnIGxpbmsgZm9yIGEgQ1BBIFxyXG4gICAgICAgICAgICB0byBzZWUgdGhlIGNvbnRyYWN0IGRldGFpbHMuIFNvbWUgbGluZSBpdGVtcyB3b24ndCBoYXZlIGEgQ1BBIG51bWJlci5gO1xyXG4gICAgICAgIHRoaXMuc3VidGl0bGUgPSAnTm9uLVBlcnNvbm5lbCc7XHJcbiAgICAgICAgdGhpcy50YWJsZSA9IG5ldyBOb25QZXJzb25uZWxUYWJsZShmaXNjYWxfeWVhcik7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIE5vblBlcnNvbm5lbFRhYmxlIGV4dGVuZHMgVmlld1RhYmxlIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihmaXNjYWxfeWVhcikge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIC8vIGFkZCBhZGRpdGlvbmFsIHBlcnNvbm5lbCBjb2x1bW5zIHRvIHRoZSB0YWJsZVxyXG4gICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5jb25jYXQoW1xyXG4gICAgICAgICAgICB7IHRpdGxlOiBgRlkke2Zpc2NhbF95ZWFyfSBEZXBhcnRtZW50YWwgUmVxdWVzdCBUb3RhbGAsIGNsYXNzTmFtZTogJ3JlcXVlc3QnLCBpc0Nvc3Q6IHRydWUgfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ1NlcnZpY2UnLCBjbGFzc05hbWUgOiAnc2VydmljZScgfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ1JlY3VycmluZyBvciBPbmUtVGltZScsIGNsYXNzTmFtZTogJ3JlY3VycmluZyd9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnVmVuZG9yIE5hbWUnLCBjbGFzc05hbWU6ICd2ZW5kb3InfSxcclxuICAgICAgICAgICAgeyB0aXRsZSA6ICdDUEEgIycsIGNsYXNzTmFtZSA6ICdjcGEnfSxcclxuICAgICAgICAgICAgLy8gaGlkZGVuIGNvbHVtbnNcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0VuZCBEYXRlJywgY2xhc3NOYW1lOiAnY29udHJhY3QtZW5kJywgaGlkZTogdHJ1ZX0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdCUEEvQ1BBIEFtb3VudCBSZW1haW5pbmcnLCBjbGFzc05hbWU6ICdyZW1haW5pbmcnLCBpc0Nvc3Q6IHRydWUgLCBoaWRlOiB0cnVlfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ09iamVjdCBOYW1lJywgY2xhc3NOYW1lOiAnb2JqZWN0LW5hbWUnLCBoaWRlOiB0cnVlfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ09iamVjdCcsIGNsYXNzTmFtZTogJ29iamVjdCcsIGhpZGU6IHRydWV9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnT2JqZWN0IENhdGVnb3J5JywgY2xhc3NOYW1lOiAnb2JqZWN0LWNhdGVnb3J5JywgaGlkZTogdHJ1ZX0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdCUEEvQ1BBIERlc2NyaXB0aW9uJywgY2xhc3NOYW1lOiAnY3BhLWRlc2NyaXB0aW9uJywgaGlkZTogdHJ1ZX0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdEZXBhcnRtZW50YWwgUmVxdWVzdCBOb3RlcycsIGNsYXNzTmFtZTogJ25vdGVzJ30sIFxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICB0aGlzLm5vRGF0YU1lc3NhZ2UgPSAnTm8gbm9uLXBlcnNvbm5lbCBleHBlbmRpdHVyZXMgZm9yIHRoaXMgZnVuZC4nXHJcbiAgICAgICAgdGhpcy5hZGRCdXR0b25UZXh0ID0gJ0FkZCBuZXcgbm9uLXBlcnNvbm5lbCBpdGVtJyA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYWN0aW9uIG9uIHJvdyBlZGl0IGNsaWNrOiBtYWtlIGNlbGxzIGVkaXRhYmxlXHJcbiAgICBhY3Rpb25PbkVkaXQoKSB7IFxyXG4gICAgICAgIFRhYmxlLkNlbGwuY3JlYXRlVGV4dGJveCgncmVxdWVzdCcsIHRydWUpO1xyXG4gICAgICAgIFRhYmxlLkNlbGwuY3JlYXRlU2VydmljZURyb3Bkb3duKCk7XHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVEcm9wZG93bigncmVjdXJyaW5nJywgWydPbmUtVGltZScsICdSZWN1cnJpbmcnXSk7XHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVUZXh0Ym94KCdub3RlcycpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEN1c3RvbVF1ZXN0aW9ucygpe1xyXG4gICAgICAgIC8vIGZvcm0gcXVlc3Rpb25zIHRvIGFkZCBhIG5ldyByb3dcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLmRyb3Bkb3duKCdBcHByb3ByaWF0aW9uOicsICdhcHByb3AtbmFtZScsIEZ1bmRMb29rdXBUYWJsZS5nZXRBcHByb3BzKCdBZGQgbmV3JyksIHRydWUpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuZHJvcGRvd24oJ0Nvc3QgQ2VudGVyOicsICdjYy1uYW1lJywgRnVuZExvb2t1cFRhYmxlLmdldENvc3RDZW50ZXJzKCdBZGQgbmV3JyksIHRydWUpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuZHJvcGRvd24oJ09iamVjdCBDYXRlZ29yeTonLCAnb2JqZWN0LWNhdGVnb3J5JywgT0JKX0NBVEVHT1JJRVMubGlzdCwgdHJ1ZSk7XHJcbiAgICAgICAgLy8gVE9ETzogbWF5YmUgZ2l2ZSBkcm9wZG93biBiYXNlZCBvbiBzZWxlY3RlZCBvYmogY2F0ZWdvcnlcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLnNob3J0VGV4dCgnT2JqZWN0IE51bWJlciAoaWYga25vd24pOicsICdvYmplY3QnLCBmYWxzZSk7XHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5kcm9wZG93bignU2VydmljZScsICdzZXJ2aWNlJywgU2VydmljZXMubGlzdCgpLCB0cnVlKTtcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLmxvbmdUZXh0KCdEZXNjcmliZSB5b3VyIG5ldyByZXF1ZXN0OicsICdjcGEtZGVzY3JpcHRpb24nLCB0cnVlKTtcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLmRyb3Bkb3duKCdSZWN1cnJpbmcgb3IgT25lLVRpbWUnLCAncmVjdXJyaW5nJywgWydSZWN1cnJpbmcnLCAnT25lLVRpbWUnXSwgdHJ1ZSk7IFxyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuc2hvcnRUZXh0KCdBbW91bnQgcmVxdWVzdGVkOicsICdyZXF1ZXN0JywgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZWRpdENvbHVtbnMocmVzcG9uc2VzKXtcclxuICAgICAgICByZXNwb25zZXMgPSBzdXBlci5lZGl0Q29sdW1ucyhyZXNwb25zZXMpO1xyXG4gICAgICAgIHJlc3BvbnNlc1snYXZnLXNhbGFyeSddID0gdW5mb3JtYXRDdXJyZW5jeShyZXNwb25zZXNbJ2F2Zy1zYWxhcnknXSk7XHJcbiAgICAgICAgcmVzcG9uc2VzWydmcmluZ2UnXSA9IHBhcnNlRmxvYXQocmVzcG9uc2VzWydmcmluZ2UnXSkgLyAxMDA7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlcztcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTm9uUGVyc29ubmVsVmlldzsiLCJcclxuaW1wb3J0IHsgVmlldywgVmlld1RhYmxlIH0gZnJvbSAnLi92aWV3X2NsYXNzLmpzJ1xyXG5pbXBvcnQgVGFibGUgZnJvbSBcIi4uL2NvbXBvbmVudHMvdGFibGUvdGFibGUuanNcIjtcclxuaW1wb3J0IEZvcm0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZm9ybS9mb3JtLmpzXCI7XHJcbmltcG9ydCBGdW5kTG9va3VwVGFibGUgZnJvbSAnLi4vbW9kZWxzL2Z1bmRfbG9va3VwX3RhYmxlLmpzJztcclxuaW1wb3J0IHsgRklTQ0FMX1lFQVIgfSBmcm9tICcuLi9jb25zdGFudHMvJztcclxuaW1wb3J0IEFjY291bnRTdHJpbmcgZnJvbSAnLi4vbW9kZWxzL2FjY291bnRfc3RyaW5nLmpzJztcclxuXHJcblxyXG5jb25zdCBkcm9wZG93bk9wdGlvbnMgPSBbJ04vQScsICdPbmUtVGltZScsICdSZWN1cnJpbmcnXVxyXG5cclxuLy8gc2V0IHVwIHBhZ2UgYW5kIGluaXRpYWxpemUgYWxsIGJ1dHRvbnNcclxuZXhwb3J0IGNsYXNzIEluaXRpYXRpdmVzVmlldyBleHRlbmRzIFZpZXcge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5wYWdlX3N0YXRlID0gJ25ldy1pbml0cyc7XHJcbiAgICAgICAgdGhpcy5wcm9tcHQgPSBgXHJcbiAgICAgICAgICAgIFRoaXMgaXMgdGhlIHBsYWNlIHRvIHByb3Bvc2UgbmV3IGluaXRpYXRpdmVzIGZvciBGWSR7RklTQ0FMX1lFQVJ9LlxyXG4gICAgICAgICAgICBOZXcgaW5pdGlhdGl2ZSBzdWJtaXNzaW9ucyB3aWxsIGNvdW50IGFzIHN1cHBsZW1lbnRhbCBsaW5lIGl0ZW1zIGFuZCB3aWxsIGJlIHRoZSBzdGFydGluZyBcclxuICAgICAgICAgICAgcG9pbnQgZm9yIGEgY29udmVyc2F0aW9uIHdpdGggYm90aCBPQiBhbmQgT0RGUywgd2hvIHdpbGwgaGVscCB3aXRoIHRoZSBkZXRhaWxzLmA7XHJcbiAgICAgICAgdGhpcy5zdWJ0aXRsZSA9ICdOZXcgSW5pdGlhdGl2ZXMnO1xyXG4gICAgICAgIHRoaXMudGFibGUgPSBuZXcgSW5pdGlhdGl2ZXNUYWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHZpc2l0KCkge1xyXG4gICAgICAgIC8vIHJlbW92ZSBmdW5kIHNlbGVjdGlvblxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZnVuZFwiLCAnJyk7XHJcbiAgICAgICAgc3VwZXIudmlzaXQoKTtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcbmNsYXNzIEluaXRpYXRpdmVzVGFibGUgZXh0ZW5kcyBWaWV3VGFibGUge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIC8vIGFkZCBhZGRpdGlvbmFsIGNvbHVtbnMgdG8gdGhlIHRhYmxlXHJcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gW1xyXG4gICAgICAgICAgICB7IHRpdGxlOiAnRnVuZCcsIGNsYXNzTmFtZTogJ2Z1bmQnfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ1N1cHBsZW1lbnRhbCBJbml0aWF0aXZlJywgY2xhc3NOYW1lOiAnaW5pdC1uYW1lJyB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnVG90YWwgSW5pdGlhdGl2ZSBSZXF1ZXN0JywgY2xhc3NOYW1lOiAndG90YWwnLCBpc0Nvc3Q6IHRydWUgfSxcclxuICAgICAgICAgICAgLy8geyB0aXRsZTogJ1BlcnNvbm5lbCBGVEUnLCBjbGFzc05hbWU6ICdmdGVzJ30sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdQZXJzb25uZWwgU2FsYXJ5ICYgQmVuZWZpdHMnLCBjbGFzc05hbWU6ICdwZXJzb25uZWwnLCBpc0Nvc3Q6IHRydWUgfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ05vbi1QZXJzb25uZWwgT3BlcmF0aW5nJywgY2xhc3NOYW1lOiAnbm9ucGVyc29ubmVsJywgaXNDb3N0OiB0cnVlIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdOb24tUGVyc29ubmVsIENhcGl0YWwnLCBjbGFzc05hbWU6ICdub25wZXJzb25uZWwtY2FwaXRhbCcsIGlzQ29zdDogdHJ1ZSB9LFxyXG4gICAgICAgICAgICAvLyB7IHRpdGxlOiAnUmV2ZW51ZScsIGNsYXNzTmFtZTogJ3JldmVudWUnLCBpc0Nvc3Q6IHRydWUgfSxcclxuICAgICAgICAgICAgLy8geyB0aXRsZTogJ1JldmVudWUgVHlwZScsIGNsYXNzTmFtZTogJ3Jldi10eXBlJyB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnRGVzY3JpcHRpb24gJiBKdXN0aWZpY2F0aW9uJywgY2xhc3NOYW1lOiAnbm90ZXMnIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdSZWN1cnJpbmcgb3IgT25lLVRpbWUnLCBjbGFzc05hbWU6ICdyZXYtdHlwZSd9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnRWRpdCcsIGNsYXNzTmFtZTogJ2VkaXQnIH1cclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICB0aGlzLmFkZEJ1dHRvblRleHQgPSAnQWRkIG5ldyBpbml0aWF0aXZlJyA7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkQ3VzdG9tUXVlc3Rpb25zKCl7XHJcblxyXG4gICAgICAgIC8vIGdlbmVyYWwgcXVlc3Rpb25zXHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5zaG9ydFRleHQoJ0luaXRpYXRpdmUgTmFtZTonLCAnaW5pdC1uYW1lJywgdHJ1ZSk7IFxyXG4gICAgICAgIEZvcm0uTmV3RmllbGQubG9uZ1RleHQoJ1doYXQgaXMgdGhlIGJ1c2luZXNzIGNhc2UgZm9yIHRoZSBJbml0aWF0aXZlPycsICdxMScsIHRydWUpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQubG9uZ1RleHQoYFdoeSBpcyB0aGUgaW5pdGlhdGl2ZSBuZWVkZWQ/IFdoYXQgaXMgdGhlIHZhbHVlLWFkZCB0byByZXNpZGVudHM/IFxyXG4gICAgICAgICAgICBXaGF0IGlzIHRoZSBEZXBhcnRtZW504oCZcyBwbGFuIGZvciBpbXBsZW1lbnRpbmcgdGhlIEluaXRpYXRpdmU/YCwgJ3EyJywgdHJ1ZSk7XHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5sb25nVGV4dChgV2h5IGNhbuKAmXQgdGhlIEluaXRpYXRpdmUgYmUgZnVuZGVkIHdpdGggdGhlIERlcGFydG1lbnTigJlzIGJhc2VsaW5lIGJ1ZGdldD9gLCAncTMnLCB0cnVlKTtcclxuXHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5kcm9wZG93bihgSXMgdGhpcyBpbml0aWF0aXZlIG9uZS10aW1lIG9yIHJlY3VycmluZz9gLCBcclxuICAgICAgICAgICAgJ3Jldi10eXBlJywgZHJvcGRvd25PcHRpb25zKTtcclxuXHJcbiAgICAgICAgLy8gQWNjb3VudCBzdHJpbmcgaW5mb1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuZHJvcGRvd24oJ0Z1bmQ6JywgJ2Z1bmQtbmFtZScsIEZ1bmRMb29rdXBUYWJsZS5saXN0RnVuZE5hbWVzKCksIHRydWUpO1xyXG5cclxuICAgICAgICAvLyBOdW1iZXJzXHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5udW1lcmljSW5wdXQoJ1doYXQgaXMgeW91ciBiYWxscGFyayBlc3RpbWF0ZSBvZiBUT1RBTCBBRERJVE9OQUwgZXhwZW5zZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5pdGlhdGl2ZT8nLCBcclxuICAgICAgICAgICAgJ3RvdGFsJywgZmFsc2UpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQubnVtZXJpY0lucHV0KCdFc3RpbWF0ZSBvZiBBRERJVE9OQUwgcGVyc29ubmVsIGNvc3Q/JywgJ3BlcnNvbm5lbCcsIGZhbHNlKTtcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLm51bWVyaWNJbnB1dCgnRXN0aW1hdGUgb2YgQURESVRPTkFMIG5vbnBlcnNvbm5lbCBvcGVyYXRpbmcgY29zdD8nLCAnbm9ucGVyc29ubmVsJywgZmFsc2UpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQubnVtZXJpY0lucHV0KCdFc3RpbWF0ZSBvZiBBRERJVE9OQUwgbm9ucGVyc29ubmVsIGNhcGl0YWwgY29zdHM/JywgJ25vbnBlcnNvbm5lbC1jYXBpdGFsJywgZmFsc2UpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQubnVtZXJpY0lucHV0KCdFc3RpbWF0ZSBvZiBBRERJVE9OQUwgcmV2ZW51ZSAoaWYgYXBwbGljYWJsZSk/JywgJ3JldmVudWUnLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZWRpdENvbHVtbnMocmVzcG9uc2VzKSB7XHJcbiAgICAgICAgcmVzcG9uc2VzWydmdW5kJ10gPSBBY2NvdW50U3RyaW5nLmdldE51bWJlcihyZXNwb25zZXNbJ2Z1bmQtbmFtZSddKTtcclxuICAgICAgICByZXNwb25zZXNbJ25vdGVzJ10gPSBgJHtyZXNwb25zZXNbJ3ExJ119ICR7cmVzcG9uc2VzWydxMiddfSAke3Jlc3BvbnNlc1sncTMnXX1gO1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZXM7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkTW9kYWxWYWxpZGF0aW9uKCkgeyByZXR1cm4gfVxyXG5cclxuICAgIC8vIGFjdGlvbiBvbiByb3cgZWRpdCBjbGljazogbWFrZSBjZWxscyBlZGl0YWJsZVxyXG4gICAgYWN0aW9uT25FZGl0KCkgeyBcclxuICAgICAgICBUYWJsZS5DZWxsLmNyZWF0ZVRleHRib3goJ3RvdGFsJywgdHJ1ZSk7XHJcbiAgICAgICAgLy8gVGFibGUuQ2VsbC5jcmVhdGVUZXh0Ym94KCdyZXZlbnVlJywgdHJ1ZSk7XHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVUZXh0Ym94KCdwZXJzb25uZWwnLCB0cnVlKTtcclxuICAgICAgICBUYWJsZS5DZWxsLmNyZWF0ZVRleHRib3goJ25vbnBlcnNvbm5lbCcsIHRydWUpO1xyXG4gICAgICAgIFRhYmxlLkNlbGwuY3JlYXRlVGV4dGJveCgnaW5pdC1uYW1lJyk7XHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVEcm9wZG93bigncmV2LXR5cGUnLCBkcm9wZG93bk9wdGlvbnMpO1xyXG4gICAgICAgIFRhYmxlLkNlbGwuY3JlYXRlVGV4dGJveCgnbm90ZXMnKTtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEluaXRpYXRpdmVzVmlldzsiLCJpbXBvcnQgQ3VycmVudEZ1bmQgZnJvbSAnLi4vbW9kZWxzL2N1cnJlbnRfZnVuZC5qcyc7XHJcbmltcG9ydCBCYXNlbGluZSBmcm9tICcuLi9tb2RlbHMvYmFzZWxpbmUuanMnO1xyXG5pbXBvcnQgeyBBY2NvcmRpb24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9hY2NvcmRpb24vYWNjb3JkaW9uLmpzXCI7XHJcbmltcG9ydCB7IGZvcm1hdEN1cnJlbmN5IH0gZnJvbSAnLi4vdXRpbHMvY29tbW9uX3V0aWxzLmpzJztcclxuaW1wb3J0IHsgVmlldyB9IGZyb20gXCIuL3ZpZXdfY2xhc3MuanNcIjtcclxuaW1wb3J0IFByb21wdCBmcm9tIFwiLi4vY29tcG9uZW50cy9wcm9tcHQvcHJvbXB0LmpzXCI7XHJcbmltcG9ydCB7IGRvd25sb2FkWExTWCB9IGZyb20gXCIuLi91dGlscy9YTFNYX2hhbmRsZXJzLmpzXCI7XHJcbmltcG9ydCBXZWxjb21lVmlldyBmcm9tICcuLzAwX3dlbGNvbWUuanMnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVUb1RhcmdldCgpe1xyXG4gICAgY29uc3QgYmFzZWxpbmUgPSBuZXcgQmFzZWxpbmU7XHJcbiAgICBpZiAoYmFzZWxpbmUuZ2VuRnVuZFRvdGFsKCkgPD0gQmFzZWxpbmUudGFyZ2V0KCkpe1xyXG4gICAgICAgIFByb21wdC5UZXh0LnVwZGF0ZShgQ29uZ3JhdHMhIFlvdXIgR2VuZXJhbCBGdW5kIGJ1ZGdldCBpcyBiZWxvdyB5b3VyIHRhcmdldCEgXHJcbiAgICAgICAgICAgIEVkaXQgYW55IGxpbmUgaXRlbXMgYmVsb3cgb3IgZG93bmxvYWQgeW91ciBjb21wbGV0ZWQgRXhjZWwuYCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIFByb21wdC5UZXh0LnVwZGF0ZShgWW91ciBHZW5lcmFsIEZ1bmQgYnVkZ2V0IGlzIGFib3ZlIHlvdXIgR0YgdGFyZ2V0IG9mICR7Zm9ybWF0Q3VycmVuY3koQmFzZWxpbmUudGFyZ2V0KCkpfS4gXHJcbiAgICAgICAgICAgIFBsZWFzZSBleHBhbmQgdGhlIHN1bW1hcnkgdGFibGUgYmVsb3cgYW5kIGVkaXQgbGluZSBpdGVtcyB1bnRpbCB5b3UgbWVldCB5b3VyIHRhcmdldC4gXHJcbiAgICAgICAgICAgIFdoZW4geW91IG1lZXQgdGhlIHRhcmdldCwgeW91IHdpbGwgYmUgYWJsZSB0byBkb3dubG9hZCB0aGUgRXhjZWwgc2hlZXQuYCk7XHJcbiAgICAgICAgUHJvbXB0LkJ1dHRvbnMuUmlnaHQuZGlzYWJsZSgpO1xyXG4gICAgfVxyXG4gICAgUHJvbXB0LnNob3coKTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmV0dXJuVG9XZWxjb21lKCkge1xyXG4gICAgY29uc3Qgd2VsY29tZSA9IG5ldyBXZWxjb21lVmlldygpO1xyXG4gICAgY29uc3QgbGVmdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHRpb24xJyk7XHJcbiAgICB3ZWxjb21lLnZpc2l0KCk7XHJcbn07XHJcblxyXG5leHBvcnQgY2xhc3MgU3VtbWFyeVZpZXcgZXh0ZW5kcyBWaWV3IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMucGFnZV9zdGF0ZSA9ICdzdW1tYXJ5JztcclxuICAgICAgICB0aGlzLnN1YnRpdGxlID0gJ1N1bW1hcnknO1xyXG4gICAgICAgIHRoaXMuc2lkZWJhciA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHZpc2l0KCkge1xyXG4gICAgICAgIHN1cGVyLnZpc2l0KCk7XHJcblxyXG4gICAgICAgIC8vIHJlc2V0IGZ1bmRcclxuICAgICAgICBDdXJyZW50RnVuZC5yZXNldCgpO1xyXG5cclxuICAgICAgICAvLyBzaG93IHN1bW1hcnkgYWNjb3JkaW9uXHJcbiAgICAgICAgQWNjb3JkaW9uLmJ1aWxkKCk7XHJcbiAgICAgICAgQWNjb3JkaW9uLnNob3coKTtcclxuXHJcbiAgICAgICAgLy8gYWRkIHByb21wdCBidXR0b25zXHJcbiAgICAgICAgUHJvbXB0LkJ1dHRvbnMuUmlnaHQudXBkYXRlVGV4dCgnRG93bmxvYWQgRXhjZWwnKTtcclxuICAgICAgICBQcm9tcHQuQnV0dG9ucy5MZWZ0LnVwZGF0ZVRleHQoJ1N0YXJ0IG92ZXIgd2l0aCBuZXcgRXhjZWwgdXBsb2FkJyk7XHJcbiAgICAgICAgLy8gYWRkIGJ1dHRvbiBsaW5rc1xyXG4gICAgICAgIFByb21wdC5CdXR0b25zLkxlZnQuYWRkQWN0aW9uKHJldHVyblRvV2VsY29tZSk7XHJcbiAgICAgICAgUHJvbXB0LkJ1dHRvbnMuUmlnaHQuYWRkQWN0aW9uKGRvd25sb2FkWExTWCk7XHJcblxyXG4gICAgICAgIC8vIHVwZGF0ZSBwcm9tcHQgdGV4dCBkZXBlbmRpbmcgb24gdGFyZ2V0IG1hdGNoaW5nXHJcbiAgICAgICAgY29tcGFyZVRvVGFyZ2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYW51cCgpIHtcclxuICAgICAgICAvLyBkZWxldGUgZXZlbnQgbGlzdGVuZXJzXHJcbiAgICAgICAgUHJvbXB0LkJ1dHRvbnMuTGVmdC5yZW1vdmVBY3Rpb24ocmV0dXJuVG9XZWxjb21lKTtcclxuICAgICAgICBQcm9tcHQuQnV0dG9ucy5SaWdodC5yZW1vdmVBY3Rpb24oZG93bmxvYWRYTFNYKTtcclxuICAgICAgICBQcm9tcHQuQnV0dG9ucy5SaWdodC5lbmFibGUoKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU3VtbWFyeVZpZXc7IiwiaW1wb3J0IFdlbGNvbWVWaWV3IGZyb20gJy4vMDBfd2VsY29tZS5qcyc7XHJcbmltcG9ydCBVcGxvYWRWaWV3IGZyb20gJy4vMDFfdXBsb2FkLmpzJztcclxuaW1wb3J0IEZ1bmRWaWV3IGZyb20gJy4vMDJfYmFzZWxpbmVfbGFuZGluZy5qcyc7XHJcbmltcG9ydCBSZXZlbnVlVmlldyBmcm9tICcuLzAzX3JldmVudWUuanMnO1xyXG5pbXBvcnQgUGVyc29ubmVsVmlldyBmcm9tICcuLzA0X3BlcnNvbm5lbC5qcyc7XHJcbmltcG9ydCBPdmVydGltZVZpZXcgZnJvbSAnLi8wNV9vdmVydGltZS5qcyc7XHJcbmltcG9ydCBOb25QZXJzb25uZWxWaWV3IGZyb20gJy4vMDZfbm9ucGVyc29ubmVsLmpzJztcclxuaW1wb3J0IEluaXRpYXRpdmVzVmlldyBmcm9tICcuLzA3X25ld19pbml0aWF0aXZlcy5qcyc7XHJcbmltcG9ydCBTdW1tYXJ5VmlldyBmcm9tICcuLzA4X3N1bW1hcnkuanMnO1xyXG5cclxuaW1wb3J0IHsgRnVuZExvb2t1cFRhYmxlLCBDdXJyZW50RnVuZCwgQ3VycmVudFBhZ2UgfSBmcm9tICcuLi9tb2RlbHMvJztcclxuaW1wb3J0IHsgRklTQ0FMX1lFQVIgfSBmcm9tICcuLi9jb25zdGFudHMvJztcclxuXHJcbi8vIEluaXRpYWxpemUgcGFnZXMgZ2xvYmFsbHkgb25jZVxyXG5jb25zdCBQQUdFUyA9IHtcclxuICAgICd3ZWxjb21lJzogbmV3IFdlbGNvbWVWaWV3KCksXHJcbiAgICAndXBsb2FkJzogbmV3IFVwbG9hZFZpZXcoKSxcclxuICAgICdiYXNlbGluZS1sYW5kaW5nJzogbmV3IEZ1bmRWaWV3KCksXHJcbiAgICAncmV2ZW51ZSc6IG5ldyBSZXZlbnVlVmlldyhGSVNDQUxfWUVBUiksXHJcbiAgICAncGVyc29ubmVsJzogbmV3IFBlcnNvbm5lbFZpZXcoRklTQ0FMX1lFQVIpLFxyXG4gICAgJ292ZXJ0aW1lJzogbmV3IE92ZXJ0aW1lVmlldyhGSVNDQUxfWUVBUiksXHJcbiAgICAnbm9ucGVyc29ubmVsJzogbmV3IE5vblBlcnNvbm5lbFZpZXcoRklTQ0FMX1lFQVIpLFxyXG4gICAgJ25ldy1pbml0cyc6IG5ldyBJbml0aWF0aXZlc1ZpZXcoKSxcclxuICAgICdzdW1tYXJ5JzogbmV3IFN1bW1hcnlWaWV3KClcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFBhZ2UobmV3X3BhZ2Vfa2V5KSB7XHJcbiAgICB2YXIgcGFnZV9zdGF0ZSA9IEN1cnJlbnRQYWdlLmxvYWQoKTtcclxuXHJcbiAgICAvLyBQZXJmb3JtIGNsZWFudXAgZnJvbSB0aGUgY3VycmVudCBwYWdlXHJcbiAgICBpZiAoUEFHRVNbcGFnZV9zdGF0ZV0pIHtcclxuICAgICAgICBQQUdFU1twYWdlX3N0YXRlXS5jbGVhbnVwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFBBR0VTW25ld19wYWdlX2tleV0pIHtcclxuICAgICAgICBQQUdFU1tuZXdfcGFnZV9rZXldLnZpc2l0KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYE5vIHBhZ2UgaW5pdGlhbGl6ZXIgZm91bmQgZm9yIHN0YXRlOiAke25ld19wYWdlX2tleX1gKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG5leHRQYWdlKCkge1xyXG4gICAgdmFyIHBhZ2Vfc3RhdGUgPSBDdXJyZW50UGFnZS5sb2FkKCk7XHJcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoUEFHRVMpO1xyXG4gICAgY29uc3QgY3VycmVudEluZGV4ID0ga2V5cy5pbmRleE9mKHBhZ2Vfc3RhdGUpO1xyXG5cclxuICAgIGNvbnN0IHJldHVyblBhZ2VzID0gWydyZXZlbnVlJywgJ25vbnBlcnNvbm5lbCcsICduZXctaW5pdHMnLCAnb3ZlcnRpbWUnLCAncGVyc29ubmVsJ107XHJcbiAgICBpZiAoIUZ1bmRMb29rdXBUYWJsZS5mdW5kc0xlZnQoKSAmJiByZXR1cm5QYWdlcy5pbmNsdWRlcyhDdXJyZW50UGFnZS5sb2FkKCkpKSB7XHJcbiAgICAgICAgdmlzaXRQYWdlKCdzdW1tYXJ5Jyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChDdXJyZW50UGFnZS5sb2FkKCkgPT0gJ25vbnBlcnNvbm5lbCcpIHtcclxuICAgICAgICBGdW5kTG9va3VwVGFibGUuZWRpdEZ1bmQoQ3VycmVudEZ1bmQubnVtYmVyKCkpO1xyXG4gICAgICAgIGlmIChGdW5kTG9va3VwVGFibGUuZnVuZHNMZWZ0KCkpIHtcclxuICAgICAgICAgICAgdmlzaXRQYWdlKCdiYXNlbGluZS1sYW5kaW5nJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGN1cnJlbnRJbmRleCA+PSAwICYmIGN1cnJlbnRJbmRleCA8IGtleXMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIGNvbnN0IG5leHRLZXkgPSBrZXlzW2N1cnJlbnRJbmRleCArIDFdO1xyXG4gICAgICAgIHZpc2l0UGFnZShuZXh0S2V5KTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxhc3RQYWdlKCkge1xyXG4gICAgdmFyIHBhZ2Vfc3RhdGUgPSBDdXJyZW50UGFnZS5sb2FkKCk7XHJcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoUEFHRVMpO1xyXG4gICAgY29uc3QgY3VycmVudEluZGV4ID0ga2V5cy5pbmRleE9mKHBhZ2Vfc3RhdGUpO1xyXG5cclxuICAgIGlmIChDdXJyZW50UGFnZS5sb2FkKCkgPT0gJ25ldy1pbml0cycpIHtcclxuICAgICAgICB2aXNpdFBhZ2UoJ2Jhc2VsaW5lLWxhbmRpbmcnKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmIChjdXJyZW50SW5kZXggPj0gMSkge1xyXG4gICAgICAgIGNvbnN0IGxhc3RLZXkgPSBrZXlzW2N1cnJlbnRJbmRleCAtIDFdO1xyXG4gICAgICAgIHZpc2l0UGFnZShsYXN0S2V5KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IHZpc2l0UGFnZSB9IGZyb20gXCIuLi92aWV3cy92aWV3X2xvZ2ljXCI7XHJcblxyXG5leHBvcnQgY29uc3QgQ3VycmVudFBhZ2UgPSB7XHJcbiAgICB1cGRhdGUgOiBmdW5jdGlvbihwYWdlKXtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncGFnZV9zdGF0ZScsIHBhZ2UpO1xyXG4gICAgfSxcclxuICAgIGxvYWQgOiBmdW5jdGlvbigpe1xyXG4gICAgICAgIGNvbnN0IHBhZ2VTdGF0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwYWdlX3N0YXRlJyk7XHJcbiAgICAgICAgcmV0dXJuIHBhZ2VTdGF0ZSAhPT0gbnVsbCA/IHBhZ2VTdGF0ZSA6ICd3ZWxjb21lJztcclxuICAgIH0sXHJcbiAgICB2aXNpdCA6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgdmlzaXRQYWdlKHRoaXMubG9hZCgpKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ3VycmVudFBhZ2U7IiwiZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsU3RvcmFnZVNpemUoKSB7XHJcbiAgICBsZXQgdG90YWwgPSAwO1xyXG5cclxuICAgIGZvciAobGV0IGtleSBpbiBsb2NhbFN0b3JhZ2UpIHtcclxuICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgbGV0IGtleVNpemUgPSBrZXkubGVuZ3RoICogMjsgLy8gZWFjaCBjaGFyYWN0ZXIgaXMgMiBieXRlc1xyXG4gICAgICAgICAgICBsZXQgdmFsdWVTaXplID0gbG9jYWxTdG9yYWdlW2tleV0ubGVuZ3RoICogMjsgLy8gZWFjaCBjaGFyYWN0ZXIgaXMgMiBieXRlc1xyXG4gICAgICAgICAgICB0b3RhbCArPSBrZXlTaXplICsgdmFsdWVTaXplO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZm9ybWF0Qnl0ZXModG90YWwpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBmb3JtYXRCeXRlcyhieXRlcywgZGVjaW1hbHMgPSAyKSB7XHJcbiAgICBpZiAoYnl0ZXMgPT09IDApIHJldHVybiAnMCBCeXRlcyc7XHJcbiAgICBjb25zdCBrID0gMTAyNDtcclxuICAgIGNvbnN0IGRtID0gZGVjaW1hbHMgPCAwID8gMCA6IGRlY2ltYWxzO1xyXG4gICAgY29uc3Qgc2l6ZXMgPSBbJ0J5dGVzJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJ107XHJcbiAgICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZyhrKSk7XHJcbiAgICByZXR1cm4gcGFyc2VGbG9hdCgoYnl0ZXMgLyBNYXRoLnBvdyhrLCBpKSkudG9GaXhlZChkbSkpICsgJyAnICsgc2l6ZXNbaV07XHJcbn1cclxuIiwiLy8gSW1wb3J0IHN0eWxlc1xyXG5pbXBvcnQgJy4uL2Nzcy9jb21tb24uY3NzJztcclxuXHJcbi8vIEltcG9ydCBmdW5jdGlvbnNcclxuaW1wb3J0IEN1cnJlbnRQYWdlIGZyb20gJy4vbW9kZWxzL2N1cnJlbnRfcGFnZS5qcyc7XHJcblxyXG5pbXBvcnQgeyBnZXRMb2NhbFN0b3JhZ2VTaXplIH0gZnJvbSAnLi91dGlscy9zdG9yYWdlX3V0aWxzLmpzJztcclxuXHJcbi8vIEluaXRpYWxpemUgb25seSBvbmNlIHdoZW4gdGhlIGRvY3VtZW50IGlzIGZ1bGx5IGxvYWRlZFxyXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xyXG4gICAgQ3VycmVudFBhZ2UudmlzaXQoKTtcclxuICAgIGNvbnNvbGUubG9nKCdMb2NhbCBTdG9yYWdlIFVzZWQ6JywgZ2V0TG9jYWxTdG9yYWdlU2l6ZSgpKTtcclxufSk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///863\n")},404:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:root {\r\n /* colors */\r\n --orange: #FB6523;\r\n --yellow: #D99733;\r\n --blue: #43748E;\r\n --lightBlue: #b7c9e2;\r\n --darkGray: #373A37;\r\n --mediumGray: #D0D0D0;\r\n --lightGray: #F2F2F2;\r\n --white: #FBFDFB;\r\n --black: #212121;\r\n --green: #71BC78;\r\n --citygreen: #004445;\r\n --spiritgreen: #279989;\r\n --palegreen: #9FD5B3;\r\n --verypalegreen: #DFF5E3;\r\n --accentyellow: #feb70d;\r\n --nearblack: #18252a;\r\n /* fonts */\r\n font-family: \'Nunito\', sans-serif;\r\n font-size: 14px;\r\n /* spacing */\r\n --header-height : 105px;\r\n --sidebar-width: 300px;\r\n}\r\n\r\n/* Button styling */\r\n\r\n.btn {\r\n cursor: pointer;\r\n padding: 6px;\r\n margin-top: 5px;\r\n margin-right : 2px;\r\n margin-left: 2px;\r\n border-radius: 10px;\r\n background-color: gray;\r\n color: white; \r\n}\r\n\r\n/* Font application for all text */\r\nbody, button, input, textarea, select, .sidebar, table {\r\n font-family: var(--font-family), sans-serif;\r\n }\r\n\r\n#main-panel {\r\n /* display: flex; */\r\n /* flex-direction: column; */\r\n justify-content: center; /* This will center content vertically */\r\n min-height: calc(100vh - var(--header-height)) ; \r\n /* max-width: calc(100vw - var(--sidebar-width)); */\r\n padding-top: 25px;\r\n padding-bottom: 25px;\r\n margin: 0;\r\n}\r\n\r\n/* Font awesome */\r\n\r\ni.fas.fa-check { \r\n font-size: 1.5em;\r\n color: var(--spiritgreen);\r\n margin-right: 10px;\r\n}\r\n`, "",{"version":3,"sources":["webpack://./src/css/common.css"],"names":[],"mappings":"AAAA;IACI,WAAW;IACX,iBAAiB;IACjB,iBAAiB;IACjB,eAAe;IACf,oBAAoB;IACpB,mBAAmB;IACnB,qBAAqB;IACrB,oBAAoB;IACpB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,oBAAoB;IACpB,sBAAsB;IACtB,oBAAoB;IACpB,wBAAwB;IACxB,uBAAuB;IACvB,oBAAoB;IACpB,UAAU;IACV,iCAAiC;IACjC,eAAe;IACf,YAAY;IACZ,uBAAuB;IACvB,sBAAsB;AAC1B;;AAEA,mBAAmB;;AAEnB;IACI,eAAe;IACf,YAAY;IACZ,eAAe;IACf,kBAAkB;IAClB,gBAAgB;IAChB,mBAAmB;IACnB,sBAAsB;IACtB,YAAY;AAChB;;AAEA,mCAAmC;AACnC;IACI,2CAA2C;EAC7C;;AAEF;IACI,mBAAmB;IACnB,4BAA4B;IAC5B,uBAAuB,EAAE,wCAAwC;IACjE,+CAA+C;IAC/C,oDAAoD;IACpD,iBAAiB;IACjB,oBAAoB;IACpB,SAAS;AACb;;AAEA,iBAAiB;;AAEjB;IACI,gBAAgB;IAChB,yBAAyB;IACzB,kBAAkB;AACtB","sourcesContent":[":root {\\r\\n /* colors */\\r\\n --orange: #FB6523;\\r\\n --yellow: #D99733;\\r\\n --blue: #43748E;\\r\\n --lightBlue: #b7c9e2;\\r\\n --darkGray: #373A37;\\r\\n --mediumGray: #D0D0D0;\\r\\n --lightGray: #F2F2F2;\\r\\n --white: #FBFDFB;\\r\\n --black: #212121;\\r\\n --green: #71BC78;\\r\\n --citygreen: #004445;\\r\\n --spiritgreen: #279989;\\r\\n --palegreen: #9FD5B3;\\r\\n --verypalegreen: #DFF5E3;\\r\\n --accentyellow: #feb70d;\\r\\n --nearblack: #18252a;\\r\\n /* fonts */\\r\\n font-family: \'Nunito\', sans-serif;\\r\\n font-size: 14px;\\r\\n /* spacing */\\r\\n --header-height : 105px;\\r\\n --sidebar-width: 300px;\\r\\n}\\r\\n\\r\\n/* Button styling */\\r\\n\\r\\n.btn {\\r\\n cursor: pointer;\\r\\n padding: 6px;\\r\\n margin-top: 5px;\\r\\n margin-right : 2px;\\r\\n margin-left: 2px;\\r\\n border-radius: 10px;\\r\\n background-color: gray;\\r\\n color: white; \\r\\n}\\r\\n\\r\\n/* Font application for all text */\\r\\nbody, button, input, textarea, select, .sidebar, table {\\r\\n font-family: var(--font-family), sans-serif;\\r\\n }\\r\\n\\r\\n#main-panel {\\r\\n /* display: flex; */\\r\\n /* flex-direction: column; */\\r\\n justify-content: center; /* This will center content vertically */\\r\\n min-height: calc(100vh - var(--header-height)) ; \\r\\n /* max-width: calc(100vw - var(--sidebar-width)); */\\r\\n padding-top: 25px;\\r\\n padding-bottom: 25px;\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\n/* Font awesome */\\r\\n\\r\\ni.fas.fa-check { \\r\\n font-size: 1.5em;\\r\\n color: var(--spiritgreen);\\r\\n margin-right: 10px;\\r\\n}\\r\\n"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA0LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvY3NzL2NvbW1vbi5jc3M/ZjdjYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgOnJvb3Qge1xyXG4gICAgLyogY29sb3JzICovXHJcbiAgICAtLW9yYW5nZTogI0ZCNjUyMztcclxuICAgIC0teWVsbG93OiAjRDk5NzMzO1xyXG4gICAgLS1ibHVlOiAjNDM3NDhFO1xyXG4gICAgLS1saWdodEJsdWU6ICNiN2M5ZTI7XHJcbiAgICAtLWRhcmtHcmF5OiAjMzczQTM3O1xyXG4gICAgLS1tZWRpdW1HcmF5OiAjRDBEMEQwO1xyXG4gICAgLS1saWdodEdyYXk6ICNGMkYyRjI7XHJcbiAgICAtLXdoaXRlOiAjRkJGREZCO1xyXG4gICAgLS1ibGFjazogIzIxMjEyMTtcclxuICAgIC0tZ3JlZW46ICM3MUJDNzg7XHJcbiAgICAtLWNpdHlncmVlbjogIzAwNDQ0NTtcclxuICAgIC0tc3Bpcml0Z3JlZW46ICMyNzk5ODk7XHJcbiAgICAtLXBhbGVncmVlbjogIzlGRDVCMztcclxuICAgIC0tdmVyeXBhbGVncmVlbjogI0RGRjVFMztcclxuICAgIC0tYWNjZW50eWVsbG93OiAjZmViNzBkO1xyXG4gICAgLS1uZWFyYmxhY2s6ICMxODI1MmE7XHJcbiAgICAvKiBmb250cyAqL1xyXG4gICAgZm9udC1mYW1pbHk6ICdOdW5pdG8nLCBzYW5zLXNlcmlmO1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgLyogc3BhY2luZyAqL1xyXG4gICAgLS1oZWFkZXItaGVpZ2h0IDogMTA1cHg7XHJcbiAgICAtLXNpZGViYXItd2lkdGg6IDMwMHB4O1xyXG59XHJcblxyXG4vKiBCdXR0b24gc3R5bGluZyAqL1xyXG5cclxuLmJ0biB7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICBwYWRkaW5nOiA2cHg7XHJcbiAgICBtYXJnaW4tdG9wOiA1cHg7XHJcbiAgICBtYXJnaW4tcmlnaHQgOiAycHg7XHJcbiAgICBtYXJnaW4tbGVmdDogMnB4O1xyXG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IGdyYXk7XHJcbiAgICBjb2xvcjogd2hpdGU7IFxyXG59XHJcblxyXG4vKiBGb250IGFwcGxpY2F0aW9uIGZvciBhbGwgdGV4dCAgKi9cclxuYm9keSwgYnV0dG9uLCBpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgLnNpZGViYXIsIHRhYmxlIHtcclxuICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWZhbWlseSksIHNhbnMtc2VyaWY7XHJcbiAgfVxyXG5cclxuI21haW4tcGFuZWwge1xyXG4gICAgLyogZGlzcGxheTogZmxleDsgKi9cclxuICAgIC8qIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47ICovXHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgLyogVGhpcyB3aWxsIGNlbnRlciBjb250ZW50IHZlcnRpY2FsbHkgKi9cclxuICAgIG1pbi1oZWlnaHQ6IGNhbGMoMTAwdmggLSB2YXIoLS1oZWFkZXItaGVpZ2h0KSkgOyBcclxuICAgIC8qIG1heC13aWR0aDogY2FsYygxMDB2dyAtIHZhcigtLXNpZGViYXItd2lkdGgpKTsgICovXHJcbiAgICBwYWRkaW5nLXRvcDogMjVweDtcclxuICAgIHBhZGRpbmctYm90dG9tOiAyNXB4O1xyXG4gICAgbWFyZ2luOiAwO1xyXG59XHJcblxyXG4vKiBGb250IGF3ZXNvbWUgKi9cclxuXHJcbmkuZmFzLmZhLWNoZWNrIHsgXHJcbiAgICBmb250LXNpemU6IDEuNWVtO1xyXG4gICAgY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxuICAgIG1hcmdpbi1yaWdodDogMTBweDtcclxufVxyXG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9jc3MvY29tbW9uLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLFdBQVc7SUFDWCxpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixvQkFBb0I7SUFDcEIsbUJBQW1CO0lBQ25CLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsb0JBQW9CO0lBQ3BCLHNCQUFzQjtJQUN0QixvQkFBb0I7SUFDcEIsd0JBQXdCO0lBQ3hCLHVCQUF1QjtJQUN2QixvQkFBb0I7SUFDcEIsVUFBVTtJQUNWLGlDQUFpQztJQUNqQyxlQUFlO0lBQ2YsWUFBWTtJQUNaLHVCQUF1QjtJQUN2QixzQkFBc0I7QUFDMUI7O0FBRUEsbUJBQW1COztBQUVuQjtJQUNJLGVBQWU7SUFDZixZQUFZO0lBQ1osZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLHNCQUFzQjtJQUN0QixZQUFZO0FBQ2hCOztBQUVBLG1DQUFtQztBQUNuQztJQUNJLDJDQUEyQztFQUM3Qzs7QUFFRjtJQUNJLG1CQUFtQjtJQUNuQiw0QkFBNEI7SUFDNUIsdUJBQXVCLEVBQUUsd0NBQXdDO0lBQ2pFLCtDQUErQztJQUMvQyxvREFBb0Q7SUFDcEQsaUJBQWlCO0lBQ2pCLG9CQUFvQjtJQUNwQixTQUFTO0FBQ2I7O0FBRUEsaUJBQWlCOztBQUVqQjtJQUNJLGdCQUFnQjtJQUNoQix5QkFBeUI7SUFDekIsa0JBQWtCO0FBQ3RCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjpyb290IHtcXHJcXG4gICAgLyogY29sb3JzICovXFxyXFxuICAgIC0tb3JhbmdlOiAjRkI2NTIzO1xcclxcbiAgICAtLXllbGxvdzogI0Q5OTczMztcXHJcXG4gICAgLS1ibHVlOiAjNDM3NDhFO1xcclxcbiAgICAtLWxpZ2h0Qmx1ZTogI2I3YzllMjtcXHJcXG4gICAgLS1kYXJrR3JheTogIzM3M0EzNztcXHJcXG4gICAgLS1tZWRpdW1HcmF5OiAjRDBEMEQwO1xcclxcbiAgICAtLWxpZ2h0R3JheTogI0YyRjJGMjtcXHJcXG4gICAgLS13aGl0ZTogI0ZCRkRGQjtcXHJcXG4gICAgLS1ibGFjazogIzIxMjEyMTtcXHJcXG4gICAgLS1ncmVlbjogIzcxQkM3ODtcXHJcXG4gICAgLS1jaXR5Z3JlZW46ICMwMDQ0NDU7XFxyXFxuICAgIC0tc3Bpcml0Z3JlZW46ICMyNzk5ODk7XFxyXFxuICAgIC0tcGFsZWdyZWVuOiAjOUZENUIzO1xcclxcbiAgICAtLXZlcnlwYWxlZ3JlZW46ICNERkY1RTM7XFxyXFxuICAgIC0tYWNjZW50eWVsbG93OiAjZmViNzBkO1xcclxcbiAgICAtLW5lYXJibGFjazogIzE4MjUyYTtcXHJcXG4gICAgLyogZm9udHMgKi9cXHJcXG4gICAgZm9udC1mYW1pbHk6ICdOdW5pdG8nLCBzYW5zLXNlcmlmO1xcclxcbiAgICBmb250LXNpemU6IDE0cHg7XFxyXFxuICAgIC8qIHNwYWNpbmcgKi9cXHJcXG4gICAgLS1oZWFkZXItaGVpZ2h0IDogMTA1cHg7XFxyXFxuICAgIC0tc2lkZWJhci13aWR0aDogMzAwcHg7XFxyXFxufVxcclxcblxcclxcbi8qIEJ1dHRvbiBzdHlsaW5nICovXFxyXFxuXFxyXFxuLmJ0biB7XFxyXFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gICAgcGFkZGluZzogNnB4O1xcclxcbiAgICBtYXJnaW4tdG9wOiA1cHg7XFxyXFxuICAgIG1hcmdpbi1yaWdodCA6IDJweDtcXHJcXG4gICAgbWFyZ2luLWxlZnQ6IDJweDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTtcXHJcXG4gICAgY29sb3I6IHdoaXRlOyBcXHJcXG59XFxyXFxuXFxyXFxuLyogRm9udCBhcHBsaWNhdGlvbiBmb3IgYWxsIHRleHQgICovXFxyXFxuYm9keSwgYnV0dG9uLCBpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgLnNpZGViYXIsIHRhYmxlIHtcXHJcXG4gICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtZmFtaWx5KSwgc2Fucy1zZXJpZjtcXHJcXG4gIH1cXHJcXG5cXHJcXG4jbWFpbi1wYW5lbCB7XFxyXFxuICAgIC8qIGRpc3BsYXk6IGZsZXg7ICovXFxyXFxuICAgIC8qIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47ICovXFxyXFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOyAvKiBUaGlzIHdpbGwgY2VudGVyIGNvbnRlbnQgdmVydGljYWxseSAqL1xcclxcbiAgICBtaW4taGVpZ2h0OiBjYWxjKDEwMHZoIC0gdmFyKC0taGVhZGVyLWhlaWdodCkpIDsgXFxyXFxuICAgIC8qIG1heC13aWR0aDogY2FsYygxMDB2dyAtIHZhcigtLXNpZGViYXItd2lkdGgpKTsgICovXFxyXFxuICAgIHBhZGRpbmctdG9wOiAyNXB4O1xcclxcbiAgICBwYWRkaW5nLWJvdHRvbTogMjVweDtcXHJcXG4gICAgbWFyZ2luOiAwO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBGb250IGF3ZXNvbWUgKi9cXHJcXG5cXHJcXG5pLmZhcy5mYS1jaGVjayB7IFxcclxcbiAgICBmb250LXNpemU6IDEuNWVtO1xcclxcbiAgICBjb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XFxyXFxufVxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///404\n')},995:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.summary-accordion {\r\n width: 60%;\r\n margin: auto;\r\n}\r\n\r\n.accordion-title {\r\n margin-left: 20%;\r\n font-weight: bold;\r\n /* font-size: 20px; */\r\n padding-bottom: 10px;\r\n padding-left: 15px;\r\n padding-top: 30px;\r\n}\r\n\r\n.accordion-button:active, .accordion-button:not(.collapsed) {\r\n background-color: var(--palegreen);\r\n color: var(--citygreen);\r\n /* font-size: 20px; */\r\n}\r\n\r\n.accordion-table { \r\n width: 100%;\r\n font-size: 1.2em;\r\n /* border-collapse: separate; This is required for rounded corners */\r\n}\r\n\r\n.accordion-table td:last-child {\r\n text-align: right;\r\n padding-right: 15px;\r\n padding-bottom: 5px\r\n}\r\n\r\n.accordion-table tr {\r\n border-bottom: 1px solid black;\r\n border-top: none;\r\n border-right: none;\r\n border-left: none;\r\n}\r\n\r\n.accordion-table tr:last-child {\r\n border-bottom: none;\r\n background-color: var(--mediumGray);\r\n height : 50px;\r\n}\r\n\r\nspan.amount {\r\n font-weight: bold;\r\n position: absolute;\r\n right: 0;\r\n margin-right: 60px;\r\n}\r\n\r\n.accordion-header button {\r\n font-size: 0.8em;\r\n}\r\n\r\n.btn-add-init {\r\n background-color: var(--spiritgreen);\r\n border-color: var(--citygreen);\r\n /* position: absolute; */\r\n right: 0;\r\n /* margin-left: 20px; */\r\n /* margin-right: calc(20vw + 15px); */\r\n margin-top: 15px;\r\n}\r\n\r\n#supp-title {\r\n margin-top: 20px;\r\n}\r\n\r\n.btn-add-init:hover {\r\n background-color: var(--palegreen);\r\n}\r\n.add-init-btn-div{\r\n text-align: center;\r\n}\r\n\r\nspan.top-line-amount {\r\n font-weight: bold;\r\n position: absolute;\r\n right: 0;\r\n margin-right: calc(20vw + 20px);\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/accordion/accordion.css"],"names":[],"mappings":"AAAA;IACI,UAAU;IACV,YAAY;AAChB;;AAEA;IACI,gBAAgB;IAChB,iBAAiB;IACjB,qBAAqB;IACrB,oBAAoB;IACpB,kBAAkB;IAClB,iBAAiB;AACrB;;AAEA;IACI,kCAAkC;IAClC,uBAAuB;IACvB,qBAAqB;AACzB;;AAEA;IACI,WAAW;IACX,gBAAgB;IAChB,oEAAoE;AACxE;;AAEA;IACI,iBAAiB;IACjB,mBAAmB;IACnB;AACJ;;AAEA;IACI,8BAA8B;IAC9B,gBAAgB;IAChB,kBAAkB;IAClB,iBAAiB;AACrB;;AAEA;IACI,mBAAmB;IACnB,mCAAmC;IACnC,aAAa;AACjB;;AAEA;IACI,iBAAiB;IACjB,kBAAkB;IAClB,QAAQ;IACR,kBAAkB;AACtB;;AAEA;IACI,gBAAgB;AACpB;;AAEA;IACI,oCAAoC;IACpC,8BAA8B;IAC9B,wBAAwB;IACxB,QAAQ;IACR,uBAAuB;IACvB,qCAAqC;IACrC,gBAAgB;AACpB;;AAEA;GACG,gBAAgB;AACnB;;AAEA;IACI,kCAAkC;AACtC;AACA;IACI,kBAAkB;AACtB;;AAEA;IACI,iBAAiB;IACjB,kBAAkB;IAClB,QAAQ;IACR,+BAA+B;AACnC","sourcesContent":[".summary-accordion {\\r\\n width: 60%;\\r\\n margin: auto;\\r\\n}\\r\\n\\r\\n.accordion-title {\\r\\n margin-left: 20%;\\r\\n font-weight: bold;\\r\\n /* font-size: 20px; */\\r\\n padding-bottom: 10px;\\r\\n padding-left: 15px;\\r\\n padding-top: 30px;\\r\\n}\\r\\n\\r\\n.accordion-button:active, .accordion-button:not(.collapsed) {\\r\\n background-color: var(--palegreen);\\r\\n color: var(--citygreen);\\r\\n /* font-size: 20px; */\\r\\n}\\r\\n\\r\\n.accordion-table { \\r\\n width: 100%;\\r\\n font-size: 1.2em;\\r\\n /* border-collapse: separate; This is required for rounded corners */\\r\\n}\\r\\n\\r\\n.accordion-table td:last-child {\\r\\n text-align: right;\\r\\n padding-right: 15px;\\r\\n padding-bottom: 5px\\r\\n}\\r\\n\\r\\n.accordion-table tr {\\r\\n border-bottom: 1px solid black;\\r\\n border-top: none;\\r\\n border-right: none;\\r\\n border-left: none;\\r\\n}\\r\\n\\r\\n.accordion-table tr:last-child {\\r\\n border-bottom: none;\\r\\n background-color: var(--mediumGray);\\r\\n height : 50px;\\r\\n}\\r\\n\\r\\nspan.amount {\\r\\n font-weight: bold;\\r\\n position: absolute;\\r\\n right: 0;\\r\\n margin-right: 60px;\\r\\n}\\r\\n\\r\\n.accordion-header button {\\r\\n font-size: 0.8em;\\r\\n}\\r\\n\\r\\n.btn-add-init {\\r\\n background-color: var(--spiritgreen);\\r\\n border-color: var(--citygreen);\\r\\n /* position: absolute; */\\r\\n right: 0;\\r\\n /* margin-left: 20px; */\\r\\n /* margin-right: calc(20vw + 15px); */\\r\\n margin-top: 15px;\\r\\n}\\r\\n\\r\\n#supp-title {\\r\\n margin-top: 20px;\\r\\n}\\r\\n\\r\\n.btn-add-init:hover {\\r\\n background-color: var(--palegreen);\\r\\n}\\r\\n.add-init-btn-div{\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\nspan.top-line-amount {\\r\\n font-weight: bold;\\r\\n position: absolute;\\r\\n right: 0;\\r\\n margin-right: calc(20vw + 20px);\\r\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTk1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvYWNjb3JkaW9uL2FjY29yZGlvbi5jc3M/ZjBmOCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLnN1bW1hcnktYWNjb3JkaW9uIHtcclxuICAgIHdpZHRoOiA2MCU7XHJcbiAgICBtYXJnaW46IGF1dG87XHJcbn1cclxuXHJcbi5hY2NvcmRpb24tdGl0bGUge1xyXG4gICAgbWFyZ2luLWxlZnQ6IDIwJTtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgLyogZm9udC1zaXplOiAyMHB4OyAqL1xyXG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDE1cHg7XHJcbiAgICBwYWRkaW5nLXRvcDogMzBweDtcclxufVxyXG5cclxuLmFjY29yZGlvbi1idXR0b246YWN0aXZlLCAuYWNjb3JkaW9uLWJ1dHRvbjpub3QoLmNvbGxhcHNlZCkge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFsZWdyZWVuKTtcclxuICAgIGNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pO1xyXG4gICAgLyogZm9udC1zaXplOiAyMHB4OyAqL1xyXG59XHJcblxyXG4uYWNjb3JkaW9uLXRhYmxlIHsgXHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGZvbnQtc2l6ZTogMS4yZW07XHJcbiAgICAvKiBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlOyBUaGlzIGlzIHJlcXVpcmVkIGZvciByb3VuZGVkIGNvcm5lcnMgKi9cclxufVxyXG5cclxuLmFjY29yZGlvbi10YWJsZSB0ZDpsYXN0LWNoaWxkIHtcclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG4gICAgcGFkZGluZy1yaWdodDogMTVweDtcclxuICAgIHBhZGRpbmctYm90dG9tOiA1cHhcclxufVxyXG5cclxuLmFjY29yZGlvbi10YWJsZSB0ciB7XHJcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7XHJcbiAgICBib3JkZXItdG9wOiBub25lO1xyXG4gICAgYm9yZGVyLXJpZ2h0OiBub25lO1xyXG4gICAgYm9yZGVyLWxlZnQ6IG5vbmU7XHJcbn1cclxuXHJcbi5hY2NvcmRpb24tdGFibGUgdHI6bGFzdC1jaGlsZCB7XHJcbiAgICBib3JkZXItYm90dG9tOiBub25lO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWVkaXVtR3JheSk7XHJcbiAgICBoZWlnaHQgOiA1MHB4O1xyXG59XHJcblxyXG5zcGFuLmFtb3VudCB7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHJpZ2h0OiAwO1xyXG4gICAgbWFyZ2luLXJpZ2h0OiA2MHB4O1xyXG59XHJcblxyXG4uYWNjb3JkaW9uLWhlYWRlciBidXR0b24ge1xyXG4gICAgZm9udC1zaXplOiAwLjhlbTtcclxufVxyXG5cclxuLmJ0bi1hZGQtaW5pdCB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XHJcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWNpdHlncmVlbik7XHJcbiAgICAvKiBwb3NpdGlvbjogYWJzb2x1dGU7ICovXHJcbiAgICByaWdodDogMDtcclxuICAgIC8qIG1hcmdpbi1sZWZ0OiAyMHB4OyAqL1xyXG4gICAgLyogbWFyZ2luLXJpZ2h0OiBjYWxjKDIwdncgKyAxNXB4KTsgKi9cclxuICAgIG1hcmdpbi10b3A6IDE1cHg7XHJcbn1cclxuXHJcbiNzdXBwLXRpdGxlIHtcclxuICAgbWFyZ2luLXRvcDogMjBweDtcclxufVxyXG5cclxuLmJ0bi1hZGQtaW5pdDpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYWxlZ3JlZW4pO1xyXG59XHJcbi5hZGQtaW5pdC1idG4tZGl2e1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG59XHJcblxyXG5zcGFuLnRvcC1saW5lLWFtb3VudCB7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHJpZ2h0OiAwO1xyXG4gICAgbWFyZ2luLXJpZ2h0OiBjYWxjKDIwdncgKyAyMHB4KTtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvYWNjb3JkaW9uL2FjY29yZGlvbi5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxVQUFVO0lBQ1YsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixpQkFBaUI7SUFDakIscUJBQXFCO0lBQ3JCLG9CQUFvQjtJQUNwQixrQkFBa0I7SUFDbEIsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksa0NBQWtDO0lBQ2xDLHVCQUF1QjtJQUN2QixxQkFBcUI7QUFDekI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLG9FQUFvRTtBQUN4RTs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixtQkFBbUI7SUFDbkI7QUFDSjs7QUFFQTtJQUNJLDhCQUE4QjtJQUM5QixnQkFBZ0I7SUFDaEIsa0JBQWtCO0lBQ2xCLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLG1CQUFtQjtJQUNuQixtQ0FBbUM7SUFDbkMsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsUUFBUTtJQUNSLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLG9DQUFvQztJQUNwQyw4QkFBOEI7SUFDOUIsd0JBQXdCO0lBQ3hCLFFBQVE7SUFDUix1QkFBdUI7SUFDdkIscUNBQXFDO0lBQ3JDLGdCQUFnQjtBQUNwQjs7QUFFQTtHQUNHLGdCQUFnQjtBQUNuQjs7QUFFQTtJQUNJLGtDQUFrQztBQUN0QztBQUNBO0lBQ0ksa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsK0JBQStCO0FBQ25DXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5zdW1tYXJ5LWFjY29yZGlvbiB7XFxyXFxuICAgIHdpZHRoOiA2MCU7XFxyXFxuICAgIG1hcmdpbjogYXV0bztcXHJcXG59XFxyXFxuXFxyXFxuLmFjY29yZGlvbi10aXRsZSB7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiAyMCU7XFxyXFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbiAgICAvKiBmb250LXNpemU6IDIwcHg7ICovXFxyXFxuICAgIHBhZGRpbmctYm90dG9tOiAxMHB4O1xcclxcbiAgICBwYWRkaW5nLWxlZnQ6IDE1cHg7XFxyXFxuICAgIHBhZGRpbmctdG9wOiAzMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uYWNjb3JkaW9uLWJ1dHRvbjphY3RpdmUsIC5hY2NvcmRpb24tYnV0dG9uOm5vdCguY29sbGFwc2VkKSB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhbGVncmVlbik7XFxyXFxuICAgIGNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pO1xcclxcbiAgICAvKiBmb250LXNpemU6IDIwcHg7ICovXFxyXFxufVxcclxcblxcclxcbi5hY2NvcmRpb24tdGFibGUgeyBcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIGZvbnQtc2l6ZTogMS4yZW07XFxyXFxuICAgIC8qIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7IFRoaXMgaXMgcmVxdWlyZWQgZm9yIHJvdW5kZWQgY29ybmVycyAqL1xcclxcbn1cXHJcXG5cXHJcXG4uYWNjb3JkaW9uLXRhYmxlIHRkOmxhc3QtY2hpbGQge1xcclxcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcXHJcXG4gICAgcGFkZGluZy1yaWdodDogMTVweDtcXHJcXG4gICAgcGFkZGluZy1ib3R0b206IDVweFxcclxcbn1cXHJcXG5cXHJcXG4uYWNjb3JkaW9uLXRhYmxlIHRyIHtcXHJcXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO1xcclxcbiAgICBib3JkZXItdG9wOiBub25lO1xcclxcbiAgICBib3JkZXItcmlnaHQ6IG5vbmU7XFxyXFxuICAgIGJvcmRlci1sZWZ0OiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uYWNjb3JkaW9uLXRhYmxlIHRyOmxhc3QtY2hpbGQge1xcclxcbiAgICBib3JkZXItYm90dG9tOiBub25lO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1tZWRpdW1HcmF5KTtcXHJcXG4gICAgaGVpZ2h0IDogNTBweDtcXHJcXG59XFxyXFxuXFxyXFxuc3Bhbi5hbW91bnQge1xcclxcbiAgICBmb250LXdlaWdodDogYm9sZDtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICByaWdodDogMDtcXHJcXG4gICAgbWFyZ2luLXJpZ2h0OiA2MHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uYWNjb3JkaW9uLWhlYWRlciBidXR0b24ge1xcclxcbiAgICBmb250LXNpemU6IDAuOGVtO1xcclxcbn1cXHJcXG5cXHJcXG4uYnRuLWFkZC1pbml0IHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xcclxcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWNpdHlncmVlbik7XFxyXFxuICAgIC8qIHBvc2l0aW9uOiBhYnNvbHV0ZTsgKi9cXHJcXG4gICAgcmlnaHQ6IDA7XFxyXFxuICAgIC8qIG1hcmdpbi1sZWZ0OiAyMHB4OyAqL1xcclxcbiAgICAvKiBtYXJnaW4tcmlnaHQ6IGNhbGMoMjB2dyArIDE1cHgpOyAqL1xcclxcbiAgICBtYXJnaW4tdG9wOiAxNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4jc3VwcC10aXRsZSB7XFxyXFxuICAgbWFyZ2luLXRvcDogMjBweDtcXHJcXG59XFxyXFxuXFxyXFxuLmJ0bi1hZGQtaW5pdDpob3ZlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhbGVncmVlbik7XFxyXFxufVxcclxcbi5hZGQtaW5pdC1idG4tZGl2e1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbnNwYW4udG9wLWxpbmUtYW1vdW50IHtcXHJcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgcmlnaHQ6IDA7XFxyXFxuICAgIG1hcmdpbi1yaWdodDogY2FsYygyMHZ3ICsgMjBweCk7XFxyXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///995\n')},9:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `body {\r\n background-color: var(--lightGray);\r\n margin: 0;\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/body/body.css"],"names":[],"mappings":"AAAA;IACI,kCAAkC;IAClC,SAAS;AACb","sourcesContent":["body {\\r\\n background-color: var(--lightGray);\\r\\n margin: 0;\\r\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9ib2R5L2JvZHkuY3NzPzM2ZTAiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYGJvZHkge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHRHcmF5KTtcclxuICAgIG1hcmdpbjogMDtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvYm9keS9ib2R5LmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGtDQUFrQztJQUNsQyxTQUFTO0FBQ2JcIixcInNvdXJjZXNDb250ZW50XCI6W1wiYm9keSB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0R3JheSk7XFxyXFxuICAgIG1hcmdpbjogMDtcXHJcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9\n')},39:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#file-input {\r\n margin-left: 40%;\r\n}\r\n\r\n/* Spinner Styles */\r\n.spinner {\r\n display: inline-block;\r\n width: 150px;\r\n height: 150px;\r\n border: 20px solid rgba(0, 0, 0, 0.1);\r\n border-radius: 50%;\r\n border-top-color: var(--spiritgreen);\r\n animation: spin 1s ease-in-out infinite;\r\n position: fixed; /* Ensures it stays fixed relative to the viewport */\r\n top: 20%; /* Center vertically */\r\n left: 43%; /* Center horizontally */\r\n transform: translate(-50%, -50%); /* Centralize the spinner exactly */\r\n z-index: 9999; /* Ensures it appears in front of other elements */\r\n background-color: rgba(255, 255, 255, 0.8); /* Optional: light background */\r\n padding: 20px; /* Optional: extra padding for better visibility */\r\n }\r\n \r\n @keyframes spin {\r\n 0% {\r\n transform: rotate(0deg);\r\n }\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n }`, "",{"version":3,"sources":["webpack://./src/js/components/file_upload/file_upload.css"],"names":[],"mappings":"AAAA;IACI,gBAAgB;AACpB;;AAEA,mBAAmB;AACnB;IACI,qBAAqB;IACrB,YAAY;IACZ,aAAa;IACb,qCAAqC;IACrC,kBAAkB;IAClB,oCAAoC;IACpC,uCAAuC;IACvC,eAAe,EAAE,oDAAoD;IACrE,QAAQ,EAAE,sBAAsB;IAChC,SAAS,EAAE,wBAAwB;IACnC,gCAAgC,EAAE,mCAAmC;IACrE,aAAa,EAAE,kDAAkD;IACjE,0CAA0C,EAAE,+BAA+B;IAC3E,aAAa,EAAE,kDAAkD;EACnE;;EAEA;IACE;MACE,uBAAuB;IACzB;IACA;MACE,yBAAyB;IAC3B;EACF","sourcesContent":["#file-input {\\r\\n margin-left: 40%;\\r\\n}\\r\\n\\r\\n/* Spinner Styles */\\r\\n.spinner {\\r\\n display: inline-block;\\r\\n width: 150px;\\r\\n height: 150px;\\r\\n border: 20px solid rgba(0, 0, 0, 0.1);\\r\\n border-radius: 50%;\\r\\n border-top-color: var(--spiritgreen);\\r\\n animation: spin 1s ease-in-out infinite;\\r\\n position: fixed; /* Ensures it stays fixed relative to the viewport */\\r\\n top: 20%; /* Center vertically */\\r\\n left: 43%; /* Center horizontally */\\r\\n transform: translate(-50%, -50%); /* Centralize the spinner exactly */\\r\\n z-index: 9999; /* Ensures it appears in front of other elements */\\r\\n background-color: rgba(255, 255, 255, 0.8); /* Optional: light background */\\r\\n padding: 20px; /* Optional: extra padding for better visibility */\\r\\n }\\r\\n \\r\\n @keyframes spin {\\r\\n 0% {\\r\\n transform: rotate(0deg);\\r\\n }\\r\\n 100% {\\r\\n transform: rotate(360deg);\\r\\n }\\r\\n }"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2ZpbGVfdXBsb2FkL2ZpbGVfdXBsb2FkLmNzcz9jNTU4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAjZmlsZS1pbnB1dCB7XHJcbiAgICBtYXJnaW4tbGVmdDogNDAlO1xyXG59XHJcblxyXG4vKiBTcGlubmVyIFN0eWxlcyAqL1xyXG4uc3Bpbm5lciB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICB3aWR0aDogMTUwcHg7XHJcbiAgICBoZWlnaHQ6IDE1MHB4O1xyXG4gICAgYm9yZGVyOiAyMHB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xKTtcclxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcclxuICAgIGJvcmRlci10b3AtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxuICAgIGFuaW1hdGlvbjogc3BpbiAxcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDsgLyogRW5zdXJlcyBpdCBzdGF5cyBmaXhlZCByZWxhdGl2ZSB0byB0aGUgdmlld3BvcnQgKi9cclxuICAgIHRvcDogMjAlOyAvKiBDZW50ZXIgdmVydGljYWxseSAqL1xyXG4gICAgbGVmdDogNDMlOyAvKiBDZW50ZXIgaG9yaXpvbnRhbGx5ICovXHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsgLyogQ2VudHJhbGl6ZSB0aGUgc3Bpbm5lciBleGFjdGx5ICovXHJcbiAgICB6LWluZGV4OiA5OTk5OyAvKiBFbnN1cmVzIGl0IGFwcGVhcnMgaW4gZnJvbnQgb2Ygb3RoZXIgZWxlbWVudHMgKi9cclxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTsgLyogT3B0aW9uYWw6IGxpZ2h0IGJhY2tncm91bmQgKi9cclxuICAgIHBhZGRpbmc6IDIwcHg7IC8qIE9wdGlvbmFsOiBleHRyYSBwYWRkaW5nIGZvciBiZXR0ZXIgdmlzaWJpbGl0eSAqL1xyXG4gIH1cclxuICBcclxuICBAa2V5ZnJhbWVzIHNwaW4ge1xyXG4gICAgMCUge1xyXG4gICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcclxuICAgIH1cclxuICAgIDEwMCUge1xyXG4gICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xyXG4gICAgfVxyXG4gIH1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9qcy9jb21wb25lbnRzL2ZpbGVfdXBsb2FkL2ZpbGVfdXBsb2FkLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGdCQUFnQjtBQUNwQjs7QUFFQSxtQkFBbUI7QUFDbkI7SUFDSSxxQkFBcUI7SUFDckIsWUFBWTtJQUNaLGFBQWE7SUFDYixxQ0FBcUM7SUFDckMsa0JBQWtCO0lBQ2xCLG9DQUFvQztJQUNwQyx1Q0FBdUM7SUFDdkMsZUFBZSxFQUFFLG9EQUFvRDtJQUNyRSxRQUFRLEVBQUUsc0JBQXNCO0lBQ2hDLFNBQVMsRUFBRSx3QkFBd0I7SUFDbkMsZ0NBQWdDLEVBQUUsbUNBQW1DO0lBQ3JFLGFBQWEsRUFBRSxrREFBa0Q7SUFDakUsMENBQTBDLEVBQUUsK0JBQStCO0lBQzNFLGFBQWEsRUFBRSxrREFBa0Q7RUFDbkU7O0VBRUE7SUFDRTtNQUNFLHVCQUF1QjtJQUN6QjtJQUNBO01BQ0UseUJBQXlCO0lBQzNCO0VBQ0ZcIixcInNvdXJjZXNDb250ZW50XCI6W1wiI2ZpbGUtaW5wdXQge1xcclxcbiAgICBtYXJnaW4tbGVmdDogNDAlO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBTcGlubmVyIFN0eWxlcyAqL1xcclxcbi5zcGlubmVyIHtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbiAgICB3aWR0aDogMTUwcHg7XFxyXFxuICAgIGhlaWdodDogMTUwcHg7XFxyXFxuICAgIGJvcmRlcjogMjBweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMSk7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gICAgYm9yZGVyLXRvcC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xcclxcbiAgICBhbmltYXRpb246IHNwaW4gMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XFxyXFxuICAgIHBvc2l0aW9uOiBmaXhlZDsgLyogRW5zdXJlcyBpdCBzdGF5cyBmaXhlZCByZWxhdGl2ZSB0byB0aGUgdmlld3BvcnQgKi9cXHJcXG4gICAgdG9wOiAyMCU7IC8qIENlbnRlciB2ZXJ0aWNhbGx5ICovXFxyXFxuICAgIGxlZnQ6IDQzJTsgLyogQ2VudGVyIGhvcml6b250YWxseSAqL1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsgLyogQ2VudHJhbGl6ZSB0aGUgc3Bpbm5lciBleGFjdGx5ICovXFxyXFxuICAgIHotaW5kZXg6IDk5OTk7IC8qIEVuc3VyZXMgaXQgYXBwZWFycyBpbiBmcm9udCBvZiBvdGhlciBlbGVtZW50cyAqL1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7IC8qIE9wdGlvbmFsOiBsaWdodCBiYWNrZ3JvdW5kICovXFxyXFxuICAgIHBhZGRpbmc6IDIwcHg7IC8qIE9wdGlvbmFsOiBleHRyYSBwYWRkaW5nIGZvciBiZXR0ZXIgdmlzaWJpbGl0eSAqL1xcclxcbiAgfVxcclxcbiAgXFxyXFxuICBAa2V5ZnJhbWVzIHNwaW4ge1xcclxcbiAgICAwJSB7XFxyXFxuICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxyXFxuICAgIH1cXHJcXG4gICAgMTAwJSB7XFxyXFxuICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcXHJcXG4gICAgfVxcclxcbiAgfVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///39\n')},109:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `textarea {height: 100px; width: 100%;}\r\n\r\ntextarea, input, select {\r\n margin-bottom: 5px;\r\n}\r\n\r\n.btn-submit {\r\n margin-top: 20px;\r\n width: 60%;\r\n margin-left: 20%;\r\n background-color: var(--spiritgreen);\r\n}\r\n\r\n#new-form label {\r\n display: block; /* Ensure label is on its own line */\r\n margin-bottom: 0.25em; \r\n}\r\n\r\n#new-form select {\r\n min-width: 300px;\r\n}\r\n\r\n/* Thicker red border when focused */\r\ninput[readonly]:focus {\r\n border: 2px solid red;\r\n outline: none; /* Remove the default outline */\r\n}\r\n\r\n.error-message {\r\n color: red;\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/form/form.css"],"names":[],"mappings":"AAAA,UAAU,aAAa,EAAE,WAAW,CAAC;;AAErC;IACI,kBAAkB;AACtB;;AAEA;IACI,gBAAgB;IAChB,UAAU;IACV,gBAAgB;IAChB,oCAAoC;AACxC;;AAEA;IACI,cAAc,EAAE,oCAAoC;IACpD,qBAAqB;AACzB;;AAEA;IACI,gBAAgB;AACpB;;AAEA,oCAAoC;AACpC;IACI,qBAAqB;IACrB,aAAa,EAAE,+BAA+B;AAClD;;AAEA;IACI,UAAU;AACd","sourcesContent":["textarea {height: 100px; width: 100%;}\\r\\n\\r\\ntextarea, input, select {\\r\\n margin-bottom: 5px;\\r\\n}\\r\\n\\r\\n.btn-submit {\\r\\n margin-top: 20px;\\r\\n width: 60%;\\r\\n margin-left: 20%;\\r\\n background-color: var(--spiritgreen);\\r\\n}\\r\\n\\r\\n#new-form label {\\r\\n display: block; /* Ensure label is on its own line */\\r\\n margin-bottom: 0.25em; \\r\\n}\\r\\n\\r\\n#new-form select {\\r\\n min-width: 300px;\\r\\n}\\r\\n\\r\\n/* Thicker red border when focused */\\r\\ninput[readonly]:focus {\\r\\n border: 2px solid red;\\r\\n outline: none; /* Remove the default outline */\\r\\n}\\r\\n\\r\\n.error-message {\\r\\n color: red;\\r\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA5LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2Zvcm0vZm9ybS5jc3M/ZTM4YSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgdGV4dGFyZWEge2hlaWdodDogMTAwcHg7IHdpZHRoOiAxMDAlO31cclxuXHJcbnRleHRhcmVhLCBpbnB1dCwgc2VsZWN0IHtcclxuICAgIG1hcmdpbi1ib3R0b206IDVweDtcclxufVxyXG5cclxuLmJ0bi1zdWJtaXQge1xyXG4gICAgbWFyZ2luLXRvcDogMjBweDtcclxuICAgIHdpZHRoOiA2MCU7XHJcbiAgICBtYXJnaW4tbGVmdDogMjAlO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xyXG59XHJcblxyXG4jbmV3LWZvcm0gbGFiZWwge1xyXG4gICAgZGlzcGxheTogYmxvY2s7IC8qIEVuc3VyZSBsYWJlbCBpcyBvbiBpdHMgb3duIGxpbmUgKi9cclxuICAgIG1hcmdpbi1ib3R0b206IDAuMjVlbTsgXHJcbn1cclxuXHJcbiNuZXctZm9ybSBzZWxlY3Qge1xyXG4gICAgbWluLXdpZHRoOiAzMDBweDtcclxufVxyXG5cclxuLyogVGhpY2tlciByZWQgYm9yZGVyIHdoZW4gZm9jdXNlZCAqL1xyXG5pbnB1dFtyZWFkb25seV06Zm9jdXMge1xyXG4gICAgYm9yZGVyOiAycHggc29saWQgcmVkO1xyXG4gICAgb3V0bGluZTogbm9uZTsgLyogUmVtb3ZlIHRoZSBkZWZhdWx0IG91dGxpbmUgKi9cclxufVxyXG5cclxuLmVycm9yLW1lc3NhZ2Uge1xyXG4gICAgY29sb3I6IHJlZDtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvZm9ybS9mb3JtLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSxVQUFVLGFBQWEsRUFBRSxXQUFXLENBQUM7O0FBRXJDO0lBQ0ksa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLFVBQVU7SUFDVixnQkFBZ0I7SUFDaEIsb0NBQW9DO0FBQ3hDOztBQUVBO0lBQ0ksY0FBYyxFQUFFLG9DQUFvQztJQUNwRCxxQkFBcUI7QUFDekI7O0FBRUE7SUFDSSxnQkFBZ0I7QUFDcEI7O0FBRUEsb0NBQW9DO0FBQ3BDO0lBQ0kscUJBQXFCO0lBQ3JCLGFBQWEsRUFBRSwrQkFBK0I7QUFDbEQ7O0FBRUE7SUFDSSxVQUFVO0FBQ2RcIixcInNvdXJjZXNDb250ZW50XCI6W1widGV4dGFyZWEge2hlaWdodDogMTAwcHg7IHdpZHRoOiAxMDAlO31cXHJcXG5cXHJcXG50ZXh0YXJlYSwgaW5wdXQsIHNlbGVjdCB7XFxyXFxuICAgIG1hcmdpbi1ib3R0b206IDVweDtcXHJcXG59XFxyXFxuXFxyXFxuLmJ0bi1zdWJtaXQge1xcclxcbiAgICBtYXJnaW4tdG9wOiAyMHB4O1xcclxcbiAgICB3aWR0aDogNjAlO1xcclxcbiAgICBtYXJnaW4tbGVmdDogMjAlO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XFxyXFxufVxcclxcblxcclxcbiNuZXctZm9ybSBsYWJlbCB7XFxyXFxuICAgIGRpc3BsYXk6IGJsb2NrOyAvKiBFbnN1cmUgbGFiZWwgaXMgb24gaXRzIG93biBsaW5lICovXFxyXFxuICAgIG1hcmdpbi1ib3R0b206IDAuMjVlbTsgXFxyXFxufVxcclxcblxcclxcbiNuZXctZm9ybSBzZWxlY3Qge1xcclxcbiAgICBtaW4td2lkdGg6IDMwMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4vKiBUaGlja2VyIHJlZCBib3JkZXIgd2hlbiBmb2N1c2VkICovXFxyXFxuaW5wdXRbcmVhZG9ubHldOmZvY3VzIHtcXHJcXG4gICAgYm9yZGVyOiAycHggc29saWQgcmVkO1xcclxcbiAgICBvdXRsaW5lOiBub25lOyAvKiBSZW1vdmUgdGhlIGRlZmF1bHQgb3V0bGluZSAqL1xcclxcbn1cXHJcXG5cXHJcXG4uZXJyb3ItbWVzc2FnZSB7XFxyXFxuICAgIGNvbG9yOiByZWQ7XFxyXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///109\n')},107:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `\r\nh1 {\r\n text-align: center;\r\n font-size: 30px;\r\n}\r\n\r\nh2 {\r\n color: var(--darkGray);\r\n text-align: center;\r\n font-size: 20px;\r\n}\r\n\r\nheader {\r\n align-items: center;\r\n background-color: white;\r\n padding: 5px;\r\n border-bottom: 1px solid var(--citygreen); \r\n /* border: 1px solid var(--citygreen); */\r\n height: var(--header-height);\r\n /* width: calc(100vw - var(--sidebar-width)); */\r\n padding-left: 20px;\r\n}\r\n\r\n/* Logo styling */\r\n#logo {\r\n height: 50px; /* Or your desired size */\r\n margin-right: 20px; /* Optional: space between logo and title */\r\n margin-bottom: -50px;\r\n margin-top: 10px;\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/header/header.css"],"names":[],"mappings":";AACA;IACI,kBAAkB;IAClB,eAAe;AACnB;;AAEA;IACI,sBAAsB;IACtB,kBAAkB;IAClB,eAAe;AACnB;;AAEA;IACI,mBAAmB;IACnB,uBAAuB;IACvB,YAAY;IACZ,yCAAyC;IACzC,yCAAyC;IACzC,4BAA4B;IAC5B,+CAA+C;IAC/C,kBAAkB;AACtB;;AAEA,iBAAiB;AACjB;IACI,YAAY,EAAE,yBAAyB;IACvC,kBAAkB,EAAE,2CAA2C;IAC/D,oBAAoB;IACpB,gBAAgB;AACpB","sourcesContent":["\\r\\nh1 {\\r\\n text-align: center;\\r\\n font-size: 30px;\\r\\n}\\r\\n\\r\\nh2 {\\r\\n color: var(--darkGray);\\r\\n text-align: center;\\r\\n font-size: 20px;\\r\\n}\\r\\n\\r\\nheader {\\r\\n align-items: center;\\r\\n background-color: white;\\r\\n padding: 5px;\\r\\n border-bottom: 1px solid var(--citygreen); \\r\\n /* border: 1px solid var(--citygreen); */\\r\\n height: var(--header-height);\\r\\n /* width: calc(100vw - var(--sidebar-width)); */\\r\\n padding-left: 20px;\\r\\n}\\r\\n\\r\\n/* Logo styling */\\r\\n#logo {\\r\\n height: 50px; /* Or your desired size */\\r\\n margin-right: 20px; /* Optional: space between logo and title */\\r\\n margin-bottom: -50px;\\r\\n margin-top: 10px;\\r\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA3LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9oZWFkZXIvaGVhZGVyLmNzcz8yZjRjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGBcclxuaDEge1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgZm9udC1zaXplOiAzMHB4O1xyXG59XHJcblxyXG5oMiB7XHJcbiAgICBjb2xvcjogdmFyKC0tZGFya0dyYXkpO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgZm9udC1zaXplOiAyMHB4O1xyXG59XHJcblxyXG5oZWFkZXIge1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG4gICAgcGFkZGluZzogNXB4O1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWNpdHlncmVlbik7IFxyXG4gICAgLyogYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY2l0eWdyZWVuKTsgICovXHJcbiAgICBoZWlnaHQ6IHZhcigtLWhlYWRlci1oZWlnaHQpO1xyXG4gICAgLyogd2lkdGg6IGNhbGMoMTAwdncgLSB2YXIoLS1zaWRlYmFyLXdpZHRoKSk7ICovXHJcbiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7XHJcbn1cclxuXHJcbi8qIExvZ28gc3R5bGluZyAqL1xyXG4jbG9nbyB7XHJcbiAgICBoZWlnaHQ6IDUwcHg7IC8qIE9yIHlvdXIgZGVzaXJlZCBzaXplICovXHJcbiAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7IC8qIE9wdGlvbmFsOiBzcGFjZSBiZXR3ZWVuIGxvZ28gYW5kIHRpdGxlICovXHJcbiAgICBtYXJnaW4tYm90dG9tOiAtNTBweDtcclxuICAgIG1hcmdpbi10b3A6IDEwcHg7XHJcbn1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9qcy9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFDQTtJQUNJLGtCQUFrQjtJQUNsQixlQUFlO0FBQ25COztBQUVBO0lBQ0ksc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixlQUFlO0FBQ25COztBQUVBO0lBQ0ksbUJBQW1CO0lBQ25CLHVCQUF1QjtJQUN2QixZQUFZO0lBQ1oseUNBQXlDO0lBQ3pDLHlDQUF5QztJQUN6Qyw0QkFBNEI7SUFDNUIsK0NBQStDO0lBQy9DLGtCQUFrQjtBQUN0Qjs7QUFFQSxpQkFBaUI7QUFDakI7SUFDSSxZQUFZLEVBQUUseUJBQXlCO0lBQ3ZDLGtCQUFrQixFQUFFLDJDQUEyQztJQUMvRCxvQkFBb0I7SUFDcEIsZ0JBQWdCO0FBQ3BCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIlxcclxcbmgxIHtcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgICBmb250LXNpemU6IDMwcHg7XFxyXFxufVxcclxcblxcclxcbmgyIHtcXHJcXG4gICAgY29sb3I6IHZhcigtLWRhcmtHcmF5KTtcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgICBmb250LXNpemU6IDIwcHg7XFxyXFxufVxcclxcblxcclxcbmhlYWRlciB7XFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcclxcbiAgICBwYWRkaW5nOiA1cHg7XFxyXFxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1jaXR5Z3JlZW4pOyBcXHJcXG4gICAgLyogYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY2l0eWdyZWVuKTsgICovXFxyXFxuICAgIGhlaWdodDogdmFyKC0taGVhZGVyLWhlaWdodCk7XFxyXFxuICAgIC8qIHdpZHRoOiBjYWxjKDEwMHZ3IC0gdmFyKC0tc2lkZWJhci13aWR0aCkpOyAqL1xcclxcbiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7XFxyXFxufVxcclxcblxcclxcbi8qIExvZ28gc3R5bGluZyAqL1xcclxcbiNsb2dvIHtcXHJcXG4gICAgaGVpZ2h0OiA1MHB4OyAvKiBPciB5b3VyIGRlc2lyZWQgc2l6ZSAqL1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7IC8qIE9wdGlvbmFsOiBzcGFjZSBiZXR3ZWVuIGxvZ28gYW5kIHRpdGxlICovXFxyXFxuICAgIG1hcmdpbi1ib3R0b206IC01MHB4O1xcclxcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xcclxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///107\n')},95:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, ``, "",{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTUuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvbW9kYWwvbW9kYWwuY3NzPzZhY2QiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYGAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W10sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIlwiLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///95\n')},595:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#nav-btns {\r\n margin: 20px;\r\n text-align: center;\r\n margin-top: 5px;\r\n margin-bottom: 5px;\r\n /* position: absolute; or \'absolute\' depending on use-case */\r\n /* top: 100px; Distance from the top of the viewport or the closest positioned ancestor */\r\n}\r\n\r\n#btn-next, #btn-last {\r\n background-color: var(--darkGray);\r\n}\r\n\r\n#btn-next:hover, #btn-last:hover {\r\n background-color: var(--yellow);\r\n color: var(--darkGray);\r\n}\r\n\r\n/* Add style for when you cannot click the next button */\r\n#btn-next.disabled, #btn-last.disabled,\r\n#btn-next.disabled:hover, #btn-last.disabled:hover {\r\n background-color: gray;\r\n color: white;\r\n pointer-events: none;\r\n \r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/nav_buttons/nav_buttons.css"],"names":[],"mappings":"AAAA;IACI,YAAY;IACZ,kBAAkB;IAClB,eAAe;IACf,kBAAkB;IAClB,4DAA4D;IAC5D,yFAAyF;AAC7F;;AAEA;IACI,iCAAiC;AACrC;;AAEA;IACI,+BAA+B;IAC/B,sBAAsB;AAC1B;;AAEA,wDAAwD;AACxD;;IAEI,sBAAsB;IACtB,YAAY;IACZ,oBAAoB;;AAExB","sourcesContent":["#nav-btns {\\r\\n margin: 20px;\\r\\n text-align: center;\\r\\n margin-top: 5px;\\r\\n margin-bottom: 5px;\\r\\n /* position: absolute; or \'absolute\' depending on use-case */\\r\\n /* top: 100px; Distance from the top of the viewport or the closest positioned ancestor */\\r\\n}\\r\\n\\r\\n#btn-next, #btn-last {\\r\\n background-color: var(--darkGray);\\r\\n}\\r\\n\\r\\n#btn-next:hover, #btn-last:hover {\\r\\n background-color: var(--yellow);\\r\\n color: var(--darkGray);\\r\\n}\\r\\n\\r\\n/* Add style for when you cannot click the next button */\\r\\n#btn-next.disabled, #btn-last.disabled,\\r\\n#btn-next.disabled:hover, #btn-last.disabled:hover {\\r\\n background-color: gray;\\r\\n color: white;\\r\\n pointer-events: none;\\r\\n \\r\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTk1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuY3NzPzkwNWQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYCNuYXYtYnRucyB7XHJcbiAgICBtYXJnaW46IDIwcHg7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBtYXJnaW4tdG9wOiA1cHg7XHJcbiAgICBtYXJnaW4tYm90dG9tOiA1cHg7XHJcbiAgICAvKiBwb3NpdGlvbjogYWJzb2x1dGU7IG9yICdhYnNvbHV0ZScgZGVwZW5kaW5nIG9uIHVzZS1jYXNlICovXHJcbiAgICAvKiB0b3A6IDEwMHB4OyBEaXN0YW5jZSBmcm9tIHRoZSB0b3Agb2YgdGhlIHZpZXdwb3J0IG9yIHRoZSBjbG9zZXN0IHBvc2l0aW9uZWQgYW5jZXN0b3IgKi9cclxufVxyXG5cclxuI2J0bi1uZXh0LCAjYnRuLWxhc3Qge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGFya0dyYXkpO1xyXG59XHJcblxyXG4jYnRuLW5leHQ6aG92ZXIsICNidG4tbGFzdDpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS15ZWxsb3cpO1xyXG4gICAgY29sb3I6IHZhcigtLWRhcmtHcmF5KTtcclxufVxyXG5cclxuLyogQWRkIHN0eWxlIGZvciB3aGVuIHlvdSBjYW5ub3QgY2xpY2sgdGhlIG5leHQgYnV0dG9uICovXHJcbiNidG4tbmV4dC5kaXNhYmxlZCwgI2J0bi1sYXN0LmRpc2FibGVkLFxyXG4jYnRuLW5leHQuZGlzYWJsZWQ6aG92ZXIsICNidG4tbGFzdC5kaXNhYmxlZDpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBncmF5O1xyXG4gICAgY29sb3I6IHdoaXRlO1xyXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XHJcbiAgICBcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLDREQUE0RDtJQUM1RCx5RkFBeUY7QUFDN0Y7O0FBRUE7SUFDSSxpQ0FBaUM7QUFDckM7O0FBRUE7SUFDSSwrQkFBK0I7SUFDL0Isc0JBQXNCO0FBQzFCOztBQUVBLHdEQUF3RDtBQUN4RDs7SUFFSSxzQkFBc0I7SUFDdEIsWUFBWTtJQUNaLG9CQUFvQjs7QUFFeEJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiI25hdi1idG5zIHtcXHJcXG4gICAgbWFyZ2luOiAyMHB4O1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICAgIG1hcmdpbi10b3A6IDVweDtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogNXB4O1xcclxcbiAgICAvKiBwb3NpdGlvbjogYWJzb2x1dGU7IG9yICdhYnNvbHV0ZScgZGVwZW5kaW5nIG9uIHVzZS1jYXNlICovXFxyXFxuICAgIC8qIHRvcDogMTAwcHg7IERpc3RhbmNlIGZyb20gdGhlIHRvcCBvZiB0aGUgdmlld3BvcnQgb3IgdGhlIGNsb3Nlc3QgcG9zaXRpb25lZCBhbmNlc3RvciAqL1xcclxcbn1cXHJcXG5cXHJcXG4jYnRuLW5leHQsICNidG4tbGFzdCB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRhcmtHcmF5KTtcXHJcXG59XFxyXFxuXFxyXFxuI2J0bi1uZXh0OmhvdmVyLCAjYnRuLWxhc3Q6aG92ZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS15ZWxsb3cpO1xcclxcbiAgICBjb2xvcjogdmFyKC0tZGFya0dyYXkpO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBBZGQgc3R5bGUgZm9yIHdoZW4geW91IGNhbm5vdCBjbGljayB0aGUgbmV4dCBidXR0b24gKi9cXHJcXG4jYnRuLW5leHQuZGlzYWJsZWQsICNidG4tbGFzdC5kaXNhYmxlZCxcXHJcXG4jYnRuLW5leHQuZGlzYWJsZWQ6aG92ZXIsICNidG4tbGFzdC5kaXNhYmxlZDpob3ZlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IGdyYXk7XFxyXFxuICAgIGNvbG9yOiB3aGl0ZTtcXHJcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxyXFxuICAgIFxcclxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///595\n')},225:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `div#prompt-div {\r\n display: none;\r\n width: 80%;\r\n margin: auto;\r\n text-align: center;\r\n}\r\n\r\nh3#prompt {\r\n text-align: center;\r\n font-size : 1.2em;\r\n}\r\n\r\n#option1, #option2 { \r\n font-size: 1.5em;\r\n border-color: var(--citygreen); \r\n border-width: 2px;\r\n background-color: var(--white);\r\n color: var(--citygreen);\r\n}\r\n\r\n#option1:hover, #option2:hover { \r\n background-color: var(--spiritgreen);\r\n color: white;\r\n}\r\n\r\n#option2.clicked, #option1.clicked {\r\n font-weight: bold;\r\n background-color: var(--spiritgreen);\r\n color: white;\r\n border-width: 3;\r\n}\r\n\r\n#option1.disabled, #option2.disabled, #option1.disabled:hover, #option2.disabled:hover {\r\n background-color: lightgray;\r\n color: gray;\r\n pointer-events: none;\r\n border-color: gray;\r\n}\r\n\r\n`, "",{"version":3,"sources":["webpack://./src/js/components/prompt/prompt.css"],"names":[],"mappings":"AAAA;IACI,aAAa;IACb,UAAU;IACV,YAAY;IACZ,kBAAkB;AACtB;;AAEA;IACI,kBAAkB;IAClB,iBAAiB;AACrB;;AAEA;IACI,gBAAgB;IAChB,8BAA8B;IAC9B,iBAAiB;IACjB,8BAA8B;IAC9B,uBAAuB;AAC3B;;AAEA;IACI,oCAAoC;IACpC,YAAY;AAChB;;AAEA;IACI,iBAAiB;IACjB,oCAAoC;IACpC,YAAY;IACZ,eAAe;AACnB;;AAEA;IACI,2BAA2B;IAC3B,WAAW;IACX,oBAAoB;IACpB,kBAAkB;AACtB","sourcesContent":["div#prompt-div {\\r\\n display: none;\\r\\n width: 80%;\\r\\n margin: auto;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\nh3#prompt {\\r\\n text-align: center;\\r\\n font-size : 1.2em;\\r\\n}\\r\\n\\r\\n#option1, #option2 { \\r\\n font-size: 1.5em;\\r\\n border-color: var(--citygreen); \\r\\n border-width: 2px;\\r\\n background-color: var(--white);\\r\\n color: var(--citygreen);\\r\\n}\\r\\n\\r\\n#option1:hover, #option2:hover { \\r\\n background-color: var(--spiritgreen);\\r\\n color: white;\\r\\n}\\r\\n\\r\\n#option2.clicked, #option1.clicked {\\r\\n font-weight: bold;\\r\\n background-color: var(--spiritgreen);\\r\\n color: white;\\r\\n border-width: 3;\\r\\n}\\r\\n\\r\\n#option1.disabled, #option2.disabled, #option1.disabled:hover, #option2.disabled:hover {\\r\\n background-color: lightgray;\\r\\n color: gray;\\r\\n pointer-events: none;\\r\\n border-color: gray;\\r\\n}\\r\\n\\r\\n"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3Byb21wdC9wcm9tcHQuY3NzP2U2OTkiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYGRpdiNwcm9tcHQtZGl2IHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICB3aWR0aDogODAlO1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG59XHJcblxyXG5oMyNwcm9tcHQge1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgZm9udC1zaXplIDogMS4yZW07XHJcbn1cclxuXHJcbiNvcHRpb24xLCAjb3B0aW9uMiB7IFxyXG4gICAgZm9udC1zaXplOiAxLjVlbTtcclxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY2l0eWdyZWVuKTsgXHJcbiAgICBib3JkZXItd2lkdGg6IDJweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXdoaXRlKTtcclxuICAgIGNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pO1xyXG59XHJcblxyXG4jb3B0aW9uMTpob3ZlciwgI29wdGlvbjI6aG92ZXIgeyBcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuI29wdGlvbjIuY2xpY2tlZCwgI29wdGlvbjEuY2xpY2tlZCB7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIGJvcmRlci13aWR0aDogMztcclxufVxyXG5cclxuI29wdGlvbjEuZGlzYWJsZWQsICNvcHRpb24yLmRpc2FibGVkLCAjb3B0aW9uMS5kaXNhYmxlZDpob3ZlciwgI29wdGlvbjIuZGlzYWJsZWQ6aG92ZXIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmF5O1xyXG4gICAgY29sb3I6IGdyYXk7XHJcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcclxuICAgIGJvcmRlci1jb2xvcjogZ3JheTtcclxufVxyXG5cclxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvanMvY29tcG9uZW50cy9wcm9tcHQvcHJvbXB0LmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGFBQWE7SUFDYixVQUFVO0lBQ1YsWUFBWTtJQUNaLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsOEJBQThCO0lBQzlCLGlCQUFpQjtJQUNqQiw4QkFBOEI7SUFDOUIsdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0ksb0NBQW9DO0lBQ3BDLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsb0NBQW9DO0lBQ3BDLFlBQVk7SUFDWixlQUFlO0FBQ25COztBQUVBO0lBQ0ksMkJBQTJCO0lBQzNCLFdBQVc7SUFDWCxvQkFBb0I7SUFDcEIsa0JBQWtCO0FBQ3RCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcImRpdiNwcm9tcHQtZGl2IHtcXHJcXG4gICAgZGlzcGxheTogbm9uZTtcXHJcXG4gICAgd2lkdGg6IDgwJTtcXHJcXG4gICAgbWFyZ2luOiBhdXRvO1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbmgzI3Byb21wdCB7XFxyXFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gICAgZm9udC1zaXplIDogMS4yZW07XFxyXFxufVxcclxcblxcclxcbiNvcHRpb24xLCAjb3B0aW9uMiB7IFxcclxcbiAgICBmb250LXNpemU6IDEuNWVtO1xcclxcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWNpdHlncmVlbik7IFxcclxcbiAgICBib3JkZXItd2lkdGg6IDJweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0td2hpdGUpO1xcclxcbiAgICBjb2xvcjogdmFyKC0tY2l0eWdyZWVuKTtcXHJcXG59XFxyXFxuXFxyXFxuI29wdGlvbjE6aG92ZXIsICNvcHRpb24yOmhvdmVyIHsgXFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcXHJcXG4gICAgY29sb3I6IHdoaXRlO1xcclxcbn1cXHJcXG5cXHJcXG4jb3B0aW9uMi5jbGlja2VkLCAjb3B0aW9uMS5jbGlja2VkIHtcXHJcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcXHJcXG4gICAgY29sb3I6IHdoaXRlO1xcclxcbiAgICBib3JkZXItd2lkdGg6IDM7XFxyXFxufVxcclxcblxcclxcbiNvcHRpb24xLmRpc2FibGVkLCAjb3B0aW9uMi5kaXNhYmxlZCwgI29wdGlvbjEuZGlzYWJsZWQ6aG92ZXIsICNvcHRpb24yLmRpc2FibGVkOmhvdmVyIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmF5O1xcclxcbiAgICBjb2xvcjogZ3JheTtcXHJcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogZ3JheTtcXHJcXG59XFxyXFxuXFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///225\n')},263:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#sidebar-panel {\r\n background-color: lightgrey; \r\n /* min-height: 100vh; Full height of viewport */\r\n }\r\n\r\n#supp-total .stat {\r\n color: var(--yellow);\r\n}\r\n\r\n.stat {\r\n font-weight: bold;\r\n}\r\n\r\n#sidebar-panel {\r\n height: 100%; /* Full height of the viewport */\r\n position: fixed; /* Fixed Sidebar (stay in place on scroll) */\r\n z-index: 1; /* Stay on top */\r\n top: 0; /* Stay at the top */\r\n right: 0; /* Sidebar appears on the left */\r\n background-color: #FFFFFF; /* White background color */\r\n overflow-x: hidden; /* Disable horizontal scroll */\r\n padding: 20px;\r\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); /* Add shadow for some depth */\r\n border-right: 2px solid #DDDDDD; /* Right border */\r\n border-radius: 0px 0px 0px 15px; /* Rounded corners on the left */\r\n /* margin-top: var(--header-height); */\r\n width: var(--sidebar-width);\r\n margin: 0px;\r\n }\r\n \r\n.sidebar a {\r\n padding: 10px 15px;\r\n text-decoration: none;\r\n font-size: 18px;\r\n color: #818181;\r\n display: block;\r\n transition: 0.3s;\r\n}\r\n\r\n#sidebar-title {\r\n color: var(--darkGray);\r\n font-weight: bold;\r\n border-bottom: 1px solid var(--citygreen);\r\n}\r\n\r\nhr {\r\n margin-top: -5px;\r\n margin-bottom: 8px;\r\n}\r\n\r\nh6 {\r\n font-weight: 600;\r\n}\r\n\r\n.section-header {\r\n background-color: var(--mediumGray);\r\n}\r\n\r\n.sidebar-stat-line {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between; /* Distribute space between children */\r\n padding: 2px;\r\n border-bottom: 1px solid #ddd;\r\n}\r\n\r\n.edit-icon, .edit-supp {\r\n color: var(--spiritgreen);\r\n cursor: pointer;\r\n font-size: 16px; /* Adjust the size as needed */\r\n margin-left: 10px;\r\n}\r\n\r\n.edit-icon:hover .edit-supp:hover {\r\n color: var(--citygreen);\r\n}\r\n\r\n.stat-label {\r\n margin-right: auto; /* Push next elements to the right */\r\n}\r\n\r\n.stat {\r\n margin-left: 5px; /* Optional: Add some space between currency and edit icon */\r\n}\r\n\r\n.sidebar-stat-line.fund-total .stat {\r\n margin-right: 05px; /* 25px lines up with lines above (with edit symbol) */\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/sidebar/sidebar.css"],"names":[],"mappings":"AAAA;IACI,2BAA2B;IAC3B,+CAA+C;EACjD;;AAEF;IACI,oBAAoB;AACxB;;AAEA;IACI,iBAAiB;AACrB;;AAEA;IACI,YAAY,EAAE,gCAAgC;IAC9C,eAAe,EAAE,4CAA4C;IAC7D,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,oBAAoB;IAC5B,QAAQ,EAAE,gCAAgC;IAC1C,yBAAyB,EAAE,2BAA2B;IACtD,kBAAkB,EAAE,8BAA8B;IAClD,aAAa;IACb,wCAAwC,EAAE,8BAA8B;IACxE,+BAA+B,EAAE,iBAAiB;IAClD,+BAA+B,EAAE,gCAAgC;IACjE,sCAAsC;IACtC,2BAA2B;IAC3B,WAAW;EACb;;AAEF;IACI,kBAAkB;IAClB,qBAAqB;IACrB,eAAe;IACf,cAAc;IACd,cAAc;IACd,gBAAgB;AACpB;;AAEA;EACE,sBAAsB;EACtB,iBAAiB;EACjB,yCAAyC;AAC3C;;AAEA;EACE,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,mCAAmC;AACrC;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,8BAA8B,EAAE,sCAAsC;EACtE,YAAY;EACZ,6BAA6B;AAC/B;;AAEA;EACE,yBAAyB;EACzB,eAAe;EACf,eAAe,EAAE,8BAA8B;EAC/C,iBAAiB;AACnB;;AAEA;EACE,uBAAuB;AACzB;;AAEA;EACE,kBAAkB,EAAE,oCAAoC;AAC1D;;AAEA;EACE,gBAAgB,EAAE,4DAA4D;AAChF;;AAEA;EACE,kBAAkB,EAAE,sDAAsD;AAC5E","sourcesContent":["#sidebar-panel {\\r\\n background-color: lightgrey; \\r\\n /* min-height: 100vh; Full height of viewport */\\r\\n }\\r\\n\\r\\n#supp-total .stat {\\r\\n color: var(--yellow);\\r\\n}\\r\\n\\r\\n.stat {\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n#sidebar-panel {\\r\\n height: 100%; /* Full height of the viewport */\\r\\n position: fixed; /* Fixed Sidebar (stay in place on scroll) */\\r\\n z-index: 1; /* Stay on top */\\r\\n top: 0; /* Stay at the top */\\r\\n right: 0; /* Sidebar appears on the left */\\r\\n background-color: #FFFFFF; /* White background color */\\r\\n overflow-x: hidden; /* Disable horizontal scroll */\\r\\n padding: 20px;\\r\\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); /* Add shadow for some depth */\\r\\n border-right: 2px solid #DDDDDD; /* Right border */\\r\\n border-radius: 0px 0px 0px 15px; /* Rounded corners on the left */\\r\\n /* margin-top: var(--header-height); */\\r\\n width: var(--sidebar-width);\\r\\n margin: 0px;\\r\\n }\\r\\n \\r\\n.sidebar a {\\r\\n padding: 10px 15px;\\r\\n text-decoration: none;\\r\\n font-size: 18px;\\r\\n color: #818181;\\r\\n display: block;\\r\\n transition: 0.3s;\\r\\n}\\r\\n\\r\\n#sidebar-title {\\r\\n color: var(--darkGray);\\r\\n font-weight: bold;\\r\\n border-bottom: 1px solid var(--citygreen);\\r\\n}\\r\\n\\r\\nhr {\\r\\n margin-top: -5px;\\r\\n margin-bottom: 8px;\\r\\n}\\r\\n\\r\\nh6 {\\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n.section-header {\\r\\n background-color: var(--mediumGray);\\r\\n}\\r\\n\\r\\n.sidebar-stat-line {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between; /* Distribute space between children */\\r\\n padding: 2px;\\r\\n border-bottom: 1px solid #ddd;\\r\\n}\\r\\n\\r\\n.edit-icon, .edit-supp {\\r\\n color: var(--spiritgreen);\\r\\n cursor: pointer;\\r\\n font-size: 16px; /* Adjust the size as needed */\\r\\n margin-left: 10px;\\r\\n}\\r\\n\\r\\n.edit-icon:hover .edit-supp:hover {\\r\\n color: var(--citygreen);\\r\\n}\\r\\n\\r\\n.stat-label {\\r\\n margin-right: auto; /* Push next elements to the right */\\r\\n}\\r\\n\\r\\n.stat {\\r\\n margin-left: 5px; /* Optional: Add some space between currency and edit icon */\\r\\n}\\r\\n\\r\\n.sidebar-stat-line.fund-total .stat {\\r\\n margin-right: 05px; /* 25px lines up with lines above (with edit symbol) */\\r\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3NpZGViYXIvc2lkZWJhci5jc3M/M2IwMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgI3NpZGViYXItcGFuZWwge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmV5OyAgXHJcbiAgICAvKiBtaW4taGVpZ2h0OiAxMDB2aDsgRnVsbCBoZWlnaHQgb2Ygdmlld3BvcnQgKi9cclxuICB9XHJcblxyXG4jc3VwcC10b3RhbCAuc3RhdCB7XHJcbiAgICBjb2xvcjogdmFyKC0teWVsbG93KTtcclxufVxyXG5cclxuLnN0YXQge1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbn1cclxuXHJcbiNzaWRlYmFyLXBhbmVsIHtcclxuICAgIGhlaWdodDogMTAwJTsgLyogRnVsbCBoZWlnaHQgb2YgdGhlIHZpZXdwb3J0ICovXHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7IC8qIEZpeGVkIFNpZGViYXIgKHN0YXkgaW4gcGxhY2Ugb24gc2Nyb2xsKSAqL1xyXG4gICAgei1pbmRleDogMTsgLyogU3RheSBvbiB0b3AgKi9cclxuICAgIHRvcDogMDsgLyogU3RheSBhdCB0aGUgdG9wICovXHJcbiAgICByaWdodDogMDsgLyogU2lkZWJhciBhcHBlYXJzIG9uIHRoZSBsZWZ0ICovXHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOyAvKiBXaGl0ZSBiYWNrZ3JvdW5kIGNvbG9yICovXHJcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47IC8qIERpc2FibGUgaG9yaXpvbnRhbCBzY3JvbGwgKi9cclxuICAgIHBhZGRpbmc6IDIwcHg7XHJcbiAgICBib3gtc2hhZG93OiAwIDJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEpOyAvKiBBZGQgc2hhZG93IGZvciBzb21lIGRlcHRoICovXHJcbiAgICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCAjREREREREOyAvKiBSaWdodCBib3JkZXIgKi9cclxuICAgIGJvcmRlci1yYWRpdXM6IDBweCAwcHggMHB4IDE1cHg7IC8qIFJvdW5kZWQgY29ybmVycyBvbiB0aGUgbGVmdCAqL1xyXG4gICAgLyogbWFyZ2luLXRvcDogdmFyKC0taGVhZGVyLWhlaWdodCk7ICovXHJcbiAgICB3aWR0aDogdmFyKC0tc2lkZWJhci13aWR0aCk7XHJcbiAgICBtYXJnaW46IDBweDtcclxuICB9XHJcbiAgXHJcbi5zaWRlYmFyIGEge1xyXG4gICAgcGFkZGluZzogMTBweCAxNXB4O1xyXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gICAgZm9udC1zaXplOiAxOHB4O1xyXG4gICAgY29sb3I6ICM4MTgxODE7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIHRyYW5zaXRpb246IDAuM3M7XHJcbn1cclxuXHJcbiNzaWRlYmFyLXRpdGxlIHtcclxuICBjb2xvcjogdmFyKC0tZGFya0dyYXkpO1xyXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1jaXR5Z3JlZW4pO1xyXG59XHJcblxyXG5ociB7XHJcbiAgbWFyZ2luLXRvcDogLTVweDtcclxuICBtYXJnaW4tYm90dG9tOiA4cHg7XHJcbn1cclxuXHJcbmg2IHtcclxuICBmb250LXdlaWdodDogNjAwO1xyXG59XHJcblxyXG4uc2VjdGlvbi1oZWFkZXIge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1lZGl1bUdyYXkpO1xyXG59XHJcblxyXG4uc2lkZWJhci1zdGF0LWxpbmUge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IC8qIERpc3RyaWJ1dGUgc3BhY2UgYmV0d2VlbiBjaGlsZHJlbiAqL1xyXG4gIHBhZGRpbmc6IDJweDtcclxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcclxufVxyXG5cclxuLmVkaXQtaWNvbiwgLmVkaXQtc3VwcCB7XHJcbiAgY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgZm9udC1zaXplOiAxNnB4OyAvKiBBZGp1c3QgdGhlIHNpemUgYXMgbmVlZGVkICovXHJcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7XHJcbn1cclxuXHJcbi5lZGl0LWljb246aG92ZXIgLmVkaXQtc3VwcDpob3ZlciB7XHJcbiAgY29sb3I6IHZhcigtLWNpdHlncmVlbik7XHJcbn1cclxuXHJcbi5zdGF0LWxhYmVsIHtcclxuICBtYXJnaW4tcmlnaHQ6IGF1dG87IC8qIFB1c2ggbmV4dCBlbGVtZW50cyB0byB0aGUgcmlnaHQgKi9cclxufVxyXG5cclxuLnN0YXQge1xyXG4gIG1hcmdpbi1sZWZ0OiA1cHg7IC8qIE9wdGlvbmFsOiBBZGQgc29tZSBzcGFjZSBiZXR3ZWVuIGN1cnJlbmN5IGFuZCBlZGl0IGljb24gKi9cclxufVxyXG5cclxuLnNpZGViYXItc3RhdC1saW5lLmZ1bmQtdG90YWwgLnN0YXQge1xyXG4gIG1hcmdpbi1yaWdodDogMDVweDsgLyogMjVweCBsaW5lcyB1cCB3aXRoIGxpbmVzIGFib3ZlICh3aXRoIGVkaXQgc3ltYm9sKSAqL1xyXG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvanMvY29tcG9uZW50cy9zaWRlYmFyL3NpZGViYXIuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksMkJBQTJCO0lBQzNCLCtDQUErQztFQUNqRDs7QUFFRjtJQUNJLG9CQUFvQjtBQUN4Qjs7QUFFQTtJQUNJLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLFlBQVksRUFBRSxnQ0FBZ0M7SUFDOUMsZUFBZSxFQUFFLDRDQUE0QztJQUM3RCxVQUFVLEVBQUUsZ0JBQWdCO0lBQzVCLE1BQU0sRUFBRSxvQkFBb0I7SUFDNUIsUUFBUSxFQUFFLGdDQUFnQztJQUMxQyx5QkFBeUIsRUFBRSwyQkFBMkI7SUFDdEQsa0JBQWtCLEVBQUUsOEJBQThCO0lBQ2xELGFBQWE7SUFDYix3Q0FBd0MsRUFBRSw4QkFBOEI7SUFDeEUsK0JBQStCLEVBQUUsaUJBQWlCO0lBQ2xELCtCQUErQixFQUFFLGdDQUFnQztJQUNqRSxzQ0FBc0M7SUFDdEMsMkJBQTJCO0lBQzNCLFdBQVc7RUFDYjs7QUFFRjtJQUNJLGtCQUFrQjtJQUNsQixxQkFBcUI7SUFDckIsZUFBZTtJQUNmLGNBQWM7SUFDZCxjQUFjO0lBQ2QsZ0JBQWdCO0FBQ3BCOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLGlCQUFpQjtFQUNqQix5Q0FBeUM7QUFDM0M7O0FBRUE7RUFDRSxnQkFBZ0I7RUFDaEIsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0UsbUNBQW1DO0FBQ3JDOztBQUVBO0VBQ0UsYUFBYTtFQUNiLG1CQUFtQjtFQUNuQiw4QkFBOEIsRUFBRSxzQ0FBc0M7RUFDdEUsWUFBWTtFQUNaLDZCQUE2QjtBQUMvQjs7QUFFQTtFQUNFLHlCQUF5QjtFQUN6QixlQUFlO0VBQ2YsZUFBZSxFQUFFLDhCQUE4QjtFQUMvQyxpQkFBaUI7QUFDbkI7O0FBRUE7RUFDRSx1QkFBdUI7QUFDekI7O0FBRUE7RUFDRSxrQkFBa0IsRUFBRSxvQ0FBb0M7QUFDMUQ7O0FBRUE7RUFDRSxnQkFBZ0IsRUFBRSw0REFBNEQ7QUFDaEY7O0FBRUE7RUFDRSxrQkFBa0IsRUFBRSxzREFBc0Q7QUFDNUVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiI3NpZGViYXItcGFuZWwge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGdyZXk7ICBcXHJcXG4gICAgLyogbWluLWhlaWdodDogMTAwdmg7IEZ1bGwgaGVpZ2h0IG9mIHZpZXdwb3J0ICovXFxyXFxuICB9XFxyXFxuXFxyXFxuI3N1cHAtdG90YWwgLnN0YXQge1xcclxcbiAgICBjb2xvcjogdmFyKC0teWVsbG93KTtcXHJcXG59XFxyXFxuXFxyXFxuLnN0YXQge1xcclxcbiAgICBmb250LXdlaWdodDogYm9sZDtcXHJcXG59XFxyXFxuXFxyXFxuI3NpZGViYXItcGFuZWwge1xcclxcbiAgICBoZWlnaHQ6IDEwMCU7IC8qIEZ1bGwgaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydCAqL1xcclxcbiAgICBwb3NpdGlvbjogZml4ZWQ7IC8qIEZpeGVkIFNpZGViYXIgKHN0YXkgaW4gcGxhY2Ugb24gc2Nyb2xsKSAqL1xcclxcbiAgICB6LWluZGV4OiAxOyAvKiBTdGF5IG9uIHRvcCAqL1xcclxcbiAgICB0b3A6IDA7IC8qIFN0YXkgYXQgdGhlIHRvcCAqL1xcclxcbiAgICByaWdodDogMDsgLyogU2lkZWJhciBhcHBlYXJzIG9uIHRoZSBsZWZ0ICovXFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7IC8qIFdoaXRlIGJhY2tncm91bmQgY29sb3IgKi9cXHJcXG4gICAgb3ZlcmZsb3cteDogaGlkZGVuOyAvKiBEaXNhYmxlIGhvcml6b250YWwgc2Nyb2xsICovXFxyXFxuICAgIHBhZGRpbmc6IDIwcHg7XFxyXFxuICAgIGJveC1zaGFkb3c6IDAgMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMSk7IC8qIEFkZCBzaGFkb3cgZm9yIHNvbWUgZGVwdGggKi9cXHJcXG4gICAgYm9yZGVyLXJpZ2h0OiAycHggc29saWQgI0RERERERDsgLyogUmlnaHQgYm9yZGVyICovXFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDBweCAwcHggMHB4IDE1cHg7IC8qIFJvdW5kZWQgY29ybmVycyBvbiB0aGUgbGVmdCAqL1xcclxcbiAgICAvKiBtYXJnaW4tdG9wOiB2YXIoLS1oZWFkZXItaGVpZ2h0KTsgKi9cXHJcXG4gICAgd2lkdGg6IHZhcigtLXNpZGViYXItd2lkdGgpO1xcclxcbiAgICBtYXJnaW46IDBweDtcXHJcXG4gIH1cXHJcXG4gIFxcclxcbi5zaWRlYmFyIGEge1xcclxcbiAgICBwYWRkaW5nOiAxMHB4IDE1cHg7XFxyXFxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXHJcXG4gICAgZm9udC1zaXplOiAxOHB4O1xcclxcbiAgICBjb2xvcjogIzgxODE4MTtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxuICAgIHRyYW5zaXRpb246IDAuM3M7XFxyXFxufVxcclxcblxcclxcbiNzaWRlYmFyLXRpdGxlIHtcXHJcXG4gIGNvbG9yOiB2YXIoLS1kYXJrR3JheSk7XFxyXFxuICBmb250LXdlaWdodDogYm9sZDtcXHJcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1jaXR5Z3JlZW4pO1xcclxcbn1cXHJcXG5cXHJcXG5ociB7XFxyXFxuICBtYXJnaW4tdG9wOiAtNXB4O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogOHB4O1xcclxcbn1cXHJcXG5cXHJcXG5oNiB7XFxyXFxuICBmb250LXdlaWdodDogNjAwO1xcclxcbn1cXHJcXG5cXHJcXG4uc2VjdGlvbi1oZWFkZXIge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWVkaXVtR3JheSk7XFxyXFxufVxcclxcblxcclxcbi5zaWRlYmFyLXN0YXQtbGluZSB7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgLyogRGlzdHJpYnV0ZSBzcGFjZSBiZXR3ZWVuIGNoaWxkcmVuICovXFxyXFxuICBwYWRkaW5nOiAycHg7XFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcXHJcXG59XFxyXFxuXFxyXFxuLmVkaXQtaWNvbiwgLmVkaXQtc3VwcCB7XFxyXFxuICBjb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgZm9udC1zaXplOiAxNnB4OyAvKiBBZGp1c3QgdGhlIHNpemUgYXMgbmVlZGVkICovXFxyXFxuICBtYXJnaW4tbGVmdDogMTBweDtcXHJcXG59XFxyXFxuXFxyXFxuLmVkaXQtaWNvbjpob3ZlciAuZWRpdC1zdXBwOmhvdmVyIHtcXHJcXG4gIGNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pO1xcclxcbn1cXHJcXG5cXHJcXG4uc3RhdC1sYWJlbCB7XFxyXFxuICBtYXJnaW4tcmlnaHQ6IGF1dG87IC8qIFB1c2ggbmV4dCBlbGVtZW50cyB0byB0aGUgcmlnaHQgKi9cXHJcXG59XFxyXFxuXFxyXFxuLnN0YXQge1xcclxcbiAgbWFyZ2luLWxlZnQ6IDVweDsgLyogT3B0aW9uYWw6IEFkZCBzb21lIHNwYWNlIGJldHdlZW4gY3VycmVuY3kgYW5kIGVkaXQgaWNvbiAqL1xcclxcbn1cXHJcXG5cXHJcXG4uc2lkZWJhci1zdGF0LWxpbmUuZnVuZC10b3RhbCAuc3RhdCB7XFxyXFxuICBtYXJnaW4tcmlnaHQ6IDA1cHg7IC8qIDI1cHggbGluZXMgdXAgd2l0aCBsaW5lcyBhYm92ZSAod2l0aCBlZGl0IHN5bWJvbCkgKi9cXHJcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///263\n')},279:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#main-table {\r\n font-size: 12px;\r\n /* calc(0.5vw + 0.5em); */\r\n margin: auto;\r\n width: 100%;\r\n}\r\n\r\n#main-table thead > tr > th {\r\n text-align: left;\r\n background-color: var(--darkGray);\r\n color: white;\r\n position: -webkit-sticky; /* For Safari */\r\n position: sticky;\r\n top: 0;\r\n padding-top: 5px;\r\n padding-bottom: 5px;\r\n padding-left: 5px;\r\n}\r\n\r\nth {\r\n background-color: var(--lightGray);\r\n}\r\n\r\ntr {\r\n border-width: 2px;\r\n background-color: white;\r\n}\r\n\r\ntr td {\r\n border-bottom: 1px solid black;\r\n}\r\n\r\n/* Default to hidden columns */\r\n\r\n#main-table tbody > tr > td {\r\n display : none;\r\n}\r\n#main-table thead > tr > th {\r\n display : none;\r\n}\r\n\r\n/* textbox width in table */\r\ninput {\r\n width: 100%;\r\n}\r\n\r\nselect {\r\n max-width: 100px;\r\n}\r\n\r\ndiv.table-container {\r\n overflow-x: auto; \r\n overflow-y: auto;\r\n margin-left: max(65px, 7vh);\r\n margin-right: max(65px, 7vh);\r\n /* max-width: calc(100vw - var(--sidebar-width)); */\r\n /* margin: auto; */\r\n max-height: max(350px, 6vh);\r\n /* min-height: 350px; */\r\n\r\n}\r\n \r\n/* Buttons */\r\n\r\n/* Add new row button */\r\n.btn-add { \r\n background-color: var(--spiritgreen);\r\n margin-top: 20px;\r\n display: none;\r\n}\r\n\r\n.btn-delete {\r\n background-color: var(--orange);\r\n}\r\n\r\n#add-btn-div {\r\n display: flex;\r\n justify-content: center; /* Aligns horizontally */\r\n align-items: center; /* Aligns vertically */\r\n width: 100%;\r\n}\r\n\r\n.btn-edit {\r\n background-color: var(--spiritgreen);\r\n line-height: 1.1;\r\n}\r\n\r\n.active-editing, .selected {\r\n background-color: var(--palegreen);\r\n}\r\n\r\n.selected { \r\n font-weight: bold;\r\n}\r\n\r\n.btn-confirm {\r\n display: none;\r\n}\r\n\r\n.confirm-btn:hover {\r\n background-color: var(--green);\r\n}\r\n\r\n.hover-effect:hover {\r\n cursor: pointer;\r\n background-color: var(--verypalegreen); \r\n}\r\n\r\n/* Fund table */\r\n.fund-name > .viewed-fund {\r\n color: gray;\r\n}\r\n\r\n/* made edit column narrower */\r\nth.edit, td.edit {\r\n width: 20px;\r\n}\r\n\r\n/* Class for hidden rows on filter */\r\n.hidden {\r\n display: none;\r\n}\r\n\r\n/* Filter styling for the dropdown options */\r\n#filter-container {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 2px; /* Adjust the gap as needed */\r\n font-size: 11px;\r\n margin-left: 10%;\r\n margin-right: 10%;\r\n margin-bottom: 5px;\r\n}\r\n\r\n#filter-container div {\r\n display: flex;\r\n align-items: center;\r\n width: calc(50% - 10px); /* Adjust width to fit two items per row with gap */\r\n}\r\n\r\n#filter-container label {\r\n width: 200px; /* Adjust the width as needed */\r\n text-align: right;\r\n margin-right: 10px; /* Spacing between label and select */\r\n}\r\n\r\n/* Ensure all select boxes are wide enough to show text */\r\n.filter-dropdown {\r\n flex: 1;\r\n min-width: 200px; /* Adjust the min-width as needed */\r\n}\r\n\r\n/* Optional styling to make the select dropdown look better */\r\n.filter-dropdown {\r\n padding: 5px;\r\n border: 1px solid #ccc;\r\n border-radius: 4px;\r\n}\r\n\r\n/* Responsive adjustment: On smaller screens, stack elements vertically */\r\n@media (max-width: 800px) {\r\n #filter-container div {\r\n width: 100%;\r\n }\r\n\r\n #filter-container label {\r\n text-align: left;\r\n width: auto;\r\n margin-right: 0;\r\n margin-bottom: 5px;\r\n }\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/table/table.css"],"names":[],"mappings":"AAAA;IACI,eAAe;IACf,yBAAyB;IACzB,YAAY;IACZ,WAAW;AACf;;AAEA;IACI,gBAAgB;IAChB,iCAAiC;IACjC,YAAY;IACZ,wBAAwB,EAAE,eAAe;IACzC,gBAAgB;IAChB,MAAM;IACN,gBAAgB;IAChB,mBAAmB;IACnB,iBAAiB;AACrB;;AAEA;IACI,kCAAkC;AACtC;;AAEA;IACI,iBAAiB;IACjB,uBAAuB;AAC3B;;AAEA;IACI,8BAA8B;AAClC;;AAEA,8BAA8B;;AAE9B;IACI,cAAc;AAClB;AACA;IACI,cAAc;AAClB;;AAEA,2BAA2B;AAC3B;IACI,WAAW;AACf;;AAEA;IACI,gBAAgB;AACpB;;AAEA;IACI,gBAAgB;IAChB,gBAAgB;IAChB,2BAA2B;IAC3B,4BAA4B;IAC5B,oDAAoD;IACpD,kBAAkB;IAClB,2BAA2B;IAC3B,uBAAuB;;AAE3B;;AAEA,YAAY;;AAEZ,uBAAuB;AACvB;IACI,oCAAoC;IACpC,gBAAgB;IAChB,aAAa;AACjB;;AAEA;IACI,+BAA+B;AACnC;;AAEA;IACI,aAAa;IACb,uBAAuB,EAAE,wBAAwB;IACjD,mBAAmB,EAAE,sBAAsB;IAC3C,WAAW;AACf;;AAEA;IACI,oCAAoC;IACpC,gBAAgB;AACpB;;AAEA;IACI,kCAAkC;AACtC;;AAEA;IACI,iBAAiB;AACrB;;AAEA;IACI,aAAa;AACjB;;AAEA;IACI,8BAA8B;AAClC;;AAEA;IACI,eAAe;IACf,sCAAsC;AAC1C;;AAEA,eAAe;AACf;IACI,WAAW;AACf;;AAEA,8BAA8B;AAC9B;IACI,WAAW;AACf;;AAEA,oCAAoC;AACpC;IACI,aAAa;AACjB;;AAEA,4CAA4C;AAC5C;IACI,aAAa;IACb,eAAe;IACf,QAAQ,EAAE,6BAA6B;IACvC,eAAe;IACf,gBAAgB;IAChB,iBAAiB;IACjB,kBAAkB;AACtB;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,uBAAuB,EAAE,mDAAmD;AAChF;;AAEA;IACI,YAAY,EAAE,+BAA+B;IAC7C,iBAAiB;IACjB,kBAAkB,EAAE,qCAAqC;AAC7D;;AAEA,yDAAyD;AACzD;IACI,OAAO;IACP,gBAAgB,EAAE,mCAAmC;AACzD;;AAEA,6DAA6D;AAC7D;IACI,YAAY;IACZ,sBAAsB;IACtB,kBAAkB;AACtB;;AAEA,yEAAyE;AACzE;IACI;QACI,WAAW;IACf;;IAEA;QACI,gBAAgB;QAChB,WAAW;QACX,eAAe;QACf,kBAAkB;IACtB;AACJ","sourcesContent":["#main-table {\\r\\n font-size: 12px;\\r\\n /* calc(0.5vw + 0.5em); */\\r\\n margin: auto;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n#main-table thead > tr > th {\\r\\n text-align: left;\\r\\n background-color: var(--darkGray);\\r\\n color: white;\\r\\n position: -webkit-sticky; /* For Safari */\\r\\n position: sticky;\\r\\n top: 0;\\r\\n padding-top: 5px;\\r\\n padding-bottom: 5px;\\r\\n padding-left: 5px;\\r\\n}\\r\\n\\r\\nth {\\r\\n background-color: var(--lightGray);\\r\\n}\\r\\n\\r\\ntr {\\r\\n border-width: 2px;\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\ntr td {\\r\\n border-bottom: 1px solid black;\\r\\n}\\r\\n\\r\\n/* Default to hidden columns */\\r\\n\\r\\n#main-table tbody > tr > td {\\r\\n display : none;\\r\\n}\\r\\n#main-table thead > tr > th {\\r\\n display : none;\\r\\n}\\r\\n\\r\\n/* textbox width in table */\\r\\ninput {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\nselect {\\r\\n max-width: 100px;\\r\\n}\\r\\n\\r\\ndiv.table-container {\\r\\n overflow-x: auto; \\r\\n overflow-y: auto;\\r\\n margin-left: max(65px, 7vh);\\r\\n margin-right: max(65px, 7vh);\\r\\n /* max-width: calc(100vw - var(--sidebar-width)); */\\r\\n /* margin: auto; */\\r\\n max-height: max(350px, 6vh);\\r\\n /* min-height: 350px; */\\r\\n\\r\\n}\\r\\n \\r\\n/* Buttons */\\r\\n\\r\\n/* Add new row button */\\r\\n.btn-add { \\r\\n background-color: var(--spiritgreen);\\r\\n margin-top: 20px;\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.btn-delete {\\r\\n background-color: var(--orange);\\r\\n}\\r\\n\\r\\n#add-btn-div {\\r\\n display: flex;\\r\\n justify-content: center; /* Aligns horizontally */\\r\\n align-items: center; /* Aligns vertically */\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.btn-edit {\\r\\n background-color: var(--spiritgreen);\\r\\n line-height: 1.1;\\r\\n}\\r\\n\\r\\n.active-editing, .selected {\\r\\n background-color: var(--palegreen);\\r\\n}\\r\\n\\r\\n.selected { \\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.btn-confirm {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.confirm-btn:hover {\\r\\n background-color: var(--green);\\r\\n}\\r\\n\\r\\n.hover-effect:hover {\\r\\n cursor: pointer;\\r\\n background-color: var(--verypalegreen); \\r\\n}\\r\\n\\r\\n/* Fund table */\\r\\n.fund-name > .viewed-fund {\\r\\n color: gray;\\r\\n}\\r\\n\\r\\n/* made edit column narrower */\\r\\nth.edit, td.edit {\\r\\n width: 20px;\\r\\n}\\r\\n\\r\\n/* Class for hidden rows on filter */\\r\\n.hidden {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n/* Filter styling for the dropdown options */\\r\\n#filter-container {\\r\\n display: flex;\\r\\n flex-wrap: wrap;\\r\\n gap: 2px; /* Adjust the gap as needed */\\r\\n font-size: 11px;\\r\\n margin-left: 10%;\\r\\n margin-right: 10%;\\r\\n margin-bottom: 5px;\\r\\n}\\r\\n\\r\\n#filter-container div {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n width: calc(50% - 10px); /* Adjust width to fit two items per row with gap */\\r\\n}\\r\\n\\r\\n#filter-container label {\\r\\n width: 200px; /* Adjust the width as needed */\\r\\n text-align: right;\\r\\n margin-right: 10px; /* Spacing between label and select */\\r\\n}\\r\\n\\r\\n/* Ensure all select boxes are wide enough to show text */\\r\\n.filter-dropdown {\\r\\n flex: 1;\\r\\n min-width: 200px; /* Adjust the min-width as needed */\\r\\n}\\r\\n\\r\\n/* Optional styling to make the select dropdown look better */\\r\\n.filter-dropdown {\\r\\n padding: 5px;\\r\\n border: 1px solid #ccc;\\r\\n border-radius: 4px;\\r\\n}\\r\\n\\r\\n/* Responsive adjustment: On smaller screens, stack elements vertically */\\r\\n@media (max-width: 800px) {\\r\\n #filter-container div {\\r\\n width: 100%;\\r\\n }\\r\\n\\r\\n #filter-container label {\\r\\n text-align: left;\\r\\n width: auto;\\r\\n margin-right: 0;\\r\\n margin-bottom: 5px;\\r\\n }\\r\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc5LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNzcz81MjM3Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAjbWFpbi10YWJsZSB7XHJcbiAgICBmb250LXNpemU6IDEycHg7XHJcbiAgICAvKiBjYWxjKDAuNXZ3ICsgMC41ZW0pOyAqL1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbiNtYWluLXRhYmxlIHRoZWFkID4gdHIgPiB0aCB7XHJcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGFya0dyYXkpO1xyXG4gICAgY29sb3I6IHdoaXRlO1xyXG4gICAgcG9zaXRpb246IC13ZWJraXQtc3RpY2t5OyAvKiBGb3IgU2FmYXJpICovXHJcbiAgICBwb3NpdGlvbjogc3RpY2t5O1xyXG4gICAgdG9wOiAwO1xyXG4gICAgcGFkZGluZy10b3A6IDVweDtcclxuICAgIHBhZGRpbmctYm90dG9tOiA1cHg7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDVweDtcclxufVxyXG5cclxudGgge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHRHcmF5KTtcclxufVxyXG5cclxudHIge1xyXG4gICAgYm9yZGVyLXdpZHRoOiAycHg7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxudHIgdGQge1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO1xyXG59XHJcblxyXG4vKiBEZWZhdWx0IHRvIGhpZGRlbiBjb2x1bW5zICovXHJcblxyXG4jbWFpbi10YWJsZSB0Ym9keSA+IHRyID4gdGQge1xyXG4gICAgZGlzcGxheSA6IG5vbmU7XHJcbn1cclxuI21haW4tdGFibGUgdGhlYWQgPiB0ciA+IHRoIHtcclxuICAgIGRpc3BsYXkgOiBub25lO1xyXG59XHJcblxyXG4vKiB0ZXh0Ym94IHdpZHRoIGluIHRhYmxlICovXHJcbmlucHV0IHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG59XHJcblxyXG5zZWxlY3Qge1xyXG4gICAgbWF4LXdpZHRoOiAxMDBweDtcclxufVxyXG5cclxuZGl2LnRhYmxlLWNvbnRhaW5lciB7XHJcbiAgICBvdmVyZmxvdy14OiBhdXRvOyBcclxuICAgIG92ZXJmbG93LXk6IGF1dG87XHJcbiAgICBtYXJnaW4tbGVmdDogbWF4KDY1cHgsIDd2aCk7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IG1heCg2NXB4LCA3dmgpO1xyXG4gICAgLyogbWF4LXdpZHRoOiBjYWxjKDEwMHZ3IC0gdmFyKC0tc2lkZWJhci13aWR0aCkpOyAgKi9cclxuICAgIC8qIG1hcmdpbjogYXV0bzsgKi9cclxuICAgIG1heC1oZWlnaHQ6IG1heCgzNTBweCwgNnZoKTtcclxuICAgIC8qIG1pbi1oZWlnaHQ6IDM1MHB4OyAqL1xyXG5cclxufVxyXG4gIFxyXG4vKiBCdXR0b25zICovXHJcblxyXG4vKiBBZGQgbmV3IHJvdyBidXR0b24gKi9cclxuLmJ0bi1hZGQgeyBcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxuICAgIG1hcmdpbi10b3A6IDIwcHg7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG59XHJcblxyXG4uYnRuLWRlbGV0ZSB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1vcmFuZ2UpO1xyXG59XHJcblxyXG4jYWRkLWJ0bi1kaXYge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOyAvKiBBbGlnbnMgaG9yaXpvbnRhbGx5ICovXHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyOyAvKiBBbGlnbnMgdmVydGljYWxseSAqL1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbi5idG4tZWRpdCB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XHJcbiAgICBsaW5lLWhlaWdodDogMS4xO1xyXG59XHJcblxyXG4uYWN0aXZlLWVkaXRpbmcsIC5zZWxlY3RlZCB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYWxlZ3JlZW4pO1xyXG59XHJcblxyXG4uc2VsZWN0ZWQgeyBcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG59XHJcblxyXG4uYnRuLWNvbmZpcm0ge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuLmNvbmZpcm0tYnRuOmhvdmVyIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWdyZWVuKTtcclxufVxyXG5cclxuLmhvdmVyLWVmZmVjdDpob3ZlciB7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS12ZXJ5cGFsZWdyZWVuKTsgXHJcbn1cclxuXHJcbi8qIEZ1bmQgdGFibGUgKi9cclxuLmZ1bmQtbmFtZSA+IC52aWV3ZWQtZnVuZCB7XHJcbiAgICBjb2xvcjogZ3JheTtcclxufVxyXG5cclxuLyogbWFkZSBlZGl0IGNvbHVtbiBuYXJyb3dlciAqL1xyXG50aC5lZGl0LCB0ZC5lZGl0IHtcclxuICAgIHdpZHRoOiAyMHB4O1xyXG59XHJcblxyXG4vKiBDbGFzcyBmb3IgaGlkZGVuIHJvd3Mgb24gZmlsdGVyICovXHJcbi5oaWRkZW4ge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuLyogRmlsdGVyIHN0eWxpbmcgZm9yIHRoZSBkcm9wZG93biBvcHRpb25zICovXHJcbiNmaWx0ZXItY29udGFpbmVyIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBmbGV4LXdyYXA6IHdyYXA7XHJcbiAgICBnYXA6IDJweDsgLyogQWRqdXN0IHRoZSBnYXAgYXMgbmVlZGVkICovXHJcbiAgICBmb250LXNpemU6IDExcHg7XHJcbiAgICBtYXJnaW4tbGVmdDogMTAlO1xyXG4gICAgbWFyZ2luLXJpZ2h0OiAxMCU7XHJcbiAgICBtYXJnaW4tYm90dG9tOiA1cHg7XHJcbn1cclxuXHJcbiNmaWx0ZXItY29udGFpbmVyIGRpdiB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIHdpZHRoOiBjYWxjKDUwJSAtIDEwcHgpOyAvKiBBZGp1c3Qgd2lkdGggdG8gZml0IHR3byBpdGVtcyBwZXIgcm93IHdpdGggZ2FwICovXHJcbn1cclxuXHJcbiNmaWx0ZXItY29udGFpbmVyIGxhYmVsIHtcclxuICAgIHdpZHRoOiAyMDBweDsgLyogQWRqdXN0IHRoZSB3aWR0aCBhcyBuZWVkZWQgKi9cclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG4gICAgbWFyZ2luLXJpZ2h0OiAxMHB4OyAvKiBTcGFjaW5nIGJldHdlZW4gbGFiZWwgYW5kIHNlbGVjdCAqL1xyXG59XHJcblxyXG4vKiBFbnN1cmUgYWxsIHNlbGVjdCBib3hlcyBhcmUgd2lkZSBlbm91Z2ggdG8gc2hvdyB0ZXh0ICovXHJcbi5maWx0ZXItZHJvcGRvd24ge1xyXG4gICAgZmxleDogMTtcclxuICAgIG1pbi13aWR0aDogMjAwcHg7IC8qIEFkanVzdCB0aGUgbWluLXdpZHRoIGFzIG5lZWRlZCAqL1xyXG59XHJcblxyXG4vKiBPcHRpb25hbCBzdHlsaW5nIHRvIG1ha2UgdGhlIHNlbGVjdCBkcm9wZG93biBsb29rIGJldHRlciAqL1xyXG4uZmlsdGVyLWRyb3Bkb3duIHtcclxuICAgIHBhZGRpbmc6IDVweDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XHJcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbn1cclxuXHJcbi8qIFJlc3BvbnNpdmUgYWRqdXN0bWVudDogT24gc21hbGxlciBzY3JlZW5zLCBzdGFjayBlbGVtZW50cyB2ZXJ0aWNhbGx5ICovXHJcbkBtZWRpYSAobWF4LXdpZHRoOiA4MDBweCkge1xyXG4gICAgI2ZpbHRlci1jb250YWluZXIgZGl2IHtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgIH1cclxuXHJcbiAgICAjZmlsdGVyLWNvbnRhaW5lciBsYWJlbCB7XHJcbiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcclxuICAgICAgICB3aWR0aDogYXV0bztcclxuICAgICAgICBtYXJnaW4tcmlnaHQ6IDA7XHJcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4O1xyXG4gICAgfVxyXG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvanMvY29tcG9uZW50cy90YWJsZS90YWJsZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxlQUFlO0lBQ2YseUJBQXlCO0lBQ3pCLFlBQVk7SUFDWixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsaUNBQWlDO0lBQ2pDLFlBQVk7SUFDWix3QkFBd0IsRUFBRSxlQUFlO0lBQ3pDLGdCQUFnQjtJQUNoQixNQUFNO0lBQ04sZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxrQ0FBa0M7QUFDdEM7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0ksOEJBQThCO0FBQ2xDOztBQUVBLDhCQUE4Qjs7QUFFOUI7SUFDSSxjQUFjO0FBQ2xCO0FBQ0E7SUFDSSxjQUFjO0FBQ2xCOztBQUVBLDJCQUEyQjtBQUMzQjtJQUNJLFdBQVc7QUFDZjs7QUFFQTtJQUNJLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsMkJBQTJCO0lBQzNCLDRCQUE0QjtJQUM1QixvREFBb0Q7SUFDcEQsa0JBQWtCO0lBQ2xCLDJCQUEyQjtJQUMzQix1QkFBdUI7O0FBRTNCOztBQUVBLFlBQVk7O0FBRVosdUJBQXVCO0FBQ3ZCO0lBQ0ksb0NBQW9DO0lBQ3BDLGdCQUFnQjtJQUNoQixhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksK0JBQStCO0FBQ25DOztBQUVBO0lBQ0ksYUFBYTtJQUNiLHVCQUF1QixFQUFFLHdCQUF3QjtJQUNqRCxtQkFBbUIsRUFBRSxzQkFBc0I7SUFDM0MsV0FBVztBQUNmOztBQUVBO0lBQ0ksb0NBQW9DO0lBQ3BDLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGtDQUFrQztBQUN0Qzs7QUFFQTtJQUNJLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGFBQWE7QUFDakI7O0FBRUE7SUFDSSw4QkFBOEI7QUFDbEM7O0FBRUE7SUFDSSxlQUFlO0lBQ2Ysc0NBQXNDO0FBQzFDOztBQUVBLGVBQWU7QUFDZjtJQUNJLFdBQVc7QUFDZjs7QUFFQSw4QkFBOEI7QUFDOUI7SUFDSSxXQUFXO0FBQ2Y7O0FBRUEsb0NBQW9DO0FBQ3BDO0lBQ0ksYUFBYTtBQUNqQjs7QUFFQSw0Q0FBNEM7QUFDNUM7SUFDSSxhQUFhO0lBQ2IsZUFBZTtJQUNmLFFBQVEsRUFBRSw2QkFBNkI7SUFDdkMsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQixpQkFBaUI7SUFDakIsa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksYUFBYTtJQUNiLG1CQUFtQjtJQUNuQix1QkFBdUIsRUFBRSxtREFBbUQ7QUFDaEY7O0FBRUE7SUFDSSxZQUFZLEVBQUUsK0JBQStCO0lBQzdDLGlCQUFpQjtJQUNqQixrQkFBa0IsRUFBRSxxQ0FBcUM7QUFDN0Q7O0FBRUEseURBQXlEO0FBQ3pEO0lBQ0ksT0FBTztJQUNQLGdCQUFnQixFQUFFLG1DQUFtQztBQUN6RDs7QUFFQSw2REFBNkQ7QUFDN0Q7SUFDSSxZQUFZO0lBQ1osc0JBQXNCO0lBQ3RCLGtCQUFrQjtBQUN0Qjs7QUFFQSx5RUFBeUU7QUFDekU7SUFDSTtRQUNJLFdBQVc7SUFDZjs7SUFFQTtRQUNJLGdCQUFnQjtRQUNoQixXQUFXO1FBQ1gsZUFBZTtRQUNmLGtCQUFrQjtJQUN0QjtBQUNKXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIiNtYWluLXRhYmxlIHtcXHJcXG4gICAgZm9udC1zaXplOiAxMnB4O1xcclxcbiAgICAvKiBjYWxjKDAuNXZ3ICsgMC41ZW0pOyAqL1xcclxcbiAgICBtYXJnaW46IGF1dG87XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbn1cXHJcXG5cXHJcXG4jbWFpbi10YWJsZSB0aGVhZCA+IHRyID4gdGgge1xcclxcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kYXJrR3JheSk7XFxyXFxuICAgIGNvbG9yOiB3aGl0ZTtcXHJcXG4gICAgcG9zaXRpb246IC13ZWJraXQtc3RpY2t5OyAvKiBGb3IgU2FmYXJpICovXFxyXFxuICAgIHBvc2l0aW9uOiBzdGlja3k7XFxyXFxuICAgIHRvcDogMDtcXHJcXG4gICAgcGFkZGluZy10b3A6IDVweDtcXHJcXG4gICAgcGFkZGluZy1ib3R0b206IDVweDtcXHJcXG4gICAgcGFkZGluZy1sZWZ0OiA1cHg7XFxyXFxufVxcclxcblxcclxcbnRoIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHRHcmF5KTtcXHJcXG59XFxyXFxuXFxyXFxudHIge1xcclxcbiAgICBib3JkZXItd2lkdGg6IDJweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbnRyIHRkIHtcXHJcXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBEZWZhdWx0IHRvIGhpZGRlbiBjb2x1bW5zICovXFxyXFxuXFxyXFxuI21haW4tdGFibGUgdGJvZHkgPiB0ciA+IHRkIHtcXHJcXG4gICAgZGlzcGxheSA6IG5vbmU7XFxyXFxufVxcclxcbiNtYWluLXRhYmxlIHRoZWFkID4gdHIgPiB0aCB7XFxyXFxuICAgIGRpc3BsYXkgOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4vKiB0ZXh0Ym94IHdpZHRoIGluIHRhYmxlICovXFxyXFxuaW5wdXQge1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG59XFxyXFxuXFxyXFxuc2VsZWN0IHtcXHJcXG4gICAgbWF4LXdpZHRoOiAxMDBweDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LnRhYmxlLWNvbnRhaW5lciB7XFxyXFxuICAgIG92ZXJmbG93LXg6IGF1dG87IFxcclxcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xcclxcbiAgICBtYXJnaW4tbGVmdDogbWF4KDY1cHgsIDd2aCk7XFxyXFxuICAgIG1hcmdpbi1yaWdodDogbWF4KDY1cHgsIDd2aCk7XFxyXFxuICAgIC8qIG1heC13aWR0aDogY2FsYygxMDB2dyAtIHZhcigtLXNpZGViYXItd2lkdGgpKTsgICovXFxyXFxuICAgIC8qIG1hcmdpbjogYXV0bzsgKi9cXHJcXG4gICAgbWF4LWhlaWdodDogbWF4KDM1MHB4LCA2dmgpO1xcclxcbiAgICAvKiBtaW4taGVpZ2h0OiAzNTBweDsgKi9cXHJcXG5cXHJcXG59XFxyXFxuICBcXHJcXG4vKiBCdXR0b25zICovXFxyXFxuXFxyXFxuLyogQWRkIG5ldyByb3cgYnV0dG9uICovXFxyXFxuLmJ0bi1hZGQgeyBcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xcclxcbiAgICBtYXJnaW4tdG9wOiAyMHB4O1xcclxcbiAgICBkaXNwbGF5OiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uYnRuLWRlbGV0ZSB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW9yYW5nZSk7XFxyXFxufVxcclxcblxcclxcbiNhZGQtYnRuLWRpdiB7XFxyXFxuICAgIGRpc3BsYXk6IGZsZXg7XFxyXFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOyAvKiBBbGlnbnMgaG9yaXpvbnRhbGx5ICovXFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7IC8qIEFsaWducyB2ZXJ0aWNhbGx5ICovXFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbn1cXHJcXG5cXHJcXG4uYnRuLWVkaXQge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XFxyXFxuICAgIGxpbmUtaGVpZ2h0OiAxLjE7XFxyXFxufVxcclxcblxcclxcbi5hY3RpdmUtZWRpdGluZywgLnNlbGVjdGVkIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFsZWdyZWVuKTtcXHJcXG59XFxyXFxuXFxyXFxuLnNlbGVjdGVkIHsgXFxyXFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbn1cXHJcXG5cXHJcXG4uYnRuLWNvbmZpcm0ge1xcclxcbiAgICBkaXNwbGF5OiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uY29uZmlybS1idG46aG92ZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ncmVlbik7XFxyXFxufVxcclxcblxcclxcbi5ob3Zlci1lZmZlY3Q6aG92ZXIge1xcclxcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXZlcnlwYWxlZ3JlZW4pOyBcXHJcXG59XFxyXFxuXFxyXFxuLyogRnVuZCB0YWJsZSAqL1xcclxcbi5mdW5kLW5hbWUgPiAudmlld2VkLWZ1bmQge1xcclxcbiAgICBjb2xvcjogZ3JheTtcXHJcXG59XFxyXFxuXFxyXFxuLyogbWFkZSBlZGl0IGNvbHVtbiBuYXJyb3dlciAqL1xcclxcbnRoLmVkaXQsIHRkLmVkaXQge1xcclxcbiAgICB3aWR0aDogMjBweDtcXHJcXG59XFxyXFxuXFxyXFxuLyogQ2xhc3MgZm9yIGhpZGRlbiByb3dzIG9uIGZpbHRlciAqL1xcclxcbi5oaWRkZW4ge1xcclxcbiAgICBkaXNwbGF5OiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBGaWx0ZXIgc3R5bGluZyBmb3IgdGhlIGRyb3Bkb3duIG9wdGlvbnMgKi9cXHJcXG4jZmlsdGVyLWNvbnRhaW5lciB7XFxyXFxuICAgIGRpc3BsYXk6IGZsZXg7XFxyXFxuICAgIGZsZXgtd3JhcDogd3JhcDtcXHJcXG4gICAgZ2FwOiAycHg7IC8qIEFkanVzdCB0aGUgZ2FwIGFzIG5lZWRlZCAqL1xcclxcbiAgICBmb250LXNpemU6IDExcHg7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiAxMCU7XFxyXFxuICAgIG1hcmdpbi1yaWdodDogMTAlO1xcclxcbiAgICBtYXJnaW4tYm90dG9tOiA1cHg7XFxyXFxufVxcclxcblxcclxcbiNmaWx0ZXItY29udGFpbmVyIGRpdiB7XFxyXFxuICAgIGRpc3BsYXk6IGZsZXg7XFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICAgIHdpZHRoOiBjYWxjKDUwJSAtIDEwcHgpOyAvKiBBZGp1c3Qgd2lkdGggdG8gZml0IHR3byBpdGVtcyBwZXIgcm93IHdpdGggZ2FwICovXFxyXFxufVxcclxcblxcclxcbiNmaWx0ZXItY29udGFpbmVyIGxhYmVsIHtcXHJcXG4gICAgd2lkdGg6IDIwMHB4OyAvKiBBZGp1c3QgdGhlIHdpZHRoIGFzIG5lZWRlZCAqL1xcclxcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcXHJcXG4gICAgbWFyZ2luLXJpZ2h0OiAxMHB4OyAvKiBTcGFjaW5nIGJldHdlZW4gbGFiZWwgYW5kIHNlbGVjdCAqL1xcclxcbn1cXHJcXG5cXHJcXG4vKiBFbnN1cmUgYWxsIHNlbGVjdCBib3hlcyBhcmUgd2lkZSBlbm91Z2ggdG8gc2hvdyB0ZXh0ICovXFxyXFxuLmZpbHRlci1kcm9wZG93biB7XFxyXFxuICAgIGZsZXg6IDE7XFxyXFxuICAgIG1pbi13aWR0aDogMjAwcHg7IC8qIEFkanVzdCB0aGUgbWluLXdpZHRoIGFzIG5lZWRlZCAqL1xcclxcbn1cXHJcXG5cXHJcXG4vKiBPcHRpb25hbCBzdHlsaW5nIHRvIG1ha2UgdGhlIHNlbGVjdCBkcm9wZG93biBsb29rIGJldHRlciAqL1xcclxcbi5maWx0ZXItZHJvcGRvd24ge1xcclxcbiAgICBwYWRkaW5nOiA1cHg7XFxyXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG59XFxyXFxuXFxyXFxuLyogUmVzcG9uc2l2ZSBhZGp1c3RtZW50OiBPbiBzbWFsbGVyIHNjcmVlbnMsIHN0YWNrIGVsZW1lbnRzIHZlcnRpY2FsbHkgKi9cXHJcXG5AbWVkaWEgKG1heC13aWR0aDogODAwcHgpIHtcXHJcXG4gICAgI2ZpbHRlci1jb250YWluZXIgZGl2IHtcXHJcXG4gICAgICAgIHdpZHRoOiAxMDAlO1xcclxcbiAgICB9XFxyXFxuXFxyXFxuICAgICNmaWx0ZXItY29udGFpbmVyIGxhYmVsIHtcXHJcXG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XFxyXFxuICAgICAgICB3aWR0aDogYXV0bztcXHJcXG4gICAgICAgIG1hcmdpbi1yaWdodDogMDtcXHJcXG4gICAgICAgIG1hcmdpbi1ib3R0b206IDVweDtcXHJcXG4gICAgfVxcclxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///279\n')},843:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#tooltip {\r\n position: absolute;\r\n background-color: black;\r\n color: white;\r\n padding: 5px;\r\n border-radius: 3px;\r\n visibility: hidden;\r\n white-space: nowrap;\r\n font-size: 14px;\r\n z-index: 1000;\r\n max-width: 300px;\r\n word-wrap: break-word;\r\n white-space: normal;\r\n}\r\n\r\n.tooltip-cell {\r\n /* color: blue; */\r\n /* text-decoration: underline; */\r\n cursor: pointer;\r\n}\r\n\r\n.tooltip-cell .info-icon {\r\n margin-left: 5px;\r\n color: var(--spiritgreen);\r\n font-size: 15px;\r\n}\r\n\r\n.tooltip-cell:hover {\r\n background-color: #f0f0f0; /* Change background on hover */\r\n}\r\n\r\n.detail {\r\n color: blue;\r\n color: var(--spiritgreen);\r\n text-decoration: underline;\r\n margin-left: 5px;\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/tooltip/tooltip.css"],"names":[],"mappings":"AAAA;IACI,kBAAkB;IAClB,uBAAuB;IACvB,YAAY;IACZ,YAAY;IACZ,kBAAkB;IAClB,kBAAkB;IAClB,mBAAmB;IACnB,eAAe;IACf,aAAa;IACb,gBAAgB;IAChB,qBAAqB;IACrB,mBAAmB;AACvB;;AAEA;IACI,iBAAiB;IACjB,gCAAgC;IAChC,eAAe;AACnB;;AAEA;IACI,gBAAgB;IAChB,yBAAyB;IACzB,eAAe;AACnB;;AAEA;IACI,yBAAyB,EAAE,+BAA+B;AAC9D;;AAEA;IACI,WAAW;IACX,yBAAyB;IACzB,0BAA0B;IAC1B,gBAAgB;AACpB","sourcesContent":["#tooltip {\\r\\n position: absolute;\\r\\n background-color: black;\\r\\n color: white;\\r\\n padding: 5px;\\r\\n border-radius: 3px;\\r\\n visibility: hidden;\\r\\n white-space: nowrap;\\r\\n font-size: 14px;\\r\\n z-index: 1000;\\r\\n max-width: 300px;\\r\\n word-wrap: break-word;\\r\\n white-space: normal;\\r\\n}\\r\\n\\r\\n.tooltip-cell {\\r\\n /* color: blue; */\\r\\n /* text-decoration: underline; */\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.tooltip-cell .info-icon {\\r\\n margin-left: 5px;\\r\\n color: var(--spiritgreen);\\r\\n font-size: 15px;\\r\\n}\\r\\n\\r\\n.tooltip-cell:hover {\\r\\n background-color: #f0f0f0; /* Change background on hover */\\r\\n}\\r\\n\\r\\n.detail {\\r\\n color: blue;\\r\\n color: var(--spiritgreen);\\r\\n text-decoration: underline;\\r\\n margin-left: 5px;\\r\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3Rvb2x0aXAvdG9vbHRpcC5jc3M/N2ZkNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgI3Rvb2x0aXAge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7XHJcbiAgICBjb2xvcjogd2hpdGU7XHJcbiAgICBwYWRkaW5nOiA1cHg7XHJcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XHJcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XHJcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgei1pbmRleDogMTAwMDtcclxuICAgIG1heC13aWR0aDogMzAwcHg7XHJcbiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XHJcbiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xyXG59XHJcblxyXG4udG9vbHRpcC1jZWxsIHtcclxuICAgIC8qIGNvbG9yOiBibHVlOyAqL1xyXG4gICAgLyogdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7ICovXHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi50b29sdGlwLWNlbGwgLmluZm8taWNvbiB7XHJcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xyXG4gICAgY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxuICAgIGZvbnQtc2l6ZTogMTVweDtcclxufVxyXG5cclxuLnRvb2x0aXAtY2VsbDpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOyAvKiBDaGFuZ2UgYmFja2dyb3VuZCBvbiBob3ZlciAqL1xyXG59XHJcblxyXG4uZGV0YWlsIHtcclxuICAgIGNvbG9yOiBibHVlO1xyXG4gICAgY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xyXG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvdG9vbHRpcC90b29sdGlwLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGtCQUFrQjtJQUNsQix1QkFBdUI7SUFDdkIsWUFBWTtJQUNaLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixlQUFlO0lBQ2YsYUFBYTtJQUNiLGdCQUFnQjtJQUNoQixxQkFBcUI7SUFDckIsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLGdDQUFnQztJQUNoQyxlQUFlO0FBQ25COztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLHlCQUF5QjtJQUN6QixlQUFlO0FBQ25COztBQUVBO0lBQ0kseUJBQXlCLEVBQUUsK0JBQStCO0FBQzlEOztBQUVBO0lBQ0ksV0FBVztJQUNYLHlCQUF5QjtJQUN6QiwwQkFBMEI7SUFDMUIsZ0JBQWdCO0FBQ3BCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIiN0b29sdGlwIHtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjaztcXHJcXG4gICAgY29sb3I6IHdoaXRlO1xcclxcbiAgICBwYWRkaW5nOiA1cHg7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcXHJcXG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xcclxcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcclxcbiAgICBmb250LXNpemU6IDE0cHg7XFxyXFxuICAgIHotaW5kZXg6IDEwMDA7XFxyXFxuICAgIG1heC13aWR0aDogMzAwcHg7XFxyXFxuICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDtcXHJcXG4gICAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcXHJcXG59XFxyXFxuXFxyXFxuLnRvb2x0aXAtY2VsbCB7XFxyXFxuICAgIC8qIGNvbG9yOiBibHVlOyAqL1xcclxcbiAgICAvKiB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgKi9cXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG5cXHJcXG4udG9vbHRpcC1jZWxsIC5pbmZvLWljb24ge1xcclxcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xcclxcbiAgICBjb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xcclxcbiAgICBmb250LXNpemU6IDE1cHg7XFxyXFxufVxcclxcblxcclxcbi50b29sdGlwLWNlbGw6aG92ZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOyAvKiBDaGFuZ2UgYmFja2dyb3VuZCBvbiBob3ZlciAqL1xcclxcbn1cXHJcXG5cXHJcXG4uZGV0YWlsIHtcXHJcXG4gICAgY29sb3I6IGJsdWU7XFxyXFxuICAgIGNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XFxyXFxuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xcclxcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xcclxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///843\n')},235:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* Welcome page (index.html) */\r\n\r\n.step {\r\n width: 60%;\r\n height: 80px;\r\n font-size: 1.75em;\r\n margin-bottom: 0px; /* Adds spacing between buttons */\r\n margin-left: 20%;\r\n border-color: var(--citygreen);\r\n border-width: 2;\r\n color: var(--citygreen);\r\n background-color: white;\r\n}\r\n\r\n.step:hover {\r\n color: white;\r\n background-color: var(--spiritgreen);\r\n}\r\n\r\n#welcome-page {\r\n justify-content: center; \r\n align-items: center; \r\n padding-top: 20px;\r\n}\r\n.step.disabled {\r\n opacity: 50%;\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/welcome/welcome.css"],"names":[],"mappings":"AAAA,8BAA8B;;AAE9B;IACI,UAAU;IACV,YAAY;IACZ,iBAAiB;IACjB,kBAAkB,EAAE,iCAAiC;IACrD,gBAAgB;IAChB,8BAA8B;IAC9B,eAAe;IACf,uBAAuB;IACvB,uBAAuB;AAC3B;;AAEA;IACI,YAAY;IACZ,oCAAoC;AACxC;;AAEA;IACI,uBAAuB;IACvB,mBAAmB;IACnB,iBAAiB;AACrB;AACA;IACI,YAAY;AAChB","sourcesContent":["/* Welcome page (index.html) */\\r\\n\\r\\n.step {\\r\\n width: 60%;\\r\\n height: 80px;\\r\\n font-size: 1.75em;\\r\\n margin-bottom: 0px; /* Adds spacing between buttons */\\r\\n margin-left: 20%;\\r\\n border-color: var(--citygreen);\\r\\n border-width: 2;\\r\\n color: var(--citygreen);\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.step:hover {\\r\\n color: white;\\r\\n background-color: var(--spiritgreen);\\r\\n}\\r\\n\\r\\n#welcome-page {\\r\\n justify-content: center; \\r\\n align-items: center; \\r\\n padding-top: 20px;\\r\\n}\\r\\n.step.disabled {\\r\\n opacity: 50%;\\r\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy93ZWxjb21lL3dlbGNvbWUuY3NzP2IzNDgiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC8qIFdlbGNvbWUgcGFnZSAoaW5kZXguaHRtbCkgKi9cclxuXHJcbi5zdGVwIHtcclxuICAgIHdpZHRoOiA2MCU7XHJcbiAgICBoZWlnaHQ6IDgwcHg7XHJcbiAgICBmb250LXNpemU6IDEuNzVlbTtcclxuICAgIG1hcmdpbi1ib3R0b206IDBweDsgLyogQWRkcyBzcGFjaW5nIGJldHdlZW4gYnV0dG9ucyAqL1xyXG4gICAgbWFyZ2luLWxlZnQ6IDIwJTtcclxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY2l0eWdyZWVuKTtcclxuICAgIGJvcmRlci13aWR0aDogMjtcclxuICAgIGNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi5zdGVwOmhvdmVyIHtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxufVxyXG5cclxuI3dlbGNvbWUtcGFnZSB7XHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgXHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyOyBcclxuICAgIHBhZGRpbmctdG9wOiAyMHB4O1xyXG59XHJcbi5zdGVwLmRpc2FibGVkIHtcclxuICAgIG9wYWNpdHk6IDUwJTtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvd2VsY29tZS93ZWxjb21lLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSw4QkFBOEI7O0FBRTlCO0lBQ0ksVUFBVTtJQUNWLFlBQVk7SUFDWixpQkFBaUI7SUFDakIsa0JBQWtCLEVBQUUsaUNBQWlDO0lBQ3JELGdCQUFnQjtJQUNoQiw4QkFBOEI7SUFDOUIsZUFBZTtJQUNmLHVCQUF1QjtJQUN2Qix1QkFBdUI7QUFDM0I7O0FBRUE7SUFDSSxZQUFZO0lBQ1osb0NBQW9DO0FBQ3hDOztBQUVBO0lBQ0ksdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixpQkFBaUI7QUFDckI7QUFDQTtJQUNJLFlBQVk7QUFDaEJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLyogV2VsY29tZSBwYWdlIChpbmRleC5odG1sKSAqL1xcclxcblxcclxcbi5zdGVwIHtcXHJcXG4gICAgd2lkdGg6IDYwJTtcXHJcXG4gICAgaGVpZ2h0OiA4MHB4O1xcclxcbiAgICBmb250LXNpemU6IDEuNzVlbTtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogMHB4OyAvKiBBZGRzIHNwYWNpbmcgYmV0d2VlbiBidXR0b25zICovXFxyXFxuICAgIG1hcmdpbi1sZWZ0OiAyMCU7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY2l0eWdyZWVuKTtcXHJcXG4gICAgYm9yZGVyLXdpZHRoOiAyO1xcclxcbiAgICBjb2xvcjogdmFyKC0tY2l0eWdyZWVuKTtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbi5zdGVwOmhvdmVyIHtcXHJcXG4gICAgY29sb3I6IHdoaXRlO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XFxyXFxufVxcclxcblxcclxcbiN3ZWxjb21lLXBhZ2Uge1xcclxcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgXFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7IFxcclxcbiAgICBwYWRkaW5nLXRvcDogMjBweDtcXHJcXG59XFxyXFxuLnN0ZXAuZGlzYWJsZWQge1xcclxcbiAgICBvcGFjaXR5OiA1MCU7XFxyXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///235\n')},314:module=>{eval('\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = "";\n var needLayer = typeof item[5] !== "undefined";\n if (item[4]) {\n content += "@supports (".concat(item[4], ") {");\n }\n if (item[2]) {\n content += "@media ".concat(item[2], " {");\n }\n if (needLayer) {\n content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += "}";\n }\n if (item[2]) {\n content += "}";\n }\n if (item[4]) {\n content += "}";\n }\n return content;\n }).join("");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === "string") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== "undefined") {\n if (typeof item[5] === "undefined") {\n item[5] = layer;\n } else {\n item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = "@media ".concat(item[2], " {").concat(item[1], "}");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = "".concat(supports);\n } else {\n item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE0LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanM/MjRmYiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcpIHtcbiAgdmFyIGxpc3QgPSBbXTtcblxuICAvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXG4gIGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjb250ZW50ID0gXCJcIjtcbiAgICAgIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2YgaXRlbVs1XSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgKz0gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtKTtcbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSkuam9pbihcIlwiKTtcbiAgfTtcblxuICAvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxuICBsaXN0LmkgPSBmdW5jdGlvbiBpKG1vZHVsZXMsIG1lZGlhLCBkZWR1cGUsIHN1cHBvcnRzLCBsYXllcikge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgdW5kZWZpbmVkXV07XG4gICAgfVxuICAgIHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XG4gICAgaWYgKGRlZHVwZSkge1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aGlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHZhciBpZCA9IHRoaXNba11bMF07XG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIF9rID0gMDsgX2sgPCBtb2R1bGVzLmxlbmd0aDsgX2srKykge1xuICAgICAgdmFyIGl0ZW0gPSBbXS5jb25jYXQobW9kdWxlc1tfa10pO1xuICAgICAgaWYgKGRlZHVwZSAmJiBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBsYXllciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW1bNV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtZWRpYSkge1xuICAgICAgICBpZiAoIWl0ZW1bMl0pIHtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3VwcG9ydHMpIHtcbiAgICAgICAgaWYgKCFpdGVtWzRdKSB7XG4gICAgICAgICAgaXRlbVs0XSA9IFwiXCIuY29uY2F0KHN1cHBvcnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNF0gPSBzdXBwb3J0cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGxpc3Q7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///314\n')},354:module=>{eval('\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === "function") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64);\n var sourceMapping = "/*# ".concat(data, " */");\n return [content].concat([sourceMapping]).join("\\n");\n }\n return [content].join("\\n");\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU0LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzP2FmMTIiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgdmFyIGNvbnRlbnQgPSBpdGVtWzFdO1xuICB2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG4gIGlmICghY3NzTWFwcGluZykge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG4gIGlmICh0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNzc01hcHBpbmcpKSkpO1xuICAgIHZhciBkYXRhID0gXCJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxcIi5jb25jYXQoYmFzZTY0KTtcbiAgICB2YXIgc291cmNlTWFwcGluZyA9IFwiLyojIFwiLmNvbmNhdChkYXRhLCBcIiAqL1wiKTtcbiAgICByZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oXCJcXG5cIik7XG4gIH1cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKFwiXFxuXCIpO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///354\n')},72:module=>{eval('\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = "".concat(id, " ").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcz8yZGJhIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc3R5bGVzSW5ET00gPSBbXTtcbmZ1bmN0aW9uIGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgdmFyIHJlc3VsdCA9IC0xO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlc0luRE9NLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0eWxlc0luRE9NW2ldLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgIHJlc3VsdCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKSB7XG4gIHZhciBpZENvdW50TWFwID0ge307XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV07XG4gICAgdmFyIGlkID0gb3B0aW9ucy5iYXNlID8gaXRlbVswXSArIG9wdGlvbnMuYmFzZSA6IGl0ZW1bMF07XG4gICAgdmFyIGNvdW50ID0gaWRDb3VudE1hcFtpZF0gfHwgMDtcbiAgICB2YXIgaWRlbnRpZmllciA9IFwiXCIuY29uY2F0KGlkLCBcIiBcIikuY29uY2F0KGNvdW50KTtcbiAgICBpZENvdW50TWFwW2lkXSA9IGNvdW50ICsgMTtcbiAgICB2YXIgaW5kZXhCeUlkZW50aWZpZXIgPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICB2YXIgb2JqID0ge1xuICAgICAgY3NzOiBpdGVtWzFdLFxuICAgICAgbWVkaWE6IGl0ZW1bMl0sXG4gICAgICBzb3VyY2VNYXA6IGl0ZW1bM10sXG4gICAgICBzdXBwb3J0czogaXRlbVs0XSxcbiAgICAgIGxheWVyOiBpdGVtWzVdXG4gICAgfTtcbiAgICBpZiAoaW5kZXhCeUlkZW50aWZpZXIgIT09IC0xKSB7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0ucmVmZXJlbmNlcysrO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnVwZGF0ZXIob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVwZGF0ZXIgPSBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMuYnlJbmRleCA9IGk7XG4gICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoaSwgMCwge1xuICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgICB1cGRhdGVyOiB1cGRhdGVyLFxuICAgICAgICByZWZlcmVuY2VzOiAxXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcbiAgfVxuICByZXR1cm4gaWRlbnRpZmllcnM7XG59XG5mdW5jdGlvbiBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKSB7XG4gIHZhciBhcGkgPSBvcHRpb25zLmRvbUFQSShvcHRpb25zKTtcbiAgYXBpLnVwZGF0ZShvYmopO1xuICB2YXIgdXBkYXRlciA9IGZ1bmN0aW9uIHVwZGF0ZXIobmV3T2JqKSB7XG4gICAgaWYgKG5ld09iaikge1xuICAgICAgaWYgKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiYgbmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiYgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcCAmJiBuZXdPYmouc3VwcG9ydHMgPT09IG9iai5zdXBwb3J0cyAmJiBuZXdPYmoubGF5ZXIgPT09IG9iai5sYXllcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhcGkudXBkYXRlKG9iaiA9IG5ld09iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZW1vdmUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB1cGRhdGVyO1xufVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobGlzdCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgbGlzdCA9IGxpc3QgfHwgW107XG4gIHZhciBsYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xuICAgIG5ld0xpc3QgPSBuZXdMaXN0IHx8IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tpXTtcbiAgICAgIHZhciBpbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhdLnJlZmVyZW5jZXMtLTtcbiAgICB9XG4gICAgdmFyIG5ld0xhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShuZXdMaXN0LCBvcHRpb25zKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9pZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW19pXTtcbiAgICAgIHZhciBfaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihfaWRlbnRpZmllcik7XG4gICAgICBpZiAoc3R5bGVzSW5ET01bX2luZGV4XS5yZWZlcmVuY2VzID09PSAwKSB7XG4gICAgICAgIHN0eWxlc0luRE9NW19pbmRleF0udXBkYXRlcigpO1xuICAgICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoX2luZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGFzdElkZW50aWZpZXJzID0gbmV3TGFzdElkZW50aWZpZXJzO1xuICB9O1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///72\n')},659:module=>{eval('\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === "undefined") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error("Couldn\'t find a style target. This probably means that the value for the \'insert\' parameter is invalid.");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjU5LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanM/YjIxNCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxudmFyIG1lbW8gPSB7fTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBnZXRUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgbWVtb1t0YXJnZXRdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdmFyIHN0eWxlVGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpO1xuXG4gICAgLy8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcbiAgICBpZiAod2luZG93LkhUTUxJRnJhbWVFbGVtZW50ICYmIHN0eWxlVGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuICAgICAgICAvLyBkdWUgdG8gY3Jvc3Mtb3JpZ2luIHJlc3RyaWN0aW9uc1xuICAgICAgICBzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgICBzdHlsZVRhcmdldCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIG1lbW9bdGFyZ2V0XSA9IHN0eWxlVGFyZ2V0O1xuICB9XG4gIHJldHVybiBtZW1vW3RhcmdldF07XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0QnlTZWxlY3RvcihpbnNlcnQsIHN0eWxlKSB7XG4gIHZhciB0YXJnZXQgPSBnZXRUYXJnZXQoaW5zZXJ0KTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGEgc3R5bGUgdGFyZ2V0LiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgJ2luc2VydCcgcGFyYW1ldGVyIGlzIGludmFsaWQuXCIpO1xuICB9XG4gIHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydEJ5U2VsZWN0b3I7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///659\n')},540:module=>{eval('\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement("style");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQwLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcz9kZTZjIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///540\n')},56:(module,__unused_webpack_exports,__webpack_require__)=>{eval('\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = true ? __webpack_require__.nc : 0;\n if (nonce) {\n styleElement.setAttribute("nonce", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzP2RkY2UiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzKHN0eWxlRWxlbWVudCkge1xuICB2YXIgbm9uY2UgPSB0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09IFwidW5kZWZpbmVkXCIgPyBfX3dlYnBhY2tfbm9uY2VfXyA6IG51bGw7XG4gIGlmIChub25jZSkge1xuICAgIHN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///56\n')},825:module=>{eval('\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = "";\n if (obj.supports) {\n css += "@supports (".concat(obj.supports, ") {");\n }\n if (obj.media) {\n css += "@media ".concat(obj.media, " {");\n }\n var needLayer = typeof obj.layer !== "undefined";\n if (needLayer) {\n css += "@layer".concat(obj.layer.length > 0 ? " ".concat(obj.layer) : "", " {");\n }\n css += obj.css;\n if (needLayer) {\n css += "}";\n }\n if (obj.media) {\n css += "}";\n }\n if (obj.supports) {\n css += "}";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== "undefined") {\n css += "\\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === "undefined") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODI1LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzP2U0NzkiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///825\n')},113:module=>{eval("\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEzLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanM/MWRkZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///113\n")}},__webpack_module_cache__={};function __webpack_require__(n){var c=__webpack_module_cache__[n];if(void 0!==c)return c.exports;var t=__webpack_module_cache__[n]={id:n,exports:{}};return __webpack_modules__[n](t,t.exports,__webpack_require__),t.exports}__webpack_require__.n=n=>{var c=n&&n.__esModule?()=>n.default:()=>n;return __webpack_require__.d(c,{a:c}),c},__webpack_require__.d=(n,c)=>{for(var t in c)__webpack_require__.o(c,t)&&!__webpack_require__.o(n,t)&&Object.defineProperty(n,t,{enumerable:!0,get:c[t]})},__webpack_require__.o=(n,c)=>Object.prototype.hasOwnProperty.call(n,c),__webpack_require__.nc=void 0;var __webpack_exports__=__webpack_require__(863)})();
\ No newline at end of file
diff --git a/docs/d027d45141f87dc014af.png b/docs/d027d45141f87dc014af.png
new file mode 100644
index 0000000..856d278
Binary files /dev/null and b/docs/d027d45141f87dc014af.png differ
diff --git a/docs/index.html b/docs/index.html
new file mode 100644
index 0000000..16786ec
--- /dev/null
+++ b/docs/index.html
@@ -0,0 +1 @@
+Budget Request Form