├── .gitignore ├── assets ├── logo │ └── todo.png └── icons │ ├── rows2.svg │ ├── rows.svg │ └── elipsis.svg ├── src ├── modules │ ├── todo.js │ ├── statusUpdates.js │ ├── localStorageHelper.js │ ├── addTask.js │ ├── updateIndexes.js │ ├── nightMode.js │ ├── taskElement.js │ └── ToDoStructure.js ├── index.html ├── index.js └── style.css ├── .hintrc ├── .eslintrc.json ├── dist ├── index.html ├── 54fca204ed115d42f815.svg ├── 740d0687e67af6c4e50d.svg ├── 5143b95bf5f57c4d15aa.svg ├── runtime.bundle.js └── index.bundle.js ├── .stylelintrc.json ├── webpack.config.js ├── MIT.md ├── package.json ├── .github └── workflows │ └── linters.yml └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /assets/logo/todo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alejandroq12/to-do-list-review/HEAD/assets/logo/todo.png -------------------------------------------------------------------------------- /src/modules/todo.js: -------------------------------------------------------------------------------- 1 | import TaskElement from './taskElement.js'; 2 | 3 | export const createTaskElement = (task) => { 4 | const taskElement = new TaskElement(task); 5 | return taskElement.create(); 6 | }; 7 | 8 | export default createTaskElement; -------------------------------------------------------------------------------- /src/modules/statusUpdates.js: -------------------------------------------------------------------------------- 1 | export function toggleTaskCompletion(task, tasks) { 2 | task.completed = !task.completed; 3 | localStorage.setItem('tasks', JSON.stringify(tasks)); 4 | } 5 | 6 | export function clearCompletedTasks(tasks) { 7 | return tasks.filter((task) => !task.completed); 8 | } 9 | -------------------------------------------------------------------------------- /src/modules/localStorageHelper.js: -------------------------------------------------------------------------------- 1 | export function getTasksFromLocalStorage() { 2 | const storedTasks = localStorage.getItem('tasks'); 3 | if (storedTasks !== null && storedTasks !== 'undefined') { 4 | return JSON.parse(storedTasks); 5 | } 6 | localStorage.setItem('tasks', JSON.stringify([])); 7 | return []; 8 | } 9 | 10 | export default getTasksFromLocalStorage; -------------------------------------------------------------------------------- /.hintrc: -------------------------------------------------------------------------------- 1 | { 2 | "connector": { 3 | "name": "local", 4 | "options": { 5 | "pattern": ["**", "!.git/**", "!node_modules/**"] 6 | } 7 | }, 8 | "extends": ["development"], 9 | "formatters": ["stylish"], 10 | "hints": [ 11 | "button-type", 12 | "disown-opener", 13 | "html-checker", 14 | "meta-charset-utf-8", 15 | "meta-viewport", 16 | "no-inline-styles:error" 17 | ] 18 | } -------------------------------------------------------------------------------- /src/modules/addTask.js: -------------------------------------------------------------------------------- 1 | import { createTaskElement } from './todo.js'; 2 | import TaskElement from './taskElement.js'; 3 | 4 | const addTask = (tasks, inputValue) => { 5 | const newTask = { 6 | description: inputValue, 7 | completed: false, 8 | index: tasks.length + 1, 9 | }; 10 | tasks.push(newTask); 11 | const taskList = document.querySelector('.todos-ul'); 12 | const taskElement = new TaskElement(newTask); 13 | const newTaskElement = createTaskElement(newTask, taskElement); 14 | taskList.appendChild(newTaskElement); 15 | }; 16 | 17 | export default addTask; 18 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es6": true, 5 | "jest": true 6 | }, 7 | "parser": "babel-eslint", 8 | "parserOptions": { 9 | "ecmaVersion": 2018, 10 | "sourceType": "module" 11 | }, 12 | "extends": ["airbnb-base"], 13 | "rules": { 14 | "no-shadow": "off", 15 | "no-param-reassign": "off", 16 | "eol-last": "off", 17 | "import/extensions": [ 1, { 18 | "js": "always", "json": "always" 19 | }] 20 | }, 21 | "ignorePatterns": [ 22 | "dist/", 23 | "build/" 24 | ] 25 | } -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | To do list
-------------------------------------------------------------------------------- /.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["stylelint-config-standard"], 3 | "plugins": ["stylelint-scss", "stylelint-csstree-validator"], 4 | "rules": { 5 | "at-rule-no-unknown": [ 6 | true, 7 | { 8 | "ignoreAtRules": ["tailwind", "apply", "variants", "responsive", "screen"] 9 | } 10 | ], 11 | "scss/at-rule-no-unknown": [ 12 | true, 13 | { 14 | "ignoreAtRules": ["tailwind", "apply", "variants", "responsive", "screen"] 15 | } 16 | ], 17 | "csstree/validator": true 18 | }, 19 | "ignoreFiles": ["build/**", "dist/**", "**/reset*.css", "**/bootstrap*.css", "**/*.js", "**/*.jsx"] 20 | } 21 | -------------------------------------------------------------------------------- /assets/icons/rows2.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dist/54fca204ed115d42f815.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 3 | 4 | module.exports = { 5 | entry: { 6 | index: './src/index.js', 7 | }, 8 | devServer: { 9 | static: './dist', 10 | }, 11 | devtool: 'inline-source-map', 12 | plugins: [ 13 | new HtmlWebpackPlugin({ 14 | template: './src/index.html', 15 | inject: 'body', 16 | }), 17 | ], 18 | output: { 19 | filename: '[name].bundle.js', 20 | path: path.resolve(__dirname, 'dist'), 21 | clean: true, 22 | }, 23 | module: { 24 | rules: [ 25 | { 26 | test: /\.css$/i, 27 | use: ['style-loader', 'css-loader'], 28 | }, 29 | ], 30 | }, 31 | optimization: { 32 | runtimeChunk: 'single', 33 | }, 34 | }; 35 | -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | To do list 8 | 9 | 10 |
11 | 12 |
13 |
14 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/modules/updateIndexes.js: -------------------------------------------------------------------------------- 1 | export function updateTaskIndexes(tasks) { 2 | // Update indexes for all remaining tasks 3 | const taskList = document.querySelector('.todos-ul'); 4 | const remainingTasks = taskList.querySelectorAll('.task-item'); 5 | remainingTasks.forEach((task, index) => { 6 | task.dataset.index = index + 1; 7 | task.taskElement.task.index = index + 1; // Update the TaskElement instance 8 | const checkbox = task.querySelector('input[type=checkbox]'); 9 | checkbox.name = `task-${index + 1}`; 10 | const label = task.querySelector('.task-text'); 11 | label.setAttribute('for', `task-${index + 1}`); 12 | }); 13 | 14 | // Update tasks in local storage 15 | tasks.forEach((task, index) => { 16 | task.index = index + 1; 17 | }); 18 | localStorage.setItem('tasks', JSON.stringify(tasks)); 19 | } 20 | export default updateTaskIndexes; 21 | -------------------------------------------------------------------------------- /src/modules/nightMode.js: -------------------------------------------------------------------------------- 1 | export function enableNightMode() { 2 | document.addEventListener('DOMContentLoaded', () => { 3 | const toggleThemeButton = document.getElementById('toggle-theme'); 4 | const html = document.documentElement; 5 | 6 | function toggleNightMode() { 7 | if (html.classList.contains('night-mode')) { 8 | html.classList.remove('night-mode'); 9 | localStorage.setItem('nightMode', 'disabled'); 10 | } else { 11 | html.classList.add('night-mode'); 12 | localStorage.setItem('nightMode', 'enabled'); 13 | } 14 | } 15 | 16 | // Apply the night mode if it was previously enabled 17 | if (localStorage.getItem('nightMode') === 'enabled') { 18 | html.classList.add('night-mode'); 19 | } 20 | 21 | toggleThemeButton.addEventListener('click', toggleNightMode); 22 | }); 23 | } 24 | 25 | export default enableNightMode; -------------------------------------------------------------------------------- /assets/icons/rows.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /dist/740d0687e67af6c4e50d.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /MIT.md: -------------------------------------------------------------------------------- 1 | ## Copyright 2023, [Julio Quezada] 2 | 3 | ###### To do list 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this To do list and associated documentation files, to deal in the To do list without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the To do list, and to permit persons to whom the To do list is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the To do list. 8 | 9 | THE TO DO LIST IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE PORTFOLIO OR THE USE OR OTHER DEALINGS IN THE TO DO LIST. 10 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "webpack-template", 3 | "version": "1.0.0", 4 | "description": "My Books", 5 | "private": "true", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "build": "webpack --mode production", 9 | "start": "webpack-dev-server --mode development --open" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/Alejandroq12/webpack-template.git" 14 | }, 15 | "keywords": [], 16 | "author": "", 17 | "license": "ISC", 18 | "bugs": { 19 | "url": "https://github.com/Alejandroq12/webpack-template/issues" 20 | }, 21 | "homepage": "https://github.com/Alejandroq12/webpack-template#readme", 22 | "devDependencies": { 23 | "@babel/core": "^7.21.3", 24 | "@babel/preset-env": "^7.20.2", 25 | "babel-eslint": "^10.1.0", 26 | "babel-loader": "^9.1.2", 27 | "css-loader": "^6.7.3", 28 | "eslint": "^7.32.0", 29 | "eslint-config-airbnb-base": "^14.2.1", 30 | "eslint-plugin-import": "^2.27.5", 31 | "hint": "^7.1.7", 32 | "html-webpack-plugin": "^5.5.0", 33 | "style-loader": "^3.3.2", 34 | "stylelint": "^13.13.1", 35 | "stylelint-config-standard": "^21.0.0", 36 | "stylelint-csstree-validator": "^1.9.0", 37 | "stylelint-scss": "^3.21.0", 38 | "webpack": "^5.77.0", 39 | "webpack-cli": "^5.0.1", 40 | "webpack-dev-server": "^4.13.1" 41 | }, 42 | "dependencies": { 43 | "lodash": "^4.17.21" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import './style.css'; 2 | import { updateTaskIndexes } from './modules/updateIndexes.js'; 3 | import addTask from './modules/addTask.js'; 4 | import { getTasksFromLocalStorage } from './modules/localStorageHelper.js'; 5 | import TaskElement from './modules/taskElement.js'; 6 | import ToDoStructure from './modules/ToDoStructure.js'; 7 | import { enableNightMode } from './modules/nightMode.js'; 8 | 9 | export function populateTasks(tasks) { 10 | const todoList = document.querySelector('.todos-ul'); 11 | 12 | // Clear the current task list elements 13 | while (todoList.firstChild) { 14 | todoList.removeChild(todoList.firstChild); 15 | } 16 | 17 | tasks.forEach((task) => { 18 | const taskElement = new TaskElement(task); 19 | todoList.appendChild(taskElement.create()); 20 | }); 21 | } 22 | 23 | const tasks = getTasksFromLocalStorage(); 24 | const toDoStructure = new ToDoStructure(tasks, populateTasks).create(); 25 | document.getElementById('todo-list-placeholder').appendChild(toDoStructure); 26 | populateTasks(tasks); // Call the function with tasks argument 27 | 28 | window.addEventListener('DOMContentLoaded', () => { 29 | updateTaskIndexes(tasks); 30 | }); 31 | 32 | const input = document.getElementById('new-task'); 33 | input.addEventListener('keyup', (event) => { 34 | if (event.key === 'Enter') { 35 | const inputValue = input.value.trim(); 36 | if (inputValue !== '') { 37 | addTask(tasks, inputValue, populateTasks); 38 | localStorage.setItem('tasks', JSON.stringify(tasks)); 39 | input.value = ''; 40 | } 41 | } 42 | }); 43 | 44 | function eraseTaskFromView(taskElement) { 45 | taskElement.deleteTask(); 46 | } 47 | 48 | const todoList = document.querySelector('.todos-ul'); 49 | 50 | todoList.addEventListener('click', (event) => { 51 | if (event.target.classList.contains('erase-icon')) { 52 | event.stopPropagation(); 53 | const listItem = event.target.parentElement; 54 | const { taskElement } = listItem; 55 | eraseTaskFromView(taskElement); 56 | 57 | // Update the tasks array 58 | const taskIndex = tasks.findIndex((task) => task.index === taskElement.task.index); 59 | if (taskIndex > -1) { 60 | tasks.splice(taskIndex, 1); 61 | updateTaskIndexes(tasks); 62 | localStorage.setItem('tasks', JSON.stringify(tasks)); 63 | } 64 | // Remove the listItem directly from the DOM without repopulating the entire list 65 | listItem.remove(); 66 | } 67 | }); 68 | enableNightMode(); 69 | export default populateTasks; -------------------------------------------------------------------------------- /.github/workflows/linters.yml: -------------------------------------------------------------------------------- 1 | name: Linters 2 | 3 | on: pull_request 4 | 5 | env: 6 | FORCE_COLOR: 1 7 | 8 | jobs: 9 | lighthouse: 10 | name: Lighthouse 11 | runs-on: ubuntu-22.04 12 | steps: 13 | - uses: actions/checkout@v2 14 | - uses: actions/setup-node@v1 15 | with: 16 | node-version: "12.x" 17 | - name: Setup Lighthouse 18 | run: npm install -g @lhci/cli@0.7.x 19 | - name: Lighthouse Report 20 | run: lhci autorun --upload.target=temporary-public-storage --collect.staticDistDir=. 21 | webhint: 22 | name: Webhint 23 | runs-on: ubuntu-22.04 24 | steps: 25 | - uses: actions/checkout@v2 26 | - uses: actions/setup-node@v1 27 | with: 28 | node-version: "18.x" 29 | - name: Setup Webhint 30 | run: | 31 | npm install --save-dev hint@7.x 32 | [ -f .hintrc ] || wget https://raw.githubusercontent.com/microverseinc/linters-config/master/html-css-js/.hintrc 33 | - name: Webhint Report 34 | run: npx hint . 35 | stylelint: 36 | name: Stylelint 37 | runs-on: ubuntu-22.04 38 | steps: 39 | - uses: actions/checkout@v2 40 | - uses: actions/setup-node@v1 41 | with: 42 | node-version: "18.x" 43 | - name: Setup Stylelint 44 | run: | 45 | npm install --save-dev stylelint@13.x stylelint-scss@3.x stylelint-config-standard@21.x stylelint-csstree-validator@1.x 46 | [ -f .stylelintrc.json ] || wget https://raw.githubusercontent.com/microverseinc/linters-config/master/html-css-js/.stylelintrc.json 47 | - name: Stylelint Report 48 | run: npx stylelint "**/*.{css,scss}" 49 | eslint: 50 | name: ESLint 51 | runs-on: ubuntu-22.04 52 | steps: 53 | - uses: actions/checkout@v2 54 | - uses: actions/setup-node@v1 55 | with: 56 | node-version: "18.x" 57 | - name: Setup ESLint 58 | run: | 59 | npm install --save-dev eslint@7.x eslint-config-airbnb-base@14.x eslint-plugin-import@2.x babel-eslint@10.x 60 | [ -f .eslintrc.json ] || wget https://raw.githubusercontent.com/microverseinc/linters-config/master/html-css-js/.eslintrc.json 61 | - name: ESLint Report 62 | run: npx eslint . 63 | nodechecker: 64 | name: node_modules checker 65 | runs-on: ubuntu-22.04 66 | steps: 67 | - uses: actions/checkout@v2 68 | - name: Check node_modules existence 69 | run: | 70 | if [ -d "node_modules/" ]; then echo -e "\e[1;31mThe node_modules/ folder was pushed to the repo. Please remove it from the GitHub repository and try again."; echo -e "\e[1;32mYou can set up a .gitignore file with this folder included on it to prevent this from happening in the future." && exit 1; fi 71 | -------------------------------------------------------------------------------- /src/modules/taskElement.js: -------------------------------------------------------------------------------- 1 | import { getTasksFromLocalStorage } from './localStorageHelper.js'; 2 | import { updateTaskIndexes } from './updateIndexes.js'; 3 | import { toggleTaskCompletion } from './statusUpdates.js'; 4 | 5 | class TaskElement { 6 | constructor(task) { 7 | this.task = task; 8 | this.listItem = this.create(); 9 | this.eraseIcon = this.listItem.querySelector('.erase-icon'); 10 | this.taskText = this.listItem.querySelector('.task-text'); 11 | this.threeDotsIcon = this.listItem.querySelector('.three-dots-icon'); 12 | } 13 | 14 | create() { 15 | const listItem = document.createElement('li'); 16 | listItem.dataset.index = this.task.index; 17 | listItem.classList.add('task-item'); 18 | listItem.taskElement = this; 19 | 20 | const checkbox = document.createElement('input'); 21 | checkbox.type = 'checkbox'; 22 | checkbox.checked = this.task.completed; 23 | listItem.appendChild(checkbox); 24 | 25 | const taskText = document.createElement('span'); 26 | taskText.classList.add('task-text'); 27 | taskText.innerText = this.task.description; 28 | listItem.appendChild(taskText); 29 | 30 | const eraseIcon = document.createElement('span'); 31 | eraseIcon.className = 'erase-icon'; 32 | eraseIcon.innerHTML = '❌'; 33 | eraseIcon.style.display = 'none'; 34 | listItem.appendChild(eraseIcon); 35 | 36 | const threeDotsIcon = document.createElement('span'); 37 | threeDotsIcon.className = 'three-dots-icon'; 38 | listItem.appendChild(threeDotsIcon); 39 | 40 | listItem.addEventListener('mouseover', () => { 41 | eraseIcon.style.display = 'inline-block'; 42 | threeDotsIcon.style.display = 'inline-block'; 43 | listItem.style.backgroundColor = 'lightgray'; 44 | taskText.contentEditable = 'true'; 45 | }); 46 | 47 | taskText.addEventListener('blur', () => { 48 | const tasks = getTasksFromLocalStorage(); 49 | const index = tasks.findIndex((task) => task.index === this.task.index); 50 | if (index !== -1) { 51 | tasks[index].description = taskText.innerText.trim(); 52 | localStorage.setItem('tasks', JSON.stringify(tasks)); 53 | } 54 | }); 55 | 56 | listItem.addEventListener('mouseout', () => { 57 | eraseIcon.style.display = 'none'; 58 | listItem.style.backgroundColor = ''; 59 | taskText.contentEditable = 'false'; 60 | }); 61 | checkbox.addEventListener('change', () => { 62 | const tasks = getTasksFromLocalStorage(); 63 | const index = tasks.findIndex((task) => task.index === this.task.index); 64 | if (index !== -1) { 65 | toggleTaskCompletion(tasks[index], tasks); 66 | } 67 | }); 68 | 69 | return listItem; 70 | } 71 | 72 | deleteTask() { 73 | const tasks = getTasksFromLocalStorage(); 74 | const index = tasks.findIndex((task) => task.index === this.task.index); 75 | if (index !== -1) { 76 | tasks.splice(index, 1); 77 | // Update task indexes 78 | tasks.forEach((task, newIndex) => { 79 | task.index = newIndex + 1; 80 | }); 81 | // Update local storage 82 | localStorage.setItem('tasks', JSON.stringify(tasks)); 83 | } 84 | // Remove the list item element from the DOM 85 | this.listItem.remove(); 86 | updateTaskIndexes(tasks); 87 | } 88 | } 89 | 90 | export default TaskElement; -------------------------------------------------------------------------------- /src/modules/ToDoStructure.js: -------------------------------------------------------------------------------- 1 | import TaskElement from './taskElement.js'; 2 | import { getTasksFromLocalStorage } from './localStorageHelper.js'; 3 | import { clearCompletedTasks } from './statusUpdates.js'; 4 | import { updateTaskIndexes } from './updateIndexes.js'; 5 | 6 | class ToDoStructure { 7 | constructor(tasks, populateTasksFunc) { 8 | this.tasks = tasks; 9 | this.populateTasks = populateTasksFunc; 10 | this.updateTasks = (newTasks) => { 11 | this.tasks.length = 0; 12 | newTasks.forEach((task) => this.tasks.push(task)); 13 | }; 14 | } 15 | 16 | create() { 17 | const main = document.createElement('main'); 18 | main.id = 'todo-list__div'; 19 | 20 | main.appendChild(ToDoStructure.createTodoDateDiv()); 21 | main.appendChild(ToDoStructure.createTodoDivPlaceholder()); 22 | main.appendChild(this.createTodoListDiv()); 23 | main.appendChild(this.createBtnDiv(this.populateTasks)); 24 | 25 | return main; 26 | } 27 | 28 | static createTodoDateDiv() { 29 | const todoDateDiv = document.createElement('div'); 30 | todoDateDiv.className = 'todo-date'; 31 | 32 | const todoDateP = document.createElement('p'); 33 | todoDateP.className = 'todo-date__p'; 34 | todoDateP.textContent = "Today's To Do"; 35 | todoDateDiv.appendChild(todoDateP); 36 | 37 | const loadingIcon = document.createElement('span'); 38 | loadingIcon.className = 'loading-icon'; 39 | todoDateDiv.appendChild(loadingIcon); 40 | 41 | return todoDateDiv; 42 | } 43 | 44 | static createTodoDivPlaceholder() { 45 | const todoDivPlaceholder = document.createElement('div'); 46 | todoDivPlaceholder.className = 'todo-div__placeholder'; 47 | 48 | const newTaskInput = document.createElement('input'); 49 | newTaskInput.id = 'new-task'; 50 | newTaskInput.type = 'text'; 51 | newTaskInput.placeholder = 'Add to your list...'; 52 | todoDivPlaceholder.appendChild(newTaskInput); 53 | 54 | const arrowIcon = document.createElement('span'); 55 | arrowIcon.className = 'arrow'; 56 | todoDivPlaceholder.appendChild(arrowIcon); 57 | 58 | return todoDivPlaceholder; 59 | } 60 | 61 | createTodoListDiv() { 62 | const todoListDiv = document.createElement('div'); 63 | todoListDiv.className = 'todo-list'; 64 | 65 | const todosUl = document.createElement('ul'); 66 | todosUl.className = 'todos-ul'; 67 | this.tasks 68 | .sort((a, b) => a.index - b.index) 69 | .forEach((task) => { 70 | const taskElement = new TaskElement(task); 71 | todosUl.appendChild(taskElement.create()); 72 | }); 73 | todoListDiv.appendChild(todosUl); 74 | 75 | return todoListDiv; 76 | } 77 | 78 | // eslint-disable-next-line class-methods-use-this 79 | createBtnDiv(populateTasksFunc) { 80 | const btnDiv = document.createElement('div'); 81 | btnDiv.className = 'btn'; 82 | const btnP = document.createElement('button'); 83 | btnP.className = 'btn-p'; 84 | btnP.textContent = 'Clear all completed'; 85 | btnDiv.appendChild(btnP); 86 | btnP.addEventListener('click', () => { 87 | const tasks = getTasksFromLocalStorage(); 88 | const updatedTasks = clearCompletedTasks(tasks); 89 | updateTaskIndexes(updatedTasks); 90 | populateTasksFunc(updatedTasks); 91 | localStorage.setItem('tasks', JSON.stringify(updatedTasks)); 92 | this.updateTasks(updatedTasks); // Update the tasks array 93 | }); 94 | return btnDiv; 95 | } 96 | } 97 | 98 | export default ToDoStructure; -------------------------------------------------------------------------------- /assets/icons/elipsis.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dist/5143b95bf5f57c4d15aa.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/style.css: -------------------------------------------------------------------------------- 1 | *, 2 | *::before, 3 | *::after { 4 | padding: 0; 5 | margin: 0; 6 | box-sizing: border-box; 7 | } 8 | 9 | html, 10 | body { 11 | display: flex; 12 | flex-direction: column; 13 | font-size: 62.5%; 14 | height: 100%; 15 | } 16 | 17 | #todo-list__div { 18 | position: fixed; 19 | top: 50%; 20 | left: 50%; 21 | width: 90%; 22 | height: 70%; 23 | background-color: #f4f4f4; 24 | padding: 0; 25 | box-shadow: 0 4px 6px rgba(0, 0, 0, 0.9); 26 | transform: translate(-50%, -50%); 27 | overflow: scroll; 28 | } 29 | 30 | .todo-date { 31 | display: flex; 32 | justify-content: space-between; 33 | align-items: center; 34 | } 35 | 36 | .todo-date__p { 37 | margin: 0; 38 | font-size: 3rem; 39 | padding: 0.4rem; 40 | margin-left: 1rem; 41 | } 42 | 43 | .loading-icon { 44 | width: 16px; 45 | height: 16px; 46 | background-image: url("../assets/icons/rows.svg"); 47 | background-size: cover; 48 | margin-right: 22px; 49 | } 50 | 51 | .todo-div__placeholder { 52 | position: relative; 53 | } 54 | 55 | #new-task { 56 | width: 80%; 57 | padding: 10px; 58 | margin: 10px 8px; 59 | border: none; 60 | font-size: 1.7rem; 61 | font-style: italic; 62 | } 63 | 64 | .arrow { 65 | position: absolute; 66 | right: 10px; 67 | top: 50%; 68 | transform: translateY(-50%); 69 | width: 17px; 70 | height: 17px; 71 | background-image: url("../assets/icons/rows2.svg"); 72 | background-size: cover; 73 | margin-right: 22px; 74 | } 75 | 76 | .todos-ul { 77 | list-style: none; 78 | padding: 0; 79 | margin: 0; 80 | } 81 | 82 | .todos-ul li { 83 | display: flex; 84 | align-items: center; 85 | margin-bottom: 0; 86 | font-size: 2rem; 87 | border-bottom: 1px solid lightgray; 88 | padding: 23px 30px; 89 | } 90 | 91 | input[type="checkbox"] { 92 | margin-right: 18px; 93 | } 94 | 95 | .task-text { 96 | max-width: 55%; 97 | word-wrap: break-word; 98 | } 99 | 100 | .todo-date, 101 | .todo-div__placeholder, 102 | .todo-list, 103 | .btn { 104 | background-color: white; 105 | border-bottom: 1px solid lightgray; 106 | padding: 10px; 107 | } 108 | 109 | .todo-list { 110 | list-style: none; 111 | padding: 0; 112 | color: black; 113 | } 114 | 115 | .btn { 116 | background-color: gray; 117 | border-bottom: none; 118 | margin-top: -6px; 119 | } 120 | 121 | .btn-p { 122 | display: flex; 123 | justify-content: center; 124 | align-items: center; 125 | width: 100%; 126 | padding: 10px; 127 | margin: 10px 0; 128 | font-size: 1.6rem; 129 | cursor: pointer; 130 | border: none; 131 | background-color: gray; 132 | color: #fff; 133 | } 134 | 135 | #main-content { 136 | flex: 1; 137 | display: flex; 138 | flex-direction: column; 139 | align-items: center; 140 | } 141 | 142 | .three-dots-icon { 143 | position: absolute; 144 | right: 35px; 145 | width: 18px; 146 | height: 28px; 147 | background-image: url("../assets/icons/elipsis.svg"); 148 | background-size: cover; 149 | cursor: move; 150 | } 151 | 152 | .erase-icon { 153 | position: absolute; 154 | right: 2.8em; 155 | font-size: 1.2em; 156 | cursor: pointer; 157 | } 158 | 159 | #footer { 160 | display: flex; 161 | justify-content: center; 162 | align-items: center; 163 | width: 100%; 164 | padding: 1rem; 165 | background-color: #f4f4f4; 166 | box-shadow: 0 -4px 6px rgba(0, 0, 0, 0.1); 167 | } 168 | 169 | #footer div { 170 | text-align: center; 171 | } 172 | 173 | #footer p { 174 | font-size: 1.4rem; 175 | line-height: 1.5; 176 | } 177 | 178 | /* Night mode styles */ 179 | .night-mode body { 180 | background-color: #000; 181 | } 182 | 183 | .night-mode .todo-date__p { 184 | margin: 0; 185 | font-size: 3.5rem; 186 | padding: 10px; 187 | color: white; 188 | } 189 | 190 | .night-mode a { 191 | color: #00b7ff; 192 | } 193 | 194 | #footer a { 195 | color: #00b7ff; 196 | text-decoration: none; 197 | } 198 | 199 | .night-mode button { 200 | background-color: #000; 201 | color: #f1f1f1; 202 | } 203 | 204 | .night-mode .todo-date, 205 | .night-mode .todo-div__placeholder, 206 | .night-mode .todo-list, 207 | .night-mode .btn { 208 | background-color: #333; 209 | border-bottom: 1px solid lightgray; 210 | } 211 | 212 | .night-mode .todo-list { 213 | color: #fff; 214 | } 215 | 216 | .night-mode #todo-list__div { 217 | background-color: #333; 218 | padding: 0; 219 | box-shadow: 100px -100px 26px rgba(255, 255, 255, 0.1); 220 | transform: translate(-50%, -50%); 221 | overflow: scroll; 222 | } 223 | 224 | .night-mode .task-item { 225 | background-color: gray; 226 | color: #000; 227 | } 228 | 229 | .night-mode #footer { 230 | background-color: #333; 231 | color: #fff; 232 | } 233 | 234 | /* Cool Button Styles */ 235 | .cool-button { 236 | background-color: #4c8bf5; 237 | border: none; 238 | color: white; 239 | text-align: center; 240 | font-size: 16px; 241 | padding: 12px 24px; 242 | border-radius: 4px; 243 | margin-top: 1.2rem; 244 | cursor: pointer; 245 | position: relative; 246 | transition: background-color 0.3s, box-shadow 0.3s, transform 0.3s; 247 | } 248 | 249 | .cool-button:hover { 250 | background-color: #3d75d8; 251 | } 252 | 253 | .cool-button:active { 254 | background-color: #3063ab; 255 | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.9); 256 | transform: translateY(2px); 257 | } 258 | 259 | .cool-button::before { 260 | content: ""; 261 | position: absolute; 262 | top: 0; 263 | left: 0; 264 | right: 0; 265 | bottom: 0; 266 | background: linear-gradient(45deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.05)); 267 | border-radius: 4px; 268 | pointer-events: none; 269 | } 270 | 271 | .cool-button::after { 272 | content: ""; 273 | position: absolute; 274 | top: 0; 275 | left: 0; 276 | width: 100%; 277 | height: 100%; 278 | background-color: rgba(201, 201, 201, 0.1); 279 | border-radius: 4px; 280 | pointer-events: none; 281 | opacity: 0; 282 | transform: scale(0.7); 283 | transition: opacity 0.3s, transform 0.3s; 284 | } 285 | 286 | .cool-button:hover::after { 287 | opacity: 1; 288 | transform: scale(1); 289 | } 290 | 291 | #toggle-theme { 292 | margin-bottom: 20px; 293 | } 294 | 295 | .night-mode .cool-button { 296 | background-color: #6c737e; 297 | border: none; 298 | color: white; 299 | text-align: center; 300 | font-size: 16px; 301 | padding: 12px 24px; 302 | border-radius: 4px; 303 | cursor: pointer; 304 | position: relative; 305 | transition: background-color 0.3s, box-shadow 0.3s, transform 0.3s; 306 | } 307 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | To do list 2 | 3 | 4 |
5 | logo 6 |
7 | 8 |

To do list

9 | 10 |
11 | 12 | 13 | 14 | # 📗 Table of Contents 15 | 16 | - [📖 About the Project](#about-project) 17 | - [🛠 Built With](#built-with) 18 | - [Tech Stack](#tech-stack) 19 | - [Key Features](#key-features) 20 | - [🚀 Live Demo](#live-demo) 21 | - [💻 Getting Started](#getting-started) 22 | - [Setup](#setup) 23 | - [Prerequisites](#prerequisites) 24 | - [Install](#install) 25 | - [Usage](#usage) 26 | - [Run tests](#run-tests) 27 | - [Deployment](#deployment) 28 | - [👥 Authors](#authors) 29 | - [🔭 Future Features](#future-features) 30 | - [🤝 Contributing](#contributing) 31 | - [⭐️ Show your support](#support) 32 | - [🙏 Acknowledgements](#acknowledgements) 33 | - [❓ FAQ (OPTIONAL)](#faq) 34 | - [📝 License](#license) 35 | 36 | 37 | 38 | # 📖 My Books 39 | 40 | 🚀 This repository contains the front-end implementation of a to-do list web application. The app is designed to help users efficiently manage their tasks and stay organized, using modern web development practices and technologies. 41 | 42 | ## 🛠 Built With 43 | 44 | ### Tech Stack 45 | 46 |
47 | Client 48 | 54 |
55 | 56 | 57 | 58 | 59 | ### Key Features 60 | 61 | - **Use of ES6 syntax** 62 | - **Modular JavaScript: The application is built using JavaScript modules, resulting in a well-organized, maintainable, and scalable codebase.** 63 | 64 |

(back to top)

65 | 66 | 67 | 68 | ## 🚀 Live Demo 69 | 70 | - [Live Demo Link](https://alejandroq12.github.io/to-do-list/) 71 | 72 |

(back to top)

73 | 74 | 75 | 76 | ## 💻 Getting Started 77 | 78 | To get a local copy up and running, follow these steps: 79 | 80 | ### Prerequisites 81 | 82 | To work with this project, you need: 83 | 84 | 1. A modern web browser to view the website (e.g., Google Chrome, Firefox, Safari, or Microsoft Edge). 85 | 86 | 2. A code editor for editing the code, such as Visual Studio Code, Atom, or Sublime Text. 87 | 88 | 3. Node.js installed on your machine. You can download the latest version [here](https://nodejs.org/en/download/). 89 | 90 | 4. npm (Node Package Manager) installed, which comes bundled with Node.js. 91 | 92 | 5. After cloning the project, make sure to run npm install to install all the necessary dependencies, including Luxon and linters, specified in the package.json file. 93 | 94 | ### Setup 95 | 96 | Clone this repository to your desired folder: 97 | 98 | 1. Clone it using your terminal: 99 | ``` 100 | git clone https://github.com/Alejandroq12/to-do-list.git 101 | ``` 102 | 103 | 2. If the previous method does not work you may also download the repo as a .zip file and once you decompress the .zip file you are ready to use it. 104 | 105 | Important: do not forget to clone the repo in the correct folder, probably you will use the following commands to achieve that in your terminal: 106 | 107 | 1. To navigate a certain folder: 108 | 109 | ``` 110 | cd 111 | ``` 112 | 2. To navigate to the previous folder: 113 | 114 | ``` 115 | cd .. 116 | ``` 117 | 118 | ### Install 119 | 120 | Install this project with: 121 | 122 | 1. To view this project, no additional installation is required. 123 | 124 | 2. However, if you want to test the linter configured for detecting errors or use Luxon library, complete the following steps: 125 | 126 | ``` 127 | npm init -y 128 | npm install 129 | 130 | ``` 131 | 132 | 3. If you run npm install, remember to create a .gitignore file to prevent the node_modules folder from being uploaded to GitHub: 133 | 134 | ``` 135 | .gitignore 136 | node_modules/ 137 | ``` 138 | 139 | ### Usage 140 | 141 | To use this project locally on your computer, follow these steps: 142 | 143 | 144 | 1. Clone the repository or download the project files. 145 | 2. Navigate to the project directory where the index.html file is located. 146 | 3. Open the index.html file with a web browser. 147 | - Optional: You can also use the Live Server extension for Visual Studio Code to view the website with live reloading. 148 | 149 | -- Install the Live Server extension in Visual Studio Code. 150 | 151 | -- Open the project folder in Visual Studio Code. 152 | 153 | -- Right-click on the index.html file and select "Open with Live Server". 154 | 155 | The website should now be displayed in your browser, and you can interact with the application as intended. 156 | 157 | ### Run tests 158 | 159 | 1. Make sure all the linters and their configurations are installed and set up correctly in your project. If you haven't installed them yet, run `npm install` in your project directory to install the packages listed in your `package.json` file. 160 | 161 | 2. Run each linter with the following commands: 162 | 163 | - For ESLint: 164 | ``` 165 | npx eslint . 166 | 167 | ``` 168 | - For Stylelint: 169 | ``` 170 | npx stylelint "**/*.css" 171 | 172 | ``` 173 | - For hint: 174 | ``` 175 | npx hint . 176 | 177 | ``` 178 | 3. Review the output of each linter and fix any issues reported. 179 | 180 | ### Deployment 181 | 182 | You can deploy this project using GitHub pages: 183 | 184 | 1. Log in to your GitHub account and navigate to the repository that contains your website files. 185 | 2. Make sure that your website files are located in the main branch and in the root directory of the repository. 186 | 3. If your website is not already live, make sure that the index.html file is the main page of your website. 187 | 4. Click on the "Settings" tab in your repository. 188 | 5. Scroll down to the "GitHub Pages" section. 189 | 6. In the "Source" dropdown menu, select the branch where your website files are located. For a simple website with only HTML and CSS, this is typically the main branch. 190 | 7. In the "Path" field, make sure that the root directory is specified (i.e., "/"). 191 | 8. Click "Save" to generate your website. 192 | 9. Wait a few minutes for GitHub to build and deploy your website. 193 | 10. Once the website is deployed, visit the GitHub Pages URL to view your site. 194 | 195 |

(back to top)

196 | 197 | 198 | 199 | ## 👥 Authors 200 | 201 | 👤 **Julio Quezada** 202 | 203 | - GitHub: [Alejandroq12](https://github.com/Alejandroq12) 204 | - Twitter: [@JulioAle54](https://twitter.com/JulioAle54) 205 | - LinkedIn: [Julio Quezada](https://www.linkedin.com/in/quezadajulio/) 206 | 207 | 208 |

(back to top)

209 | 210 | 211 | 212 | ## 🔭 Future Features 213 | 214 | - [ ] **I will add media queries for larger screens** 215 | - [ ] **I will use JavaScript to add more interactivity** 216 | - [ ] **Mark tasks as completed** 217 | - [ ] **Automatically reorder tasks based on priority** 218 | - [ ] **Fully responsive design for mobile and desktop devices** 219 | 220 |

(back to top)

221 | 222 | 223 | 224 | ## 🤝 Contributing 225 | 226 | Contributions, issues, and feature requests are welcome! 227 | 228 | Feel free to check the [issues page](../../issues/). 229 | 230 |

(back to top)

231 | 232 | 233 | 234 | ## ⭐️ Show your support 235 | 236 | If you like this project please give a star. 237 | Thanks in advance. 238 |

(back to top)

239 | 240 | 241 | 242 | ## 🙏 Acknowledgments 243 | 244 | I would like to thank Wes Bos because I learned how to implement flexbox with his free tutorial: 245 | - Wes Bos: [Wes Bos](https://flexbox.io/) 246 | 247 | 248 |

(back to top)

249 | 250 | 251 | 252 | ## ❓ FAQ (OPTIONAL) 253 | 254 | - **Are you going to use React in the future?** 255 | 256 | - Yes! I will transform this website into a React App. 257 | 258 | - **Did you create this website from scratch?** 259 | 260 | - Yes! From zero, and I will improve it a lot. 261 | 262 |

(back to top)

263 | 264 | 265 | 266 | ## 📝 License 267 | 268 | This project is [MIT](./MIT.md) licensed. 269 | 270 |

(back to top)

271 | -------------------------------------------------------------------------------- /dist/runtime.bundle.js: -------------------------------------------------------------------------------- 1 | (()=>{"use strict";var e,r={},t={};function o(e){var n=t[e];if(void 0!==n)return n.exports;var i=t[e]={id:e,exports:{}};return r[e](i,i.exports,o),i.exports}o.m=r,e=[],o.O=(r,t,n,i)=>{if(!t){var a=1/0;for(s=0;s=i)&&Object.keys(o.O).every((e=>o.O[e](t[l])))?t.splice(l--,1):(c=!1,i0&&e[s-1][2]>i;s--)e[s]=e[s-1];e[s]=[t,n,i]},o.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return o.d(r,{a:r}),r},o.d=(e,r)=>{for(var t in r)o.o(r,t)&&!o.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),(()=>{var e;o.g.importScripts&&(e=o.g.location+"");var r=o.g.document;if(!e&&r&&(r.currentScript&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");t.length&&(e=t[t.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),o.p=e})(),(()=>{o.b=document.baseURI||self.location.href;var e={666:0};o.O.j=r=>0===e[r];var r=(r,t)=>{var n,i,[a,c,l]=t,p=0;if(a.some((r=>0!==e[r]))){for(n in c)o.o(c,n)&&(o.m[n]=c[n]);if(l)var s=l(o)}for(r&&r(t);p{t.d(r,{Z:()=>m});var e=t(537),o=t.n(e),A=t(645),a=t.n(A),i=t(667),s=t.n(i),d=new URL(t(873),t.b),c=new URL(t(538),t.b),l=new URL(t(913),t.b),p=a()(o()),g=s()(d),u=s()(c),E=s()(l);p.push([n.id,"*,\r\n*::before,\r\n*::after {\r\n padding: 0;\r\n margin: 0;\r\n box-sizing: border-box;\r\n}\r\n\r\nhtml,\r\nbody {\r\n display: flex;\r\n flex-direction: column;\r\n font-size: 62.5%;\r\n height: 100%;\r\n}\r\n\r\n#todo-list__div {\r\n position: fixed;\r\n top: 50%;\r\n left: 50%;\r\n width: 90%;\r\n height: 70%;\r\n background-color: #f4f4f4;\r\n padding: 0;\r\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.9);\r\n transform: translate(-50%, -50%);\r\n overflow: scroll;\r\n}\r\n\r\n.todo-date {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n}\r\n\r\n.todo-date__p {\r\n margin: 0;\r\n font-size: 3rem;\r\n padding: 0.4rem;\r\n margin-left: 1rem;\r\n}\r\n\r\n.loading-icon {\r\n width: 16px;\r\n height: 16px;\r\n background-image: url("+g+");\r\n background-size: cover;\r\n margin-right: 22px;\r\n}\r\n\r\n.todo-div__placeholder {\r\n position: relative;\r\n}\r\n\r\n#new-task {\r\n width: 80%;\r\n padding: 10px;\r\n margin: 10px 8px;\r\n border: none;\r\n font-size: 1.7rem;\r\n font-style: italic;\r\n}\r\n\r\n.arrow {\r\n position: absolute;\r\n right: 10px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n width: 17px;\r\n height: 17px;\r\n background-image: url("+u+');\r\n background-size: cover;\r\n margin-right: 22px;\r\n}\r\n\r\n.todos-ul {\r\n list-style: none;\r\n padding: 0;\r\n margin: 0;\r\n}\r\n\r\n.todos-ul li {\r\n display: flex;\r\n align-items: center;\r\n margin-bottom: 0;\r\n font-size: 2rem;\r\n border-bottom: 1px solid lightgray;\r\n padding: 23px 30px;\r\n}\r\n\r\ninput[type="checkbox"] {\r\n margin-right: 18px;\r\n}\r\n\r\n.task-text {\r\n max-width: 55%;\r\n word-wrap: break-word;\r\n}\r\n\r\n.todo-date,\r\n.todo-div__placeholder,\r\n.todo-list,\r\n.btn {\r\n background-color: white;\r\n border-bottom: 1px solid lightgray;\r\n padding: 10px;\r\n}\r\n\r\n.todo-list {\r\n list-style: none;\r\n padding: 0;\r\n color: black;\r\n}\r\n\r\n.btn {\r\n background-color: gray;\r\n border-bottom: none;\r\n margin-top: -6px;\r\n}\r\n\r\n.btn-p {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n width: 100%;\r\n padding: 10px;\r\n margin: 10px 0;\r\n font-size: 1.6rem;\r\n cursor: pointer;\r\n border: none;\r\n background-color: gray;\r\n color: #fff;\r\n}\r\n\r\n#main-content {\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n}\r\n\r\n.three-dots-icon {\r\n position: absolute;\r\n right: 35px;\r\n width: 18px;\r\n height: 28px;\r\n background-image: url('+E+');\r\n background-size: cover;\r\n cursor: move;\r\n}\r\n\r\n.erase-icon {\r\n position: absolute;\r\n right: 2.8em;\r\n font-size: 1.2em;\r\n cursor: pointer;\r\n}\r\n\r\n#footer {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n width: 100%;\r\n padding: 1rem;\r\n background-color: #f4f4f4;\r\n box-shadow: 0 -4px 6px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n#footer div {\r\n text-align: center;\r\n}\r\n\r\n#footer p {\r\n font-size: 1.4rem;\r\n line-height: 1.5;\r\n}\r\n\r\n#footer a {\r\n color: #00b7ff;\r\n text-decoration: none;\r\n}\r\n\r\n/* Night mode styles */\r\n.night-mode body {\r\n background-color: #000;\r\n}\r\n\r\n.night-mode .todo-date__p {\r\n margin: 0;\r\n font-size: 3.5rem;\r\n padding: 10px;\r\n color: white;\r\n}\r\n\r\n.night-mode a {\r\n color: #00b7ff;\r\n}\r\n\r\n.night-mode button {\r\n background-color: #000;\r\n color: #f1f1f1;\r\n}\r\n\r\n.night-mode .todo-date,\r\n.night-mode .todo-div__placeholder,\r\n.night-mode .todo-list,\r\n.night-mode .btn {\r\n background-color: #333;\r\n border-bottom: 1px solid lightgray;\r\n}\r\n\r\n.night-mode .todo-list {\r\n color: #fff;\r\n}\r\n\r\n.night-mode #todo-list__div {\r\n background-color: #333;\r\n padding: 0;\r\n box-shadow: 100px -100px 26px rgba(255, 255, 255, 0.1);\r\n transform: translate(-50%, -50%);\r\n overflow: scroll;\r\n}\r\n\r\n.night-mode .task-item {\r\n background-color: gray;\r\n color: #000;\r\n}\r\n\r\n.night-mode #footer {\r\n background-color: #333;\r\n color: #fff;\r\n}\r\n\r\n/* Cool Button Styles */\r\n.cool-button {\r\n background-color: #4c8bf5;\r\n border: none;\r\n color: white;\r\n text-align: center;\r\n font-size: 16px;\r\n padding: 12px 24px;\r\n border-radius: 4px;\r\n margin-top: 1.2rem;\r\n cursor: pointer;\r\n position: relative;\r\n transition: background-color 0.3s, box-shadow 0.3s, transform 0.3s;\r\n}\r\n\r\n.cool-button:hover {\r\n background-color: #3d75d8;\r\n}\r\n\r\n.cool-button:active {\r\n background-color: #3063ab;\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.9);\r\n transform: translateY(2px);\r\n}\r\n\r\n.cool-button::before {\r\n content: "";\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background: linear-gradient(45deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.05));\r\n border-radius: 4px;\r\n pointer-events: none;\r\n}\r\n\r\n.cool-button::after {\r\n content: "";\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background-color: rgba(201, 201, 201, 0.1);\r\n border-radius: 4px;\r\n pointer-events: none;\r\n opacity: 0;\r\n transform: scale(0.7);\r\n transition: opacity 0.3s, transform 0.3s;\r\n}\r\n\r\n.cool-button:hover::after {\r\n opacity: 1;\r\n transform: scale(1);\r\n}\r\n\r\n#toggle-theme {\r\n margin-bottom: 20px;\r\n}\r\n\r\n.night-mode .cool-button {\r\n background-color: #6c737e;\r\n border: none;\r\n color: white;\r\n text-align: center;\r\n font-size: 16px;\r\n padding: 12px 24px;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n position: relative;\r\n transition: background-color 0.3s, box-shadow 0.3s, transform 0.3s;\r\n}\r\n',"",{version:3,sources:["webpack://./src/style.css"],names:[],mappings:"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",sourcesContent:['*,\r\n*::before,\r\n*::after {\r\n padding: 0;\r\n margin: 0;\r\n box-sizing: border-box;\r\n}\r\n\r\nhtml,\r\nbody {\r\n display: flex;\r\n flex-direction: column;\r\n font-size: 62.5%;\r\n height: 100%;\r\n}\r\n\r\n#todo-list__div {\r\n position: fixed;\r\n top: 50%;\r\n left: 50%;\r\n width: 90%;\r\n height: 70%;\r\n background-color: #f4f4f4;\r\n padding: 0;\r\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.9);\r\n transform: translate(-50%, -50%);\r\n overflow: scroll;\r\n}\r\n\r\n.todo-date {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n}\r\n\r\n.todo-date__p {\r\n margin: 0;\r\n font-size: 3rem;\r\n padding: 0.4rem;\r\n margin-left: 1rem;\r\n}\r\n\r\n.loading-icon {\r\n width: 16px;\r\n height: 16px;\r\n background-image: url("../assets/icons/rows.svg");\r\n background-size: cover;\r\n margin-right: 22px;\r\n}\r\n\r\n.todo-div__placeholder {\r\n position: relative;\r\n}\r\n\r\n#new-task {\r\n width: 80%;\r\n padding: 10px;\r\n margin: 10px 8px;\r\n border: none;\r\n font-size: 1.7rem;\r\n font-style: italic;\r\n}\r\n\r\n.arrow {\r\n position: absolute;\r\n right: 10px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n width: 17px;\r\n height: 17px;\r\n background-image: url("../assets/icons/rows2.svg");\r\n background-size: cover;\r\n margin-right: 22px;\r\n}\r\n\r\n.todos-ul {\r\n list-style: none;\r\n padding: 0;\r\n margin: 0;\r\n}\r\n\r\n.todos-ul li {\r\n display: flex;\r\n align-items: center;\r\n margin-bottom: 0;\r\n font-size: 2rem;\r\n border-bottom: 1px solid lightgray;\r\n padding: 23px 30px;\r\n}\r\n\r\ninput[type="checkbox"] {\r\n margin-right: 18px;\r\n}\r\n\r\n.task-text {\r\n max-width: 55%;\r\n word-wrap: break-word;\r\n}\r\n\r\n.todo-date,\r\n.todo-div__placeholder,\r\n.todo-list,\r\n.btn {\r\n background-color: white;\r\n border-bottom: 1px solid lightgray;\r\n padding: 10px;\r\n}\r\n\r\n.todo-list {\r\n list-style: none;\r\n padding: 0;\r\n color: black;\r\n}\r\n\r\n.btn {\r\n background-color: gray;\r\n border-bottom: none;\r\n margin-top: -6px;\r\n}\r\n\r\n.btn-p {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n width: 100%;\r\n padding: 10px;\r\n margin: 10px 0;\r\n font-size: 1.6rem;\r\n cursor: pointer;\r\n border: none;\r\n background-color: gray;\r\n color: #fff;\r\n}\r\n\r\n#main-content {\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n}\r\n\r\n.three-dots-icon {\r\n position: absolute;\r\n right: 35px;\r\n width: 18px;\r\n height: 28px;\r\n background-image: url("../assets/icons/elipsis.svg");\r\n background-size: cover;\r\n cursor: move;\r\n}\r\n\r\n.erase-icon {\r\n position: absolute;\r\n right: 2.8em;\r\n font-size: 1.2em;\r\n cursor: pointer;\r\n}\r\n\r\n#footer {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n width: 100%;\r\n padding: 1rem;\r\n background-color: #f4f4f4;\r\n box-shadow: 0 -4px 6px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n#footer div {\r\n text-align: center;\r\n}\r\n\r\n#footer p {\r\n font-size: 1.4rem;\r\n line-height: 1.5;\r\n}\r\n\r\n#footer a {\r\n color: #00b7ff;\r\n text-decoration: none;\r\n}\r\n\r\n/* Night mode styles */\r\n.night-mode body {\r\n background-color: #000;\r\n}\r\n\r\n.night-mode .todo-date__p {\r\n margin: 0;\r\n font-size: 3.5rem;\r\n padding: 10px;\r\n color: white;\r\n}\r\n\r\n.night-mode a {\r\n color: #00b7ff;\r\n}\r\n\r\n.night-mode button {\r\n background-color: #000;\r\n color: #f1f1f1;\r\n}\r\n\r\n.night-mode .todo-date,\r\n.night-mode .todo-div__placeholder,\r\n.night-mode .todo-list,\r\n.night-mode .btn {\r\n background-color: #333;\r\n border-bottom: 1px solid lightgray;\r\n}\r\n\r\n.night-mode .todo-list {\r\n color: #fff;\r\n}\r\n\r\n.night-mode #todo-list__div {\r\n background-color: #333;\r\n padding: 0;\r\n box-shadow: 100px -100px 26px rgba(255, 255, 255, 0.1);\r\n transform: translate(-50%, -50%);\r\n overflow: scroll;\r\n}\r\n\r\n.night-mode .task-item {\r\n background-color: gray;\r\n color: #000;\r\n}\r\n\r\n.night-mode #footer {\r\n background-color: #333;\r\n color: #fff;\r\n}\r\n\r\n/* Cool Button Styles */\r\n.cool-button {\r\n background-color: #4c8bf5;\r\n border: none;\r\n color: white;\r\n text-align: center;\r\n font-size: 16px;\r\n padding: 12px 24px;\r\n border-radius: 4px;\r\n margin-top: 1.2rem;\r\n cursor: pointer;\r\n position: relative;\r\n transition: background-color 0.3s, box-shadow 0.3s, transform 0.3s;\r\n}\r\n\r\n.cool-button:hover {\r\n background-color: #3d75d8;\r\n}\r\n\r\n.cool-button:active {\r\n background-color: #3063ab;\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.9);\r\n transform: translateY(2px);\r\n}\r\n\r\n.cool-button::before {\r\n content: "";\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background: linear-gradient(45deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.05));\r\n border-radius: 4px;\r\n pointer-events: none;\r\n}\r\n\r\n.cool-button::after {\r\n content: "";\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background-color: rgba(201, 201, 201, 0.1);\r\n border-radius: 4px;\r\n pointer-events: none;\r\n opacity: 0;\r\n transform: scale(0.7);\r\n transition: opacity 0.3s, transform 0.3s;\r\n}\r\n\r\n.cool-button:hover::after {\r\n opacity: 1;\r\n transform: scale(1);\r\n}\r\n\r\n#toggle-theme {\r\n margin-bottom: 20px;\r\n}\r\n\r\n.night-mode .cool-button {\r\n background-color: #6c737e;\r\n border: none;\r\n color: white;\r\n text-align: center;\r\n font-size: 16px;\r\n padding: 12px 24px;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n position: relative;\r\n transition: background-color 0.3s, box-shadow 0.3s, transform 0.3s;\r\n}\r\n'],sourceRoot:""}]);const m=p},645:n=>{n.exports=function(n){var r=[];return r.toString=function(){return this.map((function(r){var t="",e=void 0!==r[5];return r[4]&&(t+="@supports (".concat(r[4],") {")),r[2]&&(t+="@media ".concat(r[2]," {")),e&&(t+="@layer".concat(r[5].length>0?" ".concat(r[5]):""," {")),t+=n(r),e&&(t+="}"),r[2]&&(t+="}"),r[4]&&(t+="}"),t})).join("")},r.i=function(n,t,e,o,A){"string"==typeof n&&(n=[[null,n,void 0]]);var a={};if(e)for(var i=0;i0?" ".concat(c[5]):""," {").concat(c[1],"}")),c[5]=A),t&&(c[2]?(c[1]="@media ".concat(c[2]," {").concat(c[1],"}"),c[2]=t):c[2]=t),o&&(c[4]?(c[1]="@supports (".concat(c[4],") {").concat(c[1],"}"),c[4]=o):c[4]="".concat(o)),r.push(c))}},r}},667:n=>{n.exports=function(n,r){return r||(r={}),n?(n=String(n.__esModule?n.default:n),/^['"].*['"]$/.test(n)&&(n=n.slice(1,-1)),r.hash&&(n+=r.hash),/["'() \t\n]|(%20)/.test(n)||r.needQuotes?'"'.concat(n.replace(/"/g,'\\"').replace(/\n/g,"\\n"),'"'):n):n}},537:n=>{n.exports=function(n){var r=n[1],t=n[3];if(!t)return r;if("function"==typeof btoa){var e=btoa(unescape(encodeURIComponent(JSON.stringify(t)))),o="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(e),A="/*# ".concat(o," */");return[r].concat([A]).join("\n")}return[r].join("\n")}},379:n=>{var r=[];function t(n){for(var t=-1,e=0;e{var r={};n.exports=function(n,t){var e=function(n){if(void 0===r[n]){var t=document.querySelector(n);if(window.HTMLIFrameElement&&t instanceof window.HTMLIFrameElement)try{t=t.contentDocument.head}catch(n){t=null}r[n]=t}return r[n]}(n);if(!e)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");e.appendChild(t)}},216:n=>{n.exports=function(n){var r=document.createElement("style");return n.setAttributes(r,n.attributes),n.insert(r,n.options),r}},565:(n,r,t)=>{n.exports=function(n){var r=t.nc;r&&n.setAttribute("nonce",r)}},795:n=>{n.exports=function(n){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var r=n.insertStyleElement(n);return{update:function(t){!function(n,r,t){var e="";t.supports&&(e+="@supports (".concat(t.supports,") {")),t.media&&(e+="@media ".concat(t.media," {"));var o=void 0!==t.layer;o&&(e+="@layer".concat(t.layer.length>0?" ".concat(t.layer):""," {")),e+=t.css,o&&(e+="}"),t.media&&(e+="}"),t.supports&&(e+="}");var A=t.sourceMap;A&&"undefined"!=typeof btoa&&(e+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(A))))," */")),r.styleTagTransform(e,n,r.options)}(r,n,t)},remove:function(){!function(n){if(null===n.parentNode)return!1;n.parentNode.removeChild(n)}(r)}}}},589:n=>{n.exports=function(n,r){if(r.styleSheet)r.styleSheet.cssText=n;else{for(;r.firstChild;)r.removeChild(r.firstChild);r.appendChild(document.createTextNode(n))}}},593:(n,r,t)=>{var e=t(379),o=t.n(e),A=t(795),a=t.n(A),i=t(569),s=t.n(i),d=t(565),c=t.n(d),l=t(216),p=t.n(l),g=t(589),u=t.n(g),E=t(426),m={};function C(n){document.querySelector(".todos-ul").querySelectorAll(".task-item").forEach(((n,r)=>{n.dataset.index=r+1,n.taskElement.task.index=r+1,n.querySelector("input[type=checkbox]").name=`task-${r+1}`,n.querySelector(".task-text").setAttribute("for",`task-${r+1}`)})),n.forEach(((n,r)=>{n.index=r+1})),localStorage.setItem("tasks",JSON.stringify(n))}function f(){const n=localStorage.getItem("tasks");return null!==n&&"undefined"!==n?JSON.parse(n):(localStorage.setItem("tasks",JSON.stringify([])),[])}m.styleTagTransform=u(),m.setAttributes=c(),m.insert=s().bind(null,"head"),m.domAPI=a(),m.insertStyleElement=p(),o()(E.Z,m),E.Z&&E.Z.locals&&E.Z.locals;const h=class{constructor(n){this.task=n,this.listItem=this.create(),this.eraseIcon=this.listItem.querySelector(".erase-icon"),this.taskText=this.listItem.querySelector(".task-text"),this.threeDotsIcon=this.listItem.querySelector(".three-dots-icon")}create(){const n=document.createElement("li");n.dataset.index=this.task.index,n.classList.add("task-item"),n.taskElement=this;const r=document.createElement("input");r.type="checkbox",r.checked=this.task.completed,n.appendChild(r);const t=document.createElement("span");t.classList.add("task-text"),t.innerText=this.task.description,n.appendChild(t);const e=document.createElement("span");e.className="erase-icon",e.innerHTML="❌",e.style.display="none",n.appendChild(e);const o=document.createElement("span");return o.className="three-dots-icon",n.appendChild(o),n.addEventListener("mouseover",(()=>{e.style.display="inline-block",o.style.display="inline-block",n.style.backgroundColor="lightgray",t.contentEditable="true"})),t.addEventListener("blur",(()=>{const n=f(),r=n.findIndex((n=>n.index===this.task.index));-1!==r&&(n[r].description=t.innerText.trim(),localStorage.setItem("tasks",JSON.stringify(n)))})),n.addEventListener("mouseout",(()=>{e.style.display="none",n.style.backgroundColor="",t.contentEditable="false"})),r.addEventListener("change",(()=>{const n=f(),r=n.findIndex((n=>n.index===this.task.index));-1!==r&&function(n,r){n.completed=!n.completed,localStorage.setItem("tasks",JSON.stringify(r))}(n[r],n)})),n}deleteTask(){const n=f(),r=n.findIndex((n=>n.index===this.task.index));-1!==r&&(n.splice(r,1),n.forEach(((n,r)=>{n.index=r+1})),localStorage.setItem("tasks",JSON.stringify(n))),this.listItem.remove(),C(n)}},B=(n,r)=>{const t={description:r,completed:!1,index:n.length+1};n.push(t);const e=document.querySelector(".todos-ul"),o=(new h(t),new h(t).create());e.appendChild(o)};class b{constructor(n,r){this.tasks=n,this.populateTasks=r,this.updateTasks=n=>{this.tasks.length=0,n.forEach((n=>this.tasks.push(n)))}}create(){const n=document.createElement("main");return n.id="todo-list__div",n.appendChild(b.createTodoDateDiv()),n.appendChild(b.createTodoDivPlaceholder()),n.appendChild(this.createTodoListDiv()),n.appendChild(this.createBtnDiv(this.populateTasks)),n}static createTodoDateDiv(){const n=document.createElement("div");n.className="todo-date";const r=document.createElement("p");r.className="todo-date__p",r.textContent="Today's To Do",n.appendChild(r);const t=document.createElement("span");return t.className="loading-icon",n.appendChild(t),n}static createTodoDivPlaceholder(){const n=document.createElement("div");n.className="todo-div__placeholder";const r=document.createElement("input");r.id="new-task",r.type="text",r.placeholder="Add to your list...",n.appendChild(r);const t=document.createElement("span");return t.className="arrow",n.appendChild(t),n}createTodoListDiv(){const n=document.createElement("div");n.className="todo-list";const r=document.createElement("ul");return r.className="todos-ul",this.tasks.sort(((n,r)=>n.index-r.index)).forEach((n=>{const t=new h(n);r.appendChild(t.create())})),n.appendChild(r),n}createBtnDiv(n){const r=document.createElement("div");r.className="btn";const t=document.createElement("button");return t.className="btn-p",t.textContent="Clear all completed",r.appendChild(t),t.addEventListener("click",(()=>{const r=function(n){return n.filter((n=>!n.completed))}(f());C(r),n(r),localStorage.setItem("tasks",JSON.stringify(r)),this.updateTasks(r)})),r}}const x=b;function k(n){const r=document.querySelector(".todos-ul");for(;r.firstChild;)r.removeChild(r.firstChild);n.forEach((n=>{const t=new h(n);r.appendChild(t.create())}))}const y=f(),v=new x(y,k).create();document.getElementById("todo-list-placeholder").appendChild(v),k(y),window.addEventListener("DOMContentLoaded",(()=>{C(y)}));const w=document.getElementById("new-task");w.addEventListener("keyup",(n=>{if("Enter"===n.key){const n=w.value.trim();""!==n&&(B(y,n),localStorage.setItem("tasks",JSON.stringify(y)),w.value="")}})),document.querySelector(".todos-ul").addEventListener("click",(n=>{if(n.target.classList.contains("erase-icon")){n.stopPropagation();const r=n.target.parentElement,{taskElement:t}=r;!function(n){n.deleteTask()}(t);const e=y.findIndex((n=>n.index===t.task.index));e>-1&&(y.splice(e,1),C(y),localStorage.setItem("tasks",JSON.stringify(y))),r.remove()}})),document.addEventListener("DOMContentLoaded",(()=>{const n=document.getElementById("toggle-theme"),r=document.documentElement;"enabled"===localStorage.getItem("nightMode")&&r.classList.add("night-mode"),n.addEventListener("click",(function(){r.classList.contains("night-mode")?(r.classList.remove("night-mode"),localStorage.setItem("nightMode","disabled")):(r.classList.add("night-mode"),localStorage.setItem("nightMode","enabled"))}))}))},913:(n,r,t)=>{n.exports=t.p+"5143b95bf5f57c4d15aa.svg"},873:(n,r,t)=>{n.exports=t.p+"740d0687e67af6c4e50d.svg"},538:(n,r,t)=>{n.exports=t.p+"54fca204ed115d42f815.svg"}},n=>{n(n.s=593)}]); 2 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,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bGUuY3NzIiwid2VicGFjazovL3dlYnBhY2stdGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIiwid2VicGFjazovL3dlYnBhY2stdGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvZ2V0VXJsLmpzIiwid2VicGFjazovL3dlYnBhY2stdGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qcyIsIndlYnBhY2s6Ly93ZWJwYWNrLXRlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzIiwid2VicGFjazovL3dlYnBhY2stdGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzIiwid2VicGFjazovL3dlYnBhY2stdGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vd2VicGFjay10ZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qcyIsIndlYnBhY2s6Ly93ZWJwYWNrLXRlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanMiLCJ3ZWJwYWNrOi8vd2VicGFjay10ZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzIiwid2VicGFjazovL3dlYnBhY2stdGVtcGxhdGUvLi9zcmMvc3R5bGUuY3NzPzcxNjMiLCJ3ZWJwYWNrOi8vd2VicGFjay10ZW1wbGF0ZS8uL3NyYy9tb2R1bGVzL3VwZGF0ZUluZGV4ZXMuanMiLCJ3ZWJwYWNrOi8vd2VicGFjay10ZW1wbGF0ZS8uL3NyYy9tb2R1bGVzL2xvY2FsU3RvcmFnZUhlbHBlci5qcyIsIndlYnBhY2s6Ly93ZWJwYWNrLXRlbXBsYXRlLy4vc3JjL21vZHVsZXMvdGFza0VsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vd2VicGFjay10ZW1wbGF0ZS8uL3NyYy9tb2R1bGVzL3N0YXR1c1VwZGF0ZXMuanMiLCJ3ZWJwYWNrOi8vd2VicGFjay10ZW1wbGF0ZS8uL3NyYy9tb2R1bGVzL2FkZFRhc2suanMiLCJ3ZWJwYWNrOi8vd2VicGFjay10ZW1wbGF0ZS8uL3NyYy9tb2R1bGVzL3RvZG8uanMiLCJ3ZWJwYWNrOi8vd2VicGFjay10ZW1wbGF0ZS8uL3NyYy9tb2R1bGVzL1RvRG9TdHJ1Y3R1cmUuanMiLCJ3ZWJwYWNrOi8vd2VicGFjay10ZW1wbGF0ZS8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly93ZWJwYWNrLXRlbXBsYXRlLy4vc3JjL21vZHVsZXMvbmlnaHRNb2RlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18gZnJvbSBcIi4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9nZXRVcmwuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyA9IG5ldyBVUkwoXCIuLi9hc3NldHMvaWNvbnMvcm93cy5zdmdcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyA9IG5ldyBVUkwoXCIuLi9hc3NldHMvaWNvbnMvcm93czIuc3ZnXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzJfX18gPSBuZXcgVVJMKFwiLi4vYXNzZXRzL2ljb25zL2VsaXBzaXMuc3ZnXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMF9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzBfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzFfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8yX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMl9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIqLFxcclxcbio6OmJlZm9yZSxcXHJcXG4qOjphZnRlciB7XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG59XFxyXFxuXFxyXFxuaHRtbCxcXHJcXG5ib2R5IHtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcclxcbiAgZm9udC1zaXplOiA2Mi41JTtcXHJcXG4gIGhlaWdodDogMTAwJTtcXHJcXG59XFxyXFxuXFxyXFxuI3RvZG8tbGlzdF9fZGl2IHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogNTAlO1xcclxcbiAgbGVmdDogNTAlO1xcclxcbiAgd2lkdGg6IDkwJTtcXHJcXG4gIGhlaWdodDogNzAlO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y0ZjRmNDtcXHJcXG4gIHBhZGRpbmc6IDA7XFxyXFxuICBib3gtc2hhZG93OiAwIDRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjkpO1xcclxcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XFxyXFxuICBvdmVyZmxvdzogc2Nyb2xsO1xcclxcbn1cXHJcXG5cXHJcXG4udG9kby1kYXRlIHtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG4udG9kby1kYXRlX19wIHtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIGZvbnQtc2l6ZTogM3JlbTtcXHJcXG4gIHBhZGRpbmc6IDAuNHJlbTtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAxcmVtO1xcclxcbn1cXHJcXG5cXHJcXG4ubG9hZGluZy1pY29uIHtcXHJcXG4gIHdpZHRoOiAxNnB4O1xcclxcbiAgaGVpZ2h0OiAxNnB4O1xcclxcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMF9fXyArIFwiKTtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogY292ZXI7XFxyXFxuICBtYXJnaW4tcmlnaHQ6IDIycHg7XFxyXFxufVxcclxcblxcclxcbi50b2RvLWRpdl9fcGxhY2Vob2xkZXIge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbn1cXHJcXG5cXHJcXG4jbmV3LXRhc2sge1xcclxcbiAgd2lkdGg6IDgwJTtcXHJcXG4gIHBhZGRpbmc6IDEwcHg7XFxyXFxuICBtYXJnaW46IDEwcHggOHB4O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgZm9udC1zaXplOiAxLjdyZW07XFxyXFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxyXFxufVxcclxcblxcclxcbi5hcnJvdyB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICByaWdodDogMTBweDtcXHJcXG4gIHRvcDogNTAlO1xcclxcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xcclxcbiAgd2lkdGg6IDE3cHg7XFxyXFxuICBoZWlnaHQ6IDE3cHg7XFxyXFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIgKyBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xX19fICsgXCIpO1xcclxcbiAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjtcXHJcXG4gIG1hcmdpbi1yaWdodDogMjJweDtcXHJcXG59XFxyXFxuXFxyXFxuLnRvZG9zLXVsIHtcXHJcXG4gIGxpc3Qtc3R5bGU6IG5vbmU7XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbn1cXHJcXG5cXHJcXG4udG9kb3MtdWwgbGkge1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAwO1xcclxcbiAgZm9udC1zaXplOiAycmVtO1xcclxcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGxpZ2h0Z3JheTtcXHJcXG4gIHBhZGRpbmc6IDIzcHggMzBweDtcXHJcXG59XFxyXFxuXFxyXFxuaW5wdXRbdHlwZT1cXFwiY2hlY2tib3hcXFwiXSB7XFxyXFxuICBtYXJnaW4tcmlnaHQ6IDE4cHg7XFxyXFxufVxcclxcblxcclxcbi50YXNrLXRleHQge1xcclxcbiAgbWF4LXdpZHRoOiA1NSU7XFxyXFxuICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XFxyXFxufVxcclxcblxcclxcbi50b2RvLWRhdGUsXFxyXFxuLnRvZG8tZGl2X19wbGFjZWhvbGRlcixcXHJcXG4udG9kby1saXN0LFxcclxcbi5idG4ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgbGlnaHRncmF5O1xcclxcbiAgcGFkZGluZzogMTBweDtcXHJcXG59XFxyXFxuXFxyXFxuLnRvZG8tbGlzdCB7XFxyXFxuICBsaXN0LXN0eWxlOiBub25lO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIGNvbG9yOiBibGFjaztcXHJcXG59XFxyXFxuXFxyXFxuLmJ0biB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiBncmF5O1xcclxcbiAgYm9yZGVyLWJvdHRvbTogbm9uZTtcXHJcXG4gIG1hcmdpbi10b3A6IC02cHg7XFxyXFxufVxcclxcblxcclxcbi5idG4tcCB7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICBwYWRkaW5nOiAxMHB4O1xcclxcbiAgbWFyZ2luOiAxMHB4IDA7XFxyXFxuICBmb250LXNpemU6IDEuNnJlbTtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gIGJvcmRlcjogbm9uZTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IGdyYXk7XFxyXFxuICBjb2xvcjogI2ZmZjtcXHJcXG59XFxyXFxuXFxyXFxuI21haW4tY29udGVudCB7XFxyXFxuICBmbGV4OiAxO1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG4udGhyZWUtZG90cy1pY29uIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHJpZ2h0OiAzNXB4O1xcclxcbiAgd2lkdGg6IDE4cHg7XFxyXFxuICBoZWlnaHQ6IDI4cHg7XFxyXFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIgKyBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8yX19fICsgXCIpO1xcclxcbiAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjtcXHJcXG4gIGN1cnNvcjogbW92ZTtcXHJcXG59XFxyXFxuXFxyXFxuLmVyYXNlLWljb24ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgcmlnaHQ6IDIuOGVtO1xcclxcbiAgZm9udC1zaXplOiAxLjJlbTtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuI2Zvb3RlciB7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICBwYWRkaW5nOiAxcmVtO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y0ZjRmNDtcXHJcXG4gIGJveC1zaGFkb3c6IDAgLTRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEpO1xcclxcbn1cXHJcXG5cXHJcXG4jZm9vdGVyIGRpdiB7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbiNmb290ZXIgcCB7XFxyXFxuICBmb250LXNpemU6IDEuNHJlbTtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxyXFxufVxcclxcblxcclxcbiNmb290ZXIgYSB7XFxyXFxuICBjb2xvcjogIzAwYjdmZjtcXHJcXG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLyogTmlnaHQgbW9kZSBzdHlsZXMgKi9cXHJcXG4ubmlnaHQtbW9kZSBib2R5IHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA7XFxyXFxufVxcclxcblxcclxcbi5uaWdodC1tb2RlIC50b2RvLWRhdGVfX3Age1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgZm9udC1zaXplOiAzLjVyZW07XFxyXFxuICBwYWRkaW5nOiAxMHB4O1xcclxcbiAgY29sb3I6IHdoaXRlO1xcclxcbn1cXHJcXG5cXHJcXG4ubmlnaHQtbW9kZSBhIHtcXHJcXG4gIGNvbG9yOiAjMDBiN2ZmO1xcclxcbn1cXHJcXG5cXHJcXG4ubmlnaHQtbW9kZSBidXR0b24ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDtcXHJcXG4gIGNvbG9yOiAjZjFmMWYxO1xcclxcbn1cXHJcXG5cXHJcXG4ubmlnaHQtbW9kZSAudG9kby1kYXRlLFxcclxcbi5uaWdodC1tb2RlIC50b2RvLWRpdl9fcGxhY2Vob2xkZXIsXFxyXFxuLm5pZ2h0LW1vZGUgLnRvZG8tbGlzdCxcXHJcXG4ubmlnaHQtbW9kZSAuYnRuIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICMzMzM7XFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgbGlnaHRncmF5O1xcclxcbn1cXHJcXG5cXHJcXG4ubmlnaHQtbW9kZSAudG9kby1saXN0IHtcXHJcXG4gIGNvbG9yOiAjZmZmO1xcclxcbn1cXHJcXG5cXHJcXG4ubmlnaHQtbW9kZSAjdG9kby1saXN0X19kaXYge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMzMztcXHJcXG4gIHBhZGRpbmc6IDA7XFxyXFxuICBib3gtc2hhZG93OiAxMDBweCAtMTAwcHggMjZweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7XFxyXFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcXHJcXG4gIG92ZXJmbG93OiBzY3JvbGw7XFxyXFxufVxcclxcblxcclxcbi5uaWdodC1tb2RlIC50YXNrLWl0ZW0ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTtcXHJcXG4gIGNvbG9yOiAjMDAwO1xcclxcbn1cXHJcXG5cXHJcXG4ubmlnaHQtbW9kZSAjZm9vdGVyIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICMzMzM7XFxyXFxuICBjb2xvcjogI2ZmZjtcXHJcXG59XFxyXFxuXFxyXFxuLyogQ29vbCBCdXR0b24gU3R5bGVzICovXFxyXFxuLmNvb2wtYnV0dG9uIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICM0YzhiZjU7XFxyXFxuICBib3JkZXI6IG5vbmU7XFxyXFxuICBjb2xvcjogd2hpdGU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBmb250LXNpemU6IDE2cHg7XFxyXFxuICBwYWRkaW5nOiAxMnB4IDI0cHg7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxuICBtYXJnaW4tdG9wOiAxLjJyZW07XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuM3MsIGJveC1zaGFkb3cgMC4zcywgdHJhbnNmb3JtIDAuM3M7XFxyXFxufVxcclxcblxcclxcbi5jb29sLWJ1dHRvbjpob3ZlciB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjM2Q3NWQ4O1xcclxcbn1cXHJcXG5cXHJcXG4uY29vbC1idXR0b246YWN0aXZlIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICMzMDYzYWI7XFxyXFxuICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjkpO1xcclxcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDJweCk7XFxyXFxufVxcclxcblxcclxcbi5jb29sLWJ1dHRvbjo6YmVmb3JlIHtcXHJcXG4gIGNvbnRlbnQ6IFxcXCJcXFwiO1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgYm90dG9tOiAwO1xcclxcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSkpO1xcclxcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5jb29sLWJ1dHRvbjo6YWZ0ZXIge1xcclxcbiAgY29udGVudDogXFxcIlxcXCI7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDA7XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICBoZWlnaHQ6IDEwMCU7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDIwMSwgMjAxLCAyMDEsIDAuMSk7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxuICB0cmFuc2Zvcm06IHNjYWxlKDAuNyk7XFxyXFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MsIHRyYW5zZm9ybSAwLjNzO1xcclxcbn1cXHJcXG5cXHJcXG4uY29vbC1idXR0b246aG92ZXI6OmFmdGVyIHtcXHJcXG4gIG9wYWNpdHk6IDE7XFxyXFxuICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbn1cXHJcXG5cXHJcXG4jdG9nZ2xlLXRoZW1lIHtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XFxyXFxufVxcclxcblxcclxcbi5uaWdodC1tb2RlIC5jb29sLWJ1dHRvbiB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNmM3MzdlO1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgY29sb3I6IHdoaXRlO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgZm9udC1zaXplOiAxNnB4O1xcclxcbiAgcGFkZGluZzogMTJweCAyNHB4O1xcclxcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjNzLCBib3gtc2hhZG93IDAuM3MsIHRyYW5zZm9ybSAwLjNzO1xcclxcbn1cXHJcXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvc3R5bGUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBOzs7RUFHRSxVQUFVO0VBQ1YsU0FBUztFQUNULHNCQUFzQjtBQUN4Qjs7QUFFQTs7RUFFRSxhQUFhO0VBQ2Isc0JBQXNCO0VBQ3RCLGdCQUFnQjtFQUNoQixZQUFZO0FBQ2Q7O0FBRUE7RUFDRSxlQUFlO0VBQ2YsUUFBUTtFQUNSLFNBQVM7RUFDVCxVQUFVO0VBQ1YsV0FBVztFQUNYLHlCQUF5QjtFQUN6QixVQUFVO0VBQ1Ysd0NBQXdDO0VBQ3hDLGdDQUFnQztFQUNoQyxnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxhQUFhO0VBQ2IsOEJBQThCO0VBQzlCLG1CQUFtQjtBQUNyQjs7QUFFQTtFQUNFLFNBQVM7RUFDVCxlQUFlO0VBQ2YsZUFBZTtFQUNmLGlCQUFpQjtBQUNuQjs7QUFFQTtFQUNFLFdBQVc7RUFDWCxZQUFZO0VBQ1oseURBQWlEO0VBQ2pELHNCQUFzQjtFQUN0QixrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSxrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSxVQUFVO0VBQ1YsYUFBYTtFQUNiLGdCQUFnQjtFQUNoQixZQUFZO0VBQ1osaUJBQWlCO0VBQ2pCLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLGtCQUFrQjtFQUNsQixXQUFXO0VBQ1gsUUFBUTtFQUNSLDJCQUEyQjtFQUMzQixXQUFXO0VBQ1gsWUFBWTtFQUNaLHlEQUFrRDtFQUNsRCxzQkFBc0I7RUFDdEIsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsZ0JBQWdCO0VBQ2hCLFVBQVU7RUFDVixTQUFTO0FBQ1g7O0FBRUE7RUFDRSxhQUFhO0VBQ2IsbUJBQW1CO0VBQ25CLGdCQUFnQjtFQUNoQixlQUFlO0VBQ2Ysa0NBQWtDO0VBQ2xDLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLGNBQWM7RUFDZCxxQkFBcUI7QUFDdkI7O0FBRUE7Ozs7RUFJRSx1QkFBdUI7RUFDdkIsa0NBQWtDO0VBQ2xDLGFBQWE7QUFDZjs7QUFFQTtFQUNFLGdCQUFnQjtFQUNoQixVQUFVO0VBQ1YsWUFBWTtBQUNkOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLG1CQUFtQjtFQUNuQixnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxhQUFhO0VBQ2IsdUJBQXVCO0VBQ3ZCLG1CQUFtQjtFQUNuQixXQUFXO0VBQ1gsYUFBYTtFQUNiLGNBQWM7RUFDZCxpQkFBaUI7RUFDakIsZUFBZTtFQUNmLFlBQVk7RUFDWixzQkFBc0I7RUFDdEIsV0FBVztBQUNiOztBQUVBO0VBQ0UsT0FBTztFQUNQLGFBQWE7RUFDYixzQkFBc0I7RUFDdEIsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0Usa0JBQWtCO0VBQ2xCLFdBQVc7RUFDWCxXQUFXO0VBQ1gsWUFBWTtFQUNaLHlEQUFvRDtFQUNwRCxzQkFBc0I7RUFDdEIsWUFBWTtBQUNkOztBQUVBO0VBQ0Usa0JBQWtCO0VBQ2xCLFlBQVk7RUFDWixnQkFBZ0I7RUFDaEIsZUFBZTtBQUNqQjs7QUFFQTtFQUNFLGFBQWE7RUFDYix1QkFBdUI7RUFDdkIsbUJBQW1CO0VBQ25CLFdBQVc7RUFDWCxhQUFhO0VBQ2IseUJBQXlCO0VBQ3pCLHlDQUF5QztBQUMzQzs7QUFFQTtFQUNFLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLGlCQUFpQjtFQUNqQixnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxjQUFjO0VBQ2QscUJBQXFCO0FBQ3ZCOztBQUVBLHNCQUFzQjtBQUN0QjtFQUNFLHNCQUFzQjtBQUN4Qjs7QUFFQTtFQUNFLFNBQVM7RUFDVCxpQkFBaUI7RUFDakIsYUFBYTtFQUNiLFlBQVk7QUFDZDs7QUFFQTtFQUNFLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsY0FBYztBQUNoQjs7QUFFQTs7OztFQUlFLHNCQUFzQjtFQUN0QixrQ0FBa0M7QUFDcEM7O0FBRUE7RUFDRSxXQUFXO0FBQ2I7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsVUFBVTtFQUNWLHNEQUFzRDtFQUN0RCxnQ0FBZ0M7RUFDaEMsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLFdBQVc7QUFDYjs7QUFFQTtFQUNFLHNCQUFzQjtFQUN0QixXQUFXO0FBQ2I7O0FBRUEsdUJBQXVCO0FBQ3ZCO0VBQ0UseUJBQXlCO0VBQ3pCLFlBQVk7RUFDWixZQUFZO0VBQ1osa0JBQWtCO0VBQ2xCLGVBQWU7RUFDZixrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQixlQUFlO0VBQ2Ysa0JBQWtCO0VBQ2xCLGtFQUFrRTtBQUNwRTs7QUFFQTtFQUNFLHlCQUF5QjtBQUMzQjs7QUFFQTtFQUNFLHlCQUF5QjtFQUN6Qix3Q0FBd0M7RUFDeEMsMEJBQTBCO0FBQzVCOztBQUVBO0VBQ0UsV0FBVztFQUNYLGtCQUFrQjtFQUNsQixNQUFNO0VBQ04sT0FBTztFQUNQLFFBQVE7RUFDUixTQUFTO0VBQ1QsdUZBQXVGO0VBQ3ZGLGtCQUFrQjtFQUNsQixvQkFBb0I7QUFDdEI7O0FBRUE7RUFDRSxXQUFXO0VBQ1gsa0JBQWtCO0VBQ2xCLE1BQU07RUFDTixPQUFPO0VBQ1AsV0FBVztFQUNYLFlBQVk7RUFDWiwwQ0FBMEM7RUFDMUMsa0JBQWtCO0VBQ2xCLG9CQUFvQjtFQUNwQixVQUFVO0VBQ1YscUJBQXFCO0VBQ3JCLHdDQUF3QztBQUMxQzs7QUFFQTtFQUNFLFVBQVU7RUFDVixtQkFBbUI7QUFDckI7O0FBRUE7RUFDRSxtQkFBbUI7QUFDckI7O0FBRUE7RUFDRSx5QkFBeUI7RUFDekIsWUFBWTtFQUNaLFlBQVk7RUFDWixrQkFBa0I7RUFDbEIsZUFBZTtFQUNmLGtCQUFrQjtFQUNsQixrQkFBa0I7RUFDbEIsZUFBZTtFQUNmLGtCQUFrQjtFQUNsQixrRUFBa0U7QUFDcEVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiKixcXHJcXG4qOjpiZWZvcmUsXFxyXFxuKjo6YWZ0ZXIge1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxyXFxufVxcclxcblxcclxcbmh0bWwsXFxyXFxuYm9keSB7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXHJcXG4gIGZvbnQtc2l6ZTogNjIuNSU7XFxyXFxuICBoZWlnaHQ6IDEwMCU7XFxyXFxufVxcclxcblxcclxcbiN0b2RvLWxpc3RfX2RpdiB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDUwJTtcXHJcXG4gIGxlZnQ6IDUwJTtcXHJcXG4gIHdpZHRoOiA5MCU7XFxyXFxuICBoZWlnaHQ6IDcwJTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmNGY0ZjQ7XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgYm94LXNoYWRvdzogMCA0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC45KTtcXHJcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbiAgb3ZlcmZsb3c6IHNjcm9sbDtcXHJcXG59XFxyXFxuXFxyXFxuLnRvZG8tZGF0ZSB7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLnRvZG8tZGF0ZV9fcCB7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxuICBmb250LXNpemU6IDNyZW07XFxyXFxuICBwYWRkaW5nOiAwLjRyZW07XFxyXFxuICBtYXJnaW4tbGVmdDogMXJlbTtcXHJcXG59XFxyXFxuXFxyXFxuLmxvYWRpbmctaWNvbiB7XFxyXFxuICB3aWR0aDogMTZweDtcXHJcXG4gIGhlaWdodDogMTZweDtcXHJcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcXFwiLi4vYXNzZXRzL2ljb25zL3Jvd3Muc3ZnXFxcIik7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xcclxcbiAgbWFyZ2luLXJpZ2h0OiAyMnB4O1xcclxcbn1cXHJcXG5cXHJcXG4udG9kby1kaXZfX3BsYWNlaG9sZGVyIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG59XFxyXFxuXFxyXFxuI25ldy10YXNrIHtcXHJcXG4gIHdpZHRoOiA4MCU7XFxyXFxuICBwYWRkaW5nOiAxMHB4O1xcclxcbiAgbWFyZ2luOiAxMHB4IDhweDtcXHJcXG4gIGJvcmRlcjogbm9uZTtcXHJcXG4gIGZvbnQtc2l6ZTogMS43cmVtO1xcclxcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcclxcbn1cXHJcXG5cXHJcXG4uYXJyb3cge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgcmlnaHQ6IDEwcHg7XFxyXFxuICB0b3A6IDUwJTtcXHJcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcXHJcXG4gIHdpZHRoOiAxN3B4O1xcclxcbiAgaGVpZ2h0OiAxN3B4O1xcclxcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFxcXCIuLi9hc3NldHMvaWNvbnMvcm93czIuc3ZnXFxcIik7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xcclxcbiAgbWFyZ2luLXJpZ2h0OiAyMnB4O1xcclxcbn1cXHJcXG5cXHJcXG4udG9kb3MtdWwge1xcclxcbiAgbGlzdC1zdHlsZTogbm9uZTtcXHJcXG4gIHBhZGRpbmc6IDA7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxufVxcclxcblxcclxcbi50b2Rvcy11bCBsaSB7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDA7XFxyXFxuICBmb250LXNpemU6IDJyZW07XFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgbGlnaHRncmF5O1xcclxcbiAgcGFkZGluZzogMjNweCAzMHB4O1xcclxcbn1cXHJcXG5cXHJcXG5pbnB1dFt0eXBlPVxcXCJjaGVja2JveFxcXCJdIHtcXHJcXG4gIG1hcmdpbi1yaWdodDogMThweDtcXHJcXG59XFxyXFxuXFxyXFxuLnRhc2stdGV4dCB7XFxyXFxuICBtYXgtd2lkdGg6IDU1JTtcXHJcXG4gIHdvcmQtd3JhcDogYnJlYWstd29yZDtcXHJcXG59XFxyXFxuXFxyXFxuLnRvZG8tZGF0ZSxcXHJcXG4udG9kby1kaXZfX3BsYWNlaG9sZGVyLFxcclxcbi50b2RvLWxpc3QsXFxyXFxuLmJ0biB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXHJcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBsaWdodGdyYXk7XFxyXFxuICBwYWRkaW5nOiAxMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4udG9kby1saXN0IHtcXHJcXG4gIGxpc3Qtc3R5bGU6IG5vbmU7XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgY29sb3I6IGJsYWNrO1xcclxcbn1cXHJcXG5cXHJcXG4uYnRuIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IGdyYXk7XFxyXFxuICBib3JkZXItYm90dG9tOiBub25lO1xcclxcbiAgbWFyZ2luLXRvcDogLTZweDtcXHJcXG59XFxyXFxuXFxyXFxuLmJ0bi1wIHtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIHBhZGRpbmc6IDEwcHg7XFxyXFxuICBtYXJnaW46IDEwcHggMDtcXHJcXG4gIGZvbnQtc2l6ZTogMS42cmVtO1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTtcXHJcXG4gIGNvbG9yOiAjZmZmO1xcclxcbn1cXHJcXG5cXHJcXG4jbWFpbi1jb250ZW50IHtcXHJcXG4gIGZsZXg6IDE7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbi50aHJlZS1kb3RzLWljb24ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgcmlnaHQ6IDM1cHg7XFxyXFxuICB3aWR0aDogMThweDtcXHJcXG4gIGhlaWdodDogMjhweDtcXHJcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcXFwiLi4vYXNzZXRzL2ljb25zL2VsaXBzaXMuc3ZnXFxcIik7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xcclxcbiAgY3Vyc29yOiBtb3ZlO1xcclxcbn1cXHJcXG5cXHJcXG4uZXJhc2UtaWNvbiB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICByaWdodDogMi44ZW07XFxyXFxuICBmb250LXNpemU6IDEuMmVtO1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG5cXHJcXG4jZm9vdGVyIHtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIHBhZGRpbmc6IDFyZW07XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjRmNGY0O1xcclxcbiAgYm94LXNoYWRvdzogMCAtNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMSk7XFxyXFxufVxcclxcblxcclxcbiNmb290ZXIgZGl2IHtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuI2Zvb3RlciBwIHtcXHJcXG4gIGZvbnQtc2l6ZTogMS40cmVtO1xcclxcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXHJcXG59XFxyXFxuXFxyXFxuI2Zvb3RlciBhIHtcXHJcXG4gIGNvbG9yOiAjMDBiN2ZmO1xcclxcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBOaWdodCBtb2RlIHN0eWxlcyAqL1xcclxcbi5uaWdodC1tb2RlIGJvZHkge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDtcXHJcXG59XFxyXFxuXFxyXFxuLm5pZ2h0LW1vZGUgLnRvZG8tZGF0ZV9fcCB7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxuICBmb250LXNpemU6IDMuNXJlbTtcXHJcXG4gIHBhZGRpbmc6IDEwcHg7XFxyXFxuICBjb2xvcjogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbi5uaWdodC1tb2RlIGEge1xcclxcbiAgY29sb3I6ICMwMGI3ZmY7XFxyXFxufVxcclxcblxcclxcbi5uaWdodC1tb2RlIGJ1dHRvbiB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwO1xcclxcbiAgY29sb3I6ICNmMWYxZjE7XFxyXFxufVxcclxcblxcclxcbi5uaWdodC1tb2RlIC50b2RvLWRhdGUsXFxyXFxuLm5pZ2h0LW1vZGUgLnRvZG8tZGl2X19wbGFjZWhvbGRlcixcXHJcXG4ubmlnaHQtbW9kZSAudG9kby1saXN0LFxcclxcbi5uaWdodC1tb2RlIC5idG4ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMzMztcXHJcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBsaWdodGdyYXk7XFxyXFxufVxcclxcblxcclxcbi5uaWdodC1tb2RlIC50b2RvLWxpc3Qge1xcclxcbiAgY29sb3I6ICNmZmY7XFxyXFxufVxcclxcblxcclxcbi5uaWdodC1tb2RlICN0b2RvLWxpc3RfX2RpdiB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIGJveC1zaGFkb3c6IDEwMHB4IC0xMDBweCAyNnB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTtcXHJcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbiAgb3ZlcmZsb3c6IHNjcm9sbDtcXHJcXG59XFxyXFxuXFxyXFxuLm5pZ2h0LW1vZGUgLnRhc2staXRlbSB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiBncmF5O1xcclxcbiAgY29sb3I6ICMwMDA7XFxyXFxufVxcclxcblxcclxcbi5uaWdodC1tb2RlICNmb290ZXIge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMzMztcXHJcXG4gIGNvbG9yOiAjZmZmO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBDb29sIEJ1dHRvbiBTdHlsZXMgKi9cXHJcXG4uY29vbC1idXR0b24ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogIzRjOGJmNTtcXHJcXG4gIGJvcmRlcjogbm9uZTtcXHJcXG4gIGNvbG9yOiB3aGl0ZTtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gIGZvbnQtc2l6ZTogMTZweDtcXHJcXG4gIHBhZGRpbmc6IDEycHggMjRweDtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG4gIG1hcmdpbi10b3A6IDEuMnJlbTtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4zcywgYm94LXNoYWRvdyAwLjNzLCB0cmFuc2Zvcm0gMC4zcztcXHJcXG59XFxyXFxuXFxyXFxuLmNvb2wtYnV0dG9uOmhvdmVyIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICMzZDc1ZDg7XFxyXFxufVxcclxcblxcclxcbi5jb29sLWJ1dHRvbjphY3RpdmUge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMwNjNhYjtcXHJcXG4gIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuOSk7XFxyXFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMnB4KTtcXHJcXG59XFxyXFxuXFxyXFxuLmNvb2wtYnV0dG9uOjpiZWZvcmUge1xcclxcbiAgY29udGVudDogXFxcIlxcXCI7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDA7XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICBib3R0b206IDA7XFxyXFxuICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSk7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLmNvb2wtYnV0dG9uOjphZnRlciB7XFxyXFxuICBjb250ZW50OiBcXFwiXFxcIjtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGhlaWdodDogMTAwJTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjAxLCAyMDEsIDIwMSwgMC4xKTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIHRyYW5zZm9ybTogc2NhbGUoMC43KTtcXHJcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcywgdHJhbnNmb3JtIDAuM3M7XFxyXFxufVxcclxcblxcclxcbi5jb29sLWJ1dHRvbjpob3Zlcjo6YWZ0ZXIge1xcclxcbiAgb3BhY2l0eTogMTtcXHJcXG4gIHRyYW5zZm9ybTogc2NhbGUoMSk7XFxyXFxufVxcclxcblxcclxcbiN0b2dnbGUtdGhlbWUge1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcXHJcXG59XFxyXFxuXFxyXFxuLm5pZ2h0LW1vZGUgLmNvb2wtYnV0dG9uIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICM2YzczN2U7XFxyXFxuICBib3JkZXI6IG5vbmU7XFxyXFxuICBjb2xvcjogd2hpdGU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBmb250LXNpemU6IDE2cHg7XFxyXFxuICBwYWRkaW5nOiAxMnB4IDI0cHg7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuM3MsIGJveC1zaGFkb3cgMC4zcywgdHJhbnNmb3JtIDAuM3M7XFxyXFxufVxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcpIHtcbiAgdmFyIGxpc3QgPSBbXTtcblxuICAvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXG4gIGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjb250ZW50ID0gXCJcIjtcbiAgICAgIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2YgaXRlbVs1XSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgKz0gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtKTtcbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSkuam9pbihcIlwiKTtcbiAgfTtcblxuICAvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxuICBsaXN0LmkgPSBmdW5jdGlvbiBpKG1vZHVsZXMsIG1lZGlhLCBkZWR1cGUsIHN1cHBvcnRzLCBsYXllcikge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgdW5kZWZpbmVkXV07XG4gICAgfVxuICAgIHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XG4gICAgaWYgKGRlZHVwZSkge1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aGlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHZhciBpZCA9IHRoaXNba11bMF07XG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIF9rID0gMDsgX2sgPCBtb2R1bGVzLmxlbmd0aDsgX2srKykge1xuICAgICAgdmFyIGl0ZW0gPSBbXS5jb25jYXQobW9kdWxlc1tfa10pO1xuICAgICAgaWYgKGRlZHVwZSAmJiBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBsYXllciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW1bNV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtZWRpYSkge1xuICAgICAgICBpZiAoIWl0ZW1bMl0pIHtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3VwcG9ydHMpIHtcbiAgICAgICAgaWYgKCFpdGVtWzRdKSB7XG4gICAgICAgICAgaXRlbVs0XSA9IFwiXCIuY29uY2F0KHN1cHBvcnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNF0gPSBzdXBwb3J0cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGxpc3Q7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh1cmwsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGlmICghdXJsKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICB1cmwgPSBTdHJpbmcodXJsLl9fZXNNb2R1bGUgPyB1cmwuZGVmYXVsdCA6IHVybCk7XG5cbiAgLy8gSWYgdXJsIGlzIGFscmVhZHkgd3JhcHBlZCBpbiBxdW90ZXMsIHJlbW92ZSB0aGVtXG4gIGlmICgvXlsnXCJdLipbJ1wiXSQvLnRlc3QodXJsKSkge1xuICAgIHVybCA9IHVybC5zbGljZSgxLCAtMSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMuaGFzaCkge1xuICAgIHVybCArPSBvcHRpb25zLmhhc2g7XG4gIH1cblxuICAvLyBTaG91bGQgdXJsIGJlIHdyYXBwZWQ/XG4gIC8vIFNlZSBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXZhbHVlcy0zLyN1cmxzXG4gIGlmICgvW1wiJygpIFxcdFxcbl18KCUyMCkvLnRlc3QodXJsKSB8fCBvcHRpb25zLm5lZWRRdW90ZXMpIHtcbiAgICByZXR1cm4gXCJcXFwiXCIuY29uY2F0KHVybC5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJykucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIiksIFwiXFxcIlwiKTtcbiAgfVxuICByZXR1cm4gdXJsO1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlbSkge1xuICB2YXIgY29udGVudCA9IGl0ZW1bMV07XG4gIHZhciBjc3NNYXBwaW5nID0gaXRlbVszXTtcbiAgaWYgKCFjc3NNYXBwaW5nKSB7XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBidG9hID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB2YXIgYmFzZTY0ID0gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY3NzTWFwcGluZykpKSk7XG4gICAgdmFyIGRhdGEgPSBcInNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LFwiLmNvbmNhdChiYXNlNjQpO1xuICAgIHZhciBzb3VyY2VNYXBwaW5nID0gXCIvKiMgXCIuY29uY2F0KGRhdGEsIFwiICovXCIpO1xuICAgIHJldHVybiBbY29udGVudF0uY29uY2F0KFtzb3VyY2VNYXBwaW5nXSkuam9pbihcIlxcblwiKTtcbiAgfVxuICByZXR1cm4gW2NvbnRlbnRdLmpvaW4oXCJcXG5cIik7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc3R5bGVzSW5ET00gPSBbXTtcbmZ1bmN0aW9uIGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgdmFyIHJlc3VsdCA9IC0xO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlc0luRE9NLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0eWxlc0luRE9NW2ldLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgIHJlc3VsdCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKSB7XG4gIHZhciBpZENvdW50TWFwID0ge307XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV07XG4gICAgdmFyIGlkID0gb3B0aW9ucy5iYXNlID8gaXRlbVswXSArIG9wdGlvbnMuYmFzZSA6IGl0ZW1bMF07XG4gICAgdmFyIGNvdW50ID0gaWRDb3VudE1hcFtpZF0gfHwgMDtcbiAgICB2YXIgaWRlbnRpZmllciA9IFwiXCIuY29uY2F0KGlkLCBcIiBcIikuY29uY2F0KGNvdW50KTtcbiAgICBpZENvdW50TWFwW2lkXSA9IGNvdW50ICsgMTtcbiAgICB2YXIgaW5kZXhCeUlkZW50aWZpZXIgPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICB2YXIgb2JqID0ge1xuICAgICAgY3NzOiBpdGVtWzFdLFxuICAgICAgbWVkaWE6IGl0ZW1bMl0sXG4gICAgICBzb3VyY2VNYXA6IGl0ZW1bM10sXG4gICAgICBzdXBwb3J0czogaXRlbVs0XSxcbiAgICAgIGxheWVyOiBpdGVtWzVdXG4gICAgfTtcbiAgICBpZiAoaW5kZXhCeUlkZW50aWZpZXIgIT09IC0xKSB7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0ucmVmZXJlbmNlcysrO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnVwZGF0ZXIob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVwZGF0ZXIgPSBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMuYnlJbmRleCA9IGk7XG4gICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoaSwgMCwge1xuICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgICB1cGRhdGVyOiB1cGRhdGVyLFxuICAgICAgICByZWZlcmVuY2VzOiAxXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcbiAgfVxuICByZXR1cm4gaWRlbnRpZmllcnM7XG59XG5mdW5jdGlvbiBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKSB7XG4gIHZhciBhcGkgPSBvcHRpb25zLmRvbUFQSShvcHRpb25zKTtcbiAgYXBpLnVwZGF0ZShvYmopO1xuICB2YXIgdXBkYXRlciA9IGZ1bmN0aW9uIHVwZGF0ZXIobmV3T2JqKSB7XG4gICAgaWYgKG5ld09iaikge1xuICAgICAgaWYgKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiYgbmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiYgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcCAmJiBuZXdPYmouc3VwcG9ydHMgPT09IG9iai5zdXBwb3J0cyAmJiBuZXdPYmoubGF5ZXIgPT09IG9iai5sYXllcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhcGkudXBkYXRlKG9iaiA9IG5ld09iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZW1vdmUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB1cGRhdGVyO1xufVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobGlzdCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgbGlzdCA9IGxpc3QgfHwgW107XG4gIHZhciBsYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xuICAgIG5ld0xpc3QgPSBuZXdMaXN0IHx8IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tpXTtcbiAgICAgIHZhciBpbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhdLnJlZmVyZW5jZXMtLTtcbiAgICB9XG4gICAgdmFyIG5ld0xhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShuZXdMaXN0LCBvcHRpb25zKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9pZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW19pXTtcbiAgICAgIHZhciBfaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihfaWRlbnRpZmllcik7XG4gICAgICBpZiAoc3R5bGVzSW5ET01bX2luZGV4XS5yZWZlcmVuY2VzID09PSAwKSB7XG4gICAgICAgIHN0eWxlc0luRE9NW19pbmRleF0udXBkYXRlcigpO1xuICAgICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoX2luZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGFzdElkZW50aWZpZXJzID0gbmV3TGFzdElkZW50aWZpZXJzO1xuICB9O1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIG1lbW8gPSB7fTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBnZXRUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgbWVtb1t0YXJnZXRdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdmFyIHN0eWxlVGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpO1xuXG4gICAgLy8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcbiAgICBpZiAod2luZG93LkhUTUxJRnJhbWVFbGVtZW50ICYmIHN0eWxlVGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuICAgICAgICAvLyBkdWUgdG8gY3Jvc3Mtb3JpZ2luIHJlc3RyaWN0aW9uc1xuICAgICAgICBzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgICBzdHlsZVRhcmdldCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIG1lbW9bdGFyZ2V0XSA9IHN0eWxlVGFyZ2V0O1xuICB9XG4gIHJldHVybiBtZW1vW3RhcmdldF07XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0QnlTZWxlY3RvcihpbnNlcnQsIHN0eWxlKSB7XG4gIHZhciB0YXJnZXQgPSBnZXRUYXJnZXQoaW5zZXJ0KTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGEgc3R5bGUgdGFyZ2V0LiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgJ2luc2VydCcgcGFyYW1ldGVyIGlzIGludmFsaWQuXCIpO1xuICB9XG4gIHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydEJ5U2VsZWN0b3I7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpIHtcbiAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gIG9wdGlvbnMuc2V0QXR0cmlidXRlcyhlbGVtZW50LCBvcHRpb25zLmF0dHJpYnV0ZXMpO1xuICBvcHRpb25zLmluc2VydChlbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xuICByZXR1cm4gZWxlbWVudDtcbn1cbm1vZHVsZS5leHBvcnRzID0gaW5zZXJ0U3R5bGVFbGVtZW50OyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcyhzdHlsZUVsZW1lbnQpIHtcbiAgdmFyIG5vbmNlID0gdHlwZW9mIF9fd2VicGFja19ub25jZV9fICE9PSBcInVuZGVmaW5lZFwiID8gX193ZWJwYWNrX25vbmNlX18gOiBudWxsO1xuICBpZiAobm9uY2UpIHtcbiAgICBzdHlsZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgbm9uY2UpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlczsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaikge1xuICB2YXIgY3NzID0gXCJcIjtcbiAgaWYgKG9iai5zdXBwb3J0cykge1xuICAgIGNzcyArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KG9iai5zdXBwb3J0cywgXCIpIHtcIik7XG4gIH1cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIkBtZWRpYSBcIi5jb25jYXQob2JqLm1lZGlhLCBcIiB7XCIpO1xuICB9XG4gIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2Ygb2JqLmxheWVyICE9PSBcInVuZGVmaW5lZFwiO1xuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwiQGxheWVyXCIuY29uY2F0KG9iai5sYXllci5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KG9iai5sYXllcikgOiBcIlwiLCBcIiB7XCIpO1xuICB9XG4gIGNzcyArPSBvYmouY3NzO1xuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgaWYgKG9iai5zdXBwb3J0cykge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICB2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcbiAgaWYgKHNvdXJjZU1hcCAmJiB0eXBlb2YgYnRvYSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGNzcyArPSBcIlxcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsXCIuY29uY2F0KGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSksIFwiICovXCIpO1xuICB9XG5cbiAgLy8gRm9yIG9sZCBJRVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgICovXG4gIG9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG59XG5mdW5jdGlvbiByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KSB7XG4gIC8vIGlzdGFuYnVsIGlnbm9yZSBpZlxuICBpZiAoc3R5bGVFbGVtZW50LnBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50KTtcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBkb21BUEkob3B0aW9ucykge1xuICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKCkge30sXG4gICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHt9XG4gICAgfTtcbiAgfVxuICB2YXIgc3R5bGVFbGVtZW50ID0gb3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucyk7XG4gIHJldHVybiB7XG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUob2JqKSB7XG4gICAgICBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaik7XG4gICAgfSxcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpO1xuICAgIH1cbiAgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZG9tQVBJOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50KSB7XG4gIGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuICAgIHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3M7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICBzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgICBzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc3R5bGVUYWdUcmFuc2Zvcm07IiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3N0eWxlLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3R5bGUuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVRhc2tJbmRleGVzKHRhc2tzKSB7XG4gIC8vIFVwZGF0ZSBpbmRleGVzIGZvciBhbGwgcmVtYWluaW5nIHRhc2tzXG4gIGNvbnN0IHRhc2tMaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvZG9zLXVsJyk7XG4gIGNvbnN0IHJlbWFpbmluZ1Rhc2tzID0gdGFza0xpc3QucXVlcnlTZWxlY3RvckFsbCgnLnRhc2staXRlbScpO1xuICByZW1haW5pbmdUYXNrcy5mb3JFYWNoKCh0YXNrLCBpbmRleCkgPT4ge1xuICAgIHRhc2suZGF0YXNldC5pbmRleCA9IGluZGV4ICsgMTtcbiAgICB0YXNrLnRhc2tFbGVtZW50LnRhc2suaW5kZXggPSBpbmRleCArIDE7IC8vIFVwZGF0ZSB0aGUgVGFza0VsZW1lbnQgaW5zdGFuY2VcbiAgICBjb25zdCBjaGVja2JveCA9IHRhc2sucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1jaGVja2JveF0nKTtcbiAgICBjaGVja2JveC5uYW1lID0gYHRhc2stJHtpbmRleCArIDF9YDtcbiAgICBjb25zdCBsYWJlbCA9IHRhc2sucXVlcnlTZWxlY3RvcignLnRhc2stdGV4dCcpO1xuICAgIGxhYmVsLnNldEF0dHJpYnV0ZSgnZm9yJywgYHRhc2stJHtpbmRleCArIDF9YCk7XG4gIH0pO1xuXG4gIC8vIFVwZGF0ZSB0YXNrcyBpbiBsb2NhbCBzdG9yYWdlXG4gIHRhc2tzLmZvckVhY2goKHRhc2ssIGluZGV4KSA9PiB7XG4gICAgdGFzay5pbmRleCA9IGluZGV4ICsgMTtcbiAgfSk7XG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0YXNrcycsIEpTT04uc3RyaW5naWZ5KHRhc2tzKSk7XG59XG5leHBvcnQgZGVmYXVsdCB1cGRhdGVUYXNrSW5kZXhlcztcbiIsImV4cG9ydCBmdW5jdGlvbiBnZXRUYXNrc0Zyb21Mb2NhbFN0b3JhZ2UoKSB7XG4gIGNvbnN0IHN0b3JlZFRhc2tzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Rhc2tzJyk7XG4gIGlmIChzdG9yZWRUYXNrcyAhPT0gbnVsbCAmJiBzdG9yZWRUYXNrcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzdG9yZWRUYXNrcyk7XG4gIH1cbiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Rhc2tzJywgSlNPTi5zdHJpbmdpZnkoW10pKTtcbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZXRUYXNrc0Zyb21Mb2NhbFN0b3JhZ2U7IiwiaW1wb3J0IHsgZ2V0VGFza3NGcm9tTG9jYWxTdG9yYWdlIH0gZnJvbSAnLi9sb2NhbFN0b3JhZ2VIZWxwZXIuanMnO1xuaW1wb3J0IHsgdXBkYXRlVGFza0luZGV4ZXMgfSBmcm9tICcuL3VwZGF0ZUluZGV4ZXMuanMnO1xuaW1wb3J0IHsgdG9nZ2xlVGFza0NvbXBsZXRpb24gfSBmcm9tICcuL3N0YXR1c1VwZGF0ZXMuanMnO1xuXG5jbGFzcyBUYXNrRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHRhc2spIHtcbiAgICB0aGlzLnRhc2sgPSB0YXNrO1xuICAgIHRoaXMubGlzdEl0ZW0gPSB0aGlzLmNyZWF0ZSgpO1xuICAgIHRoaXMuZXJhc2VJY29uID0gdGhpcy5saXN0SXRlbS5xdWVyeVNlbGVjdG9yKCcuZXJhc2UtaWNvbicpO1xuICAgIHRoaXMudGFza1RleHQgPSB0aGlzLmxpc3RJdGVtLnF1ZXJ5U2VsZWN0b3IoJy50YXNrLXRleHQnKTtcbiAgICB0aGlzLnRocmVlRG90c0ljb24gPSB0aGlzLmxpc3RJdGVtLnF1ZXJ5U2VsZWN0b3IoJy50aHJlZS1kb3RzLWljb24nKTtcbiAgfVxuXG4gIGNyZWF0ZSgpIHtcbiAgICBjb25zdCBsaXN0SXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG4gICAgbGlzdEl0ZW0uZGF0YXNldC5pbmRleCA9IHRoaXMudGFzay5pbmRleDtcbiAgICBsaXN0SXRlbS5jbGFzc0xpc3QuYWRkKCd0YXNrLWl0ZW0nKTtcbiAgICBsaXN0SXRlbS50YXNrRWxlbWVudCA9IHRoaXM7XG5cbiAgICBjb25zdCBjaGVja2JveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgY2hlY2tib3gudHlwZSA9ICdjaGVja2JveCc7XG4gICAgY2hlY2tib3guY2hlY2tlZCA9IHRoaXMudGFzay5jb21wbGV0ZWQ7XG4gICAgbGlzdEl0ZW0uYXBwZW5kQ2hpbGQoY2hlY2tib3gpO1xuXG4gICAgY29uc3QgdGFza1RleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgdGFza1RleHQuY2xhc3NMaXN0LmFkZCgndGFzay10ZXh0Jyk7XG4gICAgdGFza1RleHQuaW5uZXJUZXh0ID0gdGhpcy50YXNrLmRlc2NyaXB0aW9uO1xuICAgIGxpc3RJdGVtLmFwcGVuZENoaWxkKHRhc2tUZXh0KTtcblxuICAgIGNvbnN0IGVyYXNlSWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBlcmFzZUljb24uY2xhc3NOYW1lID0gJ2VyYXNlLWljb24nO1xuICAgIGVyYXNlSWNvbi5pbm5lckhUTUwgPSAn4p2MJztcbiAgICBlcmFzZUljb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBsaXN0SXRlbS5hcHBlbmRDaGlsZChlcmFzZUljb24pO1xuXG4gICAgY29uc3QgdGhyZWVEb3RzSWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICB0aHJlZURvdHNJY29uLmNsYXNzTmFtZSA9ICd0aHJlZS1kb3RzLWljb24nO1xuICAgIGxpc3RJdGVtLmFwcGVuZENoaWxkKHRocmVlRG90c0ljb24pO1xuXG4gICAgbGlzdEl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKCkgPT4ge1xuICAgICAgZXJhc2VJY29uLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcbiAgICAgIHRocmVlRG90c0ljb24uc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snO1xuICAgICAgbGlzdEl0ZW0uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ2xpZ2h0Z3JheSc7XG4gICAgICB0YXNrVGV4dC5jb250ZW50RWRpdGFibGUgPSAndHJ1ZSc7XG4gICAgfSk7XG5cbiAgICB0YXNrVGV4dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xuICAgICAgY29uc3QgdGFza3MgPSBnZXRUYXNrc0Zyb21Mb2NhbFN0b3JhZ2UoKTtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGFza3MuZmluZEluZGV4KCh0YXNrKSA9PiB0YXNrLmluZGV4ID09PSB0aGlzLnRhc2suaW5kZXgpO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICB0YXNrc1tpbmRleF0uZGVzY3JpcHRpb24gPSB0YXNrVGV4dC5pbm5lclRleHQudHJpbSgpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndGFza3MnLCBKU09OLnN0cmluZ2lmeSh0YXNrcykpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbGlzdEl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCAoKSA9PiB7XG4gICAgICBlcmFzZUljb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGxpc3RJdGVtLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcnO1xuICAgICAgdGFza1RleHQuY29udGVudEVkaXRhYmxlID0gJ2ZhbHNlJztcbiAgICB9KTtcbiAgICBjaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0YXNrcyA9IGdldFRhc2tzRnJvbUxvY2FsU3RvcmFnZSgpO1xuICAgICAgY29uc3QgaW5kZXggPSB0YXNrcy5maW5kSW5kZXgoKHRhc2spID0+IHRhc2suaW5kZXggPT09IHRoaXMudGFzay5pbmRleCk7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRvZ2dsZVRhc2tDb21wbGV0aW9uKHRhc2tzW2luZGV4XSwgdGFza3MpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxpc3RJdGVtO1xuICB9XG5cbiAgZGVsZXRlVGFzaygpIHtcbiAgICBjb25zdCB0YXNrcyA9IGdldFRhc2tzRnJvbUxvY2FsU3RvcmFnZSgpO1xuICAgIGNvbnN0IGluZGV4ID0gdGFza3MuZmluZEluZGV4KCh0YXNrKSA9PiB0YXNrLmluZGV4ID09PSB0aGlzLnRhc2suaW5kZXgpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHRhc2tzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAvLyBVcGRhdGUgdGFzayBpbmRleGVzXG4gICAgICB0YXNrcy5mb3JFYWNoKCh0YXNrLCBuZXdJbmRleCkgPT4ge1xuICAgICAgICB0YXNrLmluZGV4ID0gbmV3SW5kZXggKyAxO1xuICAgICAgfSk7XG4gICAgICAvLyBVcGRhdGUgbG9jYWwgc3RvcmFnZVxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Rhc2tzJywgSlNPTi5zdHJpbmdpZnkodGFza3MpKTtcbiAgICB9XG4gICAgLy8gUmVtb3ZlIHRoZSBsaXN0IGl0ZW0gZWxlbWVudCBmcm9tIHRoZSBET01cbiAgICB0aGlzLmxpc3RJdGVtLnJlbW92ZSgpO1xuICAgIHVwZGF0ZVRhc2tJbmRleGVzKHRhc2tzKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUYXNrRWxlbWVudDsiLCJleHBvcnQgZnVuY3Rpb24gdG9nZ2xlVGFza0NvbXBsZXRpb24odGFzaywgdGFza3MpIHtcbiAgdGFzay5jb21wbGV0ZWQgPSAhdGFzay5jb21wbGV0ZWQ7XG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0YXNrcycsIEpTT04uc3RyaW5naWZ5KHRhc2tzKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNvbXBsZXRlZFRhc2tzKHRhc2tzKSB7XG4gIHJldHVybiB0YXNrcy5maWx0ZXIoKHRhc2spID0+ICF0YXNrLmNvbXBsZXRlZCk7XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVUYXNrRWxlbWVudCB9IGZyb20gJy4vdG9kby5qcyc7XG5pbXBvcnQgVGFza0VsZW1lbnQgZnJvbSAnLi90YXNrRWxlbWVudC5qcyc7XG5cbmNvbnN0IGFkZFRhc2sgPSAodGFza3MsIGlucHV0VmFsdWUpID0+IHtcbiAgY29uc3QgbmV3VGFzayA9IHtcbiAgICBkZXNjcmlwdGlvbjogaW5wdXRWYWx1ZSxcbiAgICBjb21wbGV0ZWQ6IGZhbHNlLFxuICAgIGluZGV4OiB0YXNrcy5sZW5ndGggKyAxLFxuICB9O1xuICB0YXNrcy5wdXNoKG5ld1Rhc2spO1xuICBjb25zdCB0YXNrTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b2Rvcy11bCcpO1xuICBjb25zdCB0YXNrRWxlbWVudCA9IG5ldyBUYXNrRWxlbWVudChuZXdUYXNrKTtcbiAgY29uc3QgbmV3VGFza0VsZW1lbnQgPSBjcmVhdGVUYXNrRWxlbWVudChuZXdUYXNrLCB0YXNrRWxlbWVudCk7XG4gIHRhc2tMaXN0LmFwcGVuZENoaWxkKG5ld1Rhc2tFbGVtZW50KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGFkZFRhc2s7XG4iLCJpbXBvcnQgVGFza0VsZW1lbnQgZnJvbSAnLi90YXNrRWxlbWVudC5qcyc7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVUYXNrRWxlbWVudCA9ICh0YXNrKSA9PiB7XG4gIGNvbnN0IHRhc2tFbGVtZW50ID0gbmV3IFRhc2tFbGVtZW50KHRhc2spO1xuICByZXR1cm4gdGFza0VsZW1lbnQuY3JlYXRlKCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVUYXNrRWxlbWVudDsiLCJpbXBvcnQgVGFza0VsZW1lbnQgZnJvbSAnLi90YXNrRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBnZXRUYXNrc0Zyb21Mb2NhbFN0b3JhZ2UgfSBmcm9tICcuL2xvY2FsU3RvcmFnZUhlbHBlci5qcyc7XG5pbXBvcnQgeyBjbGVhckNvbXBsZXRlZFRhc2tzIH0gZnJvbSAnLi9zdGF0dXNVcGRhdGVzLmpzJztcbmltcG9ydCB7IHVwZGF0ZVRhc2tJbmRleGVzIH0gZnJvbSAnLi91cGRhdGVJbmRleGVzLmpzJztcblxuY2xhc3MgVG9Eb1N0cnVjdHVyZSB7XG4gIGNvbnN0cnVjdG9yKHRhc2tzLCBwb3B1bGF0ZVRhc2tzRnVuYykge1xuICAgIHRoaXMudGFza3MgPSB0YXNrcztcbiAgICB0aGlzLnBvcHVsYXRlVGFza3MgPSBwb3B1bGF0ZVRhc2tzRnVuYztcbiAgICB0aGlzLnVwZGF0ZVRhc2tzID0gKG5ld1Rhc2tzKSA9PiB7XG4gICAgICB0aGlzLnRhc2tzLmxlbmd0aCA9IDA7XG4gICAgICBuZXdUYXNrcy5mb3JFYWNoKCh0YXNrKSA9PiB0aGlzLnRhc2tzLnB1c2godGFzaykpO1xuICAgIH07XG4gIH1cblxuICBjcmVhdGUoKSB7XG4gICAgY29uc3QgbWFpbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21haW4nKTtcbiAgICBtYWluLmlkID0gJ3RvZG8tbGlzdF9fZGl2JztcblxuICAgIG1haW4uYXBwZW5kQ2hpbGQoVG9Eb1N0cnVjdHVyZS5jcmVhdGVUb2RvRGF0ZURpdigpKTtcbiAgICBtYWluLmFwcGVuZENoaWxkKFRvRG9TdHJ1Y3R1cmUuY3JlYXRlVG9kb0RpdlBsYWNlaG9sZGVyKCkpO1xuICAgIG1haW4uYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVUb2RvTGlzdERpdigpKTtcbiAgICBtYWluLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlQnRuRGl2KHRoaXMucG9wdWxhdGVUYXNrcykpO1xuXG4gICAgcmV0dXJuIG1haW47XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlVG9kb0RhdGVEaXYoKSB7XG4gICAgY29uc3QgdG9kb0RhdGVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0b2RvRGF0ZURpdi5jbGFzc05hbWUgPSAndG9kby1kYXRlJztcblxuICAgIGNvbnN0IHRvZG9EYXRlUCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTtcbiAgICB0b2RvRGF0ZVAuY2xhc3NOYW1lID0gJ3RvZG8tZGF0ZV9fcCc7XG4gICAgdG9kb0RhdGVQLnRleHRDb250ZW50ID0gXCJUb2RheSdzIFRvIERvXCI7XG4gICAgdG9kb0RhdGVEaXYuYXBwZW5kQ2hpbGQodG9kb0RhdGVQKTtcblxuICAgIGNvbnN0IGxvYWRpbmdJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIGxvYWRpbmdJY29uLmNsYXNzTmFtZSA9ICdsb2FkaW5nLWljb24nO1xuICAgIHRvZG9EYXRlRGl2LmFwcGVuZENoaWxkKGxvYWRpbmdJY29uKTtcblxuICAgIHJldHVybiB0b2RvRGF0ZURpdjtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVUb2RvRGl2UGxhY2Vob2xkZXIoKSB7XG4gICAgY29uc3QgdG9kb0RpdlBsYWNlaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdG9kb0RpdlBsYWNlaG9sZGVyLmNsYXNzTmFtZSA9ICd0b2RvLWRpdl9fcGxhY2Vob2xkZXInO1xuXG4gICAgY29uc3QgbmV3VGFza0lucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBuZXdUYXNrSW5wdXQuaWQgPSAnbmV3LXRhc2snO1xuICAgIG5ld1Rhc2tJbnB1dC50eXBlID0gJ3RleHQnO1xuICAgIG5ld1Rhc2tJbnB1dC5wbGFjZWhvbGRlciA9ICdBZGQgdG8geW91ciBsaXN0Li4uJztcbiAgICB0b2RvRGl2UGxhY2Vob2xkZXIuYXBwZW5kQ2hpbGQobmV3VGFza0lucHV0KTtcblxuICAgIGNvbnN0IGFycm93SWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBhcnJvd0ljb24uY2xhc3NOYW1lID0gJ2Fycm93JztcbiAgICB0b2RvRGl2UGxhY2Vob2xkZXIuYXBwZW5kQ2hpbGQoYXJyb3dJY29uKTtcblxuICAgIHJldHVybiB0b2RvRGl2UGxhY2Vob2xkZXI7XG4gIH1cblxuICBjcmVhdGVUb2RvTGlzdERpdigpIHtcbiAgICBjb25zdCB0b2RvTGlzdERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRvZG9MaXN0RGl2LmNsYXNzTmFtZSA9ICd0b2RvLWxpc3QnO1xuXG4gICAgY29uc3QgdG9kb3NVbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XG4gICAgdG9kb3NVbC5jbGFzc05hbWUgPSAndG9kb3MtdWwnO1xuICAgIHRoaXMudGFza3NcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleClcbiAgICAgIC5mb3JFYWNoKCh0YXNrKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhc2tFbGVtZW50ID0gbmV3IFRhc2tFbGVtZW50KHRhc2spO1xuICAgICAgICB0b2Rvc1VsLmFwcGVuZENoaWxkKHRhc2tFbGVtZW50LmNyZWF0ZSgpKTtcbiAgICAgIH0pO1xuICAgIHRvZG9MaXN0RGl2LmFwcGVuZENoaWxkKHRvZG9zVWwpO1xuXG4gICAgcmV0dXJuIHRvZG9MaXN0RGl2O1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgY3JlYXRlQnRuRGl2KHBvcHVsYXRlVGFza3NGdW5jKSB7XG4gICAgY29uc3QgYnRuRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgYnRuRGl2LmNsYXNzTmFtZSA9ICdidG4nO1xuICAgIGNvbnN0IGJ0blAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICBidG5QLmNsYXNzTmFtZSA9ICdidG4tcCc7XG4gICAgYnRuUC50ZXh0Q29udGVudCA9ICdDbGVhciBhbGwgY29tcGxldGVkJztcbiAgICBidG5EaXYuYXBwZW5kQ2hpbGQoYnRuUCk7XG4gICAgYnRuUC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IHRhc2tzID0gZ2V0VGFza3NGcm9tTG9jYWxTdG9yYWdlKCk7XG4gICAgICBjb25zdCB1cGRhdGVkVGFza3MgPSBjbGVhckNvbXBsZXRlZFRhc2tzKHRhc2tzKTtcbiAgICAgIHVwZGF0ZVRhc2tJbmRleGVzKHVwZGF0ZWRUYXNrcyk7XG4gICAgICBwb3B1bGF0ZVRhc2tzRnVuYyh1cGRhdGVkVGFza3MpO1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Rhc2tzJywgSlNPTi5zdHJpbmdpZnkodXBkYXRlZFRhc2tzKSk7XG4gICAgICB0aGlzLnVwZGF0ZVRhc2tzKHVwZGF0ZWRUYXNrcyk7IC8vIFVwZGF0ZSB0aGUgdGFza3MgYXJyYXlcbiAgICB9KTtcbiAgICByZXR1cm4gYnRuRGl2O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRvRG9TdHJ1Y3R1cmU7IiwiaW1wb3J0ICcuL3N0eWxlLmNzcyc7XG5pbXBvcnQgeyB1cGRhdGVUYXNrSW5kZXhlcyB9IGZyb20gJy4vbW9kdWxlcy91cGRhdGVJbmRleGVzLmpzJztcbmltcG9ydCBhZGRUYXNrIGZyb20gJy4vbW9kdWxlcy9hZGRUYXNrLmpzJztcbmltcG9ydCB7IGdldFRhc2tzRnJvbUxvY2FsU3RvcmFnZSB9IGZyb20gJy4vbW9kdWxlcy9sb2NhbFN0b3JhZ2VIZWxwZXIuanMnO1xuaW1wb3J0IFRhc2tFbGVtZW50IGZyb20gJy4vbW9kdWxlcy90YXNrRWxlbWVudC5qcyc7XG5pbXBvcnQgVG9Eb1N0cnVjdHVyZSBmcm9tICcuL21vZHVsZXMvVG9Eb1N0cnVjdHVyZS5qcyc7XG5pbXBvcnQgeyBlbmFibGVOaWdodE1vZGUgfSBmcm9tICcuL21vZHVsZXMvbmlnaHRNb2RlLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHBvcHVsYXRlVGFza3ModGFza3MpIHtcbiAgY29uc3QgdG9kb0xpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG9kb3MtdWwnKTtcblxuICAvLyBDbGVhciB0aGUgY3VycmVudCB0YXNrIGxpc3QgZWxlbWVudHNcbiAgd2hpbGUgKHRvZG9MaXN0LmZpcnN0Q2hpbGQpIHtcbiAgICB0b2RvTGlzdC5yZW1vdmVDaGlsZCh0b2RvTGlzdC5maXJzdENoaWxkKTtcbiAgfVxuXG4gIHRhc2tzLmZvckVhY2goKHRhc2spID0+IHtcbiAgICBjb25zdCB0YXNrRWxlbWVudCA9IG5ldyBUYXNrRWxlbWVudCh0YXNrKTtcbiAgICB0b2RvTGlzdC5hcHBlbmRDaGlsZCh0YXNrRWxlbWVudC5jcmVhdGUoKSk7XG4gIH0pO1xufVxuXG5jb25zdCB0YXNrcyA9IGdldFRhc2tzRnJvbUxvY2FsU3RvcmFnZSgpO1xuY29uc3QgdG9Eb1N0cnVjdHVyZSA9IG5ldyBUb0RvU3RydWN0dXJlKHRhc2tzLCBwb3B1bGF0ZVRhc2tzKS5jcmVhdGUoKTtcbmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2RvLWxpc3QtcGxhY2Vob2xkZXInKS5hcHBlbmRDaGlsZCh0b0RvU3RydWN0dXJlKTtcbnBvcHVsYXRlVGFza3ModGFza3MpOyAvLyBDYWxsIHRoZSBmdW5jdGlvbiB3aXRoIHRhc2tzIGFyZ3VtZW50XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuICB1cGRhdGVUYXNrSW5kZXhlcyh0YXNrcyk7XG59KTtcblxuY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmV3LXRhc2snKTtcbmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGV2ZW50KSA9PiB7XG4gIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICBjb25zdCBpbnB1dFZhbHVlID0gaW5wdXQudmFsdWUudHJpbSgpO1xuICAgIGlmIChpbnB1dFZhbHVlICE9PSAnJykge1xuICAgICAgYWRkVGFzayh0YXNrcywgaW5wdXRWYWx1ZSwgcG9wdWxhdGVUYXNrcyk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndGFza3MnLCBKU09OLnN0cmluZ2lmeSh0YXNrcykpO1xuICAgICAgaW5wdXQudmFsdWUgPSAnJztcbiAgICB9XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBlcmFzZVRhc2tGcm9tVmlldyh0YXNrRWxlbWVudCkge1xuICB0YXNrRWxlbWVudC5kZWxldGVUYXNrKCk7XG59XG5cbmNvbnN0IHRvZG9MaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvZG9zLXVsJyk7XG5cbnRvZG9MaXN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gIGlmIChldmVudC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdlcmFzZS1pY29uJykpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBsaXN0SXRlbSA9IGV2ZW50LnRhcmdldC5wYXJlbnRFbGVtZW50O1xuICAgIGNvbnN0IHsgdGFza0VsZW1lbnQgfSA9IGxpc3RJdGVtO1xuICAgIGVyYXNlVGFza0Zyb21WaWV3KHRhc2tFbGVtZW50KTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgdGFza3MgYXJyYXlcbiAgICBjb25zdCB0YXNrSW5kZXggPSB0YXNrcy5maW5kSW5kZXgoKHRhc2spID0+IHRhc2suaW5kZXggPT09IHRhc2tFbGVtZW50LnRhc2suaW5kZXgpO1xuICAgIGlmICh0YXNrSW5kZXggPiAtMSkge1xuICAgICAgdGFza3Muc3BsaWNlKHRhc2tJbmRleCwgMSk7XG4gICAgICB1cGRhdGVUYXNrSW5kZXhlcyh0YXNrcyk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndGFza3MnLCBKU09OLnN0cmluZ2lmeSh0YXNrcykpO1xuICAgIH1cbiAgICAvLyBSZW1vdmUgdGhlIGxpc3RJdGVtIGRpcmVjdGx5IGZyb20gdGhlIERPTSB3aXRob3V0IHJlcG9wdWxhdGluZyB0aGUgZW50aXJlIGxpc3RcbiAgICBsaXN0SXRlbS5yZW1vdmUoKTtcbiAgfVxufSk7XG5lbmFibGVOaWdodE1vZGUoKTtcbmV4cG9ydCBkZWZhdWx0IHBvcHVsYXRlVGFza3M7IiwiZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZU5pZ2h0TW9kZSgpIHtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHtcbiAgICBjb25zdCB0b2dnbGVUaGVtZUJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2dnbGUtdGhlbWUnKTtcbiAgICBjb25zdCBodG1sID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgZnVuY3Rpb24gdG9nZ2xlTmlnaHRNb2RlKCkge1xuICAgICAgaWYgKGh0bWwuY2xhc3NMaXN0LmNvbnRhaW5zKCduaWdodC1tb2RlJykpIHtcbiAgICAgICAgaHRtbC5jbGFzc0xpc3QucmVtb3ZlKCduaWdodC1tb2RlJyk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCduaWdodE1vZGUnLCAnZGlzYWJsZWQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGh0bWwuY2xhc3NMaXN0LmFkZCgnbmlnaHQtbW9kZScpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbmlnaHRNb2RlJywgJ2VuYWJsZWQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBseSB0aGUgbmlnaHQgbW9kZSBpZiBpdCB3YXMgcHJldmlvdXNseSBlbmFibGVkXG4gICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCduaWdodE1vZGUnKSA9PT0gJ2VuYWJsZWQnKSB7XG4gICAgICBodG1sLmNsYXNzTGlzdC5hZGQoJ25pZ2h0LW1vZGUnKTtcbiAgICB9XG5cbiAgICB0b2dnbGVUaGVtZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRvZ2dsZU5pZ2h0TW9kZSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBlbmFibGVOaWdodE1vZGU7Il0sIm5hbWVzIjpbIl9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8wX19fIiwiVVJMIiwiX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzFfX18iLCJfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMl9fXyIsIl9fX0NTU19MT0FERVJfRVhQT1JUX19fIiwiX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMF9fXyIsIl9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzFfX18iLCJfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8yX19fIiwicHVzaCIsIm1vZHVsZSIsImlkIiwiZXhwb3J0cyIsImNzc1dpdGhNYXBwaW5nVG9TdHJpbmciLCJsaXN0IiwidG9TdHJpbmciLCJ0aGlzIiwibWFwIiwiaXRlbSIsImNvbnRlbnQiLCJuZWVkTGF5ZXIiLCJjb25jYXQiLCJsZW5ndGgiLCJqb2luIiwiaSIsIm1vZHVsZXMiLCJtZWRpYSIsImRlZHVwZSIsInN1cHBvcnRzIiwibGF5ZXIiLCJ1bmRlZmluZWQiLCJhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzIiwiayIsIl9rIiwidXJsIiwib3B0aW9ucyIsIlN0cmluZyIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwidGVzdCIsInNsaWNlIiwiaGFzaCIsIm5lZWRRdW90ZXMiLCJyZXBsYWNlIiwiY3NzTWFwcGluZyIsImJ0b2EiLCJiYXNlNjQiLCJ1bmVzY2FwZSIsImVuY29kZVVSSUNvbXBvbmVudCIsIkpTT04iLCJzdHJpbmdpZnkiLCJkYXRhIiwic291cmNlTWFwcGluZyIsInN0eWxlc0luRE9NIiwiZ2V0SW5kZXhCeUlkZW50aWZpZXIiLCJpZGVudGlmaWVyIiwicmVzdWx0IiwibW9kdWxlc1RvRG9tIiwiaWRDb3VudE1hcCIsImlkZW50aWZpZXJzIiwiYmFzZSIsImNvdW50IiwiaW5kZXhCeUlkZW50aWZpZXIiLCJvYmoiLCJjc3MiLCJzb3VyY2VNYXAiLCJyZWZlcmVuY2VzIiwidXBkYXRlciIsImFkZEVsZW1lbnRTdHlsZSIsImJ5SW5kZXgiLCJzcGxpY2UiLCJhcGkiLCJkb21BUEkiLCJ1cGRhdGUiLCJuZXdPYmoiLCJyZW1vdmUiLCJsYXN0SWRlbnRpZmllcnMiLCJuZXdMaXN0IiwiaW5kZXgiLCJuZXdMYXN0SWRlbnRpZmllcnMiLCJfaSIsIl9pbmRleCIsIm1lbW8iLCJpbnNlcnQiLCJzdHlsZSIsInRhcmdldCIsInN0eWxlVGFyZ2V0IiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwid2luZG93IiwiSFRNTElGcmFtZUVsZW1lbnQiLCJjb250ZW50RG9jdW1lbnQiLCJoZWFkIiwiZSIsImdldFRhcmdldCIsIkVycm9yIiwiYXBwZW5kQ2hpbGQiLCJlbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsInNldEF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVzIiwic3R5bGVFbGVtZW50Iiwibm9uY2UiLCJzZXRBdHRyaWJ1dGUiLCJpbnNlcnRTdHlsZUVsZW1lbnQiLCJzdHlsZVRhZ1RyYW5zZm9ybSIsImFwcGx5IiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwicmVtb3ZlU3R5bGVFbGVtZW50Iiwic3R5bGVTaGVldCIsImNzc1RleHQiLCJmaXJzdENoaWxkIiwiY3JlYXRlVGV4dE5vZGUiLCJ1cGRhdGVUYXNrSW5kZXhlcyIsInRhc2tzIiwicXVlcnlTZWxlY3RvckFsbCIsImZvckVhY2giLCJ0YXNrIiwiZGF0YXNldCIsInRhc2tFbGVtZW50IiwibmFtZSIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJnZXRUYXNrc0Zyb21Mb2NhbFN0b3JhZ2UiLCJzdG9yZWRUYXNrcyIsImdldEl0ZW0iLCJwYXJzZSIsImNvbnN0cnVjdG9yIiwibGlzdEl0ZW0iLCJjcmVhdGUiLCJlcmFzZUljb24iLCJ0YXNrVGV4dCIsInRocmVlRG90c0ljb24iLCJjbGFzc0xpc3QiLCJhZGQiLCJjaGVja2JveCIsInR5cGUiLCJjaGVja2VkIiwiY29tcGxldGVkIiwiaW5uZXJUZXh0IiwiZGVzY3JpcHRpb24iLCJjbGFzc05hbWUiLCJpbm5lckhUTUwiLCJkaXNwbGF5IiwiYWRkRXZlbnRMaXN0ZW5lciIsImJhY2tncm91bmRDb2xvciIsImNvbnRlbnRFZGl0YWJsZSIsImZpbmRJbmRleCIsInRyaW0iLCJ0b2dnbGVUYXNrQ29tcGxldGlvbiIsImRlbGV0ZVRhc2siLCJuZXdJbmRleCIsImlucHV0VmFsdWUiLCJuZXdUYXNrIiwidGFza0xpc3QiLCJuZXdUYXNrRWxlbWVudCIsIlRvRG9TdHJ1Y3R1cmUiLCJwb3B1bGF0ZVRhc2tzRnVuYyIsInBvcHVsYXRlVGFza3MiLCJ1cGRhdGVUYXNrcyIsIm5ld1Rhc2tzIiwibWFpbiIsImNyZWF0ZVRvZG9EYXRlRGl2IiwiY3JlYXRlVG9kb0RpdlBsYWNlaG9sZGVyIiwiY3JlYXRlVG9kb0xpc3REaXYiLCJjcmVhdGVCdG5EaXYiLCJzdGF0aWMiLCJ0b2RvRGF0ZURpdiIsInRvZG9EYXRlUCIsInRleHRDb250ZW50IiwibG9hZGluZ0ljb24iLCJ0b2RvRGl2UGxhY2Vob2xkZXIiLCJuZXdUYXNrSW5wdXQiLCJwbGFjZWhvbGRlciIsImFycm93SWNvbiIsInRvZG9MaXN0RGl2IiwidG9kb3NVbCIsInNvcnQiLCJhIiwiYiIsImJ0bkRpdiIsImJ0blAiLCJ1cGRhdGVkVGFza3MiLCJmaWx0ZXIiLCJjbGVhckNvbXBsZXRlZFRhc2tzIiwidG9kb0xpc3QiLCJ0b0RvU3RydWN0dXJlIiwiZ2V0RWxlbWVudEJ5SWQiLCJpbnB1dCIsImV2ZW50Iiwia2V5IiwidmFsdWUiLCJjb250YWlucyIsInN0b3BQcm9wYWdhdGlvbiIsInBhcmVudEVsZW1lbnQiLCJlcmFzZVRhc2tGcm9tVmlldyIsInRhc2tJbmRleCIsInRvZ2dsZVRoZW1lQnV0dG9uIiwiaHRtbCIsImRvY3VtZW50RWxlbWVudCJdLCJzb3VyY2VSb290IjoiIn0= --------------------------------------------------------------------------------