├── .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 |
Night Mode
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 |
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=
--------------------------------------------------------------------------------