diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..5127805
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,29 @@
+# Ignore all .xlsx files
+# *.xlsx
+
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
+.env.test
diff --git a/README.md b/README.md
index 7937161..f060a01 100644
--- a/README.md
+++ b/README.md
@@ -3,3 +3,29 @@
Still in development.
See deployment here: https://kwheelan.github.io/Departmental-Budget-Request-Form
+
+## Contributing
+
+This repo uses yarn for package management and webpack for a
+development server and production bundler.
+
+### Setup
+
+Install Node.js (recommend using [nvm](https://github.com/nvm-sh/nvm)) and [yarn](https://classic.yarnpkg.com/lang/en/docs/install/) if you don't have it already.
+
+Install package dependencies:
+```bash
+yarn
+```
+
+Run the development server:
+```bash
+yarn start
+```
+
+### Creating a New Release
+
+Run webpack bundler:
+```bash
+yarn build
+```
diff --git a/build/bundle.js b/build/bundle.js
new file mode 100644
index 0000000..1ed0848
--- /dev/null
+++ b/build/bundle.js
@@ -0,0 +1 @@
+(()=>{"use strict";var __webpack_modules__={496:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n uV: () => (/* binding */ DATA_ROOT),\n P5: () => (/* binding */ FISCAL_YEAR),\n zu: () => (/* binding */ REVENUE),\n Qn: () => (/* binding */ TARGET),\n I9: () => (/* binding */ cola),\n aF: () => (/* binding */ fringe),\n Wr: () => (/* binding */ merit)\n});\n\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\nvar injectStylesIntoStyleTag = __webpack_require__(72);\nvar injectStylesIntoStyleTag_default = /*#__PURE__*/__webpack_require__.n(injectStylesIntoStyleTag);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleDomAPI.js\nvar styleDomAPI = __webpack_require__(825);\nvar styleDomAPI_default = /*#__PURE__*/__webpack_require__.n(styleDomAPI);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertBySelector.js\nvar insertBySelector = __webpack_require__(659);\nvar insertBySelector_default = /*#__PURE__*/__webpack_require__.n(insertBySelector);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\nvar setAttributesWithoutAttributes = __webpack_require__(56);\nvar setAttributesWithoutAttributes_default = /*#__PURE__*/__webpack_require__.n(setAttributesWithoutAttributes);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertStyleElement.js\nvar insertStyleElement = __webpack_require__(540);\nvar insertStyleElement_default = /*#__PURE__*/__webpack_require__.n(insertStyleElement);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleTagTransform.js\nvar styleTagTransform = __webpack_require__(113);\nvar styleTagTransform_default = /*#__PURE__*/__webpack_require__.n(styleTagTransform);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/css/common.css\nvar common = __webpack_require__(404);\n;// CONCATENATED MODULE: ./src/css/common.css\n\n \n \n \n \n \n \n \n \n \n\nvar options = {};\n\noptions.styleTagTransform = (styleTagTransform_default());\noptions.setAttributes = (setAttributesWithoutAttributes_default());\noptions.insert = insertBySelector_default().bind(null, \"head\");\noptions.domAPI = (styleDomAPI_default());\noptions.insertStyleElement = (insertStyleElement_default());\n\nvar update = injectStylesIntoStyleTag_default()(common/* default */.A, options);\n\n\n\n\n /* harmony default export */ const css_common = (common/* default */.A && common/* default */.A.locals ? common/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/utils/data_utils/local_storage_handlers.js\n/**\n * Saves employee table data and budget counters in local storage.\n */\nfunction saveTableData(table_id = \"employee-table\", save_as = 'employeeTableData') {\n var table = document.getElementById(table_id);\n var rows = table.rows;\n var tableData = [];\n for (var i = 0; i < rows.length; i++) {\n var cols = rows[i].cells;\n var rowData = [];\n for (var j = 0; j < cols.length; j++) {\n // for the action buttons, save the chosen action, not the button text\n if (cols[j].querySelector('button')) {\n rowData.push(rows[i].className);\n } else {\n rowData.push(cols[j].innerText);\n }\n }\n tableData.push(rowData);\n }\n\n // Save JSON string to localStorage\n localStorage.setItem(save_as, JSON.stringify(tableData));\n saveCounters();\n}\n\n/**\n * Loads employee table data and budget counters from local storage.\n * \n */\nfunction loadTableData(table_name_in_storage = \"employeeTableData\") {\n var data = localStorage.getItem(table_name_in_storage);\n if (data) {\n var tableData = JSON.parse(data);\n var table = document.getElementById(\"employee-table\");\n\n // It's good practice to empty the existing table first\n while (table.rows.length > 1) {\n table.deleteRow(1);\n }\n\n // Now, add the loaded rows to the table\n for (var i = 1; i < tableData.length; i++) {\n var newRow = table.insertRow(-1);\n var ncols = tableData[i].length;\n for (var j = 0; j < ncols - 1; j++) {\n var newCell = newRow.insertCell(j);\n newCell.innerText = tableData[i][j];\n // Add the cost column \n if (j == ncols - 2) {\n newCell.classList.add('cost');\n newCell.setAttribute('cost', unformatCurrency(tableData[i][j]));\n }\n }\n // Add the action buttons and load saved class\n var lastCell = newRow.insertCell(ncols - 1);\n lastCell.innerHTML = `\n
\n \n \n \n
\n `;\n newRow.classList.add(tableData[i][ncols - 1]);\n }\n\n //retrieve counter values\n loadCounters();\n }\n}\n\n// also save counters in sidebar\nfunction saveCounters() {\n localStorage.setItem('personnel_baseline', personnel_baseline.toString());\n localStorage.setItem('personnel_supp', personnel_supp.toString());\n // Add more here\n}\n\n// load counters in sidebar\nfunction loadCounters() {\n personnel_baseline = parseInt(localStorage.getItem('personnel_baseline'), 10);\n personnel_supp = parseInt(localStorage.getItem('personnel_supp'), 10);\n updateDisplay();\n}\n\n// save page state\nfunction updatePageState(page) {\n localStorage.setItem('page_state', page);\n}\n\n// load page state\nfunction loadPageState(page) {\n const pageState = localStorage.getItem('page_state');\n return pageState !== null ? pageState : 'welcome';\n}\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\nconst Subtitle = {\n update: function (subtitle) {\n // get current fund\n var fund = localStorage.getItem(\"fund\");\n if (fund) {\n var subtitle = `${subtitle}: ${fund}`;\n }\n document.getElementById(\"subtitle\").textContent = subtitle;\n }\n};\n/* harmony default export */ const components_header_header = (Subtitle);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/welcome/welcome.css\nvar welcome = __webpack_require__(235);\n;// CONCATENATED MODULE: ./src/js/components/welcome/welcome.css\n\n \n \n \n \n \n \n \n \n \n\nvar welcome_options = {};\n\nwelcome_options.styleTagTransform = (styleTagTransform_default());\nwelcome_options.setAttributes = (setAttributesWithoutAttributes_default());\nwelcome_options.insert = insertBySelector_default().bind(null, \"head\");\nwelcome_options.domAPI = (styleDomAPI_default());\nwelcome_options.insertStyleElement = (insertStyleElement_default());\n\nvar welcome_update = injectStylesIntoStyleTag_default()(welcome/* default */.A, welcome_options);\n\n\n\n\n /* harmony default export */ const welcome_welcome = (welcome/* default */.A && welcome/* default */.A.locals ? welcome/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/welcome/welcome.js\n\n\n// Hide and unhide welcome buttons\nfunction unhideWelcomeButtons() {\n document.getElementById(\"welcome-page\").style.display = \"block\";\n}\nfunction hideWelcomeButtons() {\n document.getElementById(\"welcome-page\").style.display = \"none\";\n}\nconst Welcome = {\n show: unhideWelcomeButtons,\n hide: hideWelcomeButtons\n};\n/* harmony default export */ const components_welcome_welcome = (Welcome);\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/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 //removeAllModalLinks()\n}\n\n// function removeAllModalLinks(){\n// TODO\n// }\n\nfunction hideModal(modal_id) {\n $('#' + modal_id).modal('hide');\n}\nfunction showModal(modal_id) {\n $('#' + modal_id).modal('show');\n}\nfunction showModalHandler() {\n showModal('main-modal');\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: function () {\n hideModal('main-modal');\n },\n show: function () {\n showModal('main-modal');\n },\n clear: clearModal,\n Title: Title,\n Link: Link\n};\n/* harmony default export */ const components_modal_modal = (Modal);\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\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 disable('btn-next');\n}\nfunction hideNavButtons() {\n document.getElementById('nav-btns').style.display = 'none';\n}\nfunction showNavButtons() {\n document.getElementById('nav-btns').style.display = 'block';\n initializeNavButtons();\n}\nfunction disable(button_id) {\n document.getElementById(button_id).classList.add('disabled');\n}\nfunction enable(button_id) {\n document.getElementById(button_id).classList.remove('disabled');\n}\nconst Next = {\n disable: function () {\n disable('btn-next');\n },\n enable: function () {\n enable('btn-next');\n }\n};\nconst Last = {\n disable: function () {\n disable('btn-last');\n },\n enable: function () {\n enable('btn-last');\n }\n};\nconst NavButtons = {\n hide: hideNavButtons,\n show: showNavButtons,\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/prompt/prompt.css\nvar prompt_prompt = __webpack_require__(225);\n;// CONCATENATED MODULE: ./src/js/components/prompt/prompt.css\n\n \n \n \n \n \n \n \n \n \n\nvar prompt_options = {};\n\nprompt_options.styleTagTransform = (styleTagTransform_default());\nprompt_options.setAttributes = (setAttributesWithoutAttributes_default());\nprompt_options.insert = insertBySelector_default().bind(null, \"head\");\nprompt_options.domAPI = (styleDomAPI_default());\nprompt_options.insertStyleElement = (insertStyleElement_default());\n\nvar prompt_update = injectStylesIntoStyleTag_default()(prompt_prompt/* default */.A, prompt_options);\n\n\n\n\n /* harmony default export */ const components_prompt_prompt = (prompt_prompt/* default */.A && prompt_prompt/* default */.A.locals ? prompt_prompt/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/prompt/subcomponents/text.js\nfunction showPrompt() {\n document.getElementById(\"prompt-div\").style.display = \"block\";\n}\nfunction hidePrompt() {\n document.getElementById('prompt-div').style.display = 'none';\n}\nfunction updatePrompt(prompt) {\n document.getElementById('prompt').textContent = prompt;\n showPrompt();\n}\nconst Text = {\n show: showPrompt,\n hide: hidePrompt,\n update: function (text) {\n updatePrompt(text);\n }\n};\n/* harmony default export */ const subcomponents_text = (Text);\n;// CONCATENATED MODULE: ./src/js/components/prompt/subcomponents/buttons.js\nfunction showPromptButton(id) {\n // make buttons visible\n document.getElementById(id).style.display = 'inline';\n}\nfunction updatePromptButton(id, text) {\n document.getElementById(id).textContent = text;\n showPromptButton(id);\n}\nfunction hidePromptButton(id) {\n document.getElementById(id).style.display = 'none';\n}\nfunction unclickAll() {\n document.getElementById('option1').classList.remove('clicked');\n document.getElementById('option2').classList.remove('clicked');\n}\nfunction applyClickedStyle(button) {\n unclickAll();\n button.classList.add('clicked');\n}\nfunction addPromptButtonAction(button_id, action_fn) {\n const buttonElement = document.getElementById(button_id);\n buttonElement.addEventListener('click', action_fn);\n buttonElement.addEventListener('click', function () {\n applyClickedStyle(this);\n });\n}\nfunction removePromptButtonAction(button_id, action_fn) {\n document.getElementById(button_id).removeEventListener('click', action_fn);\n}\nconst Left = {\n show: function () {\n showPromptButton('option1');\n },\n hide: function () {\n hidePromptButton('option1');\n },\n updateText: function (text) {\n updatePromptButton('option1', text);\n },\n addAction: function (action_fn) {\n addPromptButtonAction('option1', action_fn);\n },\n removeAction: function (action_fn) {\n removePromptButtonAction('option1', action_fn);\n }\n};\nconst Right = {\n show: function () {\n showPromptButton('option2');\n },\n hide: function () {\n hidePromptButton('option2');\n },\n updateText: function (text) {\n updatePromptButton('option2', text);\n },\n addAction: function (action_fn) {\n addPromptButtonAction('option2', action_fn);\n },\n removeAction: function (action_fn) {\n removePromptButtonAction('option2', action_fn);\n }\n};\nconst Buttons = {\n Left: Left,\n Right: Right,\n show: function () {\n showPromptButton('option1');\n showPromptButton('option2');\n },\n hide: function () {\n hidePromptButton('option1');\n hidePromptButton('option2');\n },\n reset: unclickAll\n};\n/* harmony default export */ const buttons = (Buttons);\n;// CONCATENATED MODULE: ./src/js/components/prompt/prompt.js\n\n\n\nconst Prompt = {\n Text: subcomponents_text,\n Buttons: buttons,\n hide: function () {\n subcomponents_text.hide();\n buttons.hide();\n },\n show: function () {\n subcomponents_text.show();\n buttons.show();\n }\n};\n/* harmony default export */ const js_components_prompt_prompt = (Prompt);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/sidebar/sidebar.css\nvar sidebar = __webpack_require__(263);\n;// CONCATENATED MODULE: ./src/js/components/sidebar/sidebar.css\n\n \n \n \n \n \n \n \n \n \n\nvar sidebar_options = {};\n\nsidebar_options.styleTagTransform = (styleTagTransform_default());\nsidebar_options.setAttributes = (setAttributesWithoutAttributes_default());\nsidebar_options.insert = insertBySelector_default().bind(null, \"head\");\nsidebar_options.domAPI = (styleDomAPI_default());\nsidebar_options.insertStyleElement = (insertStyleElement_default());\n\nvar sidebar_update = injectStylesIntoStyleTag_default()(sidebar/* default */.A, sidebar_options);\n\n\n\n\n /* harmony default export */ const sidebar_sidebar = (sidebar/* default */.A && sidebar/* default */.A.locals ? sidebar/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/utils/common_utils.js\n// Function to format number as currency\nconst formatCurrency = (amount, return_zero = false) => {\n var amount = Math.round(parseFloat(amount));\n if (amount == NaN) {\n return \"$ -\";\n }\n if (amount < 0) {\n return '($' + amount.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',') + ')';\n } else if (amount == 0) {\n if (return_zero) {\n return '$0';\n }\n return \"$ -\";\n }\n return '$' + amount.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n};\n\n// function to convert formatted number to a float\nconst common_utils_unformatCurrency = formattedAmount => {\n // Remove any currency symbols and commas\n let numericalPart = formattedAmount.replace(/[^0-9.-]+/g, \"\");\n return parseFloat(numericalPart);\n};\nfunction displayWithCommas(value) {\n return formatCurrency(value).replace('$', '');\n}\nfunction delay(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\nasync function pauseExecution(seconds) {\n await delay(seconds * 1000); // convert to milliseconds\n}\n;// CONCATENATED MODULE: ./src/js/components/sidebar/sidebar.js\n\n\n\n\n// Assuming you have a CSS variable --main-color defined on the :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 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 target to sidebar\n addTarget(TARGET);\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 updateSidebarStat(stat_id, new_figure) {\n replaceSidebarStat(stat_id, new_figure);\n // TODO: save in memory\n updateTotals();\n}\nfunction replaceSidebarStat(stat_id, new_figure) {\n const span = document.querySelector(`#${stat_id} .stat`);\n span.setAttribute('value', new_figure);\n span.textContent = formatCurrency(new_figure);\n}\nfunction incrementSidebarStat(stat_id, new_figure) {\n updateSidebarStat(stat_id, fetchStat(stat_id) + new_figure);\n}\nfunction fetchStat(stat_id) {\n const stat = document.querySelector(`#${stat_id} .stat`);\n return parseFloat(stat.getAttribute('value')) || 0;\n}\n\n// Function to update the display of the current and supp variables\nfunction updateTotals() {\n // update bottom lines\n let supp_total = -fetchStat('supp-revenue') + fetchStat('supp-personnel') + fetchStat('supp-nonpersonnel');\n let baseline_total = -fetchStat('baseline-revenue') + fetchStat('baseline-personnel') + fetchStat('baseline-nonpersonnel');\n replaceSidebarStat('supp-total', supp_total);\n replaceSidebarStat('baseline-total', baseline_total);\n\n // color code based on target\n var target = fetchStat('target');\n if (baseline_total <= target) {\n document.querySelector('#baseline-total .stat').style.color = \"green\";\n }\n if (baseline_total > target) {\n document.querySelector('#baseline-total .stat').style.color = \"red\";\n }\n}\nfunction addTarget(target) {\n replaceSidebarStat('target', target);\n}\nfunction updateTitle(title) {\n document.querySelector('#sidebar-title').textContent = title;\n}\nconst Sidebar = {\n hide: hideSidebar,\n show: showSidebar,\n updateTitle: updateSidebarTitle,\n updateStat: updateSidebarStat,\n incrementStat: incrementSidebarStat,\n addTarget: addTarget,\n updateTitle: updateTitle\n};\n/* harmony default export */ const components_sidebar_sidebar = (Sidebar);\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(header_array) {\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 for (const headerText of header_array) {\n // Create a header cell element\n const headerCell = document.createElement('th');\n headerCell.textContent = headerText;\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\nfunction addNewRow(data_dictionary) {\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(Object.keys(data_dictionary));\n }\n\n // add row of data\n const new_row = document.createElement('tr');\n const cell_data_array = Object.values(data_dictionary);\n for (const cell_data of cell_data_array) {\n // Create new cell and add it to the row\n const newCell = document.createElement('td');\n newCell.textContent = cell_data;\n new_row.appendChild(newCell);\n }\n console.log(new_row);\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 } else {\n cell.textContent = enteredValue;\n }\n // set value attribute to the new user input\n cell.setAttribute('value', enteredValue);\n }\n });\n}\nconst Rows = {\n add: function (data_dictionary) {\n addNewRow(data_dictionary);\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}\n\n// EDIT button\n\nfunction handleRowEdit(makeRowEditable, updateCallback) {\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\n makeRowEditable();\n\n // hide edit buttons\n Edit.hide();\n initializeConfirmButton(updateCallback);\n });\n }\n ;\n}\n\n// Confirm button\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 (makeRowEditable, updateCallback) {\n handleRowEdit(makeRowEditable, 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\nasync function createDropdownFromJSON(json_path) {\n // Fetch JSON data from a file asynchronously\n const response = await fetch(json_path);\n const dataArray = await response.json();\n\n // Creating a select element\n const selectElement = document.createElement('select');\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.id; // Setting the option value to the item id\n optionElement.textContent = item.name; // Setting the display text to the item name\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 createFromJSON: function (json_path) {\n return createDropdownFromJSON(json_path);\n }\n};\n/* harmony default export */ const dropdown = (Dropdown);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/cells.js\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 return cell.textContent;\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) {\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('input');\n textbox.type = 'text';\n textbox.value = cell.textContent;\n // Clear the current content and append the textbox to the cell\n cell.innerHTML = '';\n cell.appendChild(textbox);\n}\nasync function createSelectCell(cellClass, json_filepath) {\n // get cell\n const cell = document.querySelector(`.active-editing td.${cellClass}`);\n // add service dropdown\n const serviceDropdown = await dropdown.createFromJSON(json_filepath);\n serviceDropdown.value = cell.textContent;\n // Clear the current content and append the textbox to the cell\n cell.innerHTML = '';\n cell.appendChild(serviceDropdown);\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) {\n createEditableCell(className);\n },\n createDropdown: function (className, json_filepath) {\n createSelectCell(className, json_filepath);\n }\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 if (!thead || thead.rows.length === 0) {\n console.error('The table header is not found or has no rows.');\n return;\n }\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 headerCellIndex = i;\n break;\n }\n }\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(`.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 cellValue = cell.textContent.trim();\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}\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};\n/* harmony default export */ const columns = (Column);\n;// CONCATENATED MODULE: ./src/js/utils/data_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}\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/data.js\n\nasync function loadJSONIntoTable(jsonFilePath) {\n const data = await fetchJSON(jsonFilePath);\n try {\n if (Array.isArray(data)) {\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.textContent = val;\n row.appendChild(cell);\n });\n tbody.appendChild(row);\n });\n } else {\n console.error('The provided JSON file does not contain an array of objects.');\n }\n } catch (error) {\n console.error('Failed to load and parse the JSON file:', error);\n }\n}\nconst Data = {\n loadFromJSON: loadJSONIntoTable\n};\n/* harmony default export */ const data = (Data);\n;// CONCATENATED MODULE: ./src/js/components/table/table.js\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 clearTable() {\n const table = document.getElementById('main-table');\n table.querySelector('thead').innerHTML = '';\n table.querySelector('tbody').innerHTML = '';\n}\nfunction showTable() {\n const table = document.getElementById('main-table');\n table.style.display = 'table';\n}\nfunction hideTable() {\n const table = document.getElementById('main-table');\n table.style.display = 'none';\n subcomponents_buttons.AddRow.hide();\n}\nconst Table = {\n Buttons: subcomponents_buttons,\n Cell: cells,\n Columns: columns,\n Header: headers,\n Rows: rows,\n Data: data,\n // functions\n adjustWidth: function (width_pct) {\n adjustTableWidth(width_pct);\n },\n clear: clearTable,\n hide: hideTable,\n show: showTable\n};\n/* harmony default export */ const components_table_table = (Table);\n;// CONCATENATED MODULE: ./src/js/components/body/body.js\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 // disable next button\n components_nav_buttons_nav_buttons.Next.disable();\n js_components_prompt_prompt.Buttons.reset();\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/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// type is 'input' or 'textarea'\n// inputType is for validation ('number' or 'text', etc)\nfunction appendFormElement(type, label, inputId, required, inputType, form_id = 'new-form', cost = false) {\n // change if we want forms elsewhere\n const form = document.getElementById(form_id);\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 // set type (input or textarea)\n let inputEl;\n if (type === 'input') {\n inputEl = document.createElement('input');\n inputEl.type = inputType;\n } else if (type === 'textarea') {\n inputEl = document.createElement('textarea');\n } else {\n throw new Error('Unsupported element type');\n }\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 = inputId;\n }\n\n // add elements\n wrapper.appendChild(labelEl);\n wrapper.appendChild(inputEl);\n form.appendChild(wrapper);\n}\nconst NewField = {\n shortText: function (label, inputId, required = false, form_id = 'new-form', cost = false) {\n appendFormElement('input', label, inputId, required, 'text', form_id);\n },\n longText: function (label, inputId, required = false, form_id = 'new-form', cost = false) {\n appendFormElement('textarea', label, inputId, required, form_id);\n },\n numericInput: function (label, inputId, required = false, form_id = 'new-form', cost = true) {\n appendFormElement('input', label, inputId, required, 'number', form_id);\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: dropdown,\n SubmitButton: subcomponents_submit\n};\n/* harmony default export */ const js_components_form_form = (Form);\n;// CONCATENATED MODULE: ./src/js/views/06_new_initiatives/helpers.js\n\n\n\n\n\n\n\n\nfunction initializePageView() {\n // Prepare page view\n components_body_body.reset();\n components_nav_buttons_nav_buttons.show();\n\n // Load text\n components_header_header.update('New Initiatives');\n js_components_prompt_prompt.Text.update('Do you have any new initiatives for FY26?');\n js_components_prompt_prompt.Buttons.Left.updateText('Yes');\n js_components_prompt_prompt.Buttons.Right.updateText('No');\n // clicking 'no new initialitives' will also take us to the next page\n js_components_prompt_prompt.Buttons.Right.addAction(pauseAndContinue);\n js_components_prompt_prompt.Buttons.Left.addAction(components_nav_buttons_nav_buttons.Next.enable);\n}\nfunction setUpModal() {\n // Initialize modal\n components_modal_modal.clear();\n components_modal_modal.Link.add('option1');\n components_modal_modal.Title.update('New initiative');\n components_modal_modal.Link.add('add-btn');\n}\nfunction setUpForm() {\n // Set up form\n js_components_form_form.new('modal-body');\n js_components_form_form.NewField.shortText('Initiative Name:', 'Initiative Name', true);\n js_components_form_form.NewField.longText('Explain why this initiative is necessary and describe its potential impact.', 'Explanation', true);\n js_components_form_form.NewField.numericInput('Estimate of ADDITONAL revenue associated with this initiative?', 'Revenue', true);\n js_components_form_form.NewField.numericInput('Estimate of ADDITONAL personnel cost?', 'Personnel Cost', true);\n js_components_form_form.NewField.numericInput('Estimate of ADDITONAL nonpersonnel cost?', 'Non-personnel Cost', true);\n js_components_form_form.SubmitButton.add();\n // Initialize form submission to table data\n handleFormSubmissions();\n}\nfunction setUpTable() {\n // Set up table\n components_table_table.clear();\n components_table_table.adjustWidth('70%');\n components_table_table.Buttons.AddRow.updateText('Add another new initiative');\n}\nfunction handleFormSubmissions(event) {\n // initialize form submission\n const modal = document.getElementById('main-modal');\n modal.addEventListener('submit', function (event) {\n event.preventDefault();\n // get answers from form, hide form, show answers in table\n const responses = js_components_form_form.fetchAllResponses(event);\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 js_components_prompt_prompt.hide();\n\n // add data to table\n components_table_table.Rows.add(responses);\n components_table_table.show();\n components_table_table.Buttons.AddRow.show();\n // TODO: save table data\n // TODO: edit cost to show currency correctly\n }\n });\n}\nfunction removeModalLinks() {\n components_modal_modal.Link.remove('option1');\n components_modal_modal.Link.remove('add-btn');\n}\nfunction removePromptButtonListeners() {\n js_components_prompt_prompt.Buttons.Right.removeAction(pauseAndContinue);\n js_components_prompt_prompt.Buttons.Left.removeAction(components_nav_buttons_nav_buttons.Next.enable);\n}\n;// CONCATENATED MODULE: ./src/js/views/06_new_initiatives/main.js\n\n\n\n// set up page and initialize all buttons\nfunction loadNewInitiatives() {\n updatePageState('new-inits');\n initializePageView();\n setUpModal();\n setUpForm();\n setUpTable();\n}\nfunction cleanUpInitiativesPage() {\n removeModalLinks();\n // remove event listeners on prompt buttons\n removePromptButtonListeners();\n}\n;// CONCATENATED MODULE: ./src/js/views/07_summary/main.js\n\n\n\n\n\n\nfunction loadSummaryPage() {\n //update page state\n updatePageState('summary');\n\n // prepare page view\n components_body_body.reset();\n js_components_prompt_prompt.Buttons.Left.updateText('Download Excel');\n js_components_prompt_prompt.Buttons.Right.updateText('Go back and edit');\n\n // update page text\n components_header_header.update('Summary');\n // TODO: update to make dynamic\n js_components_prompt_prompt.Text.update(`Placeholder for summary and any issues.`);\n js_components_prompt_prompt.Buttons.Right.addAction(returnToWelcome);\n}\nfunction cleanUpSummaryPage() {\n js_components_prompt_prompt.Buttons.Right.removeAction(returnToWelcome);\n}\nconst returnToWelcome = () => {\n visitPage('welcome');\n};\n;// CONCATENATED MODULE: ./src/js/views/02_baseline_landing_page/helpers.js\n\n\n\n\n\n\nconst fundCols = [{\n title: 'ID',\n className: 'fund-id'\n}, {\n title: 'Name',\n className: 'fund-name'\n}];\nfunction preparePageView() {\n localStorage.setItem(\"fund\", '');\n\n // prepare page view\n components_body_body.reset();\n components_nav_buttons_nav_buttons.show();\n\n // update page text\n components_header_header.update('Baseline Budget Request');\n // TODO: update to make dynamic\n js_components_prompt_prompt.Text.update(`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 to begin.`);\n}\nfunction allowRowSelection() {\n var tableRows = document.querySelectorAll(\"tbody tr\");\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}\nasync function initializeFundTable() {\n await components_table_table.Data.loadFromJSON(DATA_ROOT + 'funds.json');\n components_table_table.adjustWidth('100%');\n components_table_table.show();\n components_table_table.Columns.assignClasses(fundCols);\n allowRowSelection();\n}\nfunction selectFund(tableRows, selected_row) {\n // remove selected class from any other rows\n tableRows.forEach(function (tableRow) {\n tableRow.classList = '';\n });\n // add selected class to clicked row\n selected_row.classList.add('selected');\n // get fund and save selected fund\n var fund = selected_row.querySelector('.fund-name').textContent;\n localStorage.setItem(\"fund\", fund);\n\n // enable next step\n components_nav_buttons_nav_buttons.Next.enable();\n}\n;// CONCATENATED MODULE: ./src/js/views/02_baseline_landing_page/main.js\n\n\nfunction loadBaselineLandingPage() {\n //update page state\n updatePageState('baseline-landing');\n preparePageView();\n initializeFundTable();\n}\n;// CONCATENATED MODULE: ./src/js/views/01_upload/helpers.js\n\n\n\n\nfunction helpers_initializePageView() {\n // remove fund selection\n localStorage.setItem(\"fund\", '');\n\n // prepare page view\n components_body_body.reset();\n components_nav_buttons_nav_buttons.show();\n\n // update page text\n components_header_header.update('Excel Upload');\n\n // TODO: update to make upload actually work\n js_components_prompt_prompt.Text.update(`Placeholder for Excel Upload`);\n js_components_prompt_prompt.Buttons.Left.updateText('Upload');\n js_components_prompt_prompt.Buttons.Left.show();\n js_components_prompt_prompt.Buttons.Left.addAction(uploadExcelAction);\n}\nfunction uploadExcelAction() {\n components_nav_buttons_nav_buttons.Next.enable();\n}\n;// CONCATENATED MODULE: ./src/js/views/01_upload/main.js\n\n\nfunction loadUploadPage() {\n //update page state\n updatePageState('upload');\n helpers_initializePageView();\n}\n;// CONCATENATED MODULE: ./src/js/views/00_welcome/helpers.js\n\n\n\n\n\n\n\nfunction _00_welcome_helpers_initializePageView() {\n // page set up\n components_body_body.reset();\n components_header_header.update(\"Welcome\");\n components_welcome_welcome.show();\n}\nfunction addLinks() {\n // initialize links in buttons\n document.getElementById('step-upload').addEventListener('click', loadUploadPage);\n document.getElementById('step-initiatives').addEventListener('click', loadNewInitiatives);\n document.getElementById('step-revenue').addEventListener('click', loadBaselineLandingPage);\n document.getElementById('step-finish').addEventListener('click', loadSummaryPage);\n}\n;// CONCATENATED MODULE: ./src/js/views/00_welcome/main.js\n\n\nfunction initializeWelcomePage() {\n updatePageState('welcome');\n _00_welcome_helpers_initializePageView();\n addLinks();\n}\n;// CONCATENATED MODULE: ./src/js/views/03_revenue/main.js\n\n\n\n\n\n\n\n\nfunction loadRevenuePage() {\n //update page state\n updatePageState('revenue');\n\n // prepare page view\n components_body_body.reset();\n components_nav_buttons_nav_buttons.show();\n\n // update page text\n components_header_header.update('Revenue Projections');\n // TODO: update to make dynamic\n js_components_prompt_prompt.Text.update(`Your revenue projection for FY26 is ${formatCurrency(REVENUE, true)}`);\n js_components_prompt_prompt.Buttons.Left.updateText('Confirm');\n js_components_prompt_prompt.Buttons.Right.updateText(\"This doesn't look right\");\n\n // clicking 'confirm' will also take us to the next page\n js_components_prompt_prompt.Buttons.Left.addAction(pauseAndContinue);\n // TODO: allow user to edit revenue here\n js_components_prompt_prompt.Buttons.Right.addAction(handleRevenueEdit);\n}\nfunction handleRevenueEdit() {\n components_nav_buttons_nav_buttons.Next.enable();\n}\nfunction cleanupRevenuePage() {\n // remove event listeners on prompt buttons\n js_components_prompt_prompt.Buttons.Left.removeAction(pauseAndContinue);\n js_components_prompt_prompt.Buttons.Right.removeAction();\n}\n;\n;// CONCATENATED MODULE: ./src/js/views/04_personnel/helpers.js\n\n\n\n\n\n\n\n\n\nfunction helpers_preparePageView() {\n // prepare page view\n components_body_body.reset();\n components_nav_buttons_nav_buttons.show();\n components_sidebar_sidebar.show();\n components_table_table.adjustWidth('90%');\n // just enable next for now\n // TODO only enable when all info is entered\n components_nav_buttons_nav_buttons.Next.enable();\n\n // update page text\n components_header_header.update('Personnel');\n js_components_prompt_prompt.Text.update(`\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 `);\n}\nfunction assignClasses() {\n // record columns and their classes\n const personnelColumns = [{\n title: 'Job Name (Type)',\n className: 'job-name'\n }, {\n title: `FY${FISCAL_YEAR} FTEs`,\n className: 'baseline-ftes'\n }, {\n title: 'Service',\n className: 'service'\n }, {\n title: 'Total Cost',\n className: 'total-baseline',\n isCost: true\n }, {\n title: 'Average Projected Salary',\n className: 'avg-salary',\n isCost: true\n }];\n\n // assign cost classes\n components_table_table.Columns.assignClasses(personnelColumns);\n}\nfunction personnelRowOnEdit() {\n components_table_table.Cell.createTextbox('baseline-ftes');\n components_table_table.Cell.createDropdown('service', DATA_ROOT + 'services.json');\n}\nasync function initializePersonnelTable() {\n // load table data from json\n await components_table_table.Data.loadFromJSON(DATA_ROOT + 'personnel_data.json');\n //after table is loaded, fill it\n components_table_table.show();\n components_table_table.Columns.addAtEnd('0', 'Total Cost');\n components_table_table.Columns.addAtEnd(components_table_table.Buttons.edit_confirm_btns, ' ');\n ;\n assignClasses();\n // add up the baseline costs and update sidebar\n updateDisplayandTotals();\n // activate edit buttons\n components_table_table.Buttons.Edit.init(personnelRowOnEdit, updateDisplayandTotals);\n initializeRowAddition();\n}\nfunction initializeRowAddition() {\n components_table_table.Buttons.AddRow.updateText(\"Add new job\");\n components_table_table.Buttons.AddRow.show();\n}\nfunction calculateTotalCost(ftes, avg_salary, fringe, cola, merit) {\n return ftes * avg_salary * (1 + fringe) * (1 + cola) * (1 + merit);\n}\n\n// update sidebar and also cost totals when the FTEs are edited\nfunction updateDisplayandTotals() {\n // initialize\n components_sidebar_sidebar.updateStat('baseline-personnel', 0);\n components_sidebar_sidebar.updateStat('supp-personnel', 0);\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 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 = calculateTotalCost(baseline_ftes, avg_salary, fringe, cola, merit);\n\n // update counter and total\n components_sidebar_sidebar.incrementStat('baseline-personnel', total_baseline_cost);\n components_table_table.Cell.updateValue(rows[i], 'total-baseline', total_baseline_cost);\n }\n}\nfunction helpers_setUpModal() {\n // Initialize modal\n components_modal_modal.clear();\n components_modal_modal.Link.add('add-btn');\n components_modal_modal.Title.update('New job');\n}\nfunction helpers_setUpForm() {\n // Set up form\n js_components_form_form.new('modal-body');\n js_components_form_form.NewField.shortText('Job Name:', 'job-name', true);\n js_components_form_form.NewField.shortText('Account String:', 'account-string', true);\n js_components_form_form.SubmitButton.add();\n // Initialize form submission to table data\n helpers_handleFormSubmissions();\n}\nfunction helpers_handleFormSubmissions(event) {\n // initialize form submission\n\n const modal = document.getElementById('main-modal');\n modal.addEventListener('submit', function (event) {\n event.preventDefault();\n // get answers from form, hide form, show answers in table\n const responses = js_components_form_form.fetchAllResponses(event);\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);\n components_table_table.show();\n components_table_table.Buttons.AddRow.show();\n // TODO: save table data\n // TODO: edit cost to show currency correctly\n }\n });\n}\n;// CONCATENATED MODULE: ./src/js/views/04_personnel/main.js\n\n\nfunction loadPersonnelPage() {\n updatePageState('personnel');\n helpers_preparePageView();\n initializePersonnelTable();\n helpers_setUpModal();\n helpers_setUpForm();\n}\n;// CONCATENATED MODULE: ./src/js/views/04.5_OT/main.js\n\n\n\n\n\n\nfunction loadOTPage() {\n //update page state\n updatePageState('overtime');\n\n // prepare page view\n components_body_body.reset();\n components_nav_buttons_nav_buttons.show();\n components_sidebar_sidebar.show();\n\n // just enable next for now\n // TODO: only enable when all info is entered\n components_nav_buttons_nav_buttons.Next.enable();\n\n // update page text\n components_header_header.update('Overtime Estimates');\n // TODO: update to make dynamic\n js_components_prompt_prompt.Text.update(`This is a placeholder for the OT estimates.`);\n}\n;// CONCATENATED MODULE: ./src/js/views/05_nonpersonnel/helpers.js\n\n\n\n\n\n\n\n\nconst nonPersonnelColumns = [{\n title: 'FY26 Request',\n className: 'request',\n isCost: true\n}, {\n title: 'Amount Remaining',\n className: 'remaining',\n isCost: true\n}];\nfunction _05_nonpersonnel_helpers_preparePageView() {\n // prepare page view\n components_body_body.reset();\n components_nav_buttons_nav_buttons.show();\n components_sidebar_sidebar.show();\n components_table_table.adjustWidth('100%');\n // update page text\n components_header_header.update('Non-Personnel');\n js_components_prompt_prompt.Text.update('Select an action item for each non-personnel line item from last year.');\n\n // just enable next for now\n // TODO: only enable when all info is entered\n components_nav_buttons_nav_buttons.Next.enable();\n}\nasync function initializeNonpersonnelTable() {\n // load table data from json\n await components_table_table.Data.loadFromJSON(DATA_ROOT + 'nonpersonnel_data.json', 'main-table');\n //after table is loaded, fill it\n components_table_table.show();\n components_table_table.Columns.addAtEnd(components_table_table.Buttons.edit_confirm_btns, \" \");\n // assign cost classes\n components_table_table.Columns.assignClasses(nonPersonnelColumns);\n // update sidebar\n helpers_updateDisplayandTotals();\n // enable editing\n components_table_table.Buttons.Edit.init(nonPersonnelRowOnEdit, helpers_updateDisplayandTotals);\n}\nfunction nonPersonnelRowOnEdit() {\n // convert request to numeric from formatted currency\n const request = document.querySelector('.active-editing > td.request');\n request.textContent = request.textContent.replace('$', '');\n // make it editable\n components_table_table.Cell.createTextbox('request');\n}\n\n// update sidebar and also cost totals when the FTEs are edited\nfunction helpers_updateDisplayandTotals() {\n // initialize\n components_sidebar_sidebar.updateStat('baseline-nonpersonnel', 0);\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 request = components_table_table.Cell.getValue(rows[i], 'request');\n\n // update counters\n components_sidebar_sidebar.incrementStat('baseline-nonpersonnel', request);\n }\n}\n;// CONCATENATED MODULE: ./src/js/views/05_nonpersonnel/main.js\n\n\nfunction loadNonpersonnelPage() {\n updatePageState('nonpersonnel');\n _05_nonpersonnel_helpers_preparePageView();\n initializeNonpersonnelTable();\n}\n;// CONCATENATED MODULE: ./src/js/views/view_logic.js\n\n\n\n\n\n\n\n\n\n\n\nlet PAGES = {\n 'welcome': initializeWelcomePage,\n 'upload': loadUploadPage,\n 'baseline-landing': loadBaselineLandingPage,\n 'revenue': loadRevenuePage,\n 'personnel': loadPersonnelPage,\n 'overtime': loadOTPage,\n 'nonpersonnel': loadNonpersonnelPage,\n 'new-inits': loadNewInitiatives,\n 'summary': loadSummaryPage\n};\nlet CLEANUP = {\n 'new-inits': cleanUpInitiativesPage,\n 'revenue': cleanupRevenuePage,\n 'summary': cleanUpSummaryPage\n};\nfunction visitPage(new_page_key) {\n // clean up from current page\n var page_state = loadPageState();\n if (CLEANUP[page_state]) {\n CLEANUP[page_state]();\n }\n ;\n // Use the page_state to access and call the corresponding function from PAGES\n if (PAGES[new_page_key]) {\n PAGES[new_page_key](); // Invokes the function if it exists in the PAGES map\n } else {\n console.error(`No page initializer found for state: ${new_page_key}`);\n }\n PAGES[new_page_key]();\n}\nfunction nextPage() {\n var page_state = loadPageState();\n const keys = Object.keys(PAGES);\n\n // Find the index of the current key\n const currentIndex = keys.indexOf(page_state);\n\n // clean up current page\n if (CLEANUP[page_state]) {\n CLEANUP[page_state]();\n }\n ;\n\n // Check if there is a next key\n if (currentIndex >= 0 && currentIndex < keys.length - 1) {\n // Get the next key\n const nextKey = keys[currentIndex + 1];\n // go to that page\n visitPage(nextKey);\n }\n}\nfunction lastPage() {\n var page_state = loadPageState();\n const keys = Object.keys(PAGES);\n\n // Find the index of the current key\n const currentIndex = keys.indexOf(page_state);\n\n // clean up current page\n if (CLEANUP[page_state]) {\n CLEANUP[page_state]();\n }\n ;\n\n // Check if there is a next key\n if (currentIndex >= 1) {\n // Get the next key\n const lastKey = keys[currentIndex - 1];\n // go to that page\n visitPage(lastKey);\n }\n}\nasync function pauseAndContinue() {\n await pauseExecution(0.5);\n nextPage();\n}\n;// CONCATENATED MODULE: ./src/js/init.js\n// import styles\n\n\n// import functions\n\n\n\n// path for my laptop\n// export let DATA_ROOT = '../../../data/law_dept_sample/'\n// github path\nlet DATA_ROOT = '../../budget-request-demo/data/law_dept_sample/';\nlet REVENUE = 0;\nlet TARGET = 2000000;\nvar FISCAL_YEAR = '26';\n\n// variables on the salary \nvar fringe = 0.36;\nvar cola = 0.02;\nvar merit = 0.02;\ndocument.addEventListener('DOMContentLoaded', function () {\n var page_state = loadPageState();\n visitPage(page_state);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDk2LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQy9GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeEJBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeEJBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hCQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDbEVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQ2xDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FDcEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDN0JBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNqRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQzFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTs7QUN4QkE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDL0RBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNqSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7QUM5Q0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUMvQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNwREE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBOztBQ3pCQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQ1JBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDdEJBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQ3hJQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FDaEVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZGQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9jc3MvY29tbW9uLmNzcz84ZmY2Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdXRpbHMvZGF0YV91dGlscy9sb2NhbF9zdG9yYWdlX2hhbmRsZXJzLmpzP2ZlODEiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuY3NzPzcyZDciLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuanM/YTBhNSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvd2VsY29tZS93ZWxjb21lLmNzcz9kZWUxIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy93ZWxjb21lL3dlbGNvbWUuanM/NTM1YSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvYm9keS9ib2R5LmNzcz9kMWM3Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9tb2RhbC9tb2RhbC5jc3M/NDBkYiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvbW9kYWwvbW9kYWwuanM/NTUzMyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuY3NzPzcwN2YiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL25hdl9idXR0b25zL25hdl9idXR0b25zLmpzP2FiZDEiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3Byb21wdC9wcm9tcHQuY3NzPzMyOGIiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3Byb21wdC9zdWJjb21wb25lbnRzL3RleHQuanM/ZjZkZiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvcHJvbXB0L3N1YmNvbXBvbmVudHMvYnV0dG9ucy5qcz84ZDNiIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9wcm9tcHQvcHJvbXB0LmpzP2E3NzEiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3NpZGViYXIvc2lkZWJhci5jc3M/M2JjNyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3V0aWxzL2NvbW1vbl91dGlscy5qcz80NGYyIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9zaWRlYmFyL3NpZGViYXIuanM/ODBmMCIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY3NzPzc4NGMiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3N1YmNvbXBvbmVudHMvaGVhZGVycy5qcz8xNjIzIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy90YWJsZS9zdWJjb21wb25lbnRzL3Jvd3MuanM/ZmI3OSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvdGFibGUvc3ViY29tcG9uZW50cy9idXR0b25zLmpzP2M5OTIiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2Zvcm0vc3ViY29tcG9uZW50cy9kcm9wZG93bi5qcz9iYTZiIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy90YWJsZS9zdWJjb21wb25lbnRzL2NlbGxzLmpzPzczY2IiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3N1YmNvbXBvbmVudHMvY29sdW1ucy5qcz82NzRhIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdXRpbHMvZGF0YV91dGlscy9KU09OX2RhdGFfaGFuZGxlcnMuanM/NzY3YSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvdGFibGUvc3ViY29tcG9uZW50cy9kYXRhLmpzP2Q5YjYiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmpzPzMwNzEiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2JvZHkvYm9keS5qcz9mOWJhIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9mb3JtL2Zvcm0uY3NzPzU0MTUiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2Zvcm0vc3ViY29tcG9uZW50cy9maWVsZHMuanM/NDU5ZiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvZm9ybS9zdWJjb21wb25lbnRzL3N1Ym1pdC5qcz9jNTk2Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9mb3JtL2Zvcm0uanM/ZDk0MiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzA2X25ld19pbml0aWF0aXZlcy9oZWxwZXJzLmpzPzYxNTIiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wNl9uZXdfaW5pdGlhdGl2ZXMvbWFpbi5qcz9kY2NkIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3MvMDdfc3VtbWFyeS9tYWluLmpzPzAwNTkiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wMl9iYXNlbGluZV9sYW5kaW5nX3BhZ2UvaGVscGVycy5qcz85NWI2Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3MvMDJfYmFzZWxpbmVfbGFuZGluZ19wYWdlL21haW4uanM/ZDQ1OCIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzAxX3VwbG9hZC9oZWxwZXJzLmpzPzVmYmUiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wMV91cGxvYWQvbWFpbi5qcz8yYThmIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3MvMDBfd2VsY29tZS9oZWxwZXJzLmpzP2U3OWMiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wMF93ZWxjb21lL21haW4uanM/YmVhNiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzAzX3JldmVudWUvbWFpbi5qcz8wNjQ3Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3MvMDRfcGVyc29ubmVsL2hlbHBlcnMuanM/ODc3YyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzA0X3BlcnNvbm5lbC9tYWluLmpzPzUxMjYiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wNC41X09UL21haW4uanM/NjU3OSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzA1X25vbnBlcnNvbm5lbC9oZWxwZXJzLmpzP2Y4ODAiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wNV9ub25wZXJzb25uZWwvbWFpbi5qcz9hZmNjIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3Mvdmlld19sb2dpYy5qcz80NmM2Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvaW5pdC5qcz8xYjJhIl0sInNvdXJjZXNDb250ZW50IjpbIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9jb21tb24uY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vY29tbW9uLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIi8qKlxuICogU2F2ZXMgZW1wbG95ZWUgdGFibGUgZGF0YSBhbmQgYnVkZ2V0IGNvdW50ZXJzIGluIGxvY2FsIHN0b3JhZ2UuXG4gKi9cbmZ1bmN0aW9uIHNhdmVUYWJsZURhdGEodGFibGVfaWQgPSBcImVtcGxveWVlLXRhYmxlXCIsIHNhdmVfYXMgPSAnZW1wbG95ZWVUYWJsZURhdGEnKSB7XG4gICAgdmFyIHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFibGVfaWQpO1xuICAgIHZhciByb3dzID0gdGFibGUucm93cztcbiAgICB2YXIgdGFibGVEYXRhID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNvbHMgPSByb3dzW2ldLmNlbGxzO1xuICAgICAgICB2YXIgcm93RGF0YSA9IFtdO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIC8vIGZvciB0aGUgYWN0aW9uIGJ1dHRvbnMsIHNhdmUgdGhlIGNob3NlbiBhY3Rpb24sIG5vdCB0aGUgYnV0dG9uIHRleHRcbiAgICAgICAgICAgIGlmIChjb2xzW2pdLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpKSB7XG4gICAgICAgICAgICAgICAgcm93RGF0YS5wdXNoKHJvd3NbaV0uY2xhc3NOYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcm93RGF0YS5wdXNoKGNvbHNbal0uaW5uZXJUZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0YWJsZURhdGEucHVzaChyb3dEYXRhKTtcbiAgICB9XG5cbiAgICAvLyBTYXZlIEpTT04gc3RyaW5nIHRvIGxvY2FsU3RvcmFnZVxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHNhdmVfYXMsIEpTT04uc3RyaW5naWZ5KHRhYmxlRGF0YSkpO1xuICAgIHNhdmVDb3VudGVycygpO1xufVxuXG4vKipcbiAqIExvYWRzIGVtcGxveWVlIHRhYmxlIGRhdGEgYW5kIGJ1ZGdldCBjb3VudGVycyBmcm9tIGxvY2FsIHN0b3JhZ2UuXG4gKiBcbiAqL1xuZnVuY3Rpb24gbG9hZFRhYmxlRGF0YSh0YWJsZV9uYW1lX2luX3N0b3JhZ2UgPSBcImVtcGxveWVlVGFibGVEYXRhXCIpIHtcbiAgICAgICAgdmFyIGRhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0YWJsZV9uYW1lX2luX3N0b3JhZ2UpO1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgdmFyIHRhYmxlRGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgICAgICB2YXIgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVtcGxveWVlLXRhYmxlXCIpO1xuICAgIFxuICAgICAgICAgICAgLy8gSXQncyBnb29kIHByYWN0aWNlIHRvIGVtcHR5IHRoZSBleGlzdGluZyB0YWJsZSBmaXJzdFxuICAgICAgICAgICAgd2hpbGUgKHRhYmxlLnJvd3MubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIHRhYmxlLmRlbGV0ZVJvdygxKTtcbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIC8vIE5vdywgYWRkIHRoZSBsb2FkZWQgcm93cyB0byB0aGUgdGFibGVcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgdGFibGVEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld1JvdyA9IHRhYmxlLmluc2VydFJvdygtMSk7XG4gICAgICAgICAgICAgICAgdmFyIG5jb2xzID0gdGFibGVEYXRhW2ldLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5jb2xzLTE7IGorKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Q2VsbCA9IG5ld1Jvdy5pbnNlcnRDZWxsKGopO1xuICAgICAgICAgICAgICAgICAgICBuZXdDZWxsLmlubmVyVGV4dCA9IHRhYmxlRGF0YVtpXVtqXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBjb3N0IGNvbHVtbiAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChqID09IG5jb2xzLTIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2VsbC5jbGFzc0xpc3QuYWRkKCdjb3N0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDZWxsLnNldEF0dHJpYnV0ZSgnY29zdCcsIHVuZm9ybWF0Q3VycmVuY3kodGFibGVEYXRhW2ldW2pdKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBhY3Rpb24gYnV0dG9ucyBhbmQgbG9hZCBzYXZlZCBjbGFzc1xuICAgICAgICAgICAgICAgIHZhciBsYXN0Q2VsbCA9IG5ld1Jvdy5pbnNlcnRDZWxsKG5jb2xzLTEpO1xuICAgICAgICAgICAgICAgIGxhc3RDZWxsLmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZGVsZXRlXCI+REVMRVRFPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXN1cHBsZW1lbnRhbFwiPlNVUFBMRU1FTlRBTDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1jYXJyeW92ZXJcIj5LRUVQIElOIEZZMjY8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgIG5ld1Jvdy5jbGFzc0xpc3QuYWRkKHRhYmxlRGF0YVtpXVtuY29scy0xXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vcmV0cmlldmUgY291bnRlciB2YWx1ZXNcbiAgICAgICAgICAgIGxvYWRDb3VudGVycygpO1xuICAgICAgICB9XG59XG5cbi8vIGFsc28gc2F2ZSBjb3VudGVycyBpbiBzaWRlYmFyXG5mdW5jdGlvbiBzYXZlQ291bnRlcnMoKXtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncGVyc29ubmVsX2Jhc2VsaW5lJywgcGVyc29ubmVsX2Jhc2VsaW5lLnRvU3RyaW5nKCkpO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdwZXJzb25uZWxfc3VwcCcsIHBlcnNvbm5lbF9zdXBwLnRvU3RyaW5nKCkpO1xuICAgIC8vIEFkZCBtb3JlIGhlcmVcbn0gICAgXG4gICAgXG4vLyBsb2FkIGNvdW50ZXJzIGluIHNpZGViYXJcbmZ1bmN0aW9uIGxvYWRDb3VudGVycygpe1xuICAgIHBlcnNvbm5lbF9iYXNlbGluZSA9IHBhcnNlSW50KGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwZXJzb25uZWxfYmFzZWxpbmUnKSwgMTApO1xuICAgIHBlcnNvbm5lbF9zdXBwID0gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3BlcnNvbm5lbF9zdXBwJyksIDEwKTtcbiAgICB1cGRhdGVEaXNwbGF5KCk7XG59XG5cbi8vIHNhdmUgcGFnZSBzdGF0ZVxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVBhZ2VTdGF0ZShwYWdlKXtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncGFnZV9zdGF0ZScsIHBhZ2UpO1xufVxuXG4vLyBsb2FkIHBhZ2Ugc3RhdGVcbmV4cG9ydCBmdW5jdGlvbiBsb2FkUGFnZVN0YXRlKHBhZ2Upe1xuICAgIGNvbnN0IHBhZ2VTdGF0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwYWdlX3N0YXRlJyk7XG4gICAgcmV0dXJuIHBhZ2VTdGF0ZSAhPT0gbnVsbCA/IHBhZ2VTdGF0ZSA6ICd3ZWxjb21lJztcbn0iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vaGVhZGVyLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2hlYWRlci5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJpbXBvcnQgJy4vaGVhZGVyLmNzcyc7XG5cbmV4cG9ydCBjb25zdCBTdWJ0aXRsZSA9IHtcbiAgICB1cGRhdGUgOiBmdW5jdGlvbihzdWJ0aXRsZSl7XG4gICAgICAgIC8vIGdldCBjdXJyZW50IGZ1bmRcbiAgICAgICAgdmFyIGZ1bmQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImZ1bmRcIik7XG4gICAgICAgIGlmIChmdW5kKXtcbiAgICAgICAgICAgIHZhciBzdWJ0aXRsZSA9IGAke3N1YnRpdGxlfTogJHtmdW5kfWA7XG4gICAgICAgIH1cbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzdWJ0aXRsZVwiKS50ZXh0Q29udGVudCA9IHN1YnRpdGxlO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU3VidGl0bGU7IiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3dlbGNvbWUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vd2VsY29tZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJpbXBvcnQgJy4vd2VsY29tZS5jc3MnO1xuXG4vLyBIaWRlIGFuZCB1bmhpZGUgd2VsY29tZSBidXR0b25zXG5mdW5jdGlvbiB1bmhpZGVXZWxjb21lQnV0dG9ucygpe1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwid2VsY29tZS1wYWdlXCIpLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG59XG5mdW5jdGlvbiBoaWRlV2VsY29tZUJ1dHRvbnMoKXtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIndlbGNvbWUtcGFnZVwiKS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG59XG5cbmV4cG9ydCBjb25zdCBXZWxjb21lID0ge1xuICAgIHNob3c6IHVuaGlkZVdlbGNvbWVCdXR0b25zLFxuICAgIGhpZGUgOiBoaWRlV2VsY29tZUJ1dHRvbnNcbn1cblxuZXhwb3J0IGRlZmF1bHQgV2VsY29tZTsiLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vYm9keS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9ib2R5LmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9tb2RhbC5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9tb2RhbC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJpbXBvcnQgJy4vbW9kYWwuY3NzJztcblxuZnVuY3Rpb24gY2xlYXJNb2RhbCgpe1xuICAgIHVwZGF0ZU1vZGFsVGl0bGUoJycpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RhbC1ib2R5JykuaW5uZXJIVE1MID0gJyc7XG4gICAgLy9yZW1vdmVBbGxNb2RhbExpbmtzKClcbn1cblxuLy8gZnVuY3Rpb24gcmVtb3ZlQWxsTW9kYWxMaW5rcygpe1xuLy8gICAgIFRPRE9cbi8vIH1cblxuZnVuY3Rpb24gaGlkZU1vZGFsKG1vZGFsX2lkKSB7XG4gICAgJCgnIycgKyBtb2RhbF9pZCkubW9kYWwoJ2hpZGUnKTtcbn1cblxuZnVuY3Rpb24gc2hvd01vZGFsKG1vZGFsX2lkKSB7XG4gICAgJCgnIycgKyBtb2RhbF9pZCkubW9kYWwoJ3Nob3cnKTtcbn1cblxuZnVuY3Rpb24gc2hvd01vZGFsSGFuZGxlcigpIHtcbiAgICBzaG93TW9kYWwoJ21haW4tbW9kYWwnKTtcbn1cblxuY29uc3QgTGluayA9IHtcbiAgICBhZGQgOiBmdW5jdGlvbihidXR0b25faWQpe1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidXR0b25faWQpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2hvd01vZGFsSGFuZGxlcilcbiAgICB9LFxuICAgIHJlbW92ZSA6IGZ1bmN0aW9uKGJ1dHRvbl9pZCl7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJ1dHRvbl9pZCkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzaG93TW9kYWxIYW5kbGVyKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlTW9kYWxUaXRsZSh0aXRsZSkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gdGl0bGU7XG59XG5cbmNvbnN0IFRpdGxlID0ge1xuICAgIHVwZGF0ZSA6IGZ1bmN0aW9uKHRpdGxlKSB7IHVwZGF0ZU1vZGFsVGl0bGUodGl0bGUpIH1cbn1cblxuZXhwb3J0IGNvbnN0IE1vZGFsID0ge1xuICAgIGhpZGUgOiBmdW5jdGlvbigpIHsgaGlkZU1vZGFsKCdtYWluLW1vZGFsJykgfSxcbiAgICBzaG93IDogZnVuY3Rpb24oKSB7IHNob3dNb2RhbCgnbWFpbi1tb2RhbCcpIH0sXG4gICAgY2xlYXIgOiBjbGVhck1vZGFsLFxuICAgIFRpdGxlIDogVGl0bGUsXG4gICAgTGluayA6IExpbmtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTW9kYWw7IiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL25hdl9idXR0b25zLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL25hdl9idXR0b25zLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsImltcG9ydCAnLi9uYXZfYnV0dG9ucy5jc3MnO1xuXG5pbXBvcnQgeyBuZXh0UGFnZSwgbGFzdFBhZ2UgfSBmcm9tICcuLi8uLi92aWV3cy92aWV3X2xvZ2ljLmpzJ1xuXG5mdW5jdGlvbiBpbml0aWFsaXplTmF2QnV0dG9ucygpe1xuICAgIC8vIGluaXRpYWxpemUgbGFzdCBidXR0b25cbiAgICBjb25zdCBsYXN0X2J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG4tbGFzdCcpO1xuICAgIGxhc3RfYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbGFzdFBhZ2UpOyBcbiAgICAvLyBpbml0aWFsaXplIG5leHQgYnV0dG9uXG4gICAgY29uc3QgbmV4dF9idG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuLW5leHQnKTtcbiAgICBuZXh0X2J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG5leHRQYWdlKTsgXG4gICAgZGlzYWJsZSgnYnRuLW5leHQnKTtcbn1cblxuZnVuY3Rpb24gaGlkZU5hdkJ1dHRvbnMoKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25hdi1idG5zJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbn1cblxuZnVuY3Rpb24gc2hvd05hdkJ1dHRvbnMoKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25hdi1idG5zJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgaW5pdGlhbGl6ZU5hdkJ1dHRvbnMoKTtcbn1cblxuZnVuY3Rpb24gZGlzYWJsZShidXR0b25faWQpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidXR0b25faWQpLmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XG59XG5cbmZ1bmN0aW9uIGVuYWJsZShidXR0b25faWQpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidXR0b25faWQpLmNsYXNzTGlzdC5yZW1vdmUoJ2Rpc2FibGVkJyk7XG59XG5cbmNvbnN0IE5leHQgPSB7XG4gICAgZGlzYWJsZSA6IGZ1bmN0aW9uKCkgeyBkaXNhYmxlKCdidG4tbmV4dCcpIH0sXG4gICAgZW5hYmxlIDogZnVuY3Rpb24oKSB7IGVuYWJsZSgnYnRuLW5leHQnKSB9XG59XG5cbmNvbnN0IExhc3QgPSB7XG4gICAgZGlzYWJsZSA6IGZ1bmN0aW9uKCkgeyBkaXNhYmxlKCdidG4tbGFzdCcpIH0sXG4gICAgZW5hYmxlIDogZnVuY3Rpb24oKSB7IGVuYWJsZSgnYnRuLWxhc3QnKSB9XG59XG5cbmV4cG9ydCBjb25zdCBOYXZCdXR0b25zID0ge1xuICAgIGhpZGUgOiBoaWRlTmF2QnV0dG9ucyxcbiAgICBzaG93IDogc2hvd05hdkJ1dHRvbnMsXG4gICAgTmV4dCA6IE5leHQsXG4gICAgTGFzdCA6IExhc3Rcbn1cblxuZXhwb3J0IGRlZmF1bHQgTmF2QnV0dG9uczsiLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vcHJvbXB0LmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Byb21wdC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJmdW5jdGlvbiBzaG93UHJvbXB0KCl7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJwcm9tcHQtZGl2XCIpLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG59XG5cbmZ1bmN0aW9uIGhpZGVQcm9tcHQoKXtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvbXB0LWRpdicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG59XG5cblxuZnVuY3Rpb24gdXBkYXRlUHJvbXB0KHByb21wdCl7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb21wdCcpLnRleHRDb250ZW50ID0gcHJvbXB0O1xuICAgIHNob3dQcm9tcHQoKTtcbn1cblxuZXhwb3J0IGNvbnN0IFRleHQgPSB7XG4gICAgc2hvdyA6IHNob3dQcm9tcHQsXG4gICAgaGlkZSA6IGhpZGVQcm9tcHQsXG4gICAgdXBkYXRlIDogZnVuY3Rpb24odGV4dCkgeyB1cGRhdGVQcm9tcHQodGV4dCkgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUZXh0OyIsImZ1bmN0aW9uIHNob3dQcm9tcHRCdXR0b24oaWQpe1xuICAgIC8vIG1ha2UgYnV0dG9ucyB2aXNpYmxlXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJztcbn1cblxuZnVuY3Rpb24gdXBkYXRlUHJvbXB0QnV0dG9uKGlkLCB0ZXh0KXtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIHNob3dQcm9tcHRCdXR0b24oaWQpO1xufVxuXG5mdW5jdGlvbiBoaWRlUHJvbXB0QnV0dG9uKGlkKXtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbn1cblxuZnVuY3Rpb24gdW5jbGlja0FsbCgpe1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHRpb24xJykuY2xhc3NMaXN0LnJlbW92ZSgnY2xpY2tlZCcpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHRpb24yJykuY2xhc3NMaXN0LnJlbW92ZSgnY2xpY2tlZCcpO1xufVxuXG5mdW5jdGlvbiBhcHBseUNsaWNrZWRTdHlsZShidXR0b24pe1xuICAgIHVuY2xpY2tBbGwoKTtcbiAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnY2xpY2tlZCcpO1xufVxuXG5mdW5jdGlvbiBhZGRQcm9tcHRCdXR0b25BY3Rpb24oYnV0dG9uX2lkLCBhY3Rpb25fZm4pe1xuICAgIGNvbnN0IGJ1dHRvbkVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidXR0b25faWQpO1xuICAgIGJ1dHRvbkVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhY3Rpb25fZm4pO1xuICAgIGJ1dHRvbkVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpe1xuICAgICAgICBhcHBseUNsaWNrZWRTdHlsZSh0aGlzKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlUHJvbXB0QnV0dG9uQWN0aW9uKGJ1dHRvbl9pZCwgYWN0aW9uX2ZuKXtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidXR0b25faWQpLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYWN0aW9uX2ZuKTtcbn1cblxuZXhwb3J0IGNvbnN0IExlZnQgPSB7XG4gICAgc2hvdyA6IGZ1bmN0aW9uKCkgeyBzaG93UHJvbXB0QnV0dG9uKCdvcHRpb24xJykgfSxcbiAgICBoaWRlIDogZnVuY3Rpb24oKSB7IGhpZGVQcm9tcHRCdXR0b24oJ29wdGlvbjEnKSB9LFxuICAgIHVwZGF0ZVRleHQgOiBmdW5jdGlvbih0ZXh0KSB7IHVwZGF0ZVByb21wdEJ1dHRvbignb3B0aW9uMScsIHRleHQpIH0sXG4gICAgYWRkQWN0aW9uIDogZnVuY3Rpb24oYWN0aW9uX2ZuKSB7IGFkZFByb21wdEJ1dHRvbkFjdGlvbignb3B0aW9uMScsIGFjdGlvbl9mbikgfSxcbiAgICByZW1vdmVBY3Rpb24gOiBmdW5jdGlvbihhY3Rpb25fZm4pIHsgcmVtb3ZlUHJvbXB0QnV0dG9uQWN0aW9uKCdvcHRpb24xJywgYWN0aW9uX2ZuKSB9XG59XG5cbmV4cG9ydCBjb25zdCBSaWdodCA9IHtcbiAgICBzaG93IDogZnVuY3Rpb24oKSB7IHNob3dQcm9tcHRCdXR0b24oJ29wdGlvbjInKSB9LFxuICAgIGhpZGUgOiBmdW5jdGlvbigpIHsgaGlkZVByb21wdEJ1dHRvbignb3B0aW9uMicpIH0sXG4gICAgdXBkYXRlVGV4dCA6IGZ1bmN0aW9uKHRleHQpIHsgdXBkYXRlUHJvbXB0QnV0dG9uKCdvcHRpb24yJywgdGV4dCkgfSxcbiAgICBhZGRBY3Rpb24gOiBmdW5jdGlvbihhY3Rpb25fZm4pIHsgYWRkUHJvbXB0QnV0dG9uQWN0aW9uKCdvcHRpb24yJywgYWN0aW9uX2ZuKSB9LFxuICAgIHJlbW92ZUFjdGlvbiA6IGZ1bmN0aW9uKGFjdGlvbl9mbikgeyByZW1vdmVQcm9tcHRCdXR0b25BY3Rpb24oJ29wdGlvbjInLCBhY3Rpb25fZm4pIH1cbn1cblxuZXhwb3J0IGNvbnN0IEJ1dHRvbnMgPSB7XG4gICAgTGVmdCA6IExlZnQsXG4gICAgUmlnaHQgOiBSaWdodCxcbiAgICBzaG93IDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHNob3dQcm9tcHRCdXR0b24oJ29wdGlvbjEnKTtcbiAgICAgICAgc2hvd1Byb21wdEJ1dHRvbignb3B0aW9uMicpO1xuICAgIH0sXG4gICAgaGlkZSA6IGZ1bmN0aW9uKCkge1xuICAgICAgICBoaWRlUHJvbXB0QnV0dG9uKCdvcHRpb24xJyk7XG4gICAgICAgIGhpZGVQcm9tcHRCdXR0b24oJ29wdGlvbjInKTtcbiAgICB9LFxuICAgIHJlc2V0IDogdW5jbGlja0FsbFxufVxuXG5leHBvcnQgZGVmYXVsdCBCdXR0b25zOyIsImltcG9ydCAnLi9wcm9tcHQuY3NzJztcblxuaW1wb3J0IFRleHQgZnJvbSBcIi4vc3ViY29tcG9uZW50cy90ZXh0LmpzXCI7XG5pbXBvcnQgQnV0dG9ucyBmcm9tIFwiLi9zdWJjb21wb25lbnRzL2J1dHRvbnMuanNcIjtcblxuZXhwb3J0IGNvbnN0IFByb21wdCA9IHtcbiAgICBUZXh0IDogVGV4dCxcbiAgICBCdXR0b25zIDogQnV0dG9ucyxcbiAgICBoaWRlIDogZnVuY3Rpb24oKXtcbiAgICAgICAgVGV4dC5oaWRlKCk7XG4gICAgICAgIEJ1dHRvbnMuaGlkZSgpO1xuICAgIH0sXG4gICAgc2hvdyA6IGZ1bmN0aW9uKCl7XG4gICAgICAgIFRleHQuc2hvdygpO1xuICAgICAgICBCdXR0b25zLnNob3coKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFByb21wdCIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zaWRlYmFyLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NpZGViYXIuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiLy8gRnVuY3Rpb24gdG8gZm9ybWF0IG51bWJlciBhcyBjdXJyZW5jeVxuZXhwb3J0IGNvbnN0IGZvcm1hdEN1cnJlbmN5ID0gKGFtb3VudCwgcmV0dXJuX3plcm8gPSBmYWxzZSkgPT4ge1xuICAgIHZhciBhbW91bnQgPSBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoYW1vdW50KSk7XG4gICAgaWYgKGFtb3VudCA9PSBOYU4pe1xuICAgICAgICByZXR1cm4gXCIkIC1cIlxuICAgIH1cbiAgICBpZiAoYW1vdW50IDwgMCl7XG4gICAgICAgIHJldHVybiAnKCQnICsgYW1vdW50LnRvU3RyaW5nKCkucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZywgJywnKSArICcpJztcbiAgICB9IGVsc2UgaWYgKGFtb3VudCA9PSAwKSB7XG4gICAgICAgIGlmIChyZXR1cm5femVybyl7XG4gICAgICAgICAgICByZXR1cm4gJyQwJzsgICAgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiJCAtXCJcbiAgICB9XG4gICAgcmV0dXJuICckJyArIGFtb3VudC50b1N0cmluZygpLnJlcGxhY2UoL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csICcsJyk7XG59IDtcblxuLy8gZnVuY3Rpb24gdG8gY29udmVydCBmb3JtYXR0ZWQgbnVtYmVyIHRvIGEgZmxvYXRcbmV4cG9ydCBjb25zdCB1bmZvcm1hdEN1cnJlbmN5ID0gKGZvcm1hdHRlZEFtb3VudCkgPT4ge1xuICAgIC8vIFJlbW92ZSBhbnkgY3VycmVuY3kgc3ltYm9scyBhbmQgY29tbWFzXG4gICAgbGV0IG51bWVyaWNhbFBhcnQgPSBmb3JtYXR0ZWRBbW91bnQucmVwbGFjZSgvW14wLTkuLV0rL2csIFwiXCIpO1xuICAgIHJldHVybiBwYXJzZUZsb2F0KG51bWVyaWNhbFBhcnQpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3BsYXlXaXRoQ29tbWFzKHZhbHVlKSB7XG4gICAgcmV0dXJuIGZvcm1hdEN1cnJlbmN5KHZhbHVlKS5yZXBsYWNlKCckJywgJycpO1xufVxuXG5mdW5jdGlvbiBkZWxheShtcykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhdXNlRXhlY3V0aW9uKHNlY29uZHMpIHtcbiAgICBhd2FpdCBkZWxheShzZWNvbmRzICogMTAwMCk7IC8vIGNvbnZlcnQgdG8gbWlsbGlzZWNvbmRzXG59IiwiaW1wb3J0ICcuL3NpZGViYXIuY3NzJztcblxuaW1wb3J0IHsgZm9ybWF0Q3VycmVuY3kgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29tbW9uX3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBUQVJHRVQgfSBmcm9tIFwiLi4vLi4vaW5pdC5qc1wiO1xuXG4vLyBBc3N1bWluZyB5b3UgaGF2ZSBhIENTUyB2YXJpYWJsZSAtLW1haW4tY29sb3IgZGVmaW5lZCBvbiB0aGUgOnJvb3RcbmNvbnN0IHJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5jb25zdCBzaWRlQmFyV2lkdGggPSBnZXRDb21wdXRlZFN0eWxlKHJvb3QpLmdldFByb3BlcnR5VmFsdWUoJy0tc2lkZWJhci13aWR0aCcpLnRyaW0oKTtcblxuZnVuY3Rpb24gaGlkZVNpZGViYXIoKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NpZGViYXItcGFuZWwnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXBhbmVsJykuc3R5bGUud2lkdGggPSAnMTAwJSc7IFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWRlcicpLnN0eWxlLndpZHRoID0gJzEwMCUnXG59XG5cbmZ1bmN0aW9uIHNob3dTaWRlYmFyKCkge1xuICAgIGNvbnN0IHNpZGViYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2lkZWJhci1wYW5lbCcpO1xuICAgIGNvbnN0IG1haW5QYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXBhbmVsJyk7XG4gICAgY29uc3QgaGVhZGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZGVyJyk7XG5cbiAgICBzaWRlYmFyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOyAvLyBTaG93IHRoZSBzaWRlYmFyXG4gICAgXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSByZW1haW5pbmcgd2lkdGggZm9yIHRoZSBtYWluIHBhbmVsIGFuZCBoZWFkZXJcbiAgICB2YXIgY29udGVudFdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIG1haW5QYW5lbC5zdHlsZS53aWR0aCA9IGAke2NvbnRlbnRXaWR0aCAtIHBhcnNlSW50KHNpZGVCYXJXaWR0aCwgMTApfXB4YDsgXG4gICAgaGVhZGVyLnN0eWxlLndpZHRoID0gYCR7Y29udGVudFdpZHRoIC0gcGFyc2VJbnQoc2lkZUJhcldpZHRoLCAxMCl9cHhgOyBcblxuICAgIC8vIGFkZCB0YXJnZXQgdG8gc2lkZWJhclxuICAgIGFkZFRhcmdldChUQVJHRVQpO1xuXG4gICAgLy8gYWRkIGV2ZW50IGxpc3RlbmVyIHRvIHJlc2l6ZSBjb250ZW50IGlmIHdpbmRvdyBpcyBhZGp1c3RlZFxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBzaG93U2lkZWJhcik7XG59XG5cblxuZnVuY3Rpb24gdXBkYXRlU2lkZWJhclRpdGxlKG5ld190aXRsZSl7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NpZGViYXItdGl0bGUnKS50ZXh0Q29udGVudCA9IG5ld190aXRsZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU2lkZWJhclN0YXQoc3RhdF9pZCwgbmV3X2ZpZ3VyZSl7XG4gICAgcmVwbGFjZVNpZGViYXJTdGF0KHN0YXRfaWQsIG5ld19maWd1cmUpO1xuICAgIC8vIFRPRE86IHNhdmUgaW4gbWVtb3J5XG4gICAgdXBkYXRlVG90YWxzKCk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VTaWRlYmFyU3RhdChzdGF0X2lkLCBuZXdfZmlndXJlKXtcbiAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7c3RhdF9pZH0gLnN0YXRgKTtcbiAgICBzcGFuLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBuZXdfZmlndXJlKTtcbiAgICBzcGFuLnRleHRDb250ZW50ID0gZm9ybWF0Q3VycmVuY3kobmV3X2ZpZ3VyZSk7XG59XG5cbmZ1bmN0aW9uIGluY3JlbWVudFNpZGViYXJTdGF0KHN0YXRfaWQsIG5ld19maWd1cmUpe1xuICAgIHVwZGF0ZVNpZGViYXJTdGF0KHN0YXRfaWQsIGZldGNoU3RhdChzdGF0X2lkKSArIG5ld19maWd1cmUpXG59XG5cbmZ1bmN0aW9uIGZldGNoU3RhdChzdGF0X2lkKXtcbiAgICBjb25zdCBzdGF0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7c3RhdF9pZH0gLnN0YXRgKTtcbiAgICByZXR1cm4gcGFyc2VGbG9hdChzdGF0LmdldEF0dHJpYnV0ZSgndmFsdWUnKSkgfHwgMDtcbn1cblxuLy8gRnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBkaXNwbGF5IG9mIHRoZSBjdXJyZW50IGFuZCBzdXBwIHZhcmlhYmxlc1xuZnVuY3Rpb24gdXBkYXRlVG90YWxzKCkge1xuICAgIC8vIHVwZGF0ZSBib3R0b20gbGluZXNcbiAgICBsZXQgc3VwcF90b3RhbCA9ICAgIC1mZXRjaFN0YXQoJ3N1cHAtcmV2ZW51ZScpICsgXG4gICAgICAgICAgICAgICAgICAgICAgICBmZXRjaFN0YXQoJ3N1cHAtcGVyc29ubmVsJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hTdGF0KCdzdXBwLW5vbnBlcnNvbm5lbCcpO1xuICAgIGxldCBiYXNlbGluZV90b3RhbCA9IC1mZXRjaFN0YXQoJ2Jhc2VsaW5lLXJldmVudWUnKSArIFxuICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hTdGF0KCdiYXNlbGluZS1wZXJzb25uZWwnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBmZXRjaFN0YXQoJ2Jhc2VsaW5lLW5vbnBlcnNvbm5lbCcpO1xuICAgIHJlcGxhY2VTaWRlYmFyU3RhdCgnc3VwcC10b3RhbCcsIHN1cHBfdG90YWwpO1xuICAgIHJlcGxhY2VTaWRlYmFyU3RhdCgnYmFzZWxpbmUtdG90YWwnLCBiYXNlbGluZV90b3RhbCk7XG5cbiAgICAvLyBjb2xvciBjb2RlIGJhc2VkIG9uIHRhcmdldFxuICAgIHZhciB0YXJnZXQgPSBmZXRjaFN0YXQoJ3RhcmdldCcpO1xuICAgIGlmKGJhc2VsaW5lX3RvdGFsIDw9IHRhcmdldCl7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiYXNlbGluZS10b3RhbCAuc3RhdCcpLnN0eWxlLmNvbG9yID0gXCJncmVlblwiO1xuICAgIH1cbiAgICBpZihiYXNlbGluZV90b3RhbCA+IHRhcmdldCl7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiYXNlbGluZS10b3RhbCAuc3RhdCcpLnN0eWxlLmNvbG9yID0gXCJyZWRcIjtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGFkZFRhcmdldCh0YXJnZXQpe1xuICAgIHJlcGxhY2VTaWRlYmFyU3RhdCgndGFyZ2V0JywgdGFyZ2V0KTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVGl0bGUodGl0bGUpe1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzaWRlYmFyLXRpdGxlJykudGV4dENvbnRlbnQgPSB0aXRsZTtcbn1cblxuY29uc3QgU2lkZWJhciA9IHtcbiAgICBoaWRlOiBoaWRlU2lkZWJhcixcbiAgICBzaG93OiBzaG93U2lkZWJhcixcbiAgICB1cGRhdGVUaXRsZTogdXBkYXRlU2lkZWJhclRpdGxlLFxuICAgIHVwZGF0ZVN0YXQ6IHVwZGF0ZVNpZGViYXJTdGF0LFxuICAgIGluY3JlbWVudFN0YXQ6IGluY3JlbWVudFNpZGViYXJTdGF0LFxuICAgIGFkZFRhcmdldDogYWRkVGFyZ2V0LFxuICAgIHVwZGF0ZVRpdGxlOiB1cGRhdGVUaXRsZVxufTtcblxuZXhwb3J0IGRlZmF1bHQgU2lkZWJhcjsiLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdGFibGUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdGFibGUuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiZnVuY3Rpb24gYWRkVGFibGVIZWFkZXJzKGhlYWRlcl9hcnJheSl7XG5cbiAgICAvLyBHZXQgdGhlIHRhYmxlIGVsZW1lbnQgYnkgaXRzIElEXG4gICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xuICAgIFxuICAgIC8vIENyZWF0ZSBhIHRhYmxlIGhlYWRlciByb3cgZWxlbWVudFxuICAgIGNvbnN0IGhlYWRlclJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7XG4gICAgXG4gICAgZm9yIChjb25zdCBoZWFkZXJUZXh0IG9mIGhlYWRlcl9hcnJheSkge1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIGhlYWRlciBjZWxsIGVsZW1lbnRcbiAgICAgICAgY29uc3QgaGVhZGVyQ2VsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RoJyk7XG4gICAgICAgIGhlYWRlckNlbGwudGV4dENvbnRlbnQgPSBoZWFkZXJUZXh0O1xuICAgICAgICBcbiAgICAgICAgLy8gQXBwZW5kIHRoZSBoZWFkZXIgY2VsbCB0byB0aGUgaGVhZGVyIHJvd1xuICAgICAgICBoZWFkZXJSb3cuYXBwZW5kQ2hpbGQoaGVhZGVyQ2VsbCk7XG4gICAgfVxuICAgIFxuICAgIC8vIEFwcGVuZCB0aGUgaGVhZGVyIHJvdyB0byB0aGUgdGFibGUgaGVhZGVyXG4gICAgbGV0IHRoZWFkID0gdGFibGUucXVlcnlTZWxlY3RvcigndGhlYWQnKTtcbiAgICB0aGVhZC5hcHBlbmRDaGlsZChoZWFkZXJSb3cpO1xufVxuXG5jb25zdCBIZWFkZXIgPSB7XG4gICAgYWRkOiBmdW5jdGlvbihoZWFkZXJfYXJyYXkpe1xuICAgICAgICBhZGRUYWJsZUhlYWRlcnMoaGVhZGVyX2FycmF5KVxuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEhlYWRlcjsiLCJpbXBvcnQgSGVhZGVyIGZyb20gXCIuL2hlYWRlcnMuanNcIjtcbmltcG9ydCB7IGZvcm1hdEN1cnJlbmN5IH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2NvbW1vbl91dGlscy5qc1wiO1xuXG5mdW5jdGlvbiBhZGROZXdSb3coZGF0YV9kaWN0aW9uYXJ5KXtcbiAgICAvLyBHZXQgdGhlIHRhYmxlIGVsZW1lbnQgYnkgaXRzIElEXG4gICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xuXG4gICAgLy8gY2hlY2sgaWYgaGVhZGVyIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWRcbiAgICBsZXQgaGVhZGVyX3JvdyA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3RoZWFkIHRyJyk7XG4gICAgaWYgKCFoZWFkZXJfcm93KSB7XG4gICAgICAgIEhlYWRlci5hZGQoT2JqZWN0LmtleXMoZGF0YV9kaWN0aW9uYXJ5KSk7XG4gICAgfVxuXG4gICAgLy8gYWRkIHJvdyBvZiBkYXRhXG4gICAgY29uc3QgbmV3X3JvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7XG4gICAgY29uc3QgY2VsbF9kYXRhX2FycmF5ID0gT2JqZWN0LnZhbHVlcyhkYXRhX2RpY3Rpb25hcnkpO1xuXG4gICAgZm9yIChjb25zdCBjZWxsX2RhdGEgb2YgY2VsbF9kYXRhX2FycmF5KSB7XG4gICAgICAgIC8vIENyZWF0ZSBuZXcgY2VsbCBhbmQgYWRkIGl0IHRvIHRoZSByb3dcbiAgICAgICAgY29uc3QgbmV3Q2VsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7XG4gICAgICAgIG5ld0NlbGwudGV4dENvbnRlbnQgPSBjZWxsX2RhdGE7XG4gICAgICAgIG5ld19yb3cuYXBwZW5kQ2hpbGQobmV3Q2VsbCk7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2cobmV3X3Jvdyk7XG5cbiAgICAvLyBBcHBlbmQgdGhlIG5ldyByb3cgdG8gdGhlIHRhYmxlIGJvZHlcbiAgICBsZXQgdGJvZHkgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keScpO1xuICAgIHRib2R5LmFwcGVuZENoaWxkKG5ld19yb3cpO1xufVxuXG5mdW5jdGlvbiBzYXZlUm93RWRpdHMocm93KXtcbiAgICB2YXIgY2VsbHMgPSByb3cucXVlcnlTZWxlY3RvckFsbCgndGQnKVxuICAgIGNlbGxzLmZvckVhY2goIGNlbGwgPT4ge1xuICAgICAgICAvLyBzYXZlIGRyb3Bkb3duIHZhbHVlc1xuICAgICAgICBpZiAoY2VsbC5xdWVyeVNlbGVjdG9yKCdzZWxlY3QnKSl7XG4gICAgICAgICAgICB2YXIgc2VydmljZVNlbGVjdG9yID0gY2VsbC5xdWVyeVNlbGVjdG9yKCdzZWxlY3QnKTtcbiAgICAgICAgICAgIGNlbGwudGV4dENvbnRlbnQgPSBzZXJ2aWNlU2VsZWN0b3IudmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoY2VsbC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpKSB7XG4gICAgICAgICAgICAvLyBzYXZlIG5ldyBlbnRlcmVkIHZhbHVlIGluIHRleHRib3hcbiAgICAgICAgICAgIHZhciB0ZXh0Ym94ID0gY2VsbC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgICAgICAgICAgdmFyIGVudGVyZWRWYWx1ZSA9IHRleHRib3gudmFsdWU7XG4gICAgICAgICAgICAvLyB1cGRhdGUgZGlzcGxheSBhbmQgZm9ybWF0IHdpdGggY3VycmVuY3kgaWYgcmVsZXZhbnRcbiAgICAgICAgICAgIGlmICggY2VsbC5jbGFzc0xpc3QuY29udGFpbnMoJ2Nvc3QnKSApe1xuICAgICAgICAgICAgICAgIC8vIGlmIGNvc3QsIHJlbW92ZSBjb21tYXMgZmlyc3RcbiAgICAgICAgICAgICAgICBlbnRlcmVkVmFsdWUgPSBlbnRlcmVkVmFsdWUucmVwbGFjZUFsbCgnLCcsICcnKTtcbiAgICAgICAgICAgICAgICBjZWxsLnRleHRDb250ZW50ID0gZm9ybWF0Q3VycmVuY3koZW50ZXJlZFZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2VsbC50ZXh0Q29udGVudCA9IGVudGVyZWRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHNldCB2YWx1ZSBhdHRyaWJ1dGUgdG8gdGhlIG5ldyB1c2VyIGlucHV0XG4gICAgICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBlbnRlcmVkVmFsdWUpO1xuICAgICAgICB9XG4gICAgfSlcbn1cblxuY29uc3QgUm93cyA9IHtcbiAgICBhZGQgOiBmdW5jdGlvbihkYXRhX2RpY3Rpb25hcnkpe1xuICAgICAgICBhZGROZXdSb3coZGF0YV9kaWN0aW9uYXJ5KVxuICAgIH0sXG4gICAgc2F2ZUVkaXRzIDogZnVuY3Rpb24ocm93KXtcbiAgICAgICAgc2F2ZVJvd0VkaXRzKHJvdylcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJvd3M7IiwiaW1wb3J0IFJvd3MgZnJvbSAnLi9yb3dzLmpzJ1xuXG5mdW5jdGlvbiBoaWRlQnV0dG9uKGNsYXNzTmFtZSl7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYnV0dG9ucyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidXR0b25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBidXR0b25zW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNob3dCdXR0b24oY2xhc3NOYW1lKXtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBidXR0b25zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWUpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1dHRvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGJ1dHRvbnNbaV0uc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVCdXR0b25UZXh0KGNsYXNzTmFtZSwgdGV4dCl7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7Y2xhc3NOYW1lfWApLnRleHRDb250ZW50ID0gdGV4dDtcbn1cblxuLy8gRURJVCBidXR0b25cblxuZnVuY3Rpb24gaGFuZGxlUm93RWRpdChtYWtlUm93RWRpdGFibGUsIHVwZGF0ZUNhbGxiYWNrKXtcbiAgICAvLyBhdHRhY2ggYW4gZXZlbnQgbGlzdGVuZXIgdG8gZWFjaCBlZGl0IGJ1dHRvbiBpbiBldmVyeSByb3dcbiAgICB2YXIgZWRpdEJ1dHRvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdidG4tZWRpdCcpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWRpdEJ1dHRvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZWRpdEJ1dHRvbnNbaV0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHdoYXQgd2FzIGNsaWNrZWQgb24gd2l0aGluIHRoZSB0YWJsZVxuICAgICAgICAgICAgdmFyIHJvd1RvRWRpdCA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCd0cicpO1xuICAgICAgICAgICAgLy8gbWFyayByb3cgYXMgYmVpbmcgZWRpdGVkXG4gICAgICAgICAgICByb3dUb0VkaXQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlLWVkaXRpbmcnKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gdHVybiByZWxldmFudCBlbnRyaWVzIGludG8gdGV4dGJveGVzXG4gICAgICAgICAgICBtYWtlUm93RWRpdGFibGUoKTtcblxuICAgICAgICAgICAgLy8gaGlkZSBlZGl0IGJ1dHRvbnNcbiAgICAgICAgICAgIEVkaXQuaGlkZSgpO1xuICAgICAgICAgICAgaW5pdGlhbGl6ZUNvbmZpcm1CdXR0b24odXBkYXRlQ2FsbGJhY2spO1xuICAgIFxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyBDb25maXJtIGJ1dHRvblxuXG5mdW5jdGlvbiBpbml0aWFsaXplQ29uZmlybUJ1dHRvbih1cGRhdGVDYWxsYmFjayl7XG4gICAgLy8gZ2V0IGVsZW1lbnQgYW5kIGFkZCBsaXN0ZW5lciBmb3IgY2xpY2tcbiAgICB2YXIgcm93VG9FZGl0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmFjdGl2ZS1lZGl0aW5nJyk7XG4gICAgY29uc3QgY29uZmlybV9idG4gPSByb3dUb0VkaXQucXVlcnlTZWxlY3RvcihcIi5idG4tY29uZmlybVwiKTtcbiAgICAvLyBzaG93IHRoZSByb3cncyBjb25maXJtIGJ1dHRvblxuICAgIGNvbmZpcm1fYnRuLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIGNvbmZpcm1fYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKXs7XG4gICAgICAgIC8vIHNhdmUgcm93IGVkaXRzXG4gICAgICAgIFJvd3Muc2F2ZUVkaXRzKHJvd1RvRWRpdCk7XG4gICAgICAgIC8vIHVwZGF0ZSB2YWx1ZXMgaW4gc2lkZWJhclxuICAgICAgICB1cGRhdGVDYWxsYmFjaygpO1xuICAgICAgICAvLyBtYWtlIHJvdyBubyBsb25nZXIgZ3JlZW5cbiAgICAgICAgcm93VG9FZGl0LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZS1lZGl0aW5nJyk7XG4gICAgICAgIC8vIHNob3cgZWRpdCBidXR0b25zIGFuZCBoaWRlIGNvbmZpcm0gYnV0dG9uc1xuICAgICAgICBFZGl0LnNob3coKTtcbiAgICAgICAgQ29uZmlybS5oaWRlKCk7XG4gICAgfSk7XG59XG5cbmNvbnN0IEVkaXQgPSB7XG4gICAgaHRtbDogJzxidXR0b24gY2xhc3M9XCJidG4gYnRuLWVkaXRcIj5FZGl0PC9idXR0b24+JyxcbiAgICBoaWRlOiBoaWRlQnV0dG9uKCdidG4tZWRpdCcpLFxuICAgIHNob3c6IHNob3dCdXR0b24oJ2J0bi1lZGl0JyksXG4gICAgaW5pdCA6IGZ1bmN0aW9uKG1ha2VSb3dFZGl0YWJsZSwgdXBkYXRlQ2FsbGJhY2spe1xuICAgICAgICBoYW5kbGVSb3dFZGl0KG1ha2VSb3dFZGl0YWJsZSwgdXBkYXRlQ2FsbGJhY2spXG4gICAgfVxufTtcblxuY29uc3QgRGVsZXRlID0ge1xuICAgIGh0bWw6ICc8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kZWxldGVcIj5EZWxldGU8L2J1dHRvbj4nLFxuICAgIGhpZGU6IGhpZGVCdXR0b24oJ2J0bi1kZWxldGUnKSxcbiAgICBzaG93OiBzaG93QnV0dG9uKCdidG4tZGVsZXRlJylcbn07XG5cbmNvbnN0IENvbmZpcm0gPSB7XG4gICAgaHRtbDogJzxidXR0b24gY2xhc3M9XCJidG4gYnRuLWNvbmZpcm1cIj5Db25maXJtPC9idXR0b24+JyxcbiAgICBoaWRlOiBoaWRlQnV0dG9uKCdidG4tY29uZmlybScpLFxuICAgIHNob3c6IHNob3dCdXR0b24oJ2J0bi1jb25maXJtJylcbn07XG5cbmNvbnN0IEFkZFJvdyA9IHtcbiAgICBoaWRlOiBoaWRlQnV0dG9uKCdidG4tYWRkJyksXG4gICAgc2hvdzogc2hvd0J1dHRvbignYnRuLWFkZCcpLFxuICAgIHVwZGF0ZVRleHQ6IGZ1bmN0aW9uKHRleHQpe1xuICAgICAgICB1cGRhdGVCdXR0b25UZXh0KCdidG4tYWRkJywgdGV4dCk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IEJ1dHRvbnMgPSB7XG4gICAgRGVsZXRlOiBEZWxldGUsXG4gICAgRWRpdCA6IEVkaXQsXG4gICAgQ29uZmlybSA6IENvbmZpcm0sXG4gICAgQWRkUm93IDogQWRkUm93LFxuICAgIGVkaXRfY29uZmlybV9idG5zIDogRWRpdC5odG1sICsgQ29uZmlybS5odG1sICxcbiAgICBhbGxfYnRucyA6IERlbGV0ZS5odG1sICsgRWRpdC5odG1sICsgQ29uZmlybS5odG1sXG59XG5cbmV4cG9ydCBkZWZhdWx0IEJ1dHRvbnM7IiwiYXN5bmMgZnVuY3Rpb24gY3JlYXRlRHJvcGRvd25Gcm9tSlNPTihqc29uX3BhdGgpIHtcbiAgICAvLyBGZXRjaCBKU09OIGRhdGEgZnJvbSBhIGZpbGUgYXN5bmNocm9ub3VzbHlcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGpzb25fcGF0aCk7XG4gICAgY29uc3QgZGF0YUFycmF5ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICBcbiAgICAvLyBDcmVhdGluZyBhIHNlbGVjdCBlbGVtZW50XG4gICAgY29uc3Qgc2VsZWN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlbGVjdCcpO1xuICBcbiAgICAvLyBMb29waW5nIHRocm91Z2ggdGhlIGFycmF5IGFuZCBjcmVhdGluZyBhbiBvcHRpb24gZm9yIGVhY2ggZWxlbWVudFxuICAgIGRhdGFBcnJheS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgb3B0aW9uRWxlbWVudC52YWx1ZSA9IGl0ZW0uaWQ7IC8vIFNldHRpbmcgdGhlIG9wdGlvbiB2YWx1ZSB0byB0aGUgaXRlbSBpZFxuICAgICAgb3B0aW9uRWxlbWVudC50ZXh0Q29udGVudCA9IGl0ZW0ubmFtZTsgLy8gU2V0dGluZyB0aGUgZGlzcGxheSB0ZXh0IHRvIHRoZSBpdGVtIG5hbWVcbiAgICAgIHNlbGVjdEVsZW1lbnQuYXBwZW5kQ2hpbGQob3B0aW9uRWxlbWVudCk7IC8vIEFwcGVuZGluZyB0aGUgb3B0aW9uIHRvIHRoZSBzZWxlY3RcbiAgICB9KTtcbiAgXG4gICAgLy8gUmV0dXJuIHRoZSBzZWxlY3QgZWxlbWVudCBzbyBpdCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIGRvY3VtZW50XG4gICAgcmV0dXJuIHNlbGVjdEVsZW1lbnQ7XG59XG5cbmV4cG9ydCBjb25zdCBEcm9wZG93biA9IHtcbiAgICBjcmVhdGVGcm9tSlNPTiA6IGZ1bmN0aW9uKGpzb25fcGF0aCl7IHJldHVybiBjcmVhdGVEcm9wZG93bkZyb21KU09OKGpzb25fcGF0aCkgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEcm9wZG93bjsiLCJpbXBvcnQgeyBmb3JtYXRDdXJyZW5jeSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jb21tb25fdXRpbHMuanNcIjtcbmltcG9ydCBEcm9wZG93biBmcm9tIFwiLi4vLi4vZm9ybS9zdWJjb21wb25lbnRzL2Ryb3Bkb3duLmpzXCI7XG5cbi8vIHJldHVybiBjZWxsIHZhbHVlIGF0dHJpYnV0ZSBvciAwIGlmIGl0IGRvZXMgbm90IGV4aXN0XG5mdW5jdGlvbiBnZXRDZWxsVmFsdWUocm93LCBjbGFzc05hbWUpIHtcbiAgICB2YXIgY2VsbCA9IHJvdy5xdWVyeVNlbGVjdG9yKGAuJHtjbGFzc05hbWV9YCk7XG4gICAgdmFyIGNlbGxWYWx1ZSA9IGNlbGwgPyBjZWxsLmdldEF0dHJpYnV0ZSgndmFsdWUnKSA6IG51bGw7XG4gICAgcmV0dXJuIGNlbGxWYWx1ZSA/IHBhcnNlRmxvYXQoY2VsbFZhbHVlKSA6IDA7XG59XG5cbi8vIHJldHVybiB0ZXh0IGluIGNlbGxcbmZ1bmN0aW9uIGdldENlbGxUZXh0KHJvdywgY2xhc3NOYW1lKSB7XG4gICAgdmFyIGNlbGwgPSByb3cucXVlcnlTZWxlY3RvcihgLiR7Y2xhc3NOYW1lfWApO1xuICAgIHJldHVybiBjZWxsLnRleHRDb250ZW50O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVUYWJsZUNlbGwocm93LCBjb2xfY2xhc3MsIG5ld192YWx1ZSl7XG4gICAgY29uc3QgY2VsbCA9IHJvdy5xdWVyeVNlbGVjdG9yKGAuJHtjb2xfY2xhc3N9YCk7XG4gICAgY2VsbC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgbmV3X3ZhbHVlKTtcbiAgICBjZWxsLnRleHRDb250ZW50ID0gZm9ybWF0Q3VycmVuY3kobmV3X3ZhbHVlKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRWRpdGFibGVDZWxsKGNlbGxDbGFzcyl7XG4gICAgLy8gZ2V0IGNlbGxcbiAgICBjb25zdCBjZWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLmFjdGl2ZS1lZGl0aW5nIHRkLiR7Y2VsbENsYXNzfWApO1xuICAgIC8vIENyZWF0ZSBhbiBpbnB1dCBlbGVtZW50IHRvIGVkaXQgdGhlIHZhbHVlXG4gICAgdmFyIHRleHRib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIHRleHRib3gudHlwZSA9ICd0ZXh0JztcbiAgICB0ZXh0Ym94LnZhbHVlID0gY2VsbC50ZXh0Q29udGVudDtcbiAgICAvLyBDbGVhciB0aGUgY3VycmVudCBjb250ZW50IGFuZCBhcHBlbmQgdGhlIHRleHRib3ggdG8gdGhlIGNlbGxcbiAgICBjZWxsLmlubmVySFRNTCA9ICcnO1xuICAgIGNlbGwuYXBwZW5kQ2hpbGQodGV4dGJveCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNlbGVjdENlbGwoY2VsbENsYXNzLCBqc29uX2ZpbGVwYXRoKXtcbiAgICAvLyBnZXQgY2VsbFxuICAgIGNvbnN0IGNlbGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuYWN0aXZlLWVkaXRpbmcgdGQuJHtjZWxsQ2xhc3N9YCk7XG4gICAgLy8gYWRkIHNlcnZpY2UgZHJvcGRvd25cbiAgICBjb25zdCBzZXJ2aWNlRHJvcGRvd24gPSBhd2FpdCBEcm9wZG93bi5jcmVhdGVGcm9tSlNPTihqc29uX2ZpbGVwYXRoKTtcbiAgICBzZXJ2aWNlRHJvcGRvd24udmFsdWUgPSBjZWxsLnRleHRDb250ZW50O1xuICAgIC8vIENsZWFyIHRoZSBjdXJyZW50IGNvbnRlbnQgYW5kIGFwcGVuZCB0aGUgdGV4dGJveCB0byB0aGUgY2VsbFxuICAgIGNlbGwuaW5uZXJIVE1MID0gJyc7XG4gICAgY2VsbC5hcHBlbmRDaGlsZChzZXJ2aWNlRHJvcGRvd24pO1xufVxuXG5jb25zdCBDZWxsID0ge1xuICAgIGdldFZhbHVlOiBmdW5jdGlvbihyb3csIGNsYXNzTmFtZSkge1xuICAgICAgICByZXR1cm4gZ2V0Q2VsbFZhbHVlKHJvdywgY2xhc3NOYW1lKTsgXG4gICAgfSxcbiAgICBnZXRUZXh0OiBmdW5jdGlvbihyb3csIGNsYXNzTmFtZSkge1xuICAgICAgICByZXR1cm4gZ2V0Q2VsbFRleHQocm93LCBjbGFzc05hbWUpOyBcbiAgICB9LFxuICAgIHVwZGF0ZVZhbHVlOiBmdW5jdGlvbihyb3csIGNvbF9jbGFzcywgbmV3X3ZhbHVlKSB7XG4gICAgICAgIHVwZGF0ZVRhYmxlQ2VsbChyb3csIGNvbF9jbGFzcywgbmV3X3ZhbHVlKTsgXG4gICAgfSxcbiAgICBjcmVhdGVUZXh0Ym94IDogZnVuY3Rpb24oY2xhc3NOYW1lKSB7XG4gICAgICAgIGNyZWF0ZUVkaXRhYmxlQ2VsbChjbGFzc05hbWUpXG4gICAgfSxcbiAgICBjcmVhdGVEcm9wZG93biA6IGZ1bmN0aW9uKGNsYXNzTmFtZSwganNvbl9maWxlcGF0aCl7XG4gICAgICAgIGNyZWF0ZVNlbGVjdENlbGwoY2xhc3NOYW1lLCBqc29uX2ZpbGVwYXRoKTtcbiAgICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgQ2VsbDsiLCJpbXBvcnQgeyBmb3JtYXRDdXJyZW5jeSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jb21tb25fdXRpbHMuanNcIjtcblxuLy8gcG9zaXRpb24gaXMgaW5kZXggYXQgd2hpY2ggbmV3IGNvbHVtbiB3aWxsIGJlIGluc2VydGVkXG5mdW5jdGlvbiBhZGRDb2wocG9zaXRpb24sIGh0bWxDb250ZW50ID0gJycsIGhlYWRlclRpdGxlID0gJycpIHtcbiAgICAvLyBHZXQgdGhlIHRhYmxlIGVsZW1lbnQgYnkgaXRzIElEXG4gICAgbGV0IHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcblxuICAgIC8vIFZhbGlkYXRlIHBvc2l0aW9uXG4gICAgbGV0IG1heFBvc2l0aW9uID0gdGFibGUucm93c1swXS5jZWxscy5sZW5ndGg7XG4gICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+IG1heFBvc2l0aW9uKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBQb3NpdGlvbiAke3Bvc2l0aW9ufSBpcyBvdXQgb2YgYm91bmRzLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgXG4gICAgLy8gSW5zZXJ0IHRoZSBoZWFkZXIgaWYgcHJvdmlkZWRcbiAgICBsZXQgdGhlYWQgPSB0YWJsZS50SGVhZDtcbiAgICBpZiAoaGVhZGVyVGl0bGUgJiYgdGhlYWQpIHtcbiAgICAgIGxldCB0aCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RoJyk7XG4gICAgICB0aC5pbm5lckhUTUwgPSBoZWFkZXJUaXRsZTsgLy8gVXNlIGlubmVySFRNTCB0byBpbnNlcnQgSFRNTCBjb250ZW50XG4gICAgICB0aGVhZC5yb3dzWzBdLmluc2VydEJlZm9yZSh0aCwgdGhlYWQucm93c1swXS5jZWxsc1twb3NpdGlvbl0pO1xuICAgIH1cbiAgXG4gICAgLy8gSW5zZXJ0IG5ldyBjZWxscyBpbnRvIGVhY2ggcm93IG9mIHRoZSB0YWJsZSBib2R5XG4gICAgbGV0IHRib2R5ID0gdGFibGUudEJvZGllc1swXTtcbiAgICBpZiAodGJvZHkpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGJvZHkucm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgcm93ID0gdGJvZHkucm93c1tpXTtcbiAgICAgICAgbGV0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTtcbiAgICAgICAgdGQuaW5uZXJIVE1MID0gaHRtbENvbnRlbnQ7IC8vIFVzZSBpbm5lckhUTUwgdG8gaW5zZXJ0IEhUTUwgY29udGVudFxuICAgICAgICByb3cuaW5zZXJ0QmVmb3JlKHRkLCByb3cuY2VsbHNbcG9zaXRpb25dKTtcbiAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIG5jb2xzKCl7XG4gICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xuICAgIC8vIEVuc3VyZSB0aGF0IHRoZSByb3cgZXhpc3RzIGJlZm9yZSBjb3VudGluZyB0aGUgY29sdW1uc1xuICAgIHJldHVybiB0YWJsZS5yb3dzWzBdLmNlbGxzLmxlbmd0aDtcbn1cbiAgXG5mdW5jdGlvbiBhZGRDb2xUb0VuZChodG1sQ29udGVudHMgPSBbXSwgaGVhZGVyVGl0bGUgPSAnJyl7XG4gICAgLy8gY291bnQgY29sdW1ucyBhbmQgYWRkIG5ldyBjb2x1bW4gdG8gdGhlIGVuZFxuICAgIGNvbnN0IHBvc2l0aW9uID0gbmNvbHMoJ21haW4tdGFibGUnKTtcbiAgICBhZGRDb2wocG9zaXRpb24sIGh0bWxDb250ZW50cywgaGVhZGVyVGl0bGUpO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25DbGFzc1RvQ29sdW1uKGhlYWRlck5hbWUsIGNsYXNzTmFtZSkge1xuICAgIC8vIEdldCB0aGUgdGFibGUgZWxlbWVudCBieSBpdHMgSURcbiAgICBsZXQgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xuXG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiBieSBpdHMgaGVhZGVyIG5hbWVcbiAgICBjb25zdCB0aGVhZCA9IHRhYmxlLnRIZWFkO1xuICAgIGlmICghdGhlYWQgfHwgdGhlYWQucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignVGhlIHRhYmxlIGhlYWRlciBpcyBub3QgZm91bmQgb3IgaGFzIG5vIHJvd3MuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgbGV0IGhlYWRlckNlbGxJbmRleCA9IC0xO1xuICAgIGNvbnN0IGhlYWRlckNlbGxzID0gdGhlYWQucm93c1swXS5jZWxsczsgLy8gQXNzdW1pbmcgdGhlIGZpcnN0IHJvdyBjb250YWlucyBoZWFkZXIgY2VsbHMgKDx0aD4pXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJDZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaGVhZGVyQ2VsbHNbaV0udGV4dENvbnRlbnQudHJpbSgpID09PSBoZWFkZXJOYW1lKSB7XG4gICAgICAgICAgICBoZWFkZXJDZWxsSW5kZXggPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGVhZGVyQ2VsbEluZGV4ID09PSAtMSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBObyBoZWFkZXIgZm91bmQgd2l0aCBuYW1lIFwiJHtoZWFkZXJOYW1lfVwiYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gIFxuICAgIC8vIEFzc2lnbiB0aGUgY2xhc3MgdG8gZWFjaCBjZWxsIGluIHRoZSBzcGVjaWZpZWQgY29sdW1uIGluZGV4IHdpdGhpbiB0aGUgdGJvZHlcbiAgICBsZXQgdGJvZHkgPSB0YWJsZS50Qm9kaWVzWzBdO1xuICAgIGlmICh0Ym9keSkge1xuICAgICAgbGV0IGJvZHlSb3dzID0gdGJvZHkucm93cztcbiAgICAgIGZvciAobGV0IHJvdyBvZiBib2R5Um93cykge1xuICAgICAgICBpZiAocm93LmNlbGxzW2hlYWRlckNlbGxJbmRleF0pIHtcbiAgICAgICAgICByb3cuY2VsbHNbaGVhZGVyQ2VsbEluZGV4XS5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuZnVuY3Rpb24gYWRkQ29zdENsYXNzKGhlYWRlck5hbWUpe1xuICAgIGFzc2lnbkNsYXNzVG9Db2x1bW4oIGhlYWRlck5hbWUsICdjb3N0Jyk7XG5cbiAgICAvLyBHZXQgYWxsIHRoZSBjZWxscyB3aXRoIHRoZSBzcGVjaWZpZWQgY2xhc3MgbmFtZVxuICAgIGNvbnN0IGNlbGxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgLmNvc3RgKTtcbiAgICAgIFxuICAgIGNlbGxzLmZvckVhY2goY2VsbCA9PiB7XG4gICAgICAgIC8vIEdldCB0aGUgY3VycmVudCB0ZXh0IGNvbnRlbnQgb2YgdGhlIGNlbGwgYW5kIGFzc2lnbiBpdCB0byAndmFsdWUnIGF0dHJpYnV0ZVxuICAgICAgICBpZiAoIWNlbGwuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKXtcbiAgICAgICAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IGNlbGwudGV4dENvbnRlbnQudHJpbSgpO1xuICAgICAgICAgICAgY2VsbC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgY2VsbFZhbHVlKTtcblxuICAgICAgICAgICAgLy8gTm93IGZvcm1hdCB0aGUgdGV4dCBjb250ZW50IGxpa2UgY3VycmVuY3kgYW5kIHJlcGxhY2UgaXQgaW4gdGhlIGNlbGxcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZEN1cnJlbmN5ID0gZm9ybWF0Q3VycmVuY3kocGFyc2VGbG9hdChjZWxsVmFsdWUpKTtcbiAgICAgICAgICAgIGNlbGwudGV4dENvbnRlbnQgPSBmb3JtYXR0ZWRDdXJyZW5jeTtcbiAgICAgICAgfVxuICAgICAgXG4gICAgfSk7XG5cbn1cblxuZnVuY3Rpb24gYXNzaWduQ29sdW1uQ2xhc3Nlcyhjb2x1bW5EZWZpbml0aW9ucykge1xuICBjb2x1bW5EZWZpbml0aW9ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgICAvLyBBc3NpZ24gY2xhc3MgdG8gY29sdW1uXG4gICAgICBhc3NpZ25DbGFzc1RvQ29sdW1uKGNvbHVtbi50aXRsZSwgY29sdW1uLmNsYXNzTmFtZSk7XG5cbiAgICAgIC8vIElmIHRoZSBjb2x1bW4gaXMgYSBjb3N0IGNvbHVtbiwgYWRkIHRoZSBzcGVjaWZpYyBjb3N0IGNsYXNzXG4gICAgICBpZiAoY29sdW1uLmlzQ29zdCkge1xuICAgICAgICAgIGFkZENvc3RDbGFzcyhjb2x1bW4udGl0bGUpO1xuICAgICAgfVxuICB9KTtcbn1cblxuXG5jb25zdCBDb2x1bW4gPSB7XG4gIGFkZDogZnVuY3Rpb24ocG9zaXRpb24sIGh0bWxDb250ZW50LCBoZWFkZXJUaXRsZSkge1xuICAgICAgcmV0dXJuIGFkZENvbChwb3NpdGlvbiwgaHRtbENvbnRlbnQsIGhlYWRlclRpdGxlKTtcbiAgfSxcbiAgYWRkQXRFbmQ6IGZ1bmN0aW9uKGh0bWxDb250ZW50LCBoZWFkZXJUaXRsZSkge1xuICAgICAgcmV0dXJuIGFkZENvbFRvRW5kKGh0bWxDb250ZW50LCBoZWFkZXJUaXRsZSk7XG4gIH0sXG4gIGFzc2lnbkNsYXNzZXM6IGZ1bmN0aW9uKGNvbHVtbl9kZWZpbml0aW9ucykge1xuICAgICAgcmV0dXJuIGFzc2lnbkNvbHVtbkNsYXNzZXMoY29sdW1uX2RlZmluaXRpb25zKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQ29sdW1uOyIsImV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaEpTT04oanNvbkZpbGVQYXRoKSB7XG4gIHJldHVybiBmZXRjaChqc29uRmlsZVBhdGgpXG4gICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05ldHdvcmsgcmVzcG9uc2Ugd2FzIG5vdCBvaycpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICB9KTtcbn1cblxuXG4gICIsImltcG9ydCB7IGZldGNoSlNPTiB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9kYXRhX3V0aWxzL0pTT05fZGF0YV9oYW5kbGVycy5qc1wiO1xuXG5hc3luYyBmdW5jdGlvbiBsb2FkSlNPTkludG9UYWJsZShqc29uRmlsZVBhdGgpIHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgZmV0Y2hKU09OKGpzb25GaWxlUGF0aCk7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xuICAgICAgICAgICAgY29uc3QgdGhlYWQgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0aGVhZCcpO1xuICAgICAgICAgICAgY29uc3QgdGJvZHkgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keScpO1xuXG4gICAgICAgICAgICAvLyBjbGVhciBleGlzdGluZyBkYXRhXG4gICAgICAgICAgICB0aGVhZC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgICAgIHRib2R5LmlubmVySFRNTCA9ICcnO1xuICAgIFxuICAgICAgICAgICAgLy8gQ3JlYXRlIHRhYmxlIGhlYWRlciByb3dcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlclJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhkYXRhWzBdKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RoJyk7XG4gICAgICAgICAgICAgIGhlYWRlci50ZXh0Q29udGVudCA9IGtleTtcbiAgICAgICAgICAgICAgaGVhZGVyUm93LmFwcGVuZENoaWxkKGhlYWRlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoZWFkLmFwcGVuZENoaWxkKGhlYWRlclJvdyk7XG4gICAgXG4gICAgICAgICAgICAvLyBDcmVhdGUgdGFibGUgYm9keSByb3dzXG4gICAgICAgICAgICBkYXRhLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7XG4gICAgICAgICAgICAgIE9iamVjdC52YWx1ZXMoaXRlbSkuZm9yRWFjaCh2YWwgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpO1xuICAgICAgICAgICAgICAgIGNlbGwudGV4dENvbnRlbnQgPSB2YWw7XG4gICAgICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKGNlbGwpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGJvZHkuYXBwZW5kQ2hpbGQocm93KTtcbiAgICAgICAgICAgIH0pO1xuICAgIFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignVGhlIHByb3ZpZGVkIEpTT04gZmlsZSBkb2VzIG5vdCBjb250YWluIGFuIGFycmF5IG9mIG9iamVjdHMuJyk7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIGFuZCBwYXJzZSB0aGUgSlNPTiBmaWxlOicsIGVycm9yKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBEYXRhID0ge1xuICAgIGxvYWRGcm9tSlNPTiA6IGxvYWRKU09OSW50b1RhYmxlXG59XG5cbmV4cG9ydCBkZWZhdWx0IERhdGE7IiwiaW1wb3J0ICcuL3RhYmxlLmNzcyc7XG5cbmltcG9ydCBCdXR0b25zIGZyb20gJy4vc3ViY29tcG9uZW50cy9idXR0b25zLmpzJ1xuaW1wb3J0IENlbGwgZnJvbSAnLi9zdWJjb21wb25lbnRzL2NlbGxzLmpzJ1xuaW1wb3J0IENvbHVtbnMgZnJvbSAnLi9zdWJjb21wb25lbnRzL2NvbHVtbnMuanMnXG5pbXBvcnQgSGVhZGVyIGZyb20gJy4vc3ViY29tcG9uZW50cy9oZWFkZXJzLmpzJ1xuaW1wb3J0IFJvd3MgZnJvbSAnLi9zdWJjb21wb25lbnRzL3Jvd3MuanMnXG5pbXBvcnQgRGF0YSBmcm9tICcuL3N1YmNvbXBvbmVudHMvZGF0YS5qcydcblxuZnVuY3Rpb24gYWRqdXN0VGFibGVXaWR0aCh3aWR0aF9wY3Qpe1xuICAgIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcbiAgICB0YWJsZS5zdHlsZS53aWR0aCA9IHdpZHRoX3BjdDtcbn1cblxuZnVuY3Rpb24gY2xlYXJUYWJsZSgpe1xuICAgIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcbiAgICB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0aGVhZCcpLmlubmVySFRNTCA9ICcnO1xuICAgIHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5JykuaW5uZXJIVE1MID0gJyc7XG59XG5cbmZ1bmN0aW9uIHNob3dUYWJsZSgpe1xuICAgIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcbiAgICB0YWJsZS5zdHlsZS5kaXNwbGF5ID0gJ3RhYmxlJztcbn1cblxuZnVuY3Rpb24gaGlkZVRhYmxlKCl7XG4gICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xuICAgIHRhYmxlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgQnV0dG9ucy5BZGRSb3cuaGlkZSgpO1xufVxuXG5jb25zdCBUYWJsZSA9IHtcbiAgICBCdXR0b25zIDogQnV0dG9ucyxcbiAgICBDZWxsIDogQ2VsbCxcbiAgICBDb2x1bW5zIDogQ29sdW1ucyxcbiAgICBIZWFkZXIgOiBIZWFkZXIsXG4gICAgUm93cyA6IFJvd3MsXG4gICAgRGF0YSA6IERhdGEsXG4gICAgLy8gZnVuY3Rpb25zXG4gICAgYWRqdXN0V2lkdGggOiBmdW5jdGlvbih3aWR0aF9wY3Qpe1xuICAgICAgICBhZGp1c3RUYWJsZVdpZHRoKHdpZHRoX3BjdClcbiAgICB9LFxuICAgIGNsZWFyIDogY2xlYXJUYWJsZSxcbiAgICBoaWRlIDogaGlkZVRhYmxlLFxuICAgIHNob3cgOiBzaG93VGFibGVcbn1cblxuZXhwb3J0IGRlZmF1bHQgVGFibGU7IiwiaW1wb3J0ICcuL2JvZHkuY3NzJztcblxuaW1wb3J0IFdlbGNvbWUgZnJvbSAnLi4vLi4vY29tcG9uZW50cy93ZWxjb21lL3dlbGNvbWUuanMnXG5pbXBvcnQgTW9kYWwgZnJvbSAnLi4vbW9kYWwvbW9kYWwuanMnO1xuaW1wb3J0IE5hdkJ1dHRvbnMgZnJvbSAnLi4vbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanMnO1xuaW1wb3J0IFByb21wdCBmcm9tICcuLi9wcm9tcHQvcHJvbXB0LmpzJztcbmltcG9ydCBTaWRlYmFyIGZyb20gJy4uL3NpZGViYXIvc2lkZWJhci5qcyc7XG5pbXBvcnQgVGFibGUgZnJvbSAnLi4vdGFibGUvdGFibGUuanMnO1xuXG5mdW5jdGlvbiByZXNldFBhZ2UoKSB7XG4gICAgLy8gaGlkZSBldmVyeXRoaW5nIGluIHRoZSBib2R5XG4gICAgV2VsY29tZS5oaWRlKCk7XG4gICAgTW9kYWwuY2xlYXIoKTtcbiAgICBNb2RhbC5oaWRlKCk7XG4gICAgTmF2QnV0dG9ucy5oaWRlKCk7XG4gICAgUHJvbXB0LmhpZGUoKTtcbiAgICBUYWJsZS5oaWRlKCk7XG4gICAgU2lkZWJhci5oaWRlKCk7XG4gICAgLy8gZGlzYWJsZSBuZXh0IGJ1dHRvblxuICAgIE5hdkJ1dHRvbnMuTmV4dC5kaXNhYmxlKCk7XG4gICAgUHJvbXB0LkJ1dHRvbnMucmVzZXQoKTtcbn1cblxuZXhwb3J0IGNvbnN0IEJvZHkgPSB7XG4gICAgcmVzZXQgOiByZXNldFBhZ2Vcbn1cblxuZXhwb3J0IGRlZmF1bHQgQm9keTsiLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vZm9ybS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9mb3JtLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIi8vIGZ1bmN0aW9uIHRvIGFkZCBxdWVzdGlvbnMgdG8gZm9ybXNcbi8vIHR5cGUgaXMgJ2lucHV0JyBvciAndGV4dGFyZWEnXG4vLyBpbnB1dFR5cGUgaXMgZm9yIHZhbGlkYXRpb24gKCdudW1iZXInIG9yICd0ZXh0JywgZXRjKVxuZnVuY3Rpb24gYXBwZW5kRm9ybUVsZW1lbnQodHlwZSwgbGFiZWwsIGlucHV0SWQsIHJlcXVpcmVkLCBpbnB1dFR5cGUsIGZvcm1faWQgPSAnbmV3LWZvcm0nLCBjb3N0ID0gZmFsc2UpIHtcblxuICAgIC8vIGNoYW5nZSBpZiB3ZSB3YW50IGZvcm1zIGVsc2V3aGVyZVxuICAgIGNvbnN0IGZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmb3JtX2lkKTtcblxuICAgIC8vIGNyZWF0ZSBvdXRlciB3cmFwcGVyIGZvciBlbGVtZW50XG4gICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyAgXG5cbiAgICAvLyBsYWJlbCBxdWVzdGlvblxuICAgIGNvbnN0IGxhYmVsRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuICAgIGxhYmVsRWwudGV4dENvbnRlbnQgPSBsYWJlbDtcbiAgXG4gICAgLy8gc2V0IHR5cGUgKGlucHV0IG9yIHRleHRhcmVhKVxuICAgIGxldCBpbnB1dEVsO1xuICAgIGlmICh0eXBlID09PSAnaW5wdXQnKSB7XG4gICAgICBpbnB1dEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgIGlucHV0RWwudHlwZSA9IGlucHV0VHlwZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd0ZXh0YXJlYScpIHtcbiAgICAgIGlucHV0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGVsZW1lbnQgdHlwZScpO1xuICAgIH1cbiAgXG4gICAgLy8gbWFyayBhcyByZXF1aXJlZCBpZiBhcHBsaWNhYmxlXG4gICAgaW5wdXRFbC5yZXF1aXJlZCA9IHJlcXVpcmVkO1xuXG4gICAgLy8gSWYgYW4gSUQgaXMgcHJvdmlkZWQsIHNldCBpdCBvbiB0aGUgZWxlbWVudFxuICAgIGlmIChpbnB1dElkKSB7XG4gICAgICAgIGlucHV0RWwuaWQgPSBpbnB1dElkO1xuICAgIH1cbiAgXG4gICAgLy8gYWRkIGVsZW1lbnRzXG4gICAgd3JhcHBlci5hcHBlbmRDaGlsZChsYWJlbEVsKTtcbiAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGlucHV0RWwpO1xuICAgIGZvcm0uYXBwZW5kQ2hpbGQod3JhcHBlcik7XG59IFxuXG5leHBvcnQgY29uc3QgTmV3RmllbGQgPSB7XG4gICAgc2hvcnRUZXh0IDogZnVuY3Rpb24obGFiZWwsIGlucHV0SWQsIHJlcXVpcmVkID0gZmFsc2UsIGZvcm1faWQgPSAnbmV3LWZvcm0nLCBjb3N0ID0gZmFsc2UpIHtcbiAgICAgICAgYXBwZW5kRm9ybUVsZW1lbnQoJ2lucHV0JywgbGFiZWwsIGlucHV0SWQsIHJlcXVpcmVkLCAndGV4dCcsIGZvcm1faWQpO1xuICAgIH0sXG4gICAgbG9uZ1RleHQgOiBmdW5jdGlvbihsYWJlbCwgaW5wdXRJZCwgcmVxdWlyZWQgPSBmYWxzZSwgZm9ybV9pZCA9ICduZXctZm9ybScsIGNvc3QgPSBmYWxzZSkge1xuICAgICAgICBhcHBlbmRGb3JtRWxlbWVudCgndGV4dGFyZWEnLCBsYWJlbCwgaW5wdXRJZCwgcmVxdWlyZWQsIGZvcm1faWQpO1xuICAgIH0sXG4gICAgbnVtZXJpY0lucHV0OiBmdW5jdGlvbihsYWJlbCwgaW5wdXRJZCwgcmVxdWlyZWQgPSBmYWxzZSwgZm9ybV9pZCA9ICduZXctZm9ybScsIGNvc3QgPSB0cnVlKSB7XG4gICAgICAgIGFwcGVuZEZvcm1FbGVtZW50KCdpbnB1dCcsIGxhYmVsLCBpbnB1dElkLCByZXF1aXJlZCwgJ251bWJlcicsIGZvcm1faWQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTmV3RmllbGQ7IiwiZnVuY3Rpb24gYWRkU3VibWl0QnV0dG9uVG9Gb3JtKGZvcm1faWQpIHtcbiAgICAvLyBGaW5kIHRoZSBmb3JtIGJ5IGl0cyBJRFxuICAgIGNvbnN0IGZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmb3JtX2lkKTtcbiAgXG4gICAgLy8gQ3JlYXRlIHRoZSBjb250YWluZXIgYGRpdmAgZm9yIHRoZSBidXR0b25cbiAgICBjb25zdCBidXR0b25Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBidXR0b25Db250YWluZXIuaWQgPSAnc3VibWl0LWJ0bi1jb250YWluZXInO1xuICAgIFxuICAgIC8vIENyZWF0ZSB0aGUgc3VibWl0IGlucHV0XG4gICAgY29uc3Qgc3VibWl0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIHN1Ym1pdElucHV0LmNsYXNzTmFtZSA9ICdidG4gYnRuLXN1Ym1pdCc7IC8vIFVzZSBhcHByb3ByaWF0ZSBjbGFzcyBmb3IgeW91ciBkZXNpZ25cbiAgICBzdWJtaXRJbnB1dC50eXBlID0gJ3N1Ym1pdCc7XG4gICAgc3VibWl0SW5wdXQudmFsdWUgPSAnU3VibWl0JztcblxuICAgIC8vIEFwcGVuZCB0aGUgc3VibWl0IGlucHV0IHRvIHRoZSBjb250YWluZXJcbiAgICBidXR0b25Db250YWluZXIuYXBwZW5kQ2hpbGQoc3VibWl0SW5wdXQpO1xuICAgIFxuICAgIC8vIEFwcGVuZCB0aGUgY29udGFpbmVyIHRvIHRoZSBmb3JtXG4gICAgZm9ybS5hcHBlbmRDaGlsZChidXR0b25Db250YWluZXIpO1xufVxuXG5leHBvcnQgY29uc3QgU3VibWl0QnV0dG9uID0ge1xuICAgIGFkZCA6IGZ1bmN0aW9uKCkgeyBhZGRTdWJtaXRCdXR0b25Ub0Zvcm0oJ25ldy1mb3JtJykgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTdWJtaXRCdXR0b247IiwiaW1wb3J0ICcuL2Zvcm0uY3NzJztcblxuaW1wb3J0IERyb3Bkb3duIGZyb20gXCIuL3N1YmNvbXBvbmVudHMvZHJvcGRvd24uanNcIjtcbmltcG9ydCBOZXdGaWVsZCBmcm9tIFwiLi9zdWJjb21wb25lbnRzL2ZpZWxkcy5qc1wiO1xuaW1wb3J0IFN1Ym1pdEJ1dHRvbiBmcm9tIFwiLi9zdWJjb21wb25lbnRzL3N1Ym1pdC5qc1wiO1xuXG5mdW5jdGlvbiBmZXRjaEFsbFJlc3BvbnNlcyhldmVudCkge1xuXG4gICAgLy8gQXNzdW1pbmcgYGV2ZW50LnRhcmdldGAgaXMgdGhlIGZvcm0gaXRzZWxmXG4gICAgY29uc3QgZm9ybSA9IGV2ZW50LnRhcmdldDtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGFuIGVtcHR5IGFycmF5IHRvIGhvbGQgdGhlIGlucHV0IHZhbHVlc1xuICAgIGxldCBmb3JtRGF0YSA9IHt9O1xuICAgIFxuICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIGZvcm0gZWxlbWVudFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9ybS5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGZvcm0uZWxlbWVudHNbaV07XG4gICAgICBcbiAgICAgIC8vIEV4Y2x1ZGUgZWxlbWVudHMgdGhhdCBhcmVuJ3QgaW5wdXRzLCB0ZXh0YXJlYXMsIG9yIHNlbGVjdFxuICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fFxuICAgICAgICAgIGVsZW1lbnQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyB8fFxuICAgICAgICAgIGVsZW1lbnQudGFnTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgLy8gRXhjbHVkZSBpbnB1dCB0eXBlcyB0aGF0IGFyZSBub3QgY29uc2lkZXJlZCBmb3Igc3VibWlzc2lvbiAoc3VjaCBhcyBgc3VibWl0YClcbiAgICAgICAgaWYgKGVsZW1lbnQudHlwZSAhPT0gJ3N1Ym1pdCcgJiYgZWxlbWVudC50eXBlICE9PSAnYnV0dG9uJykge1xuICAgICAgICAgIGZvcm1EYXRhW2VsZW1lbnQuaWRdID0gZWxlbWVudC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBmb3JtLnJlc2V0KCk7XG4gICAgcmV0dXJuIGZvcm1EYXRhO1xufVxuXG5mdW5jdGlvbiBhZGRGb3JtKGVsZW1lbnRfaWQgPSAnbW9kYWwtYm9keScsIGZvcm1faWQgPSAnbmV3LWZvcm0nKSB7XG4gIFxuICBjb25zdCB0YXJnZXRfZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRfaWQpO1xuXG4gIC8vIGNyZWF0ZSBmb3JtXG4gIGNvbnN0IGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7XG4gIGZvcm0uc2V0QXR0cmlidXRlKCdpZCcsIGZvcm1faWQpO1xuXG4gIC8vIEFwcGVuZCB0aGUgZm9ybSB0byB0aGUgbW9kYWwgYm9keVxuICB0YXJnZXRfZWxlbS5hcHBlbmRDaGlsZChmb3JtKTtcblxufVxuXG5leHBvcnQgY29uc3QgRm9ybSA9IHtcbiAgbmV3IDogZnVuY3Rpb24ocGFyZW50X2VsZW1faWQpIHsgYWRkRm9ybShwYXJlbnRfZWxlbV9pZCwgJ25ldy1mb3JtJykgfSxcbiAgZmV0Y2hBbGxSZXNwb25zZXMgOiBmdW5jdGlvbihldmVudCkgeyByZXR1cm4gZmV0Y2hBbGxSZXNwb25zZXMoZXZlbnQpIH0sXG4gIE5ld0ZpZWxkIDogTmV3RmllbGQsXG4gIERyb3Bkb3duIDogRHJvcGRvd24sXG4gIFN1Ym1pdEJ1dHRvbiA6IFN1Ym1pdEJ1dHRvblxufVxuXG5leHBvcnQgZGVmYXVsdCBGb3JtOyIsIlxuaW1wb3J0IFByb21wdCBmcm9tICcuLi8uLi9jb21wb25lbnRzL3Byb21wdC9wcm9tcHQuanMnXG5pbXBvcnQgTW9kYWwgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9tb2RhbC9tb2RhbC5qcydcbmltcG9ydCBGb3JtIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvZm9ybS9mb3JtLmpzJ1xuaW1wb3J0IFRhYmxlIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdGFibGUvdGFibGUuanMnXG5pbXBvcnQgQm9keSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2JvZHkvYm9keS5qcydcbmltcG9ydCBOYXZCdXR0b25zIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanMnXG5pbXBvcnQgeyBwYXVzZUFuZENvbnRpbnVlIH0gZnJvbSAnLi4vdmlld19sb2dpYy5qcydcbmltcG9ydCBTdWJ0aXRsZSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplUGFnZVZpZXcoKSB7XG4gICAgLy8gUHJlcGFyZSBwYWdlIHZpZXdcbiAgICBCb2R5LnJlc2V0KCk7XG4gICAgTmF2QnV0dG9ucy5zaG93KCk7XG5cbiAgICAvLyBMb2FkIHRleHRcbiAgICBTdWJ0aXRsZS51cGRhdGUoJ05ldyBJbml0aWF0aXZlcycpO1xuICAgIFByb21wdC5UZXh0LnVwZGF0ZSgnRG8geW91IGhhdmUgYW55IG5ldyBpbml0aWF0aXZlcyBmb3IgRlkyNj8nKTtcbiAgICBQcm9tcHQuQnV0dG9ucy5MZWZ0LnVwZGF0ZVRleHQoJ1llcycpO1xuICAgIFByb21wdC5CdXR0b25zLlJpZ2h0LnVwZGF0ZVRleHQoJ05vJyk7XG4gICAgLy8gY2xpY2tpbmcgJ25vIG5ldyBpbml0aWFsaXRpdmVzJyB3aWxsIGFsc28gdGFrZSB1cyB0byB0aGUgbmV4dCBwYWdlXG4gICAgUHJvbXB0LkJ1dHRvbnMuUmlnaHQuYWRkQWN0aW9uKHBhdXNlQW5kQ29udGludWUpO1xuICAgIFByb21wdC5CdXR0b25zLkxlZnQuYWRkQWN0aW9uKE5hdkJ1dHRvbnMuTmV4dC5lbmFibGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0VXBNb2RhbCgpIHtcbiAgICAvLyBJbml0aWFsaXplIG1vZGFsXG4gICAgTW9kYWwuY2xlYXIoKTtcbiAgICBNb2RhbC5MaW5rLmFkZCgnb3B0aW9uMScpO1xuICAgIE1vZGFsLlRpdGxlLnVwZGF0ZSgnTmV3IGluaXRpYXRpdmUnKTtcbiAgICBNb2RhbC5MaW5rLmFkZCgnYWRkLWJ0bicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0VXBGb3JtKCkge1xuICAgIC8vIFNldCB1cCBmb3JtXG4gICAgRm9ybS5uZXcoJ21vZGFsLWJvZHknKTtcbiAgICBGb3JtLk5ld0ZpZWxkLnNob3J0VGV4dCgnSW5pdGlhdGl2ZSBOYW1lOicsICdJbml0aWF0aXZlIE5hbWUnLCB0cnVlKTsgXG4gICAgRm9ybS5OZXdGaWVsZC5sb25nVGV4dCgnRXhwbGFpbiB3aHkgdGhpcyBpbml0aWF0aXZlIGlzIG5lY2Vzc2FyeSBhbmQgZGVzY3JpYmUgaXRzIHBvdGVudGlhbCBpbXBhY3QuJywgJ0V4cGxhbmF0aW9uJywgdHJ1ZSk7XG4gICAgRm9ybS5OZXdGaWVsZC5udW1lcmljSW5wdXQoJ0VzdGltYXRlIG9mIEFERElUT05BTCByZXZlbnVlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluaXRpYXRpdmU/JywgJ1JldmVudWUnLCB0cnVlKTtcbiAgICBGb3JtLk5ld0ZpZWxkLm51bWVyaWNJbnB1dCgnRXN0aW1hdGUgb2YgQURESVRPTkFMIHBlcnNvbm5lbCBjb3N0PycsICdQZXJzb25uZWwgQ29zdCcsIHRydWUpO1xuICAgIEZvcm0uTmV3RmllbGQubnVtZXJpY0lucHV0KCdFc3RpbWF0ZSBvZiBBRERJVE9OQUwgbm9ucGVyc29ubmVsIGNvc3Q/JywgJ05vbi1wZXJzb25uZWwgQ29zdCcsIHRydWUpO1xuICAgIEZvcm0uU3VibWl0QnV0dG9uLmFkZCgpO1xuICAgIC8vIEluaXRpYWxpemUgZm9ybSBzdWJtaXNzaW9uIHRvIHRhYmxlIGRhdGFcbiAgICBoYW5kbGVGb3JtU3VibWlzc2lvbnMoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFVwVGFibGUoKSB7XG4gICAgLy8gU2V0IHVwIHRhYmxlXG4gICAgVGFibGUuY2xlYXIoKTtcbiAgICBUYWJsZS5hZGp1c3RXaWR0aCgnNzAlJyk7XG4gICAgVGFibGUuQnV0dG9ucy5BZGRSb3cudXBkYXRlVGV4dCgnQWRkIGFub3RoZXIgbmV3IGluaXRpYXRpdmUnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUZvcm1TdWJtaXNzaW9ucyhldmVudCl7XG4gICAgICAgIC8vIGluaXRpYWxpemUgZm9ybSBzdWJtaXNzaW9uXG4gICAgICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tbW9kYWwnKTtcbiAgICAgICAgbW9kYWwuYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAvLyBnZXQgYW5zd2VycyBmcm9tIGZvcm0sIGhpZGUgZm9ybSwgc2hvdyBhbnN3ZXJzIGluIHRhYmxlXG4gICAgICAgICAgICBjb25zdCByZXNwb25zZXMgPSBGb3JtLmZldGNoQWxsUmVzcG9uc2VzKGV2ZW50KTtcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbiBlbXB0eSByZXNwb25zZVxuICAgICAgICAgICAgaWYgKE9iamVjdC52YWx1ZXMocmVzcG9uc2VzKVswXSAhPSAnJyl7XG4gICAgICAgICAgICAgICAgLy8gY2hhbmdlIHBhZ2Ugdmlld1xuICAgICAgICAgICAgICAgIE1vZGFsLmhpZGUoKTtcbiAgICAgICAgICAgICAgICBQcm9tcHQuaGlkZSgpO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBhZGQgZGF0YSB0byB0YWJsZVxuICAgICAgICAgICAgICAgIFRhYmxlLlJvd3MuYWRkKHJlc3BvbnNlcyk7XG4gICAgICAgICAgICAgICAgVGFibGUuc2hvdygpO1xuICAgICAgICAgICAgICAgIFRhYmxlLkJ1dHRvbnMuQWRkUm93LnNob3coKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBzYXZlIHRhYmxlIGRhdGFcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBlZGl0IGNvc3QgdG8gc2hvdyBjdXJyZW5jeSBjb3JyZWN0bHlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU1vZGFsTGlua3MoKXtcbiAgICBNb2RhbC5MaW5rLnJlbW92ZSgnb3B0aW9uMScpO1xuICAgIE1vZGFsLkxpbmsucmVtb3ZlKCdhZGQtYnRuJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVQcm9tcHRCdXR0b25MaXN0ZW5lcnMoKXtcbiAgICBQcm9tcHQuQnV0dG9ucy5SaWdodC5yZW1vdmVBY3Rpb24ocGF1c2VBbmRDb250aW51ZSk7XG4gICAgUHJvbXB0LkJ1dHRvbnMuTGVmdC5yZW1vdmVBY3Rpb24oTmF2QnV0dG9ucy5OZXh0LmVuYWJsZSk7XG59IiwiXG5pbXBvcnQgeyBpbml0aWFsaXplUGFnZVZpZXcsIHNldFVwTW9kYWwsIHNldFVwRm9ybSwgc2V0VXBUYWJsZSwgcmVtb3ZlTW9kYWxMaW5rcywgcmVtb3ZlUHJvbXB0QnV0dG9uTGlzdGVuZXJzIH0gZnJvbSAnLi9oZWxwZXJzLmpzJ1xuaW1wb3J0IHsgdXBkYXRlUGFnZVN0YXRlIH0gZnJvbSAnLi4vLi4vdXRpbHMvZGF0YV91dGlscy9sb2NhbF9zdG9yYWdlX2hhbmRsZXJzLmpzJ1xuXG5cbi8vIHNldCB1cCBwYWdlIGFuZCBpbml0aWFsaXplIGFsbCBidXR0b25zXG5leHBvcnQgZnVuY3Rpb24gbG9hZE5ld0luaXRpYXRpdmVzKCkge1xuICAgIHVwZGF0ZVBhZ2VTdGF0ZSgnbmV3LWluaXRzJyk7XG4gICAgaW5pdGlhbGl6ZVBhZ2VWaWV3KCk7XG4gICAgc2V0VXBNb2RhbCgpO1xuICAgIHNldFVwRm9ybSgpO1xuICAgIHNldFVwVGFibGUoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuVXBJbml0aWF0aXZlc1BhZ2UoKSB7XG4gICAgcmVtb3ZlTW9kYWxMaW5rcygpO1xuICAgIC8vIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgb24gcHJvbXB0IGJ1dHRvbnNcbiAgICByZW1vdmVQcm9tcHRCdXR0b25MaXN0ZW5lcnMoKTtcbn0iLCJpbXBvcnQgeyB1cGRhdGVQYWdlU3RhdGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZGF0YV91dGlscy9sb2NhbF9zdG9yYWdlX2hhbmRsZXJzLmpzXCI7XG5pbXBvcnQgUHJvbXB0IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcHJvbXB0L3Byb21wdC5qcydcbmltcG9ydCB7IGluaXRpYWxpemVXZWxjb21lUGFnZSB9IGZyb20gXCIuLi8wMF93ZWxjb21lL21haW4uanNcIjtcbmltcG9ydCBCb2R5IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL2JvZHkvYm9keS5qc1wiO1xuaW1wb3J0IFN1YnRpdGxlIGZyb20gXCIuLi8uLi9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuanNcIjtcbmltcG9ydCB7IHZpc2l0UGFnZSB9IGZyb20gXCIuLi92aWV3X2xvZ2ljLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkU3VtbWFyeVBhZ2UoKXtcbiAgICAvL3VwZGF0ZSBwYWdlIHN0YXRlXG4gICAgdXBkYXRlUGFnZVN0YXRlKCdzdW1tYXJ5Jyk7XG5cbiAgICAvLyBwcmVwYXJlIHBhZ2Ugdmlld1xuICAgIEJvZHkucmVzZXQoKTtcbiAgICBQcm9tcHQuQnV0dG9ucy5MZWZ0LnVwZGF0ZVRleHQoJ0Rvd25sb2FkIEV4Y2VsJyk7XG4gICAgUHJvbXB0LkJ1dHRvbnMuUmlnaHQudXBkYXRlVGV4dCgnR28gYmFjayBhbmQgZWRpdCcpO1xuXG4gICAgLy8gdXBkYXRlIHBhZ2UgdGV4dFxuICAgIFN1YnRpdGxlLnVwZGF0ZSgnU3VtbWFyeScpO1xuICAgIC8vIFRPRE86IHVwZGF0ZSB0byBtYWtlIGR5bmFtaWNcbiAgICBQcm9tcHQuVGV4dC51cGRhdGUoYFBsYWNlaG9sZGVyIGZvciBzdW1tYXJ5IGFuZCBhbnkgaXNzdWVzLmApO1xuICAgIFByb21wdC5CdXR0b25zLlJpZ2h0LmFkZEFjdGlvbihyZXR1cm5Ub1dlbGNvbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcFN1bW1hcnlQYWdlKCl7XG4gICAgUHJvbXB0LkJ1dHRvbnMuUmlnaHQucmVtb3ZlQWN0aW9uKHJldHVyblRvV2VsY29tZSk7XG59XG5cbmNvbnN0IHJldHVyblRvV2VsY29tZSA9ICgpID0+IHt2aXNpdFBhZ2UoJ3dlbGNvbWUnKX0iLCJcbmltcG9ydCBTdWJ0aXRsZSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuanMnXG5pbXBvcnQgUHJvbXB0IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcHJvbXB0L3Byb21wdC5qcydcbmltcG9ydCBOYXZCdXR0b25zIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanMnXG5pbXBvcnQgVGFibGUgZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvdGFibGUvdGFibGUuanNcIjtcbmltcG9ydCB7IERBVEFfUk9PVCB9IGZyb20gXCIuLi8uLi9pbml0LmpzXCI7XG5pbXBvcnQgQm9keSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9ib2R5L2JvZHkuanNcIjtcblxuY29uc3QgZnVuZENvbHMgPSBbXG4gICAgeyB0aXRsZTogJ0lEJywgY2xhc3NOYW1lOiAnZnVuZC1pZCcgfSxcbiAgICB7IHRpdGxlOiAnTmFtZScsIGNsYXNzTmFtZTogJ2Z1bmQtbmFtZScgfSxcbl07XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlUGFnZVZpZXcoKXtcbiAgICBcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImZ1bmRcIiwgJycpO1xuXG4gICAgLy8gcHJlcGFyZSBwYWdlIHZpZXdcbiAgICBCb2R5LnJlc2V0KCk7XG4gICAgTmF2QnV0dG9ucy5zaG93KCk7XG5cbiAgICAvLyB1cGRhdGUgcGFnZSB0ZXh0XG4gICAgU3VidGl0bGUudXBkYXRlKCdCYXNlbGluZSBCdWRnZXQgUmVxdWVzdCcpO1xuICAgIC8vIFRPRE86IHVwZGF0ZSB0byBtYWtlIGR5bmFtaWNcbiAgICBQcm9tcHQuVGV4dC51cGRhdGUoYFdlIHdpbGwgbm93IGFzayB5b3UgYSBzZXJpZXMgb2YgcXVlc3Rpb25zIGFib3V0IHlvdXIgQkFTRUxJTkUgYnVkZ2V0IHJlcXVlc3QuXG4gICAgICAgIEF0IHRoZSBlbmQsIHdlIHdpbGwgYXNrIHlvdSBhYm91dCBhbnkgbmV3IGluaXRpYXRpdmVzIChpZS4gc3VwcGxlbWVudGFsIHJlcXVlc3RzKS5cbiAgICAgICAgU2VsZWN0IG9uZSBvZiB5b3VyIGZ1bmRzIHRvIGJlZ2luLmApO1xufVxuXG5mdW5jdGlvbiBhbGxvd1Jvd1NlbGVjdGlvbigpe1xuICAgIHZhciB0YWJsZVJvd3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwidGJvZHkgdHJcIik7XG4gICAgdGFibGVSb3dzLmZvckVhY2goZnVuY3Rpb24ocm93KSB7XG4gICAgICAgIHJvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnaG92ZXItZWZmZWN0Jyk7XG4gICAgICAgIH0pO1xuICAgICAgICByb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZSgnaG92ZXItZWZmZWN0Jyk7XG4gICAgICAgIH0pO1xuICAgICAgICByb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGVjdEZ1bmQodGFibGVSb3dzLCB0aGlzKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplRnVuZFRhYmxlKCl7XG4gICAgYXdhaXQgVGFibGUuRGF0YS5sb2FkRnJvbUpTT04oREFUQV9ST09UICsgJ2Z1bmRzLmpzb24nKVxuICAgIFRhYmxlLmFkanVzdFdpZHRoKCcxMDAlJyk7XG4gICAgVGFibGUuc2hvdygpO1xuICAgIFRhYmxlLkNvbHVtbnMuYXNzaWduQ2xhc3NlcyhmdW5kQ29scyk7XG4gICAgYWxsb3dSb3dTZWxlY3Rpb24oKTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0RnVuZCh0YWJsZVJvd3MsIHNlbGVjdGVkX3Jvdyl7XG4gICAgLy8gcmVtb3ZlIHNlbGVjdGVkIGNsYXNzIGZyb20gYW55IG90aGVyIHJvd3NcbiAgICB0YWJsZVJvd3MuZm9yRWFjaChmdW5jdGlvbih0YWJsZVJvdykge1xuICAgICAgICB0YWJsZVJvdy5jbGFzc0xpc3QgPSAnJztcbiAgICB9KTtcbiAgICAvLyBhZGQgc2VsZWN0ZWQgY2xhc3MgdG8gY2xpY2tlZCByb3dcbiAgICBzZWxlY3RlZF9yb3cuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICAvLyBnZXQgZnVuZCBhbmQgc2F2ZSBzZWxlY3RlZCBmdW5kXG4gICAgdmFyIGZ1bmQgPSBzZWxlY3RlZF9yb3cucXVlcnlTZWxlY3RvcignLmZ1bmQtbmFtZScpLnRleHRDb250ZW50O1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZnVuZFwiLCBmdW5kKTtcblxuICAgIC8vIGVuYWJsZSBuZXh0IHN0ZXBcbiAgICBOYXZCdXR0b25zLk5leHQuZW5hYmxlKCk7XG59IiwiaW1wb3J0IHsgdXBkYXRlUGFnZVN0YXRlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2RhdGFfdXRpbHMvbG9jYWxfc3RvcmFnZV9oYW5kbGVycy5qc1wiO1xuaW1wb3J0IHsgcHJlcGFyZVBhZ2VWaWV3LCBpbml0aWFsaXplRnVuZFRhYmxlIH0gZnJvbSBcIi4uLzAyX2Jhc2VsaW5lX2xhbmRpbmdfcGFnZS9oZWxwZXJzLmpzXCI7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRCYXNlbGluZUxhbmRpbmdQYWdlKCl7XG4gICAgLy91cGRhdGUgcGFnZSBzdGF0ZVxuICAgIHVwZGF0ZVBhZ2VTdGF0ZSgnYmFzZWxpbmUtbGFuZGluZycpO1xuICAgIHByZXBhcmVQYWdlVmlldygpO1xuICAgIGluaXRpYWxpemVGdW5kVGFibGUoKTtcbn1cbiIsImltcG9ydCBTdWJ0aXRsZSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuanMnXG5pbXBvcnQgUHJvbXB0IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcHJvbXB0L3Byb21wdC5qcydcbmltcG9ydCBOYXZCdXR0b25zIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanMnXG5pbXBvcnQgQm9keSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9ib2R5L2JvZHkuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVQYWdlVmlldygpIHtcblxuICAgIC8vIHJlbW92ZSBmdW5kIHNlbGVjdGlvblxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZnVuZFwiLCAnJyk7XG5cbiAgICAvLyBwcmVwYXJlIHBhZ2Ugdmlld1xuICAgIEJvZHkucmVzZXQoKTtcbiAgICBOYXZCdXR0b25zLnNob3coKTtcblxuICAgIC8vIHVwZGF0ZSBwYWdlIHRleHRcbiAgICBTdWJ0aXRsZS51cGRhdGUoJ0V4Y2VsIFVwbG9hZCcpO1xuXG4gICAgLy8gVE9ETzogdXBkYXRlIHRvIG1ha2UgdXBsb2FkIGFjdHVhbGx5IHdvcmtcbiAgICBQcm9tcHQuVGV4dC51cGRhdGUoYFBsYWNlaG9sZGVyIGZvciBFeGNlbCBVcGxvYWRgKTtcbiAgICBQcm9tcHQuQnV0dG9ucy5MZWZ0LnVwZGF0ZVRleHQoJ1VwbG9hZCcpO1xuICAgIFByb21wdC5CdXR0b25zLkxlZnQuc2hvdygpO1xuICAgIFByb21wdC5CdXR0b25zLkxlZnQuYWRkQWN0aW9uKHVwbG9hZEV4Y2VsQWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gdXBsb2FkRXhjZWxBY3Rpb24oKSB7XG4gICAgTmF2QnV0dG9ucy5OZXh0LmVuYWJsZSgpO1xufSIsImltcG9ydCB7IHVwZGF0ZVBhZ2VTdGF0ZSB9IGZyb20gXCIuLi8uLi91dGlscy9kYXRhX3V0aWxzL2xvY2FsX3N0b3JhZ2VfaGFuZGxlcnMuanNcIjtcbmltcG9ydCB7IGluaXRpYWxpemVQYWdlVmlldyB9IGZyb20gXCIuL2hlbHBlcnMuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRVcGxvYWRQYWdlKCl7XG4gICAgLy91cGRhdGUgcGFnZSBzdGF0ZVxuICAgIHVwZGF0ZVBhZ2VTdGF0ZSgndXBsb2FkJyk7XG4gICAgaW5pdGlhbGl6ZVBhZ2VWaWV3KCk7XG4gICAgXG59IiwiaW1wb3J0IFN1YnRpdGxlIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvaGVhZGVyL2hlYWRlci5qcydcbmltcG9ydCBXZWxjb21lIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvd2VsY29tZS93ZWxjb21lLmpzJ1xuaW1wb3J0IEJvZHkgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9ib2R5L2JvZHkuanMnXG5cbmltcG9ydCB7IGxvYWROZXdJbml0aWF0aXZlcyB9IGZyb20gJy4uLzA2X25ld19pbml0aWF0aXZlcy9tYWluLmpzJ1xuaW1wb3J0IHsgbG9hZFN1bW1hcnlQYWdlIH0gZnJvbSAnLi4vMDdfc3VtbWFyeS9tYWluLmpzJ1xuaW1wb3J0IHsgbG9hZEJhc2VsaW5lTGFuZGluZ1BhZ2UgfSBmcm9tICcuLi8wMl9iYXNlbGluZV9sYW5kaW5nX3BhZ2UvbWFpbi5qcydcbmltcG9ydCB7IGxvYWRVcGxvYWRQYWdlIH0gZnJvbSAnLi4vMDFfdXBsb2FkL21haW4uanMnXG4gXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZVBhZ2VWaWV3KCl7XG4gICAgLy8gcGFnZSBzZXQgdXBcbiAgICBCb2R5LnJlc2V0KCk7XG4gICAgU3VidGl0bGUudXBkYXRlKFwiV2VsY29tZVwiKTtcbiAgICBXZWxjb21lLnNob3coKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZExpbmtzKCl7XG4gICAgLy8gaW5pdGlhbGl6ZSBsaW5rcyBpbiBidXR0b25zXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0ZXAtdXBsb2FkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkVXBsb2FkUGFnZSlcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RlcC1pbml0aWF0aXZlcycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZE5ld0luaXRpYXRpdmVzKVxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGVwLXJldmVudWUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRCYXNlbGluZUxhbmRpbmdQYWdlKVxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGVwLWZpbmlzaCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZFN1bW1hcnlQYWdlKVxuXG59XG4iLCJcbmltcG9ydCB7IHVwZGF0ZVBhZ2VTdGF0ZSB9IGZyb20gJy4uLy4uL3V0aWxzL2RhdGFfdXRpbHMvbG9jYWxfc3RvcmFnZV9oYW5kbGVycy5qcydcbmltcG9ydCB7IGluaXRpYWxpemVQYWdlVmlldywgYWRkTGlua3MgfSBmcm9tICcuL2hlbHBlcnMuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplV2VsY29tZVBhZ2UoKXtcblxuICAgIHVwZGF0ZVBhZ2VTdGF0ZSgnd2VsY29tZScpO1xuICAgIGluaXRpYWxpemVQYWdlVmlldygpO1xuICAgIGFkZExpbmtzKCk7XG5cbn0iLCJpbXBvcnQgeyB1cGRhdGVQYWdlU3RhdGUgfSBmcm9tICcuLi8uLi91dGlscy9kYXRhX3V0aWxzL2xvY2FsX3N0b3JhZ2VfaGFuZGxlcnMuanMnXG5pbXBvcnQgUHJvbXB0IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcHJvbXB0L3Byb21wdC5qcydcbmltcG9ydCB7IGZvcm1hdEN1cnJlbmN5IH0gZnJvbSAnLi4vLi4vdXRpbHMvY29tbW9uX3V0aWxzLmpzJ1xuaW1wb3J0IHsgUkVWRU5VRSB9IGZyb20gJy4uLy4uL2luaXQuanMnXG5pbXBvcnQgQm9keSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2JvZHkvYm9keS5qcydcbmltcG9ydCBOYXZCdXR0b25zIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanMnXG5pbXBvcnQgeyBwYXVzZUFuZENvbnRpbnVlIH0gZnJvbSAnLi4vdmlld19sb2dpYy5qcydcbmltcG9ydCBTdWJ0aXRsZSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkUmV2ZW51ZVBhZ2UoKSB7XG5cbiAgICAvL3VwZGF0ZSBwYWdlIHN0YXRlXG4gICAgdXBkYXRlUGFnZVN0YXRlKCdyZXZlbnVlJyk7XG5cbiAgICAvLyBwcmVwYXJlIHBhZ2Ugdmlld1xuICAgIEJvZHkucmVzZXQoKTtcbiAgICBOYXZCdXR0b25zLnNob3coKTtcblxuICAgIC8vIHVwZGF0ZSBwYWdlIHRleHRcbiAgICBTdWJ0aXRsZS51cGRhdGUoJ1JldmVudWUgUHJvamVjdGlvbnMnKTtcbiAgICAvLyBUT0RPOiB1cGRhdGUgdG8gbWFrZSBkeW5hbWljXG4gICAgUHJvbXB0LlRleHQudXBkYXRlKGBZb3VyIHJldmVudWUgcHJvamVjdGlvbiBmb3IgRlkyNiBpcyAke2Zvcm1hdEN1cnJlbmN5KFJFVkVOVUUsIHRydWUpfWApO1xuICAgIFByb21wdC5CdXR0b25zLkxlZnQudXBkYXRlVGV4dCgnQ29uZmlybScpO1xuICAgIFByb21wdC5CdXR0b25zLlJpZ2h0LnVwZGF0ZVRleHQoXCJUaGlzIGRvZXNuJ3QgbG9vayByaWdodFwiKTtcblxuICAgIC8vIGNsaWNraW5nICdjb25maXJtJyB3aWxsIGFsc28gdGFrZSB1cyB0byB0aGUgbmV4dCBwYWdlXG4gICAgUHJvbXB0LkJ1dHRvbnMuTGVmdC5hZGRBY3Rpb24ocGF1c2VBbmRDb250aW51ZSk7XG4gICAgLy8gVE9ETzogYWxsb3cgdXNlciB0byBlZGl0IHJldmVudWUgaGVyZVxuICAgIFByb21wdC5CdXR0b25zLlJpZ2h0LmFkZEFjdGlvbihoYW5kbGVSZXZlbnVlRWRpdCk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVJldmVudWVFZGl0KCkge1xuICAgIE5hdkJ1dHRvbnMuTmV4dC5lbmFibGUoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFudXBSZXZlbnVlUGFnZSgpIHtcbiAgICAvLyByZW1vdmUgZXZlbnQgbGlzdGVuZXJzIG9uIHByb21wdCBidXR0b25zXG4gICAgUHJvbXB0LkJ1dHRvbnMuTGVmdC5yZW1vdmVBY3Rpb24ocGF1c2VBbmRDb250aW51ZSk7XG4gICAgUHJvbXB0LkJ1dHRvbnMuUmlnaHQucmVtb3ZlQWN0aW9uKCk7XG59OyIsIlxuaW1wb3J0IHsgREFUQV9ST09ULCBGSVNDQUxfWUVBUiwgZnJpbmdlLCBjb2xhLCBtZXJpdCB9IGZyb20gXCIuLi8uLi9pbml0LmpzXCJcbmltcG9ydCBCb2R5IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL2JvZHkvYm9keS5qc1wiO1xuaW1wb3J0IE5hdkJ1dHRvbnMgZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanNcIjtcbmltcG9ydCBTdWJ0aXRsZSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9oZWFkZXIvaGVhZGVyLmpzXCI7XG5pbXBvcnQgRm9ybSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9mb3JtL2Zvcm0uanNcIjtcbmltcG9ydCBNb2RhbCBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9tb2RhbC9tb2RhbC5qc1wiO1xuaW1wb3J0IFByb21wdCBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9wcm9tcHQvcHJvbXB0LmpzXCI7XG5pbXBvcnQgVGFibGUgZnJvbSAnLi4vLi4vY29tcG9uZW50cy90YWJsZS90YWJsZS5qcydcbmltcG9ydCBTaWRlYmFyIGZyb20gXCIuLi8uLi9jb21wb25lbnRzL3NpZGViYXIvc2lkZWJhci5qc1wiO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlUGFnZVZpZXcoKXtcbiAgICAvLyBwcmVwYXJlIHBhZ2Ugdmlld1xuICAgIEJvZHkucmVzZXQoKTtcbiAgICBOYXZCdXR0b25zLnNob3coKTtcbiAgICBTaWRlYmFyLnNob3coKTtcbiAgICBUYWJsZS5hZGp1c3RXaWR0aCgnOTAlJyk7XG4gICAgLy8ganVzdCBlbmFibGUgbmV4dCBmb3Igbm93XG4gICAgLy8gVE9ETyBvbmx5IGVuYWJsZSB3aGVuIGFsbCBpbmZvIGlzIGVudGVyZWRcbiAgICBOYXZCdXR0b25zLk5leHQuZW5hYmxlKCk7XG5cbiAgICAvLyB1cGRhdGUgcGFnZSB0ZXh0XG4gICAgU3VidGl0bGUudXBkYXRlKCdQZXJzb25uZWwnKTtcbiAgICBQcm9tcHQuVGV4dC51cGRhdGUoYFxuICAgICAgICBUaGlzIHRhYmxlIGRpc3BsYXlzIHRoZSBudW1iZXIgb2YgRlRFcyBpbiBlYWNoIGpvYiBjb2RlIGZvciBpbiB5b3VyIGRlcGFydG1lbnQncyBcbiAgICAgICAgY3VycmVudCAoYW1lbmRlZCkgRlkyNSBidWRnZXQuIFRvIG1ha2UgZWRpdHMgdG8gdGhlIG51bWJlciBvZiBwb3NpdGlvbnMsIGNsaWNrIHRoZVxuICAgICAgICBcIkVkaXRcIiBidXR0b24gb24gdGhlIHJvdyB5b3Ugd291bGQgbGlrZSB0byBlZGl0LiBUaGUgXCJUb3RhbCBDb3N0XCIgY29sdW1uIGFuZCB0aGUgXG4gICAgICAgIHN1bW1hcnkgc2lkZWJhciB3aWxsIGFsc28gdXBkYXRlIHRvIHJlZmxlY3QgYW55IGVkaXRzLlxuICAgIGApO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25DbGFzc2VzKCkge1xuICAgIC8vIHJlY29yZCBjb2x1bW5zIGFuZCB0aGVpciBjbGFzc2VzXG4gICAgY29uc3QgcGVyc29ubmVsQ29sdW1ucyA9IFtcbiAgICAgICAgeyB0aXRsZTogJ0pvYiBOYW1lIChUeXBlKScsIGNsYXNzTmFtZTogJ2pvYi1uYW1lJyB9LFxuICAgICAgICB7IHRpdGxlOiBgRlkke0ZJU0NBTF9ZRUFSfSBGVEVzYCwgY2xhc3NOYW1lOiAnYmFzZWxpbmUtZnRlcycgfSxcbiAgICAgICAgeyB0aXRsZTogJ1NlcnZpY2UnLCBjbGFzc05hbWU6ICdzZXJ2aWNlJyB9LFxuICAgICAgICB7IHRpdGxlOiAnVG90YWwgQ29zdCcsIGNsYXNzTmFtZTogJ3RvdGFsLWJhc2VsaW5lJywgaXNDb3N0OiB0cnVlIH0sXG4gICAgICAgIHsgdGl0bGU6ICdBdmVyYWdlIFByb2plY3RlZCBTYWxhcnknLCBjbGFzc05hbWU6ICdhdmctc2FsYXJ5JywgaXNDb3N0OiB0cnVlIH1cbiAgICBdO1xuXG4gICAgLy8gYXNzaWduIGNvc3QgY2xhc3Nlc1xuICAgIFRhYmxlLkNvbHVtbnMuYXNzaWduQ2xhc3NlcyhwZXJzb25uZWxDb2x1bW5zKVxufVxuXG5mdW5jdGlvbiBwZXJzb25uZWxSb3dPbkVkaXQoKXtcbiAgICBUYWJsZS5DZWxsLmNyZWF0ZVRleHRib3goJ2Jhc2VsaW5lLWZ0ZXMnKTtcbiAgICBUYWJsZS5DZWxsLmNyZWF0ZURyb3Bkb3duKCdzZXJ2aWNlJywgREFUQV9ST09UICsgJ3NlcnZpY2VzLmpzb24nKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVQZXJzb25uZWxUYWJsZSgpe1xuICAgIC8vIGxvYWQgdGFibGUgZGF0YSBmcm9tIGpzb25cbiAgICBhd2FpdCBUYWJsZS5EYXRhLmxvYWRGcm9tSlNPTihEQVRBX1JPT1QgKyAncGVyc29ubmVsX2RhdGEuanNvbicpO1xuICAgIC8vYWZ0ZXIgdGFibGUgaXMgbG9hZGVkLCBmaWxsIGl0XG4gICAgVGFibGUuc2hvdygpO1xuICAgIFRhYmxlLkNvbHVtbnMuYWRkQXRFbmQoICcwJywgJ1RvdGFsIENvc3QnKTtcbiAgICBUYWJsZS5Db2x1bW5zLmFkZEF0RW5kKFRhYmxlLkJ1dHRvbnMuZWRpdF9jb25maXJtX2J0bnMsICcgJyk7O1xuICAgIGFzc2lnbkNsYXNzZXMoKTtcbiAgICAvLyBhZGQgdXAgdGhlIGJhc2VsaW5lIGNvc3RzIGFuZCB1cGRhdGUgc2lkZWJhclxuICAgIHVwZGF0ZURpc3BsYXlhbmRUb3RhbHMoKTtcbiAgICAvLyBhY3RpdmF0ZSBlZGl0IGJ1dHRvbnNcbiAgICBUYWJsZS5CdXR0b25zLkVkaXQuaW5pdChwZXJzb25uZWxSb3dPbkVkaXQsIHVwZGF0ZURpc3BsYXlhbmRUb3RhbHMpO1xuICAgIGluaXRpYWxpemVSb3dBZGRpdGlvbigpO1xufVxuXG5mdW5jdGlvbiBpbml0aWFsaXplUm93QWRkaXRpb24oKXtcbiAgICBUYWJsZS5CdXR0b25zLkFkZFJvdy51cGRhdGVUZXh0KFwiQWRkIG5ldyBqb2JcIik7XG4gICAgVGFibGUuQnV0dG9ucy5BZGRSb3cuc2hvdygpO1xufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVUb3RhbENvc3QoZnRlcywgYXZnX3NhbGFyeSwgZnJpbmdlLCBjb2xhLCBtZXJpdCl7XG4gICAgcmV0dXJuIGZ0ZXMgKiBhdmdfc2FsYXJ5ICogKDEgKyBmcmluZ2UpICogKDEgKyBjb2xhKSAqICgxICsgbWVyaXQpO1xufVxuXG4vLyB1cGRhdGUgc2lkZWJhciBhbmQgYWxzbyBjb3N0IHRvdGFscyB3aGVuIHRoZSBGVEVzIGFyZSBlZGl0ZWRcbmZ1bmN0aW9uIHVwZGF0ZURpc3BsYXlhbmRUb3RhbHMoKXtcbiAgICAvLyBpbml0aWFsaXplXG4gICAgU2lkZWJhci51cGRhdGVTdGF0KCdiYXNlbGluZS1wZXJzb25uZWwnLCAwKTtcbiAgICBTaWRlYmFyLnVwZGF0ZVN0YXQoJ3N1cHAtcGVyc29ubmVsJywgMCk7XG4gICAgLy8gY2FsY3VsYXRlIGZvciBlYWNoIHJvd1xuICAgIGxldCByb3dzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RyJyk7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCByb3dzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgLy8gZmV0Y2ggdmFsdWVzIGZvciBjYWxjdWxhdGlvbnNcbiAgICAgICAgbGV0IGF2Z19zYWxhcnkgPSBUYWJsZS5DZWxsLmdldFZhbHVlKHJvd3NbaV0sICdhdmctc2FsYXJ5Jyk7XG4gICAgICAgIGxldCBiYXNlbGluZV9mdGVzID0gVGFibGUuQ2VsbC5nZXRUZXh0KHJvd3NbaV0sICdiYXNlbGluZS1mdGVzJyk7XG5cbiAgICAgICAgLy8gY2FsY3VhdGUgI0ZURXMgeCBhdmVyYWdlIHNhbGFyeSArIENPTEEgYWRqdXN0bWVudHMgKyBtZXJpdCBhZGp1c3RtZW50cyArIGZyaW5nZVxuICAgICAgICBsZXQgdG90YWxfYmFzZWxpbmVfY29zdCA9IGNhbGN1bGF0ZVRvdGFsQ29zdChiYXNlbGluZV9mdGVzLCBhdmdfc2FsYXJ5LCBmcmluZ2UsIGNvbGEsIG1lcml0KTtcblxuICAgICAgICAvLyB1cGRhdGUgY291bnRlciBhbmQgdG90YWxcbiAgICAgICAgU2lkZWJhci5pbmNyZW1lbnRTdGF0KCdiYXNlbGluZS1wZXJzb25uZWwnLCB0b3RhbF9iYXNlbGluZV9jb3N0KTtcbiAgICAgICAgVGFibGUuQ2VsbC51cGRhdGVWYWx1ZShyb3dzW2ldLCAndG90YWwtYmFzZWxpbmUnLCB0b3RhbF9iYXNlbGluZV9jb3N0KTtcbiAgICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFVwTW9kYWwoKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBtb2RhbFxuICAgIE1vZGFsLmNsZWFyKCk7XG4gICAgTW9kYWwuTGluay5hZGQoJ2FkZC1idG4nKTtcbiAgICBNb2RhbC5UaXRsZS51cGRhdGUoJ05ldyBqb2InKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFVwRm9ybSgpIHtcbiAgICAvLyBTZXQgdXAgZm9ybVxuICAgIEZvcm0ubmV3KCdtb2RhbC1ib2R5Jyk7XG4gICAgRm9ybS5OZXdGaWVsZC5zaG9ydFRleHQoJ0pvYiBOYW1lOicsICdqb2ItbmFtZScsIHRydWUpOyBcbiAgICBGb3JtLk5ld0ZpZWxkLnNob3J0VGV4dCgnQWNjb3VudCBTdHJpbmc6JywgJ2FjY291bnQtc3RyaW5nJywgdHJ1ZSk7IFxuICAgIEZvcm0uU3VibWl0QnV0dG9uLmFkZCgpO1xuICAgIC8vIEluaXRpYWxpemUgZm9ybSBzdWJtaXNzaW9uIHRvIHRhYmxlIGRhdGFcbiAgICBoYW5kbGVGb3JtU3VibWlzc2lvbnMoKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlRm9ybVN1Ym1pc3Npb25zKGV2ZW50KXtcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSBmb3JtIHN1Ym1pc3Npb25cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tbW9kYWwnKTtcbiAgICAgICAgbW9kYWwuYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAvLyBnZXQgYW5zd2VycyBmcm9tIGZvcm0sIGhpZGUgZm9ybSwgc2hvdyBhbnN3ZXJzIGluIHRhYmxlXG4gICAgICAgICAgICBjb25zdCByZXNwb25zZXMgPSBGb3JtLmZldGNoQWxsUmVzcG9uc2VzKGV2ZW50KTtcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbiBlbXB0eSByZXNwb25zZVxuICAgICAgICAgICAgaWYgKE9iamVjdC52YWx1ZXMocmVzcG9uc2VzKVswXSAhPSAnJyl7XG4gICAgICAgICAgICAgICAgLy8gY2hhbmdlIHBhZ2Ugdmlld1xuICAgICAgICAgICAgICAgIE1vZGFsLmhpZGUoKTtcbiAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gYWRkIGRhdGEgdG8gdGFibGVcbiAgICAgICAgICAgICAgICBUYWJsZS5Sb3dzLmFkZChyZXNwb25zZXMpO1xuICAgICAgICAgICAgICAgIFRhYmxlLnNob3coKTtcbiAgICAgICAgICAgICAgICBUYWJsZS5CdXR0b25zLkFkZFJvdy5zaG93KCk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogc2F2ZSB0YWJsZSBkYXRhXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogZWRpdCBjb3N0IHRvIHNob3cgY3VycmVuY3kgY29ycmVjdGx5XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pXG59XG4iLCJpbXBvcnQgeyB1cGRhdGVQYWdlU3RhdGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZGF0YV91dGlscy9sb2NhbF9zdG9yYWdlX2hhbmRsZXJzLmpzXCI7XG5pbXBvcnQgeyBwcmVwYXJlUGFnZVZpZXcsIGluaXRpYWxpemVQZXJzb25uZWxUYWJsZSwgc2V0VXBNb2RhbCwgc2V0VXBGb3JtIH0gZnJvbSBcIi4vaGVscGVycy5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gbG9hZFBlcnNvbm5lbFBhZ2UoKXtcblxuICAgIHVwZGF0ZVBhZ2VTdGF0ZSgncGVyc29ubmVsJyk7XG4gICAgcHJlcGFyZVBhZ2VWaWV3KCk7XG4gICAgaW5pdGlhbGl6ZVBlcnNvbm5lbFRhYmxlKCk7XG5cbiAgICBzZXRVcE1vZGFsKCk7XG4gICAgc2V0VXBGb3JtKCk7XG59XG5cbiIsImltcG9ydCBQcm9tcHQgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9wcm9tcHQvcHJvbXB0LmpzJ1xuaW1wb3J0IHsgdXBkYXRlUGFnZVN0YXRlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2RhdGFfdXRpbHMvbG9jYWxfc3RvcmFnZV9oYW5kbGVycy5qc1wiO1xuaW1wb3J0IEJvZHkgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9ib2R5L2JvZHkuanMnO1xuaW1wb3J0IE5hdkJ1dHRvbnMgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9uYXZfYnV0dG9ucy9uYXZfYnV0dG9ucy5qcyc7XG5pbXBvcnQgU3VidGl0bGUgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9oZWFkZXIvaGVhZGVyLmpzJztcbmltcG9ydCBTaWRlYmFyIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvc2lkZWJhci9zaWRlYmFyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRPVFBhZ2UoKXtcbiAgICAvL3VwZGF0ZSBwYWdlIHN0YXRlXG4gICAgdXBkYXRlUGFnZVN0YXRlKCdvdmVydGltZScpO1xuXG4gICAgLy8gcHJlcGFyZSBwYWdlIHZpZXdcbiAgICBCb2R5LnJlc2V0KCk7XG4gICAgTmF2QnV0dG9ucy5zaG93KCk7XG4gICAgU2lkZWJhci5zaG93KCk7XG5cbiAgICAvLyBqdXN0IGVuYWJsZSBuZXh0IGZvciBub3dcbiAgICAvLyBUT0RPOiBvbmx5IGVuYWJsZSB3aGVuIGFsbCBpbmZvIGlzIGVudGVyZWRcbiAgICBOYXZCdXR0b25zLk5leHQuZW5hYmxlKCk7XG5cbiAgICAvLyB1cGRhdGUgcGFnZSB0ZXh0XG4gICAgU3VidGl0bGUudXBkYXRlKCdPdmVydGltZSBFc3RpbWF0ZXMnKTtcbiAgICAvLyBUT0RPOiB1cGRhdGUgdG8gbWFrZSBkeW5hbWljXG4gICAgUHJvbXB0LlRleHQudXBkYXRlKGBUaGlzIGlzIGEgcGxhY2Vob2xkZXIgZm9yIHRoZSBPVCBlc3RpbWF0ZXMuYCk7XG59IiwiaW1wb3J0IFByb21wdCBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9wcm9tcHQvcHJvbXB0LmpzXCI7XG5pbXBvcnQgU2lkZWJhciBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9zaWRlYmFyL3NpZGViYXIuanNcIjtcbmltcG9ydCBUYWJsZSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy90YWJsZS90YWJsZS5qc1wiO1xuaW1wb3J0IHsgREFUQV9ST09UIH0gZnJvbSBcIi4uLy4uL2luaXQuanNcIjtcbmltcG9ydCBCb2R5IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL2JvZHkvYm9keS5qc1wiO1xuaW1wb3J0IE5hdkJ1dHRvbnMgZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanNcIjtcbmltcG9ydCBTdWJ0aXRsZSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9oZWFkZXIvaGVhZGVyLmpzXCI7XG5pbXBvcnQgeyBkaXNwbGF5V2l0aENvbW1hcywgdW5mb3JtYXRDdXJyZW5jeSB9IGZyb20gXCIuLi8uLi91dGlscy9jb21tb25fdXRpbHMuanNcIjtcblxuY29uc3Qgbm9uUGVyc29ubmVsQ29sdW1ucyA9IFtcbiAgICB7IHRpdGxlOiAnRlkyNiBSZXF1ZXN0JywgY2xhc3NOYW1lOiAncmVxdWVzdCcsIGlzQ29zdDogdHJ1ZSB9LFxuICAgIHsgdGl0bGU6ICdBbW91bnQgUmVtYWluaW5nJywgY2xhc3NOYW1lOiAncmVtYWluaW5nJywgaXNDb3N0OiB0cnVlIH0sXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVBhZ2VWaWV3KCl7XG4gICAgLy8gcHJlcGFyZSBwYWdlIHZpZXdcbiAgICBCb2R5LnJlc2V0KCk7XG4gICAgTmF2QnV0dG9ucy5zaG93KCk7XG4gICAgU2lkZWJhci5zaG93KCk7XG4gICAgVGFibGUuYWRqdXN0V2lkdGgoJzEwMCUnKTtcbiAgICAvLyB1cGRhdGUgcGFnZSB0ZXh0XG4gICAgU3VidGl0bGUudXBkYXRlKCdOb24tUGVyc29ubmVsJyk7XG4gICAgUHJvbXB0LlRleHQudXBkYXRlKCdTZWxlY3QgYW4gYWN0aW9uIGl0ZW0gZm9yIGVhY2ggbm9uLXBlcnNvbm5lbCBsaW5lIGl0ZW0gZnJvbSBsYXN0IHllYXIuJyk7XG5cbiAgICAvLyBqdXN0IGVuYWJsZSBuZXh0IGZvciBub3dcbiAgICAvLyBUT0RPOiBvbmx5IGVuYWJsZSB3aGVuIGFsbCBpbmZvIGlzIGVudGVyZWRcbiAgICBOYXZCdXR0b25zLk5leHQuZW5hYmxlKCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplTm9ucGVyc29ubmVsVGFibGUoKXtcbiAgICAvLyBsb2FkIHRhYmxlIGRhdGEgZnJvbSBqc29uXG4gICAgYXdhaXQgVGFibGUuRGF0YS5sb2FkRnJvbUpTT04oREFUQV9ST09UICsgJ25vbnBlcnNvbm5lbF9kYXRhLmpzb24nLCAnbWFpbi10YWJsZScpO1xuICAgIC8vYWZ0ZXIgdGFibGUgaXMgbG9hZGVkLCBmaWxsIGl0XG4gICAgVGFibGUuc2hvdygpO1xuICAgIFRhYmxlLkNvbHVtbnMuYWRkQXRFbmQoVGFibGUuQnV0dG9ucy5lZGl0X2NvbmZpcm1fYnRucywgXCIgXCIpO1xuICAgIC8vIGFzc2lnbiBjb3N0IGNsYXNzZXNcbiAgICBUYWJsZS5Db2x1bW5zLmFzc2lnbkNsYXNzZXMobm9uUGVyc29ubmVsQ29sdW1ucyk7XG4gICAgLy8gdXBkYXRlIHNpZGViYXJcbiAgICB1cGRhdGVEaXNwbGF5YW5kVG90YWxzKCk7XG4gICAgLy8gZW5hYmxlIGVkaXRpbmdcbiAgICBUYWJsZS5CdXR0b25zLkVkaXQuaW5pdChub25QZXJzb25uZWxSb3dPbkVkaXQsIHVwZGF0ZURpc3BsYXlhbmRUb3RhbHMpO1xufVxuXG5mdW5jdGlvbiBub25QZXJzb25uZWxSb3dPbkVkaXQoKXtcbiAgICAvLyBjb252ZXJ0IHJlcXVlc3QgdG8gbnVtZXJpYyBmcm9tIGZvcm1hdHRlZCBjdXJyZW5jeVxuICAgIGNvbnN0IHJlcXVlc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYWN0aXZlLWVkaXRpbmcgPiB0ZC5yZXF1ZXN0Jyk7XG4gICAgcmVxdWVzdC50ZXh0Q29udGVudCA9IHJlcXVlc3QudGV4dENvbnRlbnQucmVwbGFjZSgnJCcsICcnKTtcbiAgICAvLyBtYWtlIGl0IGVkaXRhYmxlXG4gICAgVGFibGUuQ2VsbC5jcmVhdGVUZXh0Ym94KCdyZXF1ZXN0Jyk7XG59XG5cbi8vIHVwZGF0ZSBzaWRlYmFyIGFuZCBhbHNvIGNvc3QgdG90YWxzIHdoZW4gdGhlIEZURXMgYXJlIGVkaXRlZFxuZnVuY3Rpb24gdXBkYXRlRGlzcGxheWFuZFRvdGFscygpe1xuICAgIC8vIGluaXRpYWxpemVcbiAgICBTaWRlYmFyLnVwZGF0ZVN0YXQoJ2Jhc2VsaW5lLW5vbnBlcnNvbm5lbCcsIDApO1xuICAgIC8vIGNhbGN1bGF0ZSBmb3IgZWFjaCByb3dcbiAgICBsZXQgcm93cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0cicpO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcm93cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIC8vIGZldGNoIHZhbHVlcyBmb3IgY2FsY3VsYXRpb25zXG4gICAgICAgIGxldCByZXF1ZXN0ID0gIFRhYmxlLkNlbGwuZ2V0VmFsdWUocm93c1tpXSwgJ3JlcXVlc3QnKTtcbiAgICAgICAgXG4gICAgICAgIC8vIHVwZGF0ZSBjb3VudGVyc1xuICAgICAgICBTaWRlYmFyLmluY3JlbWVudFN0YXQoJ2Jhc2VsaW5lLW5vbnBlcnNvbm5lbCcsIHJlcXVlc3QpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IHVwZGF0ZVBhZ2VTdGF0ZSB9IGZyb20gXCIuLi8uLi91dGlscy9kYXRhX3V0aWxzL2xvY2FsX3N0b3JhZ2VfaGFuZGxlcnMuanNcIjtcbmltcG9ydCB7IHByZXBhcmVQYWdlVmlldywgaW5pdGlhbGl6ZU5vbnBlcnNvbm5lbFRhYmxlIH0gZnJvbSBcIi4uLzA1X25vbnBlcnNvbm5lbC9oZWxwZXJzLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkTm9ucGVyc29ubmVsUGFnZSgpe1xuXG4gICAgdXBkYXRlUGFnZVN0YXRlKCdub25wZXJzb25uZWwnKTtcbiAgICBwcmVwYXJlUGFnZVZpZXcoKTtcbiAgICBpbml0aWFsaXplTm9ucGVyc29ubmVsVGFibGUoKVxufVxuIiwiaW1wb3J0IHsgaW5pdGlhbGl6ZVdlbGNvbWVQYWdlIH0gZnJvbSAnLi8wMF93ZWxjb21lL21haW4uanMnO1xuaW1wb3J0IHsgY2xlYW5VcEluaXRpYXRpdmVzUGFnZSwgbG9hZE5ld0luaXRpYXRpdmVzIH0gZnJvbSAnLi8wNl9uZXdfaW5pdGlhdGl2ZXMvbWFpbi5qcydcbmltcG9ydCB7IGxvYWRSZXZlbnVlUGFnZSwgY2xlYW51cFJldmVudWVQYWdlIH0gZnJvbSAnLi8wM19yZXZlbnVlL21haW4uanMnXG5pbXBvcnQgeyBsb2FkUGVyc29ubmVsUGFnZSB9IGZyb20gJy4vMDRfcGVyc29ubmVsL21haW4uanMnO1xuaW1wb3J0IHsgbG9hZE9UUGFnZSB9IGZyb20gJy4vMDQuNV9PVC9tYWluLmpzJztcbmltcG9ydCB7IGxvYWROb25wZXJzb25uZWxQYWdlIH0gZnJvbSAnLi8wNV9ub25wZXJzb25uZWwvbWFpbi5qcyc7XG5pbXBvcnQgeyBsb2FkQmFzZWxpbmVMYW5kaW5nUGFnZSB9IGZyb20gJy4vMDJfYmFzZWxpbmVfbGFuZGluZ19wYWdlL21haW4uanMnO1xuaW1wb3J0IHsgY2xlYW5VcFN1bW1hcnlQYWdlLCBsb2FkU3VtbWFyeVBhZ2UgfSBmcm9tICcuLzA3X3N1bW1hcnkvbWFpbi5qcyc7XG5pbXBvcnQgeyBsb2FkVXBsb2FkUGFnZSB9IGZyb20gJy4vMDFfdXBsb2FkL21haW4uanMnO1xuaW1wb3J0IHsgcGF1c2VFeGVjdXRpb24gfSBmcm9tICcuLi91dGlscy9jb21tb25fdXRpbHMuanMnO1xuXG5pbXBvcnQgeyBsb2FkUGFnZVN0YXRlIH0gZnJvbSAnLi4vdXRpbHMvZGF0YV91dGlscy9sb2NhbF9zdG9yYWdlX2hhbmRsZXJzLmpzJztcblxuZXhwb3J0IGxldCBQQUdFUyA9IHtcbiAgICAnd2VsY29tZScgOiBpbml0aWFsaXplV2VsY29tZVBhZ2UsXG4gICAgJ3VwbG9hZCcgOiBsb2FkVXBsb2FkUGFnZSxcbiAgICAnYmFzZWxpbmUtbGFuZGluZycgOiBsb2FkQmFzZWxpbmVMYW5kaW5nUGFnZSxcbiAgICAncmV2ZW51ZScgOiBsb2FkUmV2ZW51ZVBhZ2UsXG4gICAgJ3BlcnNvbm5lbCcgOiBsb2FkUGVyc29ubmVsUGFnZSxcbiAgICAnb3ZlcnRpbWUnIDogbG9hZE9UUGFnZSxcbiAgICAnbm9ucGVyc29ubmVsJyA6IGxvYWROb25wZXJzb25uZWxQYWdlLFxuICAgICduZXctaW5pdHMnIDogbG9hZE5ld0luaXRpYXRpdmVzLFxuICAgICdzdW1tYXJ5JyA6IGxvYWRTdW1tYXJ5UGFnZSBcbn1cblxuZXhwb3J0IGxldCBDTEVBTlVQID0ge1xuICAgICduZXctaW5pdHMnIDogY2xlYW5VcEluaXRpYXRpdmVzUGFnZSxcbiAgICAncmV2ZW51ZScgOiBjbGVhbnVwUmV2ZW51ZVBhZ2UsXG4gICAgJ3N1bW1hcnknIDogY2xlYW5VcFN1bW1hcnlQYWdlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFBhZ2UobmV3X3BhZ2Vfa2V5KXtcbiAgICAvLyBjbGVhbiB1cCBmcm9tIGN1cnJlbnQgcGFnZVxuICAgIHZhciBwYWdlX3N0YXRlID0gbG9hZFBhZ2VTdGF0ZSgpO1xuICAgIGlmIChDTEVBTlVQW3BhZ2Vfc3RhdGVdKSB7IENMRUFOVVBbcGFnZV9zdGF0ZV0oKSB9O1xuICAgIC8vIFVzZSB0aGUgcGFnZV9zdGF0ZSB0byBhY2Nlc3MgYW5kIGNhbGwgdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24gZnJvbSBQQUdFU1xuICAgIGlmIChQQUdFU1tuZXdfcGFnZV9rZXldKSB7XG4gICAgICAgIFBBR0VTW25ld19wYWdlX2tleV0oKTsgLy8gSW52b2tlcyB0aGUgZnVuY3Rpb24gaWYgaXQgZXhpc3RzIGluIHRoZSBQQUdFUyBtYXBcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBObyBwYWdlIGluaXRpYWxpemVyIGZvdW5kIGZvciBzdGF0ZTogJHtuZXdfcGFnZV9rZXl9YCk7XG4gICAgfVxuICAgIFBBR0VTW25ld19wYWdlX2tleV0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5leHRQYWdlKCl7XG5cbiAgICB2YXIgcGFnZV9zdGF0ZSA9IGxvYWRQYWdlU3RhdGUoKTtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoUEFHRVMpO1xuICBcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBrZXlcbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSBrZXlzLmluZGV4T2YocGFnZV9zdGF0ZSk7XG5cbiAgICAvLyBjbGVhbiB1cCBjdXJyZW50IHBhZ2VcbiAgICBpZiAoQ0xFQU5VUFtwYWdlX3N0YXRlXSkgeyBDTEVBTlVQW3BhZ2Vfc3RhdGVdKCkgfTtcbiAgICBcbiAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIG5leHQga2V5XG4gICAgaWYgKGN1cnJlbnRJbmRleCA+PSAwICYmIGN1cnJlbnRJbmRleCA8IGtleXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAvLyBHZXQgdGhlIG5leHQga2V5XG4gICAgICAgIGNvbnN0IG5leHRLZXkgPSBrZXlzW2N1cnJlbnRJbmRleCArIDFdO1xuICAgICAgICAvLyBnbyB0byB0aGF0IHBhZ2VcbiAgICAgICAgdmlzaXRQYWdlKG5leHRLZXkpO1xuICAgIH0gXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsYXN0UGFnZSgpe1xuXG4gICAgdmFyIHBhZ2Vfc3RhdGUgPSBsb2FkUGFnZVN0YXRlKCk7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKFBBR0VTKTtcbiAgXG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQga2V5XG4gICAgY29uc3QgY3VycmVudEluZGV4ID0ga2V5cy5pbmRleE9mKHBhZ2Vfc3RhdGUpO1xuXG4gICAgLy8gY2xlYW4gdXAgY3VycmVudCBwYWdlXG4gICAgaWYgKENMRUFOVVBbcGFnZV9zdGF0ZV0pIHsgQ0xFQU5VUFtwYWdlX3N0YXRlXSgpIH07XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBuZXh0IGtleVxuICAgIGlmIChjdXJyZW50SW5kZXggPj0gMSkge1xuICAgICAgICAvLyBHZXQgdGhlIG5leHQga2V5XG4gICAgICAgIGNvbnN0IGxhc3RLZXkgPSBrZXlzW2N1cnJlbnRJbmRleCAtIDFdO1xuICAgICAgICAvLyBnbyB0byB0aGF0IHBhZ2VcbiAgICAgICAgdmlzaXRQYWdlKGxhc3RLZXkpO1xuICAgIH0gXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXVzZUFuZENvbnRpbnVlKCl7XG4gICAgYXdhaXQgcGF1c2VFeGVjdXRpb24oMC41KTtcbiAgICBuZXh0UGFnZSgpO1xufSIsIi8vIGltcG9ydCBzdHlsZXNcbmltcG9ydCAnLi4vY3NzL2NvbW1vbi5jc3MnO1xuXG4vLyBpbXBvcnQgZnVuY3Rpb25zXG5pbXBvcnQgeyBsb2FkUGFnZVN0YXRlIH0gZnJvbSAnLi91dGlscy9kYXRhX3V0aWxzL2xvY2FsX3N0b3JhZ2VfaGFuZGxlcnMuanMnXG5pbXBvcnQgeyB2aXNpdFBhZ2UgfSBmcm9tICcuL3ZpZXdzL3ZpZXdfbG9naWMuanMnXG5cbi8vIHBhdGggZm9yIG15IGxhcHRvcFxuLy8gZXhwb3J0IGxldCBEQVRBX1JPT1QgPSAnLi4vLi4vLi4vZGF0YS9sYXdfZGVwdF9zYW1wbGUvJ1xuLy8gZ2l0aHViIHBhdGhcbmV4cG9ydCBsZXQgREFUQV9ST09UID0gJy4uLy4uL2J1ZGdldC1yZXF1ZXN0LWRlbW8vZGF0YS9sYXdfZGVwdF9zYW1wbGUvJ1xuXG5leHBvcnQgbGV0IFJFVkVOVUUgPSAwO1xuZXhwb3J0IGxldCBUQVJHRVQgPSAyMDAwMDAwO1xuZXhwb3J0IHZhciBGSVNDQUxfWUVBUiA9ICcyNic7XG5cbi8vIHZhcmlhYmxlcyBvbiB0aGUgc2FsYXJ5IFxuZXhwb3J0IHZhciBmcmluZ2UgPSAwLjM2XG5leHBvcnQgdmFyIGNvbGEgPSAwLjAyXG5leHBvcnQgdmFyIG1lcml0ID0gMC4wMlxuXG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhZ2Vfc3RhdGUgPSBsb2FkUGFnZVN0YXRlKCk7XG4gICAgdmlzaXRQYWdlKHBhZ2Vfc3RhdGUpO1xufSk7XG5cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///496\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 {\n /* colors */\n --orange: #FB6523;\n --yellow: #D99733;\n --blue: #43748E;\n --lightBlue: #b7c9e2;\n --darkGray: #373A37;\n --lightGray: #F2F2F2;\n --white: #FBFDFB;\n --black: #212121;\n --green: #71BC78;\n --citygreen: #004445;\n --spiritgreen: #279989;\n --palegreen: #9FD5B3;\n --verypalegreen: #DFF5E3;\n --accentyellow: #feb70d;\n --nearblack: #18252a;\n /* fonts */\n font-family: \'Nunito\', sans-serif;\n font-size: 14px;\n /* spacing */\n --header-height : 125px;\n --sidebar-width: 250px;\n}\n\n/* Button styling */\n\n.btn {\n cursor: pointer;\n padding: 10px;\n margin-top: 5px;\n margin-right : 2px;\n margin-left: 2px;\n border-radius: 10px;\n background-color: gray;\n color: white; \n}\n\n/* Font application for all text */\nbody, button, input, textarea, select, .sidebar, table {\n font-family: var(--font-family), sans-serif;\n }\n\n#main-panel {\n /* display: flex; */\n /* flex-direction: column; */\n justify-content: center; /* This will center content vertically */\n min-height: calc(100vh - var(--header-height)) ; \n /* max-width: calc(100vw - var(--sidebar-width)); */\n padding-top: 25px;\n padding-bottom: 25px;\n margin: 0;\n}\n\ndiv.row {\n margin: 0px;\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,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,aAAa;IACb,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;IACI,WAAW;AACf","sourcesContent":[":root {\\n /* colors */\\n --orange: #FB6523;\\n --yellow: #D99733;\\n --blue: #43748E;\\n --lightBlue: #b7c9e2;\\n --darkGray: #373A37;\\n --lightGray: #F2F2F2;\\n --white: #FBFDFB;\\n --black: #212121;\\n --green: #71BC78;\\n --citygreen: #004445;\\n --spiritgreen: #279989;\\n --palegreen: #9FD5B3;\\n --verypalegreen: #DFF5E3;\\n --accentyellow: #feb70d;\\n --nearblack: #18252a;\\n /* fonts */\\n font-family: \'Nunito\', sans-serif;\\n font-size: 14px;\\n /* spacing */\\n --header-height : 125px;\\n --sidebar-width: 250px;\\n}\\n\\n/* Button styling */\\n\\n.btn {\\n cursor: pointer;\\n padding: 10px;\\n margin-top: 5px;\\n margin-right : 2px;\\n margin-left: 2px;\\n border-radius: 10px;\\n background-color: gray;\\n color: white; \\n}\\n\\n/* Font application for all text */\\nbody, button, input, textarea, select, .sidebar, table {\\n font-family: var(--font-family), sans-serif;\\n }\\n\\n#main-panel {\\n /* display: flex; */\\n /* flex-direction: column; */\\n justify-content: center; /* This will center content vertically */\\n min-height: calc(100vh - var(--header-height)) ; \\n /* max-width: calc(100vw - var(--sidebar-width)); */\\n padding-top: 25px;\\n padding-bottom: 25px;\\n margin: 0;\\n}\\n\\ndiv.row {\\n margin: 0px;\\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA0LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvY3NzL2NvbW1vbi5jc3M/ZjdjYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgOnJvb3Qge1xuICAgIC8qIGNvbG9ycyAqL1xuICAgIC0tb3JhbmdlOiAjRkI2NTIzO1xuICAgIC0teWVsbG93OiAjRDk5NzMzO1xuICAgIC0tYmx1ZTogIzQzNzQ4RTtcbiAgICAtLWxpZ2h0Qmx1ZTogI2I3YzllMjtcbiAgICAtLWRhcmtHcmF5OiAjMzczQTM3O1xuICAgIC0tbGlnaHRHcmF5OiAjRjJGMkYyO1xuICAgIC0td2hpdGU6ICNGQkZERkI7XG4gICAgLS1ibGFjazogIzIxMjEyMTtcbiAgICAtLWdyZWVuOiAjNzFCQzc4O1xuICAgIC0tY2l0eWdyZWVuOiAjMDA0NDQ1O1xuICAgIC0tc3Bpcml0Z3JlZW46ICMyNzk5ODk7XG4gICAgLS1wYWxlZ3JlZW46ICM5RkQ1QjM7XG4gICAgLS12ZXJ5cGFsZWdyZWVuOiAjREZGNUUzO1xuICAgIC0tYWNjZW50eWVsbG93OiAjZmViNzBkO1xuICAgIC0tbmVhcmJsYWNrOiAjMTgyNTJhO1xuICAgIC8qIGZvbnRzICovXG4gICAgZm9udC1mYW1pbHk6ICdOdW5pdG8nLCBzYW5zLXNlcmlmO1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAvKiBzcGFjaW5nICovXG4gICAgLS1oZWFkZXItaGVpZ2h0IDogMTI1cHg7XG4gICAgLS1zaWRlYmFyLXdpZHRoOiAyNTBweDtcbn1cblxuLyogQnV0dG9uIHN0eWxpbmcgKi9cblxuLmJ0biB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgbWFyZ2luLXRvcDogNXB4O1xuICAgIG1hcmdpbi1yaWdodCA6IDJweDtcbiAgICBtYXJnaW4tbGVmdDogMnB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTtcbiAgICBjb2xvcjogd2hpdGU7IFxufVxuXG4vKiBGb250IGFwcGxpY2F0aW9uIGZvciBhbGwgdGV4dCAgKi9cbmJvZHksIGJ1dHRvbiwgaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QsIC5zaWRlYmFyLCB0YWJsZSB7XG4gICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtZmFtaWx5KSwgc2Fucy1zZXJpZjtcbiAgfVxuXG4jbWFpbi1wYW5lbCB7XG4gICAgLyogZGlzcGxheTogZmxleDsgKi9cbiAgICAvKiBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyAqL1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOyAvKiBUaGlzIHdpbGwgY2VudGVyIGNvbnRlbnQgdmVydGljYWxseSAqL1xuICAgIG1pbi1oZWlnaHQ6IGNhbGMoMTAwdmggLSB2YXIoLS1oZWFkZXItaGVpZ2h0KSkgOyBcbiAgICAvKiBtYXgtd2lkdGg6IGNhbGMoMTAwdncgLSB2YXIoLS1zaWRlYmFyLXdpZHRoKSk7ICAqL1xuICAgIHBhZGRpbmctdG9wOiAyNXB4O1xuICAgIHBhZGRpbmctYm90dG9tOiAyNXB4O1xuICAgIG1hcmdpbjogMDtcbn1cblxuZGl2LnJvdyB7XG4gICAgbWFyZ2luOiAwcHg7XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvY3NzL2NvbW1vbi5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxXQUFXO0lBQ1gsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixlQUFlO0lBQ2Ysb0JBQW9CO0lBQ3BCLG1CQUFtQjtJQUNuQixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsb0JBQW9CO0lBQ3BCLHNCQUFzQjtJQUN0QixvQkFBb0I7SUFDcEIsd0JBQXdCO0lBQ3hCLHVCQUF1QjtJQUN2QixvQkFBb0I7SUFDcEIsVUFBVTtJQUNWLGlDQUFpQztJQUNqQyxlQUFlO0lBQ2YsWUFBWTtJQUNaLHVCQUF1QjtJQUN2QixzQkFBc0I7QUFDMUI7O0FBRUEsbUJBQW1COztBQUVuQjtJQUNJLGVBQWU7SUFDZixhQUFhO0lBQ2IsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLHNCQUFzQjtJQUN0QixZQUFZO0FBQ2hCOztBQUVBLG1DQUFtQztBQUNuQztJQUNJLDJDQUEyQztFQUM3Qzs7QUFFRjtJQUNJLG1CQUFtQjtJQUNuQiw0QkFBNEI7SUFDNUIsdUJBQXVCLEVBQUUsd0NBQXdDO0lBQ2pFLCtDQUErQztJQUMvQyxvREFBb0Q7SUFDcEQsaUJBQWlCO0lBQ2pCLG9CQUFvQjtJQUNwQixTQUFTO0FBQ2I7O0FBRUE7SUFDSSxXQUFXO0FBQ2ZcIixcInNvdXJjZXNDb250ZW50XCI6W1wiOnJvb3Qge1xcbiAgICAvKiBjb2xvcnMgKi9cXG4gICAgLS1vcmFuZ2U6ICNGQjY1MjM7XFxuICAgIC0teWVsbG93OiAjRDk5NzMzO1xcbiAgICAtLWJsdWU6ICM0Mzc0OEU7XFxuICAgIC0tbGlnaHRCbHVlOiAjYjdjOWUyO1xcbiAgICAtLWRhcmtHcmF5OiAjMzczQTM3O1xcbiAgICAtLWxpZ2h0R3JheTogI0YyRjJGMjtcXG4gICAgLS13aGl0ZTogI0ZCRkRGQjtcXG4gICAgLS1ibGFjazogIzIxMjEyMTtcXG4gICAgLS1ncmVlbjogIzcxQkM3ODtcXG4gICAgLS1jaXR5Z3JlZW46ICMwMDQ0NDU7XFxuICAgIC0tc3Bpcml0Z3JlZW46ICMyNzk5ODk7XFxuICAgIC0tcGFsZWdyZWVuOiAjOUZENUIzO1xcbiAgICAtLXZlcnlwYWxlZ3JlZW46ICNERkY1RTM7XFxuICAgIC0tYWNjZW50eWVsbG93OiAjZmViNzBkO1xcbiAgICAtLW5lYXJibGFjazogIzE4MjUyYTtcXG4gICAgLyogZm9udHMgKi9cXG4gICAgZm9udC1mYW1pbHk6ICdOdW5pdG8nLCBzYW5zLXNlcmlmO1xcbiAgICBmb250LXNpemU6IDE0cHg7XFxuICAgIC8qIHNwYWNpbmcgKi9cXG4gICAgLS1oZWFkZXItaGVpZ2h0IDogMTI1cHg7XFxuICAgIC0tc2lkZWJhci13aWR0aDogMjUwcHg7XFxufVxcblxcbi8qIEJ1dHRvbiBzdHlsaW5nICovXFxuXFxuLmJ0biB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgcGFkZGluZzogMTBweDtcXG4gICAgbWFyZ2luLXRvcDogNXB4O1xcbiAgICBtYXJnaW4tcmlnaHQgOiAycHg7XFxuICAgIG1hcmdpbi1sZWZ0OiAycHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGdyYXk7XFxuICAgIGNvbG9yOiB3aGl0ZTsgXFxufVxcblxcbi8qIEZvbnQgYXBwbGljYXRpb24gZm9yIGFsbCB0ZXh0ICAqL1xcbmJvZHksIGJ1dHRvbiwgaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QsIC5zaWRlYmFyLCB0YWJsZSB7XFxuICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWZhbWlseSksIHNhbnMtc2VyaWY7XFxuICB9XFxuXFxuI21haW4tcGFuZWwge1xcbiAgICAvKiBkaXNwbGF5OiBmbGV4OyAqL1xcbiAgICAvKiBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyAqL1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgLyogVGhpcyB3aWxsIGNlbnRlciBjb250ZW50IHZlcnRpY2FsbHkgKi9cXG4gICAgbWluLWhlaWdodDogY2FsYygxMDB2aCAtIHZhcigtLWhlYWRlci1oZWlnaHQpKSA7IFxcbiAgICAvKiBtYXgtd2lkdGg6IGNhbGMoMTAwdncgLSB2YXIoLS1zaWRlYmFyLXdpZHRoKSk7ICAqL1xcbiAgICBwYWRkaW5nLXRvcDogMjVweDtcXG4gICAgcGFkZGluZy1ib3R0b206IDI1cHg7XFxuICAgIG1hcmdpbjogMDtcXG59XFxuXFxuZGl2LnJvdyB7XFxuICAgIG1hcmdpbjogMHB4O1xcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///404\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 {\n background-color: var(--lightGray);\n margin: 0;\n}`, "",{"version":3,"sources":["webpack://./src/js/components/body/body.css"],"names":[],"mappings":"AAAA;IACI,kCAAkC;IAClC,SAAS;AACb","sourcesContent":["body {\\n background-color: var(--lightGray);\\n margin: 0;\\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9ib2R5L2JvZHkuY3NzPzM2ZTAiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYGJvZHkge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0R3JheSk7XG4gICAgbWFyZ2luOiAwO1xufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvYm9keS9ib2R5LmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGtDQUFrQztJQUNsQyxTQUFTO0FBQ2JcIixcInNvdXJjZXNDb250ZW50XCI6W1wiYm9keSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0R3JheSk7XFxuICAgIG1hcmdpbjogMDtcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9\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%;}\n\ntextarea, input {\n margin-bottom: 20px;\n}\n\n.btn-submit {\n margin-top: 20px;\n width: 60%;\n margin-left: 20%;\n background-color: var(--spiritgreen);\n}`, "",{"version":3,"sources":["webpack://./src/js/components/form/form.css"],"names":[],"mappings":"AAAA,UAAU,aAAa,EAAE,WAAW,CAAC;;AAErC;IACI,mBAAmB;AACvB;;AAEA;IACI,gBAAgB;IAChB,UAAU;IACV,gBAAgB;IAChB,oCAAoC;AACxC","sourcesContent":["textarea {height: 100px; width: 100%;}\\n\\ntextarea, input {\\n margin-bottom: 20px;\\n}\\n\\n.btn-submit {\\n margin-top: 20px;\\n width: 60%;\\n margin-left: 20%;\\n background-color: var(--spiritgreen);\\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA5LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9mb3JtL2Zvcm0uY3NzP2UzOGEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYHRleHRhcmVhIHtoZWlnaHQ6IDEwMHB4OyB3aWR0aDogMTAwJTt9XG5cbnRleHRhcmVhLCBpbnB1dCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbn1cblxuLmJ0bi1zdWJtaXQge1xuICAgIG1hcmdpbi10b3A6IDIwcHg7XG4gICAgd2lkdGg6IDYwJTtcbiAgICBtYXJnaW4tbGVmdDogMjAlO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcbn1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9qcy9jb21wb25lbnRzL2Zvcm0vZm9ybS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUEsVUFBVSxhQUFhLEVBQUUsV0FBVyxDQUFDOztBQUVyQztJQUNJLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixVQUFVO0lBQ1YsZ0JBQWdCO0lBQ2hCLG9DQUFvQztBQUN4Q1wiLFwic291cmNlc0NvbnRlbnRcIjpbXCJ0ZXh0YXJlYSB7aGVpZ2h0OiAxMDBweDsgd2lkdGg6IDEwMCU7fVxcblxcbnRleHRhcmVhLCBpbnB1dCB7XFxuICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XFxufVxcblxcbi5idG4tc3VibWl0IHtcXG4gICAgbWFyZ2luLXRvcDogMjBweDtcXG4gICAgd2lkdGg6IDYwJTtcXG4gICAgbWFyZ2luLWxlZnQ6IDIwJTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\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, `\nh1 {\n text-align: center;\n}\n\nh2 {\n color: var(--darkGray);\n text-align: center;\n}\n\nheader {\n align-items: center;\n background-color: white;\n padding: 5px;\n border-bottom: 1px solid var(--citygreen); \n /* border: 1px solid var(--citygreen); */\n height: var(--header-height);\n /* width: calc(100vw - var(--sidebar-width)); */\n padding-left: 20px;\n}\n\n/* Logo styling */\n#logo {\n height: 50px; /* Or your desired size */\n margin-right: 20px; /* Optional: space between logo and title */\n margin-bottom: -50px;\n margin-top: 20px;\n}`, "",{"version":3,"sources":["webpack://./src/js/components/header/header.css"],"names":[],"mappings":";AACA;IACI,kBAAkB;AACtB;;AAEA;IACI,sBAAsB;IACtB,kBAAkB;AACtB;;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":["\\nh1 {\\n text-align: center;\\n}\\n\\nh2 {\\n color: var(--darkGray);\\n text-align: center;\\n}\\n\\nheader {\\n align-items: center;\\n background-color: white;\\n padding: 5px;\\n border-bottom: 1px solid var(--citygreen); \\n /* border: 1px solid var(--citygreen); */\\n height: var(--header-height);\\n /* width: calc(100vw - var(--sidebar-width)); */\\n padding-left: 20px;\\n}\\n\\n/* Logo styling */\\n#logo {\\n height: 50px; /* Or your desired size */\\n margin-right: 20px; /* Optional: space between logo and title */\\n margin-bottom: -50px;\\n margin-top: 20px;\\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA3LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuY3NzPzJmNGMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYFxuaDEge1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuaDIge1xuICAgIGNvbG9yOiB2YXIoLS1kYXJrR3JheSk7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG5oZWFkZXIge1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgcGFkZGluZzogNXB4O1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1jaXR5Z3JlZW4pOyBcbiAgICAvKiBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jaXR5Z3JlZW4pOyAgKi9cbiAgICBoZWlnaHQ6IHZhcigtLWhlYWRlci1oZWlnaHQpO1xuICAgIC8qIHdpZHRoOiBjYWxjKDEwMHZ3IC0gdmFyKC0tc2lkZWJhci13aWR0aCkpOyAqL1xuICAgIHBhZGRpbmctbGVmdDogMjBweDtcbn1cblxuLyogTG9nbyBzdHlsaW5nICovXG4jbG9nbyB7XG4gICAgaGVpZ2h0OiA1MHB4OyAvKiBPciB5b3VyIGRlc2lyZWQgc2l6ZSAqL1xuICAgIG1hcmdpbi1yaWdodDogMjBweDsgLyogT3B0aW9uYWw6IHNwYWNlIGJldHdlZW4gbG9nbyBhbmQgdGl0bGUgKi9cbiAgICBtYXJnaW4tYm90dG9tOiAtNTBweDtcbiAgICBtYXJnaW4tdG9wOiAyMHB4O1xufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvaGVhZGVyL2hlYWRlci5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQUNBO0lBQ0ksa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksc0JBQXNCO0lBQ3RCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLG1CQUFtQjtJQUNuQix1QkFBdUI7SUFDdkIsWUFBWTtJQUNaLHlDQUF5QztJQUN6Qyx5Q0FBeUM7SUFDekMsNEJBQTRCO0lBQzVCLCtDQUErQztJQUMvQyxrQkFBa0I7QUFDdEI7O0FBRUEsaUJBQWlCO0FBQ2pCO0lBQ0ksWUFBWSxFQUFFLHlCQUF5QjtJQUN2QyxrQkFBa0IsRUFBRSwyQ0FBMkM7SUFDL0Qsb0JBQW9CO0lBQ3BCLGdCQUFnQjtBQUNwQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCJcXG5oMSB7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuXFxuaDIge1xcbiAgICBjb2xvcjogdmFyKC0tZGFya0dyYXkpO1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcblxcbmhlYWRlciB7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgICBwYWRkaW5nOiA1cHg7XFxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1jaXR5Z3JlZW4pOyBcXG4gICAgLyogYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY2l0eWdyZWVuKTsgICovXFxuICAgIGhlaWdodDogdmFyKC0taGVhZGVyLWhlaWdodCk7XFxuICAgIC8qIHdpZHRoOiBjYWxjKDEwMHZ3IC0gdmFyKC0tc2lkZWJhci13aWR0aCkpOyAqL1xcbiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7XFxufVxcblxcbi8qIExvZ28gc3R5bGluZyAqL1xcbiNsb2dvIHtcXG4gICAgaGVpZ2h0OiA1MHB4OyAvKiBPciB5b3VyIGRlc2lyZWQgc2l6ZSAqL1xcbiAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7IC8qIE9wdGlvbmFsOiBzcGFjZSBiZXR3ZWVuIGxvZ28gYW5kIHRpdGxlICovXFxuICAgIG1hcmdpbi1ib3R0b206IC01MHB4O1xcbiAgICBtYXJnaW4tdG9wOiAyMHB4O1xcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\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 {\n margin: 20px;\n text-align: center;\n /* margin-top: 100px; */\n /* position: absolute; or \'absolute\' depending on use-case */\n /* top: 100px; Distance from the top of the viewport or the closest positioned ancestor */\n}\n\n#btn-next, #btn-last {\n background-color: var(--darkGray);\n}\n\n#btn-next:hover, #btn-last:hover {\n background-color: var(--yellow);\n color: var(--darkGray);\n}\n\n/* Add style for when you cannot click the next button */\n#btn-next.disabled, #btn-last.disabled,\n#btn-next.disabled:hover, #btn-last.disabled:hover {\n background-color: gray;\n color: white;\n pointer-events: none;\n}`, "",{"version":3,"sources":["webpack://./src/js/components/nav_buttons/nav_buttons.css"],"names":[],"mappings":"AAAA;IACI,YAAY;IACZ,kBAAkB;IAClB,uBAAuB;IACvB,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;AACxB","sourcesContent":["#nav-btns {\\n margin: 20px;\\n text-align: center;\\n /* margin-top: 100px; */\\n /* position: absolute; or \'absolute\' depending on use-case */\\n /* top: 100px; Distance from the top of the viewport or the closest positioned ancestor */\\n}\\n\\n#btn-next, #btn-last {\\n background-color: var(--darkGray);\\n}\\n\\n#btn-next:hover, #btn-last:hover {\\n background-color: var(--yellow);\\n color: var(--darkGray);\\n}\\n\\n/* Add style for when you cannot click the next button */\\n#btn-next.disabled, #btn-last.disabled,\\n#btn-next.disabled:hover, #btn-last.disabled:hover {\\n background-color: gray;\\n color: white;\\n pointer-events: none;\\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTk1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9uYXZfYnV0dG9ucy9uYXZfYnV0dG9ucy5jc3M/OTA1ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgI25hdi1idG5zIHtcbiAgICBtYXJnaW46IDIwcHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIC8qIG1hcmdpbi10b3A6IDEwMHB4OyAqL1xuICAgIC8qIHBvc2l0aW9uOiBhYnNvbHV0ZTsgb3IgJ2Fic29sdXRlJyBkZXBlbmRpbmcgb24gdXNlLWNhc2UgKi9cbiAgICAvKiB0b3A6IDEwMHB4OyBEaXN0YW5jZSBmcm9tIHRoZSB0b3Agb2YgdGhlIHZpZXdwb3J0IG9yIHRoZSBjbG9zZXN0IHBvc2l0aW9uZWQgYW5jZXN0b3IgKi9cbn1cblxuI2J0bi1uZXh0LCAjYnRuLWxhc3Qge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRhcmtHcmF5KTtcbn1cblxuI2J0bi1uZXh0OmhvdmVyLCAjYnRuLWxhc3Q6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXllbGxvdyk7XG4gICAgY29sb3I6IHZhcigtLWRhcmtHcmF5KTtcbn1cblxuLyogQWRkIHN0eWxlIGZvciB3aGVuIHlvdSBjYW5ub3QgY2xpY2sgdGhlIG5leHQgYnV0dG9uICovXG4jYnRuLW5leHQuZGlzYWJsZWQsICNidG4tbGFzdC5kaXNhYmxlZCxcbiNidG4tbmV4dC5kaXNhYmxlZDpob3ZlciwgI2J0bi1sYXN0LmRpc2FibGVkOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBncmF5O1xuICAgIGNvbG9yOiB3aGl0ZTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9qcy9jb21wb25lbnRzL25hdl9idXR0b25zL25hdl9idXR0b25zLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsdUJBQXVCO0lBQ3ZCLDREQUE0RDtJQUM1RCx5RkFBeUY7QUFDN0Y7O0FBRUE7SUFDSSxpQ0FBaUM7QUFDckM7O0FBRUE7SUFDSSwrQkFBK0I7SUFDL0Isc0JBQXNCO0FBQzFCOztBQUVBLHdEQUF3RDtBQUN4RDs7SUFFSSxzQkFBc0I7SUFDdEIsWUFBWTtJQUNaLG9CQUFvQjtBQUN4QlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIjbmF2LWJ0bnMge1xcbiAgICBtYXJnaW46IDIwcHg7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgLyogbWFyZ2luLXRvcDogMTAwcHg7ICovXFxuICAgIC8qIHBvc2l0aW9uOiBhYnNvbHV0ZTsgb3IgJ2Fic29sdXRlJyBkZXBlbmRpbmcgb24gdXNlLWNhc2UgKi9cXG4gICAgLyogdG9wOiAxMDBweDsgRGlzdGFuY2UgZnJvbSB0aGUgdG9wIG9mIHRoZSB2aWV3cG9ydCBvciB0aGUgY2xvc2VzdCBwb3NpdGlvbmVkIGFuY2VzdG9yICovXFxufVxcblxcbiNidG4tbmV4dCwgI2J0bi1sYXN0IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGFya0dyYXkpO1xcbn1cXG5cXG4jYnRuLW5leHQ6aG92ZXIsICNidG4tbGFzdDpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXllbGxvdyk7XFxuICAgIGNvbG9yOiB2YXIoLS1kYXJrR3JheSk7XFxufVxcblxcbi8qIEFkZCBzdHlsZSBmb3Igd2hlbiB5b3UgY2Fubm90IGNsaWNrIHRoZSBuZXh0IGJ1dHRvbiAqL1xcbiNidG4tbmV4dC5kaXNhYmxlZCwgI2J0bi1sYXN0LmRpc2FibGVkLFxcbiNidG4tbmV4dC5kaXNhYmxlZDpob3ZlciwgI2J0bi1sYXN0LmRpc2FibGVkOmhvdmVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTtcXG4gICAgY29sb3I6IHdoaXRlO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\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, `#prompt-div {\n display: none;\n text-align: center;\n width: 80%;\n margin: auto;\n}\n\nh3#prompt {\n text-align: center;\n font-size : 1.5em;\n}\n\n#option1, #option2 { \n font-size: 1.5em;\n border-color: var(--citygreen); \n border-width: 2px;\n background-color: var(--white);\n color: var(--citygreen);\n}\n\n#option1:hover, #option2:hover { \n background-color: var(--spiritgreen);\n color: white;\n}\n\n#option2.clicked, #option1.clicked {\n font-weight: bold;\n background-color: var(--spiritgreen);\n color: white;\n border-width: 3;\n}\n`, "",{"version":3,"sources":["webpack://./src/js/components/prompt/prompt.css"],"names":[],"mappings":"AAAA;IACI,aAAa;IACb,kBAAkB;IAClB,UAAU;IACV,YAAY;AAChB;;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","sourcesContent":["#prompt-div {\\n display: none;\\n text-align: center;\\n width: 80%;\\n margin: auto;\\n}\\n\\nh3#prompt {\\n text-align: center;\\n font-size : 1.5em;\\n}\\n\\n#option1, #option2 { \\n font-size: 1.5em;\\n border-color: var(--citygreen); \\n border-width: 2px;\\n background-color: var(--white);\\n color: var(--citygreen);\\n}\\n\\n#option1:hover, #option2:hover { \\n background-color: var(--spiritgreen);\\n color: white;\\n}\\n\\n#option2.clicked, #option1.clicked {\\n font-weight: bold;\\n background-color: var(--spiritgreen);\\n color: white;\\n border-width: 3;\\n}\\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvcHJvbXB0L3Byb21wdC5jc3M/ZTY5OSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgI3Byb21wdC1kaXYge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHdpZHRoOiA4MCU7XG4gICAgbWFyZ2luOiBhdXRvO1xufVxuXG5oMyNwcm9tcHQge1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBmb250LXNpemUgOiAxLjVlbTtcbn1cblxuI29wdGlvbjEsICNvcHRpb24yIHsgXG4gICAgZm9udC1zaXplOiAxLjVlbTtcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWNpdHlncmVlbik7IFxuICAgIGJvcmRlci13aWR0aDogMnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXdoaXRlKTtcbiAgICBjb2xvcjogdmFyKC0tY2l0eWdyZWVuKTtcbn1cblxuI29wdGlvbjE6aG92ZXIsICNvcHRpb24yOmhvdmVyIHsgXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xuICAgIGNvbG9yOiB3aGl0ZTtcbn1cblxuI29wdGlvbjIuY2xpY2tlZCwgI29wdGlvbjEuY2xpY2tlZCB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xuICAgIGNvbG9yOiB3aGl0ZTtcbiAgICBib3JkZXItd2lkdGg6IDM7XG59XG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9qcy9jb21wb25lbnRzL3Byb21wdC9wcm9tcHQuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksYUFBYTtJQUNiLGtCQUFrQjtJQUNsQixVQUFVO0lBQ1YsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsOEJBQThCO0lBQzlCLGlCQUFpQjtJQUNqQiw4QkFBOEI7SUFDOUIsdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0ksb0NBQW9DO0lBQ3BDLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsb0NBQW9DO0lBQ3BDLFlBQVk7SUFDWixlQUFlO0FBQ25CXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIiNwcm9tcHQtZGl2IHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICB3aWR0aDogODAlO1xcbiAgICBtYXJnaW46IGF1dG87XFxufVxcblxcbmgzI3Byb21wdCB7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgZm9udC1zaXplIDogMS41ZW07XFxufVxcblxcbiNvcHRpb24xLCAjb3B0aW9uMiB7IFxcbiAgICBmb250LXNpemU6IDEuNWVtO1xcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWNpdHlncmVlbik7IFxcbiAgICBib3JkZXItd2lkdGg6IDJweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0td2hpdGUpO1xcbiAgICBjb2xvcjogdmFyKC0tY2l0eWdyZWVuKTtcXG59XFxuXFxuI29wdGlvbjE6aG92ZXIsICNvcHRpb24yOmhvdmVyIHsgXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcXG4gICAgY29sb3I6IHdoaXRlO1xcbn1cXG5cXG4jb3B0aW9uMi5jbGlja2VkLCAjb3B0aW9uMS5jbGlja2VkIHtcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcXG4gICAgY29sb3I6IHdoaXRlO1xcbiAgICBib3JkZXItd2lkdGg6IDM7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\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 {\n background-color: lightgrey; \n /* min-height: 100vh; Full height of viewport */\n }\n\n#supp-total .stat {\n color: var(--yellow);\n}\n\n.stat {\n font-weight: bold;\n}\n\n#sidebar-panel {\n height: 100%; /* Full height of the viewport */\n position: fixed; /* Fixed Sidebar (stay in place on scroll) */\n z-index: 1; /* Stay on top */\n top: 0; /* Stay at the top */\n right: 0; /* Sidebar appears on the left */\n background-color: #FFFFFF; /* White background color */\n overflow-x: hidden; /* Disable horizontal scroll */\n padding: 20px;\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); /* Add shadow for some depth */\n border-right: 2px solid #DDDDDD; /* Right border */\n border-radius: 15px 0px 0px 15px; /* Rounded corners on the left */\n /* margin-top: var(--header-height); */\n width: var(--sidebar-width);\n margin: 0px;\n }\n \n.sidebar a {\n padding: 10px 15px;\n text-decoration: none;\n font-size: 18px;\n color: #818181;\n display: block;\n transition: 0.3s;\n}\n\n#sidebar-title {\n color: var(--darkGray);\n font-weight: bold;\n border-bottom: 1px solid var(--citygreen);\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,gCAAgC,EAAE,gCAAgC;IAClE,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","sourcesContent":["#sidebar-panel {\\n background-color: lightgrey; \\n /* min-height: 100vh; Full height of viewport */\\n }\\n\\n#supp-total .stat {\\n color: var(--yellow);\\n}\\n\\n.stat {\\n font-weight: bold;\\n}\\n\\n#sidebar-panel {\\n height: 100%; /* Full height of the viewport */\\n position: fixed; /* Fixed Sidebar (stay in place on scroll) */\\n z-index: 1; /* Stay on top */\\n top: 0; /* Stay at the top */\\n right: 0; /* Sidebar appears on the left */\\n background-color: #FFFFFF; /* White background color */\\n overflow-x: hidden; /* Disable horizontal scroll */\\n padding: 20px;\\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); /* Add shadow for some depth */\\n border-right: 2px solid #DDDDDD; /* Right border */\\n border-radius: 15px 0px 0px 15px; /* Rounded corners on the left */\\n /* margin-top: var(--header-height); */\\n width: var(--sidebar-width);\\n margin: 0px;\\n }\\n \\n.sidebar a {\\n padding: 10px 15px;\\n text-decoration: none;\\n font-size: 18px;\\n color: #818181;\\n display: block;\\n transition: 0.3s;\\n}\\n\\n#sidebar-title {\\n color: var(--darkGray);\\n font-weight: bold;\\n border-bottom: 1px solid var(--citygreen);\\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvc2lkZWJhci9zaWRlYmFyLmNzcz8zYjAzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAjc2lkZWJhci1wYW5lbCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmV5OyAgXG4gICAgLyogbWluLWhlaWdodDogMTAwdmg7IEZ1bGwgaGVpZ2h0IG9mIHZpZXdwb3J0ICovXG4gIH1cblxuI3N1cHAtdG90YWwgLnN0YXQge1xuICAgIGNvbG9yOiB2YXIoLS15ZWxsb3cpO1xufVxuXG4uc3RhdCB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbiNzaWRlYmFyLXBhbmVsIHtcbiAgICBoZWlnaHQ6IDEwMCU7IC8qIEZ1bGwgaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydCAqL1xuICAgIHBvc2l0aW9uOiBmaXhlZDsgLyogRml4ZWQgU2lkZWJhciAoc3RheSBpbiBwbGFjZSBvbiBzY3JvbGwpICovXG4gICAgei1pbmRleDogMTsgLyogU3RheSBvbiB0b3AgKi9cbiAgICB0b3A6IDA7IC8qIFN0YXkgYXQgdGhlIHRvcCAqL1xuICAgIHJpZ2h0OiAwOyAvKiBTaWRlYmFyIGFwcGVhcnMgb24gdGhlIGxlZnQgKi9cbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOyAvKiBXaGl0ZSBiYWNrZ3JvdW5kIGNvbG9yICovXG4gICAgb3ZlcmZsb3cteDogaGlkZGVuOyAvKiBEaXNhYmxlIGhvcml6b250YWwgc2Nyb2xsICovXG4gICAgcGFkZGluZzogMjBweDtcbiAgICBib3gtc2hhZG93OiAwIDJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEpOyAvKiBBZGQgc2hhZG93IGZvciBzb21lIGRlcHRoICovXG4gICAgYm9yZGVyLXJpZ2h0OiAycHggc29saWQgI0RERERERDsgLyogUmlnaHQgYm9yZGVyICovXG4gICAgYm9yZGVyLXJhZGl1czogMTVweCAwcHggMHB4IDE1cHg7IC8qIFJvdW5kZWQgY29ybmVycyBvbiB0aGUgbGVmdCAqL1xuICAgIC8qIG1hcmdpbi10b3A6IHZhcigtLWhlYWRlci1oZWlnaHQpOyAqL1xuICAgIHdpZHRoOiB2YXIoLS1zaWRlYmFyLXdpZHRoKTtcbiAgICBtYXJnaW46IDBweDtcbiAgfVxuICBcbi5zaWRlYmFyIGEge1xuICAgIHBhZGRpbmc6IDEwcHggMTVweDtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgZm9udC1zaXplOiAxOHB4O1xuICAgIGNvbG9yOiAjODE4MTgxO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHRyYW5zaXRpb246IDAuM3M7XG59XG5cbiNzaWRlYmFyLXRpdGxlIHtcbiAgY29sb3I6IHZhcigtLWRhcmtHcmF5KTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1jaXR5Z3JlZW4pO1xufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvc2lkZWJhci9zaWRlYmFyLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLDJCQUEyQjtJQUMzQiwrQ0FBK0M7RUFDakQ7O0FBRUY7SUFDSSxvQkFBb0I7QUFDeEI7O0FBRUE7SUFDSSxpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxZQUFZLEVBQUUsZ0NBQWdDO0lBQzlDLGVBQWUsRUFBRSw0Q0FBNEM7SUFDN0QsVUFBVSxFQUFFLGdCQUFnQjtJQUM1QixNQUFNLEVBQUUsb0JBQW9CO0lBQzVCLFFBQVEsRUFBRSxnQ0FBZ0M7SUFDMUMseUJBQXlCLEVBQUUsMkJBQTJCO0lBQ3RELGtCQUFrQixFQUFFLDhCQUE4QjtJQUNsRCxhQUFhO0lBQ2Isd0NBQXdDLEVBQUUsOEJBQThCO0lBQ3hFLCtCQUErQixFQUFFLGlCQUFpQjtJQUNsRCxnQ0FBZ0MsRUFBRSxnQ0FBZ0M7SUFDbEUsc0NBQXNDO0lBQ3RDLDJCQUEyQjtJQUMzQixXQUFXO0VBQ2I7O0FBRUY7SUFDSSxrQkFBa0I7SUFDbEIscUJBQXFCO0lBQ3JCLGVBQWU7SUFDZixjQUFjO0lBQ2QsY0FBYztJQUNkLGdCQUFnQjtBQUNwQjs7QUFFQTtFQUNFLHNCQUFzQjtFQUN0QixpQkFBaUI7RUFDakIseUNBQXlDO0FBQzNDXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIiNzaWRlYmFyLXBhbmVsIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmV5OyAgXFxuICAgIC8qIG1pbi1oZWlnaHQ6IDEwMHZoOyBGdWxsIGhlaWdodCBvZiB2aWV3cG9ydCAqL1xcbiAgfVxcblxcbiNzdXBwLXRvdGFsIC5zdGF0IHtcXG4gICAgY29sb3I6IHZhcigtLXllbGxvdyk7XFxufVxcblxcbi5zdGF0IHtcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxufVxcblxcbiNzaWRlYmFyLXBhbmVsIHtcXG4gICAgaGVpZ2h0OiAxMDAlOyAvKiBGdWxsIGhlaWdodCBvZiB0aGUgdmlld3BvcnQgKi9cXG4gICAgcG9zaXRpb246IGZpeGVkOyAvKiBGaXhlZCBTaWRlYmFyIChzdGF5IGluIHBsYWNlIG9uIHNjcm9sbCkgKi9cXG4gICAgei1pbmRleDogMTsgLyogU3RheSBvbiB0b3AgKi9cXG4gICAgdG9wOiAwOyAvKiBTdGF5IGF0IHRoZSB0b3AgKi9cXG4gICAgcmlnaHQ6IDA7IC8qIFNpZGViYXIgYXBwZWFycyBvbiB0aGUgbGVmdCAqL1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOyAvKiBXaGl0ZSBiYWNrZ3JvdW5kIGNvbG9yICovXFxuICAgIG92ZXJmbG93LXg6IGhpZGRlbjsgLyogRGlzYWJsZSBob3Jpem9udGFsIHNjcm9sbCAqL1xcbiAgICBwYWRkaW5nOiAyMHB4O1xcbiAgICBib3gtc2hhZG93OiAwIDJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEpOyAvKiBBZGQgc2hhZG93IGZvciBzb21lIGRlcHRoICovXFxuICAgIGJvcmRlci1yaWdodDogMnB4IHNvbGlkICNEREREREQ7IC8qIFJpZ2h0IGJvcmRlciAqL1xcbiAgICBib3JkZXItcmFkaXVzOiAxNXB4IDBweCAwcHggMTVweDsgLyogUm91bmRlZCBjb3JuZXJzIG9uIHRoZSBsZWZ0ICovXFxuICAgIC8qIG1hcmdpbi10b3A6IHZhcigtLWhlYWRlci1oZWlnaHQpOyAqL1xcbiAgICB3aWR0aDogdmFyKC0tc2lkZWJhci13aWR0aCk7XFxuICAgIG1hcmdpbjogMHB4O1xcbiAgfVxcbiAgXFxuLnNpZGViYXIgYSB7XFxuICAgIHBhZGRpbmc6IDEwcHggMTVweDtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcbiAgICBmb250LXNpemU6IDE4cHg7XFxuICAgIGNvbG9yOiAjODE4MTgxO1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgdHJhbnNpdGlvbjogMC4zcztcXG59XFxuXFxuI3NpZGViYXItdGl0bGUge1xcbiAgY29sb3I6IHZhcigtLWRhcmtHcmF5KTtcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWNpdHlncmVlbik7XFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\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, `thead > tr > th {\n text-align: left;\n}\n\nth {\n background-color: var(--lightGray);\n}\n\ntr {\n border-width: 2px;\n background-color: white;\n}\n\ntr td {\n border-bottom: 1px solid black;\n}\n\n/* textbox width in table */\ninput {\n width: 100%;\n}\n\ndiv.table-container {\n display: table; \n overflow-x: auto; /* Scroll horizontally if the table content is wider than the container */\n overflow-y: auto;\n padding-left: max(100px, 10vh);\n padding-right: max(100px, 10vh);\n max-width: calc(100vw - var(--sidebar-width)); \n margin: auto;\n min-height: 120px;\n\n}\n \n#main-table {\n font-size: calc(0.6vw + 0.5em);\n margin: auto;\n}\n\n/* Add new row button */\n.btn-add { \n background-color: var(--spiritgreen);\n margin-top: 20px;\n display: none;\n}\n\n.btn-delete {\n background-color: var(--orange);\n}\n\n#add-btn-div {\n display: flex;\n justify-content: center; /* Aligns horizontally */\n align-items: center; /* Aligns vertically */\n width: 100%;\n}\n\n.btn-edit {\n background-color: var(--spiritgreen);\n}\n\n.active-editing, .selected {\n background-color: var(--palegreen);\n}\n\n.selected { \n font-weight: bold;\n}\n\n.btn-confirm {\n display: none;\n}\n\n.confirm-btn:hover {\n background-color: var(--green);\n}\n\n.hover-effect:hover {\n cursor: pointer;\n background-color: var(--verypalegreen); /* You can choose any color you like */\n}`, "",{"version":3,"sources":["webpack://./src/js/components/table/table.css"],"names":[],"mappings":"AAAA;IACI,gBAAgB;AACpB;;AAEA;IACI,kCAAkC;AACtC;;AAEA;IACI,iBAAiB;IACjB,uBAAuB;AAC3B;;AAEA;IACI,8BAA8B;AAClC;;AAEA,2BAA2B;AAC3B;IACI,WAAW;AACf;;AAEA;IACI,cAAc;IACd,gBAAgB,EAAE,yEAAyE;IAC3F,gBAAgB;IAChB,8BAA8B;IAC9B,+BAA+B;IAC/B,6CAA6C;IAC7C,YAAY;IACZ,iBAAiB;;AAErB;;AAEA;IACI,8BAA8B;IAC9B,YAAY;AAChB;;AAEA,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;AACxC;;AAEA;IACI,kCAAkC;AACtC;;AAEA;IACI,iBAAiB;AACrB;;AAEA;IACI,aAAa;AACjB;;AAEA;IACI,8BAA8B;AAClC;;AAEA;IACI,eAAe;IACf,sCAAsC,EAAE,sCAAsC;AAClF","sourcesContent":["thead > tr > th {\\n text-align: left;\\n}\\n\\nth {\\n background-color: var(--lightGray);\\n}\\n\\ntr {\\n border-width: 2px;\\n background-color: white;\\n}\\n\\ntr td {\\n border-bottom: 1px solid black;\\n}\\n\\n/* textbox width in table */\\ninput {\\n width: 100%;\\n}\\n\\ndiv.table-container {\\n display: table; \\n overflow-x: auto; /* Scroll horizontally if the table content is wider than the container */\\n overflow-y: auto;\\n padding-left: max(100px, 10vh);\\n padding-right: max(100px, 10vh);\\n max-width: calc(100vw - var(--sidebar-width)); \\n margin: auto;\\n min-height: 120px;\\n\\n}\\n \\n#main-table {\\n font-size: calc(0.6vw + 0.5em);\\n margin: auto;\\n}\\n\\n/* Add new row button */\\n.btn-add { \\n background-color: var(--spiritgreen);\\n margin-top: 20px;\\n display: none;\\n}\\n\\n.btn-delete {\\n background-color: var(--orange);\\n}\\n\\n#add-btn-div {\\n display: flex;\\n justify-content: center; /* Aligns horizontally */\\n align-items: center; /* Aligns vertically */\\n width: 100%;\\n}\\n\\n.btn-edit {\\n background-color: var(--spiritgreen);\\n}\\n\\n.active-editing, .selected {\\n background-color: var(--palegreen);\\n}\\n\\n.selected { \\n font-weight: bold;\\n}\\n\\n.btn-confirm {\\n display: none;\\n}\\n\\n.confirm-btn:hover {\\n background-color: var(--green);\\n}\\n\\n.hover-effect:hover {\\n cursor: pointer;\\n background-color: var(--verypalegreen); /* You can choose any color you like */\\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc5LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy90YWJsZS90YWJsZS5jc3M/NTIzNyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgdGhlYWQgPiB0ciA+IHRoIHtcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuXG50aCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHRHcmF5KTtcbn1cblxudHIge1xuICAgIGJvcmRlci13aWR0aDogMnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xufVxuXG50ciB0ZCB7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO1xufVxuXG4vKiB0ZXh0Ym94IHdpZHRoIGluIHRhYmxlICovXG5pbnB1dCB7XG4gICAgd2lkdGg6IDEwMCU7XG59XG5cbmRpdi50YWJsZS1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IHRhYmxlOyBcbiAgICBvdmVyZmxvdy14OiBhdXRvOyAvKiBTY3JvbGwgaG9yaXpvbnRhbGx5IGlmIHRoZSB0YWJsZSBjb250ZW50IGlzIHdpZGVyIHRoYW4gdGhlIGNvbnRhaW5lciAqL1xuICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgcGFkZGluZy1sZWZ0OiBtYXgoMTAwcHgsIDEwdmgpO1xuICAgIHBhZGRpbmctcmlnaHQ6IG1heCgxMDBweCwgMTB2aCk7XG4gICAgbWF4LXdpZHRoOiBjYWxjKDEwMHZ3IC0gdmFyKC0tc2lkZWJhci13aWR0aCkpOyBcbiAgICBtYXJnaW46IGF1dG87XG4gICAgbWluLWhlaWdodDogMTIwcHg7XG5cbn1cbiAgXG4jbWFpbi10YWJsZSB7XG4gICAgZm9udC1zaXplOiBjYWxjKDAuNnZ3ICsgMC41ZW0pO1xuICAgIG1hcmdpbjogYXV0bztcbn1cblxuLyogQWRkIG5ldyByb3cgYnV0dG9uICovXG4uYnRuLWFkZCB7IFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcbiAgICBtYXJnaW4tdG9wOiAyMHB4O1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5idG4tZGVsZXRlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1vcmFuZ2UpO1xufVxuXG4jYWRkLWJ0bi1kaXYge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IC8qIEFsaWducyBob3Jpem9udGFsbHkgKi9cbiAgICBhbGlnbi1pdGVtczogY2VudGVyOyAvKiBBbGlnbnMgdmVydGljYWxseSAqL1xuICAgIHdpZHRoOiAxMDAlO1xufVxuXG4uYnRuLWVkaXQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcbn1cblxuLmFjdGl2ZS1lZGl0aW5nLCAuc2VsZWN0ZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhbGVncmVlbik7XG59XG5cbi5zZWxlY3RlZCB7IFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4uYnRuLWNvbmZpcm0ge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5jb25maXJtLWJ0bjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ3JlZW4pO1xufVxuXG4uaG92ZXItZWZmZWN0OmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdmVyeXBhbGVncmVlbik7IC8qIFlvdSBjYW4gY2hvb3NlIGFueSBjb2xvciB5b3UgbGlrZSAqL1xufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0ksa0NBQWtDO0FBQ3RDOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLHVCQUF1QjtBQUMzQjs7QUFFQTtJQUNJLDhCQUE4QjtBQUNsQzs7QUFFQSwyQkFBMkI7QUFDM0I7SUFDSSxXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxjQUFjO0lBQ2QsZ0JBQWdCLEVBQUUseUVBQXlFO0lBQzNGLGdCQUFnQjtJQUNoQiw4QkFBOEI7SUFDOUIsK0JBQStCO0lBQy9CLDZDQUE2QztJQUM3QyxZQUFZO0lBQ1osaUJBQWlCOztBQUVyQjs7QUFFQTtJQUNJLDhCQUE4QjtJQUM5QixZQUFZO0FBQ2hCOztBQUVBLHVCQUF1QjtBQUN2QjtJQUNJLG9DQUFvQztJQUNwQyxnQkFBZ0I7SUFDaEIsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLCtCQUErQjtBQUNuQzs7QUFFQTtJQUNJLGFBQWE7SUFDYix1QkFBdUIsRUFBRSx3QkFBd0I7SUFDakQsbUJBQW1CLEVBQUUsc0JBQXNCO0lBQzNDLFdBQVc7QUFDZjs7QUFFQTtJQUNJLG9DQUFvQztBQUN4Qzs7QUFFQTtJQUNJLGtDQUFrQztBQUN0Qzs7QUFFQTtJQUNJLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGFBQWE7QUFDakI7O0FBRUE7SUFDSSw4QkFBOEI7QUFDbEM7O0FBRUE7SUFDSSxlQUFlO0lBQ2Ysc0NBQXNDLEVBQUUsc0NBQXNDO0FBQ2xGXCIsXCJzb3VyY2VzQ29udGVudFwiOltcInRoZWFkID4gdHIgPiB0aCB7XFxuICAgIHRleHQtYWxpZ246IGxlZnQ7XFxufVxcblxcbnRoIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHRHcmF5KTtcXG59XFxuXFxudHIge1xcbiAgICBib3JkZXItd2lkdGg6IDJweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxufVxcblxcbnRyIHRkIHtcXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO1xcbn1cXG5cXG4vKiB0ZXh0Ym94IHdpZHRoIGluIHRhYmxlICovXFxuaW5wdXQge1xcbiAgICB3aWR0aDogMTAwJTtcXG59XFxuXFxuZGl2LnRhYmxlLWNvbnRhaW5lciB7XFxuICAgIGRpc3BsYXk6IHRhYmxlOyBcXG4gICAgb3ZlcmZsb3cteDogYXV0bzsgLyogU2Nyb2xsIGhvcml6b250YWxseSBpZiB0aGUgdGFibGUgY29udGVudCBpcyB3aWRlciB0aGFuIHRoZSBjb250YWluZXIgKi9cXG4gICAgb3ZlcmZsb3cteTogYXV0bztcXG4gICAgcGFkZGluZy1sZWZ0OiBtYXgoMTAwcHgsIDEwdmgpO1xcbiAgICBwYWRkaW5nLXJpZ2h0OiBtYXgoMTAwcHgsIDEwdmgpO1xcbiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwdncgLSB2YXIoLS1zaWRlYmFyLXdpZHRoKSk7IFxcbiAgICBtYXJnaW46IGF1dG87XFxuICAgIG1pbi1oZWlnaHQ6IDEyMHB4O1xcblxcbn1cXG4gIFxcbiNtYWluLXRhYmxlIHtcXG4gICAgZm9udC1zaXplOiBjYWxjKDAuNnZ3ICsgMC41ZW0pO1xcbiAgICBtYXJnaW46IGF1dG87XFxufVxcblxcbi8qIEFkZCBuZXcgcm93IGJ1dHRvbiAqL1xcbi5idG4tYWRkIHsgXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcXG4gICAgbWFyZ2luLXRvcDogMjBweDtcXG4gICAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuLmJ0bi1kZWxldGUge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1vcmFuZ2UpO1xcbn1cXG5cXG4jYWRkLWJ0bi1kaXYge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgLyogQWxpZ25zIGhvcml6b250YWxseSAqL1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyOyAvKiBBbGlnbnMgdmVydGljYWxseSAqL1xcbiAgICB3aWR0aDogMTAwJTtcXG59XFxuXFxuLmJ0bi1lZGl0IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xcbn1cXG5cXG4uYWN0aXZlLWVkaXRpbmcsIC5zZWxlY3RlZCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhbGVncmVlbik7XFxufVxcblxcbi5zZWxlY3RlZCB7IFxcbiAgICBmb250LXdlaWdodDogYm9sZDtcXG59XFxuXFxuLmJ0bi1jb25maXJtIHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuLmNvbmZpcm0tYnRuOmhvdmVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ3JlZW4pO1xcbn1cXG5cXG4uaG92ZXItZWZmZWN0OmhvdmVyIHtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS12ZXJ5cGFsZWdyZWVuKTsgLyogWW91IGNhbiBjaG9vc2UgYW55IGNvbG9yIHlvdSBsaWtlICovXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///279\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) */\n\n.step {\n width: 60%;\n height: 80px;\n font-size: 1.75em;\n margin-bottom: 0px; /* Adds spacing between buttons */\n margin-left: 20%;\n border-color: var(--citygreen);\n border-width: 2;\n color: var(--citygreen);\n background-color: white;\n}\n\n.step:hover {\n color: white;\n background-color: var(--spiritgreen);\n}\n\n#welcome-page {\n justify-content: center; \n align-items: center; \n padding-top: 20px;\n}\n.step.disabled {\n opacity: 50%;\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) */\\n\\n.step {\\n width: 60%;\\n height: 80px;\\n font-size: 1.75em;\\n margin-bottom: 0px; /* Adds spacing between buttons */\\n margin-left: 20%;\\n border-color: var(--citygreen);\\n border-width: 2;\\n color: var(--citygreen);\\n background-color: white;\\n}\\n\\n.step:hover {\\n color: white;\\n background-color: var(--spiritgreen);\\n}\\n\\n#welcome-page {\\n justify-content: center; \\n align-items: center; \\n padding-top: 20px;\\n}\\n.step.disabled {\\n opacity: 50%;\\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy93ZWxjb21lL3dlbGNvbWUuY3NzP2IzNDgiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC8qIFdlbGNvbWUgcGFnZSAoaW5kZXguaHRtbCkgKi9cblxuLnN0ZXAge1xuICAgIHdpZHRoOiA2MCU7XG4gICAgaGVpZ2h0OiA4MHB4O1xuICAgIGZvbnQtc2l6ZTogMS43NWVtO1xuICAgIG1hcmdpbi1ib3R0b206IDBweDsgLyogQWRkcyBzcGFjaW5nIGJldHdlZW4gYnV0dG9ucyAqL1xuICAgIG1hcmdpbi1sZWZ0OiAyMCU7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pO1xuICAgIGJvcmRlci13aWR0aDogMjtcbiAgICBjb2xvcjogdmFyKC0tY2l0eWdyZWVuKTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbn1cblxuLnN0ZXA6aG92ZXIge1xuICAgIGNvbG9yOiB3aGl0ZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XG59XG5cbiN3ZWxjb21lLXBhZ2Uge1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOyBcbiAgICBhbGlnbi1pdGVtczogY2VudGVyOyBcbiAgICBwYWRkaW5nLXRvcDogMjBweDtcbn1cbi5zdGVwLmRpc2FibGVkIHtcbiAgICBvcGFjaXR5OiA1MCU7XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvanMvY29tcG9uZW50cy93ZWxjb21lL3dlbGNvbWUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBLDhCQUE4Qjs7QUFFOUI7SUFDSSxVQUFVO0lBQ1YsWUFBWTtJQUNaLGlCQUFpQjtJQUNqQixrQkFBa0IsRUFBRSxpQ0FBaUM7SUFDckQsZ0JBQWdCO0lBQ2hCLDhCQUE4QjtJQUM5QixlQUFlO0lBQ2YsdUJBQXVCO0lBQ3ZCLHVCQUF1QjtBQUMzQjs7QUFFQTtJQUNJLFlBQVk7SUFDWixvQ0FBb0M7QUFDeEM7O0FBRUE7SUFDSSx1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLGlCQUFpQjtBQUNyQjtBQUNBO0lBQ0ksWUFBWTtBQUNoQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIvKiBXZWxjb21lIHBhZ2UgKGluZGV4Lmh0bWwpICovXFxuXFxuLnN0ZXAge1xcbiAgICB3aWR0aDogNjAlO1xcbiAgICBoZWlnaHQ6IDgwcHg7XFxuICAgIGZvbnQtc2l6ZTogMS43NWVtO1xcbiAgICBtYXJnaW4tYm90dG9tOiAwcHg7IC8qIEFkZHMgc3BhY2luZyBiZXR3ZWVuIGJ1dHRvbnMgKi9cXG4gICAgbWFyZ2luLWxlZnQ6IDIwJTtcXG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pO1xcbiAgICBib3JkZXItd2lkdGg6IDI7XFxuICAgIGNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG59XFxuXFxuLnN0ZXA6aG92ZXIge1xcbiAgICBjb2xvcjogd2hpdGU7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcXG59XFxuXFxuI3dlbGNvbWUtcGFnZSB7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOyBcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjsgXFxuICAgIHBhZGRpbmctdG9wOiAyMHB4O1xcbn1cXG4uc3RlcC5kaXNhYmxlZCB7XFxuICAgIG9wYWNpdHk6IDUwJTtcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\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 t=__webpack_module_cache__[n];if(void 0!==t)return t.exports;var e=__webpack_module_cache__[n]={id:n,exports:{}};return __webpack_modules__[n](e,e.exports,__webpack_require__),e.exports}__webpack_require__.n=n=>{var t=n&&n.__esModule?()=>n.default:()=>n;return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=(n,t)=>{for(var e in t)__webpack_require__.o(t,e)&&!__webpack_require__.o(n,e)&&Object.defineProperty(n,e,{enumerable:!0,get:t[e]})},__webpack_require__.o=(n,t)=>Object.prototype.hasOwnProperty.call(n,t),__webpack_require__.nc=void 0;var __webpack_exports__=__webpack_require__(496)})();
\ No newline at end of file
diff --git a/assets/city-of-detroit-logo.png b/build/d027d45141f87dc014af.png
similarity index 100%
rename from assets/city-of-detroit-logo.png
rename to build/d027d45141f87dc014af.png
diff --git a/build/index.html b/build/index.html
new file mode 100644
index 0000000..42674bb
--- /dev/null
+++ b/build/index.html
@@ -0,0 +1 @@
+Demo Budget FormFY2026 Budget Form
\ No newline at end of file
diff --git a/data/law_dept_sample/funds.json b/data/law_dept_sample/funds.json
deleted file mode 100644
index dfe4c80..0000000
--- a/data/law_dept_sample/funds.json
+++ /dev/null
@@ -1,6 +0,0 @@
-[
- { "ID" : "1000",
- "Name" : "General Fund"},
- { "ID" : "29320",
- "NAme" : "Sample Grant Fund"}
-]
\ No newline at end of file
diff --git a/data/law_dept_sample/nonpersonnel_data.json b/data/law_dept_sample/nonpersonnel_data.json
deleted file mode 100644
index 0b8493a..0000000
--- a/data/law_dept_sample/nonpersonnel_data.json
+++ /dev/null
@@ -1,29 +0,0 @@
-[
- {
- "Vendor": "Law Firm LLC",
- "CPA #" : "765421",
- "Account String": "1000-29320-320010",
- "Object Name": "Consulting",
- "End of Contract": "12/31/2024",
- "Amount Remaining" : 50000,
- "FY26 Request": 100000
- },
- {
- "Vendor": "Office Supplier",
- "CPA #" : "1234567",
- "Account String": "1000-29320-320010",
- "Object Name": "Office Supplies",
- "End of Contract": "12/31/2026",
- "Amount Remaining" : 500000,
- "FY26 Request": 10000
- },
- {
- "Vendor": "Software Co.",
- "CPA #" : "9876543",
- "Account String": "1000-29320-320010",
- "Object Name": "Information Technology",
- "End of Contract": "6/1/2025",
- "Amount Remaining" : 30000,
- "FY26 Request": 30000
- }
-]
\ No newline at end of file
diff --git a/data/law_dept_sample/personnel_data.json b/data/law_dept_sample/personnel_data.json
deleted file mode 100644
index 27d97c9..0000000
--- a/data/law_dept_sample/personnel_data.json
+++ /dev/null
@@ -1,23 +0,0 @@
-[
- {
- "Job Name (Type)": "Deputy Counsel (Regular)",
- "Account String": "1000-29320-320010",
- "Service" : "Appeals",
- "FY26 FTEs": 1,
- "Average Projected Salary": "150000"
- },
- {
- "Job Name (Type)": "Legal Secretary (Regular)",
- "Account String": "1000-29320-320010",
- "Service" : "FOIA",
- "FY26 FTEs": 2,
- "Average Projected Salary": "55000"
- },
- {
- "Job Name (Type)": "Assistant Counsel (Regular)",
- "Account String": "1000-29320-320010",
- "Service" : "Appeals",
- "FY26 FTEs": 10,
- "Average Projected Salary": "80000"
- }
-]
\ No newline at end of file
diff --git a/data/law_dept_sample/services.json b/data/law_dept_sample/services.json
deleted file mode 100644
index 2a4dd15..0000000
--- a/data/law_dept_sample/services.json
+++ /dev/null
@@ -1,10 +0,0 @@
-[
- { "id" : "",
- "name" : "Select"},
- { "id" : "Appeals",
- "name" : "Appeals"},
- { "id" : "FOIA",
- "name" : "FOIA" },
- { "id" : "Lobbying",
- "name" : "Lobbying"}
-]
\ No newline at end of file
diff --git a/data/law_dept_sample/strings.json b/data/law_dept_sample/strings.json
deleted file mode 100644
index 955a422..0000000
--- a/data/law_dept_sample/strings.json
+++ /dev/null
@@ -1,39 +0,0 @@
-{
- "1000" : {
- "label" : "General Fund",
- "appropriations" : {
- "29320" : {
- "label" : "Efficient and Innovative Operations Support",
- "cost centers" : {
- "320010" : { "label" : "Law Administration" },
- "321111" : { "label" : "Law Department Grants" }
- }
- }
- }
- },
-
- "2119" : {
- "label" : "FY2020 MIDC Grant",
- "appropriations" : {
- "21206" : {
- "label" : "2023 Michigan Indigent Defense Commission",
- "cost centers" : {
- "320010" : { "label" : "Law Administration" },
- "321111" : { "label" : "Law Department Grants" }
- }
- }
- }
- },
-
- "2490" : {
- "label" : "Construction Code Fund",
- "appropriations" : {
- "25130" : {
- "label" : "BSEED Safe Buildings",
- "cost centers" : {
- "320010" : { "label" : "Law Administration" }
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/js/components/form/subcomponents/dropdown.js b/js/components/form/subcomponents/dropdown.js
deleted file mode 100644
index 5f64600..0000000
--- a/js/components/form/subcomponents/dropdown.js
+++ /dev/null
@@ -1,25 +0,0 @@
-async function createDropdownFromJSON(json_path) {
- // Fetch JSON data from a file asynchronously
- const response = await fetch(json_path);
- const dataArray = await response.json();
-
- // Creating a select element
- const selectElement = document.createElement('select');
-
- // Looping through the array and creating an option for each element
- dataArray.forEach(item => {
- const optionElement = document.createElement('option');
- optionElement.value = item.id; // Setting the option value to the item id
- optionElement.textContent = item.name; // Setting the display text to the item name
- selectElement.appendChild(optionElement); // Appending the option to the select
- });
-
- // Return the select element so it can be appended to the document
- return selectElement;
-}
-
-export const Dropdown = {
- createFromJSON : function(json_path){ return createDropdownFromJSON(json_path) }
-}
-
-export default Dropdown;
\ No newline at end of file
diff --git a/js/components/table/subcomponents/data.js b/js/components/table/subcomponents/data.js
deleted file mode 100644
index 4c50d3c..0000000
--- a/js/components/table/subcomponents/data.js
+++ /dev/null
@@ -1,47 +0,0 @@
-import { fetchJSON } from "../../../utils/data_utils/JSON_data_handlers.js";
-
-async function loadJSONIntoTable(jsonFilePath) {
- const data = await fetchJSON(jsonFilePath);
- try {
- if(Array.isArray(data)) {
- const table = document.getElementById('main-table');
- const thead = table.querySelector('thead');
- const tbody = table.querySelector('tbody');
-
- // clear existing data
- thead.innerHTML = '';
- tbody.innerHTML = '';
-
- // Create table header row
- const headerRow = document.createElement('tr');
- Object.keys(data[0]).forEach(key => {
- const header = document.createElement('th');
- header.textContent = key;
- headerRow.appendChild(header);
- });
- thead.appendChild(headerRow);
-
- // Create table body rows
- data.forEach(item => {
- const row = document.createElement('tr');
- Object.values(item).forEach(val => {
- const cell = document.createElement('td');
- cell.textContent = val;
- row.appendChild(cell);
- });
- tbody.appendChild(row);
- });
-
- } else {
- console.error('The provided JSON file does not contain an array of objects.');
- }
- } catch(error) {
- console.error('Failed to load and parse the JSON file:', error);
- }
-}
-
-export const Data = {
- loadFromJSON : loadJSONIntoTable
-}
-
-export default Data;
\ No newline at end of file
diff --git a/js/init.js b/js/init.js
index dcc6a18..5e91277 100644
--- a/js/init.js
+++ b/js/init.js
@@ -2,11 +2,6 @@
import { loadPageState } from './utils/data_utils/local_storage_handlers.js'
import { visitPage } from './views/view_logic.js'
-// path for my laptop
-// export let DATA_ROOT = '../../../data/law_dept_sample/'
-// github path
-export let DATA_ROOT = '../../budget-request-demo/data/law_dept_sample/'
-
export let REVENUE = 0;
export let TARGET = 2000000;
export var FISCAL_YEAR = '26';
diff --git a/js/utils/data_utils/JSON_data_handlers.js b/js/utils/data_utils/JSON_data_handlers.js
deleted file mode 100644
index 205a97a..0000000
--- a/js/utils/data_utils/JSON_data_handlers.js
+++ /dev/null
@@ -1,12 +0,0 @@
-export async function fetchJSON(jsonFilePath) {
- return fetch(jsonFilePath)
- .then(response => {
- if (!response.ok) {
- throw new Error('Network response was not ok');
- }
- return response.json();
- });
-}
-
-
-
\ No newline at end of file
diff --git a/js/utils/data_utils/excel_export.js b/js/utils/data_utils/excel_export.js
deleted file mode 100644
index 018aac1..0000000
--- a/js/utils/data_utils/excel_export.js
+++ /dev/null
@@ -1,12 +0,0 @@
-// Download data button
-function downloadTableAsExcel(table_name_in_storage, sheet_name, filename = "Detail_sheet") {
-
- var data = localStorage.getItem(table_name_in_storage);
- if (data) {
- const workbook = XLSX.utils.book_new();
- var tableData = JSON.parse(data);
- var worksheet = XLSX.utils.json_to_sheet(tableData);
- XLSX.utils.book_append_sheet(workbook, worksheet, sheet_name);
- XLSX.writeFile(workbook, filename + '.xlsx');
- }
-}
\ No newline at end of file
diff --git a/js/utils/data_utils/local_storage_handlers.js b/js/utils/data_utils/local_storage_handlers.js
deleted file mode 100644
index c5587e8..0000000
--- a/js/utils/data_utils/local_storage_handlers.js
+++ /dev/null
@@ -1,96 +0,0 @@
-/**
- * Saves employee table data and budget counters in local storage.
- */
-function saveTableData(table_id = "employee-table", save_as = 'employeeTableData') {
- var table = document.getElementById(table_id);
- var rows = table.rows;
- var tableData = [];
-
- for (var i = 0; i < rows.length; i++) {
- var cols = rows[i].cells;
- var rowData = [];
- for (var j = 0; j < cols.length; j++) {
- // for the action buttons, save the chosen action, not the button text
- if (cols[j].querySelector('button')) {
- rowData.push(rows[i].className);
- } else {
- rowData.push(cols[j].innerText);
- }
- }
- tableData.push(rowData);
- }
-
- // Save JSON string to localStorage
- localStorage.setItem(save_as, JSON.stringify(tableData));
- saveCounters();
-}
-
-/**
- * Loads employee table data and budget counters from local storage.
- *
- */
-function loadTableData(table_name_in_storage = "employeeTableData") {
- var data = localStorage.getItem(table_name_in_storage);
- if (data) {
- var tableData = JSON.parse(data);
- var table = document.getElementById("employee-table");
-
- // It's good practice to empty the existing table first
- while (table.rows.length > 1) {
- table.deleteRow(1);
- }
-
- // Now, add the loaded rows to the table
- for (var i = 1; i < tableData.length; i++) {
- var newRow = table.insertRow(-1);
- var ncols = tableData[i].length;
- for (var j = 0; j < ncols-1; j++) {
- var newCell = newRow.insertCell(j);
- newCell.innerText = tableData[i][j];
- // Add the cost column
- if (j == ncols-2){
- newCell.classList.add('cost');
- newCell.setAttribute('cost', unformatCurrency(tableData[i][j]));
- }
- }
- // Add the action buttons and load saved class
- var lastCell = newRow.insertCell(ncols-1);
- lastCell.innerHTML = `
-
-
-
-
-
- `;
- newRow.classList.add(tableData[i][ncols-1]);
- }
-
- //retrieve counter values
- loadCounters();
- }
-}
-
-// also save counters in sidebar
-function saveCounters(){
- localStorage.setItem('personnel_baseline', personnel_baseline.toString());
- localStorage.setItem('personnel_supp', personnel_supp.toString());
- // Add more here
-}
-
-// load counters in sidebar
-function loadCounters(){
- personnel_baseline = parseInt(localStorage.getItem('personnel_baseline'), 10);
- personnel_supp = parseInt(localStorage.getItem('personnel_supp'), 10);
- updateDisplay();
-}
-
-// save page state
-export function updatePageState(page){
- localStorage.setItem('page_state', page);
-}
-
-// load page state
-export function loadPageState(page){
- const pageState = localStorage.getItem('page_state');
- return pageState !== null ? pageState : 'welcome';
-}
\ No newline at end of file
diff --git a/js/views/03_revenue/helpers.js b/js/views/03_revenue/helpers.js
deleted file mode 100644
index e69de29..0000000
diff --git a/js/views/03_revenue/main.js b/js/views/03_revenue/main.js
deleted file mode 100644
index 7dc8c50..0000000
--- a/js/views/03_revenue/main.js
+++ /dev/null
@@ -1,40 +0,0 @@
-import { updatePageState } from '../../utils/data_utils/local_storage_handlers.js'
-import Prompt from '../../components/prompt/prompt.js'
-import { formatCurrency } from '../../utils/common_utils.js'
-import { REVENUE } from '../../init.js'
-import Body from '../../components/body/body.js'
-import NavButtons from '../../components/nav_buttons/nav_buttons.js'
-import { pauseAndContinue } from '../view_logic.js'
-import Subtitle from '../../components/header/header.js'
-
-export function loadRevenuePage() {
-
- //update page state
- updatePageState('revenue');
-
- // prepare page view
- Body.reset();
- NavButtons.show();
-
- // update page text
- Subtitle.update('Revenue Projections');
- // TODO: update to make dynamic
- Prompt.Text.update(`Your revenue projection for FY26 is ${formatCurrency(REVENUE, true)}`);
- Prompt.Buttons.Left.updateText('Confirm');
- Prompt.Buttons.Right.updateText("This doesn't look right");
-
- // clicking 'confirm' will also take us to the next page
- Prompt.Buttons.Left.addAction(pauseAndContinue);
- // TODO: allow user to edit revenue here
- Prompt.Buttons.Right.addAction(handleRevenueEdit);
-}
-
-function handleRevenueEdit() {
- NavButtons.Next.enable();
-}
-
-export function cleanupRevenuePage() {
- // remove event listeners on prompt buttons
- Prompt.Buttons.Left.removeAction(pauseAndContinue);
- Prompt.Buttons.Right.removeAction();
-};
\ No newline at end of file
diff --git a/js/views/04.5_OT/main.js b/js/views/04.5_OT/main.js
deleted file mode 100644
index e84def6..0000000
--- a/js/views/04.5_OT/main.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import Prompt from '../../components/prompt/prompt.js'
-import { updatePageState } from "../../utils/data_utils/local_storage_handlers.js";
-import Body from '../../components/body/body.js';
-import NavButtons from '../../components/nav_buttons/nav_buttons.js';
-import Subtitle from '../../components/header/header.js';
-import Sidebar from '../../components/sidebar/sidebar.js';
-
-export function loadOTPage(){
- //update page state
- updatePageState('overtime');
-
- // prepare page view
- Body.reset();
- NavButtons.show();
- Sidebar.show();
-
- // just enable next for now
- // TODO: only enable when all info is entered
- NavButtons.Next.enable();
-
- // update page text
- Subtitle.update('Overtime Estimates');
- // TODO: update to make dynamic
- Prompt.Text.update(`This is a placeholder for the OT estimates.`);
-}
\ No newline at end of file
diff --git a/js/views/05_nonpersonnel/helpers.js b/js/views/05_nonpersonnel/helpers.js
deleted file mode 100644
index 5f7df25..0000000
--- a/js/views/05_nonpersonnel/helpers.js
+++ /dev/null
@@ -1,65 +0,0 @@
-import Prompt from "../../components/prompt/prompt.js";
-import Sidebar from "../../components/sidebar/sidebar.js";
-import Table from "../../components/table/table.js";
-import { DATA_ROOT } from "../../init.js";
-import Body from "../../components/body/body.js";
-import NavButtons from "../../components/nav_buttons/nav_buttons.js";
-import Subtitle from "../../components/header/header.js";
-import { displayWithCommas, unformatCurrency } from "../../utils/common_utils.js";
-
-const nonPersonnelColumns = [
- { title: 'FY26 Request', className: 'request', isCost: true },
- { title: 'Amount Remaining', className: 'remaining', isCost: true },
-];
-
-export function preparePageView(){
- // prepare page view
- Body.reset();
- NavButtons.show();
- Sidebar.show();
- Table.adjustWidth('100%');
- // update page text
- Subtitle.update('Non-Personnel');
- Prompt.Text.update('Select an action item for each non-personnel line item from last year.');
-
- // just enable next for now
- // TODO: only enable when all info is entered
- NavButtons.Next.enable();
-}
-
-export async function initializeNonpersonnelTable(){
- // load table data from json
- await Table.Data.loadFromJSON(DATA_ROOT + 'nonpersonnel_data.json', 'main-table');
- //after table is loaded, fill it
- Table.show();
- Table.Columns.addAtEnd(Table.Buttons.edit_confirm_btns, " ");
- // assign cost classes
- Table.Columns.assignClasses(nonPersonnelColumns);
- // update sidebar
- updateDisplayandTotals();
- // enable editing
- Table.Buttons.Edit.init(nonPersonnelRowOnEdit, updateDisplayandTotals);
-}
-
-function nonPersonnelRowOnEdit(){
- // convert request to numeric from formatted currency
- const request = document.querySelector('.active-editing > td.request');
- request.textContent = request.textContent.replace('$', '');
- // make it editable
- Table.Cell.createTextbox('request');
-}
-
-// update sidebar and also cost totals when the FTEs are edited
-function updateDisplayandTotals(){
- // initialize
- Sidebar.updateStat('baseline-nonpersonnel', 0);
- // calculate for each row
- let rows = document.getElementsByTagName('tr');
- for (let i = 1; i < rows.length; i++){
- // fetch values for calculations
- let request = Table.Cell.getValue(rows[i], 'request');
-
- // update counters
- Sidebar.incrementStat('baseline-nonpersonnel', request);
- }
-}
diff --git a/js/views/06_new_initiatives/helpers.js b/js/views/06_new_initiatives/helpers.js
deleted file mode 100644
index 5187d84..0000000
--- a/js/views/06_new_initiatives/helpers.js
+++ /dev/null
@@ -1,86 +0,0 @@
-
-import Prompt from '../../components/prompt/prompt.js'
-import Modal from '../../components/modal/modal.js'
-import Form from '../../components/form/form.js'
-import Table from '../../components/table/table.js'
-import Body from '../../components/body/body.js'
-import NavButtons from '../../components/nav_buttons/nav_buttons.js'
-import { pauseAndContinue } from '../view_logic.js'
-import Subtitle from '../../components/header/header.js'
-
-export function initializePageView() {
- // Prepare page view
- Body.reset();
- NavButtons.show();
-
- // Load text
- Subtitle.update('New Initiatives');
- Prompt.Text.update('Do you have any new initiatives for FY26?');
- Prompt.Buttons.Left.updateText('Yes');
- Prompt.Buttons.Right.updateText('No');
- // clicking 'no new initialitives' will also take us to the next page
- Prompt.Buttons.Right.addAction(pauseAndContinue);
- Prompt.Buttons.Left.addAction(NavButtons.Next.enable);
-}
-
-export function setUpModal() {
- // Initialize modal
- Modal.clear();
- Modal.Link.add('option1');
- Modal.Title.update('New initiative');
- Modal.Link.add('add-btn');
-}
-
-export function setUpForm() {
- // Set up form
- Form.new('modal-body');
- Form.NewField.shortText('Initiative Name:', 'Initiative Name', true);
- Form.NewField.longText('Explain why this initiative is necessary and describe its potential impact.', 'Explanation', true);
- Form.NewField.numericInput('Estimate of ADDITONAL revenue associated with this initiative?', 'Revenue', true);
- Form.NewField.numericInput('Estimate of ADDITONAL personnel cost?', 'Personnel Cost', true);
- Form.NewField.numericInput('Estimate of ADDITONAL nonpersonnel cost?', 'Non-personnel Cost', true);
- Form.SubmitButton.add();
- // Initialize form submission to table data
- handleFormSubmissions();
-}
-
-export function setUpTable() {
- // Set up table
- Table.clear();
- Table.adjustWidth('70%');
- Table.Buttons.AddRow.updateText('Add another new initiative');
-}
-
-export function handleFormSubmissions(event){
- // initialize form submission
- const modal = document.getElementById('main-modal');
- modal.addEventListener('submit', function(event) {
- event.preventDefault();
- // get answers from form, hide form, show answers in table
- const responses = Form.fetchAllResponses(event);
- // make sure it's not an empty response
- if (Object.values(responses)[0] != ''){
- // change page view
- Modal.hide();
- Prompt.hide();
-
- // add data to table
- Table.Rows.add(responses);
- Table.show();
- Table.Buttons.AddRow.show();
- // TODO: save table data
- // TODO: edit cost to show currency correctly
- }
-
- })
-}
-
-export function removeModalLinks(){
- Modal.Link.remove('option1');
- Modal.Link.remove('add-btn');
-}
-
-export function removePromptButtonListeners(){
- Prompt.Buttons.Right.removeAction(pauseAndContinue);
- Prompt.Buttons.Left.removeAction(NavButtons.Next.enable);
-}
\ No newline at end of file
diff --git a/js/views/07_summary/main.js b/js/views/07_summary/main.js
deleted file mode 100644
index 0e4fbc4..0000000
--- a/js/views/07_summary/main.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import { updatePageState } from "../../utils/data_utils/local_storage_handlers.js";
-import Prompt from '../../components/prompt/prompt.js'
-import { initializeWelcomePage } from "../00_welcome/main.js";
-import Body from "../../components/body/body.js";
-import Subtitle from "../../components/header/header.js";
-import { visitPage } from "../view_logic.js";
-
-export function loadSummaryPage(){
- //update page state
- updatePageState('summary');
-
- // prepare page view
- Body.reset();
- Prompt.Buttons.Left.updateText('Download Excel');
- Prompt.Buttons.Right.updateText('Go back and edit');
-
- // update page text
- Subtitle.update('Summary');
- // TODO: update to make dynamic
- Prompt.Text.update(`Placeholder for summary and any issues.`);
- Prompt.Buttons.Right.addAction(returnToWelcome);
-}
-
-export function cleanUpSummaryPage(){
- Prompt.Buttons.Right.removeAction(returnToWelcome);
-}
-
-const returnToWelcome = () => {visitPage('welcome')}
\ No newline at end of file
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..304745a
--- /dev/null
+++ b/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "budget-request-form",
+ "description": "The City of Detroit's budget request form for Office of the Chief Financial Officer.",
+ "scripts": {
+ "build": "webpack --mode production",
+ "start": "webpack-dev-server --mode development"
+ },
+ "license": "MIT",
+ "dependencies": {},
+ "devDependencies": {
+ "@babel/core": "^7.24.9",
+ "@babel/preset-env": "^7.24.8",
+ "babel-loader": "^9.1.3",
+ "css-loader": "^7.1.2",
+ "html-loader": "^5.0.0",
+ "html-webpack-plugin": "^5.6.0",
+ "mini-css-extract-plugin": "^2.9.0",
+ "optimize-css-assets-webpack-plugin": "^6.0.1",
+ "style-loader": "^4.0.0",
+ "webpack": "^5.93.0",
+ "webpack-cli": "^5.1.4",
+ "webpack-dev-server": "^5.0.4"
+ }
+}
diff --git a/sample_data/sample_detail_sheet.xlsx b/sample_data/sample_detail_sheet.xlsx
new file mode 100644
index 0000000..97f1c03
Binary files /dev/null and b/sample_data/sample_detail_sheet.xlsx differ
diff --git a/src/assets/city-of-detroit-logo.png b/src/assets/city-of-detroit-logo.png
new file mode 100644
index 0000000..856d278
Binary files /dev/null and b/src/assets/city-of-detroit-logo.png differ
diff --git a/css/common.css b/src/css/common.css
similarity index 97%
rename from css/common.css
rename to src/css/common.css
index f9506d3..b6e336a 100644
--- a/css/common.css
+++ b/src/css/common.css
@@ -5,6 +5,7 @@
--blue: #43748E;
--lightBlue: #b7c9e2;
--darkGray: #373A37;
+ --mediumGray: #D0D0D0;
--lightGray: #F2F2F2;
--white: #FBFDFB;
--black: #212121;
diff --git a/index.html b/src/index.html
similarity index 80%
rename from index.html
rename to src/index.html
index f722c93..c23ad87 100644
--- a/index.html
+++ b/src/index.html
@@ -6,29 +6,16 @@
Demo Budget Form
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
+
@@ -51,20 +38,29 @@
1. Upload your Excel data
+
+
+
+
+
+
@@ -91,10 +87,10 @@
diff --git a/src/js/components/accordion/accordion.css b/src/js/components/accordion/accordion.css
new file mode 100644
index 0000000..274385b
--- /dev/null
+++ b/src/js/components/accordion/accordion.css
@@ -0,0 +1,53 @@
+#summary-accordion {
+ width: 60%;
+ margin: auto
+}
+
+#accordion-baseline-title {
+ margin-left: 20%;
+ font-weight: bold;
+ padding-bottom: 10px;
+ padding-left: 15px;
+ padding-top: 30px;
+}
+
+.accordion-button:active, .accordion-button:not(.collapsed) {
+ background-color: var(--palegreen);
+ color: var(--citygreen);
+}
+
+.accordion-table {
+ width: 100%;
+ font-size: 1.25em;
+ /* border-collapse: separate; This is required for rounded corners */
+}
+
+.accordion-table td:last-child {
+ text-align: right;
+ padding-right: 15px;
+ padding-bottom: 5px
+}
+
+.accordion-table tr {
+ border-bottom: 1px solid black;
+ border-top: none;
+ border-right: none;
+ border-left: none;
+}
+
+.accordion-table tr:last-child {
+ border-bottom: none;
+ background-color: var(--mediumGray);
+ height : 50px;
+}
+
+span.amount {
+ font-weight: bold;
+ position: absolute;
+ right: 0;
+ margin-right: 60px;
+}
+
+.accordion-header button {
+ font-size: 0.8em;
+}
\ No newline at end of file
diff --git a/src/js/components/accordion/accordion.js b/src/js/components/accordion/accordion.js
new file mode 100644
index 0000000..7ec8ec5
--- /dev/null
+++ b/src/js/components/accordion/accordion.js
@@ -0,0 +1,99 @@
+import './accordion.css';
+
+import { Fund } from "../../utils/data_utils/local_storage_handlers.js";
+import { formatCurrency } from "../../utils/common_utils.js";
+import Table from "../table/table.js";
+import { FundLookupTable } from "../../utils/data_utils/budget_data_handlers.js";
+
+const FundTable = {
+ table_id : (fund) => { return `table-${fund}` },
+ init : function(fund) {
+ // create empty table and put it in the accordion
+ var table = document.createElement('table');
+ table.id = this.table_id(fund);
+ table.classList.add('accordion-table');
+ var parent = document.querySelector(`#fund_${fund}_content .accordion-body`);
+ parent.appendChild(table);
+ },
+ createNewCell : function(content, row) {
+ const newCell = document.createElement('td');
+ newCell.innerHTML = content;
+ row.appendChild(newCell);
+ },
+ addRow : function(fund, name, number){
+ var table = document.getElementById(this.table_id(fund));
+ var new_row = document.createElement('tr');
+ table.appendChild(new_row);
+ // Create a cell for the line item label
+ this.createNewCell(name, new_row);
+ // create a cell for the amount
+ this.createNewCell(formatCurrency(number), new_row);
+ // create Edit button
+ var button = '';
+ if (name != 'Total'){
+ button = Table.Buttons.Edit.html;
+ }
+ this.createNewCell(button, new_row);
+ },
+ fill : function(fund) {
+ this.init(fund);
+ const fundObject = new Fund(fund);
+ this.addRow(fund, 'Personnel Expenses', fundObject.getPersonnelCost());
+ this.addRow(fund, 'Non-Personnel Expenses', fundObject.getNonPersonnelCost());
+ this.addRow(fund, 'Revenue', fundObject.getRevenue());
+ this.addRow(fund, 'Net Expenses (Revenues)', fundObject.getTotal());
+ }
+}
+
+const Item = {
+ html : function(fund) {
+ var id = fund; // cleanString(fund);
+ return `
+ `
+ },
+ add : function(fund) {
+ // get accordion and add a new item to it
+ const parent = document.getElementById('summary-accordion');
+ const item_element = document.createElement('div');
+ item_element.classList.add('accordion-item');
+ item_element.innerHTML = this.html(fund);
+ parent.appendChild(item_element);
+ FundTable.fill(fund);
+ },
+ FundTable : FundTable,
+ updateHeader : function(fund, new_amount) {
+ const header_btn = document.querySelector(`#fund_${fund}_header button`);
+ header_btn.querySelector('span.name').textContent = FundLookupTable.getName(fund);
+ header_btn.querySelector('span.amount').textContent = formatCurrency(new_amount);
+ }
+}
+
+export const Accordion = {
+ Item : Item,
+ hide : function(){
+ document.getElementById('accordion-div').style.display = 'none';
+ // reset to delete content
+ document.getElementById('summary-accordion').innerHTML = '';
+ },
+ show : function(){
+ document.getElementById('accordion-div').style.display = 'block';
+ },
+ async createFromFunds(){
+ var funds = FundLookupTable.listFunds();
+
+ funds.forEach(fund => {
+ Item.add(fund);
+ const fundObject = new Fund(fund);
+ Item.updateHeader(fund, fundObject.getTotal());
+ });
+ }
+}
+
+export default Accordion;
diff --git a/js/components/body/body.css b/src/js/components/body/body.css
similarity index 100%
rename from js/components/body/body.css
rename to src/js/components/body/body.css
diff --git a/js/components/body/body.js b/src/js/components/body/body.js
similarity index 72%
rename from js/components/body/body.js
rename to src/js/components/body/body.js
index 5f1eced..83df631 100644
--- a/js/components/body/body.js
+++ b/src/js/components/body/body.js
@@ -1,4 +1,8 @@
+import './body.css';
+
import Welcome from '../../components/welcome/welcome.js'
+import { Accordion } from '../accordion/accordion.js';
+import { FileUpload } from '../file_upload/file_upload.js';
import Modal from '../modal/modal.js';
import NavButtons from '../nav_buttons/nav_buttons.js';
import Prompt from '../prompt/prompt.js';
@@ -14,9 +18,13 @@ function resetPage() {
Prompt.hide();
Table.hide();
Sidebar.hide();
+ Accordion.hide();
+ FileUpload.hide();
// disable next button
NavButtons.Next.disable();
Prompt.Buttons.reset();
+ // disable submit button
+ Modal.Submit.deinit();
}
export const Body = {
diff --git a/src/js/components/file_upload/file_upload.css b/src/js/components/file_upload/file_upload.css
new file mode 100644
index 0000000..c2e0a7e
--- /dev/null
+++ b/src/js/components/file_upload/file_upload.css
@@ -0,0 +1,3 @@
+#file-input {
+ margin-left: 40%;
+}
\ No newline at end of file
diff --git a/src/js/components/file_upload/file_upload.js b/src/js/components/file_upload/file_upload.js
new file mode 100644
index 0000000..ab5e238
--- /dev/null
+++ b/src/js/components/file_upload/file_upload.js
@@ -0,0 +1,34 @@
+import './file_upload.css';
+
+import { processWorkbook } from "../../utils/data_utils/XLSX_handlers.js";
+
+export const FileUpload = {
+ init : function() {
+ const inputObject = document.getElementById('file-input');
+ inputObject.addEventListener('change', function(event) {readXL(event) });
+ },
+ show : function(){
+ const inputObject = document.getElementById('file-input');
+ inputObject.style.display = '';
+ },
+ hide : function(){
+ const inputObject = document.getElementById('file-input');
+ inputObject.style.display = 'none';
+ }
+}
+
+function readXL(event) {
+ const file = event.target.files[0];
+
+ if (file) {
+ const reader = new FileReader();
+ reader.onload = function(e) {
+ const arrayBuffer = e.target.result;
+ processWorkbook(arrayBuffer);
+ };
+ reader.onerror = function(err) {
+ console.error('Error reading file:', err);
+ };
+ reader.readAsArrayBuffer(file); // Read the file as an ArrayBuffer
+ }
+}
\ No newline at end of file
diff --git a/js/components/form/form.css b/src/js/components/form/form.css
similarity index 100%
rename from js/components/form/form.css
rename to src/js/components/form/form.css
diff --git a/js/components/form/form.js b/src/js/components/form/form.js
similarity index 98%
rename from js/components/form/form.js
rename to src/js/components/form/form.js
index 083a20a..74b64eb 100644
--- a/js/components/form/form.js
+++ b/src/js/components/form/form.js
@@ -1,3 +1,5 @@
+import './form.css';
+
import Dropdown from "./subcomponents/dropdown.js";
import NewField from "./subcomponents/fields.js";
import SubmitButton from "./subcomponents/submit.js";
diff --git a/src/js/components/form/subcomponents/dropdown.js b/src/js/components/form/subcomponents/dropdown.js
new file mode 100644
index 0000000..c881624
--- /dev/null
+++ b/src/js/components/form/subcomponents/dropdown.js
@@ -0,0 +1,32 @@
+async function createDropdownFromJSON(json_path) {
+ // Fetch JSON data from a file asynchronously
+ const response = await fetch(json_path);
+ const dataArray = await response.json();
+ // create and return element
+ return createDropdown(dataArray);
+}
+
+function createDropdown(dataArray) {
+
+ // Creating a select element
+ const selectElement = document.createElement('select');
+
+ // Looping through the array and creating an option for each element
+ dataArray.forEach(item => {
+ const optionElement = document.createElement('option');
+ optionElement.value = item;
+ optionElement.textContent = item;
+ selectElement.appendChild(optionElement); // Appending the option to the select
+ });
+
+ // Return the select element so it can be appended to the document
+ return selectElement;
+}
+
+
+export const Dropdown = {
+ createFromJSON : function(json_path){ return createDropdownFromJSON(json_path) },
+ create : function(dataArray) { return createDropdown(dataArray) }
+}
+
+export default Dropdown;
\ No newline at end of file
diff --git a/js/components/form/subcomponents/fields.js b/src/js/components/form/subcomponents/fields.js
similarity index 100%
rename from js/components/form/subcomponents/fields.js
rename to src/js/components/form/subcomponents/fields.js
diff --git a/js/components/form/subcomponents/submit.js b/src/js/components/form/subcomponents/submit.js
similarity index 100%
rename from js/components/form/subcomponents/submit.js
rename to src/js/components/form/subcomponents/submit.js
diff --git a/js/components/header/header.css b/src/js/components/header/header.css
similarity index 100%
rename from js/components/header/header.css
rename to src/js/components/header/header.css
diff --git a/js/components/header/header.js b/src/js/components/header/header.js
similarity index 65%
rename from js/components/header/header.js
rename to src/js/components/header/header.js
index 825c48c..d3f7b71 100644
--- a/js/components/header/header.js
+++ b/src/js/components/header/header.js
@@ -1,7 +1,11 @@
+import './header.css';
+
+import { CurrentFund } from "../../utils/data_utils/local_storage_handlers.js";
+
export const Subtitle = {
update : function(subtitle){
// get current fund
- var fund = localStorage.getItem("fund");
+ var fund = CurrentFund.name();
if (fund){
var subtitle = `${subtitle}: ${fund}`;
}
diff --git a/js/components/modal/modal.css b/src/js/components/modal/modal.css
similarity index 100%
rename from js/components/modal/modal.css
rename to src/js/components/modal/modal.css
diff --git a/js/components/modal/modal.js b/src/js/components/modal/modal.js
similarity index 55%
rename from js/components/modal/modal.js
rename to src/js/components/modal/modal.js
index 75f5f5e..bc911db 100644
--- a/js/components/modal/modal.js
+++ b/src/js/components/modal/modal.js
@@ -1,3 +1,4 @@
+import './modal.css';
function clearModal(){
updateModalTitle('');
@@ -5,10 +6,6 @@ function clearModal(){
//removeAllModalLinks()
}
-// function removeAllModalLinks(){
-// TODO
-// }
-
function hideModal(modal_id) {
$('#' + modal_id).modal('hide');
}
@@ -21,6 +18,30 @@ function showModalHandler() {
showModal('main-modal');
}
+const Submit = {
+ handler: null,
+
+ init: function(onSubmit) {
+ const modal = document.getElementById('main-modal');
+ // add onSubmit function as handler
+ this.handler = function(event) {
+ event.preventDefault();
+ onSubmit(event);
+ };
+ // Adding the handler reference as the event listener
+ modal.addEventListener('submit', this.handler);
+ },
+
+ deinit: function() {
+ const modal = document.getElementById('main-modal');
+ if (this.handler !== null) {
+ // Removing the event listener and clear the handler
+ modal.removeEventListener('submit', this.handler);
+ this.handler = null;
+ }
+ }
+};
+
const Link = {
add : function(button_id){
document.getElementById(button_id).addEventListener('click', showModalHandler)
@@ -43,7 +64,8 @@ export const Modal = {
show : function() { showModal('main-modal') },
clear : clearModal,
Title : Title,
- Link : Link
+ Link : Link,
+ Submit: Submit
}
export default Modal;
\ No newline at end of file
diff --git a/js/components/nav_buttons/nav_buttons.css b/src/js/components/nav_buttons/nav_buttons.css
similarity index 100%
rename from js/components/nav_buttons/nav_buttons.css
rename to src/js/components/nav_buttons/nav_buttons.css
diff --git a/js/components/nav_buttons/nav_buttons.js b/src/js/components/nav_buttons/nav_buttons.js
similarity index 97%
rename from js/components/nav_buttons/nav_buttons.js
rename to src/js/components/nav_buttons/nav_buttons.js
index 1be8de5..e3c6e16 100644
--- a/js/components/nav_buttons/nav_buttons.js
+++ b/src/js/components/nav_buttons/nav_buttons.js
@@ -1,3 +1,5 @@
+import './nav_buttons.css';
+
import { nextPage, lastPage } from '../../views/view_logic.js'
function initializeNavButtons(){
diff --git a/js/components/prompt/prompt.css b/src/js/components/prompt/prompt.css
similarity index 92%
rename from js/components/prompt/prompt.css
rename to src/js/components/prompt/prompt.css
index 361de58..dc917c5 100644
--- a/js/components/prompt/prompt.css
+++ b/src/js/components/prompt/prompt.css
@@ -1,13 +1,13 @@
-#prompt-div {
+div#prompt-div {
display: none;
- text-align: center;
width: 80%;
margin: auto;
+ text-align: center;
}
h3#prompt {
text-align: center;
- font-size : 1.5em;
+ font-size : 1.2em;
}
#option1, #option2 {
diff --git a/js/components/prompt/prompt.js b/src/js/components/prompt/prompt.js
similarity index 93%
rename from js/components/prompt/prompt.js
rename to src/js/components/prompt/prompt.js
index 0f25585..576e454 100644
--- a/js/components/prompt/prompt.js
+++ b/src/js/components/prompt/prompt.js
@@ -1,3 +1,4 @@
+import './prompt.css';
import Text from "./subcomponents/text.js";
import Buttons from "./subcomponents/buttons.js";
diff --git a/js/components/prompt/subcomponents/buttons.js b/src/js/components/prompt/subcomponents/buttons.js
similarity index 100%
rename from js/components/prompt/subcomponents/buttons.js
rename to src/js/components/prompt/subcomponents/buttons.js
diff --git a/js/components/prompt/subcomponents/text.js b/src/js/components/prompt/subcomponents/text.js
similarity index 100%
rename from js/components/prompt/subcomponents/text.js
rename to src/js/components/prompt/subcomponents/text.js
diff --git a/js/components/sidebar/sidebar.css b/src/js/components/sidebar/sidebar.css
similarity index 93%
rename from js/components/sidebar/sidebar.css
rename to src/js/components/sidebar/sidebar.css
index b4aaca8..f25f9fe 100644
--- a/js/components/sidebar/sidebar.css
+++ b/src/js/components/sidebar/sidebar.css
@@ -22,7 +22,7 @@
padding: 20px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); /* Add shadow for some depth */
border-right: 2px solid #DDDDDD; /* Right border */
- border-radius: 15px 0px 0px 15px; /* Rounded corners on the left */
+ border-radius: 0px 0px 0px 15px; /* Rounded corners on the left */
/* margin-top: var(--header-height); */
width: var(--sidebar-width);
margin: 0px;
diff --git a/js/components/sidebar/sidebar.js b/src/js/components/sidebar/sidebar.js
similarity index 66%
rename from js/components/sidebar/sidebar.js
rename to src/js/components/sidebar/sidebar.js
index 0680695..cb4c96c 100644
--- a/js/components/sidebar/sidebar.js
+++ b/src/js/components/sidebar/sidebar.js
@@ -1,5 +1,8 @@
+import './sidebar.css';
+
import { formatCurrency } from "../../utils/common_utils.js";
import { TARGET } from "../../init.js";
+import { Baseline, Supplemental } from "../../utils/data_utils/local_storage_handlers.js";
// Assuming you have a CSS variable --main-color defined on the :root
const root = document.documentElement;
@@ -30,70 +33,72 @@ function showSidebar() {
window.addEventListener('resize', showSidebar);
}
-
function updateSidebarTitle(new_title){
document.getElementById('sidebar-title').textContent = new_title;
}
-function updateSidebarStat(stat_id, new_figure){
- replaceSidebarStat(stat_id, new_figure);
- // TODO: save in memory
- updateTotals();
-}
-
function replaceSidebarStat(stat_id, new_figure){
const span = document.querySelector(`#${stat_id} .stat`);
span.setAttribute('value', new_figure);
span.textContent = formatCurrency(new_figure);
}
-function incrementSidebarStat(stat_id, new_figure){
- updateSidebarStat(stat_id, fetchStat(stat_id) + new_figure)
-}
-
function fetchStat(stat_id){
const stat = document.querySelector(`#${stat_id} .stat`);
return parseFloat(stat.getAttribute('value')) || 0;
}
-// Function to update the display of the current and supp variables
-function updateTotals() {
- // update bottom lines
- let supp_total = -fetchStat('supp-revenue') +
- fetchStat('supp-personnel') +
- fetchStat('supp-nonpersonnel');
- let baseline_total = -fetchStat('baseline-revenue') +
- fetchStat('baseline-personnel') +
- fetchStat('baseline-nonpersonnel');
- replaceSidebarStat('supp-total', supp_total);
- replaceSidebarStat('baseline-total', baseline_total);
+
+function addTarget(target){
+ replaceSidebarStat('target', target);
+}
+
+// update all stats based on saved data
+async function updateBaseline(){
+ // gather info and update sidebar accordingly
+ var baseline = new Baseline();
+ replaceSidebarStat('baseline-revenue', baseline.revenue());
+ replaceSidebarStat('baseline-personnel', baseline.personnel());
+ replaceSidebarStat('baseline-nonpersonnel', baseline.nonpersonnel());
+ replaceSidebarStat('baseline-total', baseline.total());
// color code based on target
var target = fetchStat('target');
- if(baseline_total <= target){
+ if(baseline.total() <= target){
document.querySelector('#baseline-total .stat').style.color = "green";
}
- if(baseline_total > target){
+ if(baseline.total() > target){
document.querySelector('#baseline-total .stat').style.color = "red";
}
}
-function addTarget(target){
- replaceSidebarStat('target', target);
+function updateSupp(){
+ var supp = new Supplemental;
+ replaceSidebarStat('supp-revenue', supp.revenue());
+ replaceSidebarStat('supp-personnel', supp.personnel());
+ replaceSidebarStat('supp-nonpersonnel', supp.nonpersonnel());
+ replaceSidebarStat('supp-total', supp.total());
+}
+
+function updateTotals(){
+ updateBaseline();
+ updateSupp();
}
-function updateTitle(title){
- document.querySelector('#sidebar-title').textContent = title;
+function resetAll(){
+ // delete everything in local storage
+ localStorage.clear();
+ // reset all stats to 0
+ updateTotals();
}
const Sidebar = {
hide: hideSidebar,
show: showSidebar,
updateTitle: updateSidebarTitle,
- updateStat: updateSidebarStat,
- incrementStat: incrementSidebarStat,
addTarget: addTarget,
- updateTitle: updateTitle
+ updateTotals: updateTotals,
+ reset: resetAll
};
export default Sidebar;
\ No newline at end of file
diff --git a/js/components/table/subcomponents/buttons.js b/src/js/components/table/subcomponents/buttons.js
similarity index 100%
rename from js/components/table/subcomponents/buttons.js
rename to src/js/components/table/subcomponents/buttons.js
diff --git a/js/components/table/subcomponents/cells.js b/src/js/components/table/subcomponents/cells.js
similarity index 71%
rename from js/components/table/subcomponents/cells.js
rename to src/js/components/table/subcomponents/cells.js
index 82d6404..fe061d7 100644
--- a/js/components/table/subcomponents/cells.js
+++ b/src/js/components/table/subcomponents/cells.js
@@ -1,4 +1,5 @@
-import { formatCurrency } from "../../../utils/common_utils.js";
+import { formatCurrency, displayWithCommas } from "../../../utils/common_utils.js";
+import { Services } from "../../../utils/data_utils/budget_data_handlers.js";
import Dropdown from "../../form/subcomponents/dropdown.js";
// return cell value attribute or 0 if it does not exist
@@ -20,23 +21,29 @@ function updateTableCell(row, col_class, new_value){
cell.textContent = formatCurrency(new_value);
}
-function createEditableCell(cellClass){
+function createEditableCell(cellClass, isCost){
// get cell
const cell = document.querySelector(`.active-editing td.${cellClass}`);
// Create an input element to edit the value
var textbox = document.createElement('input');
textbox.type = 'text';
- textbox.value = cell.textContent;
+ if (isCost){
+ var value = cell.getAttribute('value');
+ } else {
+ var value = cell.textContent;
+ }
+ textbox.value = displayWithCommas(value);
// Clear the current content and append the textbox to the cell
cell.innerHTML = '';
cell.appendChild(textbox);
}
-async function createSelectCell(cellClass, json_filepath){
+function createServiceDropdown(){
// get cell
+ var cellClass = 'service';
const cell = document.querySelector(`.active-editing td.${cellClass}`);
// add service dropdown
- const serviceDropdown = await Dropdown.createFromJSON(json_filepath);
+ const serviceDropdown = Dropdown.create(Services.list());
serviceDropdown.value = cell.textContent;
// Clear the current content and append the textbox to the cell
cell.innerHTML = '';
@@ -53,12 +60,10 @@ const Cell = {
updateValue: function(row, col_class, new_value) {
updateTableCell(row, col_class, new_value);
},
- createTextbox : function(className) {
- createEditableCell(className)
- },
- createDropdown : function(className, json_filepath){
- createSelectCell(className, json_filepath);
+ createTextbox : function(className, isCost) {
+ createEditableCell(className, isCost)
},
+ createServiceDropdown : createServiceDropdown
};
export default Cell;
\ No newline at end of file
diff --git a/js/components/table/subcomponents/columns.js b/src/js/components/table/subcomponents/columns.js
similarity index 63%
rename from js/components/table/subcomponents/columns.js
rename to src/js/components/table/subcomponents/columns.js
index 02faf57..c7746f7 100644
--- a/js/components/table/subcomponents/columns.js
+++ b/src/js/components/table/subcomponents/columns.js
@@ -90,7 +90,8 @@ function addCostClass(headerName){
cells.forEach(cell => {
// Get the current text content of the cell and assign it to 'value' attribute
if (!cell.getAttribute('value')){
- const cellValue = cell.textContent.trim();
+ const cellText = cell.textContent.trim();
+ const cellValue = isNaN(cellText) || cellText === '' ? 0 : parseFloat(cellText);
cell.setAttribute('value', cellValue);
// Now format the text content like currency and replace it in the cell
@@ -103,15 +104,76 @@ function addCostClass(headerName){
}
function assignColumnClasses(columnDefinitions) {
- columnDefinitions.forEach(column => {
- // Assign class to column
- assignClassToColumn(column.title, column.className);
+ columnDefinitions.forEach(column => {
+ // Assign class to column
+ assignClassToColumn(column.title, column.className);
- // If the column is a cost column, add the specific cost class
- if (column.isCost) {
- addCostClass(column.title);
+ // If the column is a cost column, add the specific cost class
+ if (column.isCost) {
+ addCostClass(column.title);
+ }
+
+ // show the column
+ showColumnByTitle(column.title);
+ });
+}
+
+function hideColumn(index) {
+ var table = document.getElementById('main-table');
+ var rows = table.rows;
+
+ for (var i = 0; i < rows.length; i++) {
+ var cells = rows[i].cells;
+ if (cells.length > index) {
+ cells[index].style.display = 'none';
+ }
+ }
+}
+
+// Function to show a specific column
+function showColumn(index) {
+ var table = document.getElementById('main-table');
+ var rows = table.rows;
+
+ for (var i = 0; i < rows.length; i++) {
+ var cells = rows[i].cells;
+ if (cells.length > index) {
+ cells[index].style.display = 'table-cell';
+ }
+ }
+}
+
+// Function to get the column index by title
+function getColumnIndexByTitle(table, title) {
+ var headers = table.querySelectorAll('th');
+ for (var i = 0; i < headers.length; i++) {
+ if (headers[i].innerText === title) {
+ return i;
}
- });
+ }
+ return -1; // Column not found
+}
+
+// Function to hide a column by title
+function hideColumnByTitle(title) {
+ var table = document.getElementById('main-table');
+ var index = getColumnIndexByTitle(table, title);
+ if (index !== -1) {
+ hideColumn(index);
+ } else {
+ console.log(`Column with title "${title}" not found.`);
+ }
+}
+
+// Function to show a column by title
+function showColumnByTitle(title) {
+ var table = document.getElementById('main-table');
+ var index = getColumnIndexByTitle(table, title);
+ if (index !== -1) {
+ showColumn(index);
+ } else {
+ console.log(`Column with title "${title}" not found.`);
+ }
}
@@ -124,6 +186,12 @@ const Column = {
},
assignClasses: function(column_definitions) {
return assignColumnClasses(column_definitions);
+ },
+ hide : function(colName) {
+ hideColumnByTitle(colName);
+ },
+ show : function(colName) {
+ showColumnByTitle(colName);
}
};
diff --git a/src/js/components/table/subcomponents/data.js b/src/js/components/table/subcomponents/data.js
new file mode 100644
index 0000000..9342721
--- /dev/null
+++ b/src/js/components/table/subcomponents/data.js
@@ -0,0 +1,133 @@
+import { FundLookupTable } from "../../../utils/data_utils/budget_data_handlers.js";
+import { CurrentFund, CurrentPage, loadTableData, saveTableData } from "../../../utils/data_utils/local_storage_handlers.js";
+
+function fillTable(data) {
+ try {
+ const table = document.getElementById('main-table');
+ const thead = table.querySelector('thead');
+ const tbody = table.querySelector('tbody');
+
+ // clear existing data
+ thead.innerHTML = '';
+ tbody.innerHTML = '';
+
+ // Create table header row
+ const headerRow = document.createElement('tr');
+ Object.keys(data[0]).forEach(key => {
+ const header = document.createElement('th');
+ header.textContent = key;
+ headerRow.appendChild(header);
+ });
+ thead.appendChild(headerRow);
+
+ // Create table body rows
+ data.forEach(item => {
+ const row = document.createElement('tr');
+ Object.values(item).forEach(val => {
+ const cell = document.createElement('td');
+ cell.textContent = val;
+ row.appendChild(cell);
+ });
+ tbody.appendChild(row);
+ });
+ } catch(error) {
+ console.error('No table saved in localStorage:', error);
+ }
+ saveTableData();
+}
+
+async function loadFromStorage(){
+ // look up table in storage and pass to table load function\
+ if (CurrentFund.number()){
+ var key = `${CurrentPage.load()}_${CurrentFund.number()}`;
+ } else {
+ var key = CurrentPage.load();
+ }
+ const data = await loadTableData(key);
+ if (!data){
+ // if no table in storage, return 0
+ return 0;
+ } else {
+ fillTable(data);
+ return 1;
+ }
+}
+
+
+function loadFunds(){
+ // get list of funds from storage
+ const fundDict = FundLookupTable.retrieve();
+ // build out data in correct format
+ const resultArray = [];
+ for (const key in fundDict) {
+ if (fundDict.hasOwnProperty(key)) {
+ resultArray.push({
+ Fund: fundDict[key] // Use the value directly
+ });
+ }
+ }
+ fillTable(resultArray);
+}
+
+
+function getColumnIndexByClass(tbody, className) {
+ const firstRow = tbody.rows[0];
+ if (!firstRow) return -1; // Return -1 if there's no row to examine
+ for (let cellIndex = 0; cellIndex < firstRow.cells.length; cellIndex++) {
+ if (firstRow.cells[cellIndex].classList.contains(className)) {
+ return cellIndex;
+ }
+ }
+ return -1; // Return -1 if class name not found
+}
+
+function sort(primaryClass, secondaryClass) {
+ const table = document.getElementById('main-table');
+ const tbody = table.tBodies[0];
+ const rows = Array.from(tbody.rows);
+
+ // Get the column indices by class name
+ const primaryColIndex = getColumnIndexByClass(tbody, primaryClass);
+ const secondaryColIndex = getColumnIndexByClass(tbody, secondaryClass);
+
+ // exit if classes don't exist
+ if (primaryColIndex === -1 ) {
+ console.error(`Column class ${classA} not found in table`);
+ return;
+ } else if (secondaryColIndex === -1) {
+ console.error(`Column class ${classB} not found in table`);
+ return;
+ }
+
+ // Sort the rows based on the text content of the cells
+ rows.sort((rowA, rowB) => {
+ // Primary column comparison
+ const primaryA = unformatCurrency(rowA.cells[primaryColIndex].textContent);
+ const primaryB = unformatCurrency(rowB.cells[primaryColIndex].textContent);
+
+ if (primaryA < primaryB) return -1;
+ if (primaryA > primaryB) return 1;
+
+ // Secondary column comparison (if primary is equal)
+ const secondaryA = unformatCurrency(rowA.cells[secondaryColIndex].textContent);
+ const secondaryB = unformatCurrency(rowB.cells[secondaryColIndex].textContent);
+
+ if (secondaryA < secondaryB) return -1;
+ if (secondaryA > secondaryB) return 1;
+
+ // If both columns are equal
+ return 0;
+ });
+
+ // Reattach sorted rows to the table body
+ rows.forEach((row) => tbody.appendChild(row));
+}
+
+
+export const Data = {
+ load : loadFromStorage,
+ loadFunds : loadFunds,
+ sort : function(colA, colB) { sort(colA, colB) }
+}
+
+export default Data;
\ No newline at end of file
diff --git a/js/components/table/subcomponents/headers.js b/src/js/components/table/subcomponents/headers.js
similarity index 100%
rename from js/components/table/subcomponents/headers.js
rename to src/js/components/table/subcomponents/headers.js
diff --git a/js/components/table/subcomponents/rows.js b/src/js/components/table/subcomponents/rows.js
similarity index 96%
rename from js/components/table/subcomponents/rows.js
rename to src/js/components/table/subcomponents/rows.js
index 32d3870..b94861b 100644
--- a/js/components/table/subcomponents/rows.js
+++ b/src/js/components/table/subcomponents/rows.js
@@ -1,7 +1,7 @@
import Header from "./headers.js";
import { formatCurrency } from "../../../utils/common_utils.js";
-function addNewRow(data_dictionary){
+async function addNewRow(data_dictionary){
// Get the table element by its ID
const table = document.getElementById('main-table');
@@ -22,8 +22,6 @@ function addNewRow(data_dictionary){
new_row.appendChild(newCell);
}
- console.log(new_row);
-
// Append the new row to the table body
let tbody = table.querySelector('tbody');
tbody.appendChild(new_row);
diff --git a/js/components/table/table.css b/src/js/components/table/table.css
similarity index 63%
rename from js/components/table/table.css
rename to src/js/components/table/table.css
index 08b4992..a8c20ad 100644
--- a/js/components/table/table.css
+++ b/src/js/components/table/table.css
@@ -1,5 +1,13 @@
-thead > tr > th {
+#main-table {
+ font-size: calc(0.6vw + 0.5em);
+ margin: auto;
+ /* width: 100%; */
+}
+
+#main-table thead > tr > th {
text-align: left;
+ background-color: var(--darkGray);
+ color: white;
}
th {
@@ -15,27 +23,37 @@ tr td {
border-bottom: 1px solid black;
}
+/* Default to hidden columns */
+
+#main-table tbody > tr > td {
+ display : none;
+}
+#main-table thead > tr > th {
+ display : none;
+}
+
/* textbox width in table */
input {
width: 100%;
}
+select {
+ max-width: 100px;
+}
+
div.table-container {
- display: table;
- overflow-x: auto; /* Scroll horizontally if the table content is wider than the container */
+ overflow-x: auto;
overflow-y: auto;
- padding-left: max(100px, 10vh);
- padding-right: max(100px, 10vh);
- max-width: calc(100vw - var(--sidebar-width));
- margin: auto;
- min-height: 120px;
+ margin-left: max(65px, 7vh);
+ margin-right: max(65px, 7vh);
+ /* max-width: calc(100vw - var(--sidebar-width)); */
+ /* margin: auto; */
+ max-height: max(350px, 6vh);
+ /* min-height: 350px; */
}
-#main-table {
- font-size: calc(0.6vw + 0.5em);
- margin: auto;
-}
+/* Buttons */
/* Add new row button */
.btn-add {
@@ -77,5 +95,5 @@ div.table-container {
.hover-effect:hover {
cursor: pointer;
- background-color: var(--verypalegreen); /* You can choose any color you like */
+ background-color: var(--verypalegreen);
}
\ No newline at end of file
diff --git a/js/components/table/table.js b/src/js/components/table/table.js
similarity index 88%
rename from js/components/table/table.js
rename to src/js/components/table/table.js
index 4e3a8b7..e9f42f8 100644
--- a/js/components/table/table.js
+++ b/src/js/components/table/table.js
@@ -1,9 +1,12 @@
+import './table.css';
+
import Buttons from './subcomponents/buttons.js'
import Cell from './subcomponents/cells.js'
import Columns from './subcomponents/columns.js'
import Header from './subcomponents/headers.js'
import Rows from './subcomponents/rows.js'
import Data from './subcomponents/data.js'
+import { saveTableData } from '../../utils/data_utils/local_storage_handlers.js'
function adjustTableWidth(width_pct){
const table = document.getElementById('main-table');
@@ -40,7 +43,8 @@ const Table = {
},
clear : clearTable,
hide : hideTable,
- show : showTable
+ show : showTable,
+ save : saveTableData
}
export default Table;
\ No newline at end of file
diff --git a/js/components/welcome/welcome.css b/src/js/components/welcome/welcome.css
similarity index 100%
rename from js/components/welcome/welcome.css
rename to src/js/components/welcome/welcome.css
diff --git a/js/components/welcome/welcome.js b/src/js/components/welcome/welcome.js
similarity index 93%
rename from js/components/welcome/welcome.js
rename to src/js/components/welcome/welcome.js
index e1a65d3..d6e3749 100644
--- a/js/components/welcome/welcome.js
+++ b/src/js/components/welcome/welcome.js
@@ -1,3 +1,5 @@
+import './welcome.css';
+
// Hide and unhide welcome buttons
function unhideWelcomeButtons(){
document.getElementById("welcome-page").style.display = "block";
diff --git a/src/js/init.js b/src/js/init.js
new file mode 100644
index 0000000..5bc282c
--- /dev/null
+++ b/src/js/init.js
@@ -0,0 +1,33 @@
+// import styles
+import '../css/common.css';
+
+// import functions
+import { CurrentPage } from './utils/data_utils/local_storage_handlers.js';
+
+// path for my laptop
+export let DATA_ROOT = '../../../data/law_dept_sample/'
+// github path
+// export let DATA_ROOT = '../../budget-request-demo/data/law_dept_sample/'
+
+export let REVENUE = 0;
+export let TARGET = 14000000;
+export var FISCAL_YEAR = '26';
+export var OT_FRINGE = 0.0765;
+
+// variables on the salary
+export var fringe = 0.36
+export var cola = 0.02
+export var merit = 0.02
+
+// sheets to expect on detail sheet
+export const SHEETS = {
+ 'FTE, Salary-Wage, & Benefits' : 'personnel' ,
+ 'Overtime & Other Personnel' : 'overtime',
+ 'Non-Personnel Operating' : 'nonpersonnel',
+ 'Revenue' : 'revenue'
+}
+
+document.addEventListener('DOMContentLoaded', function () {
+ CurrentPage.visit();
+});
+
diff --git a/js/utils/archive/archived_fns.js b/src/js/utils/archive/archived_fns.js
similarity index 100%
rename from js/utils/archive/archived_fns.js
rename to src/js/utils/archive/archived_fns.js
diff --git a/js/utils/common_utils.js b/src/js/utils/common_utils.js
similarity index 76%
rename from js/utils/common_utils.js
rename to src/js/utils/common_utils.js
index 7c5452e..17e13a4 100644
--- a/js/utils/common_utils.js
+++ b/src/js/utils/common_utils.js
@@ -19,10 +19,16 @@ export const formatCurrency = (amount, return_zero = false) => {
export const unformatCurrency = (formattedAmount) => {
// Remove any currency symbols and commas
let numericalPart = formattedAmount.replace(/[^0-9.-]+/g, "");
+ if (numericalPart == '-'){
+ return 0;
+ }
return parseFloat(numericalPart);
};
export function displayWithCommas(value) {
+ if (value == 0){
+ return 0;
+ }
return formatCurrency(value).replace('$', '');
}
@@ -32,4 +38,13 @@ function delay(ms) {
export async function pauseExecution(seconds) {
await delay(seconds * 1000); // convert to milliseconds
+}
+
+export function cleanString(str){
+ return str.toLowerCase().replaceAll(' ', '-');
+}
+
+export function removeNewLines(str){
+ // TODO: ensure there is a space between words on new lines
+ return str.replaceAll(/[\r\n]+/g, "");
}
\ No newline at end of file
diff --git a/src/js/utils/data_utils/JSON_data_handlers.js b/src/js/utils/data_utils/JSON_data_handlers.js
new file mode 100644
index 0000000..f488001
--- /dev/null
+++ b/src/js/utils/data_utils/JSON_data_handlers.js
@@ -0,0 +1,42 @@
+export async function fetchJSON(jsonFilePath) {
+ return fetch(jsonFilePath)
+ .then(response => {
+ if (!response.ok) {
+ throw new Error('Network response was not ok');
+ }
+ return response.json();
+ });
+}
+
+export function convertToJSON(table, colsToRemove = []){
+ const rows = table.rows;
+ // Extract headers from the first row
+ const headerRow = rows[0].cells;
+ const headers = [];
+ for (let j = 0; j < headerRow.length; j++) {
+ headers.push(headerRow[j].innerText);
+ }
+
+ // initialize data
+ var tableData = [];
+
+ for (var i = 1; i < rows.length; i++) {
+ const cols = rows[i].cells;
+ const rowData = {};
+ headers.forEach((header, index) => {
+ if (colsToRemove.includes(header)){
+ return;
+ }
+ else if (cols[index].classList.contains('cost')) {
+ rowData[header] = cols[index].getAttribute('value');
+ } else {
+ rowData[header] = cols[index].innerText;
+ }
+ });
+ tableData.push(rowData);
+ }
+ return JSON.stringify(tableData);
+}
+
+
+
\ No newline at end of file
diff --git a/src/js/utils/data_utils/XLSX_handlers.js b/src/js/utils/data_utils/XLSX_handlers.js
new file mode 100644
index 0000000..1bb8dae
--- /dev/null
+++ b/src/js/utils/data_utils/XLSX_handlers.js
@@ -0,0 +1,156 @@
+
+
+import { SHEETS } from '../../init.js';
+import { FundLookupTable, Services } from './budget_data_handlers.js';
+import { removeNewLines } from '../common_utils.js';
+import { Baseline } from './local_storage_handlers.js';
+
+function deleteTopRowsUntilFullData(data) {
+ // function to try to find the top of the usable data
+ let fullDataRowFound = false;
+
+ while (!fullDataRowFound && data.length > 0) {
+ const row = data[0]; // Get the top row
+ let hasAllData = true;
+
+ for (const cell of row) {
+ if (cell == null || cell === '') {
+ hasAllData = false;
+ break;
+ }
+ }
+
+ if (hasAllData && row.length > 1) {
+ fullDataRowFound = true;
+ } else {
+ // delete the top row if it's not the header row
+ data.shift();
+ }
+ }
+
+ return data;
+}
+
+export function processWorkbook(arrayBuffer) {
+ const workbook = XLSX.read(arrayBuffer, { type: 'array' });
+ workbook.SheetNames.forEach(sheetName => {
+ // only convert sheets we need
+ if (Object.keys(SHEETS).includes(sheetName)) {
+ // read in sheets
+ const sheet = workbook.Sheets[sheetName];
+ const rawData = XLSX.utils.sheet_to_json(sheet, { header: 1, defval: '' });
+
+ // Clean the data by removing top rows with incomplete data
+ const dataRows = deleteTopRowsUntilFullData(rawData);
+
+ // get new headers
+ const headers = dataRows[0];
+
+ // isolate Fund column to split data
+ const fundIndex = headers.indexOf('Fund');
+ if (fundIndex === -1) {
+ console.error(`No 'Fund' column found in sheet ${sheetName}`);
+ return;
+ }
+
+ // Save a dictionary of data for each fund for each sheet
+ const fundData = {};
+
+ dataRows.forEach(row => {
+ const fund = row[fundIndex];
+ if(fund && fund != "Fund"){
+ if (!fundData[fund]) {
+ fundData[fund] = [];
+ }
+ const rowData = {};
+ headers.forEach((header, index) => {
+ rowData[removeNewLines(header)] = row[index];
+ });
+ fundData[fund].push(rowData);
+ }
+ });
+
+ // save fund number and name as we go along
+ FundLookupTable.update(fundData);
+
+ Object.keys(fundData).forEach(fund => {
+ const key = `${SHEETS[sheetName]}_${fund}`;
+ localStorage.setItem(key, JSON.stringify(fundData[fund]));
+ });
+ }
+
+ // But also save the possible services
+ else if (sheetName == 'Drop-Downs'){
+ const sheet = workbook.Sheets[sheetName];
+ // Convert the sheet to JSON to easily manipulate data
+ const sheetData = XLSX.utils.sheet_to_json(sheet, { header: 1 });
+
+ // Locate the "services" column header in row 0
+ const headerRow = sheetData[0];
+ const servicesIndex = headerRow.indexOf('Services');
+
+ if (servicesIndex === -1) {
+ console.error('Header "Services" not found');
+ } else {
+ // Extract data from the "services" column (excluding the header row)
+ const servicesColumn = sheetData.slice(1).map(row => row[servicesIndex]);
+ const cleanedServicesColumn = servicesColumn.filter(value => value != null);
+ // save the data
+ Services.save(cleanedServicesColumn);
+ }
+ }
+ });
+
+ console.log('all excel data saved');
+}
+
+// Utility function to append a sheet to the workbook if data is present
+function appendSheetToWorkbook(workbook, data, sheetName) {
+ if (data.length > 0) {
+ const sheet = XLSX.utils.json_to_sheet(data);
+ XLSX.utils.book_append_sheet(workbook, sheet, sheetName);
+ }
+}
+
+export function downloadXLSX() {
+ const baseline = new Baseline();
+ const workbook = XLSX.utils.book_new(); // Create a new workbook
+
+ const dataMap = {
+ Personnel: 'personnel',
+ Overtime: 'overtime',
+ NonPersonnel: 'nonpersonnel',
+ Revenue: 'revenue'
+ };
+
+ const sheetData = {
+ Personnel: [],
+ Overtime: [],
+ NonPersonnel: [],
+ Revenue: []
+ };
+
+ baseline.funds.forEach(fund => {
+ Object.keys(dataMap).forEach(sheetName => {
+ if (fund[dataMap[sheetName]] && fund[dataMap[sheetName]].table) {
+ sheetData[sheetName].push(...fund[dataMap[sheetName]].table);
+ }
+ });
+ });
+
+ Object.keys(sheetData).forEach(sheetName => {
+ appendSheetToWorkbook(workbook, sheetData[sheetName], sheetName);
+ });
+
+ // Generate a downloadable file
+ const wbout = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
+ const blob = new Blob([wbout], { type: 'application/octet-stream' });
+
+ // Create a link and trigger the download
+ const link = document.createElement("a");
+ link.href = URL.createObjectURL(blob);
+ link.download = "baseline_data.xlsx";
+ document.body.appendChild(link);
+ link.click();
+ document.body.removeChild(link);
+}
\ No newline at end of file
diff --git a/src/js/utils/data_utils/budget_data_handlers.js b/src/js/utils/data_utils/budget_data_handlers.js
new file mode 100644
index 0000000..598af9e
--- /dev/null
+++ b/src/js/utils/data_utils/budget_data_handlers.js
@@ -0,0 +1,42 @@
+export const FundLookupTable = {
+ retrieve : function() {
+ return JSON.parse(localStorage.getItem('fund-lookup-table')) || {};
+ },
+ save : function(fundDict){
+ localStorage.setItem('fund-lookup-table', JSON.stringify(fundDict));
+ },
+ update : function(fundData){
+ const table = this.retrieve();
+ for (let fund of Object.keys(fundData)){
+ // fund = toString(fund);
+ // add to lookup table if not in there already
+ if (!table[fund]){
+ // get fund name
+ const fundName = fundData[fund][0]['Fund Name'];
+ // add fund to dictionary
+ table[fund] = fundName;
+ }
+ }
+ // save any updates
+ this.save(table);
+ },
+ reset : function() {
+ this.save({});
+ },
+ getName : function(number){
+ return this.retrieve()[number];
+ },
+ listFunds : function(){
+ return Object.keys(this.retrieve());
+ }
+}
+
+// data structure to save the possible service options for the department
+export const Services = {
+ save : function(services){
+ localStorage.setItem('services-list', JSON.stringify(services));
+ },
+ list : function(){
+ return JSON.parse(localStorage.getItem('services-list')) || {};
+ }
+}
\ No newline at end of file
diff --git a/src/js/utils/data_utils/local_storage_handlers.js b/src/js/utils/data_utils/local_storage_handlers.js
new file mode 100644
index 0000000..83af012
--- /dev/null
+++ b/src/js/utils/data_utils/local_storage_handlers.js
@@ -0,0 +1,210 @@
+import { FISCAL_YEAR, DATA_ROOT } from "../../init.js";
+import Sidebar from "../../components/sidebar/sidebar.js";
+import { PAGES, visitPage } from "../../views/view_logic.js";
+import { fetchJSON } from "./JSON_data_handlers.js";
+import { FundLookupTable } from "./budget_data_handlers.js";
+import { convertToJSON } from "./JSON_data_handlers.js";
+
+export const CurrentPage = {
+ update : function(page){
+ localStorage.setItem('page_state', page);
+ },
+ load : function(){
+ const pageState = localStorage.getItem('page_state');
+ return pageState !== null ? pageState : 'welcome';
+ },
+ visit : function(){
+ visitPage(this.load());
+ }
+}
+
+export const CurrentFund = {
+ update : function(fund){
+ localStorage.setItem('fund', fund);
+ },
+ number : function(){
+ return localStorage.getItem("fund");
+ },
+ name : function(){
+ return FundLookupTable.getName( this.number());
+ },
+ reset : function() {
+ this.update('');
+ }
+}
+
+// TODO: consider moving this into a const for Current Table (or to the table component)
+export function saveTableData() {
+ var table = document.getElementById('main-table');
+ if (CurrentFund.number()) {
+ var save_as = `${CurrentPage.load()}_${CurrentFund.number()}`;
+ } else {
+ var save_as = CurrentPage.load();
+ }
+ localStorage.setItem(save_as, convertToJSON(table, ['Edit']));
+ Sidebar.updateTotals();
+}
+
+function deleteTable(name){
+ localStorage.setItem(name, '');
+}
+
+export async function deleteAllTables(){
+ var funds = await fetchJSON(DATA_ROOT + 'funds.json');
+ funds = funds.map((item) => { return item.Name });
+ for (const page in PAGES){
+ for(const i in funds){
+ deleteTable(`${page}_${funds[i]}`);
+ }
+ }
+ deleteTable('new-inits');
+}
+
+export function loadTableData(name){
+ const data = localStorage.getItem(name);
+ if ( data == '' ) {
+ return '';
+ }
+ return JSON.parse(data);
+}
+
+// Class to hold information on a specific fund and table
+class StoredTable {
+ constructor(page, fund){
+ this.name = `${page}_${fund}`;
+ this.page = page;
+ this.table = loadTableData(this.name);
+ }
+
+ totalCol() {
+ switch(this.page){
+ case 'personnel':
+ return 'Total Cost';
+ case 'overtime':
+ return 'Total Cost (including benefits)';
+ case 'nonpersonnel':
+ return `FY${FISCAL_YEAR} Request`;
+ case 'revenue':
+ break;
+ default:
+ break;
+ }
+ }
+ getSum() {
+ // fill with zero until there is something saved in storage
+ return colSum(this.table, this.totalCol(), this.name);
+ }
+
+}
+
+function colSum(table, colName, name) {
+ // fill with zero until there is something saved in storage
+ if(!table || table == ''){
+ return 0;
+ }
+ const headers = Object.keys(table[0]);
+ if (headers.includes(colName)) {
+ let sum = 0;
+ for (let i = 0; i < table.length; i++){
+ sum += Math.round(parseFloat(table[i][colName]));
+ }
+ return sum;
+ } else {
+ // console.error(`Could not find expected total column in saved data for ${name}. Returning 0. See StoredTable.totalCol() switch.`);
+ return 0;
+ }
+
+}
+
+// Holds all the detailed data for one fund's budget
+export class Fund {
+ constructor(fund){
+ this.fund = fund;
+ this.personnel = new StoredTable('personnel', fund);
+ this.overtime = new StoredTable('overtime', fund);
+ this.nonpersonnel = new StoredTable('nonpersonnel', fund);
+ this.revenue = new StoredTable('revenue', fund);
+ }
+
+ getPersonnelCost() {
+ return this.personnel.getSum() + this.overtime.getSum();
+ }
+
+ getNonPersonnelCost() {
+ return this.nonpersonnel.getSum();
+ }
+
+ getRevenue() {
+ return this.revenue.getSum();
+ }
+
+ getTotal() {
+ return this.getNonPersonnelCost() + this.getPersonnelCost() - this.getRevenue()
+ }
+}
+
+export class Baseline {
+ // baseline will just contain a list of funds
+ constructor() {
+ const allFunds = FundLookupTable.listFunds();
+ this.funds = [];
+ allFunds.forEach((fund) => {
+ this.funds.push(new Fund(fund));
+ });
+ }
+
+ personnel() {
+ let total = 0;
+ this.funds.forEach(fund => {
+ total += fund.getPersonnelCost();
+ });
+ return total;
+ }
+
+ nonpersonnel() {
+ let total = 0;
+ this.funds.forEach(fund => {
+ total += fund.getNonPersonnelCost();
+ });
+ return total;
+ }
+
+ revenue() {
+ let total = 0;
+ this.funds.forEach(fund => {
+ total += fund.getRevenue();
+ });
+ return total;
+ }
+
+ total() {
+ return this.nonpersonnel() + this.personnel() - this.revenue();
+ }
+}
+
+export class Supplemental {
+ constructor() {
+ this.table = loadTableData('new-inits');
+ }
+
+ getInits() {
+ return this.table.map((item) => { return item['Initiative Name'] });
+ }
+
+ personnel() {
+ return colSum(this.table, 'Personnel Cost');
+ }
+
+ nonpersonnel() {
+ return colSum(this.table, 'Non-personnel Cost');
+ }
+
+ revenue() {
+ return colSum(this.table, 'Revenue');
+ }
+
+ total(){
+ return this.personnel() + this.nonpersonnel() - this.revenue();
+ }
+
+}
diff --git a/js/views/00_welcome/helpers.js b/src/js/views/00_welcome/helpers.js
similarity index 92%
rename from js/views/00_welcome/helpers.js
rename to src/js/views/00_welcome/helpers.js
index 3053bb8..fa80fd7 100644
--- a/js/views/00_welcome/helpers.js
+++ b/src/js/views/00_welcome/helpers.js
@@ -1,6 +1,7 @@
import Subtitle from '../../components/header/header.js'
import Welcome from '../../components/welcome/welcome.js'
import Body from '../../components/body/body.js'
+import Sidebar from '../../components/sidebar/sidebar.js'
import { loadNewInitiatives } from '../06_new_initiatives/main.js'
import { loadSummaryPage } from '../07_summary/main.js'
@@ -12,6 +13,7 @@ export function initializePageView(){
Body.reset();
Subtitle.update("Welcome");
Welcome.show();
+ Sidebar.reset();
}
export function addLinks(){
diff --git a/js/views/00_welcome/main.js b/src/js/views/00_welcome/main.js
similarity index 56%
rename from js/views/00_welcome/main.js
rename to src/js/views/00_welcome/main.js
index 49441b1..e4f4c11 100644
--- a/js/views/00_welcome/main.js
+++ b/src/js/views/00_welcome/main.js
@@ -1,10 +1,10 @@
-import { updatePageState } from '../../utils/data_utils/local_storage_handlers.js'
+import { CurrentPage } from '../../utils/data_utils/local_storage_handlers.js'
import { initializePageView, addLinks } from './helpers.js'
export function initializeWelcomePage(){
- updatePageState('welcome');
+ CurrentPage.update('welcome');
initializePageView();
addLinks();
diff --git a/js/views/01_upload/helpers.js b/src/js/views/01_upload/helpers.js
similarity index 59%
rename from js/views/01_upload/helpers.js
rename to src/js/views/01_upload/helpers.js
index 1ee56ca..aadc069 100644
--- a/js/views/01_upload/helpers.js
+++ b/src/js/views/01_upload/helpers.js
@@ -2,6 +2,8 @@ import Subtitle from '../../components/header/header.js'
import Prompt from '../../components/prompt/prompt.js'
import NavButtons from '../../components/nav_buttons/nav_buttons.js'
import Body from "../../components/body/body.js";
+import { DATA_ROOT } from '../../init.js';
+import { FileUpload } from '../../components/file_upload/file_upload.js';
export function initializePageView() {
@@ -11,17 +13,13 @@ export function initializePageView() {
// prepare page view
Body.reset();
NavButtons.show();
+ FileUpload.show();
// update page text
Subtitle.update('Excel Upload');
+ Prompt.Text.update(`Upload the baseline detail sheet given by your budget analyst.`);
- // TODO: update to make upload actually work
- Prompt.Text.update(`Placeholder for Excel Upload`);
- Prompt.Buttons.Left.updateText('Upload');
- Prompt.Buttons.Left.show();
- Prompt.Buttons.Left.addAction(uploadExcelAction);
-}
-
-function uploadExcelAction() {
+ // show and initialize file upload; enable continue after file saved in local storage
+ FileUpload.init();
NavButtons.Next.enable();
}
\ No newline at end of file
diff --git a/js/views/01_upload/main.js b/src/js/views/01_upload/main.js
similarity index 55%
rename from js/views/01_upload/main.js
rename to src/js/views/01_upload/main.js
index cd4e55a..102fd45 100644
--- a/js/views/01_upload/main.js
+++ b/src/js/views/01_upload/main.js
@@ -1,9 +1,9 @@
-import { updatePageState } from "../../utils/data_utils/local_storage_handlers.js";
+import { CurrentPage } from "../../utils/data_utils/local_storage_handlers.js";
import { initializePageView } from "./helpers.js";
export function loadUploadPage(){
//update page state
- updatePageState('upload');
+ CurrentPage.update('upload');
initializePageView();
}
\ No newline at end of file
diff --git a/js/views/02_baseline_landing_page/helpers.js b/src/js/views/02_baseline_landing_page/helpers.js
similarity index 85%
rename from js/views/02_baseline_landing_page/helpers.js
rename to src/js/views/02_baseline_landing_page/helpers.js
index 191af54..6963fcd 100644
--- a/js/views/02_baseline_landing_page/helpers.js
+++ b/src/js/views/02_baseline_landing_page/helpers.js
@@ -3,17 +3,16 @@ import Subtitle from '../../components/header/header.js'
import Prompt from '../../components/prompt/prompt.js'
import NavButtons from '../../components/nav_buttons/nav_buttons.js'
import Table from "../../components/table/table.js";
-import { DATA_ROOT } from "../../init.js";
import Body from "../../components/body/body.js";
+import { CurrentFund } from '../../utils/data_utils/local_storage_handlers.js';
const fundCols = [
- { title: 'ID', className: 'fund-id' },
- { title: 'Name', className: 'fund-name' },
+ { title: 'Fund', className: 'fund-name' },
];
export function preparePageView(){
- localStorage.setItem("fund", '');
+ CurrentFund.reset();
// prepare page view
Body.reset();
@@ -43,8 +42,8 @@ function allowRowSelection(){
}
export async function initializeFundTable(){
- await Table.Data.loadFromJSON(DATA_ROOT + 'funds.json')
- Table.adjustWidth('100%');
+ await Table.Data.loadFunds();
+ Table.adjustWidth('30%');
Table.show();
Table.Columns.assignClasses(fundCols);
allowRowSelection();
@@ -59,8 +58,8 @@ function selectFund(tableRows, selected_row){
selected_row.classList.add('selected');
// get fund and save selected fund
var fund = selected_row.querySelector('.fund-name').textContent;
- localStorage.setItem("fund", fund);
-
+ var fundNumber = parseInt(fund);
+ CurrentFund.update(fundNumber);
// enable next step
NavButtons.Next.enable();
}
\ No newline at end of file
diff --git a/js/views/02_baseline_landing_page/main.js b/src/js/views/02_baseline_landing_page/main.js
similarity index 63%
rename from js/views/02_baseline_landing_page/main.js
rename to src/js/views/02_baseline_landing_page/main.js
index 6061c56..270c9ce 100644
--- a/js/views/02_baseline_landing_page/main.js
+++ b/src/js/views/02_baseline_landing_page/main.js
@@ -1,10 +1,10 @@
-import { updatePageState } from "../../utils/data_utils/local_storage_handlers.js";
+import { CurrentPage } from "../../utils/data_utils/local_storage_handlers.js";
import { preparePageView, initializeFundTable } from "../02_baseline_landing_page/helpers.js";
export function loadBaselineLandingPage(){
//update page state
- updatePageState('baseline-landing');
+ CurrentPage.update('baseline-landing');
preparePageView();
initializeFundTable();
}
diff --git a/src/js/views/03_revenue/helpers.js b/src/js/views/03_revenue/helpers.js
new file mode 100644
index 0000000..06709c5
--- /dev/null
+++ b/src/js/views/03_revenue/helpers.js
@@ -0,0 +1,60 @@
+import Prompt from '../../components/prompt/prompt.js'
+import { formatCurrency } from '../../utils/common_utils.js'
+import { REVENUE } from '../../init.js'
+import Body from '../../components/body/body.js'
+import NavButtons from '../../components/nav_buttons/nav_buttons.js'
+import { nextPage } from '../view_logic.js'
+import Subtitle from '../../components/header/header.js'
+import Modal from '../../components/modal/modal.js'
+import Form from '../../components/form/form.js'
+
+export function preparePageView(){
+ // prepare page view
+ Body.reset();
+ NavButtons.show();
+
+ // update page text
+ Subtitle.update('Revenue Projections');
+ // TODO: update to make dynamic
+ Prompt.Text.update(`Your revenue projection for FY26 is ${formatCurrency(REVENUE, true)}`);
+ Prompt.Buttons.Left.updateText('Confirm');
+ Prompt.Buttons.Right.updateText("This doesn't look right");
+}
+
+export function setUpNavButtons(){
+ // clicking 'confirm' will also take us to the next page
+ Prompt.Buttons.Left.addAction(nextPage);
+ // TODO: allow user to edit revenue here
+ Modal.Link.add('option2');
+ handleErrorComment();
+}
+
+export function removeButtonEvents(){
+ // remove event listeners on prompt buttons
+ Prompt.Buttons.Left.removeAction(nextPage);
+ Modal.Link.remove('option2');
+}
+
+function handleErrorComment(){
+ var fund = localStorage.getItem("fund");
+ Modal.clear();
+ Modal.Title.update(`Comment on ${fund} Revenue`);
+ Form.new('modal-body');
+ Form.NewField.longText('Explain your concerns here. Someone from the revenue team will follow up with you.',
+ 'revenue-comment', true);
+ Form.SubmitButton.add();
+ // save comment on submission
+ Modal.Submit.init(handleRevenueCommentSubmission);
+}
+
+function handleRevenueCommentSubmission(event){
+ // get data from form in modal
+ const responses = Form.fetchAllResponses(event);
+ // TODO: save comment here
+
+ // hide modal, update page, and enable continue
+ Modal.hide();
+ Prompt.Buttons.hide();
+ Prompt.Text.update('Your comment has been received.');
+ NavButtons.Next.enable();
+}
\ No newline at end of file
diff --git a/src/js/views/03_revenue/main.js b/src/js/views/03_revenue/main.js
new file mode 100644
index 0000000..8b45220
--- /dev/null
+++ b/src/js/views/03_revenue/main.js
@@ -0,0 +1,14 @@
+import { CurrentPage } from '../../utils/data_utils/local_storage_handlers.js'
+import { preparePageView, removeButtonEvents, setUpNavButtons } from './helpers.js'
+
+export function loadRevenuePage() {
+
+ //update page state
+ CurrentPage.update('revenue');
+ preparePageView();
+ setUpNavButtons();
+}
+
+export function cleanupRevenuePage() {
+ removeButtonEvents();
+};
\ No newline at end of file
diff --git a/src/js/views/04.5_OT/helpers.js b/src/js/views/04.5_OT/helpers.js
new file mode 100644
index 0000000..3f7ae0b
--- /dev/null
+++ b/src/js/views/04.5_OT/helpers.js
@@ -0,0 +1,93 @@
+
+import Prompt from '../../components/prompt/prompt.js'
+import Body from '../../components/body/body.js';
+import NavButtons from '../../components/nav_buttons/nav_buttons.js';
+import Subtitle from '../../components/header/header.js';
+import Sidebar from '../../components/sidebar/sidebar.js';
+import Table from '../../components/table/table.js';
+import { Services } from '../../utils/data_utils/budget_data_handlers.js';
+import { OT_FRINGE } from '../../init.js';
+
+export function preparePageView(){
+ // prepare page view
+ Body.reset();
+ NavButtons.show();
+ Sidebar.show();
+
+ // enable next button
+ NavButtons.Next.enable();
+
+ // update page text
+ Subtitle.update('Overtime Estimates');
+
+ // activate table
+ initializeOTTable();
+ Prompt.Text.update(`Please see your baseline overtime / holiday pay / shift premiums in the table below.
+ Make any edits and continue.`);
+}
+
+function assignClasses() {
+ // record columns and their classes
+ const OT_cols = [
+ { title: 'Account String', className: 'string' },
+ { title: `Cost Center Name`, className: 'cc' },
+ { title: 'Service', className: 'service' },
+ { title: 'Recurring or One-Time', className: 'recurring'},
+ { title: 'Hourly Employee Overtime (Wages)', className: 'OT-wages', isCost: true },
+ { title: 'Salaried Employee Overtime (Salary)', className: 'OT-salary', isCost: true },
+ { title: 'Total Cost (including benefits)', className : 'total', isCost: true},
+ { title: 'Edit', className: 'edit'}
+ ];
+
+ // assign cost classes
+ Table.Columns.assignClasses(OT_cols)
+}
+
+function OTRowOnEdit(){
+ Table.Cell.createTextbox('OT-wages', true);
+ Table.Cell.createTextbox('OT-salary', true);
+ Table.Cell.createServiceDropdown(Services.list());
+}
+
+export async function initializeOTTable(){
+ // load table data from local storage
+ if(await Table.Data.load()) {
+ //after table is loaded, fill it
+ Table.show();
+ Table.Columns.addAtEnd( '0', 'Hourly Employee Overtime (Wages)');
+ Table.Columns.addAtEnd( '0', 'Salaried Employee Overtime (Salary)');
+ // Table.Columns.addAtEnd( '0', 'Total Cost (including benefits)');
+ Table.Columns.addAtEnd(Table.Buttons.edit_confirm_btns, 'Edit');;
+ assignClasses();
+ // add up the baseline costs and update sidebar
+ updateDisplayandTotals();
+ // activate edit buttons
+ Table.Buttons.Edit.init(OTRowOnEdit, updateDisplayandTotals);
+ } else {
+ Prompt.Text.update('No overtime expenses for this fund.')
+ }
+}
+
+function calculateTotalCost(wages, salary, fringe){
+ return (wages + salary) * (1 + fringe) ;
+}
+
+// update sidebar and also cost totals when the FTEs are edited
+function updateDisplayandTotals(){
+ // calculate for each row
+ let rows = document.getElementsByTagName('tr');
+ for (let i = 1; i < rows.length; i++){
+ // fetch values for calculations
+ let OT_salary = Table.Cell.getValue(rows[i], 'OT-salary');
+ let OT_wages = Table.Cell.getValue(rows[i], 'OT-wages');
+
+ // add salary and wages and fringe benefits (FICA)
+ let row_total = calculateTotalCost(OT_salary, OT_wages, OT_FRINGE);
+
+ // update total
+ Table.Cell.updateValue(rows[i], 'total', row_total);
+
+ //save data
+ Table.save();
+ }
+}
\ No newline at end of file
diff --git a/src/js/views/04.5_OT/main.js b/src/js/views/04.5_OT/main.js
new file mode 100644
index 0000000..1be9a1b
--- /dev/null
+++ b/src/js/views/04.5_OT/main.js
@@ -0,0 +1,10 @@
+
+import { CurrentPage } from "../../utils/data_utils/local_storage_handlers.js";
+import { preparePageView } from './helpers.js';
+
+export function loadOTPage(){
+ //update page state
+ CurrentPage.update('overtime');
+ preparePageView();
+
+}
\ No newline at end of file
diff --git a/js/views/04_personnel/helpers.js b/src/js/views/04_personnel/helpers.js
similarity index 58%
rename from js/views/04_personnel/helpers.js
rename to src/js/views/04_personnel/helpers.js
index 91669d7..712ff0a 100644
--- a/js/views/04_personnel/helpers.js
+++ b/src/js/views/04_personnel/helpers.js
@@ -1,5 +1,5 @@
-import { DATA_ROOT, FISCAL_YEAR, fringe, cola, merit } from "../../init.js"
+import { FISCAL_YEAR, fringe, cola, merit } from "../../init.js"
import Body from "../../components/body/body.js";
import NavButtons from "../../components/nav_buttons/nav_buttons.js";
import Subtitle from "../../components/header/header.js";
@@ -8,7 +8,10 @@ import Modal from "../../components/modal/modal.js";
import Prompt from "../../components/prompt/prompt.js";
import Table from '../../components/table/table.js'
import Sidebar from "../../components/sidebar/sidebar.js";
+import { Services } from "../../utils/data_utils/budget_data_handlers.js";
+import { convertToJSON } from "../../utils/data_utils/JSON_data_handlers.js";
+import { Baseline, loadTableData } from "../../utils/data_utils/local_storage_handlers.js";
export function preparePageView(){
// prepare page view
@@ -16,8 +19,6 @@ export function preparePageView(){
NavButtons.show();
Sidebar.show();
Table.adjustWidth('90%');
- // just enable next for now
- // TODO only enable when all info is entered
NavButtons.Next.enable();
// update page text
@@ -33,11 +34,13 @@ export function preparePageView(){
function assignClasses() {
// record columns and their classes
const personnelColumns = [
- { title: 'Job Name (Type)', className: 'job-name' },
- { title: `FY${FISCAL_YEAR} FTEs`, className: 'baseline-ftes' },
+ { title: 'Job Title', className: 'job-name' },
+ { title: 'Account String', className: 'string' },
{ title: 'Service', className: 'service' },
+ { title: `FY${FISCAL_YEAR} Requested FTE`, className: 'baseline-ftes' },
+ { title: `FY${FISCAL_YEAR} Average Projected Salary/Wage`, className: 'avg-salary', isCost: true },
{ title: 'Total Cost', className: 'total-baseline', isCost: true },
- { title: 'Average Projected Salary', className: 'avg-salary', isCost: true }
+ { title: 'Edit', className: 'edit' }
];
// assign cost classes
@@ -46,22 +49,24 @@ function assignClasses() {
function personnelRowOnEdit(){
Table.Cell.createTextbox('baseline-ftes');
- Table.Cell.createDropdown('service', DATA_ROOT + 'services.json');
+ Table.Cell.createServiceDropdown(Services.list());
}
export async function initializePersonnelTable(){
- // load table data from json
- await Table.Data.loadFromJSON(DATA_ROOT + 'personnel_data.json');
- //after table is loaded, fill it
- Table.show();
- Table.Columns.addAtEnd( '0', 'Total Cost');
- Table.Columns.addAtEnd(Table.Buttons.edit_confirm_btns, ' ');;
- assignClasses();
- // add up the baseline costs and update sidebar
- updateDisplayandTotals();
- // activate edit buttons
- Table.Buttons.Edit.init(personnelRowOnEdit, updateDisplayandTotals);
- initializeRowAddition();
+ // load table data from local storage
+ if(await Table.Data.load()) {
+ //after table is loaded, show it
+ Table.show();
+ Table.Columns.addAtEnd(Table.Buttons.edit_confirm_btns, 'Edit');
+ assignClasses();
+ // add up the baseline costs and update sidebar
+ updateDisplayandTotals();
+ // activate edit buttons
+ Table.Buttons.Edit.init(personnelRowOnEdit, updateDisplayandTotals);
+ initializeRowAddition();
+ } else {
+ Prompt.Text.update('No personnel expenses for this fund.')
+ }
}
function initializeRowAddition(){
@@ -75,9 +80,6 @@ function calculateTotalCost(ftes, avg_salary, fringe, cola, merit){
// update sidebar and also cost totals when the FTEs are edited
function updateDisplayandTotals(){
- // initialize
- Sidebar.updateStat('baseline-personnel', 0);
- Sidebar.updateStat('supp-personnel', 0);
// calculate for each row
let rows = document.getElementsByTagName('tr');
for (let i = 1; i < rows.length; i++){
@@ -88,10 +90,13 @@ function updateDisplayandTotals(){
// calcuate #FTEs x average salary + COLA adjustments + merit adjustments + fringe
let total_baseline_cost = calculateTotalCost(baseline_ftes, avg_salary, fringe, cola, merit);
- // update counter and total
- Sidebar.incrementStat('baseline-personnel', total_baseline_cost);
+ // update total column
Table.Cell.updateValue(rows[i], 'total-baseline', total_baseline_cost);
}
+
+ // Save the table after all updates are done
+ Table.save();
+
}
@@ -109,29 +114,23 @@ export function setUpForm() {
Form.NewField.shortText('Account String:', 'account-string', true);
Form.SubmitButton.add();
// Initialize form submission to table data
- handleFormSubmissions();
+ Modal.Submit.init(handleSubmitNewJob);
}
-function handleFormSubmissions(event){
- // initialize form submission
-
- const modal = document.getElementById('main-modal');
- modal.addEventListener('submit', function(event) {
- event.preventDefault();
- // get answers from form, hide form, show answers in table
- const responses = Form.fetchAllResponses(event);
- // make sure it's not an empty response
- if (Object.values(responses)[0] != ''){
- // change page view
- Modal.hide();
-
- // add data to table
- Table.Rows.add(responses);
- Table.show();
- Table.Buttons.AddRow.show();
- // TODO: save table data
- // TODO: edit cost to show currency correctly
- }
-
- })
+function handleSubmitNewJob(event){
+ // get answers from form, hide form, show answers in table
+ const responses = Form.fetchAllResponses(event);
+ // make sure it's not an empty response
+ if (Object.values(responses)[0] != ''){
+ // change page view
+ Modal.hide();
+
+ // add data to table
+ Table.Rows.add(responses);
+ Table.show();
+ Table.Buttons.AddRow.show();
+ // TODO: save table data
+ // TODO: edit cost to show currency correctly
+ }
+
}
diff --git a/js/views/04_personnel/main.js b/src/js/views/04_personnel/main.js
similarity index 66%
rename from js/views/04_personnel/main.js
rename to src/js/views/04_personnel/main.js
index ef2b481..e567206 100644
--- a/js/views/04_personnel/main.js
+++ b/src/js/views/04_personnel/main.js
@@ -1,9 +1,9 @@
-import { updatePageState } from "../../utils/data_utils/local_storage_handlers.js";
+import { CurrentPage } from "../../utils/data_utils/local_storage_handlers.js";
import { preparePageView, initializePersonnelTable, setUpModal, setUpForm } from "./helpers.js";
export function loadPersonnelPage(){
- updatePageState('personnel');
+ CurrentPage.update('personnel');
preparePageView();
initializePersonnelTable();
diff --git a/src/js/views/05_nonpersonnel/helpers.js b/src/js/views/05_nonpersonnel/helpers.js
new file mode 100644
index 0000000..3cec10f
--- /dev/null
+++ b/src/js/views/05_nonpersonnel/helpers.js
@@ -0,0 +1,63 @@
+import Prompt from "../../components/prompt/prompt.js";
+import Sidebar from "../../components/sidebar/sidebar.js";
+import Table from "../../components/table/table.js";
+import Body from "../../components/body/body.js";
+import NavButtons from "../../components/nav_buttons/nav_buttons.js";
+import Subtitle from "../../components/header/header.js";
+
+// "Vendor": "Law Firm LLC",
+// "CPA #" : "765421",
+// "Account String": "1000-29320-320010",
+// "Object Name": "Consulting",
+// "End of Contract": "12/31/2024",
+// "Amount Remaining" : 50000,
+// "FY26 Request": 100000
+
+const nonPersonnelColumns = [
+ { title: 'FY26 Request', className: 'request', isCost: true },
+ { title: 'Amount Remaining on Contract', className: 'remaining', isCost: true },
+ { title: 'Service', className : 'service' },
+ { title: 'Edit', className : 'edit' },
+ { title : 'Account String', className : 'account-string'},
+ { title : 'CPA #', className : 'cpa'},
+ { title : 'Contract End Date', className : 'contract-end'},
+ { title: 'Recurring or One-Time', className: 'recurring'},
+ { title: 'Object Name', className: 'object'}
+];
+
+export function preparePageView(){
+ // prepare page view
+ Body.reset();
+ NavButtons.show();
+ Sidebar.show();
+ Table.adjustWidth('100%');
+ // update page text
+ Subtitle.update('Non-Personnel');
+ Prompt.Text.update('Select an action item for each non-personnel line item from last year.');
+
+ // just enable next for now
+ // TODO: only enable when all info is entered
+ NavButtons.Next.enable();
+}
+
+export async function initializeNonpersonnelTable(){
+ // load table data from storage
+ if(await Table.Data.load()) {
+ //after table is loaded, fill it
+ Table.show();
+ Table.Columns.addAtEnd(Table.Buttons.edit_confirm_btns, "Edit");
+ // assign cost classes
+ Table.Columns.assignClasses(nonPersonnelColumns);
+ // enable editing
+ Table.Buttons.Edit.init(nonPersonnelRowOnEdit, Table.save);
+ } else {
+ Prompt.Text.update('No personnel expenses for this fund.')
+ }
+}
+
+function nonPersonnelRowOnEdit(){
+ // make it editable
+ Table.Cell.createTextbox('request', true);
+ Table.Cell.createServiceDropdown();
+}
+
diff --git a/js/views/05_nonpersonnel/main.js b/src/js/views/05_nonpersonnel/main.js
similarity index 61%
rename from js/views/05_nonpersonnel/main.js
rename to src/js/views/05_nonpersonnel/main.js
index 566cf77..a9bfa66 100644
--- a/js/views/05_nonpersonnel/main.js
+++ b/src/js/views/05_nonpersonnel/main.js
@@ -1,9 +1,9 @@
-import { updatePageState } from "../../utils/data_utils/local_storage_handlers.js";
+import { CurrentPage } from "../../utils/data_utils/local_storage_handlers.js";
import { preparePageView, initializeNonpersonnelTable } from "../05_nonpersonnel/helpers.js";
export function loadNonpersonnelPage(){
- updatePageState('nonpersonnel');
+ CurrentPage.update('nonpersonnel');
preparePageView();
initializeNonpersonnelTable()
}
diff --git a/src/js/views/06_new_initiatives/helpers.js b/src/js/views/06_new_initiatives/helpers.js
new file mode 100644
index 0000000..6e8773f
--- /dev/null
+++ b/src/js/views/06_new_initiatives/helpers.js
@@ -0,0 +1,117 @@
+
+import Prompt from '../../components/prompt/prompt.js'
+import Modal from '../../components/modal/modal.js'
+import Form from '../../components/form/form.js'
+import Table from '../../components/table/table.js'
+import Body from '../../components/body/body.js'
+import NavButtons from '../../components/nav_buttons/nav_buttons.js'
+import Subtitle from '../../components/header/header.js'
+import Sidebar from '../../components/sidebar/sidebar.js'
+import { nextPage } from '../view_logic.js'
+
+export function initializePageView() {
+ // Prepare page view
+ Body.reset();
+ NavButtons.show();
+ Sidebar.show();
+
+ // remove fund selection
+ localStorage.setItem("fund", '');
+
+ // Load text
+ Subtitle.update('New Initiatives');
+ Prompt.Text.update('Do you have any new initiatives for FY26?');
+ Prompt.Buttons.Left.updateText('Yes');
+ Prompt.Buttons.Right.updateText('No');
+ // clicking 'no new initialitives' will also take us to the next page
+ Prompt.Buttons.Right.addAction(nextPage);
+ Prompt.Buttons.Left.addAction(NavButtons.Next.enable);
+}
+
+export function setUpModal() {
+ // Initialize modal
+ Modal.clear();
+ Modal.Link.add('option1');
+ Modal.Title.update('New initiative');
+ Modal.Link.add('add-btn');
+}
+
+export function setUpForm() {
+ // Set up form
+ Form.new('modal-body');
+ Form.NewField.shortText('Initiative Name:', 'Initiative Name', true);
+ Form.NewField.longText(`Describe what the Initiative is and why it is needed and should be funded:
+ i). What is the business case for the Initiative?
+ ii). Why is the initiative needed? What is the value-add to residents? What is the Department’s plan for implementing the Initiative?
+ iii). Why can’t the Initiative be funded with the Department’s baseline budget?`, 'Explanation', true);
+
+ Form.NewField.numericInput('What is your ballpark estimate of TOTAL ADDITONAL expenses associated with this initiative?', 'Ballpark Total', false);
+
+ Form.NewField.numericInput('Estimate of ADDITONAL personnel cost?', 'Personnel Cost', false);
+ Form.NewField.numericInput('Estimate of ADDITONAL nonpersonnel cost?', 'Non-personnel Cost', false);
+ Form.NewField.numericInput('Estimate of ADDITONAL revenue (if applicable)?', 'Revenue', false);
+
+ Form.SubmitButton.add();
+ // Initialize form submission to table data
+ Modal.Submit.init(handleNewInitSubmission);
+}
+
+function assignClasses() {
+ // record columns and their classes
+ const initiativesCols = [
+ { title: 'Initiative Name', className: 'init-name' },
+ { title: `Explanation`, className: 'explanation' },
+ { title: 'Ballpark Total', className: 'total', isCost: true },
+ { title: 'Revenue', className: 'revenue', isCost: true },
+ { title: 'Personnel Cost', className: 'personnel', isCost: true },
+ { title: 'Non-personnel Cost', className: 'nonpersonnel', isCost: true }
+ ];
+
+ // assign cost classes
+ Table.Columns.assignClasses(initiativesCols)
+}
+
+export async function initializeInitTable(){
+ // load table data from storage
+ if(await Table.Data.load()) {
+ //after table is loaded, fill it
+ assignClasses();
+ Table.adjustWidth('70%');
+ Table.Buttons.AddRow.updateText('Add another new initiative');
+ tableView();
+ }
+}
+
+function handleNewInitSubmission(event){
+ // get answers from form, hide form, show answers in table
+ const responses = Form.fetchAllResponses(event);
+ // make sure it's not an empty response
+ if (Object.values(responses)[0] != ''){
+ // add data to table
+ Table.Rows.add(responses);
+ // save it
+ Table.save();
+ tableView();
+ }
+}
+
+function tableView() {
+ // change page view
+ Table.show();
+ Modal.hide();
+ Prompt.hide();
+ assignClasses();
+ Table.Buttons.AddRow.show();
+ NavButtons.Next.enable();
+}
+
+export function removeModalLinks(){
+ Modal.Link.remove('option1');
+ Modal.Link.remove('add-btn');
+}
+
+export function removePromptButtonListeners(){
+ Prompt.Buttons.Right.removeAction(nextPage);
+ Prompt.Buttons.Left.removeAction(NavButtons.Next.enable);
+ Modal.clear();
+}
\ No newline at end of file
diff --git a/js/views/06_new_initiatives/main.js b/src/js/views/06_new_initiatives/main.js
similarity index 51%
rename from js/views/06_new_initiatives/main.js
rename to src/js/views/06_new_initiatives/main.js
index 78039fb..90bf05c 100644
--- a/js/views/06_new_initiatives/main.js
+++ b/src/js/views/06_new_initiatives/main.js
@@ -1,15 +1,15 @@
-import { initializePageView, setUpModal, setUpForm, setUpTable, removeModalLinks, removePromptButtonListeners } from './helpers.js'
-import { updatePageState } from '../../utils/data_utils/local_storage_handlers.js'
+import { initializePageView, setUpModal, setUpForm, removeModalLinks, removePromptButtonListeners, initializeInitTable } from './helpers.js'
+import { CurrentPage } from '../../utils/data_utils/local_storage_handlers.js'
// set up page and initialize all buttons
export function loadNewInitiatives() {
- updatePageState('new-inits');
+ CurrentPage.update('new-inits');
initializePageView();
setUpModal();
setUpForm();
- setUpTable();
+ initializeInitTable();
}
export function cleanUpInitiativesPage() {
diff --git a/src/js/views/07_summary/main.js b/src/js/views/07_summary/main.js
new file mode 100644
index 0000000..60e200b
--- /dev/null
+++ b/src/js/views/07_summary/main.js
@@ -0,0 +1,40 @@
+import { CurrentPage } from "../../utils/data_utils/local_storage_handlers.js";
+import Prompt from '../../components/prompt/prompt.js'
+import Body from "../../components/body/body.js";
+import Subtitle from "../../components/header/header.js";
+import { visitPage } from "../view_logic.js";
+import { Accordion } from "../../components/accordion/accordion.js";
+import { downloadXLSX } from "../../utils/data_utils/XLSX_handlers.js";
+
+export function loadSummaryPage(){
+ //update page state
+ CurrentPage.update('summary');
+ summaryView();
+}
+
+export function cleanUpSummaryPage(){
+ Prompt.Buttons.Right.removeAction(returnToWelcome);
+ Prompt.Buttons.Left.removeAction(downloadXLSX);
+}
+
+export function summaryView(){
+ Body.reset();
+ Accordion.createFromFunds();
+ Accordion.show();
+
+ // prompt buttons
+ Prompt.Text.update('');
+ Prompt.show();
+ Prompt.Buttons.Left.updateText('Download Excel');
+ Prompt.Buttons.Right.updateText('Go back to home');
+
+ // update page text
+ Subtitle.update('Summary');
+ // add button links
+ Prompt.Buttons.Right.addAction(returnToWelcome);
+ Prompt.Buttons.Left.addAction(downloadXLSX);
+
+}
+
+const returnToWelcome = () => {visitPage('welcome')}
+
diff --git a/js/views/view_logic.js b/src/js/views/view_logic.js
similarity index 88%
rename from js/views/view_logic.js
rename to src/js/views/view_logic.js
index 15975be..d4f2b76 100644
--- a/js/views/view_logic.js
+++ b/src/js/views/view_logic.js
@@ -9,7 +9,7 @@ import { cleanUpSummaryPage, loadSummaryPage } from './07_summary/main.js';
import { loadUploadPage } from './01_upload/main.js';
import { pauseExecution } from '../utils/common_utils.js';
-import { loadPageState } from '../utils/data_utils/local_storage_handlers.js';
+import { CurrentPage } from '../utils/data_utils/local_storage_handlers.js';
export let PAGES = {
'welcome' : initializeWelcomePage,
@@ -31,20 +31,18 @@ export let CLEANUP = {
export function visitPage(new_page_key){
// clean up from current page
- var page_state = loadPageState();
+ var page_state = CurrentPage.load();
if (CLEANUP[page_state]) { CLEANUP[page_state]() };
// Use the page_state to access and call the corresponding function from PAGES
if (PAGES[new_page_key]) {
PAGES[new_page_key](); // Invokes the function if it exists in the PAGES map
} else {
console.error(`No page initializer found for state: ${new_page_key}`);
- }
- PAGES[new_page_key]();
-}
+ }}
export function nextPage(){
- var page_state = loadPageState();
+ var page_state = CurrentPage.load();
const keys = Object.keys(PAGES);
// Find the index of the current key
@@ -64,7 +62,7 @@ export function nextPage(){
export function lastPage(){
- var page_state = loadPageState();
+ var page_state = CurrentPage.load();
const keys = Object.keys(PAGES);
// Find the index of the current key
@@ -80,9 +78,4 @@ export function lastPage(){
// go to that page
visitPage(lastKey);
}
-}
-
-export async function pauseAndContinue(){
- await pauseExecution(0.5);
- nextPage();
}
\ No newline at end of file
diff --git a/webpack.config.js b/webpack.config.js
new file mode 100644
index 0000000..760899b
--- /dev/null
+++ b/webpack.config.js
@@ -0,0 +1,79 @@
+const path = require('path');
+const HtmlWebpackPlugin = require('html-webpack-plugin');
+const MiniCssExtractPlugin = require('mini-css-extract-plugin');
+const TerserJSPlugin = require('terser-webpack-plugin');
+const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
+
+// Determine mode from the environment, default to development
+const mode = process.env.NODE_ENV || 'development';
+const isProduction = mode === 'production';
+
+module.exports = {
+ // Entry point for the application
+ entry: './src/js/init.js',
+
+ // Output configuration for the bundle
+ output: {
+ filename: isProduction ? 'bundle.[contenthash].js' : 'bundle.js',
+ path: path.resolve(__dirname, 'build'),
+ },
+
+ // Use the mode variable to set the mode
+ mode,
+
+ // Enable source maps for development mode
+ devtool: isProduction ? 'source-map' : 'eval-cheap-module-source-map',
+
+ // Module rules for processing different types of files
+ module: {
+ rules: [
+ {
+ test: /\.js$/, // Process any .js files
+ exclude: /node_modules/, // Exclude the node_modules directory
+ use: {
+ loader: 'babel-loader', // Use babel-loader to transpile ES6+ to ES5
+ },
+ },
+ {
+ test: /\.css$/, // Process any .css files
+ use: [
+ isProduction ? MiniCssExtractPlugin.loader : 'style-loader',
+ 'css-loader'
+ ], // Use style-loader in development for hot reloading
+ },
+ {
+ test: /\.html$/, // Process any .html files
+ use: ['html-loader'],
+ },
+ {
+ test: /\.(png|svg|jpg|jpeg|gif)$/i,
+ type: 'asset/resource',
+ },
+ ],
+ },
+
+ // Plugins for additional functionality
+ plugins: [
+ new HtmlWebpackPlugin({
+ template: './src/index.html', // Template file to use
+ }),
+ new MiniCssExtractPlugin({
+ filename: isProduction ? '[name].[contenthash].css' : '[name].css',
+ }),
+ ],
+
+ // Configuration for the development server
+ devServer: {
+ hot: true, // Enable hot module replacement
+ open: true, // Open the browser after server had been started
+ port: 3000, // Set the port to listen on
+ },
+
+ // Optimization configuration, only configure minimizers if in production
+ optimization: isProduction ? {
+ minimizer: [
+ new TerserJSPlugin({}), // Minimize JavaScript
+ new OptimizeCSSAssetsPlugin({}), // Minimize CSS
+ ],
+ } : {},
+};
\ No newline at end of file
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000..8857f8c
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,4309 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ampproject/remapping@^2.2.0":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4"
+ integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@babel/code-frame@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465"
+ integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==
+ dependencies:
+ "@babel/highlight" "^7.24.7"
+ picocolors "^1.0.0"
+
+"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.24.8":
+ version "7.24.9"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.9.tgz#53eee4e68f1c1d0282aa0eb05ddb02d033fc43a0"
+ integrity sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==
+
+"@babel/core@^7.24.9":
+ version "7.24.9"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.9.tgz#dc07c9d307162c97fa9484ea997ade65841c7c82"
+ integrity sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==
+ dependencies:
+ "@ampproject/remapping" "^2.2.0"
+ "@babel/code-frame" "^7.24.7"
+ "@babel/generator" "^7.24.9"
+ "@babel/helper-compilation-targets" "^7.24.8"
+ "@babel/helper-module-transforms" "^7.24.9"
+ "@babel/helpers" "^7.24.8"
+ "@babel/parser" "^7.24.8"
+ "@babel/template" "^7.24.7"
+ "@babel/traverse" "^7.24.8"
+ "@babel/types" "^7.24.9"
+ convert-source-map "^2.0.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.3"
+ semver "^6.3.1"
+
+"@babel/generator@^7.24.8", "@babel/generator@^7.24.9":
+ version "7.24.10"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.10.tgz#a4ab681ec2a78bbb9ba22a3941195e28a81d8e76"
+ integrity sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==
+ dependencies:
+ "@babel/types" "^7.24.9"
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.25"
+ jsesc "^2.5.1"
+
+"@babel/helper-annotate-as-pure@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab"
+ integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==
+ dependencies:
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3"
+ integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==
+ dependencies:
+ "@babel/traverse" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7", "@babel/helper-compilation-targets@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz#b607c3161cd9d1744977d4f97139572fe778c271"
+ integrity sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==
+ dependencies:
+ "@babel/compat-data" "^7.24.8"
+ "@babel/helper-validator-option" "^7.24.8"
+ browserslist "^4.23.1"
+ lru-cache "^5.1.1"
+ semver "^6.3.1"
+
+"@babel/helper-create-class-features-plugin@^7.24.7":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.8.tgz#47f546408d13c200c0867f9d935184eaa0851b09"
+ integrity sha512-4f6Oqnmyp2PP3olgUMmOwC3akxSm5aBYraQ6YDdKy7NcAMkDECHWG0DEnV6M2UAkERgIBhYt8S27rURPg7SxWA==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.24.7"
+ "@babel/helper-environment-visitor" "^7.24.7"
+ "@babel/helper-function-name" "^7.24.7"
+ "@babel/helper-member-expression-to-functions" "^7.24.8"
+ "@babel/helper-optimise-call-expression" "^7.24.7"
+ "@babel/helper-replace-supers" "^7.24.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
+ "@babel/helper-split-export-declaration" "^7.24.7"
+ semver "^6.3.1"
+
+"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz#be4f435a80dc2b053c76eeb4b7d16dd22cfc89da"
+ integrity sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.24.7"
+ regexpu-core "^5.3.1"
+ semver "^6.3.1"
+
+"@babel/helper-define-polyfill-provider@^0.6.1", "@babel/helper-define-polyfill-provider@^0.6.2":
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d"
+ integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.22.6"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ debug "^4.1.1"
+ lodash.debounce "^4.0.8"
+ resolve "^1.14.2"
+
+"@babel/helper-environment-visitor@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9"
+ integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==
+ dependencies:
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-function-name@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2"
+ integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==
+ dependencies:
+ "@babel/template" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-hoist-variables@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee"
+ integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==
+ dependencies:
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-member-expression-to-functions@^7.24.7", "@babel/helper-member-expression-to-functions@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz#6155e079c913357d24a4c20480db7c712a5c3fb6"
+ integrity sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==
+ dependencies:
+ "@babel/traverse" "^7.24.8"
+ "@babel/types" "^7.24.8"
+
+"@babel/helper-module-imports@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b"
+ integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==
+ dependencies:
+ "@babel/traverse" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-module-transforms@^7.24.7", "@babel/helper-module-transforms@^7.24.8", "@babel/helper-module-transforms@^7.24.9":
+ version "7.24.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz#e13d26306b89eea569180868e652e7f514de9d29"
+ integrity sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.24.7"
+ "@babel/helper-module-imports" "^7.24.7"
+ "@babel/helper-simple-access" "^7.24.7"
+ "@babel/helper-split-export-declaration" "^7.24.7"
+ "@babel/helper-validator-identifier" "^7.24.7"
+
+"@babel/helper-optimise-call-expression@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f"
+ integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==
+ dependencies:
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878"
+ integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==
+
+"@babel/helper-remap-async-to-generator@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz#b3f0f203628522713849d49403f1a414468be4c7"
+ integrity sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.24.7"
+ "@babel/helper-environment-visitor" "^7.24.7"
+ "@babel/helper-wrap-function" "^7.24.7"
+
+"@babel/helper-replace-supers@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz#f933b7eed81a1c0265740edc91491ce51250f765"
+ integrity sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.24.7"
+ "@babel/helper-member-expression-to-functions" "^7.24.7"
+ "@babel/helper-optimise-call-expression" "^7.24.7"
+
+"@babel/helper-simple-access@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3"
+ integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==
+ dependencies:
+ "@babel/traverse" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9"
+ integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==
+ dependencies:
+ "@babel/traverse" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-split-export-declaration@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856"
+ integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==
+ dependencies:
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-string-parser@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d"
+ integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==
+
+"@babel/helper-validator-identifier@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db"
+ integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==
+
+"@babel/helper-validator-option@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d"
+ integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==
+
+"@babel/helper-wrap-function@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz#52d893af7e42edca7c6d2c6764549826336aae1f"
+ integrity sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==
+ dependencies:
+ "@babel/helper-function-name" "^7.24.7"
+ "@babel/template" "^7.24.7"
+ "@babel/traverse" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
+"@babel/helpers@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.8.tgz#2820d64d5d6686cca8789dd15b074cd862795873"
+ integrity sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==
+ dependencies:
+ "@babel/template" "^7.24.7"
+ "@babel/types" "^7.24.8"
+
+"@babel/highlight@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d"
+ integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.24.7"
+ chalk "^2.4.2"
+ js-tokens "^4.0.0"
+ picocolors "^1.0.0"
+
+"@babel/parser@^7.24.7", "@babel/parser@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.8.tgz#58a4dbbcad7eb1d48930524a3fd93d93e9084c6f"
+ integrity sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==
+
+"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz#fd059fd27b184ea2b4c7e646868a9a381bbc3055"
+ integrity sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz#468096ca44bbcbe8fcc570574e12eb1950e18107"
+ integrity sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89"
+ integrity sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
+ "@babel/plugin-transform-optional-chaining" "^7.24.7"
+
+"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz#71b21bb0286d5810e63a1538aa901c58e87375ec"
+ integrity sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2":
+ version "7.21.0-placeholder-for-preset-env.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703"
+ integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==
+
+"@babel/plugin-syntax-async-generators@^7.8.4":
+ version "7.8.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
+ integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-class-properties@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
+ integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-class-static-block@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406"
+ integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-dynamic-import@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
+ integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-export-namespace-from@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
+ integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-syntax-import-assertions@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz#2a0b406b5871a20a841240586b1300ce2088a778"
+ integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-syntax-import-attributes@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca"
+ integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-syntax-import-meta@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
+ integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-json-strings@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
+ integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
+ integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
+ integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-numeric-separator@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
+ integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-object-rest-spread@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
+ integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
+ integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-chaining@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
+ integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-private-property-in-object@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad"
+ integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-top-level-await@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
+ integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-unicode-sets-regex@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357"
+ integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-arrow-functions@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514"
+ integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-async-generator-functions@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz#7330a5c50e05181ca52351b8fd01642000c96cfd"
+ integrity sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-remap-async-to-generator" "^7.24.7"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+
+"@babel/plugin-transform-async-to-generator@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc"
+ integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==
+ dependencies:
+ "@babel/helper-module-imports" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-remap-async-to-generator" "^7.24.7"
+
+"@babel/plugin-transform-block-scoped-functions@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f"
+ integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-block-scoping@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz#42063e4deb850c7bd7c55e626bf4e7ab48e6ce02"
+ integrity sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-class-properties@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz#256879467b57b0b68c7ddfc5b76584f398cd6834"
+ integrity sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-class-static-block@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d"
+ integrity sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+
+"@babel/plugin-transform-classes@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.8.tgz#ad23301fe5bc153ca4cf7fb572a9bc8b0b711cf7"
+ integrity sha512-VXy91c47uujj758ud9wx+OMgheXm4qJfyhj1P18YvlrQkNOSrwsteHk+EFS3OMGfhMhpZa0A+81eE7G4QC+3CA==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.24.7"
+ "@babel/helper-compilation-targets" "^7.24.8"
+ "@babel/helper-environment-visitor" "^7.24.7"
+ "@babel/helper-function-name" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.8"
+ "@babel/helper-replace-supers" "^7.24.7"
+ "@babel/helper-split-export-declaration" "^7.24.7"
+ globals "^11.1.0"
+
+"@babel/plugin-transform-computed-properties@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707"
+ integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/template" "^7.24.7"
+
+"@babel/plugin-transform-destructuring@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz#c828e814dbe42a2718a838c2a2e16a408e055550"
+ integrity sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.8"
+
+"@babel/plugin-transform-dotall-regex@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0"
+ integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-duplicate-keys@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee"
+ integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-dynamic-import@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4"
+ integrity sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+
+"@babel/plugin-transform-exponentiation-operator@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d"
+ integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==
+ dependencies:
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-export-namespace-from@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197"
+ integrity sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+
+"@babel/plugin-transform-for-of@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70"
+ integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
+
+"@babel/plugin-transform-function-name@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz#6d8601fbffe665c894440ab4470bc721dd9131d6"
+ integrity sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.24.7"
+ "@babel/helper-function-name" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-json-strings@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a"
+ integrity sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+
+"@babel/plugin-transform-literals@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz#36b505c1e655151a9d7607799a9988fc5467d06c"
+ integrity sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-logical-assignment-operators@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0"
+ integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+
+"@babel/plugin-transform-member-expression-literals@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df"
+ integrity sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-modules-amd@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7"
+ integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-modules-commonjs@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz#ab6421e564b717cb475d6fff70ae7f103536ea3c"
+ integrity sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.24.8"
+ "@babel/helper-plugin-utils" "^7.24.8"
+ "@babel/helper-simple-access" "^7.24.7"
+
+"@babel/plugin-transform-modules-systemjs@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz#f8012316c5098f6e8dee6ecd58e2bc6f003d0ce7"
+ integrity sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==
+ dependencies:
+ "@babel/helper-hoist-variables" "^7.24.7"
+ "@babel/helper-module-transforms" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-validator-identifier" "^7.24.7"
+
+"@babel/plugin-transform-modules-umd@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8"
+ integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-named-capturing-groups-regex@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923"
+ integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-new-target@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00"
+ integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-nullish-coalescing-operator@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120"
+ integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+
+"@babel/plugin-transform-numeric-separator@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63"
+ integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+
+"@babel/plugin-transform-object-rest-spread@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6"
+ integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-transform-parameters" "^7.24.7"
+
+"@babel/plugin-transform-object-super@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be"
+ integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-replace-supers" "^7.24.7"
+
+"@babel/plugin-transform-optional-catch-binding@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4"
+ integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+
+"@babel/plugin-transform-optional-chaining@^7.24.7", "@babel/plugin-transform-optional-chaining@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz#bb02a67b60ff0406085c13d104c99a835cdf365d"
+ integrity sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.8"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+
+"@babel/plugin-transform-parameters@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68"
+ integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-private-methods@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz#e6318746b2ae70a59d023d5cc1344a2ba7a75f5e"
+ integrity sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-private-property-in-object@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061"
+ integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.24.7"
+ "@babel/helper-create-class-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+
+"@babel/plugin-transform-property-literals@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc"
+ integrity sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-regenerator@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8"
+ integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ regenerator-transform "^0.15.2"
+
+"@babel/plugin-transform-reserved-words@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4"
+ integrity sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-shorthand-properties@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73"
+ integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-spread@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3"
+ integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
+
+"@babel/plugin-transform-sticky-regex@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb"
+ integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-template-literals@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8"
+ integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-typeof-symbol@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz#383dab37fb073f5bfe6e60c654caac309f92ba1c"
+ integrity sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.8"
+
+"@babel/plugin-transform-unicode-escapes@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e"
+ integrity sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-unicode-property-regex@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd"
+ integrity sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-unicode-regex@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f"
+ integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-unicode-sets-regex@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz#d40705d67523803a576e29c63cef6e516b858ed9"
+ integrity sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/preset-env@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.8.tgz#e0db94d7f17d6f0e2564e8d29190bc8cdacec2d1"
+ integrity sha512-vObvMZB6hNWuDxhSaEPTKCwcqkAIuDtE+bQGn4XMXne1DSLzFVY8Vmj1bm+mUQXYNN8NmaQEO+r8MMbzPr1jBQ==
+ dependencies:
+ "@babel/compat-data" "^7.24.8"
+ "@babel/helper-compilation-targets" "^7.24.8"
+ "@babel/helper-plugin-utils" "^7.24.8"
+ "@babel/helper-validator-option" "^7.24.8"
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.7"
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.7"
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7"
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.7"
+ "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+ "@babel/plugin-syntax-class-properties" "^7.12.13"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+ "@babel/plugin-syntax-import-assertions" "^7.24.7"
+ "@babel/plugin-syntax-import-attributes" "^7.24.7"
+ "@babel/plugin-syntax-import-meta" "^7.10.4"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+ "@babel/plugin-syntax-top-level-await" "^7.14.5"
+ "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6"
+ "@babel/plugin-transform-arrow-functions" "^7.24.7"
+ "@babel/plugin-transform-async-generator-functions" "^7.24.7"
+ "@babel/plugin-transform-async-to-generator" "^7.24.7"
+ "@babel/plugin-transform-block-scoped-functions" "^7.24.7"
+ "@babel/plugin-transform-block-scoping" "^7.24.7"
+ "@babel/plugin-transform-class-properties" "^7.24.7"
+ "@babel/plugin-transform-class-static-block" "^7.24.7"
+ "@babel/plugin-transform-classes" "^7.24.8"
+ "@babel/plugin-transform-computed-properties" "^7.24.7"
+ "@babel/plugin-transform-destructuring" "^7.24.8"
+ "@babel/plugin-transform-dotall-regex" "^7.24.7"
+ "@babel/plugin-transform-duplicate-keys" "^7.24.7"
+ "@babel/plugin-transform-dynamic-import" "^7.24.7"
+ "@babel/plugin-transform-exponentiation-operator" "^7.24.7"
+ "@babel/plugin-transform-export-namespace-from" "^7.24.7"
+ "@babel/plugin-transform-for-of" "^7.24.7"
+ "@babel/plugin-transform-function-name" "^7.24.7"
+ "@babel/plugin-transform-json-strings" "^7.24.7"
+ "@babel/plugin-transform-literals" "^7.24.7"
+ "@babel/plugin-transform-logical-assignment-operators" "^7.24.7"
+ "@babel/plugin-transform-member-expression-literals" "^7.24.7"
+ "@babel/plugin-transform-modules-amd" "^7.24.7"
+ "@babel/plugin-transform-modules-commonjs" "^7.24.8"
+ "@babel/plugin-transform-modules-systemjs" "^7.24.7"
+ "@babel/plugin-transform-modules-umd" "^7.24.7"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7"
+ "@babel/plugin-transform-new-target" "^7.24.7"
+ "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.7"
+ "@babel/plugin-transform-numeric-separator" "^7.24.7"
+ "@babel/plugin-transform-object-rest-spread" "^7.24.7"
+ "@babel/plugin-transform-object-super" "^7.24.7"
+ "@babel/plugin-transform-optional-catch-binding" "^7.24.7"
+ "@babel/plugin-transform-optional-chaining" "^7.24.8"
+ "@babel/plugin-transform-parameters" "^7.24.7"
+ "@babel/plugin-transform-private-methods" "^7.24.7"
+ "@babel/plugin-transform-private-property-in-object" "^7.24.7"
+ "@babel/plugin-transform-property-literals" "^7.24.7"
+ "@babel/plugin-transform-regenerator" "^7.24.7"
+ "@babel/plugin-transform-reserved-words" "^7.24.7"
+ "@babel/plugin-transform-shorthand-properties" "^7.24.7"
+ "@babel/plugin-transform-spread" "^7.24.7"
+ "@babel/plugin-transform-sticky-regex" "^7.24.7"
+ "@babel/plugin-transform-template-literals" "^7.24.7"
+ "@babel/plugin-transform-typeof-symbol" "^7.24.8"
+ "@babel/plugin-transform-unicode-escapes" "^7.24.7"
+ "@babel/plugin-transform-unicode-property-regex" "^7.24.7"
+ "@babel/plugin-transform-unicode-regex" "^7.24.7"
+ "@babel/plugin-transform-unicode-sets-regex" "^7.24.7"
+ "@babel/preset-modules" "0.1.6-no-external-plugins"
+ babel-plugin-polyfill-corejs2 "^0.4.10"
+ babel-plugin-polyfill-corejs3 "^0.10.4"
+ babel-plugin-polyfill-regenerator "^0.6.1"
+ core-js-compat "^3.37.1"
+ semver "^6.3.1"
+
+"@babel/preset-modules@0.1.6-no-external-plugins":
+ version "0.1.6-no-external-plugins"
+ resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a"
+ integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/types" "^7.4.4"
+ esutils "^2.0.2"
+
+"@babel/regjsgen@^0.8.0":
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310"
+ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==
+
+"@babel/runtime@^7.8.4":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.8.tgz#5d958c3827b13cc6d05e038c07fb2e5e3420d82e"
+ integrity sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==
+ dependencies:
+ regenerator-runtime "^0.14.0"
+
+"@babel/template@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315"
+ integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==
+ dependencies:
+ "@babel/code-frame" "^7.24.7"
+ "@babel/parser" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
+"@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.8.tgz#6c14ed5232b7549df3371d820fbd9abfcd7dfab7"
+ integrity sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==
+ dependencies:
+ "@babel/code-frame" "^7.24.7"
+ "@babel/generator" "^7.24.8"
+ "@babel/helper-environment-visitor" "^7.24.7"
+ "@babel/helper-function-name" "^7.24.7"
+ "@babel/helper-hoist-variables" "^7.24.7"
+ "@babel/helper-split-export-declaration" "^7.24.7"
+ "@babel/parser" "^7.24.8"
+ "@babel/types" "^7.24.8"
+ debug "^4.3.1"
+ globals "^11.1.0"
+
+"@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.24.9", "@babel/types@^7.4.4":
+ version "7.24.9"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.9.tgz#228ce953d7b0d16646e755acf204f4cf3d08cc73"
+ integrity sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==
+ dependencies:
+ "@babel/helper-string-parser" "^7.24.8"
+ "@babel/helper-validator-identifier" "^7.24.7"
+ to-fast-properties "^2.0.0"
+
+"@discoveryjs/json-ext@^0.5.0":
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70"
+ integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==
+
+"@isaacs/cliui@^8.0.2":
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550"
+ integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==
+ dependencies:
+ string-width "^5.1.2"
+ string-width-cjs "npm:string-width@^4.2.0"
+ strip-ansi "^7.0.1"
+ strip-ansi-cjs "npm:strip-ansi@^6.0.1"
+ wrap-ansi "^8.1.0"
+ wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
+
+"@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36"
+ integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
+ dependencies:
+ "@jridgewell/set-array" "^1.2.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
+ integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
+
+"@jridgewell/set-array@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280"
+ integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
+
+"@jridgewell/source-map@^0.3.3":
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a"
+ integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.25"
+
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
+ integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
+
+"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
+ version "0.3.25"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
+ integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@jsonjoy.com/base64@^1.1.1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@jsonjoy.com/base64/-/base64-1.1.2.tgz#cf8ea9dcb849b81c95f14fc0aaa151c6b54d2578"
+ integrity sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==
+
+"@jsonjoy.com/json-pack@^1.0.3":
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pack/-/json-pack-1.0.4.tgz#ab59c642a2e5368e8bcfd815d817143d4f3035d0"
+ integrity sha512-aOcSN4MeAtFROysrbqG137b7gaDDSmVrl5mpo6sT/w+kcXpWnzhMjmY/Fh/sDx26NBxyIE7MB1seqLeCAzy9Sg==
+ dependencies:
+ "@jsonjoy.com/base64" "^1.1.1"
+ "@jsonjoy.com/util" "^1.1.2"
+ hyperdyperid "^1.2.0"
+ thingies "^1.20.0"
+
+"@jsonjoy.com/util@^1.1.2":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@jsonjoy.com/util/-/util-1.2.0.tgz#0fe9a92de72308c566ebcebe8b5a3f01d3149df2"
+ integrity sha512-4B8B+3vFsY4eo33DMKyJPlQ3sBMpPFUZK2dr3O3rXrOGKKbYG44J0XSFkDo1VOQiri5HFEhIeVvItjR2xcazmg==
+
+"@leichtgewicht/ip-codec@^2.0.1":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1"
+ integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==
+
+"@pkgjs/parseargs@^0.11.0":
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
+ integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
+
+"@trysound/sax@0.2.0":
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad"
+ integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
+
+"@types/body-parser@*":
+ version "1.19.5"
+ resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4"
+ integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==
+ dependencies:
+ "@types/connect" "*"
+ "@types/node" "*"
+
+"@types/bonjour@^3.5.13":
+ version "3.5.13"
+ resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956"
+ integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/connect-history-api-fallback@^1.5.4":
+ version "1.5.4"
+ resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3"
+ integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==
+ dependencies:
+ "@types/express-serve-static-core" "*"
+ "@types/node" "*"
+
+"@types/connect@*":
+ version "3.4.38"
+ resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858"
+ integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==
+ dependencies:
+ "@types/node" "*"
+
+"@types/eslint-scope@^3.7.3":
+ version "3.7.7"
+ resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5"
+ integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==
+ dependencies:
+ "@types/eslint" "*"
+ "@types/estree" "*"
+
+"@types/eslint@*":
+ version "8.56.10"
+ resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.10.tgz#eb2370a73bf04a901eeba8f22595c7ee0f7eb58d"
+ integrity sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==
+ dependencies:
+ "@types/estree" "*"
+ "@types/json-schema" "*"
+
+"@types/estree@*", "@types/estree@^1.0.5":
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4"
+ integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
+
+"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33":
+ version "4.19.5"
+ resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6"
+ integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==
+ dependencies:
+ "@types/node" "*"
+ "@types/qs" "*"
+ "@types/range-parser" "*"
+ "@types/send" "*"
+
+"@types/express@*", "@types/express@^4.17.21":
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d"
+ integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==
+ dependencies:
+ "@types/body-parser" "*"
+ "@types/express-serve-static-core" "^4.17.33"
+ "@types/qs" "*"
+ "@types/serve-static" "*"
+
+"@types/html-minifier-terser@^6.0.0":
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35"
+ integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==
+
+"@types/http-errors@*":
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f"
+ integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==
+
+"@types/http-proxy@^1.17.8":
+ version "1.17.14"
+ resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.14.tgz#57f8ccaa1c1c3780644f8a94f9c6b5000b5e2eec"
+ integrity sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==
+ dependencies:
+ "@types/node" "*"
+
+"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
+ version "7.0.15"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
+ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
+
+"@types/mime@^1":
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690"
+ integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==
+
+"@types/node-forge@^1.3.0":
+ version "1.3.11"
+ resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da"
+ integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/node@*":
+ version "20.14.10"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.10.tgz#a1a218290f1b6428682e3af044785e5874db469a"
+ integrity sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==
+ dependencies:
+ undici-types "~5.26.4"
+
+"@types/qs@*":
+ version "6.9.15"
+ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce"
+ integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==
+
+"@types/range-parser@*":
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb"
+ integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==
+
+"@types/retry@0.12.2":
+ version "0.12.2"
+ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.2.tgz#ed279a64fa438bb69f2480eda44937912bb7480a"
+ integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==
+
+"@types/send@*":
+ version "0.17.4"
+ resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a"
+ integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==
+ dependencies:
+ "@types/mime" "^1"
+ "@types/node" "*"
+
+"@types/serve-index@^1.9.4":
+ version "1.9.4"
+ resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898"
+ integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==
+ dependencies:
+ "@types/express" "*"
+
+"@types/serve-static@*", "@types/serve-static@^1.15.5":
+ version "1.15.7"
+ resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714"
+ integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==
+ dependencies:
+ "@types/http-errors" "*"
+ "@types/node" "*"
+ "@types/send" "*"
+
+"@types/sockjs@^0.3.36":
+ version "0.3.36"
+ resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535"
+ integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==
+ dependencies:
+ "@types/node" "*"
+
+"@types/ws@^8.5.10":
+ version "8.5.11"
+ resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.11.tgz#90ad17b3df7719ce3e6bc32f83ff954d38656508"
+ integrity sha512-4+q7P5h3SpJxaBft0Dzpbr6lmMaqh0Jr2tbhJZ/luAwvD7ohSCniYkwz/pLxuT2h0EOa6QADgJj1Ko+TzRfZ+w==
+ dependencies:
+ "@types/node" "*"
+
+"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1":
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb"
+ integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==
+ dependencies:
+ "@webassemblyjs/helper-numbers" "1.11.6"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
+
+"@webassemblyjs/floating-point-hex-parser@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431"
+ integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==
+
+"@webassemblyjs/helper-api-error@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768"
+ integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==
+
+"@webassemblyjs/helper-buffer@1.12.1":
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6"
+ integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==
+
+"@webassemblyjs/helper-numbers@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5"
+ integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==
+ dependencies:
+ "@webassemblyjs/floating-point-hex-parser" "1.11.6"
+ "@webassemblyjs/helper-api-error" "1.11.6"
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/helper-wasm-bytecode@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9"
+ integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==
+
+"@webassemblyjs/helper-wasm-section@1.12.1":
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf"
+ integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==
+ dependencies:
+ "@webassemblyjs/ast" "1.12.1"
+ "@webassemblyjs/helper-buffer" "1.12.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
+ "@webassemblyjs/wasm-gen" "1.12.1"
+
+"@webassemblyjs/ieee754@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a"
+ integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==
+ dependencies:
+ "@xtuc/ieee754" "^1.2.0"
+
+"@webassemblyjs/leb128@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7"
+ integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==
+ dependencies:
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/utf8@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a"
+ integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==
+
+"@webassemblyjs/wasm-edit@^1.12.1":
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b"
+ integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==
+ dependencies:
+ "@webassemblyjs/ast" "1.12.1"
+ "@webassemblyjs/helper-buffer" "1.12.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
+ "@webassemblyjs/helper-wasm-section" "1.12.1"
+ "@webassemblyjs/wasm-gen" "1.12.1"
+ "@webassemblyjs/wasm-opt" "1.12.1"
+ "@webassemblyjs/wasm-parser" "1.12.1"
+ "@webassemblyjs/wast-printer" "1.12.1"
+
+"@webassemblyjs/wasm-gen@1.12.1":
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547"
+ integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==
+ dependencies:
+ "@webassemblyjs/ast" "1.12.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
+ "@webassemblyjs/ieee754" "1.11.6"
+ "@webassemblyjs/leb128" "1.11.6"
+ "@webassemblyjs/utf8" "1.11.6"
+
+"@webassemblyjs/wasm-opt@1.12.1":
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5"
+ integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==
+ dependencies:
+ "@webassemblyjs/ast" "1.12.1"
+ "@webassemblyjs/helper-buffer" "1.12.1"
+ "@webassemblyjs/wasm-gen" "1.12.1"
+ "@webassemblyjs/wasm-parser" "1.12.1"
+
+"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1":
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937"
+ integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==
+ dependencies:
+ "@webassemblyjs/ast" "1.12.1"
+ "@webassemblyjs/helper-api-error" "1.11.6"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
+ "@webassemblyjs/ieee754" "1.11.6"
+ "@webassemblyjs/leb128" "1.11.6"
+ "@webassemblyjs/utf8" "1.11.6"
+
+"@webassemblyjs/wast-printer@1.12.1":
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac"
+ integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==
+ dependencies:
+ "@webassemblyjs/ast" "1.12.1"
+ "@xtuc/long" "4.2.2"
+
+"@webpack-cli/configtest@^2.1.1":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz#3b2f852e91dac6e3b85fb2a314fb8bef46d94646"
+ integrity sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==
+
+"@webpack-cli/info@^2.0.2":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.2.tgz#cc3fbf22efeb88ff62310cf885c5b09f44ae0fdd"
+ integrity sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==
+
+"@webpack-cli/serve@^2.0.5":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e"
+ integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==
+
+"@xtuc/ieee754@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
+ integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
+
+"@xtuc/long@4.2.2":
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
+ integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
+
+accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
+ integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
+ dependencies:
+ mime-types "~2.1.34"
+ negotiator "0.6.3"
+
+acorn-import-attributes@^1.9.5:
+ version "1.9.5"
+ resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef"
+ integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==
+
+acorn@^8.7.1, acorn@^8.8.2:
+ version "8.12.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248"
+ integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==
+
+ajv-formats@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520"
+ integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==
+ dependencies:
+ ajv "^8.0.0"
+
+ajv-keywords@^3.5.2:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
+ integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
+
+ajv-keywords@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16"
+ integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==
+ dependencies:
+ fast-deep-equal "^3.1.3"
+
+ajv@^6.12.5:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ajv@^8.0.0, ajv@^8.9.0:
+ version "8.17.1"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6"
+ integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==
+ dependencies:
+ fast-deep-equal "^3.1.3"
+ fast-uri "^3.0.1"
+ json-schema-traverse "^1.0.0"
+ require-from-string "^2.0.2"
+
+ansi-html-community@^0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41"
+ integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-regex@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a"
+ integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+ansi-styles@^6.1.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
+ integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
+
+anymatch@~3.1.2:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
+ integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==
+
+babel-loader@^9.1.3:
+ version "9.1.3"
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.3.tgz#3d0e01b4e69760cc694ee306fe16d358aa1c6f9a"
+ integrity sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==
+ dependencies:
+ find-cache-dir "^4.0.0"
+ schema-utils "^4.0.0"
+
+babel-plugin-polyfill-corejs2@^0.4.10:
+ version "0.4.11"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33"
+ integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==
+ dependencies:
+ "@babel/compat-data" "^7.22.6"
+ "@babel/helper-define-polyfill-provider" "^0.6.2"
+ semver "^6.3.1"
+
+babel-plugin-polyfill-corejs3@^0.10.4:
+ version "0.10.4"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz#789ac82405ad664c20476d0233b485281deb9c77"
+ integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.6.1"
+ core-js-compat "^3.36.1"
+
+babel-plugin-polyfill-regenerator@^0.6.1:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e"
+ integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.6.2"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+batch@0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
+ integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==
+
+binary-extensions@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
+ integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
+
+body-parser@1.20.2:
+ version "1.20.2"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd"
+ integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==
+ dependencies:
+ bytes "3.1.2"
+ content-type "~1.0.5"
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ on-finished "2.4.1"
+ qs "6.11.0"
+ raw-body "2.5.2"
+ type-is "~1.6.18"
+ unpipe "1.0.0"
+
+bonjour-service@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.2.1.tgz#eb41b3085183df3321da1264719fbada12478d02"
+ integrity sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==
+ dependencies:
+ fast-deep-equal "^3.1.3"
+ multicast-dns "^7.2.5"
+
+boolbase@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+ integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==
+
+brace-expansion@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
+ integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+ dependencies:
+ balanced-match "^1.0.0"
+
+braces@^3.0.3, braces@~3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
+ integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
+ dependencies:
+ fill-range "^7.1.1"
+
+browserslist@^4.0.0, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.23.0, browserslist@^4.23.1:
+ version "4.23.2"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.2.tgz#244fe803641f1c19c28c48c4b6ec9736eb3d32ed"
+ integrity sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==
+ dependencies:
+ caniuse-lite "^1.0.30001640"
+ electron-to-chromium "^1.4.820"
+ node-releases "^2.0.14"
+ update-browserslist-db "^1.1.0"
+
+buffer-from@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+bundle-name@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889"
+ integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==
+ dependencies:
+ run-applescript "^7.0.0"
+
+bytes@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
+ integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==
+
+bytes@3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
+ integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
+
+call-bind@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9"
+ integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==
+ dependencies:
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ set-function-length "^1.2.1"
+
+camel-case@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a"
+ integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==
+ dependencies:
+ pascal-case "^3.1.2"
+ tslib "^2.0.3"
+
+caniuse-api@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
+ integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-lite "^1.0.0"
+ lodash.memoize "^4.1.2"
+ lodash.uniq "^4.5.0"
+
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001640:
+ version "1.0.30001642"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz#6aa6610eb24067c246d30c57f055a9d0a7f8d05f"
+ integrity sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==
+
+chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chokidar@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
+ integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+chrome-trace-event@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b"
+ integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==
+
+clean-css@^5.2.2, clean-css@~5.3.2:
+ version "5.3.3"
+ resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd"
+ integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==
+ dependencies:
+ source-map "~0.6.0"
+
+clone-deep@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
+ integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==
+ dependencies:
+ is-plain-object "^2.0.4"
+ kind-of "^6.0.2"
+ shallow-clone "^3.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+colord@^2.9.1:
+ version "2.9.3"
+ resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43"
+ integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==
+
+colorette@^2.0.10, colorette@^2.0.14:
+ version "2.0.20"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a"
+ integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==
+
+commander@^10.0.0, commander@^10.0.1:
+ version "10.0.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06"
+ integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==
+
+commander@^2.20.0:
+ version "2.20.3"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+commander@^7.2.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
+ integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
+
+commander@^8.3.0:
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66"
+ integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==
+
+common-path-prefix@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0"
+ integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==
+
+compressible@~2.0.16:
+ version "2.0.18"
+ resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba"
+ integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==
+ dependencies:
+ mime-db ">= 1.43.0 < 2"
+
+compression@^1.7.4:
+ version "1.7.4"
+ resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f"
+ integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==
+ dependencies:
+ accepts "~1.3.5"
+ bytes "3.0.0"
+ compressible "~2.0.16"
+ debug "2.6.9"
+ on-headers "~1.0.2"
+ safe-buffer "5.1.2"
+ vary "~1.1.2"
+
+connect-history-api-fallback@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8"
+ integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==
+
+content-disposition@0.5.4:
+ version "0.5.4"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
+ integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
+ dependencies:
+ safe-buffer "5.2.1"
+
+content-type@~1.0.4, content-type@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918"
+ integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
+
+convert-source-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
+ integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
+
+cookie@0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051"
+ integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==
+
+core-js-compat@^3.36.1, core-js-compat@^3.37.1:
+ version "3.37.1"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.1.tgz#c844310c7852f4bdf49b8d339730b97e17ff09ee"
+ integrity sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==
+ dependencies:
+ browserslist "^4.23.0"
+
+core-util-is@~1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
+ integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
+
+cross-spawn@^7.0.0, cross-spawn@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+css-declaration-sorter@^6.3.1:
+ version "6.4.1"
+ resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz#28beac7c20bad7f1775be3a7129d7eae409a3a71"
+ integrity sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==
+
+css-loader@^7.1.2:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-7.1.2.tgz#64671541c6efe06b0e22e750503106bdd86880f8"
+ integrity sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==
+ dependencies:
+ icss-utils "^5.1.0"
+ postcss "^8.4.33"
+ postcss-modules-extract-imports "^3.1.0"
+ postcss-modules-local-by-default "^4.0.5"
+ postcss-modules-scope "^3.2.0"
+ postcss-modules-values "^4.0.0"
+ postcss-value-parser "^4.2.0"
+ semver "^7.5.4"
+
+css-select@^4.1.3:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b"
+ integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==
+ dependencies:
+ boolbase "^1.0.0"
+ css-what "^6.0.1"
+ domhandler "^4.3.1"
+ domutils "^2.8.0"
+ nth-check "^2.0.1"
+
+css-tree@^1.1.2, css-tree@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d"
+ integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==
+ dependencies:
+ mdn-data "2.0.14"
+ source-map "^0.6.1"
+
+css-what@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4"
+ integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==
+
+cssesc@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
+ integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+
+cssnano-preset-default@^5.2.14:
+ version "5.2.14"
+ resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8"
+ integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==
+ dependencies:
+ css-declaration-sorter "^6.3.1"
+ cssnano-utils "^3.1.0"
+ postcss-calc "^8.2.3"
+ postcss-colormin "^5.3.1"
+ postcss-convert-values "^5.1.3"
+ postcss-discard-comments "^5.1.2"
+ postcss-discard-duplicates "^5.1.0"
+ postcss-discard-empty "^5.1.1"
+ postcss-discard-overridden "^5.1.0"
+ postcss-merge-longhand "^5.1.7"
+ postcss-merge-rules "^5.1.4"
+ postcss-minify-font-values "^5.1.0"
+ postcss-minify-gradients "^5.1.1"
+ postcss-minify-params "^5.1.4"
+ postcss-minify-selectors "^5.2.1"
+ postcss-normalize-charset "^5.1.0"
+ postcss-normalize-display-values "^5.1.0"
+ postcss-normalize-positions "^5.1.1"
+ postcss-normalize-repeat-style "^5.1.1"
+ postcss-normalize-string "^5.1.0"
+ postcss-normalize-timing-functions "^5.1.0"
+ postcss-normalize-unicode "^5.1.1"
+ postcss-normalize-url "^5.1.0"
+ postcss-normalize-whitespace "^5.1.1"
+ postcss-ordered-values "^5.1.3"
+ postcss-reduce-initial "^5.1.2"
+ postcss-reduce-transforms "^5.1.0"
+ postcss-svgo "^5.1.0"
+ postcss-unique-selectors "^5.1.1"
+
+cssnano-utils@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861"
+ integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==
+
+cssnano@^5.0.2:
+ version "5.1.15"
+ resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf"
+ integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==
+ dependencies:
+ cssnano-preset-default "^5.2.14"
+ lilconfig "^2.0.3"
+ yaml "^1.10.2"
+
+csso@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529"
+ integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==
+ dependencies:
+ css-tree "^1.1.2"
+
+debug@2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@^4.1.0, debug@^4.1.1, debug@^4.3.1:
+ version "4.3.5"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e"
+ integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==
+ dependencies:
+ ms "2.1.2"
+
+default-browser-id@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.0.tgz#a1d98bf960c15082d8a3fa69e83150ccccc3af26"
+ integrity sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==
+
+default-browser@^5.2.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.2.1.tgz#7b7ba61204ff3e425b556869ae6d3e9d9f1712cf"
+ integrity sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==
+ dependencies:
+ bundle-name "^4.1.0"
+ default-browser-id "^5.0.0"
+
+default-gateway@^6.0.3:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71"
+ integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==
+ dependencies:
+ execa "^5.0.0"
+
+define-data-property@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
+ integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
+ dependencies:
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ gopd "^1.0.1"
+
+define-lazy-prop@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f"
+ integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==
+
+depd@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==
+
+destroy@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
+ integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
+
+detect-node@^2.0.4:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1"
+ integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==
+
+dns-packet@^5.2.2:
+ version "5.6.1"
+ resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f"
+ integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==
+ dependencies:
+ "@leichtgewicht/ip-codec" "^2.0.1"
+
+dom-converter@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768"
+ integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==
+ dependencies:
+ utila "~0.4"
+
+dom-serializer@^1.0.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30"
+ integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==
+ dependencies:
+ domelementtype "^2.0.1"
+ domhandler "^4.2.0"
+ entities "^2.0.0"
+
+domelementtype@^2.0.1, domelementtype@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d"
+ integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
+
+domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c"
+ integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==
+ dependencies:
+ domelementtype "^2.2.0"
+
+domutils@^2.5.2, domutils@^2.8.0:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135"
+ integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==
+ dependencies:
+ dom-serializer "^1.0.1"
+ domelementtype "^2.2.0"
+ domhandler "^4.2.0"
+
+dot-case@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751"
+ integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==
+ dependencies:
+ no-case "^3.0.4"
+ tslib "^2.0.3"
+
+eastasianwidth@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
+ integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
+
+electron-to-chromium@^1.4.820:
+ version "1.4.828"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.828.tgz#a1ee8cd8847448b2898d3f2d9db02113f9c5b35c"
+ integrity sha512-QOIJiWpQJDHAVO4P58pwb133Cwee0nbvy/MV1CwzZVGpkH1RX33N3vsaWRCpR6bF63AAq366neZrRTu7Qlsbbw==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+emoji-regex@^9.2.2:
+ version "9.2.2"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
+ integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
+
+enhanced-resolve@^5.17.0:
+ version "5.17.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz#d037603789dd9555b89aaec7eb78845c49089bc5"
+ integrity sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==
+ dependencies:
+ graceful-fs "^4.2.4"
+ tapable "^2.2.0"
+
+entities@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
+ integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
+
+entities@^4.4.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
+ integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
+
+envinfo@^7.7.3:
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.13.0.tgz#81fbb81e5da35d74e814941aeab7c325a606fb31"
+ integrity sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==
+
+es-define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845"
+ integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==
+ dependencies:
+ get-intrinsic "^1.2.4"
+
+es-errors@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
+ integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
+
+es-module-lexer@^1.2.1:
+ version "1.5.4"
+ resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78"
+ integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==
+
+escalade@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27"
+ integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+eslint-scope@5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
+ integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^4.1.1"
+
+esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^4.1.1:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
+
+eventemitter3@^4.0.0:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
+ integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
+
+events@^3.2.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+execa@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
+ integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
+ dependencies:
+ cross-spawn "^7.0.3"
+ get-stream "^6.0.0"
+ human-signals "^2.1.0"
+ is-stream "^2.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^4.0.1"
+ onetime "^5.1.2"
+ signal-exit "^3.0.3"
+ strip-final-newline "^2.0.0"
+
+express@^4.17.3:
+ version "4.19.2"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465"
+ integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==
+ dependencies:
+ accepts "~1.3.8"
+ array-flatten "1.1.1"
+ body-parser "1.20.2"
+ content-disposition "0.5.4"
+ content-type "~1.0.4"
+ cookie "0.6.0"
+ cookie-signature "1.0.6"
+ debug "2.6.9"
+ depd "2.0.0"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ finalhandler "1.2.0"
+ fresh "0.5.2"
+ http-errors "2.0.0"
+ merge-descriptors "1.0.1"
+ methods "~1.1.2"
+ on-finished "2.4.1"
+ parseurl "~1.3.3"
+ path-to-regexp "0.1.7"
+ proxy-addr "~2.0.7"
+ qs "6.11.0"
+ range-parser "~1.2.1"
+ safe-buffer "5.2.1"
+ send "0.18.0"
+ serve-static "1.15.0"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ type-is "~1.6.18"
+ utils-merge "1.0.1"
+ vary "~1.1.2"
+
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-uri@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134"
+ integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==
+
+fastest-levenshtein@^1.0.12:
+ version "1.0.16"
+ resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5"
+ integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==
+
+faye-websocket@^0.11.3:
+ version "0.11.4"
+ resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da"
+ integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==
+ dependencies:
+ websocket-driver ">=0.5.1"
+
+fill-range@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
+ integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+finalhandler@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32"
+ integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==
+ dependencies:
+ debug "2.6.9"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ on-finished "2.4.1"
+ parseurl "~1.3.3"
+ statuses "2.0.1"
+ unpipe "~1.0.0"
+
+find-cache-dir@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-4.0.0.tgz#a30ee0448f81a3990708f6453633c733e2f6eec2"
+ integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==
+ dependencies:
+ common-path-prefix "^3.0.0"
+ pkg-dir "^7.0.0"
+
+find-up@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
+find-up@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790"
+ integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==
+ dependencies:
+ locate-path "^7.1.0"
+ path-exists "^5.0.0"
+
+flat@^5.0.2:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241"
+ integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
+
+follow-redirects@^1.0.0:
+ version "1.15.6"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b"
+ integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==
+
+foreground-child@^3.1.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7"
+ integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==
+ dependencies:
+ cross-spawn "^7.0.0"
+ signal-exit "^4.0.1"
+
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
+
+fsevents@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-intrinsic@^1.1.3, get-intrinsic@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd"
+ integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
+ dependencies:
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+ hasown "^2.0.0"
+
+get-stream@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
+ integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+
+glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob-to-regexp@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
+ integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
+
+glob@^10.3.7:
+ version "10.4.5"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956"
+ integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==
+ dependencies:
+ foreground-child "^3.1.0"
+ jackspeak "^3.1.2"
+ minimatch "^9.0.4"
+ minipass "^7.1.2"
+ package-json-from-dist "^1.0.0"
+ path-scurry "^1.11.1"
+
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+gopd@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
+ integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+ dependencies:
+ get-intrinsic "^1.1.3"
+
+graceful-fs@^4.1.2, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6:
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+handle-thing@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e"
+ integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-property-descriptors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854"
+ integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
+ dependencies:
+ es-define-property "^1.0.0"
+
+has-proto@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd"
+ integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==
+
+has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+hasown@^2.0.0, hasown@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
+ integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
+ dependencies:
+ function-bind "^1.1.2"
+
+he@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+ integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+hpack.js@^2.1.6:
+ version "2.1.6"
+ resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2"
+ integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==
+ dependencies:
+ inherits "^2.0.1"
+ obuf "^1.0.0"
+ readable-stream "^2.0.1"
+ wbuf "^1.1.0"
+
+html-entities@^2.4.0:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.5.2.tgz#201a3cf95d3a15be7099521620d19dfb4f65359f"
+ integrity sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==
+
+html-loader@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-5.0.0.tgz#2bb3ed423e9ea10f24add5d1a563adc5a8fc7f00"
+ integrity sha512-puaGKdjdVVIFRtgIC2n5dt5bt0N5j6heXlAQZ4Do1MLjHmOT1gCE1Ogg7XZNeJlnOVHHsrZKGs5dfh+XwZ3XPw==
+ dependencies:
+ html-minifier-terser "^7.2.0"
+ parse5 "^7.1.2"
+
+html-minifier-terser@^6.0.2:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab"
+ integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==
+ dependencies:
+ camel-case "^4.1.2"
+ clean-css "^5.2.2"
+ commander "^8.3.0"
+ he "^1.2.0"
+ param-case "^3.0.4"
+ relateurl "^0.2.7"
+ terser "^5.10.0"
+
+html-minifier-terser@^7.2.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz#18752e23a2f0ed4b0f550f217bb41693e975b942"
+ integrity sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==
+ dependencies:
+ camel-case "^4.1.2"
+ clean-css "~5.3.2"
+ commander "^10.0.0"
+ entities "^4.4.0"
+ param-case "^3.0.4"
+ relateurl "^0.2.7"
+ terser "^5.15.1"
+
+html-webpack-plugin@^5.6.0:
+ version "5.6.0"
+ resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz#50a8fa6709245608cb00e811eacecb8e0d7b7ea0"
+ integrity sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==
+ dependencies:
+ "@types/html-minifier-terser" "^6.0.0"
+ html-minifier-terser "^6.0.2"
+ lodash "^4.17.21"
+ pretty-error "^4.0.0"
+ tapable "^2.0.0"
+
+htmlparser2@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7"
+ integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==
+ dependencies:
+ domelementtype "^2.0.1"
+ domhandler "^4.0.0"
+ domutils "^2.5.2"
+ entities "^2.0.0"
+
+http-deceiver@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
+ integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==
+
+http-errors@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
+ integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
+ dependencies:
+ depd "2.0.0"
+ inherits "2.0.4"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ toidentifier "1.0.1"
+
+http-errors@~1.6.2:
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
+ integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.0"
+ statuses ">= 1.4.0 < 2"
+
+http-parser-js@>=0.5.1:
+ version "0.5.8"
+ resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3"
+ integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==
+
+http-proxy-middleware@^2.0.3:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f"
+ integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==
+ dependencies:
+ "@types/http-proxy" "^1.17.8"
+ http-proxy "^1.18.1"
+ is-glob "^4.0.1"
+ is-plain-obj "^3.0.0"
+ micromatch "^4.0.2"
+
+http-proxy@^1.18.1:
+ version "1.18.1"
+ resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
+ integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==
+ dependencies:
+ eventemitter3 "^4.0.0"
+ follow-redirects "^1.0.0"
+ requires-port "^1.0.0"
+
+human-signals@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
+ integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
+
+hyperdyperid@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/hyperdyperid/-/hyperdyperid-1.2.0.tgz#59668d323ada92228d2a869d3e474d5a33b69e6b"
+ integrity sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==
+
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+icss-utils@^5.0.0, icss-utils@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae"
+ integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==
+
+import-local@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4"
+ integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==
+ dependencies:
+ pkg-dir "^4.2.0"
+ resolve-cwd "^3.0.0"
+
+inherits@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+ integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==
+
+inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+interpret@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4"
+ integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==
+
+ipaddr.js@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+ipaddr.js@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8"
+ integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-core-module@^2.13.0:
+ version "2.14.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1"
+ integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==
+ dependencies:
+ hasown "^2.0.2"
+
+is-docker@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200"
+ integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-glob@^4.0.1, is-glob@~4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-inside-container@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4"
+ integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==
+ dependencies:
+ is-docker "^3.0.0"
+
+is-network-error@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-network-error/-/is-network-error-1.1.0.tgz#d26a760e3770226d11c169052f266a4803d9c997"
+ integrity sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-plain-obj@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7"
+ integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==
+
+is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
+is-stream@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+ integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
+is-wsl@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2"
+ integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==
+ dependencies:
+ is-inside-container "^1.0.0"
+
+isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+ integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
+
+jackspeak@^3.1.2:
+ version "3.4.3"
+ resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a"
+ integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==
+ dependencies:
+ "@isaacs/cliui" "^8.0.2"
+ optionalDependencies:
+ "@pkgjs/parseargs" "^0.11.0"
+
+jest-worker@^27.4.5:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
+ integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
+ dependencies:
+ "@types/node" "*"
+ merge-stream "^2.0.0"
+ supports-color "^8.0.0"
+
+js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+ integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==
+
+json-parse-even-better-errors@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema-traverse@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
+ integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
+
+json5@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+kind-of@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+last-call-webpack-plugin@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555"
+ integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==
+ dependencies:
+ lodash "^4.17.5"
+ webpack-sources "^1.1.0"
+
+launch-editor@^2.6.1:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.8.0.tgz#7255d90bdba414448e2138faa770a74f28451305"
+ integrity sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==
+ dependencies:
+ picocolors "^1.0.0"
+ shell-quote "^1.8.1"
+
+lilconfig@^2.0.3:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52"
+ integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==
+
+loader-runner@^4.2.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1"
+ integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==
+
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
+locate-path@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a"
+ integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==
+ dependencies:
+ p-locate "^6.0.0"
+
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+ integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
+
+lodash.memoize@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+ integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==
+
+lodash.uniq@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+ integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==
+
+lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+lower-case@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28"
+ integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==
+ dependencies:
+ tslib "^2.0.3"
+
+lru-cache@^10.2.0:
+ version "10.4.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119"
+ integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+mdn-data@2.0.14:
+ version "2.0.14"
+ resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50"
+ integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
+
+memfs@^4.6.0:
+ version "4.9.3"
+ resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.9.3.tgz#41a3218065fe3911d9eba836250c8f4e43f816bc"
+ integrity sha512-bsYSSnirtYTWi1+OPMFb0M048evMKyUYe0EbtuGQgq6BVQM1g1W8/KIUJCCvjgI/El0j6Q4WsmMiBwLUBSw8LA==
+ dependencies:
+ "@jsonjoy.com/json-pack" "^1.0.3"
+ "@jsonjoy.com/util" "^1.1.2"
+ tree-dump "^1.0.1"
+ tslib "^2.0.0"
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+ integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==
+
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
+
+micromatch@^4.0.2:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5"
+ integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==
+ dependencies:
+ braces "^3.0.3"
+ picomatch "^2.3.1"
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+"mime-db@>= 1.43.0 < 2":
+ version "1.53.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447"
+ integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==
+
+mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34:
+ version "2.1.35"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+mini-css-extract-plugin@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz#c73a1327ccf466f69026ac22a8e8fd707b78a235"
+ integrity sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==
+ dependencies:
+ schema-utils "^4.0.0"
+ tapable "^2.2.1"
+
+minimalistic-assert@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimatch@^9.0.4:
+ version "9.0.5"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5"
+ integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707"
+ integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@2.1.3:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+multicast-dns@^7.2.5:
+ version "7.2.5"
+ resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced"
+ integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==
+ dependencies:
+ dns-packet "^5.2.2"
+ thunky "^1.0.2"
+
+nanoid@^3.3.7:
+ version "3.3.7"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
+ integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+
+negotiator@0.6.3:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
+ integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
+
+neo-async@^2.6.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+ integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+
+no-case@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d"
+ integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==
+ dependencies:
+ lower-case "^2.0.2"
+ tslib "^2.0.3"
+
+node-forge@^1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3"
+ integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==
+
+node-releases@^2.0.14:
+ version "2.0.14"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b"
+ integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-url@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
+ integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
+
+npm-run-path@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+ integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+ dependencies:
+ path-key "^3.0.0"
+
+nth-check@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d"
+ integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==
+ dependencies:
+ boolbase "^1.0.0"
+
+object-inspect@^1.13.1:
+ version "1.13.2"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff"
+ integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==
+
+obuf@^1.0.0, obuf@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
+ integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==
+
+on-finished@2.4.1, on-finished@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
+ integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
+ dependencies:
+ ee-first "1.1.1"
+
+on-headers@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f"
+ integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
+
+onetime@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+open@^10.0.3:
+ version "10.1.0"
+ resolved "https://registry.yarnpkg.com/open/-/open-10.1.0.tgz#a7795e6e5d519abe4286d9937bb24b51122598e1"
+ integrity sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==
+ dependencies:
+ default-browser "^5.2.1"
+ define-lazy-prop "^3.0.0"
+ is-inside-container "^1.0.0"
+ is-wsl "^3.1.0"
+
+optimize-css-assets-webpack-plugin@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-6.0.1.tgz#7719bceabba1f3891ec3ae04efb81a1cc99cd793"
+ integrity sha512-BshV2UZPfggZLdUfN3zFBbG4sl/DynUI+YCB6fRRDWaqO2OiWN8GPcp4Y0/fEV6B3k9Hzyk3czve3V/8B/SzKQ==
+ dependencies:
+ cssnano "^5.0.2"
+ last-call-webpack-plugin "^3.0.0"
+ postcss "^8.2.1"
+
+p-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-limit@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644"
+ integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==
+ dependencies:
+ yocto-queue "^1.0.0"
+
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
+p-locate@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f"
+ integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==
+ dependencies:
+ p-limit "^4.0.0"
+
+p-retry@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-6.2.0.tgz#8d6df01af298750009691ce2f9b3ad2d5968f3bd"
+ integrity sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==
+ dependencies:
+ "@types/retry" "0.12.2"
+ is-network-error "^1.0.0"
+ retry "^0.13.1"
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+package-json-from-dist@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00"
+ integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==
+
+param-case@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5"
+ integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==
+ dependencies:
+ dot-case "^3.0.4"
+ tslib "^2.0.3"
+
+parse5@^7.1.2:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32"
+ integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==
+ dependencies:
+ entities "^4.4.0"
+
+parseurl@~1.3.2, parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+pascal-case@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb"
+ integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==
+ dependencies:
+ no-case "^3.0.4"
+ tslib "^2.0.3"
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-exists@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7"
+ integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==
+
+path-key@^3.0.0, path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-scurry@^1.11.1:
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2"
+ integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==
+ dependencies:
+ lru-cache "^10.2.0"
+ minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
+
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+ integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==
+
+picocolors@^1.0.0, picocolors@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1"
+ integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pkg-dir@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
+ integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
+ dependencies:
+ find-up "^4.0.0"
+
+pkg-dir@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11"
+ integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==
+ dependencies:
+ find-up "^6.3.0"
+
+postcss-calc@^8.2.3:
+ version "8.2.4"
+ resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5"
+ integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==
+ dependencies:
+ postcss-selector-parser "^6.0.9"
+ postcss-value-parser "^4.2.0"
+
+postcss-colormin@^5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f"
+ integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==
+ dependencies:
+ browserslist "^4.21.4"
+ caniuse-api "^3.0.0"
+ colord "^2.9.1"
+ postcss-value-parser "^4.2.0"
+
+postcss-convert-values@^5.1.3:
+ version "5.1.3"
+ resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393"
+ integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==
+ dependencies:
+ browserslist "^4.21.4"
+ postcss-value-parser "^4.2.0"
+
+postcss-discard-comments@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696"
+ integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==
+
+postcss-discard-duplicates@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848"
+ integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==
+
+postcss-discard-empty@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c"
+ integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==
+
+postcss-discard-overridden@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e"
+ integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==
+
+postcss-merge-longhand@^5.1.7:
+ version "5.1.7"
+ resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16"
+ integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+ stylehacks "^5.1.1"
+
+postcss-merge-rules@^5.1.4:
+ version "5.1.4"
+ resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c"
+ integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==
+ dependencies:
+ browserslist "^4.21.4"
+ caniuse-api "^3.0.0"
+ cssnano-utils "^3.1.0"
+ postcss-selector-parser "^6.0.5"
+
+postcss-minify-font-values@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b"
+ integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+
+postcss-minify-gradients@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c"
+ integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==
+ dependencies:
+ colord "^2.9.1"
+ cssnano-utils "^3.1.0"
+ postcss-value-parser "^4.2.0"
+
+postcss-minify-params@^5.1.4:
+ version "5.1.4"
+ resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352"
+ integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==
+ dependencies:
+ browserslist "^4.21.4"
+ cssnano-utils "^3.1.0"
+ postcss-value-parser "^4.2.0"
+
+postcss-minify-selectors@^5.2.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6"
+ integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==
+ dependencies:
+ postcss-selector-parser "^6.0.5"
+
+postcss-modules-extract-imports@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002"
+ integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==
+
+postcss-modules-local-by-default@^4.0.5:
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz#f1b9bd757a8edf4d8556e8d0f4f894260e3df78f"
+ integrity sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==
+ dependencies:
+ icss-utils "^5.0.0"
+ postcss-selector-parser "^6.0.2"
+ postcss-value-parser "^4.1.0"
+
+postcss-modules-scope@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz#a43d28289a169ce2c15c00c4e64c0858e43457d5"
+ integrity sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==
+ dependencies:
+ postcss-selector-parser "^6.0.4"
+
+postcss-modules-values@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c"
+ integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==
+ dependencies:
+ icss-utils "^5.0.0"
+
+postcss-normalize-charset@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed"
+ integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==
+
+postcss-normalize-display-values@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8"
+ integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+
+postcss-normalize-positions@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92"
+ integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+
+postcss-normalize-repeat-style@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2"
+ integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+
+postcss-normalize-string@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228"
+ integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+
+postcss-normalize-timing-functions@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb"
+ integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+
+postcss-normalize-unicode@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030"
+ integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==
+ dependencies:
+ browserslist "^4.21.4"
+ postcss-value-parser "^4.2.0"
+
+postcss-normalize-url@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc"
+ integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==
+ dependencies:
+ normalize-url "^6.0.1"
+ postcss-value-parser "^4.2.0"
+
+postcss-normalize-whitespace@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa"
+ integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+
+postcss-ordered-values@^5.1.3:
+ version "5.1.3"
+ resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38"
+ integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==
+ dependencies:
+ cssnano-utils "^3.1.0"
+ postcss-value-parser "^4.2.0"
+
+postcss-reduce-initial@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6"
+ integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==
+ dependencies:
+ browserslist "^4.21.4"
+ caniuse-api "^3.0.0"
+
+postcss-reduce-transforms@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9"
+ integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+
+postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz#5be94b277b8955904476a2400260002ce6c56e38"
+ integrity sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==
+ dependencies:
+ cssesc "^3.0.0"
+ util-deprecate "^1.0.2"
+
+postcss-svgo@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d"
+ integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+ svgo "^2.7.0"
+
+postcss-unique-selectors@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6"
+ integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==
+ dependencies:
+ postcss-selector-parser "^6.0.5"
+
+postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
+ integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
+
+postcss@^8.2.1, postcss@^8.4.33:
+ version "8.4.39"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.39.tgz#aa3c94998b61d3a9c259efa51db4b392e1bde0e3"
+ integrity sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==
+ dependencies:
+ nanoid "^3.3.7"
+ picocolors "^1.0.1"
+ source-map-js "^1.2.0"
+
+pretty-error@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6"
+ integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==
+ dependencies:
+ lodash "^4.17.20"
+ renderkid "^3.0.0"
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+proxy-addr@~2.0.7:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
+ dependencies:
+ forwarded "0.2.0"
+ ipaddr.js "1.9.1"
+
+punycode@^2.1.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
+ integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
+
+qs@6.11.0:
+ version "6.11.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a"
+ integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==
+ dependencies:
+ side-channel "^1.0.4"
+
+randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+range-parser@^1.2.1, range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.5.2:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a"
+ integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==
+ dependencies:
+ bytes "3.1.2"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+readable-stream@^2.0.1:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
+ integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readable-stream@^3.0.6:
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
+ integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+rechoir@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22"
+ integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==
+ dependencies:
+ resolve "^1.20.0"
+
+regenerate-unicode-properties@^10.1.0:
+ version "10.1.1"
+ resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480"
+ integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==
+ dependencies:
+ regenerate "^1.4.2"
+
+regenerate@^1.4.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
+ integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
+
+regenerator-runtime@^0.14.0:
+ version "0.14.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
+ integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
+
+regenerator-transform@^0.15.2:
+ version "0.15.2"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4"
+ integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==
+ dependencies:
+ "@babel/runtime" "^7.8.4"
+
+regexpu-core@^5.3.1:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b"
+ integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==
+ dependencies:
+ "@babel/regjsgen" "^0.8.0"
+ regenerate "^1.4.2"
+ regenerate-unicode-properties "^10.1.0"
+ regjsparser "^0.9.1"
+ unicode-match-property-ecmascript "^2.0.0"
+ unicode-match-property-value-ecmascript "^2.1.0"
+
+regjsparser@^0.9.1:
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709"
+ integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==
+ dependencies:
+ jsesc "~0.5.0"
+
+relateurl@^0.2.7:
+ version "0.2.7"
+ resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
+ integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==
+
+renderkid@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a"
+ integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==
+ dependencies:
+ css-select "^4.1.3"
+ dom-converter "^0.2.0"
+ htmlparser2 "^6.1.0"
+ lodash "^4.17.21"
+ strip-ansi "^6.0.1"
+
+require-from-string@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+requires-port@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+ integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
+
+resolve-cwd@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
+ integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
+ dependencies:
+ resolve-from "^5.0.0"
+
+resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
+resolve@^1.14.2, resolve@^1.20.0:
+ version "1.22.8"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
+ integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
+ dependencies:
+ is-core-module "^2.13.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+retry@^0.13.1:
+ version "0.13.1"
+ resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658"
+ integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==
+
+rimraf@^5.0.5:
+ version "5.0.9"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.9.tgz#c3baa1b886eadc2ec7981a06a593c3d01134ffe9"
+ integrity sha512-3i7b8OcswU6CpU8Ej89quJD4O98id7TtVM5U4Mybh84zQXdrFmDLouWBEEaD/QfO3gDDfH+AGFCGsR7kngzQnA==
+ dependencies:
+ glob "^10.3.7"
+
+run-applescript@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.0.0.tgz#e5a553c2bffd620e169d276c1cd8f1b64778fbeb"
+ integrity sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==
+
+safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+schema-utils@^3.1.1, schema-utils@^3.2.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe"
+ integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==
+ dependencies:
+ "@types/json-schema" "^7.0.8"
+ ajv "^6.12.5"
+ ajv-keywords "^3.5.2"
+
+schema-utils@^4.0.0, schema-utils@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b"
+ integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==
+ dependencies:
+ "@types/json-schema" "^7.0.9"
+ ajv "^8.9.0"
+ ajv-formats "^2.1.1"
+ ajv-keywords "^5.1.0"
+
+select-hose@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
+ integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==
+
+selfsigned@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0"
+ integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==
+ dependencies:
+ "@types/node-forge" "^1.3.0"
+ node-forge "^1"
+
+semver@^6.3.1:
+ version "6.3.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+semver@^7.5.4:
+ version "7.6.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13"
+ integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==
+
+send@0.18.0:
+ version "0.18.0"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be"
+ integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==
+ dependencies:
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ fresh "0.5.2"
+ http-errors "2.0.0"
+ mime "1.6.0"
+ ms "2.1.3"
+ on-finished "2.4.1"
+ range-parser "~1.2.1"
+ statuses "2.0.1"
+
+serialize-javascript@^6.0.1:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2"
+ integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==
+ dependencies:
+ randombytes "^2.1.0"
+
+serve-index@^1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"
+ integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==
+ dependencies:
+ accepts "~1.3.4"
+ batch "0.6.1"
+ debug "2.6.9"
+ escape-html "~1.0.3"
+ http-errors "~1.6.2"
+ mime-types "~2.1.17"
+ parseurl "~1.3.2"
+
+serve-static@1.15.0:
+ version "1.15.0"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540"
+ integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.18.0"
+
+set-function-length@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449"
+ integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.2"
+
+setprototypeof@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
+ integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
+
+setprototypeof@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
+shallow-clone@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3"
+ integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==
+ dependencies:
+ kind-of "^6.0.2"
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+shell-quote@^1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680"
+ integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==
+
+side-channel@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2"
+ integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==
+ dependencies:
+ call-bind "^1.0.7"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.4"
+ object-inspect "^1.13.1"
+
+signal-exit@^3.0.3:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
+signal-exit@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04"
+ integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
+
+sockjs@^0.3.24:
+ version "0.3.24"
+ resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce"
+ integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==
+ dependencies:
+ faye-websocket "^0.11.3"
+ uuid "^8.3.2"
+ websocket-driver "^0.7.4"
+
+source-list-map@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
+ integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
+
+source-map-js@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af"
+ integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
+
+source-map-support@~0.5.20:
+ version "0.5.21"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+spdy-transport@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31"
+ integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==
+ dependencies:
+ debug "^4.1.0"
+ detect-node "^2.0.4"
+ hpack.js "^2.1.6"
+ obuf "^1.1.2"
+ readable-stream "^3.0.6"
+ wbuf "^1.7.3"
+
+spdy@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b"
+ integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==
+ dependencies:
+ debug "^4.1.0"
+ handle-thing "^2.0.0"
+ http-deceiver "^1.2.7"
+ select-hose "^2.0.0"
+ spdy-transport "^3.0.0"
+
+stable@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
+ integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
+
+statuses@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
+ integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
+
+"statuses@>= 1.4.0 < 2":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+ integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
+
+"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0:
+ name string-width-cjs
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string-width@^5.0.1, string-width@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794"
+ integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
+ dependencies:
+ eastasianwidth "^0.2.0"
+ emoji-regex "^9.2.2"
+ strip-ansi "^7.0.1"
+
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ name strip-ansi-cjs
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-ansi@^7.0.1:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
+ integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==
+ dependencies:
+ ansi-regex "^6.0.1"
+
+strip-final-newline@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+ integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
+style-loader@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-4.0.0.tgz#0ea96e468f43c69600011e0589cb05c44f3b17a5"
+ integrity sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==
+
+stylehacks@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9"
+ integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==
+ dependencies:
+ browserslist "^4.21.4"
+ postcss-selector-parser "^6.0.4"
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^8.0.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+svgo@^2.7.0:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24"
+ integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==
+ dependencies:
+ "@trysound/sax" "0.2.0"
+ commander "^7.2.0"
+ css-select "^4.1.3"
+ css-tree "^1.1.3"
+ csso "^4.2.0"
+ picocolors "^1.0.0"
+ stable "^0.1.8"
+
+tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
+ integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
+
+terser-webpack-plugin@^5.3.10:
+ version "5.3.10"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199"
+ integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.20"
+ jest-worker "^27.4.5"
+ schema-utils "^3.1.1"
+ serialize-javascript "^6.0.1"
+ terser "^5.26.0"
+
+terser@^5.10.0, terser@^5.15.1, terser@^5.26.0:
+ version "5.31.3"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.3.tgz#b24b7beb46062f4653f049eea4f0cd165d0f0c38"
+ integrity sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==
+ dependencies:
+ "@jridgewell/source-map" "^0.3.3"
+ acorn "^8.8.2"
+ commander "^2.20.0"
+ source-map-support "~0.5.20"
+
+thingies@^1.20.0:
+ version "1.21.0"
+ resolved "https://registry.yarnpkg.com/thingies/-/thingies-1.21.0.tgz#e80fbe58fd6fdaaab8fad9b67bd0a5c943c445c1"
+ integrity sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==
+
+thunky@^1.0.2:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d"
+ integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+toidentifier@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
+ integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
+
+tree-dump@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/tree-dump/-/tree-dump-1.0.2.tgz#c460d5921caeb197bde71d0e9a7b479848c5b8ac"
+ integrity sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==
+
+tslib@^2.0.0, tslib@^2.0.3:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0"
+ integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==
+
+type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+undici-types@~5.26.4:
+ version "5.26.5"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
+ integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
+
+unicode-canonical-property-names-ecmascript@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
+ integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==
+
+unicode-match-property-ecmascript@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3"
+ integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==
+ dependencies:
+ unicode-canonical-property-names-ecmascript "^2.0.0"
+ unicode-property-aliases-ecmascript "^2.0.0"
+
+unicode-match-property-value-ecmascript@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0"
+ integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==
+
+unicode-property-aliases-ecmascript@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd"
+ integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
+
+update-browserslist-db@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e"
+ integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==
+ dependencies:
+ escalade "^3.1.2"
+ picocolors "^1.0.1"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+
+utila@~0.4:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c"
+ integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
+
+uuid@^8.3.2:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
+ integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
+
+vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
+
+watchpack@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff"
+ integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==
+ dependencies:
+ glob-to-regexp "^0.4.1"
+ graceful-fs "^4.1.2"
+
+wbuf@^1.1.0, wbuf@^1.7.3:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df"
+ integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==
+ dependencies:
+ minimalistic-assert "^1.0.0"
+
+webpack-cli@^5.1.4:
+ version "5.1.4"
+ resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.4.tgz#c8e046ba7eaae4911d7e71e2b25b776fcc35759b"
+ integrity sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==
+ dependencies:
+ "@discoveryjs/json-ext" "^0.5.0"
+ "@webpack-cli/configtest" "^2.1.1"
+ "@webpack-cli/info" "^2.0.2"
+ "@webpack-cli/serve" "^2.0.5"
+ colorette "^2.0.14"
+ commander "^10.0.1"
+ cross-spawn "^7.0.3"
+ envinfo "^7.7.3"
+ fastest-levenshtein "^1.0.12"
+ import-local "^3.0.2"
+ interpret "^3.1.1"
+ rechoir "^0.8.0"
+ webpack-merge "^5.7.3"
+
+webpack-dev-middleware@^7.1.0:
+ version "7.2.1"
+ resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-7.2.1.tgz#2af00538b6e4eda05f5afdd5d711dbebc05958f7"
+ integrity sha512-hRLz+jPQXo999Nx9fXVdKlg/aehsw1ajA9skAneGmT03xwmyuhvF93p6HUKKbWhXdcERtGTzUCtIQr+2IQegrA==
+ dependencies:
+ colorette "^2.0.10"
+ memfs "^4.6.0"
+ mime-types "^2.1.31"
+ on-finished "^2.4.1"
+ range-parser "^1.2.1"
+ schema-utils "^4.0.0"
+
+webpack-dev-server@^5.0.4:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz#cb6ea47ff796b9251ec49a94f24a425e12e3c9b8"
+ integrity sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==
+ dependencies:
+ "@types/bonjour" "^3.5.13"
+ "@types/connect-history-api-fallback" "^1.5.4"
+ "@types/express" "^4.17.21"
+ "@types/serve-index" "^1.9.4"
+ "@types/serve-static" "^1.15.5"
+ "@types/sockjs" "^0.3.36"
+ "@types/ws" "^8.5.10"
+ ansi-html-community "^0.0.8"
+ bonjour-service "^1.2.1"
+ chokidar "^3.6.0"
+ colorette "^2.0.10"
+ compression "^1.7.4"
+ connect-history-api-fallback "^2.0.0"
+ default-gateway "^6.0.3"
+ express "^4.17.3"
+ graceful-fs "^4.2.6"
+ html-entities "^2.4.0"
+ http-proxy-middleware "^2.0.3"
+ ipaddr.js "^2.1.0"
+ launch-editor "^2.6.1"
+ open "^10.0.3"
+ p-retry "^6.2.0"
+ rimraf "^5.0.5"
+ schema-utils "^4.2.0"
+ selfsigned "^2.4.1"
+ serve-index "^1.9.1"
+ sockjs "^0.3.24"
+ spdy "^4.0.2"
+ webpack-dev-middleware "^7.1.0"
+ ws "^8.16.0"
+
+webpack-merge@^5.7.3:
+ version "5.10.0"
+ resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177"
+ integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==
+ dependencies:
+ clone-deep "^4.0.1"
+ flat "^5.0.2"
+ wildcard "^2.0.0"
+
+webpack-sources@^1.1.0:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
+ integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
+ dependencies:
+ source-list-map "^2.0.0"
+ source-map "~0.6.1"
+
+webpack-sources@^3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
+ integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
+
+webpack@^5.93.0:
+ version "5.93.0"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.93.0.tgz#2e89ec7035579bdfba9760d26c63ac5c3462a5e5"
+ integrity sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==
+ dependencies:
+ "@types/eslint-scope" "^3.7.3"
+ "@types/estree" "^1.0.5"
+ "@webassemblyjs/ast" "^1.12.1"
+ "@webassemblyjs/wasm-edit" "^1.12.1"
+ "@webassemblyjs/wasm-parser" "^1.12.1"
+ acorn "^8.7.1"
+ acorn-import-attributes "^1.9.5"
+ browserslist "^4.21.10"
+ chrome-trace-event "^1.0.2"
+ enhanced-resolve "^5.17.0"
+ es-module-lexer "^1.2.1"
+ eslint-scope "5.1.1"
+ events "^3.2.0"
+ glob-to-regexp "^0.4.1"
+ graceful-fs "^4.2.11"
+ json-parse-even-better-errors "^2.3.1"
+ loader-runner "^4.2.0"
+ mime-types "^2.1.27"
+ neo-async "^2.6.2"
+ schema-utils "^3.2.0"
+ tapable "^2.1.1"
+ terser-webpack-plugin "^5.3.10"
+ watchpack "^2.4.1"
+ webpack-sources "^3.2.3"
+
+websocket-driver@>=0.5.1, websocket-driver@^0.7.4:
+ version "0.7.4"
+ resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760"
+ integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==
+ dependencies:
+ http-parser-js ">=0.5.1"
+ safe-buffer ">=5.1.0"
+ websocket-extensions ">=0.1.1"
+
+websocket-extensions@>=0.1.1:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42"
+ integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+wildcard@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67"
+ integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==
+
+"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrap-ansi@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
+ integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
+ dependencies:
+ ansi-styles "^6.1.0"
+ string-width "^5.0.1"
+ strip-ansi "^7.0.1"
+
+ws@^8.16.0:
+ version "8.18.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc"
+ integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==
+
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yaml@^1.10.2:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
+ integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
+
+yocto-queue@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.1.1.tgz#fef65ce3ac9f8a32ceac5a634f74e17e5b232110"
+ integrity sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==
|