diff --git a/.eslintrc.json b/.eslintrc.json old mode 100644 new mode 100755 diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/.hintrc b/.hintrc old mode 100644 new mode 100755 diff --git a/.stylelintrc.json b/.stylelintrc.json old mode 100644 new mode 100755 diff --git a/.vscode/settings.json b/.vscode/settings.json index 23830fb..2f16237 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,4 @@ { - "git.ignoreLimitWarning": true -} + "liveServer.settings.port": 5502, + "livePreview.defaultPreviewPath": "/src/index.html" +} \ No newline at end of file diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 3b12581..eb997bb --- a/README.md +++ b/README.md @@ -2,21 +2,23 @@ # To Do List - ## Description +"A To-Do-List app designed to help users organise their daily activities. it simply creates a list of things you want to do and allows you to mark them as complete. -"To-do list" is a tool that helps to organize your day. It simply lists the things that you need to do and allows you to mark them as complete. +- Page view: +> | To Do List | +> | -------------------------------- | +> | ![Screenshot1](./add-remove.png) | -- This is the page view: +## Live Demo: -> | To Do List | -> |-------------------| -> | ![Screenshot1](https://user-images.githubusercontent.com/79058364/134364133-16b1160b-8975-4820-a3d7-ebe8acd72db0.png)| +## Live Demo +[Click Here to view live version](https://lambent-hamster-121a58.netlify.app/) -> Learning objectives: +> Learning objectives: - Use webpack to bundle JavaScript. - Learn how to use proper ES6 syntax. @@ -29,51 +31,51 @@ - Java Script - Webpack - ## Getting Started To get the content of this project locally you need to run this command in your terminal: - - `https://github.com/evans22j/MY-TO-DO-LIST.git` - +- `https://github.com/evans22j/TO-DO-LIST.git` ### Setup -- To clone the repository run this command `https://github.com/evans22j/MY-TO-DO-LIST.git` +- To clone the repository run this command `https://github.com/evans22j/TO-DO-LIST.git` ## Test For tracking linter errors locally you need to follow these steps: - After cloning the project you need to run this command + > npm install - `This command will download all the dependencies of the project` + > `This command will download all the dependencies of the project` - For tracking the linter errors in HTML file run: + > npx hint . - For tracking the linter errors in CSS file run: - > npx stylelint "**/*.{css,scss}" + + > npx stylelint "\*_/_.{css,scss}" - And For tracking the linter errors in JavaScript file run: - > npx eslint . + + > npx eslint . - Use `npm run build` to run the app in live server - + - Install `npm install --save-dev webpack-dev-server` to have the ability to use live reloading. - - - Then Run from the command line `npm start` to will see the browser automatically loading up our page. + - Then Run from the command line `npm start` to will see the browser automatically loading up our page. ## Getting Started To get a local copy up and running follow these simple example steps. -1. Clone the Repo or Download the Zip file and Extract by clicking here [GitHub Repo]{https://github.com/evans22j/MY-TO-DO-LIST.git} +1. Clone the Repo or Download the Zip file and Extract by clicking here [GitHub Repo]{https://github.com/evans22j/TO-DO-LIST.git} 2. mkdir the folder of your choice -3. cd the folder -4. git clone - +3. cd the folder +4. git clone ## Author @@ -83,8 +85,6 @@ To get a local copy up and running follow these simple example steps. - Twitter: [@Evans_22J](https://twitter.com/Evans_22J) - LinkedIn: [Evans Sitibekiso](https://www.linkedin.com/in/evans-sitibekiso-a85753202/) - - ## 🤝 Contributing Contributions, issues, and feature requests are welcome! @@ -95,6 +95,6 @@ Feel free to check the [issues page](../../issues/). Give a ⭐️ if you like this project! - ## Acknowledgments -- Huge thanks to my coding partners \ No newline at end of file + +- Huge thanks to my coding partners diff --git a/add-remove.png b/add-remove.png new file mode 100644 index 0000000..cab5336 Binary files /dev/null and b/add-remove.png differ diff --git a/dist/index.html b/dist/index.html index 868aa39..f5af4d0 100644 --- a/dist/index.html +++ b/dist/index.html @@ -1,43 +1,30 @@ - - - - - - - To Do List - - - - -
-
- Today's To Do - -
- -
-
- - -
-
- - - -
- -
-
- - - + + + + + + + To Do list + + + +
+
+
+

To Do Lists

+
+
+

Today's To Do

+
+ + +
+
    +
    + +
    +
    +
    +
    + \ No newline at end of file diff --git a/dist/main.js b/dist/main.js index df453a0..12fbd0c 100644 --- a/dist/main.js +++ b/dist/main.js @@ -1,5 +1,4 @@ /******/ (() => { // webpackBootstrap -/******/ "use strict"; /******/ var __webpack_modules__ = ({ /***/ "./node_modules/css-loader/dist/cjs.js!./src/style.css": @@ -8,6 +7,7 @@ \*************************************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { +"use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) @@ -21,7 +21,7 @@ __webpack_require__.r(__webpack_exports__); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module -___CSS_LOADER_EXPORT___.push([module.id, ":root {\n --primary: rgb(71, 69, 69);\n --secondary: #ccc;\n --border: rgb(221, 219, 219);\n --background: rgb(243, 243, 243);\n}\n\n* {\n box-sizing: border-box;\n padding: 0;\n margin: 0;\n}\n\n.d-flex {\n display: flex;\n}\n\n.flex-center {\n align-items: center;\n}\n\nbody {\n width: 100%;\n min-height: 100vh;\n background-color: var(--background);\n font-size: 1.4rem;\n}\n\ni {\n cursor: pointer;\n color: var(--secondary);\n}\n\nsection {\n background-color: #fff;\n width: 50%;\n min-width: 300px;\n box-shadow: 0 3px 10px rgb(0 0 0 / 20%);\n border-radius: 6px;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n\n.header {\n border-bottom: 1px solid var(--border);\n padding: 1.2rem 1.5rem;\n color: var(--primary);\n justify-content: space-between;\n}\n\nform button {\n background-color: transparent;\n border: none;\n padding: 0.6rem;\n}\n\nform button i {\n transform: rotate(90deg);\n font-size: 1rem;\n font-weight: 400;\n}\n\n.header i {\n transform: rotate(90deg);\n font-size: 18px;\n}\n\nform > div {\n border-bottom: 1px solid var(--border);\n padding: 0.7rem 1.5rem;\n justify-content: space-between;\n width: 100%;\n}\n\nform input {\n border: none;\n outline: none;\n min-width: 250px;\n padding: 0.8rem 0;\n flex: 1;\n}\n\nform input,\nform input::-webkit-input-placeholder {\n font-size: 1.2rem;\n font-family: 'Roboto', sans-serif;\n font-style: italic;\n font-weight: 100;\n color: rgb(131, 130, 130);\n}\n\n.tasks-list {\n min-width: 100%;\n}\n\n.tasks-list li {\n width: 100%;\n list-style: none;\n border-bottom: 1px solid var(--border);\n padding: 0.7rem 1.2rem;\n}\n\n.tasks-list li label {\n margin-left: 6px;\n font-size: inherit;\n color: var(--primary);\n cursor: pointer;\n}\n\n/* .tasks-list li label.compeleted {\n text-decoration: line-through;\n font-style: italic;\n color: var(--secondary);\n} */\n\n.tasks-list li i:hover {\n color: var(--primary);\n cursor: pointer;\n}\n\n.clear-btn button {\n width: 100%;\n font-size: inherit;\n padding: 1.2rem;\n border: none;\n outline: none;\n color: var(--secondary);\n background-color: var(--background);\n border-bottom-left-radius: 8px;\n border-bottom-right-radius: 8px;\n cursor: pointer;\n}\n\n.task-container .task-details {\n flex: 1;\n display: flex;\n padding: 0 1rem;\n}\n\n.task-container .task-details span {\n margin-left: 6px;\n font-size: inherit;\n color: var(--primary);\n}\n\n.task-container .task-details span.compeleted {\n text-decoration: line-through;\n}\n\n.task-container .task-details input {\n border: none;\n font-size: inherit;\n color: var(--primary);\n outline: none;\n flex: 1;\n display: none;\n background-color: transparent;\n}\n\n.task-container .task-action-btns button {\n width: 2.2rem;\n background-color: transparent;\n border: none;\n cursor: pointer;\n padding: 0.6rem 0;\n}\n\n.task-container .task-action-btns button:last-child {\n display: none;\n}\n\n.edit-task-form {\n flex: 1;\n display: flex;\n}\n\n.task-container .task-action-btns button i {\n font-size: 1.2rem;\n}\n\n.task-container.edit-mode {\n background-color: #faf3db;\n}\n\n.task-container.edit-mode .task-action-btns button:last-child {\n display: block;\n}\n\n.task-details.completed span {\n text-decoration: line-through;\n}\n\n.task-container.edit-mode .task-action-btns button:first-child {\n display: none;\n}\n\n.task-container.edit-mode .task-details input {\n display: block;\n}\n\n.task-container.edit-mode .task-details span {\n display: none;\n}\n", "",{"version":3,"sources":["webpack://./src/style.css"],"names":[],"mappings":"AAAA;EACE,0BAA0B;EAC1B,iBAAiB;EACjB,4BAA4B;EAC5B,gCAAgC;AAClC;;AAEA;EACE,sBAAsB;EACtB,UAAU;EACV,SAAS;AACX;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,WAAW;EACX,iBAAiB;EACjB,mCAAmC;EACnC,iBAAiB;AACnB;;AAEA;EACE,eAAe;EACf,uBAAuB;AACzB;;AAEA;EACE,sBAAsB;EACtB,UAAU;EACV,gBAAgB;EAChB,uCAAuC;EACvC,kBAAkB;EAClB,kBAAkB;EAClB,QAAQ;EACR,SAAS;EACT,gCAAgC;AAClC;;AAEA;EACE,sCAAsC;EACtC,sBAAsB;EACtB,qBAAqB;EACrB,8BAA8B;AAChC;;AAEA;EACE,6BAA6B;EAC7B,YAAY;EACZ,eAAe;AACjB;;AAEA;EACE,wBAAwB;EACxB,eAAe;EACf,gBAAgB;AAClB;;AAEA;EACE,wBAAwB;EACxB,eAAe;AACjB;;AAEA;EACE,sCAAsC;EACtC,sBAAsB;EACtB,8BAA8B;EAC9B,WAAW;AACb;;AAEA;EACE,YAAY;EACZ,aAAa;EACb,gBAAgB;EAChB,iBAAiB;EACjB,OAAO;AACT;;AAEA;;EAEE,iBAAiB;EACjB,iCAAiC;EACjC,kBAAkB;EAClB,gBAAgB;EAChB,yBAAyB;AAC3B;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,WAAW;EACX,gBAAgB;EAChB,sCAAsC;EACtC,sBAAsB;AACxB;;AAEA;EACE,gBAAgB;EAChB,kBAAkB;EAClB,qBAAqB;EACrB,eAAe;AACjB;;AAEA;;;;GAIG;;AAEH;EACE,qBAAqB;EACrB,eAAe;AACjB;;AAEA;EACE,WAAW;EACX,kBAAkB;EAClB,eAAe;EACf,YAAY;EACZ,aAAa;EACb,uBAAuB;EACvB,mCAAmC;EACnC,8BAA8B;EAC9B,+BAA+B;EAC/B,eAAe;AACjB;;AAEA;EACE,OAAO;EACP,aAAa;EACb,eAAe;AACjB;;AAEA;EACE,gBAAgB;EAChB,kBAAkB;EAClB,qBAAqB;AACvB;;AAEA;EACE,6BAA6B;AAC/B;;AAEA;EACE,YAAY;EACZ,kBAAkB;EAClB,qBAAqB;EACrB,aAAa;EACb,OAAO;EACP,aAAa;EACb,6BAA6B;AAC/B;;AAEA;EACE,aAAa;EACb,6BAA6B;EAC7B,YAAY;EACZ,eAAe;EACf,iBAAiB;AACnB;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,OAAO;EACP,aAAa;AACf;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,6BAA6B;AAC/B;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,aAAa;AACf","sourcesContent":[":root {\n --primary: rgb(71, 69, 69);\n --secondary: #ccc;\n --border: rgb(221, 219, 219);\n --background: rgb(243, 243, 243);\n}\n\n* {\n box-sizing: border-box;\n padding: 0;\n margin: 0;\n}\n\n.d-flex {\n display: flex;\n}\n\n.flex-center {\n align-items: center;\n}\n\nbody {\n width: 100%;\n min-height: 100vh;\n background-color: var(--background);\n font-size: 1.4rem;\n}\n\ni {\n cursor: pointer;\n color: var(--secondary);\n}\n\nsection {\n background-color: #fff;\n width: 50%;\n min-width: 300px;\n box-shadow: 0 3px 10px rgb(0 0 0 / 20%);\n border-radius: 6px;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n\n.header {\n border-bottom: 1px solid var(--border);\n padding: 1.2rem 1.5rem;\n color: var(--primary);\n justify-content: space-between;\n}\n\nform button {\n background-color: transparent;\n border: none;\n padding: 0.6rem;\n}\n\nform button i {\n transform: rotate(90deg);\n font-size: 1rem;\n font-weight: 400;\n}\n\n.header i {\n transform: rotate(90deg);\n font-size: 18px;\n}\n\nform > div {\n border-bottom: 1px solid var(--border);\n padding: 0.7rem 1.5rem;\n justify-content: space-between;\n width: 100%;\n}\n\nform input {\n border: none;\n outline: none;\n min-width: 250px;\n padding: 0.8rem 0;\n flex: 1;\n}\n\nform input,\nform input::-webkit-input-placeholder {\n font-size: 1.2rem;\n font-family: 'Roboto', sans-serif;\n font-style: italic;\n font-weight: 100;\n color: rgb(131, 130, 130);\n}\n\n.tasks-list {\n min-width: 100%;\n}\n\n.tasks-list li {\n width: 100%;\n list-style: none;\n border-bottom: 1px solid var(--border);\n padding: 0.7rem 1.2rem;\n}\n\n.tasks-list li label {\n margin-left: 6px;\n font-size: inherit;\n color: var(--primary);\n cursor: pointer;\n}\n\n/* .tasks-list li label.compeleted {\n text-decoration: line-through;\n font-style: italic;\n color: var(--secondary);\n} */\n\n.tasks-list li i:hover {\n color: var(--primary);\n cursor: pointer;\n}\n\n.clear-btn button {\n width: 100%;\n font-size: inherit;\n padding: 1.2rem;\n border: none;\n outline: none;\n color: var(--secondary);\n background-color: var(--background);\n border-bottom-left-radius: 8px;\n border-bottom-right-radius: 8px;\n cursor: pointer;\n}\n\n.task-container .task-details {\n flex: 1;\n display: flex;\n padding: 0 1rem;\n}\n\n.task-container .task-details span {\n margin-left: 6px;\n font-size: inherit;\n color: var(--primary);\n}\n\n.task-container .task-details span.compeleted {\n text-decoration: line-through;\n}\n\n.task-container .task-details input {\n border: none;\n font-size: inherit;\n color: var(--primary);\n outline: none;\n flex: 1;\n display: none;\n background-color: transparent;\n}\n\n.task-container .task-action-btns button {\n width: 2.2rem;\n background-color: transparent;\n border: none;\n cursor: pointer;\n padding: 0.6rem 0;\n}\n\n.task-container .task-action-btns button:last-child {\n display: none;\n}\n\n.edit-task-form {\n flex: 1;\n display: flex;\n}\n\n.task-container .task-action-btns button i {\n font-size: 1.2rem;\n}\n\n.task-container.edit-mode {\n background-color: #faf3db;\n}\n\n.task-container.edit-mode .task-action-btns button:last-child {\n display: block;\n}\n\n.task-details.completed span {\n text-decoration: line-through;\n}\n\n.task-container.edit-mode .task-action-btns button:first-child {\n display: none;\n}\n\n.task-container.edit-mode .task-details input {\n display: block;\n}\n\n.task-container.edit-mode .task-details span {\n display: none;\n}\n"],"sourceRoot":""}]); +___CSS_LOADER_EXPORT___.push([module.id, "h1 {\r\n text-align: center;\r\n}\r\n\r\nsection {\r\n width: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n}\r\n\r\nh2 {\r\n margin: 0;\r\n padding: 2%;\r\n background-color: white;\r\n}\r\n\r\nbutton {\r\n background-color: transparent;\r\n border: none;\r\n}\r\n\r\n.container {\r\n width: 100%;\r\n max-width: 500px;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n}\r\n\r\n.todolist-container {\r\n width: 100%;\r\n background-color: whitesmoke;\r\n display: grid;\r\n grid-template-columns: 1fr;\r\n row-gap: 2px;\r\n box-shadow: 1px 1px 5px gray;\r\n}\r\n\r\n.icon {\r\n width: 16px;\r\n width: 15px;\r\n padding-left: 5%;\r\n}\r\n\r\n.input-icon {\r\n width: 100%;\r\n margin-bottom: 1px;\r\n background-color: white;\r\n}\r\n\r\n.icon1 {\r\n float: right;\r\n color: rgb(142, 147, 151);\r\n cursor: pointer;\r\n font-size: medium;\r\n padding-right: 2%;\r\n}\r\n\r\n.task {\r\n background-color: white;\r\n display: flex;\r\n padding: 3%;\r\n}\r\n\r\n.todo-list {\r\n padding: 0;\r\n margin: 0;\r\n list-style: none;\r\n display: grid;\r\n grid-template-columns: 1fr;\r\n background-color: whitesmoke;\r\n row-gap: 2px;\r\n}\r\n\r\n.todo-input {\r\n width: 85%;\r\n border: none;\r\n padding: 10px;\r\n background-color: white;\r\n cursor: pointer;\r\n margin: 0;\r\n box-sizing: border-box;\r\n}\r\n\r\n.todo-input:focus {\r\n outline: none;\r\n border: 2px solid rgb(103, 160, 11);\r\n}\r\n\r\ninput::placeholder {\r\n font-style: italic;\r\n}\r\n\r\n.task-check {\r\n margin-right: 2%;\r\n}\r\n\r\n.list {\r\n padding: 0;\r\n margin: 0;\r\n list-style: none;\r\n display: grid;\r\n grid-template-columns: 1fr;\r\n background-color: whitesmoke;\r\n row-gap: 2px;\r\n}\r\n\r\n.clearer {\r\n padding: 2%;\r\n cursor: pointer;\r\n font-size: 20px;\r\n font-weight: lighter;\r\n}\r\n\r\n.clear-container {\r\n text-align: center;\r\n}\r\n\r\n.drag {\r\n margin-left: 8px;\r\n cursor: move;\r\n color: gray;\r\n font-size: 18px;\r\n}\r\n\r\n.drag:active {\r\n cursor: grabbing;\r\n}\r\n\r\n.task-text {\r\n border: none;\r\n box-sizing: border-box;\r\n width: 100%;\r\n font-family: 'Roboto', sans-serif;\r\n font-weight: 600;\r\n}\r\n\r\n.task-text:focus {\r\n outline: none;\r\n}\r\n\r\n#taskForm {\r\n display: flex;\r\n flex-wrap: nowrap;\r\n}\r\n\r\n#taskSubmit {\r\n font-size: 16px;\r\n width: 20%;\r\n background-color: white;\r\n margin: 0;\r\n cursor: pointer;\r\n padding-left: 10%;\r\n}\r\n\r\n.completed {\r\n text-decoration: line-through;\r\n}\r\n", "",{"version":3,"sources":["webpack://./src/style.css"],"names":[],"mappings":"AAAA;EACE,kBAAkB;AACpB;;AAEA;EACE,WAAW;EACX,aAAa;EACb,sBAAsB;EACtB,mBAAmB;AACrB;;AAEA;EACE,SAAS;EACT,WAAW;EACX,uBAAuB;AACzB;;AAEA;EACE,6BAA6B;EAC7B,YAAY;AACd;;AAEA;EACE,WAAW;EACX,gBAAgB;EAChB,aAAa;EACb,sBAAsB;EACtB,mBAAmB;AACrB;;AAEA;EACE,WAAW;EACX,4BAA4B;EAC5B,aAAa;EACb,0BAA0B;EAC1B,YAAY;EACZ,4BAA4B;AAC9B;;AAEA;EACE,WAAW;EACX,WAAW;EACX,gBAAgB;AAClB;;AAEA;EACE,WAAW;EACX,kBAAkB;EAClB,uBAAuB;AACzB;;AAEA;EACE,YAAY;EACZ,yBAAyB;EACzB,eAAe;EACf,iBAAiB;EACjB,iBAAiB;AACnB;;AAEA;EACE,uBAAuB;EACvB,aAAa;EACb,WAAW;AACb;;AAEA;EACE,UAAU;EACV,SAAS;EACT,gBAAgB;EAChB,aAAa;EACb,0BAA0B;EAC1B,4BAA4B;EAC5B,YAAY;AACd;;AAEA;EACE,UAAU;EACV,YAAY;EACZ,aAAa;EACb,uBAAuB;EACvB,eAAe;EACf,SAAS;EACT,sBAAsB;AACxB;;AAEA;EACE,aAAa;EACb,mCAAmC;AACrC;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,UAAU;EACV,SAAS;EACT,gBAAgB;EAChB,aAAa;EACb,0BAA0B;EAC1B,4BAA4B;EAC5B,YAAY;AACd;;AAEA;EACE,WAAW;EACX,eAAe;EACf,eAAe;EACf,oBAAoB;AACtB;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,YAAY;EACZ,WAAW;EACX,eAAe;AACjB;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,YAAY;EACZ,sBAAsB;EACtB,WAAW;EACX,iCAAiC;EACjC,gBAAgB;AAClB;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;EACb,iBAAiB;AACnB;;AAEA;EACE,eAAe;EACf,UAAU;EACV,uBAAuB;EACvB,SAAS;EACT,eAAe;EACf,iBAAiB;AACnB;;AAEA;EACE,6BAA6B;AAC/B","sourcesContent":["h1 {\r\n text-align: center;\r\n}\r\n\r\nsection {\r\n width: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n}\r\n\r\nh2 {\r\n margin: 0;\r\n padding: 2%;\r\n background-color: white;\r\n}\r\n\r\nbutton {\r\n background-color: transparent;\r\n border: none;\r\n}\r\n\r\n.container {\r\n width: 100%;\r\n max-width: 500px;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n}\r\n\r\n.todolist-container {\r\n width: 100%;\r\n background-color: whitesmoke;\r\n display: grid;\r\n grid-template-columns: 1fr;\r\n row-gap: 2px;\r\n box-shadow: 1px 1px 5px gray;\r\n}\r\n\r\n.icon {\r\n width: 16px;\r\n width: 15px;\r\n padding-left: 5%;\r\n}\r\n\r\n.input-icon {\r\n width: 100%;\r\n margin-bottom: 1px;\r\n background-color: white;\r\n}\r\n\r\n.icon1 {\r\n float: right;\r\n color: rgb(142, 147, 151);\r\n cursor: pointer;\r\n font-size: medium;\r\n padding-right: 2%;\r\n}\r\n\r\n.task {\r\n background-color: white;\r\n display: flex;\r\n padding: 3%;\r\n}\r\n\r\n.todo-list {\r\n padding: 0;\r\n margin: 0;\r\n list-style: none;\r\n display: grid;\r\n grid-template-columns: 1fr;\r\n background-color: whitesmoke;\r\n row-gap: 2px;\r\n}\r\n\r\n.todo-input {\r\n width: 85%;\r\n border: none;\r\n padding: 10px;\r\n background-color: white;\r\n cursor: pointer;\r\n margin: 0;\r\n box-sizing: border-box;\r\n}\r\n\r\n.todo-input:focus {\r\n outline: none;\r\n border: 2px solid rgb(103, 160, 11);\r\n}\r\n\r\ninput::placeholder {\r\n font-style: italic;\r\n}\r\n\r\n.task-check {\r\n margin-right: 2%;\r\n}\r\n\r\n.list {\r\n padding: 0;\r\n margin: 0;\r\n list-style: none;\r\n display: grid;\r\n grid-template-columns: 1fr;\r\n background-color: whitesmoke;\r\n row-gap: 2px;\r\n}\r\n\r\n.clearer {\r\n padding: 2%;\r\n cursor: pointer;\r\n font-size: 20px;\r\n font-weight: lighter;\r\n}\r\n\r\n.clear-container {\r\n text-align: center;\r\n}\r\n\r\n.drag {\r\n margin-left: 8px;\r\n cursor: move;\r\n color: gray;\r\n font-size: 18px;\r\n}\r\n\r\n.drag:active {\r\n cursor: grabbing;\r\n}\r\n\r\n.task-text {\r\n border: none;\r\n box-sizing: border-box;\r\n width: 100%;\r\n font-family: 'Roboto', sans-serif;\r\n font-weight: 600;\r\n}\r\n\r\n.task-text:focus {\r\n outline: none;\r\n}\r\n\r\n#taskForm {\r\n display: flex;\r\n flex-wrap: nowrap;\r\n}\r\n\r\n#taskSubmit {\r\n font-size: 16px;\r\n width: 20%;\r\n background-color: white;\r\n margin: 0;\r\n cursor: pointer;\r\n padding-left: 10%;\r\n}\r\n\r\n.completed {\r\n text-decoration: line-through;\r\n}\r\n"],"sourceRoot":""}]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); @@ -34,6 +34,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, ":root {\n --primary: rgb(71, 69, 69); \*****************************************************/ /***/ ((module) => { +"use strict"; /* @@ -145,6 +146,7 @@ module.exports = function (cssWithMappingToString) { \************************************************************/ /***/ ((module) => { +"use strict"; module.exports = function (item) { @@ -176,6 +178,7 @@ module.exports = function (item) { \***********************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { +"use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) @@ -230,6 +233,7 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js \****************************************************************************/ /***/ ((module) => { +"use strict"; var stylesInDOM = []; @@ -343,6 +347,7 @@ module.exports = function (list, options) { \********************************************************************/ /***/ ((module) => { +"use strict"; var memo = {}; @@ -391,6 +396,7 @@ module.exports = insertBySelector; \**********************************************************************/ /***/ ((module) => { +"use strict"; /* istanbul ignore next */ @@ -411,6 +417,7 @@ module.exports = insertStyleElement; \**********************************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { +"use strict"; /* istanbul ignore next */ @@ -432,6 +439,7 @@ module.exports = setAttributesWithoutAttributes; \***************************************************************/ /***/ ((module) => { +"use strict"; /* istanbul ignore next */ @@ -511,6 +519,7 @@ module.exports = domAPI; \*********************************************************************/ /***/ ((module) => { +"use strict"; /* istanbul ignore next */ @@ -530,289 +539,40 @@ module.exports = styleTagTransform; /***/ }), -/***/ "./src/Task.js": -/*!*********************!*\ - !*** ./src/Task.js ***! - \*********************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -class Task { - constructor() { - this.tasks = []; - } - - get() { - return this.tasks; - } - - add(task) { - this.tasks.push(task); - } - - update(taskId, task) { - this.tasks[taskId] = task; - } +/***/ "./src/populate.js": +/*!*************************!*\ + !*** ./src/populate.js ***! + \*************************/ +/***/ (() => { - remove(taskId) { - this.tasks = this.tasks.filter((task) => task.index.toString() !== taskId); - } - - clearCompleted() { - const newTasks = this.tasts.filter((task) => !task.completed); - this.tasks = newTasks.map((task, index) => { - task.index = index + 1; - return task; - }); - } -} - -const task = new Task(); - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (task); +throw new Error("Module parse failed: Unexpected token (21:2)\nYou may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders\n| updateIndex(list);\n| saveLocal(list);\n> } */"); /***/ }), -/***/ "./src/dom.js": -/*!********************!*\ - !*** ./src/dom.js ***! - \********************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _taskActions_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./taskActions.js */ "./src/taskActions.js"); - - -const tasksList = document.querySelector('.tasks-list'); -const dom = (() => { - const showTrashIcon = () => { - const editBtns = document.querySelectorAll('.task-edit-btn'); - - editBtns.forEach((editBtn) => { - editBtn.addEventListener('click', (e) => { - const tasksElements = document.querySelectorAll('.task-container'); - tasksElements.forEach((taskElm) => { - taskElm.classList.remove('edit-mode'); - }); - const parent = e.target.parentNode.parentNode.parentNode; - parent.classList.add('edit-mode'); - }); - }); - }; - - const renderTasks = (tasks) => { - tasksList.innerHTML = ''; - tasks.map((task) => { - const taskItem = document.createElement('li'); - taskItem.classList.add('task-container', 'd-flex', 'flex-center'); - taskItem.innerHTML = ` -
    - -
    -
    - ${task.description} -
    - -
    -
    -
    - - -
    - `; - showTrashIcon(); - dom.deleteTaskHandler(); - dom.editTastSubmit(); - dom.completeTaskHandler(); - dom.clearCompletedHandler(); - return tasksList.appendChild(taskItem); - }); - }; - - const editTastSubmit = () => { - const editTaskForms = document.querySelectorAll('.edit-task-form'); - editTaskForms.forEach((form) => { - form.addEventListener('submit', (e) => { - e.preventDefault(); - const taskId = form.getAttribute('data-task-id'); - if (form.elements[0].value.trim() === '') return; - const { tasks } = _taskActions_js__WEBPACK_IMPORTED_MODULE_0__["default"].updateTask( - taskId, - form.elements[0].value, - ); - - renderTasks(tasks); - }); - }); - }; - - const completeTaskHandler = () => { - const checkboxes = document.querySelectorAll('.task-checkbox'); - checkboxes.forEach((checkbox) => { - checkbox.addEventListener('change', (e) => { - const taskId = e.target.getAttribute('data-task-id'); - const { tasks } = _taskActions_js__WEBPACK_IMPORTED_MODULE_0__["default"].completeTask(taskId, e.target.checked); - renderTasks(tasks); - }); - }); - }; - - const deleteTaskHandler = () => { - const deleteBtns = document.querySelectorAll('.task-delete-btn'); - deleteBtns.forEach((btn) => { - btn.addEventListener('click', () => { - const taskId = btn.getAttribute('data-task-id'); - const tasks = _taskActions_js__WEBPACK_IMPORTED_MODULE_0__["default"].deleteTask(taskId); - renderTasks(tasks); - }); - }); - }; - - const clearCompletedHandler = () => { - const clearCompletedBtn = document.querySelector('.clear-completed-btn'); - clearCompletedBtn.addEventListener('click', () => { - const tasks = _taskActions_js__WEBPACK_IMPORTED_MODULE_0__["default"].clearCompleted(); - renderTasks(tasks); - }); - }; - - const updateUI = (tasks) => { - renderTasks(tasks); - }; - - return { - renderTasks, - editTastSubmit, - showTrashIcon, - updateUI, - completeTaskHandler, - deleteTaskHandler, - clearCompletedHandler, - }; -})(); - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (dom); - - -/***/ }), - -/***/ "./src/storage.js": -/*!************************!*\ - !*** ./src/storage.js ***! - \************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -const storage = { - // function manupilate the local storage - get: (key) => { - const value = localStorage.getItem(key); - return value ? JSON.parse(value) : null; - }, - set: (key, value) => { - localStorage.setItem(key, JSON.stringify(value)); - }, - remove: (key) => { - localStorage.removeItem(key); - }, -}; -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (storage); - -/***/ }), - -/***/ "./src/taskActions.js": -/*!****************************!*\ - !*** ./src/taskActions.js ***! - \****************************/ +/***/ "./src/status.js": +/*!***********************!*\ + !*** ./src/status.js ***! + \***********************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { +"use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ "saveLocal": () => (/* binding */ saveLocal), +/* harmony export */ "status": () => (/* binding */ status) /* harmony export */ }); -/* harmony import */ var _storage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./storage.js */ "./src/storage.js"); - - -const taskActions = (() => { - const addTask = (description) => { - const tasks = _storage_js__WEBPACK_IMPORTED_MODULE_0__["default"].get('tasks'); - const task = { - index: tasks.length + 1, - completed: false, - description, - }; - tasks.push(task); - _storage_js__WEBPACK_IMPORTED_MODULE_0__["default"].set('tasks', tasks); - return task; - }; - - const updateTask = (index, description) => { - const tasks = _storage_js__WEBPACK_IMPORTED_MODULE_0__["default"].get('tasks'); - const task = tasks[index - 1]; - task.description = description; - _storage_js__WEBPACK_IMPORTED_MODULE_0__["default"].set('tasks', tasks); - return { task, tasks }; - }; - - const completeTask = (index, checked) => { - const tasks = _storage_js__WEBPACK_IMPORTED_MODULE_0__["default"].get('tasks'); - const task = tasks[index - 1]; - task.completed = checked; - _storage_js__WEBPACK_IMPORTED_MODULE_0__["default"].set('tasks', tasks); - return { task, tasks }; - }; - - const deleteTask = (index) => { - let tasks = _storage_js__WEBPACK_IMPORTED_MODULE_0__["default"].get('tasks'); - tasks.splice(index - 1, 1); - tasks = tasks.map((task, i) => { - task.index = i + 1; - return task; - }); - _storage_js__WEBPACK_IMPORTED_MODULE_0__["default"].set('tasks', tasks); - return tasks; - }; - - const clearCompleted = () => { - const tasks = _storage_js__WEBPACK_IMPORTED_MODULE_0__["default"].get('tasks'); - let unCompletedTasks = tasks.filter((task) => !task.completed); - unCompletedTasks = unCompletedTasks.map((task, index) => { - task.index = index + 1; - return task; - }); - _storage_js__WEBPACK_IMPORTED_MODULE_0__["default"].set('tasks', unCompletedTasks); - return unCompletedTasks; - }; - - return { - addTask, - updateTask, - completeTask, - deleteTask, - clearCompleted, - }; -})(); - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (taskActions); +function saveLocal(list) { + window.localStorage.setItem('localTasks', JSON.stringify(list)); +} + +function status(elem, list) { + list.forEach((task) => { + if (task === elem) { + task.isCompleted = !task.isCompleted; + } + }); + saveLocal(list); +} /***/ }) @@ -885,55 +645,93 @@ const taskActions = (() => { /******/ /************************************************************************/ var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +// This entry need to be wrapped in an IIFE because it need to be in strict mode. (() => { +"use strict"; /*!**********************!*\ !*** ./src/index.js ***! \**********************/ __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _style_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style.css */ "./src/style.css"); -/* harmony import */ var _storage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./storage.js */ "./src/storage.js"); -/* harmony import */ var _taskActions_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./taskActions.js */ "./src/taskActions.js"); -/* harmony import */ var _dom_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./dom.js */ "./src/dom.js"); -/* harmony import */ var _Task_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Task.js */ "./src/Task.js"); - - - - - - -const form = document.getElementById('form'); -const todoTextInput = document.getElementById('add-book'); - -const getDefaultTasks = () => { - const tasks = _Task_js__WEBPACK_IMPORTED_MODULE_4__["default"].get(); - const storedTasks = _storage_js__WEBPACK_IMPORTED_MODULE_1__["default"].get('tasks'); - if (storedTasks) { - storedTasks.map((t) => _Task_js__WEBPACK_IMPORTED_MODULE_4__["default"].add(t)); - _dom_js__WEBPACK_IMPORTED_MODULE_3__["default"].renderTasks(storedTasks); - } else { - _storage_js__WEBPACK_IMPORTED_MODULE_1__["default"].set('tasks', tasks); - _dom_js__WEBPACK_IMPORTED_MODULE_3__["default"].renderTasks(tasks); - } -}; +/* harmony import */ var _populate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./populate.js */ "./src/populate.js"); +/* harmony import */ var _populate_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_populate_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _status_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./status.js */ "./src/status.js"); +/* harmony import */ var _style_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./style.css */ "./src/style.css"); + + + + +let list = []; +const listEl = document.querySelector('ul'); + +function todoList() { + if (window.localStorage.getItem('localTasks')) { + const localTasks = window.localStorage.getItem('localTasks'); + list = JSON.parse(localTasks); + } + document.querySelector('.todo-list').innerHTML = ''; + list.forEach((item) => { + const taskElement = document.createElement('li'); + taskElement.classList.add('task'); + if (item.isCompleted) { + taskElement.classList.add('completed'); + } + const checkbox = document.createElement('input'); + checkbox.type = 'checkbox'; + checkbox.classList.add('task-check'); + checkbox.addEventListener('click', () => { + _status_js__WEBPACK_IMPORTED_MODULE_1__.status(item, list); + todoList(); + }); + checkbox.checked = item.isCompleted; + taskElement.appendChild(checkbox); + const taskText = document.createElement('input'); + taskText.classList = 'task-text'; + taskText.value = item.description; + taskText.addEventListener('change', () => { + if (taskText.value.length > 0) { + item.description = taskText.value; + _status_js__WEBPACK_IMPORTED_MODULE_1__.saveLocal(list); + } + }); + taskElement.appendChild(taskText); + + const dragIcon = document.createElement('button'); + dragIcon.classList = 'far fa-trash-alt deleteBtn'; + taskElement.appendChild(dragIcon); + taskElement.draggable = 'true'; + document.querySelector('.todo-list').appendChild(taskElement); + }); +} + +function removeItem(e) { + if (!e.target.classList.contains('deleteBtn')) { + return; + } + const btn = e.target; + list.forEach((task) => { + if (task.description === btn.parentElement.children[1].value) { + list.splice(list.indexOf(task), 1); + } + }); + btn.closest('li').remove(); + _populate_js__WEBPACK_IMPORTED_MODULE_0__.updateIndex(list); + _status_js__WEBPACK_IMPORTED_MODULE_1__.saveLocal(list); +} + +listEl.addEventListener('click', removeItem); +todoList(); +document.querySelector('#taskForm').addEventListener('submit', (event) => { + event.preventDefault(); + _populate_js__WEBPACK_IMPORTED_MODULE_0__.add(list); + todoList(); +}); +document.querySelector('.clearer').addEventListener('click', () => { + _populate_js__WEBPACK_IMPORTED_MODULE_0__.removeDone(list); + todoList(); +}); -form.addEventListener('submit', (e) => { - e.preventDefault(); - const savedTask = _taskActions_js__WEBPACK_IMPORTED_MODULE_2__["default"].addTask(todoTextInput.value); - _Task_js__WEBPACK_IMPORTED_MODULE_4__["default"].add(savedTask); - const tasks = _Task_js__WEBPACK_IMPORTED_MODULE_4__["default"].get(); - _dom_js__WEBPACK_IMPORTED_MODULE_3__["default"].renderTasks(tasks); -}); - -getDefaultTasks(); -_dom_js__WEBPACK_IMPORTED_MODULE_3__["default"].updateUI(_storage_js__WEBPACK_IMPORTED_MODULE_1__["default"].get('tasks')); -_dom_js__WEBPACK_IMPORTED_MODULE_3__["default"].showTrashIcon(); -_dom_js__WEBPACK_IMPORTED_MODULE_3__["default"].editTastSubmit(_Task_js__WEBPACK_IMPORTED_MODULE_4__["default"]); -_dom_js__WEBPACK_IMPORTED_MODULE_3__["default"].completeTaskHandler(); -_dom_js__WEBPACK_IMPORTED_MODULE_3__["default"].deleteTaskHandler(); -_dom_js__WEBPACK_IMPORTED_MODULE_3__["default"].clearCompletedHandler(); })(); /******/ })() ; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O1dBQzVDO1dBQ0E7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQSx5Q0FBeUMsd0NBQXdDO1dBQ2pGO1dBQ0E7V0FDQTs7Ozs7V0NQQTs7Ozs7V0NBQTtXQUNBO1dBQ0E7V0FDQSx1REFBdUQsaUJBQWlCO1dBQ3hFO1dBQ0EsZ0RBQWdELGFBQWE7V0FDN0Q7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOcUI7QUFDYztBQUNRO0FBQ2hCO0FBQ0U7O0FBRTdCO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0Isb0RBQVE7QUFDeEIsc0JBQXNCLHVEQUFXO0FBQ2pDO0FBQ0EsMkJBQTJCLG9EQUFRO0FBQ25DLElBQUksMkRBQWU7QUFDbkIsSUFBSTtBQUNKLElBQUksdURBQVc7QUFDZixJQUFJLDJEQUFlO0FBQ25CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQiwrREFBbUI7QUFDdkMsRUFBRSxvREFBUTtBQUNWLGdCQUFnQixvREFBUTtBQUN4QixFQUFFLDJEQUFlO0FBQ2pCLENBQUM7O0FBRUQ7QUFDQSx3REFBWSxDQUFDLHVEQUFXO0FBQ3hCLDZEQUFpQjtBQUNqQiw4REFBa0IsQ0FBQyxnREFBSTtBQUN2QixtRUFBdUI7QUFDdkIsaUVBQXFCO0FBQ3JCLHFFQUF5QixHIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL3NyYy9zdHlsZS5jc3MiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzIiwid2VicGFjazovL1RvX0RvX0xpc3QvLi9zcmMvc3R5bGUuY3NzPzcxNjMiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcyIsIndlYnBhY2s6Ly9Ub19Eb19MaXN0Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9Ub19Eb19MaXN0Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzIiwid2VicGFjazovL1RvX0RvX0xpc3QvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanMiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzIiwid2VicGFjazovL1RvX0RvX0xpc3QvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly9Ub19Eb19MaXN0Ly4vc3JjL1Rhc2suanMiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL3NyYy9kb20uanMiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL3NyYy9zdG9yYWdlLmpzIiwid2VicGFjazovL1RvX0RvX0xpc3QvLi9zcmMvdGFza0FjdGlvbnMuanMiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9Ub19Eb19MaXN0L3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL1RvX0RvX0xpc3Qvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL1RvX0RvX0xpc3Qvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9Ub19Eb19MaXN0L3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIjpyb290IHtcXG4gIC0tcHJpbWFyeTogcmdiKDcxLCA2OSwgNjkpO1xcbiAgLS1zZWNvbmRhcnk6ICNjY2M7XFxuICAtLWJvcmRlcjogcmdiKDIyMSwgMjE5LCAyMTkpO1xcbiAgLS1iYWNrZ3JvdW5kOiByZ2IoMjQzLCAyNDMsIDI0Myk7XFxufVxcblxcbioge1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIHBhZGRpbmc6IDA7XFxuICBtYXJnaW46IDA7XFxufVxcblxcbi5kLWZsZXgge1xcbiAgZGlzcGxheTogZmxleDtcXG59XFxuXFxuLmZsZXgtY2VudGVyIHtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcblxcbmJvZHkge1xcbiAgd2lkdGg6IDEwMCU7XFxuICBtaW4taGVpZ2h0OiAxMDB2aDtcXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJhY2tncm91bmQpO1xcbiAgZm9udC1zaXplOiAxLjRyZW07XFxufVxcblxcbmkge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgY29sb3I6IHZhcigtLXNlY29uZGFyeSk7XFxufVxcblxcbnNlY3Rpb24ge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXG4gIHdpZHRoOiA1MCU7XFxuICBtaW4td2lkdGg6IDMwMHB4O1xcbiAgYm94LXNoYWRvdzogMCAzcHggMTBweCByZ2IoMCAwIDAgLyAyMCUpO1xcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiA1MCU7XFxuICBsZWZ0OiA1MCU7XFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcXG59XFxuXFxuLmhlYWRlciB7XFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcXG4gIHBhZGRpbmc6IDEuMnJlbSAxLjVyZW07XFxuICBjb2xvcjogdmFyKC0tcHJpbWFyeSk7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxufVxcblxcbmZvcm0gYnV0dG9uIHtcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyOiBub25lO1xcbiAgcGFkZGluZzogMC42cmVtO1xcbn1cXG5cXG5mb3JtIGJ1dHRvbiBpIHtcXG4gIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcXG4gIGZvbnQtc2l6ZTogMXJlbTtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxufVxcblxcbi5oZWFkZXIgaSB7XFxuICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XFxuICBmb250LXNpemU6IDE4cHg7XFxufVxcblxcbmZvcm0gPiBkaXYge1xcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XFxuICBwYWRkaW5nOiAwLjdyZW0gMS41cmVtO1xcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcbiAgd2lkdGg6IDEwMCU7XFxufVxcblxcbmZvcm0gaW5wdXQge1xcbiAgYm9yZGVyOiBub25lO1xcbiAgb3V0bGluZTogbm9uZTtcXG4gIG1pbi13aWR0aDogMjUwcHg7XFxuICBwYWRkaW5nOiAwLjhyZW0gMDtcXG4gIGZsZXg6IDE7XFxufVxcblxcbmZvcm0gaW5wdXQsXFxuZm9ybSBpbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XFxuICBmb250LXNpemU6IDEuMnJlbTtcXG4gIGZvbnQtZmFtaWx5OiAnUm9ib3RvJywgc2Fucy1zZXJpZjtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGZvbnQtd2VpZ2h0OiAxMDA7XFxuICBjb2xvcjogcmdiKDEzMSwgMTMwLCAxMzApO1xcbn1cXG5cXG4udGFza3MtbGlzdCB7XFxuICBtaW4td2lkdGg6IDEwMCU7XFxufVxcblxcbi50YXNrcy1saXN0IGxpIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgbGlzdC1zdHlsZTogbm9uZTtcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1xcbiAgcGFkZGluZzogMC43cmVtIDEuMnJlbTtcXG59XFxuXFxuLnRhc2tzLWxpc3QgbGkgbGFiZWwge1xcbiAgbWFyZ2luLWxlZnQ6IDZweDtcXG4gIGZvbnQtc2l6ZTogaW5oZXJpdDtcXG4gIGNvbG9yOiB2YXIoLS1wcmltYXJ5KTtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuLyogLnRhc2tzLWxpc3QgbGkgbGFiZWwuY29tcGVsZXRlZCB7XFxuICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGNvbG9yOiB2YXIoLS1zZWNvbmRhcnkpO1xcbn0gKi9cXG5cXG4udGFza3MtbGlzdCBsaSBpOmhvdmVyIHtcXG4gIGNvbG9yOiB2YXIoLS1wcmltYXJ5KTtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuLmNsZWFyLWJ0biBidXR0b24ge1xcbiAgd2lkdGg6IDEwMCU7XFxuICBmb250LXNpemU6IGluaGVyaXQ7XFxuICBwYWRkaW5nOiAxLjJyZW07XFxuICBib3JkZXI6IG5vbmU7XFxuICBvdXRsaW5lOiBub25lO1xcbiAgY29sb3I6IHZhcigtLXNlY29uZGFyeSk7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iYWNrZ3JvdW5kKTtcXG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDhweDtcXG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA4cHg7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lciAudGFzay1kZXRhaWxzIHtcXG4gIGZsZXg6IDE7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgcGFkZGluZzogMCAxcmVtO1xcbn1cXG5cXG4udGFzay1jb250YWluZXIgLnRhc2stZGV0YWlscyBzcGFuIHtcXG4gIG1hcmdpbi1sZWZ0OiA2cHg7XFxuICBmb250LXNpemU6IGluaGVyaXQ7XFxuICBjb2xvcjogdmFyKC0tcHJpbWFyeSk7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lciAudGFzay1kZXRhaWxzIHNwYW4uY29tcGVsZXRlZCB7XFxuICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcXG59XFxuXFxuLnRhc2stY29udGFpbmVyIC50YXNrLWRldGFpbHMgaW5wdXQge1xcbiAgYm9yZGVyOiBub25lO1xcbiAgZm9udC1zaXplOiBpbmhlcml0O1xcbiAgY29sb3I6IHZhcigtLXByaW1hcnkpO1xcbiAgb3V0bGluZTogbm9uZTtcXG4gIGZsZXg6IDE7XFxuICBkaXNwbGF5OiBub25lO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lciAudGFzay1hY3Rpb24tYnRucyBidXR0b24ge1xcbiAgd2lkdGg6IDIuMnJlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyOiBub25lO1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgcGFkZGluZzogMC42cmVtIDA7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lciAudGFzay1hY3Rpb24tYnRucyBidXR0b246bGFzdC1jaGlsZCB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4uZWRpdC10YXNrLWZvcm0ge1xcbiAgZmxleDogMTtcXG4gIGRpc3BsYXk6IGZsZXg7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lciAudGFzay1hY3Rpb24tYnRucyBidXR0b24gaSB7XFxuICBmb250LXNpemU6IDEuMnJlbTtcXG59XFxuXFxuLnRhc2stY29udGFpbmVyLmVkaXQtbW9kZSB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmM2RiO1xcbn1cXG5cXG4udGFzay1jb250YWluZXIuZWRpdC1tb2RlIC50YXNrLWFjdGlvbi1idG5zIGJ1dHRvbjpsYXN0LWNoaWxkIHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG4udGFzay1kZXRhaWxzLmNvbXBsZXRlZCBzcGFuIHtcXG4gIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoO1xcbn1cXG5cXG4udGFzay1jb250YWluZXIuZWRpdC1tb2RlIC50YXNrLWFjdGlvbi1idG5zIGJ1dHRvbjpmaXJzdC1jaGlsZCB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4udGFzay1jb250YWluZXIuZWRpdC1tb2RlIC50YXNrLWRldGFpbHMgaW5wdXQge1xcbiAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lci5lZGl0LW1vZGUgLnRhc2stZGV0YWlscyBzcGFuIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9zdHlsZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7RUFDRSwwQkFBMEI7RUFDMUIsaUJBQWlCO0VBQ2pCLDRCQUE0QjtFQUM1QixnQ0FBZ0M7QUFDbEM7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsVUFBVTtFQUNWLFNBQVM7QUFDWDs7QUFFQTtFQUNFLGFBQWE7QUFDZjs7QUFFQTtFQUNFLG1CQUFtQjtBQUNyQjs7QUFFQTtFQUNFLFdBQVc7RUFDWCxpQkFBaUI7RUFDakIsbUNBQW1DO0VBQ25DLGlCQUFpQjtBQUNuQjs7QUFFQTtFQUNFLGVBQWU7RUFDZix1QkFBdUI7QUFDekI7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsVUFBVTtFQUNWLGdCQUFnQjtFQUNoQix1Q0FBdUM7RUFDdkMsa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQixRQUFRO0VBQ1IsU0FBUztFQUNULGdDQUFnQztBQUNsQzs7QUFFQTtFQUNFLHNDQUFzQztFQUN0QyxzQkFBc0I7RUFDdEIscUJBQXFCO0VBQ3JCLDhCQUE4QjtBQUNoQzs7QUFFQTtFQUNFLDZCQUE2QjtFQUM3QixZQUFZO0VBQ1osZUFBZTtBQUNqQjs7QUFFQTtFQUNFLHdCQUF3QjtFQUN4QixlQUFlO0VBQ2YsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0Usd0JBQXdCO0VBQ3hCLGVBQWU7QUFDakI7O0FBRUE7RUFDRSxzQ0FBc0M7RUFDdEMsc0JBQXNCO0VBQ3RCLDhCQUE4QjtFQUM5QixXQUFXO0FBQ2I7O0FBRUE7RUFDRSxZQUFZO0VBQ1osYUFBYTtFQUNiLGdCQUFnQjtFQUNoQixpQkFBaUI7RUFDakIsT0FBTztBQUNUOztBQUVBOztFQUVFLGlCQUFpQjtFQUNqQixpQ0FBaUM7RUFDakMsa0JBQWtCO0VBQ2xCLGdCQUFnQjtFQUNoQix5QkFBeUI7QUFDM0I7O0FBRUE7RUFDRSxlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsV0FBVztFQUNYLGdCQUFnQjtFQUNoQixzQ0FBc0M7RUFDdEMsc0JBQXNCO0FBQ3hCOztBQUVBO0VBQ0UsZ0JBQWdCO0VBQ2hCLGtCQUFrQjtFQUNsQixxQkFBcUI7RUFDckIsZUFBZTtBQUNqQjs7QUFFQTs7OztHQUlHOztBQUVIO0VBQ0UscUJBQXFCO0VBQ3JCLGVBQWU7QUFDakI7O0FBRUE7RUFDRSxXQUFXO0VBQ1gsa0JBQWtCO0VBQ2xCLGVBQWU7RUFDZixZQUFZO0VBQ1osYUFBYTtFQUNiLHVCQUF1QjtFQUN2QixtQ0FBbUM7RUFDbkMsOEJBQThCO0VBQzlCLCtCQUErQjtFQUMvQixlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsT0FBTztFQUNQLGFBQWE7RUFDYixlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsZ0JBQWdCO0VBQ2hCLGtCQUFrQjtFQUNsQixxQkFBcUI7QUFDdkI7O0FBRUE7RUFDRSw2QkFBNkI7QUFDL0I7O0FBRUE7RUFDRSxZQUFZO0VBQ1osa0JBQWtCO0VBQ2xCLHFCQUFxQjtFQUNyQixhQUFhO0VBQ2IsT0FBTztFQUNQLGFBQWE7RUFDYiw2QkFBNkI7QUFDL0I7O0FBRUE7RUFDRSxhQUFhO0VBQ2IsNkJBQTZCO0VBQzdCLFlBQVk7RUFDWixlQUFlO0VBQ2YsaUJBQWlCO0FBQ25COztBQUVBO0VBQ0UsYUFBYTtBQUNmOztBQUVBO0VBQ0UsT0FBTztFQUNQLGFBQWE7QUFDZjs7QUFFQTtFQUNFLGlCQUFpQjtBQUNuQjs7QUFFQTtFQUNFLHlCQUF5QjtBQUMzQjs7QUFFQTtFQUNFLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSw2QkFBNkI7QUFDL0I7O0FBRUE7RUFDRSxhQUFhO0FBQ2Y7O0FBRUE7RUFDRSxjQUFjO0FBQ2hCOztBQUVBO0VBQ0UsYUFBYTtBQUNmXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjpyb290IHtcXG4gIC0tcHJpbWFyeTogcmdiKDcxLCA2OSwgNjkpO1xcbiAgLS1zZWNvbmRhcnk6ICNjY2M7XFxuICAtLWJvcmRlcjogcmdiKDIyMSwgMjE5LCAyMTkpO1xcbiAgLS1iYWNrZ3JvdW5kOiByZ2IoMjQzLCAyNDMsIDI0Myk7XFxufVxcblxcbioge1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIHBhZGRpbmc6IDA7XFxuICBtYXJnaW46IDA7XFxufVxcblxcbi5kLWZsZXgge1xcbiAgZGlzcGxheTogZmxleDtcXG59XFxuXFxuLmZsZXgtY2VudGVyIHtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcblxcbmJvZHkge1xcbiAgd2lkdGg6IDEwMCU7XFxuICBtaW4taGVpZ2h0OiAxMDB2aDtcXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJhY2tncm91bmQpO1xcbiAgZm9udC1zaXplOiAxLjRyZW07XFxufVxcblxcbmkge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgY29sb3I6IHZhcigtLXNlY29uZGFyeSk7XFxufVxcblxcbnNlY3Rpb24ge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXG4gIHdpZHRoOiA1MCU7XFxuICBtaW4td2lkdGg6IDMwMHB4O1xcbiAgYm94LXNoYWRvdzogMCAzcHggMTBweCByZ2IoMCAwIDAgLyAyMCUpO1xcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiA1MCU7XFxuICBsZWZ0OiA1MCU7XFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcXG59XFxuXFxuLmhlYWRlciB7XFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcXG4gIHBhZGRpbmc6IDEuMnJlbSAxLjVyZW07XFxuICBjb2xvcjogdmFyKC0tcHJpbWFyeSk7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxufVxcblxcbmZvcm0gYnV0dG9uIHtcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyOiBub25lO1xcbiAgcGFkZGluZzogMC42cmVtO1xcbn1cXG5cXG5mb3JtIGJ1dHRvbiBpIHtcXG4gIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcXG4gIGZvbnQtc2l6ZTogMXJlbTtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxufVxcblxcbi5oZWFkZXIgaSB7XFxuICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XFxuICBmb250LXNpemU6IDE4cHg7XFxufVxcblxcbmZvcm0gPiBkaXYge1xcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XFxuICBwYWRkaW5nOiAwLjdyZW0gMS41cmVtO1xcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcbiAgd2lkdGg6IDEwMCU7XFxufVxcblxcbmZvcm0gaW5wdXQge1xcbiAgYm9yZGVyOiBub25lO1xcbiAgb3V0bGluZTogbm9uZTtcXG4gIG1pbi13aWR0aDogMjUwcHg7XFxuICBwYWRkaW5nOiAwLjhyZW0gMDtcXG4gIGZsZXg6IDE7XFxufVxcblxcbmZvcm0gaW5wdXQsXFxuZm9ybSBpbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XFxuICBmb250LXNpemU6IDEuMnJlbTtcXG4gIGZvbnQtZmFtaWx5OiAnUm9ib3RvJywgc2Fucy1zZXJpZjtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGZvbnQtd2VpZ2h0OiAxMDA7XFxuICBjb2xvcjogcmdiKDEzMSwgMTMwLCAxMzApO1xcbn1cXG5cXG4udGFza3MtbGlzdCB7XFxuICBtaW4td2lkdGg6IDEwMCU7XFxufVxcblxcbi50YXNrcy1saXN0IGxpIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgbGlzdC1zdHlsZTogbm9uZTtcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1xcbiAgcGFkZGluZzogMC43cmVtIDEuMnJlbTtcXG59XFxuXFxuLnRhc2tzLWxpc3QgbGkgbGFiZWwge1xcbiAgbWFyZ2luLWxlZnQ6IDZweDtcXG4gIGZvbnQtc2l6ZTogaW5oZXJpdDtcXG4gIGNvbG9yOiB2YXIoLS1wcmltYXJ5KTtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuLyogLnRhc2tzLWxpc3QgbGkgbGFiZWwuY29tcGVsZXRlZCB7XFxuICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGNvbG9yOiB2YXIoLS1zZWNvbmRhcnkpO1xcbn0gKi9cXG5cXG4udGFza3MtbGlzdCBsaSBpOmhvdmVyIHtcXG4gIGNvbG9yOiB2YXIoLS1wcmltYXJ5KTtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuLmNsZWFyLWJ0biBidXR0b24ge1xcbiAgd2lkdGg6IDEwMCU7XFxuICBmb250LXNpemU6IGluaGVyaXQ7XFxuICBwYWRkaW5nOiAxLjJyZW07XFxuICBib3JkZXI6IG5vbmU7XFxuICBvdXRsaW5lOiBub25lO1xcbiAgY29sb3I6IHZhcigtLXNlY29uZGFyeSk7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iYWNrZ3JvdW5kKTtcXG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDhweDtcXG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA4cHg7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lciAudGFzay1kZXRhaWxzIHtcXG4gIGZsZXg6IDE7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgcGFkZGluZzogMCAxcmVtO1xcbn1cXG5cXG4udGFzay1jb250YWluZXIgLnRhc2stZGV0YWlscyBzcGFuIHtcXG4gIG1hcmdpbi1sZWZ0OiA2cHg7XFxuICBmb250LXNpemU6IGluaGVyaXQ7XFxuICBjb2xvcjogdmFyKC0tcHJpbWFyeSk7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lciAudGFzay1kZXRhaWxzIHNwYW4uY29tcGVsZXRlZCB7XFxuICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcXG59XFxuXFxuLnRhc2stY29udGFpbmVyIC50YXNrLWRldGFpbHMgaW5wdXQge1xcbiAgYm9yZGVyOiBub25lO1xcbiAgZm9udC1zaXplOiBpbmhlcml0O1xcbiAgY29sb3I6IHZhcigtLXByaW1hcnkpO1xcbiAgb3V0bGluZTogbm9uZTtcXG4gIGZsZXg6IDE7XFxuICBkaXNwbGF5OiBub25lO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lciAudGFzay1hY3Rpb24tYnRucyBidXR0b24ge1xcbiAgd2lkdGg6IDIuMnJlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyOiBub25lO1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgcGFkZGluZzogMC42cmVtIDA7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lciAudGFzay1hY3Rpb24tYnRucyBidXR0b246bGFzdC1jaGlsZCB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4uZWRpdC10YXNrLWZvcm0ge1xcbiAgZmxleDogMTtcXG4gIGRpc3BsYXk6IGZsZXg7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lciAudGFzay1hY3Rpb24tYnRucyBidXR0b24gaSB7XFxuICBmb250LXNpemU6IDEuMnJlbTtcXG59XFxuXFxuLnRhc2stY29udGFpbmVyLmVkaXQtbW9kZSB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmM2RiO1xcbn1cXG5cXG4udGFzay1jb250YWluZXIuZWRpdC1tb2RlIC50YXNrLWFjdGlvbi1idG5zIGJ1dHRvbjpsYXN0LWNoaWxkIHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG4udGFzay1kZXRhaWxzLmNvbXBsZXRlZCBzcGFuIHtcXG4gIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoO1xcbn1cXG5cXG4udGFzay1jb250YWluZXIuZWRpdC1tb2RlIC50YXNrLWFjdGlvbi1idG5zIGJ1dHRvbjpmaXJzdC1jaGlsZCB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4udGFzay1jb250YWluZXIuZWRpdC1tb2RlIC50YXNrLWRldGFpbHMgaW5wdXQge1xcbiAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lci5lZGl0LW1vZGUgLnRhc2stZGV0YWlscyBzcGFuIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcpIHtcbiAgdmFyIGxpc3QgPSBbXTsgLy8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZ1xuXG4gIGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjb250ZW50ID0gXCJcIjtcbiAgICAgIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2YgaXRlbVs1XSAhPT0gXCJ1bmRlZmluZWRcIjtcblxuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKTtcbiAgICAgIH1cblxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuXG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0pLmpvaW4oXCJcIik7XG4gIH07IC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG5cblxuICBsaXN0LmkgPSBmdW5jdGlvbiBpKG1vZHVsZXMsIG1lZGlhLCBkZWR1cGUsIHN1cHBvcnRzLCBsYXllcikge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgdW5kZWZpbmVkXV07XG4gICAgfVxuXG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcblxuICAgIGlmIChkZWR1cGUpIHtcbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCB0aGlzLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgaWQgPSB0aGlzW19pXVswXTtcblxuICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaWRdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG1vZHVsZXMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgdmFyIGl0ZW0gPSBbXS5jb25jYXQobW9kdWxlc1tfaTJdKTtcblxuICAgICAgaWYgKGRlZHVwZSAmJiBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobWVkaWEpIHtcbiAgICAgICAgaWYgKCFpdGVtWzJdKSB7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3VwcG9ydHMpIHtcbiAgICAgICAgaWYgKCFpdGVtWzRdKSB7XG4gICAgICAgICAgaXRlbVs0XSA9IFwiXCIuY29uY2F0KHN1cHBvcnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNF0gPSBzdXBwb3J0cztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBsaXN0O1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlbSkge1xuICB2YXIgY29udGVudCA9IGl0ZW1bMV07XG4gIHZhciBjc3NNYXBwaW5nID0gaXRlbVszXTtcblxuICBpZiAoIWNzc01hcHBpbmcpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNzc01hcHBpbmcpKSkpO1xuICAgIHZhciBkYXRhID0gXCJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxcIi5jb25jYXQoYmFzZTY0KTtcbiAgICB2YXIgc291cmNlTWFwcGluZyA9IFwiLyojIFwiLmNvbmNhdChkYXRhLCBcIiAqL1wiKTtcbiAgICB2YXIgc291cmNlVVJMcyA9IGNzc01hcHBpbmcuc291cmNlcy5tYXAoZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIFwiLyojIHNvdXJjZVVSTD1cIi5jb25jYXQoY3NzTWFwcGluZy5zb3VyY2VSb290IHx8IFwiXCIpLmNvbmNhdChzb3VyY2UsIFwiICovXCIpO1xuICAgIH0pO1xuICAgIHJldHVybiBbY29udGVudF0uY29uY2F0KHNvdXJjZVVSTHMpLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICByZXR1cm4gW2NvbnRlbnRdLmpvaW4oXCJcXG5cIik7XG59OyIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zdHlsZS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3N0eWxlLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc3R5bGVzSW5ET00gPSBbXTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICB2YXIgcmVzdWx0ID0gLTE7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRPTS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRPTVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpIHtcbiAgdmFyIGlkQ291bnRNYXAgPSB7fTtcbiAgdmFyIGlkZW50aWZpZXJzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4QnlJZGVudGlmaWVyID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdLFxuICAgICAgc3VwcG9ydHM6IGl0ZW1bNF0sXG4gICAgICBsYXllcjogaXRlbVs1XVxuICAgIH07XG5cbiAgICBpZiAoaW5kZXhCeUlkZW50aWZpZXIgIT09IC0xKSB7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0ucmVmZXJlbmNlcysrO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnVwZGF0ZXIob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVwZGF0ZXIgPSBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMuYnlJbmRleCA9IGk7XG4gICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoaSwgMCwge1xuICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgICB1cGRhdGVyOiB1cGRhdGVyLFxuICAgICAgICByZWZlcmVuY2VzOiAxXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZGVudGlmaWVycy5wdXNoKGlkZW50aWZpZXIpO1xuICB9XG5cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuXG5mdW5jdGlvbiBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKSB7XG4gIHZhciBhcGkgPSBvcHRpb25zLmRvbUFQSShvcHRpb25zKTtcbiAgYXBpLnVwZGF0ZShvYmopO1xuXG4gIHZhciB1cGRhdGVyID0gZnVuY3Rpb24gdXBkYXRlcihuZXdPYmopIHtcbiAgICBpZiAobmV3T2JqKSB7XG4gICAgICBpZiAobmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJiBuZXdPYmoubWVkaWEgPT09IG9iai5tZWRpYSAmJiBuZXdPYmouc291cmNlTWFwID09PSBvYmouc291cmNlTWFwICYmIG5ld09iai5zdXBwb3J0cyA9PT0gb2JqLnN1cHBvcnRzICYmIG5ld09iai5sYXllciA9PT0gb2JqLmxheWVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXBpLnVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB1cGRhdGVyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChsaXN0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBsaXN0ID0gbGlzdCB8fCBbXTtcbiAgdmFyIGxhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZShuZXdMaXN0KSB7XG4gICAgbmV3TGlzdCA9IG5ld0xpc3QgfHwgW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuXG4gICAgdmFyIG5ld0xhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShuZXdMaXN0LCBvcHRpb25zKTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2lkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbX2ldO1xuXG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuXG4gICAgICBpZiAoc3R5bGVzSW5ET01bX2luZGV4XS5yZWZlcmVuY2VzID09PSAwKSB7XG4gICAgICAgIHN0eWxlc0luRE9NW19pbmRleF0udXBkYXRlcigpO1xuXG4gICAgICAgIHN0eWxlc0luRE9NLnNwbGljZShfaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTsgLy8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcblxuICAgIGlmICh3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQgJiYgc3R5bGVUYXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgYWNjZXNzIHRvIGlmcmFtZSBpcyBibG9ja2VkXG4gICAgICAgIC8vIGR1ZSB0byBjcm9zcy1vcmlnaW4gcmVzdHJpY3Rpb25zXG4gICAgICAgIHN0eWxlVGFyZ2V0ID0gc3R5bGVUYXJnZXQuY29udGVudERvY3VtZW50LmhlYWQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgIHN0eWxlVGFyZ2V0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuXG4gIHJldHVybiBtZW1vW3RhcmdldF07XG59XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cblxuXG5mdW5jdGlvbiBpbnNlcnRCeVNlbGVjdG9yKGluc2VydCwgc3R5bGUpIHtcbiAgdmFyIHRhcmdldCA9IGdldFRhcmdldChpbnNlcnQpO1xuXG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuXG4gIHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5zZXJ0QnlTZWxlY3RvcjsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucykge1xuICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgb3B0aW9ucy5zZXRBdHRyaWJ1dGVzKGVsZW1lbnQsIG9wdGlvbnMuYXR0cmlidXRlcyk7XG4gIG9wdGlvbnMuaW5zZXJ0KGVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG4gIHJldHVybiBlbGVtZW50O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMoc3R5bGVFbGVtZW50KSB7XG4gIHZhciBub25jZSA9IHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fd2VicGFja19ub25jZV9fIDogbnVsbDtcblxuICBpZiAobm9uY2UpIHtcbiAgICBzdHlsZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgbm9uY2UpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKSB7XG4gIHZhciBjc3MgPSBcIlwiO1xuXG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG5cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIkBtZWRpYSBcIi5jb25jYXQob2JqLm1lZGlhLCBcIiB7XCIpO1xuICB9XG5cbiAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBvYmoubGF5ZXIgIT09IFwidW5kZWZpbmVkXCI7XG5cbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuXG4gIGNzcyArPSBvYmouY3NzO1xuXG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cblxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG5cbiAgaWYgKG9iai5zdXBwb3J0cykge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuXG4gIHZhciBzb3VyY2VNYXAgPSBvYmouc291cmNlTWFwO1xuXG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfSAvLyBGb3Igb2xkIElFXG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuXG5cbiAgb3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50KTtcbn1cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuXG5cbmZ1bmN0aW9uIGRvbUFQSShvcHRpb25zKSB7XG4gIHZhciBzdHlsZUVsZW1lbnQgPSBvcHRpb25zLmluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKTtcbiAgcmV0dXJuIHtcbiAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShvYmopIHtcbiAgICAgIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKTtcbiAgICB9LFxuICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCk7XG4gICAgfVxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICBzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHlsZVRhZ1RyYW5zZm9ybTsiLCJjbGFzcyBUYXNrIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy50YXNrcyA9IFtdO1xuICB9XG5cbiAgZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLnRhc2tzO1xuICB9XG5cbiAgYWRkKHRhc2spIHtcbiAgICB0aGlzLnRhc2tzLnB1c2godGFzayk7XG4gIH1cblxuICB1cGRhdGUodGFza0lkLCB0YXNrKSB7XG4gICAgdGhpcy50YXNrc1t0YXNrSWRdID0gdGFzaztcbiAgfVxuXG4gIHJlbW92ZSh0YXNrSWQpIHtcbiAgICB0aGlzLnRhc2tzID0gdGhpcy50YXNrcy5maWx0ZXIoKHRhc2spID0+IHRhc2suaW5kZXgudG9TdHJpbmcoKSAhPT0gdGFza0lkKTtcbiAgfVxuXG4gIGNsZWFyQ29tcGxldGVkKCkge1xuICAgIGNvbnN0IG5ld1Rhc2tzID0gdGhpcy50YXN0cy5maWx0ZXIoKHRhc2spID0+ICF0YXNrLmNvbXBsZXRlZCk7XG4gICAgdGhpcy50YXNrcyA9IG5ld1Rhc2tzLm1hcCgodGFzaywgaW5kZXgpID0+IHtcbiAgICAgIHRhc2suaW5kZXggPSBpbmRleCArIDE7XG4gICAgICByZXR1cm4gdGFzaztcbiAgICB9KTtcbiAgfVxufVxuXG5jb25zdCB0YXNrID0gbmV3IFRhc2soKTtcblxuZXhwb3J0IGRlZmF1bHQgdGFzazsiLCJpbXBvcnQgdGFza0FjdGlvbnMgZnJvbSAnLi90YXNrQWN0aW9ucy5qcyc7XG5cbmNvbnN0IHRhc2tzTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50YXNrcy1saXN0Jyk7XG5jb25zdCBkb20gPSAoKCkgPT4ge1xuICBjb25zdCBzaG93VHJhc2hJY29uID0gKCkgPT4ge1xuICAgIGNvbnN0IGVkaXRCdG5zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRhc2stZWRpdC1idG4nKTtcblxuICAgIGVkaXRCdG5zLmZvckVhY2goKGVkaXRCdG4pID0+IHtcbiAgICAgIGVkaXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICBjb25zdCB0YXNrc0VsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRhc2stY29udGFpbmVyJyk7XG4gICAgICAgIHRhc2tzRWxlbWVudHMuZm9yRWFjaCgodGFza0VsbSkgPT4ge1xuICAgICAgICAgIHRhc2tFbG0uY2xhc3NMaXN0LnJlbW92ZSgnZWRpdC1tb2RlJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBlLnRhcmdldC5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgcGFyZW50LmNsYXNzTGlzdC5hZGQoJ2VkaXQtbW9kZScpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgcmVuZGVyVGFza3MgPSAodGFza3MpID0+IHtcbiAgICB0YXNrc0xpc3QuaW5uZXJIVE1MID0gJyc7XG4gICAgdGFza3MubWFwKCh0YXNrKSA9PiB7XG4gICAgICBjb25zdCB0YXNrSXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG4gICAgICB0YXNrSXRlbS5jbGFzc0xpc3QuYWRkKCd0YXNrLWNvbnRhaW5lcicsICdkLWZsZXgnLCAnZmxleC1jZW50ZXInKTtcbiAgICAgIHRhc2tJdGVtLmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAke1xuICB0YXNrLmNvbXBsZXRlZCA/ICdjaGVja2VkJyA6ICcnXG4gIH0gZGF0YS10YXNrLWlkPVwiJHt0YXNrLmluZGV4fVwiIGNsYXNzPVwidGFzay1jaGVja2JveFwiLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIke1xuICB0YXNrLmNvbXBsZXRlZCA/ICd0YXNrLWRldGFpbHMgY29tcGxldGVkJyA6ICd0YXNrLWRldGFpbHMnXG4gIH1cIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj4ke3Rhc2suZGVzY3JpcHRpb259PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwiZWRpdC10YXNrLWZvcm1cIiBkYXRhLXRhc2staWQ9XCIke3Rhc2suaW5kZXh9XCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiB2YWx1ZT1cIiR7XG4gIHRhc2suZGVzY3JpcHRpb25cbiAgfVwiIGNsYXNzPVwidGFzay1lZGl0XCIgLz5cbiAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFzay1hY3Rpb24tYnRuc1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0YXNrLWVkaXQtYnRuXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1lbGxpcHNpcy12XCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0YXNrLWRlbGV0ZS1idG5cIiBkYXRhLXRhc2staWQ9XCIke3Rhc2suaW5kZXh9XCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10cmFzaC1hbHRcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYDtcbiAgICAgIHNob3dUcmFzaEljb24oKTtcbiAgICAgIGRvbS5kZWxldGVUYXNrSGFuZGxlcigpO1xuICAgICAgZG9tLmVkaXRUYXN0U3VibWl0KCk7XG4gICAgICBkb20uY29tcGxldGVUYXNrSGFuZGxlcigpO1xuICAgICAgZG9tLmNsZWFyQ29tcGxldGVkSGFuZGxlcigpO1xuICAgICAgcmV0dXJuIHRhc2tzTGlzdC5hcHBlbmRDaGlsZCh0YXNrSXRlbSk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgZWRpdFRhc3RTdWJtaXQgPSAoKSA9PiB7XG4gICAgY29uc3QgZWRpdFRhc2tGb3JtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5lZGl0LXRhc2stZm9ybScpO1xuICAgIGVkaXRUYXNrRm9ybXMuZm9yRWFjaCgoZm9ybSkgPT4ge1xuICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCAoZSkgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IHRhc2tJZCA9IGZvcm0uZ2V0QXR0cmlidXRlKCdkYXRhLXRhc2staWQnKTtcbiAgICAgICAgaWYgKGZvcm0uZWxlbWVudHNbMF0udmFsdWUudHJpbSgpID09PSAnJykgcmV0dXJuO1xuICAgICAgICBjb25zdCB7IHRhc2tzIH0gPSB0YXNrQWN0aW9ucy51cGRhdGVUYXNrKFxuICAgICAgICAgIHRhc2tJZCxcbiAgICAgICAgICBmb3JtLmVsZW1lbnRzWzBdLnZhbHVlLFxuICAgICAgICApO1xuXG4gICAgICAgIHJlbmRlclRhc2tzKHRhc2tzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGNvbXBsZXRlVGFza0hhbmRsZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgY2hlY2tib3hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50YXNrLWNoZWNrYm94Jyk7XG4gICAgY2hlY2tib3hlcy5mb3JFYWNoKChjaGVja2JveCkgPT4ge1xuICAgICAgY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHtcbiAgICAgICAgY29uc3QgdGFza0lkID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXRhc2staWQnKTtcbiAgICAgICAgY29uc3QgeyB0YXNrcyB9ID0gdGFza0FjdGlvbnMuY29tcGxldGVUYXNrKHRhc2tJZCwgZS50YXJnZXQuY2hlY2tlZCk7XG4gICAgICAgIHJlbmRlclRhc2tzKHRhc2tzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGRlbGV0ZVRhc2tIYW5kbGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IGRlbGV0ZUJ0bnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGFzay1kZWxldGUtYnRuJyk7XG4gICAgZGVsZXRlQnRucy5mb3JFYWNoKChidG4pID0+IHtcbiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFza0lkID0gYnRuLmdldEF0dHJpYnV0ZSgnZGF0YS10YXNrLWlkJyk7XG4gICAgICAgIGNvbnN0IHRhc2tzID0gdGFza0FjdGlvbnMuZGVsZXRlVGFzayh0YXNrSWQpO1xuICAgICAgICByZW5kZXJUYXNrcyh0YXNrcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBjbGVhckNvbXBsZXRlZEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgY2xlYXJDb21wbGV0ZWRCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY2xlYXItY29tcGxldGVkLWJ0bicpO1xuICAgIGNsZWFyQ29tcGxldGVkQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgdGFza3MgPSB0YXNrQWN0aW9ucy5jbGVhckNvbXBsZXRlZCgpO1xuICAgICAgcmVuZGVyVGFza3ModGFza3MpO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHVwZGF0ZVVJID0gKHRhc2tzKSA9PiB7XG4gICAgcmVuZGVyVGFza3ModGFza3MpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcmVuZGVyVGFza3MsXG4gICAgZWRpdFRhc3RTdWJtaXQsXG4gICAgc2hvd1RyYXNoSWNvbixcbiAgICB1cGRhdGVVSSxcbiAgICBjb21wbGV0ZVRhc2tIYW5kbGVyLFxuICAgIGRlbGV0ZVRhc2tIYW5kbGVyLFxuICAgIGNsZWFyQ29tcGxldGVkSGFuZGxlcixcbiAgfTtcbn0pKCk7XG5cbmV4cG9ydCBkZWZhdWx0IGRvbTtcbiIsImNvbnN0IHN0b3JhZ2UgPSB7XG4gIC8vICBmdW5jdGlvbiBtYW51cGlsYXRlIHRoZSBsb2NhbCBzdG9yYWdlXG4gIGdldDogKGtleSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICByZXR1cm4gdmFsdWUgPyBKU09OLnBhcnNlKHZhbHVlKSA6IG51bGw7XG4gIH0sXG4gIHNldDogKGtleSwgdmFsdWUpID0+IHtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gIH0sXG4gIHJlbW92ZTogKGtleSkgPT4ge1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gIH0sXG59O1xuZXhwb3J0IGRlZmF1bHQgc3RvcmFnZTsiLCJpbXBvcnQgc3RvcmFnZSBmcm9tICcuL3N0b3JhZ2UuanMnO1xuXG5jb25zdCB0YXNrQWN0aW9ucyA9ICgoKSA9PiB7XG4gIGNvbnN0IGFkZFRhc2sgPSAoZGVzY3JpcHRpb24pID0+IHtcbiAgICBjb25zdCB0YXNrcyA9IHN0b3JhZ2UuZ2V0KCd0YXNrcycpO1xuICAgIGNvbnN0IHRhc2sgPSB7XG4gICAgICBpbmRleDogdGFza3MubGVuZ3RoICsgMSxcbiAgICAgIGNvbXBsZXRlZDogZmFsc2UsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICB9O1xuICAgIHRhc2tzLnB1c2godGFzayk7XG4gICAgc3RvcmFnZS5zZXQoJ3Rhc2tzJywgdGFza3MpO1xuICAgIHJldHVybiB0YXNrO1xuICB9O1xuXG4gIGNvbnN0IHVwZGF0ZVRhc2sgPSAoaW5kZXgsIGRlc2NyaXB0aW9uKSA9PiB7XG4gICAgY29uc3QgdGFza3MgPSBzdG9yYWdlLmdldCgndGFza3MnKTtcbiAgICBjb25zdCB0YXNrID0gdGFza3NbaW5kZXggLSAxXTtcbiAgICB0YXNrLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgc3RvcmFnZS5zZXQoJ3Rhc2tzJywgdGFza3MpO1xuICAgIHJldHVybiB7IHRhc2ssIHRhc2tzIH07XG4gIH07XG5cbiAgY29uc3QgY29tcGxldGVUYXNrID0gKGluZGV4LCBjaGVja2VkKSA9PiB7XG4gICAgY29uc3QgdGFza3MgPSBzdG9yYWdlLmdldCgndGFza3MnKTtcbiAgICBjb25zdCB0YXNrID0gdGFza3NbaW5kZXggLSAxXTtcbiAgICB0YXNrLmNvbXBsZXRlZCA9IGNoZWNrZWQ7XG4gICAgc3RvcmFnZS5zZXQoJ3Rhc2tzJywgdGFza3MpO1xuICAgIHJldHVybiB7IHRhc2ssIHRhc2tzIH07XG4gIH07XG5cbiAgY29uc3QgZGVsZXRlVGFzayA9IChpbmRleCkgPT4ge1xuICAgIGxldCB0YXNrcyA9IHN0b3JhZ2UuZ2V0KCd0YXNrcycpO1xuICAgIHRhc2tzLnNwbGljZShpbmRleCAtIDEsIDEpO1xuICAgIHRhc2tzID0gdGFza3MubWFwKCh0YXNrLCBpKSA9PiB7XG4gICAgICB0YXNrLmluZGV4ID0gaSArIDE7XG4gICAgICByZXR1cm4gdGFzaztcbiAgICB9KTtcbiAgICBzdG9yYWdlLnNldCgndGFza3MnLCB0YXNrcyk7XG4gICAgcmV0dXJuIHRhc2tzO1xuICB9O1xuXG4gIGNvbnN0IGNsZWFyQ29tcGxldGVkID0gKCkgPT4ge1xuICAgIGNvbnN0IHRhc2tzID0gc3RvcmFnZS5nZXQoJ3Rhc2tzJyk7XG4gICAgbGV0IHVuQ29tcGxldGVkVGFza3MgPSB0YXNrcy5maWx0ZXIoKHRhc2spID0+ICF0YXNrLmNvbXBsZXRlZCk7XG4gICAgdW5Db21wbGV0ZWRUYXNrcyA9IHVuQ29tcGxldGVkVGFza3MubWFwKCh0YXNrLCBpbmRleCkgPT4ge1xuICAgICAgdGFzay5pbmRleCA9IGluZGV4ICsgMTtcbiAgICAgIHJldHVybiB0YXNrO1xuICAgIH0pO1xuICAgIHN0b3JhZ2Uuc2V0KCd0YXNrcycsIHVuQ29tcGxldGVkVGFza3MpO1xuICAgIHJldHVybiB1bkNvbXBsZXRlZFRhc2tzO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgYWRkVGFzayxcbiAgICB1cGRhdGVUYXNrLFxuICAgIGNvbXBsZXRlVGFzayxcbiAgICBkZWxldGVUYXNrLFxuICAgIGNsZWFyQ29tcGxldGVkLFxuICB9O1xufSkoKTtcblxuZXhwb3J0IGRlZmF1bHQgdGFza0FjdGlvbnM7IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHRpZDogbW9kdWxlSWQsXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImltcG9ydCAnLi9zdHlsZS5jc3MnO1xuaW1wb3J0IHN0b3JhZ2UgZnJvbSAnLi9zdG9yYWdlLmpzJztcbmltcG9ydCB0YXNrQWN0aW9ucyBmcm9tICcuL3Rhc2tBY3Rpb25zLmpzJztcbmltcG9ydCBkb20gZnJvbSAnLi9kb20uanMnO1xuaW1wb3J0IHRhc2sgZnJvbSAnLi9UYXNrLmpzJztcblxuY29uc3QgZm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb3JtJyk7XG5jb25zdCB0b2RvVGV4dElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1ib29rJyk7XG5cbmNvbnN0IGdldERlZmF1bHRUYXNrcyA9ICgpID0+IHtcbiAgY29uc3QgdGFza3MgPSB0YXNrLmdldCgpO1xuICBjb25zdCBzdG9yZWRUYXNrcyA9IHN0b3JhZ2UuZ2V0KCd0YXNrcycpO1xuICBpZiAoc3RvcmVkVGFza3MpIHtcbiAgICBzdG9yZWRUYXNrcy5tYXAoKHQpID0+IHRhc2suYWRkKHQpKTtcbiAgICBkb20ucmVuZGVyVGFza3Moc3RvcmVkVGFza3MpO1xuICB9IGVsc2Uge1xuICAgIHN0b3JhZ2Uuc2V0KCd0YXNrcycsIHRhc2tzKTtcbiAgICBkb20ucmVuZGVyVGFza3ModGFza3MpO1xuICB9XG59O1xuXG5mb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIChlKSA9PiB7XG4gIGUucHJldmVudERlZmF1bHQoKTtcbiAgY29uc3Qgc2F2ZWRUYXNrID0gdGFza0FjdGlvbnMuYWRkVGFzayh0b2RvVGV4dElucHV0LnZhbHVlKTtcbiAgdGFzay5hZGQoc2F2ZWRUYXNrKTtcbiAgY29uc3QgdGFza3MgPSB0YXNrLmdldCgpO1xuICBkb20ucmVuZGVyVGFza3ModGFza3MpO1xufSk7XG5cbmdldERlZmF1bHRUYXNrcygpO1xuZG9tLnVwZGF0ZVVJKHN0b3JhZ2UuZ2V0KCd0YXNrcycpKTtcbmRvbS5zaG93VHJhc2hJY29uKCk7XG5kb20uZWRpdFRhc3RTdWJtaXQodGFzayk7XG5kb20uY29tcGxldGVUYXNrSGFuZGxlcigpO1xuZG9tLmRlbGV0ZVRhc2tIYW5kbGVyKCk7XG5kb20uY2xlYXJDb21wbGV0ZWRIYW5kbGVyKCk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSw4Q0FBVztBQUNqQjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxpREFBYztBQUN0QjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxxREFBZ0I7QUFDbEIsRUFBRSxpREFBYztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLDZDQUFRO0FBQ1Y7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxFQUFFLG9EQUFlO0FBQ2pCO0FBQ0EsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL1RvX0RvX0xpc3QvLi9zcmMvc3R5bGUuY3NzIiwid2VicGFjazovL1RvX0RvX0xpc3QvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIiwid2VicGFjazovL1RvX0RvX0xpc3QvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qcyIsIndlYnBhY2s6Ly9Ub19Eb19MaXN0Ly4vc3JjL3N0eWxlLmNzcz83MTYzIiwid2VicGFjazovL1RvX0RvX0xpc3QvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanMiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly9Ub19Eb19MaXN0Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzIiwid2VicGFjazovL1RvX0RvX0xpc3QvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qcyIsIndlYnBhY2s6Ly9Ub19Eb19MaXN0Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL3NyYy9zdGF0dXMuanMiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9Ub19Eb19MaXN0L3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL1RvX0RvX0xpc3Qvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL1RvX0RvX0xpc3Qvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9Ub19Eb19MaXN0L3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcImgxIHtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuc2VjdGlvbiB7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuaDIge1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgcGFkZGluZzogMiU7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXHJcXG59XFxyXFxuXFxyXFxuYnV0dG9uIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uY29udGFpbmVyIHtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgbWF4LXdpZHRoOiA1MDBweDtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLnRvZG9saXN0LWNvbnRhaW5lciB7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlc21va2U7XFxyXFxuICBkaXNwbGF5OiBncmlkO1xcclxcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7XFxyXFxuICByb3ctZ2FwOiAycHg7XFxyXFxuICBib3gtc2hhZG93OiAxcHggMXB4IDVweCBncmF5O1xcclxcbn1cXHJcXG5cXHJcXG4uaWNvbiB7XFxyXFxuICB3aWR0aDogMTZweDtcXHJcXG4gIHdpZHRoOiAxNXB4O1xcclxcbiAgcGFkZGluZy1sZWZ0OiA1JTtcXHJcXG59XFxyXFxuXFxyXFxuLmlucHV0LWljb24ge1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAxcHg7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXHJcXG59XFxyXFxuXFxyXFxuLmljb24xIHtcXHJcXG4gIGZsb2F0OiByaWdodDtcXHJcXG4gIGNvbG9yOiByZ2IoMTQyLCAxNDcsIDE1MSk7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICBmb250LXNpemU6IG1lZGl1bTtcXHJcXG4gIHBhZGRpbmctcmlnaHQ6IDIlO1xcclxcbn1cXHJcXG5cXHJcXG4udGFzayB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBwYWRkaW5nOiAzJTtcXHJcXG59XFxyXFxuXFxyXFxuLnRvZG8tbGlzdCB7XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgbGlzdC1zdHlsZTogbm9uZTtcXHJcXG4gIGRpc3BsYXk6IGdyaWQ7XFxyXFxuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlc21va2U7XFxyXFxuICByb3ctZ2FwOiAycHg7XFxyXFxufVxcclxcblxcclxcbi50b2RvLWlucHV0IHtcXHJcXG4gIHdpZHRoOiA4NSU7XFxyXFxuICBib3JkZXI6IG5vbmU7XFxyXFxuICBwYWRkaW5nOiAxMHB4O1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcclxcbn1cXHJcXG5cXHJcXG4udG9kby1pbnB1dDpmb2N1cyB7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbiAgYm9yZGVyOiAycHggc29saWQgcmdiKDEwMywgMTYwLCAxMSk7XFxyXFxufVxcclxcblxcclxcbmlucHV0OjpwbGFjZWhvbGRlciB7XFxyXFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxyXFxufVxcclxcblxcclxcbi50YXNrLWNoZWNrIHtcXHJcXG4gIG1hcmdpbi1yaWdodDogMiU7XFxyXFxufVxcclxcblxcclxcbi5saXN0IHtcXHJcXG4gIHBhZGRpbmc6IDA7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxuICBsaXN0LXN0eWxlOiBub25lO1xcclxcbiAgZGlzcGxheTogZ3JpZDtcXHJcXG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGVzbW9rZTtcXHJcXG4gIHJvdy1nYXA6IDJweDtcXHJcXG59XFxyXFxuXFxyXFxuLmNsZWFyZXIge1xcclxcbiAgcGFkZGluZzogMiU7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICBmb250LXNpemU6IDIwcHg7XFxyXFxuICBmb250LXdlaWdodDogbGlnaHRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLmNsZWFyLWNvbnRhaW5lciB7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbi5kcmFnIHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiA4cHg7XFxyXFxuICBjdXJzb3I6IG1vdmU7XFxyXFxuICBjb2xvcjogZ3JheTtcXHJcXG4gIGZvbnQtc2l6ZTogMThweDtcXHJcXG59XFxyXFxuXFxyXFxuLmRyYWc6YWN0aXZlIHtcXHJcXG4gIGN1cnNvcjogZ3JhYmJpbmc7XFxyXFxufVxcclxcblxcclxcbi50YXNrLXRleHQge1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nLCBzYW5zLXNlcmlmO1xcclxcbiAgZm9udC13ZWlnaHQ6IDYwMDtcXHJcXG59XFxyXFxuXFxyXFxuLnRhc2stdGV4dDpmb2N1cyB7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4jdGFza0Zvcm0ge1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGZsZXgtd3JhcDogbm93cmFwO1xcclxcbn1cXHJcXG5cXHJcXG4jdGFza1N1Ym1pdCB7XFxyXFxuICBmb250LXNpemU6IDE2cHg7XFxyXFxuICB3aWR0aDogMjAlO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDEwJTtcXHJcXG59XFxyXFxuXFxyXFxuLmNvbXBsZXRlZCB7XFxyXFxuICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcXHJcXG59XFxyXFxuXCIsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL3N0eWxlLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtFQUNFLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLFdBQVc7RUFDWCxhQUFhO0VBQ2Isc0JBQXNCO0VBQ3RCLG1CQUFtQjtBQUNyQjs7QUFFQTtFQUNFLFNBQVM7RUFDVCxXQUFXO0VBQ1gsdUJBQXVCO0FBQ3pCOztBQUVBO0VBQ0UsNkJBQTZCO0VBQzdCLFlBQVk7QUFDZDs7QUFFQTtFQUNFLFdBQVc7RUFDWCxnQkFBZ0I7RUFDaEIsYUFBYTtFQUNiLHNCQUFzQjtFQUN0QixtQkFBbUI7QUFDckI7O0FBRUE7RUFDRSxXQUFXO0VBQ1gsNEJBQTRCO0VBQzVCLGFBQWE7RUFDYiwwQkFBMEI7RUFDMUIsWUFBWTtFQUNaLDRCQUE0QjtBQUM5Qjs7QUFFQTtFQUNFLFdBQVc7RUFDWCxXQUFXO0VBQ1gsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0UsV0FBVztFQUNYLGtCQUFrQjtFQUNsQix1QkFBdUI7QUFDekI7O0FBRUE7RUFDRSxZQUFZO0VBQ1oseUJBQXlCO0VBQ3pCLGVBQWU7RUFDZixpQkFBaUI7RUFDakIsaUJBQWlCO0FBQ25COztBQUVBO0VBQ0UsdUJBQXVCO0VBQ3ZCLGFBQWE7RUFDYixXQUFXO0FBQ2I7O0FBRUE7RUFDRSxVQUFVO0VBQ1YsU0FBUztFQUNULGdCQUFnQjtFQUNoQixhQUFhO0VBQ2IsMEJBQTBCO0VBQzFCLDRCQUE0QjtFQUM1QixZQUFZO0FBQ2Q7O0FBRUE7RUFDRSxVQUFVO0VBQ1YsWUFBWTtFQUNaLGFBQWE7RUFDYix1QkFBdUI7RUFDdkIsZUFBZTtFQUNmLFNBQVM7RUFDVCxzQkFBc0I7QUFDeEI7O0FBRUE7RUFDRSxhQUFhO0VBQ2IsbUNBQW1DO0FBQ3JDOztBQUVBO0VBQ0Usa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0UsVUFBVTtFQUNWLFNBQVM7RUFDVCxnQkFBZ0I7RUFDaEIsYUFBYTtFQUNiLDBCQUEwQjtFQUMxQiw0QkFBNEI7RUFDNUIsWUFBWTtBQUNkOztBQUVBO0VBQ0UsV0FBVztFQUNYLGVBQWU7RUFDZixlQUFlO0VBQ2Ysb0JBQW9CO0FBQ3RCOztBQUVBO0VBQ0Usa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsZ0JBQWdCO0VBQ2hCLFlBQVk7RUFDWixXQUFXO0VBQ1gsZUFBZTtBQUNqQjs7QUFFQTtFQUNFLGdCQUFnQjtBQUNsQjs7QUFFQTtFQUNFLFlBQVk7RUFDWixzQkFBc0I7RUFDdEIsV0FBVztFQUNYLGlDQUFpQztFQUNqQyxnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxhQUFhO0FBQ2Y7O0FBRUE7RUFDRSxhQUFhO0VBQ2IsaUJBQWlCO0FBQ25COztBQUVBO0VBQ0UsZUFBZTtFQUNmLFVBQVU7RUFDVix1QkFBdUI7RUFDdkIsU0FBUztFQUNULGVBQWU7RUFDZixpQkFBaUI7QUFDbkI7O0FBRUE7RUFDRSw2QkFBNkI7QUFDL0JcIixcInNvdXJjZXNDb250ZW50XCI6W1wiaDEge1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG5zZWN0aW9uIHtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG5oMiB7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxuICBwYWRkaW5nOiAyJTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcclxcbn1cXHJcXG5cXHJcXG5idXR0b24ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxyXFxuICBib3JkZXI6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5jb250YWluZXIge1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICBtYXgtd2lkdGg6IDUwMHB4O1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG4udG9kb2xpc3QtY29udGFpbmVyIHtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGVzbW9rZTtcXHJcXG4gIGRpc3BsYXk6IGdyaWQ7XFxyXFxuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjtcXHJcXG4gIHJvdy1nYXA6IDJweDtcXHJcXG4gIGJveC1zaGFkb3c6IDFweCAxcHggNXB4IGdyYXk7XFxyXFxufVxcclxcblxcclxcbi5pY29uIHtcXHJcXG4gIHdpZHRoOiAxNnB4O1xcclxcbiAgd2lkdGg6IDE1cHg7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDUlO1xcclxcbn1cXHJcXG5cXHJcXG4uaW5wdXQtaWNvbiB7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDFweDtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcclxcbn1cXHJcXG5cXHJcXG4uaWNvbjEge1xcclxcbiAgZmxvYXQ6IHJpZ2h0O1xcclxcbiAgY29sb3I6IHJnYigxNDIsIDE0NywgMTUxKTtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gIGZvbnQtc2l6ZTogbWVkaXVtO1xcclxcbiAgcGFkZGluZy1yaWdodDogMiU7XFxyXFxufVxcclxcblxcclxcbi50YXNrIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIHBhZGRpbmc6IDMlO1xcclxcbn1cXHJcXG5cXHJcXG4udG9kby1saXN0IHtcXHJcXG4gIHBhZGRpbmc6IDA7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxuICBsaXN0LXN0eWxlOiBub25lO1xcclxcbiAgZGlzcGxheTogZ3JpZDtcXHJcXG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGVzbW9rZTtcXHJcXG4gIHJvdy1nYXA6IDJweDtcXHJcXG59XFxyXFxuXFxyXFxuLnRvZG8taW5wdXQge1xcclxcbiAgd2lkdGg6IDg1JTtcXHJcXG4gIGJvcmRlcjogbm9uZTtcXHJcXG4gIHBhZGRpbmc6IDEwcHg7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxyXFxufVxcclxcblxcclxcbi50b2RvLWlucHV0OmZvY3VzIHtcXHJcXG4gIG91dGxpbmU6IG5vbmU7XFxyXFxuICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTAzLCAxNjAsIDExKTtcXHJcXG59XFxyXFxuXFxyXFxuaW5wdXQ6OnBsYWNlaG9sZGVyIHtcXHJcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXHJcXG59XFxyXFxuXFxyXFxuLnRhc2stY2hlY2sge1xcclxcbiAgbWFyZ2luLXJpZ2h0OiAyJTtcXHJcXG59XFxyXFxuXFxyXFxuLmxpc3Qge1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIGxpc3Qtc3R5bGU6IG5vbmU7XFxyXFxuICBkaXNwbGF5OiBncmlkO1xcclxcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZXNtb2tlO1xcclxcbiAgcm93LWdhcDogMnB4O1xcclxcbn1cXHJcXG5cXHJcXG4uY2xlYXJlciB7XFxyXFxuICBwYWRkaW5nOiAyJTtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gIGZvbnQtc2l6ZTogMjBweDtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBsaWdodGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uY2xlYXItY29udGFpbmVyIHtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLmRyYWcge1xcclxcbiAgbWFyZ2luLWxlZnQ6IDhweDtcXHJcXG4gIGN1cnNvcjogbW92ZTtcXHJcXG4gIGNvbG9yOiBncmF5O1xcclxcbiAgZm9udC1zaXplOiAxOHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uZHJhZzphY3RpdmUge1xcclxcbiAgY3Vyc29yOiBncmFiYmluZztcXHJcXG59XFxyXFxuXFxyXFxuLnRhc2stdGV4dCB7XFxyXFxuICBib3JkZXI6IG5vbmU7XFxyXFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICBmb250LWZhbWlseTogJ1JvYm90bycsIHNhbnMtc2VyaWY7XFxyXFxuICBmb250LXdlaWdodDogNjAwO1xcclxcbn1cXHJcXG5cXHJcXG4udGFzay10ZXh0OmZvY3VzIHtcXHJcXG4gIG91dGxpbmU6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbiN0YXNrRm9ybSB7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgZmxleC13cmFwOiBub3dyYXA7XFxyXFxufVxcclxcblxcclxcbiN0YXNrU3VibWl0IHtcXHJcXG4gIGZvbnQtc2l6ZTogMTZweDtcXHJcXG4gIHdpZHRoOiAyMCU7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gIHBhZGRpbmctbGVmdDogMTAlO1xcclxcbn1cXHJcXG5cXHJcXG4uY29tcGxldGVkIHtcXHJcXG4gIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoO1xcclxcbn1cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qXG4gIE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG4gIEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcbiovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKSB7XG4gIHZhciBsaXN0ID0gW107IC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcblxuICBsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgY29udGVudCA9IFwiXCI7XG4gICAgICB2YXIgbmVlZExheWVyID0gdHlwZW9mIGl0ZW1bNV0gIT09IFwidW5kZWZpbmVkXCI7XG5cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIik7XG4gICAgICB9XG5cbiAgICAgIGNvbnRlbnQgKz0gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtKTtcblxuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9OyAvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxuXG5cbiAgbGlzdC5pID0gZnVuY3Rpb24gaShtb2R1bGVzLCBtZWRpYSwgZGVkdXBlLCBzdXBwb3J0cywgbGF5ZXIpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG1vZHVsZXMgPSBbW251bGwsIG1vZHVsZXMsIHVuZGVmaW5lZF1dO1xuICAgIH1cblxuICAgIHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XG5cbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgdGhpcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGlkID0gdGhpc1tfaV1bMF07XG5cbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBtb2R1bGVzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgIHZhciBpdGVtID0gW10uY29uY2F0KG1vZHVsZXNbX2kyXSk7XG5cbiAgICAgIGlmIChkZWR1cGUgJiYgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBsYXllciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW1bNV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN1cHBvcnRzKSB7XG4gICAgICAgIGlmICghaXRlbVs0XSkge1xuICAgICAgICAgIGl0ZW1bNF0gPSBcIlwiLmNvbmNhdChzdXBwb3J0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzRdID0gc3VwcG9ydHM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgdmFyIGNvbnRlbnQgPSBpdGVtWzFdO1xuICB2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG5cbiAgaWYgKCFjc3NNYXBwaW5nKSB7XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBpZiAodHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShjc3NNYXBwaW5nKSkpKTtcbiAgICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmcgPSBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG4gICAgdmFyIHNvdXJjZVVSTHMgPSBjc3NNYXBwaW5nLnNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIHJldHVybiBcIi8qIyBzb3VyY2VVUkw9XCIuY29uY2F0KGNzc01hcHBpbmcuc291cmNlUm9vdCB8fCBcIlwiKS5jb25jYXQoc291cmNlLCBcIiAqL1wiKTtcbiAgICB9KTtcbiAgICByZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChzb3VyY2VVUkxzKS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKFwiXFxuXCIpO1xufTsiLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3R5bGUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zdHlsZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN0eWxlc0luRE9NID0gW107XG5cbmZ1bmN0aW9uIGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgdmFyIHJlc3VsdCA9IC0xO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzSW5ET00ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc3R5bGVzSW5ET01baV0uaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikge1xuICAgICAgcmVzdWx0ID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKSB7XG4gIHZhciBpZENvdW50TWFwID0ge307XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gbGlzdFtpXTtcbiAgICB2YXIgaWQgPSBvcHRpb25zLmJhc2UgPyBpdGVtWzBdICsgb3B0aW9ucy5iYXNlIDogaXRlbVswXTtcbiAgICB2YXIgY291bnQgPSBpZENvdW50TWFwW2lkXSB8fCAwO1xuICAgIHZhciBpZGVudGlmaWVyID0gXCJcIi5jb25jYXQoaWQsIFwiIFwiKS5jb25jYXQoY291bnQpO1xuICAgIGlkQ291bnRNYXBbaWRdID0gY291bnQgKyAxO1xuICAgIHZhciBpbmRleEJ5SWRlbnRpZmllciA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgIHZhciBvYmogPSB7XG4gICAgICBjc3M6IGl0ZW1bMV0sXG4gICAgICBtZWRpYTogaXRlbVsyXSxcbiAgICAgIHNvdXJjZU1hcDogaXRlbVszXSxcbiAgICAgIHN1cHBvcnRzOiBpdGVtWzRdLFxuICAgICAgbGF5ZXI6IGl0ZW1bNV1cbiAgICB9O1xuXG4gICAgaWYgKGluZGV4QnlJZGVudGlmaWVyICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cGRhdGVyID0gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLmJ5SW5kZXggPSBpO1xuICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKGksIDAsIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogdXBkYXRlcixcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcbiAgfVxuXG4gIHJldHVybiBpZGVudGlmaWVycztcbn1cblxuZnVuY3Rpb24gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYXBpID0gb3B0aW9ucy5kb21BUEkob3B0aW9ucyk7XG4gIGFwaS51cGRhdGUob2JqKTtcblxuICB2YXIgdXBkYXRlciA9IGZ1bmN0aW9uIHVwZGF0ZXIobmV3T2JqKSB7XG4gICAgaWYgKG5ld09iaikge1xuICAgICAgaWYgKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiYgbmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiYgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcCAmJiBuZXdPYmouc3VwcG9ydHMgPT09IG9iai5zdXBwb3J0cyAmJiBuZXdPYmoubGF5ZXIgPT09IG9iai5sYXllcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGFwaS51cGRhdGUob2JqID0gbmV3T2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBpLnJlbW92ZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gdXBkYXRlcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobGlzdCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgbGlzdCA9IGxpc3QgfHwgW107XG4gIHZhciBsYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xuICAgIG5ld0xpc3QgPSBuZXdMaXN0IHx8IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW2ldO1xuICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleF0ucmVmZXJlbmNlcy0tO1xuICAgIH1cblxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9pZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW19pXTtcblxuICAgICAgdmFyIF9pbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKF9pZGVudGlmaWVyKTtcblxuICAgICAgaWYgKHN0eWxlc0luRE9NW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRPTVtfaW5kZXhdLnVwZGF0ZXIoKTtcblxuICAgICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoX2luZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsYXN0SWRlbnRpZmllcnMgPSBuZXdMYXN0SWRlbnRpZmllcnM7XG4gIH07XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgbWVtbyA9IHt9O1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5cbmZ1bmN0aW9uIGdldFRhcmdldCh0YXJnZXQpIHtcbiAgaWYgKHR5cGVvZiBtZW1vW3RhcmdldF0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB2YXIgc3R5bGVUYXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldCk7IC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG5cbiAgICBpZiAod2luZG93LkhUTUxJRnJhbWVFbGVtZW50ICYmIHN0eWxlVGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuICAgICAgICAvLyBkdWUgdG8gY3Jvc3Mtb3JpZ2luIHJlc3RyaWN0aW9uc1xuICAgICAgICBzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgICBzdHlsZVRhcmdldCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbWVtb1t0YXJnZXRdID0gc3R5bGVUYXJnZXQ7XG4gIH1cblxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5cblxuZnVuY3Rpb24gaW5zZXJ0QnlTZWxlY3RvcihpbnNlcnQsIHN0eWxlKSB7XG4gIHZhciB0YXJnZXQgPSBnZXRUYXJnZXQoaW5zZXJ0KTtcblxuICBpZiAoIXRhcmdldCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgYSBzdHlsZSB0YXJnZXQuIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSAnaW5zZXJ0JyBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cIik7XG4gIH1cblxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydEJ5U2VsZWN0b3I7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpIHtcbiAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gIG9wdGlvbnMuc2V0QXR0cmlidXRlcyhlbGVtZW50LCBvcHRpb25zLmF0dHJpYnV0ZXMpO1xuICBvcHRpb25zLmluc2VydChlbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xuICByZXR1cm4gZWxlbWVudDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzKHN0eWxlRWxlbWVudCkge1xuICB2YXIgbm9uY2UgPSB0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09IFwidW5kZWZpbmVkXCIgPyBfX3dlYnBhY2tfbm9uY2VfXyA6IG51bGw7XG5cbiAgaWYgKG5vbmNlKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlczsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaikge1xuICB2YXIgY3NzID0gXCJcIjtcblxuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQob2JqLnN1cHBvcnRzLCBcIikge1wiKTtcbiAgfVxuXG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuXG4gIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2Ygb2JqLmxheWVyICE9PSBcInVuZGVmaW5lZFwiO1xuXG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJAbGF5ZXJcIi5jb25jYXQob2JqLmxheWVyLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQob2JqLmxheWVyKSA6IFwiXCIsIFwiIHtcIik7XG4gIH1cblxuICBjc3MgKz0gb2JqLmNzcztcblxuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG5cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuXG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cblxuICB2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcblxuICBpZiAoc291cmNlTWFwICYmIHR5cGVvZiBidG9hICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgY3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIi5jb25jYXQoYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSwgXCIgKi9cIik7XG4gIH0gLy8gRm9yIG9sZCBJRVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAgKi9cblxuXG4gIG9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpIHtcbiAgLy8gaXN0YW5idWwgaWdub3JlIGlmXG4gIGlmIChzdHlsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cblxuXG5mdW5jdGlvbiBkb21BUEkob3B0aW9ucykge1xuICB2YXIgc3R5bGVFbGVtZW50ID0gb3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucyk7XG4gIHJldHVybiB7XG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUob2JqKSB7XG4gICAgICBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaik7XG4gICAgfSxcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpO1xuICAgIH1cbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkb21BUEk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQpIHtcbiAgaWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XG4gICAgc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgIHN0eWxlRWxlbWVudC5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgfVxuXG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3R5bGVUYWdUcmFuc2Zvcm07IiwiZXhwb3J0IGZ1bmN0aW9uIHNhdmVMb2NhbChsaXN0KSB7XHJcbiAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKCdsb2NhbFRhc2tzJywgSlNPTi5zdHJpbmdpZnkobGlzdCkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc3RhdHVzKGVsZW0sIGxpc3QpIHtcclxuICBsaXN0LmZvckVhY2goKHRhc2spID0+IHtcclxuICAgIGlmICh0YXNrID09PSBlbGVtKSB7XHJcbiAgICAgIHRhc2suaXNDb21wbGV0ZWQgPSAhdGFzay5pc0NvbXBsZXRlZDtcclxuICAgIH1cclxuICB9KTtcclxuICBzYXZlTG9jYWwobGlzdCk7XHJcbn0iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdGlkOiBtb2R1bGVJZCxcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0ICogYXMgdGFzayBmcm9tICcuL3BvcHVsYXRlLmpzJztcclxuaW1wb3J0ICogYXMgc3RhdCBmcm9tICcuL3N0YXR1cy5qcyc7XHJcbmltcG9ydCAnLi9zdHlsZS5jc3MnO1xyXG5cclxubGV0IGxpc3QgPSBbXTtcclxuY29uc3QgbGlzdEVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndWwnKTtcclxuXHJcbmZ1bmN0aW9uIHRvZG9MaXN0KCkge1xyXG4gIGlmICh3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xvY2FsVGFza3MnKSkge1xyXG4gICAgY29uc3QgbG9jYWxUYXNrcyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbG9jYWxUYXNrcycpO1xyXG4gICAgbGlzdCA9IEpTT04ucGFyc2UobG9jYWxUYXNrcyk7XHJcbiAgfVxyXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b2RvLWxpc3QnKS5pbm5lckhUTUwgPSAnJztcclxuICBsaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgIGNvbnN0IHRhc2tFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcclxuICAgIHRhc2tFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Rhc2snKTtcclxuICAgIGlmIChpdGVtLmlzQ29tcGxldGVkKSB7XHJcbiAgICAgIHRhc2tFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2NvbXBsZXRlZCcpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgY2hlY2tib3gudHlwZSA9ICdjaGVja2JveCc7XHJcbiAgICBjaGVja2JveC5jbGFzc0xpc3QuYWRkKCd0YXNrLWNoZWNrJyk7XHJcbiAgICBjaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuICAgICAgc3RhdC5zdGF0dXMoaXRlbSwgbGlzdCk7XHJcbiAgICAgIHRvZG9MaXN0KCk7XHJcbiAgICB9KTtcclxuICAgIGNoZWNrYm94LmNoZWNrZWQgPSBpdGVtLmlzQ29tcGxldGVkO1xyXG4gICAgdGFza0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hlY2tib3gpO1xyXG4gICAgY29uc3QgdGFza1RleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgdGFza1RleHQuY2xhc3NMaXN0ID0gJ3Rhc2stdGV4dCc7XHJcbiAgICB0YXNrVGV4dC52YWx1ZSA9IGl0ZW0uZGVzY3JpcHRpb247XHJcbiAgICB0YXNrVGV4dC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XHJcbiAgICAgIGlmICh0YXNrVGV4dC52YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgaXRlbS5kZXNjcmlwdGlvbiA9IHRhc2tUZXh0LnZhbHVlO1xyXG4gICAgICAgIHN0YXQuc2F2ZUxvY2FsKGxpc3QpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRhc2tFbGVtZW50LmFwcGVuZENoaWxkKHRhc2tUZXh0KTtcclxuXHJcbiAgICBjb25zdCBkcmFnSWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgZHJhZ0ljb24uY2xhc3NMaXN0ID0gJ2ZhciBmYS10cmFzaC1hbHQgZGVsZXRlQnRuJztcclxuICAgIHRhc2tFbGVtZW50LmFwcGVuZENoaWxkKGRyYWdJY29uKTtcclxuICAgIHRhc2tFbGVtZW50LmRyYWdnYWJsZSA9ICd0cnVlJztcclxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b2RvLWxpc3QnKS5hcHBlbmRDaGlsZCh0YXNrRWxlbWVudCk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlbW92ZUl0ZW0oZSkge1xyXG4gIGlmICghZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkZWxldGVCdG4nKSkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuICBjb25zdCBidG4gPSBlLnRhcmdldDtcclxuICBsaXN0LmZvckVhY2goKHRhc2spID0+IHtcclxuICAgIGlmICh0YXNrLmRlc2NyaXB0aW9uID09PSBidG4ucGFyZW50RWxlbWVudC5jaGlsZHJlblsxXS52YWx1ZSkge1xyXG4gICAgICBsaXN0LnNwbGljZShsaXN0LmluZGV4T2YodGFzayksIDEpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIGJ0bi5jbG9zZXN0KCdsaScpLnJlbW92ZSgpO1xyXG4gIHRhc2sudXBkYXRlSW5kZXgobGlzdCk7XHJcbiAgc3RhdC5zYXZlTG9jYWwobGlzdCk7XHJcbn1cclxuXHJcbmxpc3RFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlbW92ZUl0ZW0pO1xyXG50b2RvTGlzdCgpO1xyXG5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdGFza0Zvcm0nKS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCAoZXZlbnQpID0+IHtcclxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gIHRhc2suYWRkKGxpc3QpO1xyXG4gIHRvZG9MaXN0KCk7XHJcbn0pO1xyXG5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY2xlYXJlcicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG4gIHRhc2sucmVtb3ZlRG9uZShsaXN0KTtcclxuICB0b2RvTGlzdCgpO1xyXG59KTtcclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json old mode 100644 new mode 100755 diff --git a/package.json b/package.json old mode 100644 new mode 100755 diff --git a/src/Task.js b/src/Task.js deleted file mode 100644 index 1e8367e..0000000 --- a/src/Task.js +++ /dev/null @@ -1,33 +0,0 @@ -class Task { - constructor() { - this.tasks = []; - } - - get() { - return this.tasks; - } - - add(task) { - this.tasks.push(task); - } - - update(taskId, task) { - this.tasks[taskId] = task; - } - - remove(taskId) { - this.tasks = this.tasks.filter((task) => task.index.toString() !== taskId); - } - - clearCompleted() { - const newTasks = this.tasts.filter((task) => !task.completed); - this.tasks = newTasks.map((task, index) => { - task.index = index + 1; - return task; - }); - } -} - -const task = new Task(); - -export default task; \ No newline at end of file diff --git a/src/dom.js b/src/dom.js deleted file mode 100644 index f21ff58..0000000 --- a/src/dom.js +++ /dev/null @@ -1,120 +0,0 @@ -import taskActions from './taskActions.js'; - -const tasksList = document.querySelector('.tasks-list'); -const dom = (() => { - const showTrashIcon = () => { - const editBtns = document.querySelectorAll('.task-edit-btn'); - - editBtns.forEach((editBtn) => { - editBtn.addEventListener('click', (e) => { - const tasksElements = document.querySelectorAll('.task-container'); - tasksElements.forEach((taskElm) => { - taskElm.classList.remove('edit-mode'); - }); - const parent = e.target.parentNode.parentNode.parentNode; - parent.classList.add('edit-mode'); - }); - }); - }; - - const renderTasks = (tasks) => { - tasksList.innerHTML = ''; - tasks.map((task) => { - const taskItem = document.createElement('li'); - taskItem.classList.add('task-container', 'd-flex', 'flex-center'); - taskItem.innerHTML = ` -
    - -
    -
    - ${task.description} -
    - -
    -
    -
    - - -
    - `; - showTrashIcon(); - dom.deleteTaskHandler(); - dom.editTastSubmit(); - dom.completeTaskHandler(); - dom.clearCompletedHandler(); - return tasksList.appendChild(taskItem); - }); - }; - - const editTastSubmit = () => { - const editTaskForms = document.querySelectorAll('.edit-task-form'); - editTaskForms.forEach((form) => { - form.addEventListener('submit', (e) => { - e.preventDefault(); - const taskId = form.getAttribute('data-task-id'); - if (form.elements[0].value.trim() === '') return; - const { tasks } = taskActions.updateTask( - taskId, - form.elements[0].value, - ); - renderTasks(tasks); - }); - }); - }; - - const completeTaskHandler = () => { - const checkboxes = document.querySelectorAll('.task-checkbox'); - checkboxes.forEach((checkbox) => { - checkbox.addEventListener('change', (e) => { - const taskId = e.target.getAttribute('data-task-id'); - taskActions.completeTask(taskId, e.target.checked); - window.location.reload(); - }); - }); - }; - - const deleteTaskHandler = () => { - const deleteBtns = document.querySelectorAll('.task-delete-btn'); - deleteBtns.forEach((btn) => { - btn.addEventListener('click', () => { - const taskId = btn.getAttribute('data-task-id'); - const tasks = taskActions.deleteTask(taskId); - renderTasks(tasks); - }); - }); - }; - - const clearCompletedHandler = () => { - const clearCompletedBtn = document.querySelector('.clear-completed-btn'); - clearCompletedBtn.addEventListener('click', () => { - const tasks = taskActions.clearCompleted(); - renderTasks(tasks); - }); - }; - - const updateUI = (tasks) => { - renderTasks(tasks); - }; - - return { - renderTasks, - editTastSubmit, - showTrashIcon, - updateUI, - completeTaskHandler, - deleteTaskHandler, - clearCompletedHandler, - }; -})(); - -export default dom; diff --git a/src/index.html b/src/index.html index 8791c33..f2c0bab 100644 --- a/src/index.html +++ b/src/index.html @@ -1,43 +1,30 @@ - - - - - - - To Do List - - - - -
    -
    - Today's To Do - -
    - -
    -
    - - -
    -
    - - - -
    - -
    -
    - - - + + + + + + + To Do list + + + +
    +
    +
    +

    To Do Lists

    +
    +
    +

    Today's To Do

    +
    + + +
    +
      +
      + +
      +
      +
      +
      + \ No newline at end of file diff --git a/src/index.js b/src/index.js index 92b1133..6e04d52 100644 --- a/src/index.js +++ b/src/index.js @@ -1,37 +1,73 @@ +import * as task from './populate.js'; +import * as stat from './status.js'; import './style.css'; -import storage from './storage.js'; -import taskActions from './taskActions.js'; -import dom from './dom.js'; -import task from './Task.js'; -const form = document.getElementById('form'); -const todoTextInput = document.getElementById('add-book'); +let list = []; +const listEl = document.querySelector('ul'); -const getDefaultTasks = () => { - const tasks = task.get(); - const storedTasks = storage.get('tasks'); - if (storedTasks) { - storedTasks.map((t) => task.add(t)); - dom.renderTasks(storedTasks); - } else { - storage.set('tasks', tasks); - dom.renderTasks(tasks); +function todoList() { + if (window.localStorage.getItem('localTasks')) { + const localTasks = window.localStorage.getItem('localTasks'); + list = JSON.parse(localTasks); } -}; + document.querySelector('.todo-list').innerHTML = ''; + list.forEach((item) => { + const taskElement = document.createElement('li'); + taskElement.classList.add('task'); + if (item.isCompleted) { + taskElement.classList.add('completed'); + } + const checkbox = document.createElement('input'); + checkbox.type = 'checkbox'; + checkbox.classList.add('task-check'); + checkbox.addEventListener('click', () => { + stat.status(item, list); + todoList(); + }); + checkbox.checked = item.isCompleted; + taskElement.appendChild(checkbox); + const taskText = document.createElement('input'); + taskText.classList = 'task-text'; + taskText.value = item.description; + taskText.addEventListener('change', () => { + if (taskText.value.length > 0) { + item.description = taskText.value; + stat.saveLocal(list); + } + }); + taskElement.appendChild(taskText); -form.addEventListener('submit', (e) => { - e.preventDefault(); - const savedTask = taskActions.addTask(todoTextInput.value); - task.add(savedTask); - const tasks = task.get(); - dom.renderTasks(tasks); - todoTextInput.value = ''; -}); + const dragIcon = document.createElement('button'); + dragIcon.classList = 'far fa-trash-alt deleteBtn'; + taskElement.appendChild(dragIcon); + taskElement.draggable = 'true'; + document.querySelector('.todo-list').appendChild(taskElement); + }); +} + +function removeItem(e) { + if (!e.target.classList.contains('deleteBtn')) { + return; + } + const btn = e.target; + list.forEach((task) => { + if (task.description === btn.parentElement.children[1].value) { + list.splice(list.indexOf(task), 1); + } + }); + btn.closest('li').remove(); + task.updateIndex(list); + stat.saveLocal(list); +} -getDefaultTasks(); -dom.updateUI(storage.get('tasks')); -dom.showTrashIcon(); -dom.editTastSubmit(task); -dom.completeTaskHandler(); -dom.deleteTaskHandler(); -dom.clearCompletedHandler(); \ No newline at end of file +listEl.addEventListener('click', removeItem); +todoList(); +document.querySelector('#taskForm').addEventListener('submit', (event) => { + event.preventDefault(); + task.add(list); + todoList(); +}); +document.querySelector('.clearer').addEventListener('click', () => { + task.removeDone(list); + todoList(); +}); diff --git a/src/populate.js b/src/populate.js new file mode 100644 index 0000000..d79e7a7 --- /dev/null +++ b/src/populate.js @@ -0,0 +1,21 @@ +import { saveLocal } from './status.js'; + +export function add(list) { + list.push({ description: document.querySelector('#newTask').value, isCompleted: false, index: list.length + 1 }); + document.querySelector('#newTask').value = ''; + saveLocal(list); +} + +export function updateIndex(list) { + let i = 1; + list.forEach((elem) => { + elem.index = i; + i += 1; + }); +} + +export function removeDone(list) { + list = list.filter((elem) => elem.isCompleted === false); + updateIndex(list); + saveLocal(list); +} \ No newline at end of file diff --git a/src/status.js b/src/status.js new file mode 100644 index 0000000..9451020 --- /dev/null +++ b/src/status.js @@ -0,0 +1,12 @@ +export function saveLocal(list) { + window.localStorage.setItem('localTasks', JSON.stringify(list)); +} + +export function status(elem, list) { + list.forEach((task) => { + if (task === elem) { + task.isCompleted = !task.isCompleted; + } + }); + saveLocal(list); +} \ No newline at end of file diff --git a/src/storage.js b/src/storage.js deleted file mode 100644 index c7ec992..0000000 --- a/src/storage.js +++ /dev/null @@ -1,13 +0,0 @@ -const storage = { - get: (key) => { - const value = localStorage.getItem(key); - return value ? JSON.parse(value) : null; - }, - set: (key, value) => { - localStorage.setItem(key, JSON.stringify(value)); - }, - remove: (key) => { - localStorage.removeItem(key); - }, -}; -export default storage; \ No newline at end of file diff --git a/src/style.css b/src/style.css index fd4bd4d..99f657c 100644 --- a/src/style.css +++ b/src/style.css @@ -1,209 +1,159 @@ -:root { - --primary: rgb(71, 69, 69); - --secondary: #ccc; - --border: rgb(221, 219, 219); - --background: rgb(243, 243, 243); -} - -* { - box-sizing: border-box; - padding: 0; - margin: 0; -} - -.d-flex { - display: flex; -} - -.flex-center { - align-items: center; -} - -body { - width: 100%; - min-height: 100vh; - background-color: var(--background); - font-size: 1.4rem; -} - -i { - cursor: pointer; - color: var(--secondary); -} - -section { - background-color: #fff; - width: 50%; - min-width: 300px; - box-shadow: 0 3px 10px rgb(0 0 0 / 20%); - border-radius: 6px; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); -} - -.header { - border-bottom: 1px solid var(--border); - padding: 1.2rem 1.5rem; - color: var(--primary); - justify-content: space-between; -} - -form button { - background-color: transparent; - border: none; - padding: 0.6rem; -} - -form button i { - transform: rotate(90deg); - font-size: 1rem; - font-weight: 400; -} - -.header i { - transform: rotate(90deg); - font-size: 18px; -} - -form > div { - border-bottom: 1px solid var(--border); - padding: 0.7rem 1.5rem; - justify-content: space-between; - width: 100%; -} - -form input { - border: none; - outline: none; - min-width: 250px; - padding: 0.8rem 0; - flex: 1; -} - -form input, -form input::-webkit-input-placeholder { - font-size: 1.2rem; - font-family: 'Roboto', sans-serif; - font-style: italic; - font-weight: 100; - color: rgb(131, 130, 130); -} - -.tasks-list { - min-width: 100%; -} - -.tasks-list li { - width: 100%; - list-style: none; - border-bottom: 1px solid var(--border); - padding: 0.7rem 1.2rem; -} - -.task-container button i { - font-size: 1.2rem; -} - -.tasks-list li label { - margin-left: 6px; - font-size: inherit; - color: var(--primary); - cursor: pointer; -} - -/* .tasks-list li label.compeleted { - text-decoration: line-through; - font-style: italic; - color: var(--secondary); -} */ - -.tasks-list li i:hover { - color: var(--primary); - cursor: pointer; -} - -.clear-btn button { - width: 100%; - font-size: inherit; - padding: 1.2rem; - border: none; - outline: none; - color: var(--secondary); - background-color: var(--background); - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; - cursor: pointer; -} - -.task-container .task-details { - flex: 1; - display: flex; - padding: 0 1rem; -} - -.task-container .task-details span { - margin-left: 6px; - font-size: inherit; - color: var(--primary); -} - -.task-container .task-details span.compeleted { - text-decoration: line-through; -} - -.task-container .task-details input { - border: none; - font-size: inherit; - color: var(--primary); - outline: none; - flex: 1; - display: none; - background-color: transparent; -} - -.task-container .task-action-btns button { - width: 2.2rem; - background-color: transparent; - border: none; - cursor: pointer; - padding: 0.3rem 0; -} - -.task-container .task-action-btns button i { - padding: 0.6rem; -} - -.task-container .task-action-btns button:last-child { - display: none; -} - -.edit-task-form { - flex: 1; - display: flex; -} - -.task-container.edit-mode { - background-color: #faf3db; -} - -.task-container.edit-mode .task-action-btns button:last-child { - display: block; -} - -.task-details.completed span { - text-decoration: line-through; -} - -.task-container.edit-mode .task-action-btns button:first-child { - display: none; -} - -.task-container.edit-mode .task-details input { - display: block; -} - -.task-container.edit-mode .task-details span { - display: none; -} +h1 { + text-align: center; +} + +section { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; +} + +h2 { + margin: 0; + padding: 2%; + background-color: white; +} + +button { + background-color: transparent; + border: none; +} + +.container { + width: 100%; + max-width: 500px; + display: flex; + flex-direction: column; + align-items: center; +} + +.todolist-container { + width: 100%; + background-color: whitesmoke; + display: grid; + grid-template-columns: 1fr; + row-gap: 2px; + box-shadow: 1px 1px 5px gray; +} + +.icon { + width: 16px; + width: 15px; + padding-left: 5%; +} + +.input-icon { + width: 100%; + margin-bottom: 1px; + background-color: white; +} + +.icon1 { + float: right; + color: rgb(142, 147, 151); + cursor: pointer; + font-size: medium; + padding-right: 2%; +} + +.task { + background-color: white; + display: flex; + padding: 3%; +} + +.todo-list { + padding: 0; + margin: 0; + list-style: none; + display: grid; + grid-template-columns: 1fr; + background-color: whitesmoke; + row-gap: 2px; +} + +.todo-input { + width: 85%; + border: none; + padding: 10px; + background-color: white; + cursor: pointer; + margin: 0; + box-sizing: border-box; +} + +.todo-input:focus { + outline: none; + border: 2px solid rgb(103, 160, 11); +} + +input::placeholder { + font-style: italic; +} + +.task-check { + margin-right: 2%; +} + +.list { + padding: 0; + margin: 0; + list-style: none; + display: grid; + grid-template-columns: 1fr; + background-color: rgb(226, 222, 222); + row-gap: 2px; +} + +.clearer { + padding: 2%; + cursor: pointer; + font-size: 20px; + font-weight: lighter; +} + +.clear-container { + text-align: center; +} + +.drag { + margin-left: 8px; + cursor: move; + color: gray; + font-size: 18px; +} + +.drag:active { + cursor: grabbing; +} + +.task-text { + border: none; + box-sizing: border-box; + width: 100%; + font-family: 'Roboto', sans-serif; + font-weight: 600; +} + +.task-text:focus { + outline: none; +} + +#taskForm { + display: flex; + flex-wrap: nowrap; +} + +#taskSubmit { + font-size: 16px; + width: 20%; + background-color: white; + margin: 0; + cursor: pointer; + padding-left: 10%; +} + +.completed { + text-decoration: line-through; +} diff --git a/src/taskActions.js b/src/taskActions.js deleted file mode 100644 index c38bb50..0000000 --- a/src/taskActions.js +++ /dev/null @@ -1,63 +0,0 @@ -import storage from './storage.js'; - -const taskActions = (() => { - const addTask = (description) => { - const tasks = storage.get('tasks'); - const task = { - index: tasks.length + 1, - completed: false, - description, - }; - tasks.push(task); - storage.set('tasks', tasks); - return task; - }; - - const updateTask = (index, description) => { - const tasks = storage.get('tasks'); - const task = tasks[index - 1]; - task.description = description; - storage.set('tasks', tasks); - return { task, tasks }; - }; - - const completeTask = (index, checked) => { - const tasks = storage.get('tasks'); - const task = tasks[index - 1]; - task.completed = checked; - storage.set('tasks', tasks); - return { task, tasks }; - }; - - const deleteTask = (index) => { - let tasks = storage.get('tasks'); - tasks.splice(index - 1, 1); - tasks = tasks.map((task, i) => { - task.index = i + 1; - return task; - }); - storage.set('tasks', tasks); - return tasks; - }; - - const clearCompleted = () => { - const tasks = storage.get('tasks'); - let unCompletedTasks = tasks.filter((task) => !task.completed); - unCompletedTasks = unCompletedTasks.map((task, index) => { - task.index = index + 1; - return task; - }); - storage.set('tasks', unCompletedTasks); - return unCompletedTasks; - }; - - return { - addTask, - updateTask, - completeTask, - deleteTask, - clearCompleted, - }; -})(); - -export default taskActions; \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js old mode 100644 new mode 100755