diff --git a/CHANGELOG.md b/CHANGELOG.md index e72ab43..f93ff77 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ ### HEAD +### 0.0.5 (July 24, 2017) + + * Added the method events() to Component, + * Added the event methods $().on() and $().off, + * ..., + + ### 0.0.4 (July 11, 2017) * Added a link to Kiwii-Vizu in the README.md file, diff --git a/README.md b/README.md index 262861f..7f48e8a 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,7 @@ The method `Vizu.render()` renders the `Vizu Web Components` directly in the DOM - [Extend the Vizu Web Component with new methods](#extend-the-vizu-web-component-with-new-methods) - [Create Vizu Web Component without ES6 classes](#create-vizu-web-component-without-es6-classes) - [Résumé](#rsum) + - [Adds events to Vizu Web Component](#adds-events-to-vizu-web-component) - [Interact with the Vizu Web Components](#interact-with-the-vizu-web-components) - [The Variables](#the-variables) - [The methods](#the-methods) @@ -390,6 +391,48 @@ A `Vizu Web Component` can provides the method `getInitialState` that defines so A `Vizu Web Component` can be extended with specific methods. +## Adds events to Vizu Web Component + +`Vizu Web Component` implements the method `events()` that is executed when the component is rendered in the DOM tree to attach events. + +Example for a counter: +```js +import { Component } from 'vizu'; + +class Counter extends Component { + + getInitialState() { + this.props.options.counter = 0; + } + + events() { + const self = this; + let counter = this.props.options.counter; + // Increment: + this.$('.plus').on('click', () => { + counter += 1; + self.$('h1').text(counter); + }); + // Decrement: + this.$('.minus').on('click', () => { + counter -= 1; + self.$('h1').text(counter); + }); + } + + render() { + return ` +
+

${this.props.options.counter}

+ + +
+ `; + } +} +``` + + ## Interact with the Vizu Web Components When the view is rendered, `Vizu` returns an object on this view: @@ -475,17 +518,21 @@ class extends Component { } $() { } + events() { + } render() { } } ``` -A `Vizu Web Component` is a class object that extends the class `Component` of `Vizu`. It implements three methods: +A `Vizu Web Component` is a class object that extends the class `Component` of `Vizu`. It implements four methods: * `getInitialState`: this method is executed before the component is rendered. It initializes Javascript variables at their initial value. * `$`: this method interacts with the DOM elements of the selected `Vizu Web Component`. `$` is a wrapper around the Javascript function `querySelector` and it implements a few functions (see below). + * `events`: this method attaches events to the component when it is rendered in the DOM tree. + * `render`: this method returns the component defined in a string by HTML tags. @@ -508,6 +555,10 @@ $().html('

Title

') | replaces the child element of the Vizu Web Com $(el).html('

Title

') | adds the child element

Title

to the el child element. $(el).text() | returns the contents of the el child element. $(el).text('aaa') | replaces the contents of the el child element by aaa. +$(el).empty() | removes all the child nodes. +$(el).append(hml) | adds the HTML string after the last child node. +$(el).on(event, listener) | adds an event listener to the selected child. +$(el).off(event, listener) | removes the attached event listener from the selected child. ``` diff --git a/_dist/README.md b/_dist/README.md index 262861f..7f48e8a 100644 --- a/_dist/README.md +++ b/_dist/README.md @@ -93,6 +93,7 @@ The method `Vizu.render()` renders the `Vizu Web Components` directly in the DOM - [Extend the Vizu Web Component with new methods](#extend-the-vizu-web-component-with-new-methods) - [Create Vizu Web Component without ES6 classes](#create-vizu-web-component-without-es6-classes) - [Résumé](#rsum) + - [Adds events to Vizu Web Component](#adds-events-to-vizu-web-component) - [Interact with the Vizu Web Components](#interact-with-the-vizu-web-components) - [The Variables](#the-variables) - [The methods](#the-methods) @@ -390,6 +391,48 @@ A `Vizu Web Component` can provides the method `getInitialState` that defines so A `Vizu Web Component` can be extended with specific methods. +## Adds events to Vizu Web Component + +`Vizu Web Component` implements the method `events()` that is executed when the component is rendered in the DOM tree to attach events. + +Example for a counter: +```js +import { Component } from 'vizu'; + +class Counter extends Component { + + getInitialState() { + this.props.options.counter = 0; + } + + events() { + const self = this; + let counter = this.props.options.counter; + // Increment: + this.$('.plus').on('click', () => { + counter += 1; + self.$('h1').text(counter); + }); + // Decrement: + this.$('.minus').on('click', () => { + counter -= 1; + self.$('h1').text(counter); + }); + } + + render() { + return ` +
+

${this.props.options.counter}

+ + +
+ `; + } +} +``` + + ## Interact with the Vizu Web Components When the view is rendered, `Vizu` returns an object on this view: @@ -475,17 +518,21 @@ class extends Component { } $() { } + events() { + } render() { } } ``` -A `Vizu Web Component` is a class object that extends the class `Component` of `Vizu`. It implements three methods: +A `Vizu Web Component` is a class object that extends the class `Component` of `Vizu`. It implements four methods: * `getInitialState`: this method is executed before the component is rendered. It initializes Javascript variables at their initial value. * `$`: this method interacts with the DOM elements of the selected `Vizu Web Component`. `$` is a wrapper around the Javascript function `querySelector` and it implements a few functions (see below). + * `events`: this method attaches events to the component when it is rendered in the DOM tree. + * `render`: this method returns the component defined in a string by HTML tags. @@ -508,6 +555,10 @@ $().html('

Title

') | replaces the child element of the Vizu Web Com $(el).html('

Title

') | adds the child element

Title

to the el child element. $(el).text() | returns the contents of the el child element. $(el).text('aaa') | replaces the contents of the el child element by aaa. +$(el).empty() | removes all the child nodes. +$(el).append(hml) | adds the HTML string after the last child node. +$(el).on(event, listener) | adds an event listener to the selected child. +$(el).off(event, listener) | removes the attached event listener from the selected child. ``` diff --git a/_dist/vizu-min.js b/_dist/vizu-min.js index 4c30c1e..bb8290e 100644 --- a/_dist/vizu-min.js +++ b/_dist/vizu-min.js @@ -1,9 +1,9 @@ /** - * vizu v0.0.4 + * vizu v0.0.5 * * A Javascript View library for building web and hybrid mobile apps. * Copyright (c) 2017 Jclo (http://www.mobilabs.fr). * Released under the MIT license. You may obtain a copy of the License * at: http://www.opensource.org/licenses/mit-license.php). */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Vizu=e()}}(function(){return function e(t,n,o){function r(u,c){if(!n[u]){if(!t[u]){var l="function"==typeof require&&require;if(!c&&l)return l(u,!0);if(i)return i(u,!0);var f=new Error("Cannot find module '"+u+"'");throw f.code="MODULE_NOT_FOUND",f}var s=n[u]={exports:{}};t[u][0].call(s.exports,function(e){var n=t[u][1][e];return r(n||e)},s,s.exports,e,t,n,o)}return n[u].exports}for(var i="function"==typeof require&&require,u=0;u"+this.id+""}},{key:"rendered",get:function(){var e=void 0;this.getInitialState();var t=this.render();if(e=t.match(/^\s*
0?t:null,n?n.innerHTML=i:(n=d.vdom?d.vdom.window.document.body:document.body).innerHTML=+i,r.el=n,r},replace:function(e,t){var n=void 0,o=void 0;if("[object Object]"===Object.prototype.toString.call(e)&&e.cList&&e.el&&"[object Object]"===Object.prototype.toString.call(t)){var r=Object.keys(t)[0],u=r.replace(/[^a-zA-z0-9]/g,""),c=new t[r],l=i(e,r);if(l){l[u]?(n=l[u].id,l[u]=null,o=1):(n=l.components[u].id,l.components[u]=null,o=2),l.cList[r]=null;var f=d.vdom?d.vdom.window.document.createElement("div"):document.createElement("div"),s=d.vdom?d.vdom.window.document.getElementById(n):document.getElementById(n);f.innerHTML=c.rendered,s.parentNode.replaceChild(f.firstChild,s),1===o?l[u]=c:l.components[u]=c,l.cList[r]=t[r]}}},createClass:function(e){if("[object Object]"!==Object.prototype.toString.call(e))return null;for(var t=Object.keys(e),n=[],o=0;o"+this.id+"
"}},{key:"rendered",get:function(){var e=void 0;this.getInitialState();var t=this.render();if(e=t.match(/^\s*
0?t:null,n?n.innerHTML=i:(n=a.vdom?a.vdom.window.document.body:document.body).innerHTML=+i,u(r),r.el=n,r},replace:function(e,t){var n=void 0,o=void 0;if("[object Object]"===Object.prototype.toString.call(e)&&e.cList&&e.el&&"[object Object]"===Object.prototype.toString.call(t)){var r=Object.keys(t)[0],u=r.replace(/[^a-zA-z0-9]/g,""),c=new t[r],l=i(e,r);if(l){l[u]?(n=l[u].id,l[u]=null,o=1):(n=l.components[u].id,l.components[u]=null,o=2),l.cList[r]=null;var s=a.vdom?a.vdom.window.document.createElement("div"):document.createElement("div"),f=a.vdom?a.vdom.window.document.getElementById(n):document.getElementById(n);s.innerHTML=c.rendered,f.parentNode.replaceChild(s.firstChild,f),1===o?l[u]=c:l.components[u]=c,l.cList[r]=t[r]}}},createClass:function(e){if("[object Object]"!==Object.prototype.toString.call(e))return null;for(var t=Object.keys(e),n=[],o=0;o${this.id}
`;\n }\n\n /**\n * Processes the web component to convert child(s) to plain HTML.\n *\n * @method ()\n * @public\n * @param {} -,\n * @returns {String} returns the web component,\n * @since 0.0.0\n */\n get rendered() {\n let t;\n // Initializes:\n this.getInitialState();\n // Add an unique ID to this component:\n // let t = this.render().replace(/
/, `
`);\n const co = this.render();\n if (co.match(/^\\s*
0 ? cList : null;\n\n // Fill the DOM:\n if (el) {\n el.innerHTML = t;\n } else {\n el = Vizu.vdom ? Vizu.vdom.window.document.body : document.body;\n el.innerHTML = +t;\n }\n // Attach parent element:\n view.el = el;\n\n // Return the rendered object (with a reference to all the web components):\n return view;\n },\n\n /**\n * Replaces a component with another component having the same tag.\n *\n * @method (arg1, arg2)\n * @public\n * @param {Object} the view object,\n * @param {Object} the new component ({ '': 'new class' }),\n * @returns {} -,\n * @since 0.0.0\n */\n replace(view, component) {\n let id\n , type\n ;\n\n // Check that view is an object with, at least, the properties cList and el:\n if (Object.prototype.toString.call(view) !== '[object Object]' || !view.cList || !view.el) {\n return;\n }\n\n // Check that component is an object:\n if (Object.prototype.toString.call(component) !== '[object Object]') {\n return;\n }\n\n // Process the new component:\n const newctag = Object.keys(component)[0];\n const newcname = newctag.replace(/[^a-zA-z0-9]/g, '');\n const newc = new component[newctag]();\n\n // Check if a component with the same name already exists in the view:\n const path = explore(view, newctag);\n if (path) {\n // Get its id and remove it:\n if (path[newcname]) {\n id = path[newcname].id;\n path[newcname] = null;\n type = 1;\n } else {\n id = path.components[newcname].id;\n path.components[newcname] = null;\n type = 2;\n }\n path.cList[newctag] = null;\n\n // Get its id and clear it:\n const wrapper = Vizu.vdom\n ? Vizu.vdom.window.document.createElement('div')\n : document.createElement('div');\n\n const oldNode = Vizu.vdom\n ? Vizu.vdom.window.document.getElementById(id)\n : document.getElementById(id);\n\n wrapper.innerHTML = newc.rendered;\n oldNode.parentNode.replaceChild(wrapper.firstChild, oldNode);\n\n // Attach the new node to view:\n if (type === 1) {\n path[newcname] = newc;\n } else {\n path.components[newcname] = newc;\n }\n path.cList[newctag] = component[newctag];\n }\n },\n\n /**\n * Extends the class Component.\n *\n * @method (arg1)\n * @public\n * @param {Object} the methods to add to Component,\n * @returns {Object} returns the extended class component,\n * @since 0.0.3\n */\n createClass(methods) {\n // Check that methods is an object:\n if (Object.prototype.toString.call(methods) !== '[object Object]') {\n return null;\n }\n\n // Extract keys:\n const keys = Object.keys(methods);\n const o = [];\n for (let i = 0; i < keys.length; i++) {\n o.push({\n key: keys[i],\n value: methods[keys[i]],\n });\n }\n\n return _subClass(Component, o);\n },\n};\n\nexport default Vizu;\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJpbmRleC5qcyIsInNyYy9jb21wb25lbnQuanMiLCJzcmMvdml6dS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztBQ0FBOzs7O0FBQ0E7Ozs7OztrQkFFZSxFQUFFLDhCQUFGLEVBQWEsb0JBQWIsRTs7Ozs7Ozs7OztxakJDSGY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUNBOzs7Ozs7OztBQUVBOztBQUVBOzs7QUFHQTs7O0FBR0E7O0FBRUE7Ozs7O0lBS00sUztBQUNOOzs7Ozs7O0FBT0UsdUJBQWM7QUFBQTs7QUFDWjtBQUNBLFNBQUssRUFBTCxTQUFjLEtBQUssTUFBTCxHQUFjLFFBQWQsQ0FBdUIsRUFBdkIsRUFBMkIsTUFBM0IsQ0FBa0MsQ0FBbEMsRUFBcUMsQ0FBckMsQ0FBZDtBQUNBLFNBQUssS0FBTCxHQUFhLElBQWI7QUFDQSxTQUFLLFVBQUwsR0FBa0IsSUFBbEI7QUFDQSxTQUFLLEtBQUwsR0FBYSxFQUFiO0FBQ0EsU0FBSyxLQUFMLENBQVcsT0FBWCxHQUFxQixFQUFyQjtBQUNEOztBQUVEOzs7Ozs7Ozs7Ozs7O3NDQVNrQjtBQUNoQjtBQUNBLFdBQUssS0FBTCxHQUFhLEVBQWI7QUFDQSxXQUFLLEtBQUwsQ0FBVyxPQUFYLEdBQXFCLEVBQXJCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7Ozs7c0JBVUUsRSxFQUFJO0FBQ0osVUFBTSxPQUFPLElBQWI7O0FBRUE7Ozs7Ozs7Ozs7QUFVQSxVQUFNLGFBQWEsU0FBYixVQUFhLEdBQVc7QUFDNUIsWUFBSSxFQUFKLEVBQVE7QUFDTjtBQUNBLGlCQUFPLGVBQUssSUFBTCxHQUNILGVBQUssSUFBTCxDQUFVLE1BQVYsQ0FBaUIsUUFBakIsQ0FBMEIsYUFBMUIsT0FBNEMsS0FBSyxFQUFqRCxFQUF1RCxhQUF2RCxDQUFxRSxFQUFyRTtBQUNGO0FBRkssWUFHSCxTQUFTLGFBQVQsT0FBMkIsS0FBSyxFQUFo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Q0Q7QUFyS1UsQ0FBYjs7a0JBd0tlLEkiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiaW1wb3J0IENvbXBvbmVudCBmcm9tICcuL3NyYy9jb21wb25lbnQnO1xuaW1wb3J0IFZpenUgZnJvbSAnLi9zcmMvdml6dSc7XG5cbmV4cG9ydCBkZWZhdWx0IHsgQ29tcG9uZW50LCBWaXp1IH07XG4iLCIvKiBnbG9iYWwgZG9jdW1lbnQgKi9cbi8qIGVzbGludCBpbmRlbnQ6IFtcImVycm9yXCIsIDIsIHsgXCJWYXJpYWJsZURlY2xhcmF0b3JcIjogeyBcInZhclwiOiAxLCBcImxldFwiOiAxLCBcImNvbnN0XCI6IDIgfSB9XSAqL1xuLyogZXNsaW50IG9uZS12YXI6IDAgKi9cbi8vIC0tIFZlbmRvciBtb2R1bGVzXG5cbi8vIC0tIExvY2FsIG1vZHVsZXNcbmltcG9ydCBWaXp1IGZyb20gJy4vdml6dSc7XG5cbi8vIC0tIEdsb2JhbCBjb25zdGFudHMgKGluIHRoZSBzY29wZSBvZiB0aGlzIG1vZHVsZSlcblxuLy8gLS0gR2xvYmFsIHZhcmlhYmxlcyAoaW4gdGhlIHNjb3BlIG9mIHRoaXMgbW9kdWxlKVxuXG5cbi8vIC0tIFByaXZhdGUgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gLS0gUHVibGljIE1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4qIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgd2ViIGNvbXBvbmVudC5cbipcbiogQG5hbWVzcGFjZSB2aXp1XG4qL1xuY2xhc3MgQ29tcG9uZW50IHtcbi8qKlxuICogQ3JlYXRlcyBhbiB1bmlxdWUgSUQgZm9yIHRoaXMgY29tcG9uZW50LlxuICpcbiAqIEBjb25zdHJ1Y3RvciAoKVxuICogQHB1YmxpY1xuICogQHBhcmFtIHt9ICAgICAgICAgIC0sXG4gKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gQ3JlYXRlIGFuIHVuaXF1ZSBpZCBmb3IgdGhpcyBjb21wb25lbnQ6XG4gICAgdGhpcy5pZCA9IGBpJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgNyl9YDtcbiAgICB0aGlzLmNMaXN0ID0gbnVsbDtcbiAgICB0aGlzLmNvbXBvbmVudHMgPSBudWxsO1xuICAgIHRoaXMucHJvcHMgPSB7fTtcbiAgICB0aGlzLnByb3BzLm9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNlcyB0aGUgdmFyaWFibGVzIHdoZW4gdGhlIGNvbXBvbmVudCBpcyByZW5kZXJlZC5cbiAgICpcbiAgICogQG1ldGhvZCAoKVxuICAgKiBAcHVibGljXG4gICAqIEBwYXJhbSB7fSAgICAgICAgLSxcbiAgICogQHJldHVybnMge30gICAgICAtLFxuICAgKiBAc2luY2UgMC4wLjBcbiAgICovXG4gIGdldEluaXRpYWxTdGF0ZSgpIHtcbiAgICAvLyBUbyBhdm9pZCBlc2xpbnQgZXJyb3IhXG4gICAgdGhpcy5wcm9wcyA9IHt9O1xuICAgIHRoaXMucHJvcHMub3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIENTUyBzZWxlY3RvcihzKS5cbiAgICpcbiAgICogQG1ldGhvZCAoYXJnMSlcbiAgICogQHB1YmxpY1xuICAgKiBAcGFyYW0ge1N0cmluZ30gICAgdGhlIENTUyBzZWxlY3RvcihzKSxcbiAgICogQHJldHVybnMge09iamVjdH0gIHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIGEgc3BlY2lmaWVkXG4gICAqICAgICAgICAgICAgICAgICAgICBDU1Mgc2VsZWN0b3IocyksXG4gICAqIEBzaW5jZSAwLjAuMFxuICAgKi9cbiAgJChlbCkge1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgQ1NTIHNlbGVjdG9yKHMpLlxuICAgICAqXG4gICAgICogQG1ldGhvZCAoYXJnMSlcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtIHtTdHJpbmd9ICAgIHRoZSBDU1Mgc2VsZWN0b3IocyksXG4gICAgICogQHJldHVybnMge09iamVjdH0gIHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIGEgc3BlY2lmaWVkXG4gICAgICogICAgICAgICAgICAgICAgICAgIENTUyBzZWxlY3RvcihzKSxcbiAgICAgKiBAc2luY2UgMC4wLjBcbiAgICAgKi9cbiAgICBjb25zdCBnZXRFbGVtZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgLy8gUmV0dXJucyB0aGUgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvcihzKTpcbiAgICAgICAgcmV0dXJuIFZpenUudmRvbVxuICAgICAgICAgID8gVml6dS52ZG9tLndpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHt0aGF0LmlkfWApLnF1ZXJ5U2VsZWN0b3IoZWwpXG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3RoYXQuaWR9YCkucXVlcnlTZWxlY3RvcihlbCk7XG4gICAgICB9XG4gICAgICAvLyBSZXR1cm4gdGhlIGVudGlyZSAnd2ViIGNvbXBvbmVudCc6XG4gICAgICByZXR1cm4gVml6dS52ZG9tXG4gICAgICAgID8gVml6dS52ZG9tLndpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHt0aGF0LmlkfWApXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7dGhhdC5pZH1gKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgRE9NVG9rZW5MaXN0IGNvbGxlY3Rpb24gb2YgdGhlIGNsYXNzIGF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kICgpXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7fSAgICAgICAgICAtLFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9ICByZXR1cm5zIHRoZSBET01Ub2tlbkxpc3Qgb2YgdGhlIGVsZW1lbnQsXG4gICAgICogQHNpbmNlIDAuMC4wXG4gICAgICovXG4gICAgY29uc3QgZ2V0Q2xhc3NMaXN0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZ2V0RWxlbWVudCgpLmNsYXNzTGlzdDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNsYXNzIG5hbWUgdG8gdGhlIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIChhcmcxKVxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gICAgdGhlIGNsYXNzIG5hbWUgdG8gYWRkLFxuICAgICAqIEByZXR1cm5zIHt9ICAgICAgICAtLFxuICAgICAqIEBzaW5jZSAwLjAuMFxuICAgICAqL1xuICAgIGNvbnN0IGFkZENsYXNzID0gZnVuY3Rpb24oY2xhc3NOYW1lKSB7XG4gICAgICBnZXRFbGVtZW50KCkuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgY2xhc3MgbmFtZSB0byB0aGUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBtZXRob2QgKGFyZzEpXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgICB0aGUgY2xhc3MgbmFtZSB0byByZW1vdmUsXG4gICAgICogQHJldHVybnMge30gICAgICAgIC0sXG4gICAgICogQHNpbmNlIDAuMC4wXG4gICAgICovXG4gICAgY29uc3QgcmVtb3ZlQ2xhc3MgPSBmdW5jdGlvbihjbGFzc05hbWUpIHtcbiAgICAgIGdldEVsZW1lbnQoKS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgYSBjbGFzcyBuYW1lIGZvciB0aGUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBtZXRob2QgKGFyZzEpXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgICB0aGUgY2xhc3MgbmFtZSB0byBhZGQvcmVtb3ZlLFxuICAgICAqIEByZXR1cm5zIHt9ICAgICAgICAtLFxuICAgICAqIEBzaW5jZSAwLjAuMFxuICAgICAqL1xuICAgIGNvbnN0IHRvZ2dsZUNsYXNzID0gZnVuY3Rpb24oY2xhc3NOYW1lKSB7XG4gICAgICBnZXRFbGVtZW50KCkuY2xhc3NMaXN0LnRvZ2dsZShjbGFzc05hbWUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIEhUTUwgY29udGVudHMgb2YgdGhlIGVsZW1lbnQsXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIChhcmcxKVxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gICAgdGhlIGh0bWwgY29udGVudHMgdG8gYWRkLFxuICAgICAqIEByZXR1cm5zIHt9ICAgICAgICAtLFxuICAgICAqIEBzaW5jZSAwLjAuMFxuICAgICAqL1xuICAgIGNvbnN0IGh0bWwgPSBmdW5jdGlvbihodG1sc3RyaW5nKSB7XG4gICAgICBpZiAoaHRtbHN0cmluZykge1xuICAgICAgICBnZXRFbGVtZW50KCkuaW5uZXJIVE1MID0gaHRtbHN0cmluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiBnZXRFbGVtZW50KCkuaW5uZXJIVE1MO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHRleHQgY29udGVudHMgb2YgdGhlIGVsZW1lbnQsXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIChhcmcxKVxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gICAgdGhlIHRleHQgY29udGVudHMgdG8gYWRkLFxuICAgICAqIEByZXR1cm5zIHt9ICAgICAgICAtLFxuICAgICAqIEBzaW5jZSAwLjAuMFxuICAgICAqL1xuICAgIGNvbnN0IHRleHQgPSBmdW5jdGlvbih0ZXh0ZSkge1xuICAgICAgaWYgKHRleHRlKSB7XG4gICAgICAgIGdldEVsZW1lbnQoKS50ZXh0Q29udGVudCA9IHRleHRlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKS50ZXh0Q29udGVudDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBzdHlsZSBhdHRyaWJ1dGUgb2YgdGhlIGVsZW1lbnQsXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIChhcmcxLCBhcmcyKVxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gICAgdGhlIHN0eWxlIGF0dHJpYnV0ZSxcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gICAgdGhlIHN0eWxlIGF0dHJpYnV0ZSB2YWx1ZSxcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSAgdW5kZWZpbmVkIG9yIHRoZSBzdHlsZSBhdHRyaWJ1dGUgdmFsdWUsXG4gICAgICogQHNpbmNlIDAuMC4zXG4gICAgICovXG4gICAgY29uc3QgY3NzID0gZnVuY3Rpb24oc3R5bGVBdHRyLCB2YWx1ZSkge1xuICAgICAgY29uc3QgYXJyID0gdHlwZW9mIHN0eWxlQXR0ciA9PT0gJ3N0cmluZycgPyBzdHlsZUF0dHIuc3BsaXQoJy0nKSA6IFtdO1xuICAgICAgbGV0IGF0dHIgPSAnJztcblxuICAgICAgLy8gQ29udmVydCBzdHlsZSBhdHRyaWJ1dGUgbmFtZSB3aXRoICctJyAoZXguOiAnZm9udC1zaXplJyB0byAnZm9udFNpemUnKTpcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgYXR0ciArPSBhcnJbaV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXR0ciArPSBhcnJbaV0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBhcnJbaV0uc2xpY2UoMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAvLyBHZXQgYXR0cmlidXRlOlxuICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpLnN0eWxlW2F0dHJdO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgYXR0cmlidXRlOlxuICAgICAgZ2V0RWxlbWVudCgpLnN0eWxlW2F0dHJdID0gdmFsdWU7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCB0aGUgY2hpbGRzIG9mIHRoZSBjdXJyZW50IG5vZGUuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kICgpXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7fSAgICAgICAgICAtLFxuICAgICAqIEByZXR1cm5zIHt9ICAgICAgICAtLFxuICAgICAqIEBzaW5jZSAwLjAuNFxuICAgICAqL1xuICAgIGNvbnN0IGVtcHR5ID0gZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBub2RlID0gZ2V0RWxlbWVudCgpO1xuICAgICAgd2hpbGUgKG5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUuZmlyc3RDaGlsZCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFwcGVuZHMgYW4gSFRNTCBzdHJpbmcgYWZ0ZXIgdGhlIGxhc3QgY2hpbGQgb2YgdGhlIGN1cnJlbnQgbm9kZS5cbiAgICAgKlxuICAgICAqIEBtZXRob2QgKGFyZzEpXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgICBhbiBIVE1MIHN0cmluZyxcbiAgICAgKiBAcmV0dXJucyB7fSAgICAgICAgLSxcbiAgICAgKiBAc2luY2UgMC4wLjRcbiAgICAgKi9cbiAgICBjb25zdCBhcHBlbmQgPSBmdW5jdGlvbihodG1sc3RyaW5nKSB7XG4gICAgICBnZXRFbGVtZW50KCkuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1sc3RyaW5nKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBnZXRFbGVtZW50KCkgPyBnZXRFbGVtZW50KCkuaWQgOiBudWxsLFxuICAgICAgZ2V0RWxlbWVudCxcbiAgICAgIGdldENsYXNzTGlzdCxcbiAgICAgIGFkZENsYXNzLFxuICAgICAgcmVtb3ZlQ2xhc3MsXG4gICAgICB0b2dnbGVDbGFzcyxcbiAgICAgIGh0bWwsXG4gICAgICB0ZXh0LFxuICAgICAgY3NzLFxuICAgICAgZW1wdHksXG4gICAgICBhcHBlbmQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkZWZpbmVkIHdlYiBjb21wb25lbnQuXG4gICAqXG4gICAqIEBtZXRob2QgKClcbiAgICogQHB1YmxpY1xuICAgKiBAcGFyYW0ge30gICAgICAgICAgLSxcbiAgICogQHJldHVybnMge1N0cmluZ30gIHJldHVybnMgdGhlIHdlYiBjb21wb25lbnQsXG4gICAqIEBzaW5jZSAwLjAuMFxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBgPGRpdj4ke3RoaXMuaWR9PC9kaXY+YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgdGhlIHdlYiBjb21wb25lbnQgdG8gY29udmVydCBjaGlsZChzKSB0byBwbGFpbiBIVE1MLlxuICAgKlxuICAgKiBAbWV0aG9kICgpXG4gICAqIEBwdWJsaWNcbiAgICogQHBhcmFtIHt9ICAgICAgICAgIC0sXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9ICByZXR1cm5zIHRoZSB3ZWIgY29tcG9uZW50LFxuICAgKiBAc2luY2UgMC4wLjBcbiAgICovXG4gIGdldCByZW5kZXJlZCgpIHtcbiAgICBsZXQgdDtcbiAgICAvLyBJbml0aWFsaXplczpcbiAgICB0aGlzLmdldEluaXRpYWxTdGF0ZSgpO1xuICAgIC8vIEFkZCBhbiB1bmlxdWUgSUQgdG8gdGhpcyBjb21wb25lbnQ6XG4gICAgLy8gbGV0IHQgPSB0aGlzLnJlbmRlcigpLnJlcGxhY2UoLzxkaXY+LywgYDxkaXYgaWQ9XCIke3RoaXMuaWR9XCI+YCk7XG4gICAgY29uc3QgY28gPSB0aGlzLnJlbmRlcigpO1xuICAgIGlmIChjby5tYXRjaCgvXlxccyo8ZGl2LykpIHtcbiAgICAgIHQgPSBjby5yZXBsYWNlKC9eXFxzKjxkaXYvLCBgPGRpdiBpZD0gXCIke3RoaXMuaWR9XCJgKTtcbiAgICB9IGVsc2UgaWYgKGNvLm1hdGNoKC9eXFxzKjxoZWFkZXIvKSkge1xuICAgICAgdCA9IGNvLnJlcGxhY2UoL15cXHMqPGhlYWRlci8sIGA8aGVhZGVyIGlkPSBcIiR7dGhpcy5pZH1cImApO1xuICAgIH0gZWxzZSBpZiAoY28ubWF0Y2goL15cXHMqPGZvb3Rlci8pKSB7XG4gICAgICB0ID0gY28ucmVwbGFjZSgvXlxccyo8Zm9vdGVyLywgYDxmb290ZXIgaWQ9IFwiJHt0aGlzLmlkfVwiYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHQgPSBjbztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jTGlzdCkge1xuICAgICAgLy8gVGhpcyBjb21wb25lbnQgaW5jbHVkZXMgY29tcG9uZW50cywgcmVuZGVyIHRoZW06XG4gICAgICB0aGlzLmNvbXBvbmVudHMgPSB7fTtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmNMaXN0KTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjID0gbmV3IHRoaXMuY0xpc3Rba2V5c1tpXV0oKTtcbiAgICAgICAgdCA9IHQucmVwbGFjZShrZXlzW2ldLCBjLnJlbmRlcmVkKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRzW2tleXNbaV0ucmVwbGFjZSgvW15hLXpBLXowLTldL2csICcnKV0gPSBjO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZXR1cm4gdGhlIHJlbmRlcmVkIHdlYiBjb21wb25lbnQ6XG4gICAgcmV0dXJuIHQ7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29tcG9uZW50O1xuIiwiLyogZ2xvYmFsIGRvY3VtZW50ICovXG4vKiBlc2xpbnQgaW5kZW50OiBbXCJlcnJvclwiLCAyLCB7IFwiVmFyaWFibGVEZWNsYXJhdG9yXCI6IHsgXCJ2YXJcIjogMSwgXCJsZXRcIjogMSwgXCJjb25zdFwiOiAyIH0gfV0gKi9cbi8qIGVzbGludCBvbmUtdmFyOiAwLCBuby1wYXJhbS1yZWFzc2lnbjogMCwgbWF4LWxlbjogWzEsIDEzMF0sXG4gIG5vLXVudXNlZC1leHByZXNzaW9uczogW1wiZXJyb3JcIiwgeyBcImFsbG93VGVybmFyeVwiOiB0cnVlIH1dLCBuby11bmRlcnNjb3JlLWRhbmdsZTogMCxcbiAgbm8tcHJvdG86IDEsIHByZWZlci1yZXN0LXBhcmFtczogMSAqL1xuXG4vLyAtLSBWZW5kb3IgbW9kdWxlc1xuXG4vLyAtLSBMb2NhbCBtb2R1bGVzXG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4vY29tcG9uZW50JztcblxuLy8gLS0gR2xvYmFsIGNvbnN0YW50cyAoaW4gdGhlIHNjb3BlIG9mIHRoaXMgbW9kdWxlKVxuXG4vLyAtLSBHbG9iYWwgdmFyaWFibGVzIChpbiB0aGUgc2NvcGUgb2YgdGhpcyBtb2R1bGUpXG5cblxuLy8gLS0gUHJpdmF0ZSBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBtYXRjaGluZyBXZWIgQ29tcG9uZW50LlxuICpcbiAqIEBmdW5jdGlvbiAoKVxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSAgICB0aGUgdmlldyBvYmplY3QsXG4gKiBAcGFyYW0ge1N0cmluZ30gICAgdGhlIHRhZyBkZWZpbmluZyBhIFdlYiBDb21wb25lbnRcbiAqIEByZXR1cm5zIHtPYmplY3R9ICB0aGUgcGF0aCBvZiB0aGUgbWF0Y2hpbmcgV2ViIENvbXBvbmVudCxcbiAqL1xuY29uc3QgZXhwbG9yZSA9IGZ1bmN0aW9uKHZpZXcsIHRhZykge1xuICBpZiAodmlldy5jTGlzdCAmJiB2aWV3LmNMaXN0W3RhZ10pIHtcbiAgICByZXR1cm4gdmlldztcbiAgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmlldyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGlmICh2aWV3W2tleXNbaV1dLmNMaXN0KSB7XG4gICAgICBpZiAodmlld1trZXlzW2ldXS5jTGlzdFt0YWddKSB7XG4gICAgICAgIHJldHVybiB2aWV3W2tleXNbaV1dO1xuICAgICAgfVxuICAgICAgaWYgKHZpZXdba2V5c1tpXV0uY29tcG9uZW50cykge1xuICAgICAgICByZXR1cm4gZXhwbG9yZSh2aWV3W2tleXNbaV1dLmNvbXBvbmVudHMsIHRhZyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuXG4vKipcbiAqIENvZGUgcmV1c2VkIGZyb20gQmFiZWxcbiAqL1xuY29uc3QgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikge1xuICAgICAgICBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIHtcbiAgICAgIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICB9XG4gICAgaWYgKHN0YXRpY1Byb3BzKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIH1cbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH07XG59KCkpO1xuXG4vKipcbiAqIENvZGUgcmV1c2VkIGZyb20gQmFiZWxcbiAqL1xuY29uc3QgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gPSBmdW5jdGlvbihzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIGNhbGwgPT09ICdmdW5jdGlvbicpID8gY2FsbCA6IHNlbGY7XG59O1xuXG4vKipcbiAqIENvZGUgcmV1c2VkIGZyb20gQmFiZWxcbiAqL1xuY29uc3QgX2luaGVyaXRzID0gZnVuY3Rpb24oc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAnZnVuY3Rpb24nICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgJHt0eXBlb2Ygc3VwZXJDbGFzc31gKTtcbiAgfVxuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHN1YkNsYXNzLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9IH0pO1xuXG4gIGlmIChzdXBlckNsYXNzKSB7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG4gIH1cbn07XG5cbi8qKlxuICogQ29kZSByZXVzZWQgZnJvbSBCYWJlbFxuICovXG5jb25zdCBfY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbihpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpO1xuICB9XG59O1xuXG4vKipcbiAqIENvZGUgcmV1c2VkIGZyb20gQmFiZWxcbiAqL1xuY29uc3QgX3N1YkNsYXNzID0gZnVuY3Rpb24oU3VwZXJDbGFzcywgbSkge1xuICBmdW5jdGlvbiBTdWJDbGFzcygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3ViQ2xhc3MpO1xuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoU3ViQ2xhc3MuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihTdWJDbGFzcykpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG4gIF9pbmhlcml0cyhTdWJDbGFzcywgU3VwZXJDbGFzcyk7XG5cbiAgX2NyZWF0ZUNsYXNzKFN1YkNsYXNzLCBtKTtcblxuICByZXR1cm4gU3ViQ2xhc3M7XG59O1xuXG4vLyAtLSBQdWJsaWMgTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiogVGhpcyBsaWJyYXJ5IHJlbmRlcnMgdGhlIFZpZXcgaW4gdGhlIERPTS5cbipcbiogQG5hbWVzcGFjZSBWaXp1XG4qL1xuY29uc3QgVml6dSA9IHtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmVyc2lvbiBvZiB0aGlzIGxpYnJhcnkuXG4gICAqXG4gICAqIEBtZXRob2QgKClcbiAgICogQHB1YmxpY1xuICAgKiBAcGFyYW0ge30gICAgICAgICAgLSxcbiAgICogQHJldHVybnMge1N0cmluZ30gIHJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhpcyBsaWJyYXJ5LFxuICAgKi9cbiAgdmVyc2lvbigpIHtcbiAgICByZXR1cm4gJ3t7bGliOnZlcnNpb259fSc7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIFZpZXcgaW4gdGhlIERPTS5cbiAgICpcbiAgICogQG1ldGhvZCAoYXJnMSwgYXJnMiwgYXJnMylcbiAgICogQHB1YmxpY1xuICAgKiBAcGFyYW0ge1N0cmluZ30gICAgdGhlIGFnZ3JlZ2F0ZWQgd2ViIGNvbXBvbmVudHMsXG4gICAqIEBwYXJhbSB7T2JqZWN0fSAgICB0aGUgbGlzdCBvZiB3ZWIgY29tcG9uZW50cyBhbmQgdGhlaXIgcmVmZXJlbmNlLFxuICAgKiBAcGFyYW0ge09iamVjdH0gICAgdGhlIERPTSBlbGVtZW50IHdoZXJlIHRoZSB2aWV3ICh0aGUgYWdncmVnYXRlIG9mIHdlYiBjb21wb25lbnRzKSBpcyBpbnNlcnRlZCxcbiAgICogQHJldHVybnMge09iamVjdH0gIHJldHVybnMgdGhlIHZpZXcgb2JqZWN0LFxuICAgKiBAc2luY2UgMC4wLjBcbiAgICovXG4gIHJlbmRlcih0ZW1wbGF0ZSwgY0xpc3QsIGVsKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChjTGlzdCkgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gT2JqZWN0LmtleXMoY0xpc3QpIDogW11cbiAgICAgICAgLCB2aWV3ID0ge31cbiAgICAgICAgO1xuICAgIGxldCB0O1xuXG4gICAgLy8gUmV0dXJuIG51bGwgaWYgdGhlIHRlbXBsYXRlIGlzIG5vdCBhIHN0cmluZzpcbiAgICBpZiAodHlwZW9mIHRlbXBsYXRlICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gSWYgbm8gY29tcG9uZW50cywgcmVuZGVyIHRoZSB0ZW1wbGF0ZSBhcyBpczpcbiAgICBpZiAoIWNMaXN0KSB7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwuaW5uZXJIVE1MID0gdGVtcGxhdGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBWaXp1LnZkb21cbiAgICAgICAgICA/IChWaXp1LnZkb20ud2luZG93LmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MICs9IHRlbXBsYXRlKVxuICAgICAgICAgIDogKGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MICs9IHRlbXBsYXRlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRoaXMgdmlldyBpbmNsdWRlcyBjb21wb25lbnRzLCByZW5kZXIgdGhlbTpcbiAgICB0ID0gdGVtcGxhdGU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjID0gbmV3IGNMaXN0W2tleXNbaV1dKCk7XG4gICAgICB0ID0gdC5yZXBsYWNlKGtleXNbaV0sIGMucmVuZGVyZWQpO1xuICAgICAgdmlld1trZXlzW2ldLnJlcGxhY2UoL1teYS16QS16MC05XS9nLCAnJyldID0gYztcbiAgICB9XG4gICAgLy8gQXR0YWNoIGNMaXN0OlxuICAgIHZpZXcuY0xpc3QgPSBrZXlzLmxlbmd0aCA+IDAgPyBjTGlzdCA6IG51bGw7XG5cbiAgICAvLyBGaWxsIHRoZSBET006XG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC5pbm5lckhUTUwgPSB0O1xuICAgIH0gZWxzZSB7XG4gICAgICBlbCA9IFZpenUudmRvbSA/IFZpenUudmRvbS53aW5kb3cuZG9jdW1lbnQuYm9keSA6IGRvY3VtZW50LmJvZHk7XG4gICAgICBlbC5pbm5lckhUTUwgPSArdDtcbiAgICB9XG4gICAgLy8gQXR0YWNoIHBhcmVudCBlbGVtZW50OlxuICAgIHZpZXcuZWwgPSBlbDtcblxuICAgIC8vIFJldHVybiB0aGUgcmVuZGVyZWQgb2JqZWN0ICh3aXRoIGEgcmVmZXJlbmNlIHRvIGFsbCB0aGUgd2ViIGNvbXBvbmVudHMpOlxuICAgIHJldHVybiB2aWV3O1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhIGNvbXBvbmVudCB3aXRoIGFub3RoZXIgY29tcG9uZW50IGhhdmluZyB0aGUgc2FtZSB0YWcuXG4gICAqXG4gICAqIEBtZXRob2QgKGFyZzEsIGFyZzIpXG4gICAqIEBwdWJsaWNcbiAgICogQHBhcmFtIHtPYmplY3R9ICAgIHRoZSB2aWV3IG9iamVjdCxcbiAgICogQHBhcmFtIHtPYmplY3R9ICAgIHRoZSBuZXcgY29tcG9uZW50ICh7ICc8QWFhIC8+JzogJ25ldyBjbGFzcycgfSksXG4gICAqIEByZXR1cm5zIHt9ICAgICAgICAtLFxuICAgKiBAc2luY2UgMC4wLjBcbiAgICovXG4gIHJlcGxhY2UodmlldywgY29tcG9uZW50KSB7XG4gICAgbGV0IGlkXG4gICAgICAsIHR5cGVcbiAgICAgIDtcblxuICAgIC8vIENoZWNrIHRoYXQgdmlldyBpcyBhbiBvYmplY3Qgd2l0aCwgYXQgbGVhc3QsIHRoZSBwcm9wZXJ0aWVzIGNMaXN0IGFuZCBlbDpcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZpZXcpICE9PSAnW29iamVjdCBPYmplY3RdJyB8fCAhdmlldy5jTGlzdCB8fCAhdmlldy5lbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHRoYXQgY29tcG9uZW50IGlzIGFuIG9iamVjdDpcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGNvbXBvbmVudCkgIT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyB0aGUgbmV3IGNvbXBvbmVudDpcbiAgICBjb25zdCBuZXdjdGFnID0gT2JqZWN0LmtleXMoY29tcG9uZW50KVswXTtcbiAgICBjb25zdCBuZXdjbmFtZSA9IG5ld2N0YWcucmVwbGFjZSgvW15hLXpBLXowLTldL2csICcnKTtcbiAgICBjb25zdCBuZXdjID0gbmV3IGNvbXBvbmVudFtuZXdjdGFnXSgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgYSBjb21wb25lbnQgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoZSB2aWV3OlxuICAgIGNvbnN0IHBhdGggPSBleHBsb3JlKHZpZXcsIG5ld2N0YWcpO1xuICAgIGlmIChwYXRoKSB7XG4gICAgICAvLyBHZXQgaXRzIGlkIGFuZCByZW1vdmUgaXQ6XG4gICAgICBpZiAocGF0aFtuZXdjbmFtZV0pIHtcbiAgICAgICAgaWQgPSBwYXRoW25ld2NuYW1lXS5pZDtcbiAgICAgICAgcGF0aFtuZXdjbmFtZV0gPSBudWxsO1xuICAgICAgICB0eXBlID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlkID0gcGF0aC5jb21wb25lbnRzW25ld2NuYW1lXS5pZDtcbiAgICAgICAgcGF0aC5jb21wb25lbnRzW25ld2NuYW1lXSA9IG51bGw7XG4gICAgICAgIHR5cGUgPSAyO1xuICAgICAgfVxuICAgICAgcGF0aC5jTGlzdFtuZXdjdGFnXSA9IG51bGw7XG5cbiAgICAgIC8vIEdldCBpdHMgaWQgYW5kIGNsZWFyIGl0OlxuICAgICAgY29uc3Qgd3JhcHBlciA9IFZpenUudmRvbVxuICAgICAgICA/IFZpenUudmRvbS53aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICAgICAgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgY29uc3Qgb2xkTm9kZSA9IFZpenUudmRvbVxuICAgICAgICA/IFZpenUudmRvbS53aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICAgIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuXG4gICAgICB3cmFwcGVyLmlubmVySFRNTCA9IG5ld2MucmVuZGVyZWQ7XG4gICAgICBvbGROb2RlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHdyYXBwZXIuZmlyc3RDaGlsZCwgb2xkTm9kZSk7XG5cbiAgICAgIC8vIEF0dGFjaCB0aGUgbmV3IG5vZGUgdG8gdmlldzpcbiAgICAgIGlmICh0eXBlID09PSAxKSB7XG4gICAgICAgIHBhdGhbbmV3Y25hbWVdID0gbmV3YztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhdGguY29tcG9uZW50c1tuZXdjbmFtZV0gPSBuZXdjO1xuICAgICAgfVxuICAgICAgcGF0aC5jTGlzdFtuZXdjdGFnXSA9IGNvbXBvbmVudFtuZXdjdGFnXTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEV4dGVuZHMgdGhlIGNsYXNzIENvbXBvbmVudC5cbiAgICpcbiAgICogQG1ldGhvZCAoYXJnMSlcbiAgICogQHB1YmxpY1xuICAgKiBAcGFyYW0ge09iamVjdH0gICAgdGhlIG1ldGhvZHMgdG8gYWRkIHRvIENvbXBvbmVudCxcbiAgICogQHJldHVybnMge09iamVjdH0gIHJldHVybnMgdGhlIGV4dGVuZGVkIGNsYXNzIGNvbXBvbmVudCxcbiAgICogQHNpbmNlIDAuMC4zXG4gICAqL1xuICBjcmVhdGVDbGFzcyhtZXRob2RzKSB7XG4gICAgLy8gQ2hlY2sgdGhhdCBtZXRob2RzIGlzIGFuIG9iamVjdDpcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG1ldGhvZHMpICE9PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCBrZXlzOlxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhtZXRob2RzKTtcbiAgICBjb25zdCBvID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvLnB1c2goe1xuICAgICAgICBrZXk6IGtleXNbaV0sXG4gICAgICAgIHZhbHVlOiBtZXRob2RzW2tleXNbaV1dLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9zdWJDbGFzcyhDb21wb25lbnQsIG8pO1xuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgVml6dTtcbiJdfQ=="} \ No newline at end of file +{"version":3,"sources":["node_modules/browser-pack/_prelude.js","index.js","src/component.js","src/vizu.js"],"names":[],"mappings":"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","file":"vizu.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o${this.id}
`;\n }\n\n /**\n * Processes the web component to convert child(s) to plain HTML.\n *\n * @method ()\n * @private\n * @param {} -,\n * @returns {String} returns the web component,\n * @since 0.0.0\n */\n get rendered() {\n let t;\n // Initializes:\n this.getInitialState();\n // Add an unique ID to this component:\n // let t = this.render().replace(/
/, `
`);\n const co = this.render();\n if (co.match(/^\\s*
0 ? cList : null;\n\n // Fill the DOM:\n if (el) {\n el.innerHTML = t;\n } else {\n el = Vizu.vdom ? Vizu.vdom.window.document.body : document.body;\n el.innerHTML = +t;\n }\n\n // Attach event(s)\n // parse all components and for each component execute evented!\n attachEvents(view);\n\n // Attach parent element:\n view.el = el;\n\n // Return the rendered object (with a reference to all the web components):\n return view;\n },\n\n /**\n * Replaces a component with another component having the same tag.\n *\n * @method (arg1, arg2)\n * @public\n * @param {Object} the view object,\n * @param {Object} the new component ({ '': 'new class' }),\n * @returns {} -,\n * @since 0.0.0\n */\n replace(view, component) {\n let id\n , type\n ;\n\n // Check that view is an object with, at least, the properties cList and el:\n if (Object.prototype.toString.call(view) !== '[object Object]' || !view.cList || !view.el) {\n return;\n }\n\n // Check that component is an object:\n if (Object.prototype.toString.call(component) !== '[object Object]') {\n return;\n }\n\n // Process the new component:\n const newctag = Object.keys(component)[0];\n const newcname = newctag.replace(/[^a-zA-z0-9]/g, '');\n const newc = new component[newctag]();\n\n // Check if a component with the same name already exists in the view:\n const path = explore(view, newctag);\n if (path) {\n // Get its id and remove it:\n if (path[newcname]) {\n id = path[newcname].id;\n path[newcname] = null;\n type = 1;\n } else {\n id = path.components[newcname].id;\n path.components[newcname] = null;\n type = 2;\n }\n path.cList[newctag] = null;\n\n // Get its id and clear it:\n const wrapper = Vizu.vdom\n ? Vizu.vdom.window.document.createElement('div')\n : document.createElement('div');\n\n const oldNode = Vizu.vdom\n ? Vizu.vdom.window.document.getElementById(id)\n : document.getElementById(id);\n\n wrapper.innerHTML = newc.rendered;\n oldNode.parentNode.replaceChild(wrapper.firstChild, oldNode);\n\n // Attach the new node to view:\n if (type === 1) {\n path[newcname] = newc;\n } else {\n path.components[newcname] = newc;\n }\n path.cList[newctag] = component[newctag];\n }\n },\n\n /**\n * Extends the class Component.\n *\n * @method (arg1)\n * @public\n * @param {Object} the methods to add to Component,\n * @returns {Object} returns the extended class component,\n * @since 0.0.3\n */\n createClass(methods) {\n // Check that methods is an object:\n if (Object.prototype.toString.call(methods) !== '[object Object]') {\n return null;\n }\n\n // Extract keys:\n const keys = Object.keys(methods);\n const o = [];\n for (let i = 0; i < keys.length; i++) {\n o.push({\n key: keys[i],\n value: methods[keys[i]],\n });\n }\n\n return _subClass(Component, o);\n },\n};\n\nexport default Vizu;\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJpbmRleC5qcyIsInNyYy9jb21wb25lbnQuanMiLCJzcmMvdml6dS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztBQ0FBOzs7O0FBQ0E7Ozs7OztrQkFFZSxFQUFFLDhCQUFGLEVBQWEsb0JBQWIsRTs7Ozs7Ozs7OztxakJDSGY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUNBOzs7Ozs7OztBQUVBOztBQUVBOzs7QUFHQTs7O0FBR0E7O0FBRUE7Ozs7O0lBS00sUztBQUNOOzs7Ozs7O0FBT0UsdUJBQWM7QUFBQTs7QUFDWjtBQUNBLFNBQUssRUFBTCxTQUFjLEtBQUssTUFBTCxHQUFjLFFBQWQsQ0FBdUIsRUFBdkIsRUFBMkIsTUFBM0IsQ0FBa0MsQ0FBbEMsRUFBcUMsQ0FBckMsQ0FBZDtBQUNBLFNBQUssS0FBTCxHQUFhLElBQWI7QUFDQSxTQUFLLFVBQUwsR0FBa0IsSUFBbEI7QUFDQSxTQUFLLEtBQUwsR0FBYSxFQUFiO0FBQ0EsU0FBSyxLQUFMLENBQVcsT0FBWCxHQUFxQixFQUFyQjtBQUNEOztBQUVEOzs7Ozs7Ozs7Ozs7O3NDQVNrQjtBQUNoQjtBQUNBLFdBQUssS0FBTCxHQUFhLEVBQWI7QUFDQSxXQUFLLEtBQUwsQ0FBVyxPQUFYLEdBQXFCLEVBQXJCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7Ozs7c0JBVUUsRSxFQUFJO0FBQ0osVUFBTSxPQUFPLElBQWI7O0FBRUE7Ozs7Ozs7Ozs7QUFVQSxVQUFNLGFBQWEsU0FBYixVQUFhLEdBQVc7QUFDNUIsWUFBSSxFQUFKLEVBQVE7QUFDTjtBQUNBLGlCQUFPLGVBQUssSUFBTCxHQUNILGVBQUssSUFBTCxDQUFVLE1BQVYsQ0FBaUIsUUFBakIsQ0FBMEIsYUFBMUIsT0FBNEMsS0FBSyxFQUFqRCxFQUF1RCxhQUF2RCxDQUFxRSxFQUFyRTtBQUNGO0FBRkssWUFHSCxTQUFTLGFBQVQsT0FBMkIsS0FBSyxFQUFo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S2UsSSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJpbXBvcnQgQ29tcG9uZW50IGZyb20gJy4vc3JjL2NvbXBvbmVudCc7XG5pbXBvcnQgVml6dSBmcm9tICcuL3NyYy92aXp1JztcblxuZXhwb3J0IGRlZmF1bHQgeyBDb21wb25lbnQsIFZpenUgfTtcbiIsIi8qIGdsb2JhbCBkb2N1bWVudCAqL1xuLyogZXNsaW50IGluZGVudDogW1wiZXJyb3JcIiwgMiwgeyBcIlZhcmlhYmxlRGVjbGFyYXRvclwiOiB7IFwidmFyXCI6IDEsIFwibGV0XCI6IDEsIFwiY29uc3RcIjogMiB9IH1dICovXG4vKiBlc2xpbnQgb25lLXZhcjogMCAqL1xuLy8gLS0gVmVuZG9yIG1vZHVsZXNcblxuLy8gLS0gTG9jYWwgbW9kdWxlc1xuaW1wb3J0IFZpenUgZnJvbSAnLi92aXp1JztcblxuLy8gLS0gR2xvYmFsIGNvbnN0YW50cyAoaW4gdGhlIHNjb3BlIG9mIHRoaXMgbW9kdWxlKVxuXG4vLyAtLSBHbG9iYWwgdmFyaWFibGVzIChpbiB0aGUgc2NvcGUgb2YgdGhpcyBtb2R1bGUpXG5cblxuLy8gLS0gUHJpdmF0ZSBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyAtLSBQdWJsaWMgTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiogVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSB3ZWIgY29tcG9uZW50LlxuKlxuKiBAbmFtZXNwYWNlIHZpenVcbiovXG5jbGFzcyBDb21wb25lbnQge1xuLyoqXG4gKiBDcmVhdGVzIGFuIHVuaXF1ZSBJRCBmb3IgdGhpcyBjb21wb25lbnQuXG4gKlxuICogQGNvbnN0cnVjdG9yICgpXG4gKiBAcHVibGljXG4gKiBAcGFyYW0ge30gICAgICAgICAgLSxcbiAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBDcmVhdGUgYW4gdW5pcXVlIGlkIGZvciB0aGlzIGNvbXBvbmVudDpcbiAgICB0aGlzLmlkID0gYGkke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA3KX1gO1xuICAgIHRoaXMuY0xpc3QgPSBudWxsO1xuICAgIHRoaXMuY29tcG9uZW50cyA9IG51bGw7XG4gICAgdGhpcy5wcm9wcyA9IHt9O1xuICAgIHRoaXMucHJvcHMub3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpc2VzIHRoZSB2YXJpYWJsZXMgd2hlbiB0aGUgY29tcG9uZW50IGlzIHJlbmRlcmVkLlxuICAgKlxuICAgKiBAbWV0aG9kICgpXG4gICAqIEBwdWJsaWNcbiAgICogQHBhcmFtIHt9ICAgICAgICAtLFxuICAgKiBAcmV0dXJucyB7fSAgICAgIC0sXG4gICAqIEBzaW5jZSAwLjAuMFxuICAgKi9cbiAgZ2V0SW5pdGlhbFN0YXRlKCkge1xuICAgIC8vIFRvIGF2b2lkIGVzbGludCBlcnJvciFcbiAgICB0aGlzLnByb3BzID0ge307XG4gICAgdGhpcy5wcm9wcy5vcHRpb25zID0ge307XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgQ1NTIHNlbGVjdG9yKHMpLlxuICAgKlxuICAgKiBAbWV0aG9kIChhcmcxKVxuICAgKiBAcHVibGljXG4gICAqIEBwYXJhbSB7U3RyaW5nfSAgICB0aGUgQ1NTIHNlbGVjdG9yKHMpLFxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSAgcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IG1hdGNoZXMgYSBzcGVjaWZpZWRcbiAgICogICAgICAgICAgICAgICAgICAgIENTUyBzZWxlY3RvcihzKSxcbiAgICogQHNpbmNlIDAuMC4wXG4gICAqL1xuICAkKGVsKSB7XG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBDU1Mgc2VsZWN0b3IocykuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIChhcmcxKVxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gICAgdGhlIENTUyBzZWxlY3RvcihzKSxcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSAgcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IG1hdGNoZXMgYSBzcGVjaWZpZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgQ1NTIHNlbGVjdG9yKHMpLFxuICAgICAqIEBzaW5jZSAwLjAuMFxuICAgICAqL1xuICAgIGNvbnN0IGdldEVsZW1lbnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChlbCkge1xuICAgICAgICAvLyBSZXR1cm5zIHRoZSB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yKHMpOlxuICAgICAgICByZXR1cm4gVml6dS52ZG9tXG4gICAgICAgICAgPyBWaXp1LnZkb20ud2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3RoYXQuaWR9YCkucXVlcnlTZWxlY3RvcihlbClcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgIDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7dGhhdC5pZH1gKS5xdWVyeVNlbGVjdG9yKGVsKTtcbiAgICAgIH1cbiAgICAgIC8vIFJldHVybiB0aGUgZW50aXJlICd3ZWIgY29tcG9uZW50JzpcbiAgICAgIHJldHVybiBWaXp1LnZkb21cbiAgICAgICAgPyBWaXp1LnZkb20ud2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3RoYXQuaWR9YClcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHt0aGF0LmlkfWApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBET01Ub2tlbkxpc3QgY29sbGVjdGlvbiBvZiB0aGUgY2xhc3MgYXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBtZXRob2QgKClcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtIHt9ICAgICAgICAgIC0sXG4gICAgICogQHJldHVybnMge09iamVjdH0gIHJldHVybnMgdGhlIERPTVRva2VuTGlzdCBvZiB0aGUgZWxlbWVudCxcbiAgICAgKiBAc2luY2UgMC4wLjBcbiAgICAgKi9cbiAgICBjb25zdCBnZXRDbGFzc0xpc3QgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBnZXRFbGVtZW50KCkuY2xhc3NMaXN0O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY2xhc3MgbmFtZSB0byB0aGUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBtZXRob2QgKGFyZzEpXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgICB0aGUgY2xhc3MgbmFtZSB0byBhZGQsXG4gICAgICogQHJldHVybnMge30gICAgICAgIC0sXG4gICAgICogQHNpbmNlIDAuMC4wXG4gICAgICovXG4gICAgY29uc3QgYWRkQ2xhc3MgPSBmdW5jdGlvbihjbGFzc05hbWUpIHtcbiAgICAgIGdldEVsZW1lbnQoKS5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBjbGFzcyBuYW1lIHRvIHRoZSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQG1ldGhvZCAoYXJnMSlcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtIHtTdHJpbmd9ICAgIHRoZSBjbGFzcyBuYW1lIHRvIHJlbW92ZSxcbiAgICAgKiBAcmV0dXJucyB7fSAgICAgICAgLSxcbiAgICAgKiBAc2luY2UgMC4wLjBcbiAgICAgKi9cbiAgICBjb25zdCByZW1vdmVDbGFzcyA9IGZ1bmN0aW9uKGNsYXNzTmFtZSkge1xuICAgICAgZ2V0RWxlbWVudCgpLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyBhIGNsYXNzIG5hbWUgZm9yIHRoZSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQG1ldGhvZCAoYXJnMSlcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtIHtTdHJpbmd9ICAgIHRoZSBjbGFzcyBuYW1lIHRvIGFkZC9yZW1vdmUsXG4gICAgICogQHJldHVybnMge30gICAgICAgIC0sXG4gICAgICogQHNpbmNlIDAuMC4wXG4gICAgICovXG4gICAgY29uc3QgdG9nZ2xlQ2xhc3MgPSBmdW5jdGlvbihjbGFzc05hbWUpIHtcbiAgICAgIGdldEVsZW1lbnQoKS5jbGFzc0xpc3QudG9nZ2xlKGNsYXNzTmFtZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgSFRNTCBjb250ZW50cyBvZiB0aGUgZWxlbWVudCxcbiAgICAgKlxuICAgICAqIEBtZXRob2QgKGFyZzEpXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgICB0aGUgaHRtbCBjb250ZW50cyB0byBhZGQsXG4gICAgICogQHJldHVybnMge30gICAgICAgIC0sXG4gICAgICogQHNpbmNlIDAuMC4wXG4gICAgICovXG4gICAgY29uc3QgaHRtbCA9IGZ1bmN0aW9uKGh0bWxzdHJpbmcpIHtcbiAgICAgIGlmIChodG1sc3RyaW5nKSB7XG4gICAgICAgIGdldEVsZW1lbnQoKS5pbm5lckhUTUwgPSBodG1sc3RyaW5nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKS5pbm5lckhUTUw7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgdGV4dCBjb250ZW50cyBvZiB0aGUgZWxlbWVudCxcbiAgICAgKlxuICAgICAqIEBtZXRob2QgKGFyZzEpXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgICB0aGUgdGV4dCBjb250ZW50cyB0byBhZGQsXG4gICAgICogQHJldHVybnMge30gICAgICAgIC0sXG4gICAgICogQHNpbmNlIDAuMC4wXG4gICAgICovXG4gICAgY29uc3QgdGV4dCA9IGZ1bmN0aW9uKHRleHRlKSB7XG4gICAgICBpZiAodGV4dGUpIHtcbiAgICAgICAgZ2V0RWxlbWVudCgpLnRleHRDb250ZW50ID0gdGV4dGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2V0RWxlbWVudCgpLnRleHRDb250ZW50O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHN0eWxlIGF0dHJpYnV0ZSBvZiB0aGUgZWxlbWVudCxcbiAgICAgKlxuICAgICAqIEBtZXRob2QgKGFyZzEsIGFyZzIpXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgICB0aGUgc3R5bGUgYXR0cmlidXRlLFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgICB0aGUgc3R5bGUgYXR0cmlidXRlIHZhbHVlLFxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9ICB1bmRlZmluZWQgb3IgdGhlIHN0eWxlIGF0dHJpYnV0ZSB2YWx1ZSxcbiAgICAgKiBAc2luY2UgMC4wLjNcbiAgICAgKi9cbiAgICBjb25zdCBjc3MgPSBmdW5jdGlvbihzdHlsZUF0dHIsIHZhbHVlKSB7XG4gICAgICBjb25zdCBhcnIgPSB0eXBlb2Ygc3R5bGVBdHRyID09PSAnc3RyaW5nJyA/IHN0eWxlQXR0ci5zcGxpdCgnLScpIDogW107XG4gICAgICBsZXQgYXR0ciA9ICcnO1xuXG4gICAgICAvLyBDb252ZXJ0IHN0eWxlIGF0dHJpYnV0ZSBuYW1lIHdpdGggJy0nIChleC46ICdmb250LXNpemUnIHRvICdmb250U2l6ZScpOlxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICBhdHRyICs9IGFycltpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhdHRyICs9IGFycltpXS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGFycltpXS5zbGljZSgxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIC8vIEdldCBhdHRyaWJ1dGU6XG4gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCkuc3R5bGVbYXR0cl07XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBhdHRyaWJ1dGU6XG4gICAgICBnZXRFbGVtZW50KCkuc3R5bGVbYXR0cl0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIHRoZSBjaGlsZHMgb2YgdGhlIGN1cnJlbnQgbm9kZS5cbiAgICAgKlxuICAgICAqIEBtZXRob2QgKClcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtIHt9ICAgICAgICAgIC0sXG4gICAgICogQHJldHVybnMge30gICAgICAgIC0sXG4gICAgICogQHNpbmNlIDAuMC40XG4gICAgICovXG4gICAgY29uc3QgZW1wdHkgPSBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBnZXRFbGVtZW50KCk7XG4gICAgICB3aGlsZSAobm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQobm9kZS5maXJzdENoaWxkKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBhbiBIVE1MIHN0cmluZyBhZnRlciB0aGUgbGFzdCBjaGlsZCBvZiB0aGUgY3VycmVudCBub2RlLlxuICAgICAqXG4gICAgICogQG1ldGhvZCAoYXJnMSlcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtIHtTdHJpbmd9ICAgIGFuIEhUTUwgc3RyaW5nLFxuICAgICAqIEByZXR1cm5zIHt9ICAgICAgICAtLFxuICAgICAqIEBzaW5jZSAwLjAuNFxuICAgICAqL1xuICAgIGNvbnN0IGFwcGVuZCA9IGZ1bmN0aW9uKGh0bWxzdHJpbmcpIHtcbiAgICAgIGdldEVsZW1lbnQoKS5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGh0bWxzdHJpbmcpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBjdXJyZW50IG5vZGUuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIChhcmcxLCBhcmcyKVxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gICAgdGhlIERPTSBldmVudCBzdHJpbmcsXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gIHRoZSBsaXN0bmVyIGZ1bmN0aW9uLFxuICAgICAqIEByZXR1cm5zIHt9ICAgICAgICAtLFxuICAgICAqIEBzaW5jZSAwLjAuNVxuICAgICAqL1xuICAgIGNvbnN0IG9uID0gZnVuY3Rpb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICBnZXRFbGVtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIGN1cnJlbnQgbm9kZS5cbiAgICAgKlxuICAgICAqIEBtZXRob2QgKGFyZzEsIGFyZzIpXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgICB0aGUgRE9NIGV2ZW50IHN0cmluZyxcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSAgdGhlIGxpc3RuZXIgZnVuY3Rpb24sXG4gICAgICogQHJldHVybnMge30gICAgICAgIC0sXG4gICAgICogQHNpbmNlIDAuMC41XG4gICAgICovXG4gICAgY29uc3Qgb2ZmID0gZnVuY3Rpb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICBnZXRFbGVtZW50KCkucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGdldEVsZW1lbnQoKSA/IGdldEVsZW1lbnQoKS5pZCA6IG51bGwsXG4gICAgICBnZXRFbGVtZW50LFxuICAgICAgZ2V0Q2xhc3NMaXN0LFxuICAgICAgYWRkQ2xhc3MsXG4gICAgICByZW1vdmVDbGFzcyxcbiAgICAgIHRvZ2dsZUNsYXNzLFxuICAgICAgaHRtbCxcbiAgICAgIHRleHQsXG4gICAgICBjc3MsXG4gICAgICBlbXB0eSxcbiAgICAgIGFwcGVuZCxcbiAgICAgIG9uLFxuICAgICAgb2ZmLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoZXMgZXZlbnQocykgdG8gdGhlIGdpdmVuIG5vZGUuXG4gICAqXG4gICAqIEBtZXRob2QgKGFyZzEsIGFyZzIpXG4gICAqIEBwdWJsaWNcbiAgICogQHBhcmFtIHtTdHJpbmd9ICAgIHRoZSBET00gZXZlbnQgbmFtZSxcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gIHRoZSBldmVudCBsaXN0ZW5lcixcbiAgICogQHJldHVybnMge0Z1bnRpb259IHJldHVybnMgdGhpcyxcbiAgICogQHNpbmNlIDAuMC41XG4gICAqL1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBldmVudHMoKSB7XG4gICAgLy8gSnVzdCB0byBhdm9pZCBlc2xpbnQgZXJyb3IhXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGVmaW5lZCB3ZWIgY29tcG9uZW50LlxuICAgKlxuICAgKiBAbWV0aG9kICgpXG4gICAqIEBwdWJsaWNcbiAgICogQHBhcmFtIHt9ICAgICAgICAgIC0sXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9ICByZXR1cm5zIHRoZSB3ZWIgY29tcG9uZW50LFxuICAgKiBAc2luY2UgMC4wLjBcbiAgICovXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gYDxkaXY+JHt0aGlzLmlkfTwvZGl2PmA7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2Vzc2VzIHRoZSB3ZWIgY29tcG9uZW50IHRvIGNvbnZlcnQgY2hpbGQocykgdG8gcGxhaW4gSFRNTC5cbiAgICpcbiAgICogQG1ldGhvZCAoKVxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge30gICAgICAgICAgLSxcbiAgICogQHJldHVybnMge1N0cmluZ30gIHJldHVybnMgdGhlIHdlYiBjb21wb25lbnQsXG4gICAqIEBzaW5jZSAwLjAuMFxuICAgKi9cbiAgZ2V0IHJlbmRlcmVkKCkge1xuICAgIGxldCB0O1xuICAgIC8vIEluaXRpYWxpemVzOlxuICAgIHRoaXMuZ2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgLy8gQWRkIGFuIHVuaXF1ZSBJRCB0byB0aGlzIGNvbXBvbmVudDpcbiAgICAvLyBsZXQgdCA9IHRoaXMucmVuZGVyKCkucmVwbGFjZSgvPGRpdj4vLCBgPGRpdiBpZD1cIiR7dGhpcy5pZH1cIj5gKTtcbiAgICBjb25zdCBjbyA9IHRoaXMucmVuZGVyKCk7XG4gICAgaWYgKGNvLm1hdGNoKC9eXFxzKjxkaXYvKSkge1xuICAgICAgdCA9IGNvLnJlcGxhY2UoL15cXHMqPGRpdi8sIGA8ZGl2IGlkPSBcIiR7dGhpcy5pZH1cImApO1xuICAgIH0gZWxzZSBpZiAoY28ubWF0Y2goL15cXHMqPGhlYWRlci8pKSB7XG4gICAgICB0ID0gY28ucmVwbGFjZSgvXlxccyo8aGVhZGVyLywgYDxoZWFkZXIgaWQ9IFwiJHt0aGlzLmlkfVwiYCk7XG4gICAgfSBlbHNlIGlmIChjby5tYXRjaCgvXlxccyo8Zm9vdGVyLykpIHtcbiAgICAgIHQgPSBjby5yZXBsYWNlKC9eXFxzKjxmb290ZXIvLCBgPGZvb3RlciBpZD0gXCIke3RoaXMuaWR9XCJgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdCA9IGNvO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNMaXN0KSB7XG4gICAgICAvLyBUaGlzIGNvbXBvbmVudCBpbmNsdWRlcyBjb21wb25lbnRzLCByZW5kZXIgdGhlbTpcbiAgICAgIHRoaXMuY29tcG9uZW50cyA9IHt9O1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuY0xpc3QpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGMgPSBuZXcgdGhpcy5jTGlzdFtrZXlzW2ldXSgpO1xuICAgICAgICB0ID0gdC5yZXBsYWNlKGtleXNbaV0sIGMucmVuZGVyZWQpO1xuICAgICAgICB0aGlzLmNvbXBvbmVudHNba2V5c1tpXS5yZXBsYWNlKC9bXmEtekEtejAtOV0vZywgJycpXSA9IGM7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFJldHVybiB0aGUgcmVuZGVyZWQgd2ViIGNvbXBvbmVudDpcbiAgICByZXR1cm4gdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgdGhlIHdlYiBjb21wb25lbnQgZXZlbnRzLlxuICAgKlxuICAgKiBAbWV0aG9kICgpXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7fSAgICAgICAgICAtLFxuICAgKiBAcmV0dXJucyB7fSAgICAgICAgLSxcbiAgICogQHNpbmNlIDAuMC41XG4gICAqL1xuICBnZXQgZXZlbnRlZCgpIHtcbiAgICB0aGlzLmV2ZW50cygpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbXBvbmVudDtcbiIsIi8qIGdsb2JhbCBkb2N1bWVudCAqL1xuLyogZXNsaW50IGluZGVudDogW1wiZXJyb3JcIiwgMiwgeyBcIlZhcmlhYmxlRGVjbGFyYXRvclwiOiB7IFwidmFyXCI6IDEsIFwibGV0XCI6IDEsIFwiY29uc3RcIjogMiB9IH1dICovXG4vKiBlc2xpbnQgb25lLXZhcjogMCwgbm8tcGFyYW0tcmVhc3NpZ246IDAsIG1heC1sZW46IFsxLCAxMzBdLFxuICBuby11bnVzZWQtZXhwcmVzc2lvbnM6IFtcImVycm9yXCIsIHsgXCJhbGxvd1Rlcm5hcnlcIjogdHJ1ZSB9XSwgbm8tdW5kZXJzY29yZS1kYW5nbGU6IDAsXG4gIG5vLXByb3RvOiAxLCBwcmVmZXItcmVzdC1wYXJhbXM6IDEgKi9cblxuLy8gLS0gVmVuZG9yIG1vZHVsZXNcblxuLy8gLS0gTG9jYWwgbW9kdWxlc1xuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuL2NvbXBvbmVudCc7XG5cbi8vIC0tIEdsb2JhbCBjb25zdGFudHMgKGluIHRoZSBzY29wZSBvZiB0aGlzIG1vZHVsZSlcblxuLy8gLS0gR2xvYmFsIHZhcmlhYmxlcyAoaW4gdGhlIHNjb3BlIG9mIHRoaXMgbW9kdWxlKVxuXG5cbi8vIC0tIFByaXZhdGUgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgbWF0Y2hpbmcgV2ViIENvbXBvbmVudC5cbiAqXG4gKiBAZnVuY3Rpb24gKClcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gICAgdGhlIHZpZXcgb2JqZWN0LFxuICogQHBhcmFtIHtTdHJpbmd9ICAgIHRoZSB0YWcgZGVmaW5pbmcgYSBXZWIgQ29tcG9uZW50XG4gKiBAcmV0dXJucyB7T2JqZWN0fSAgdGhlIHBhdGggb2YgdGhlIG1hdGNoaW5nIFdlYiBDb21wb25lbnQsXG4gKi9cbmNvbnN0IGV4cGxvcmUgPSBmdW5jdGlvbih2aWV3LCB0YWcpIHtcbiAgaWYgKHZpZXcuY0xpc3QgJiYgdmlldy5jTGlzdFt0YWddKSB7XG4gICAgcmV0dXJuIHZpZXc7XG4gIH1cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZpZXcpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAodmlld1trZXlzW2ldXS5jTGlzdCkge1xuICAgICAgaWYgKHZpZXdba2V5c1tpXV0uY0xpc3RbdGFnXSkge1xuICAgICAgICByZXR1cm4gdmlld1trZXlzW2ldXTtcbiAgICAgIH1cbiAgICAgIGlmICh2aWV3W2tleXNbaV1dLmNvbXBvbmVudHMpIHtcbiAgICAgICAgcmV0dXJuIGV4cGxvcmUodmlld1trZXlzW2ldXS5jb21wb25lbnRzLCB0YWcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogQXR0YWNoZXMgZXZlbnRzIHRvIHRoZSByZW5kZXJlZCBjb21wb25lbnRzLlxuICpcbiAqIEBmdW5jdGlvbiAoYXJnMSlcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gICAgdGhlIHZpZXcgb2JqZWN0LFxuICogQHJldHVybnMge30gICAgICAgIC0sXG4gKi9cbmNvbnN0IGF0dGFjaEV2ZW50cyA9IGZ1bmN0aW9uKHZpZXcpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gIGlmICh2aWV3LmNMaXN0KSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZpZXcuY0xpc3QpO1xuICAgIGxldCBmbjtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF2aWV3LmNvbXBvbmVudHMpIHtcbiAgICAgICAgLy8gRXh0cmFjdCBjb21wb25lbnRzIGF0IHRoZSBmaXJzdCBsZXZlbDpcbiAgICAgICAgZm4gPSB2aWV3W2tleXNbaV0ucmVwbGFjZSgvW15hLXpBLXowLTldL2csICcnKV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBFeHRyYWN0IGNvbXBvbmVudHMgYXQgbGV2ZWxzIG4gKyAxOlxuICAgICAgICBmbiA9IHZpZXcuY29tcG9uZW50c1trZXlzW2ldLnJlcGxhY2UoL1teYS16QS16MC05XS9nLCAnJyldO1xuICAgICAgfVxuICAgICAgLy8gUnVuIENvbXBvbmVudCBldmVudHMgZnVuY3Rpb246XG4gICAgICBmbi5ldmVudGVkO1xuICAgICAgLy8gUHJvY2VzcyBzdWIgY29tcG9uZW50cyByZWN1cnNpdmVseTpcbiAgICAgIGF0dGFjaEV2ZW50cyhmbik7XG4gICAgfVxuICB9XG59OyAvKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuXG4vKipcbiAqIENvZGUgcmV1c2VkIGZyb20gQmFiZWxcbiAqL1xuY29uc3QgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikge1xuICAgICAgICBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIHtcbiAgICAgIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICB9XG4gICAgaWYgKHN0YXRpY1Byb3BzKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIH1cbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH07XG59KCkpO1xuXG4vKipcbiAqIENvZGUgcmV1c2VkIGZyb20gQmFiZWxcbiAqL1xuY29uc3QgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gPSBmdW5jdGlvbihzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIGNhbGwgPT09ICdmdW5jdGlvbicpID8gY2FsbCA6IHNlbGY7XG59O1xuXG4vKipcbiAqIENvZGUgcmV1c2VkIGZyb20gQmFiZWxcbiAqL1xuY29uc3QgX2luaGVyaXRzID0gZnVuY3Rpb24oc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAnZnVuY3Rpb24nICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgJHt0eXBlb2Ygc3VwZXJDbGFzc31gKTtcbiAgfVxuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHN1YkNsYXNzLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9IH0pO1xuXG4gIGlmIChzdXBlckNsYXNzKSB7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG4gIH1cbn07XG5cbi8qKlxuICogQ29kZSByZXVzZWQgZnJvbSBCYWJlbFxuICovXG5jb25zdCBfY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbihpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpO1xuICB9XG59O1xuXG4vKipcbiAqIENvZGUgcmV1c2VkIGZyb20gQmFiZWxcbiAqL1xuY29uc3QgX3N1YkNsYXNzID0gZnVuY3Rpb24oU3VwZXJDbGFzcywgbSkge1xuICBmdW5jdGlvbiBTdWJDbGFzcygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3ViQ2xhc3MpO1xuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoU3ViQ2xhc3MuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihTdWJDbGFzcykpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG4gIF9pbmhlcml0cyhTdWJDbGFzcywgU3VwZXJDbGFzcyk7XG5cbiAgX2NyZWF0ZUNsYXNzKFN1YkNsYXNzLCBtKTtcblxuICByZXR1cm4gU3ViQ2xhc3M7XG59O1xuXG4vLyAtLSBQdWJsaWMgTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiogVGhpcyBsaWJyYXJ5IHJlbmRlcnMgdGhlIFZpZXcgaW4gdGhlIERPTS5cbipcbiogQG5hbWVzcGFjZSBWaXp1XG4qL1xuY29uc3QgVml6dSA9IHtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmVyc2lvbiBvZiB0aGlzIGxpYnJhcnkuXG4gICAqXG4gICAqIEBtZXRob2QgKClcbiAgICogQHB1YmxpY1xuICAgKiBAcGFyYW0ge30gICAgICAgICAgLSxcbiAgICogQHJldHVybnMge1N0cmluZ30gIHJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhpcyBsaWJyYXJ5LFxuICAgKi9cbiAgdmVyc2lvbigpIHtcbiAgICByZXR1cm4gJ3t7bGliOnZlcnNpb259fSc7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIFZpZXcgaW4gdGhlIERPTS5cbiAgICpcbiAgICogQG1ldGhvZCAoYXJnMSwgYXJnMiwgYXJnMylcbiAgICogQHB1YmxpY1xuICAgKiBAcGFyYW0ge1N0cmluZ30gICAgdGhlIGFnZ3JlZ2F0ZWQgd2ViIGNvbXBvbmVudHMsXG4gICAqIEBwYXJhbSB7T2JqZWN0fSAgICB0aGUgbGlzdCBvZiB3ZWIgY29tcG9uZW50cyBhbmQgdGhlaXIgcmVmZXJlbmNlLFxuICAgKiBAcGFyYW0ge09iamVjdH0gICAgdGhlIERPTSBlbGVtZW50IHdoZXJlIHRoZSB2aWV3ICh0aGUgYWdncmVnYXRlIG9mIHdlYiBjb21wb25lbnRzKSBpcyBpbnNlcnRlZCxcbiAgICogQHJldHVybnMge09iamVjdH0gIHJldHVybnMgdGhlIHZpZXcgb2JqZWN0LFxuICAgKiBAc2luY2UgMC4wLjBcbiAgICovXG4gIHJlbmRlcih0ZW1wbGF0ZSwgY0xpc3QsIGVsKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChjTGlzdCkgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gT2JqZWN0LmtleXMoY0xpc3QpIDogW11cbiAgICAgICAgLCB2aWV3ID0ge31cbiAgICAgICAgO1xuICAgIGxldCB0O1xuXG4gICAgLy8gUmV0dXJuIG51bGwgaWYgdGhlIHRlbXBsYXRlIGlzIG5vdCBhIHN0cmluZzpcbiAgICBpZiAodHlwZW9mIHRlbXBsYXRlICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gSWYgbm8gY29tcG9uZW50cywgcmVuZGVyIHRoZSB0ZW1wbGF0ZSBhcyBpczpcbiAgICBpZiAoIWNMaXN0KSB7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwuaW5uZXJIVE1MID0gdGVtcGxhdGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBWaXp1LnZkb21cbiAgICAgICAgICA/IChWaXp1LnZkb20ud2luZG93LmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MICs9IHRlbXBsYXRlKVxuICAgICAgICAgIDogKGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MICs9IHRlbXBsYXRlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRoaXMgdmlldyBpbmNsdWRlcyBjb21wb25lbnRzLCByZW5kZXIgdGhlbTpcbiAgICB0ID0gdGVtcGxhdGU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjID0gbmV3IGNMaXN0W2tleXNbaV1dKCk7XG4gICAgICB0ID0gdC5yZXBsYWNlKGtleXNbaV0sIGMucmVuZGVyZWQpO1xuICAgICAgdmlld1trZXlzW2ldLnJlcGxhY2UoL1teYS16QS16MC05XS9nLCAnJyldID0gYztcbiAgICB9XG4gICAgLy8gQXR0YWNoIGNMaXN0OlxuICAgIHZpZXcuY0xpc3QgPSBrZXlzLmxlbmd0aCA+IDAgPyBjTGlzdCA6IG51bGw7XG5cbiAgICAvLyBGaWxsIHRoZSBET006XG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC5pbm5lckhUTUwgPSB0O1xuICAgIH0gZWxzZSB7XG4gICAgICBlbCA9IFZpenUudmRvbSA/IFZpenUudmRvbS53aW5kb3cuZG9jdW1lbnQuYm9keSA6IGRvY3VtZW50LmJvZHk7XG4gICAgICBlbC5pbm5lckhUTUwgPSArdDtcbiAgICB9XG5cbiAgICAvLyBBdHRhY2ggZXZlbnQocylcbiAgICAvLyBwYXJzZSBhbGwgY29tcG9uZW50cyBhbmQgZm9yIGVhY2ggY29tcG9uZW50IGV4ZWN1dGUgZXZlbnRlZCFcbiAgICBhdHRhY2hFdmVudHModmlldyk7XG5cbiAgICAvLyBBdHRhY2ggcGFyZW50IGVsZW1lbnQ6XG4gICAgdmlldy5lbCA9IGVsO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByZW5kZXJlZCBvYmplY3QgKHdpdGggYSByZWZlcmVuY2UgdG8gYWxsIHRoZSB3ZWIgY29tcG9uZW50cyk6XG4gICAgcmV0dXJuIHZpZXc7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGEgY29tcG9uZW50IHdpdGggYW5vdGhlciBjb21wb25lbnQgaGF2aW5nIHRoZSBzYW1lIHRhZy5cbiAgICpcbiAgICogQG1ldGhvZCAoYXJnMSwgYXJnMilcbiAgICogQHB1YmxpY1xuICAgKiBAcGFyYW0ge09iamVjdH0gICAgdGhlIHZpZXcgb2JqZWN0LFxuICAgKiBAcGFyYW0ge09iamVjdH0gICAgdGhlIG5ldyBjb21wb25lbnQgKHsgJzxBYWEgLz4nOiAnbmV3IGNsYXNzJyB9KSxcbiAgICogQHJldHVybnMge30gICAgICAgIC0sXG4gICAqIEBzaW5jZSAwLjAuMFxuICAgKi9cbiAgcmVwbGFjZSh2aWV3LCBjb21wb25lbnQpIHtcbiAgICBsZXQgaWRcbiAgICAgICwgdHlwZVxuICAgICAgO1xuXG4gICAgLy8gQ2hlY2sgdGhhdCB2aWV3IGlzIGFuIG9iamVjdCB3aXRoLCBhdCBsZWFzdCwgdGhlIHByb3BlcnRpZXMgY0xpc3QgYW5kIGVsOlxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmlldykgIT09ICdbb2JqZWN0IE9iamVjdF0nIHx8ICF2aWV3LmNMaXN0IHx8ICF2aWV3LmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgdGhhdCBjb21wb25lbnQgaXMgYW4gb2JqZWN0OlxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoY29tcG9uZW50KSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIHRoZSBuZXcgY29tcG9uZW50OlxuICAgIGNvbnN0IG5ld2N0YWcgPSBPYmplY3Qua2V5cyhjb21wb25lbnQpWzBdO1xuICAgIGNvbnN0IG5ld2NuYW1lID0gbmV3Y3RhZy5yZXBsYWNlKC9bXmEtekEtejAtOV0vZywgJycpO1xuICAgIGNvbnN0IG5ld2MgPSBuZXcgY29tcG9uZW50W25ld2N0YWddKCk7XG5cbiAgICAvLyBDaGVjayBpZiBhIGNvbXBvbmVudCB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHZpZXc6XG4gICAgY29uc3QgcGF0aCA9IGV4cGxvcmUodmlldywgbmV3Y3RhZyk7XG4gICAgaWYgKHBhdGgpIHtcbiAgICAgIC8vIEdldCBpdHMgaWQgYW5kIHJlbW92ZSBpdDpcbiAgICAgIGlmIChwYXRoW25ld2NuYW1lXSkge1xuICAgICAgICBpZCA9IHBhdGhbbmV3Y25hbWVdLmlkO1xuICAgICAgICBwYXRoW25ld2NuYW1lXSA9IG51bGw7XG4gICAgICAgIHR5cGUgPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWQgPSBwYXRoLmNvbXBvbmVudHNbbmV3Y25hbWVdLmlkO1xuICAgICAgICBwYXRoLmNvbXBvbmVudHNbbmV3Y25hbWVdID0gbnVsbDtcbiAgICAgICAgdHlwZSA9IDI7XG4gICAgICB9XG4gICAgICBwYXRoLmNMaXN0W25ld2N0YWddID0gbnVsbDtcblxuICAgICAgLy8gR2V0IGl0cyBpZCBhbmQgY2xlYXIgaXQ6XG4gICAgICBjb25zdCB3cmFwcGVyID0gVml6dS52ZG9tXG4gICAgICAgID8gVml6dS52ZG9tLndpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgICAgICA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICBjb25zdCBvbGROb2RlID0gVml6dS52ZG9tXG4gICAgICAgID8gVml6dS52ZG9tLndpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgICAgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG5cbiAgICAgIHdyYXBwZXIuaW5uZXJIVE1MID0gbmV3Yy5yZW5kZXJlZDtcbiAgICAgIG9sZE5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQod3JhcHBlci5maXJzdENoaWxkLCBvbGROb2RlKTtcblxuICAgICAgLy8gQXR0YWNoIHRoZSBuZXcgbm9kZSB0byB2aWV3OlxuICAgICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgICAgcGF0aFtuZXdjbmFtZV0gPSBuZXdjO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0aC5jb21wb25lbnRzW25ld2NuYW1lXSA9IG5ld2M7XG4gICAgICB9XG4gICAgICBwYXRoLmNMaXN0W25ld2N0YWddID0gY29tcG9uZW50W25ld2N0YWddO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogRXh0ZW5kcyB0aGUgY2xhc3MgQ29tcG9uZW50LlxuICAgKlxuICAgKiBAbWV0aG9kIChhcmcxKVxuICAgKiBAcHVibGljXG4gICAqIEBwYXJhbSB7T2JqZWN0fSAgICB0aGUgbWV0aG9kcyB0byBhZGQgdG8gQ29tcG9uZW50LFxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSAgcmV0dXJucyB0aGUgZXh0ZW5kZWQgY2xhc3MgY29tcG9uZW50LFxuICAgKiBAc2luY2UgMC4wLjNcbiAgICovXG4gIGNyZWF0ZUNsYXNzKG1ldGhvZHMpIHtcbiAgICAvLyBDaGVjayB0aGF0IG1ldGhvZHMgaXMgYW4gb2JqZWN0OlxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobWV0aG9kcykgIT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IGtleXM6XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG1ldGhvZHMpO1xuICAgIGNvbnN0IG8gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG8ucHVzaCh7XG4gICAgICAgIGtleToga2V5c1tpXSxcbiAgICAgICAgdmFsdWU6IG1ldGhvZHNba2V5c1tpXV0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3N1YkNsYXNzKENvbXBvbmVudCwgbyk7XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBWaXp1O1xuIl19"} \ No newline at end of file diff --git a/lib/vizu-min.js b/lib/vizu-min.js index 4c30c1e..bb8290e 100644 --- a/lib/vizu-min.js +++ b/lib/vizu-min.js @@ -1,9 +1,9 @@ /** - * vizu v0.0.4 + * vizu v0.0.5 * * A Javascript View library for building web and hybrid mobile apps. * Copyright (c) 2017 Jclo (http://www.mobilabs.fr). * Released under the MIT license. You may obtain a copy of the License * at: http://www.opensource.org/licenses/mit-license.php). */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Vizu=e()}}(function(){return function e(t,n,o){function r(u,c){if(!n[u]){if(!t[u]){var l="function"==typeof require&&require;if(!c&&l)return l(u,!0);if(i)return i(u,!0);var f=new Error("Cannot find module '"+u+"'");throw f.code="MODULE_NOT_FOUND",f}var s=n[u]={exports:{}};t[u][0].call(s.exports,function(e){var n=t[u][1][e];return r(n||e)},s,s.exports,e,t,n,o)}return n[u].exports}for(var i="function"==typeof require&&require,u=0;u"+this.id+"
"}},{key:"rendered",get:function(){var e=void 0;this.getInitialState();var t=this.render();if(e=t.match(/^\s*
0?t:null,n?n.innerHTML=i:(n=d.vdom?d.vdom.window.document.body:document.body).innerHTML=+i,r.el=n,r},replace:function(e,t){var n=void 0,o=void 0;if("[object Object]"===Object.prototype.toString.call(e)&&e.cList&&e.el&&"[object Object]"===Object.prototype.toString.call(t)){var r=Object.keys(t)[0],u=r.replace(/[^a-zA-z0-9]/g,""),c=new t[r],l=i(e,r);if(l){l[u]?(n=l[u].id,l[u]=null,o=1):(n=l.components[u].id,l.components[u]=null,o=2),l.cList[r]=null;var f=d.vdom?d.vdom.window.document.createElement("div"):document.createElement("div"),s=d.vdom?d.vdom.window.document.getElementById(n):document.getElementById(n);f.innerHTML=c.rendered,s.parentNode.replaceChild(f.firstChild,s),1===o?l[u]=c:l.components[u]=c,l.cList[r]=t[r]}}},createClass:function(e){if("[object Object]"!==Object.prototype.toString.call(e))return null;for(var t=Object.keys(e),n=[],o=0;o"+this.id+"
"}},{key:"rendered",get:function(){var e=void 0;this.getInitialState();var t=this.render();if(e=t.match(/^\s*
0?t:null,n?n.innerHTML=i:(n=a.vdom?a.vdom.window.document.body:document.body).innerHTML=+i,u(r),r.el=n,r},replace:function(e,t){var n=void 0,o=void 0;if("[object Object]"===Object.prototype.toString.call(e)&&e.cList&&e.el&&"[object Object]"===Object.prototype.toString.call(t)){var r=Object.keys(t)[0],u=r.replace(/[^a-zA-z0-9]/g,""),c=new t[r],l=i(e,r);if(l){l[u]?(n=l[u].id,l[u]=null,o=1):(n=l.components[u].id,l.components[u]=null,o=2),l.cList[r]=null;var s=a.vdom?a.vdom.window.document.createElement("div"):document.createElement("div"),f=a.vdom?a.vdom.window.document.getElementById(n):document.getElementById(n);s.innerHTML=c.rendered,f.parentNode.replaceChild(s.firstChild,f),1===o?l[u]=c:l.components[u]=c,l.cList[r]=t[r]}}},createClass:function(e){if("[object Object]"!==Object.prototype.toString.call(e))return null;for(var t=Object.keys(e),n=[],o=0;o${this.id}
`;\n }\n\n /**\n * Processes the web component to convert child(s) to plain HTML.\n *\n * @method ()\n * @public\n * @param {} -,\n * @returns {String} returns the web component,\n * @since 0.0.0\n */\n get rendered() {\n let t;\n // Initializes:\n this.getInitialState();\n // Add an unique ID to this component:\n // let t = this.render().replace(/
/, `
`);\n const co = this.render();\n if (co.match(/^\\s*
0 ? cList : null;\n\n // Fill the DOM:\n if (el) {\n el.innerHTML = t;\n } else {\n el = Vizu.vdom ? Vizu.vdom.window.document.body : document.body;\n el.innerHTML = +t;\n }\n // Attach parent element:\n view.el = el;\n\n // Return the rendered object (with a reference to all the web components):\n return view;\n },\n\n /**\n * Replaces a component with another component having the same tag.\n *\n * @method (arg1, arg2)\n * @public\n * @param {Object} the view object,\n * @param {Object} the new component ({ '': 'new class' }),\n * @returns {} -,\n * @since 0.0.0\n */\n replace(view, component) {\n let id\n , type\n ;\n\n // Check that view is an object with, at least, the properties cList and el:\n if (Object.prototype.toString.call(view) !== '[object Object]' || !view.cList || !view.el) {\n return;\n }\n\n // Check that component is an object:\n if (Object.prototype.toString.call(component) !== '[object Object]') {\n return;\n }\n\n // Process the new component:\n const newctag = Object.keys(component)[0];\n const newcname = newctag.replace(/[^a-zA-z0-9]/g, '');\n const newc = new component[newctag]();\n\n // Check if a component with the same name already exists in the view:\n const path = explore(view, newctag);\n if (path) {\n // Get its id and remove it:\n if (path[newcname]) {\n id = path[newcname].id;\n path[newcname] = null;\n type = 1;\n } else {\n id = path.components[newcname].id;\n path.components[newcname] = null;\n type = 2;\n }\n path.cList[newctag] = null;\n\n // Get its id and clear it:\n const wrapper = Vizu.vdom\n ? Vizu.vdom.window.document.createElement('div')\n : document.createElement('div');\n\n const oldNode = Vizu.vdom\n ? Vizu.vdom.window.document.getElementById(id)\n : document.getElementById(id);\n\n wrapper.innerHTML = newc.rendered;\n oldNode.parentNode.replaceChild(wrapper.firstChild, oldNode);\n\n // Attach the new node to view:\n if (type === 1) {\n path[newcname] = newc;\n } else {\n path.components[newcname] = newc;\n }\n path.cList[newctag] = component[newctag];\n }\n },\n\n /**\n * Extends the class Component.\n *\n * @method (arg1)\n * @public\n * @param {Object} the methods to add to Component,\n * @returns {Object} returns the extended class component,\n * @since 0.0.3\n */\n createClass(methods) {\n // Check that methods is an object:\n if (Object.prototype.toString.call(methods) !== '[object Object]') {\n return null;\n }\n\n // Extract keys:\n const keys = Object.keys(methods);\n const o = [];\n for (let i = 0; i < keys.length; i++) {\n o.push({\n key: keys[i],\n value: methods[keys[i]],\n });\n }\n\n return _subClass(Component, o);\n },\n};\n\nexport default Vizu;\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJpbmRleC5qcyIsInNyYy9jb21wb25lbnQuanMiLCJzcmMvdml6dS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztBQ0FBOzs7O0FBQ0E7Ozs7OztrQkFFZSxFQUFFLDhCQUFGLEVBQWEsb0JBQWIsRTs7Ozs7Ozs7OztxakJDSGY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUNBOzs7Ozs7OztBQUVBOztBQUVBOzs7QUFHQTs7O0FBR0E7O0FBRUE7Ozs7O0lBS00sUztBQUNOOzs7Ozs7O0FBT0UsdUJBQWM7QUFBQTs7QUFDWjtBQUNBLFNBQUssRUFBTCxTQUFjLEtBQUssTUFBTCxHQUFjLFFBQWQsQ0FBdUIsRUFBdkIsRUFBMkIsTUFBM0IsQ0FBa0MsQ0FBbEMsRUFBcUMsQ0FBckMsQ0FBZDtBQUNBLFNBQUssS0FBTCxHQUFhLElBQWI7QUFDQSxTQUFLLFVBQUwsR0FBa0IsSUFBbEI7QUFDQSxTQUFLLEtBQUwsR0FBYSxFQUFiO0FBQ0EsU0FBSyxLQUFMLENBQVcsT0FBWCxHQUFxQixFQUFyQjtBQUNEOztBQUVEOzs7Ozs7Ozs7Ozs7O3NDQVNrQjtBQUNoQjtBQUNBLFdBQUssS0FBTCxHQUFhLEVBQWI7QUFDQSxXQUFLLEtBQUwsQ0FBVyxPQUFYLEdBQXFCLEVBQXJCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7Ozs7c0JBVUUsRSxFQUFJO0FBQ0osVUFBTSxPQUFPLElBQWI7O0FBRUE7Ozs7Ozs7Ozs7QUFVQSxVQUFNLGFBQWEsU0FBYixVQUFhLEdBQVc7QUFDNUIsWUFBSSxFQUFKLEVBQVE7QUFDTjtBQUNBLGlCQUFPLGVBQUssSUFBTCxHQUNILGVBQUssSUFBTCxDQUFVLE1BQVYsQ0FBaUIsUUFBakIsQ0FBMEIsYUFBMUIsT0FBNEMsS0FBSyxFQUFqRCxFQUF1RCxhQUF2RCxDQUFxRSxFQUFyRTtBQUNGO0FBRkssWUFHSCxTQUFTLGFBQVQsT0FBMkIsS0FBSyxFQUFo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Q0Q7QUFyS1UsQ0FBYjs7a0JBd0tlLEkiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiaW1wb3J0IENvbXBvbmVudCBmcm9tICcuL3NyYy9jb21wb25lbnQnO1xuaW1wb3J0IFZpenUgZnJvbSAnLi9zcmMvdml6dSc7XG5cbmV4cG9ydCBkZWZhdWx0IHsgQ29tcG9uZW50LCBWaXp1IH07XG4iLCIvKiBnbG9iYWwgZG9jdW1lbnQgKi9cbi8qIGVzbGludCBpbmRlbnQ6IFtcImVycm9yXCIsIDIsIHsgXCJWYXJpYWJsZURlY2xhcmF0b3JcIjogeyBcInZhclwiOiAxLCBcImxldFwiOiAxLCBcImNvbnN0XCI6IDIgfSB9XSAqL1xuLyogZXNsaW50IG9uZS12YXI6IDAgKi9cbi8vIC0tIFZlbmRvciBtb2R1bGVzXG5cbi8vIC0tIExvY2FsIG1vZHVsZXNcbmltcG9ydCBWaXp1IGZyb20gJy4vdml6dSc7XG5cbi8vIC0tIEdsb2JhbCBjb25zdGFudHMgKGluIHRoZSBzY29wZSBvZiB0aGlzIG1vZHVsZSlcblxuLy8gLS0gR2xvYmFsIHZhcmlhYmxlcyAoaW4gdGhlIHNjb3BlIG9mIHRoaXMgbW9kdWxlKVxuXG5cbi8vIC0tIFByaXZhdGUgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gLS0gUHVibGljIE1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4qIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgd2ViIGNvbXBvbmVudC5cbipcbiogQG5hbWVzcGFjZSB2aXp1XG4qL1xuY2xhc3MgQ29tcG9uZW50IHtcbi8qKlxuICogQ3JlYXRlcyBhbiB1bmlxdWUgSUQgZm9yIHRoaXMgY29tcG9uZW50LlxuICpcbiAqIEBjb25zdHJ1Y3RvciAoKVxuICogQHB1YmxpY1xuICogQHBhcmFtIHt9ICAgICAgICAgIC0sXG4gKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gQ3JlYXRlIGFuIHVuaXF1ZSBpZCBmb3IgdGhpcyBjb21wb25lbnQ6XG4gICAgdGhpcy5pZCA9IGBpJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgNyl9YDtcbiAgICB0aGlzLmNMaXN0ID0gbnVsbDtcbiAgICB0aGlzLmNvbXBvbmVudHMgPSBudWxsO1xuICAgIHRoaXMucHJvcHMgPSB7fTtcbiAgICB0aGlzLnByb3BzLm9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNlcyB0aGUgdmFyaWFibGVzIHdoZW4gdGhlIGNvbXBvbmVudCBpcyByZW5kZXJlZC5cbiAgICpcbiAgICogQG1ldGhvZCAoKVxuICAgKiBAcHVibGljXG4gICAqIEBwYXJhbSB7fSAgICAgICAgLSxcbiAgICogQHJldHVybnMge30gICAgICAtLFxuICAgKiBAc2luY2UgMC4wLjBcbiAgICovXG4gIGdldEluaXRpYWxTdGF0ZSgpIHtcbiAgICAvLyBUbyBhdm9pZCBlc2xpbnQgZXJyb3IhXG4gICAgdGhpcy5wcm9wcyA9IHt9O1xuICAgIHRoaXMucHJvcHMub3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIENTUyBzZWxlY3RvcihzKS5cbiAgICpcbiAgICogQG1ldGhvZCAoYXJnMSlcbiAgICogQHB1YmxpY1xuICAgKiBAcGFyYW0ge1N0cmluZ30gICAgdGhlIENTUyBzZWxlY3RvcihzKSxcbiAgICogQHJldHVybnMge09iamVjdH0gIHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIGEgc3BlY2lmaWVkXG4gICAqICAgICAgICAgICAgICAgICAgICBDU1Mgc2VsZWN0b3IocyksXG4gICAqIEBzaW5jZSAwLjAuMFxuICAgKi9cbiAgJChlbCkge1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgQ1NTIHNlbGVjdG9yKHMpLlxuICAgICAqXG4gICAgICogQG1ldGhvZCAoYXJnMSlcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtIHtTdHJpbmd9ICAgIHRoZSBDU1Mgc2VsZWN0b3IocyksXG4gICAgICogQHJldHVybnMge09iamVjdH0gIHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIGEgc3BlY2lmaWVkXG4gICAgICogICAgICAgICAgICAgICAgICAgIENTUyBzZWxlY3RvcihzKSxcbiAgICAgKiBAc2luY2UgMC4wLjBcbiAgICAgKi9cbiAgICBjb25zdCBnZXRFbGVtZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgLy8gUmV0dXJucyB0aGUgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvcihzKTpcbiAgICAgICAgcmV0dXJuIFZpenUudmRvbVxuICAgICAgICAgID8gVml6dS52ZG9tLndpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHt0aGF0LmlkfWApLnF1ZXJ5U2VsZWN0b3IoZWwpXG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3RoYXQuaWR9YCkucXVlcnlTZWxlY3RvcihlbCk7XG4gICAgICB9XG4gICAgICAvLyBSZXR1cm4gdGhlIGVudGlyZSAnd2ViIGNvbXBvbmVudCc6XG4gICAgICByZXR1cm4gVml6dS52ZG9tXG4gICAgICAgID8gVml6dS52ZG9tLndpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHt0aGF0LmlkfWApXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7dGhhdC5pZH1gKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgRE9NVG9rZW5MaXN0IGNvbGxlY3Rpb24gb2YgdGhlIGNsYXNzIGF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kICgpXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7fSAgICAgICAgICAtLFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9ICByZXR1cm5zIHRoZSBET01Ub2tlbkxpc3Qgb2YgdGhlIGVsZW1lbnQsXG4gICAgICogQHNpbmNlIDAuMC4wXG4gICAgICovXG4gICAgY29uc3QgZ2V0Q2xhc3NMaXN0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZ2V0RWxlbWVudCgpLmNsYXNzTGlzdDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNsYXNzIG5hbWUgdG8gdGhlIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIChhcmcxKVxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gICAgdGhlIGNsYXNzIG5hbWUgdG8gYWRkLFxuICAgICAqIEByZXR1cm5zIHt9ICAgICAgICAtLFxuICAgICAqIEBzaW5jZSAwLjAuMFxuICAgICAqL1xuICAgIGNvbnN0IGFkZENsYXNzID0gZnVuY3Rpb24oY2xhc3NOYW1lKSB7XG4gICAgICBnZXRFbGVtZW50KCkuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgY2xhc3MgbmFtZSB0byB0aGUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBtZXRob2QgKGFyZzEpXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgICB0aGUgY2xhc3MgbmFtZSB0byByZW1vdmUsXG4gICAgICogQHJldHVybnMge30gICAgICAgIC0sXG4gICAgICogQHNpbmNlIDAuMC4wXG4gICAgICovXG4gICAgY29uc3QgcmVtb3ZlQ2xhc3MgPSBmdW5jdGlvbihjbGFzc05hbWUpIHtcbiAgICAgIGdldEVsZW1lbnQoKS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgYSBjbGFzcyBuYW1lIGZvciB0aGUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBtZXRob2QgKGFyZzEpXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgICB0aGUgY2xhc3MgbmFtZSB0byBhZGQvcmVtb3ZlLFxuICAgICAqIEByZXR1cm5zIHt9ICAgICAgICAtLFxuICAgICAqIEBzaW5jZSAwLjAuMFxuICAgICAqL1xuICAgIGNvbnN0IHRvZ2dsZUNsYXNzID0gZnVuY3Rpb24oY2xhc3NOYW1lKSB7XG4gICAgICBnZXRFbGVtZW50KCkuY2xhc3NMaXN0LnRvZ2dsZShjbGFzc05hbWUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIEhUTUwgY29udGVudHMgb2YgdGhlIGVsZW1lbnQsXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIChhcmcxKVxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gICAgdGhlIGh0bWwgY29udGVudHMgdG8gYWRkLFxuICAgICAqIEByZXR1cm5zIHt9ICAgICAgICAtLFxuICAgICAqIEBzaW5jZSAwLjAuMFxuICAgICAqL1xuICAgIGNvbnN0IGh0bWwgPSBmdW5jdGlvbihodG1sc3RyaW5nKSB7XG4gICAgICBpZiAoaHRtbHN0cmluZykge1xuICAgICAgICBnZXRFbGVtZW50KCkuaW5uZXJIVE1MID0gaHRtbHN0cmluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiBnZXRFbGVtZW50KCkuaW5uZXJIVE1MO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHRleHQgY29udGVudHMgb2YgdGhlIGVsZW1lbnQsXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIChhcmcxKVxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gICAgdGhlIHRleHQgY29udGVudHMgdG8gYWRkLFxuICAgICAqIEByZXR1cm5zIHt9ICAgICAgICAtLFxuICAgICAqIEBzaW5jZSAwLjAuMFxuICAgICAqL1xuICAgIGNvbnN0IHRleHQgPSBmdW5jdGlvbih0ZXh0ZSkge1xuICAgICAgaWYgKHRleHRlKSB7XG4gICAgICAgIGdldEVsZW1lbnQoKS50ZXh0Q29udGVudCA9IHRleHRlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKS50ZXh0Q29udGVudDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBzdHlsZSBhdHRyaWJ1dGUgb2YgdGhlIGVsZW1lbnQsXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIChhcmcxLCBhcmcyKVxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gICAgdGhlIHN0eWxlIGF0dHJpYnV0ZSxcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gICAgdGhlIHN0eWxlIGF0dHJpYnV0ZSB2YWx1ZSxcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSAgdW5kZWZpbmVkIG9yIHRoZSBzdHlsZSBhdHRyaWJ1dGUgdmFsdWUsXG4gICAgICogQHNpbmNlIDAuMC4zXG4gICAgICovXG4gICAgY29uc3QgY3NzID0gZnVuY3Rpb24oc3R5bGVBdHRyLCB2YWx1ZSkge1xuICAgICAgY29uc3QgYXJyID0gdHlwZW9mIHN0eWxlQXR0ciA9PT0gJ3N0cmluZycgPyBzdHlsZUF0dHIuc3BsaXQoJy0nKSA6IFtdO1xuICAgICAgbGV0IGF0dHIgPSAnJztcblxuICAgICAgLy8gQ29udmVydCBzdHlsZSBhdHRyaWJ1dGUgbmFtZSB3aXRoICctJyAoZXguOiAnZm9udC1zaXplJyB0byAnZm9udFNpemUnKTpcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgYXR0ciArPSBhcnJbaV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXR0ciArPSBhcnJbaV0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBhcnJbaV0uc2xpY2UoMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAvLyBHZXQgYXR0cmlidXRlOlxuICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpLnN0eWxlW2F0dHJdO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgYXR0cmlidXRlOlxuICAgICAgZ2V0RWxlbWVudCgpLnN0eWxlW2F0dHJdID0gdmFsdWU7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCB0aGUgY2hpbGRzIG9mIHRoZSBjdXJyZW50IG5vZGUuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kICgpXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7fSAgICAgICAgICAtLFxuICAgICAqIEByZXR1cm5zIHt9ICAgICAgICAtLFxuICAgICAqIEBzaW5jZSAwLjAuNFxuICAgICAqL1xuICAgIGNvbnN0IGVtcHR5ID0gZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBub2RlID0gZ2V0RWxlbWVudCgpO1xuICAgICAgd2hpbGUgKG5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUuZmlyc3RDaGlsZCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFwcGVuZHMgYW4gSFRNTCBzdHJpbmcgYWZ0ZXIgdGhlIGxhc3QgY2hpbGQgb2YgdGhlIGN1cnJlbnQgbm9kZS5cbiAgICAgKlxuICAgICAqIEBtZXRob2QgKGFyZzEpXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgICBhbiBIVE1MIHN0cmluZyxcbiAgICAgKiBAcmV0dXJucyB7fSAgICAgICAgLSxcbiAgICAgKiBAc2luY2UgMC4wLjRcbiAgICAgKi9cbiAgICBjb25zdCBhcHBlbmQgPSBmdW5jdGlvbihodG1sc3RyaW5nKSB7XG4gICAgICBnZXRFbGVtZW50KCkuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1sc3RyaW5nKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBnZXRFbGVtZW50KCkgPyBnZXRFbGVtZW50KCkuaWQgOiBudWxsLFxuICAgICAgZ2V0RWxlbWVudCxcbiAgICAgIGdldENsYXNzTGlzdCxcbiAgICAgIGFkZENsYXNzLFxuICAgICAgcmVtb3ZlQ2xhc3MsXG4gICAgICB0b2dnbGVDbGFzcyxcbiAgICAgIGh0bWwsXG4gICAgICB0ZXh0LFxuICAgICAgY3NzLFxuICAgICAgZW1wdHksXG4gICAgICBhcHBlbmQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkZWZpbmVkIHdlYiBjb21wb25lbnQuXG4gICAqXG4gICAqIEBtZXRob2QgKClcbiAgICogQHB1YmxpY1xuICAgKiBAcGFyYW0ge30gICAgICAgICAgLSxcbiAgICogQHJldHVybnMge1N0cmluZ30gIHJldHVybnMgdGhlIHdlYiBjb21wb25lbnQsXG4gICAqIEBzaW5jZSAwLjAuMFxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBgPGRpdj4ke3RoaXMuaWR9PC9kaXY+YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgdGhlIHdlYiBjb21wb25lbnQgdG8gY29udmVydCBjaGlsZChzKSB0byBwbGFpbiBIVE1MLlxuICAgKlxuICAgKiBAbWV0aG9kICgpXG4gICAqIEBwdWJsaWNcbiAgICogQHBhcmFtIHt9ICAgICAgICAgIC0sXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9ICByZXR1cm5zIHRoZSB3ZWIgY29tcG9uZW50LFxuICAgKiBAc2luY2UgMC4wLjBcbiAgICovXG4gIGdldCByZW5kZXJlZCgpIHtcbiAgICBsZXQgdDtcbiAgICAvLyBJbml0aWFsaXplczpcbiAgICB0aGlzLmdldEluaXRpYWxTdGF0ZSgpO1xuICAgIC8vIEFkZCBhbiB1bmlxdWUgSUQgdG8gdGhpcyBjb21wb25lbnQ6XG4gICAgLy8gbGV0IHQgPSB0aGlzLnJlbmRlcigpLnJlcGxhY2UoLzxkaXY+LywgYDxkaXYgaWQ9XCIke3RoaXMuaWR9XCI+YCk7XG4gICAgY29uc3QgY28gPSB0aGlzLnJlbmRlcigpO1xuICAgIGlmIChjby5tYXRjaCgvXlxccyo8ZGl2LykpIHtcbiAgICAgIHQgPSBjby5yZXBsYWNlKC9eXFxzKjxkaXYvLCBgPGRpdiBpZD0gXCIke3RoaXMuaWR9XCJgKTtcbiAgICB9IGVsc2UgaWYgKGNvLm1hdGNoKC9eXFxzKjxoZWFkZXIvKSkge1xuICAgICAgdCA9IGNvLnJlcGxhY2UoL15cXHMqPGhlYWRlci8sIGA8aGVhZGVyIGlkPSBcIiR7dGhpcy5pZH1cImApO1xuICAgIH0gZWxzZSBpZiAoY28ubWF0Y2goL15cXHMqPGZvb3Rlci8pKSB7XG4gICAgICB0ID0gY28ucmVwbGFjZSgvXlxccyo8Zm9vdGVyLywgYDxmb290ZXIgaWQ9IFwiJHt0aGlzLmlkfVwiYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHQgPSBjbztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jTGlzdCkge1xuICAgICAgLy8gVGhpcyBjb21wb25lbnQgaW5jbHVkZXMgY29tcG9uZW50cywgcmVuZGVyIHRoZW06XG4gICAgICB0aGlzLmNvbXBvbmVudHMgPSB7fTtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmNMaXN0KTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjID0gbmV3IHRoaXMuY0xpc3Rba2V5c1tpXV0oKTtcbiAgICAgICAgdCA9IHQucmVwbGFjZShrZXlzW2ldLCBjLnJlbmRlcmVkKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRzW2tleXNbaV0ucmVwbGFjZSgvW15hLXpBLXowLTldL2csICcnKV0gPSBjO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZXR1cm4gdGhlIHJlbmRlcmVkIHdlYiBjb21wb25lbnQ6XG4gICAgcmV0dXJuIHQ7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29tcG9uZW50O1xuIiwiLyogZ2xvYmFsIGRvY3VtZW50ICovXG4vKiBlc2xpbnQgaW5kZW50OiBbXCJlcnJvclwiLCAyLCB7IFwiVmFyaWFibGVEZWNsYXJhdG9yXCI6IHsgXCJ2YXJcIjogMSwgXCJsZXRcIjogMSwgXCJjb25zdFwiOiAyIH0gfV0gKi9cbi8qIGVzbGludCBvbmUtdmFyOiAwLCBuby1wYXJhbS1yZWFzc2lnbjogMCwgbWF4LWxlbjogWzEsIDEzMF0sXG4gIG5vLXVudXNlZC1leHByZXNzaW9uczogW1wiZXJyb3JcIiwgeyBcImFsbG93VGVybmFyeVwiOiB0cnVlIH1dLCBuby11bmRlcnNjb3JlLWRhbmdsZTogMCxcbiAgbm8tcHJvdG86IDEsIHByZWZlci1yZXN0LXBhcmFtczogMSAqL1xuXG4vLyAtLSBWZW5kb3IgbW9kdWxlc1xuXG4vLyAtLSBMb2NhbCBtb2R1bGVzXG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4vY29tcG9uZW50JztcblxuLy8gLS0gR2xvYmFsIGNvbnN0YW50cyAoaW4gdGhlIHNjb3BlIG9mIHRoaXMgbW9kdWxlKVxuXG4vLyAtLSBHbG9iYWwgdmFyaWFibGVzIChpbiB0aGUgc2NvcGUgb2YgdGhpcyBtb2R1bGUpXG5cblxuLy8gLS0gUHJpdmF0ZSBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBtYXRjaGluZyBXZWIgQ29tcG9uZW50LlxuICpcbiAqIEBmdW5jdGlvbiAoKVxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSAgICB0aGUgdmlldyBvYmplY3QsXG4gKiBAcGFyYW0ge1N0cmluZ30gICAgdGhlIHRhZyBkZWZpbmluZyBhIFdlYiBDb21wb25lbnRcbiAqIEByZXR1cm5zIHtPYmplY3R9ICB0aGUgcGF0aCBvZiB0aGUgbWF0Y2hpbmcgV2ViIENvbXBvbmVudCxcbiAqL1xuY29uc3QgZXhwbG9yZSA9IGZ1bmN0aW9uKHZpZXcsIHRhZykge1xuICBpZiAodmlldy5jTGlzdCAmJiB2aWV3LmNMaXN0W3RhZ10pIHtcbiAgICByZXR1cm4gdmlldztcbiAgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmlldyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGlmICh2aWV3W2tleXNbaV1dLmNMaXN0KSB7XG4gICAgICBpZiAodmlld1trZXlzW2ldXS5jTGlzdFt0YWddKSB7XG4gICAgICAgIHJldHVybiB2aWV3W2tleXNbaV1dO1xuICAgICAgfVxuICAgICAgaWYgKHZpZXdba2V5c1tpXV0uY29tcG9uZW50cykge1xuICAgICAgICByZXR1cm4gZXhwbG9yZSh2aWV3W2tleXNbaV1dLmNvbXBvbmVudHMsIHRhZyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuXG4vKipcbiAqIENvZGUgcmV1c2VkIGZyb20gQmFiZWxcbiAqL1xuY29uc3QgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikge1xuICAgICAgICBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIHtcbiAgICAgIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICB9XG4gICAgaWYgKHN0YXRpY1Byb3BzKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIH1cbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH07XG59KCkpO1xuXG4vKipcbiAqIENvZGUgcmV1c2VkIGZyb20gQmFiZWxcbiAqL1xuY29uc3QgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gPSBmdW5jdGlvbihzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIGNhbGwgPT09ICdmdW5jdGlvbicpID8gY2FsbCA6IHNlbGY7XG59O1xuXG4vKipcbiAqIENvZGUgcmV1c2VkIGZyb20gQmFiZWxcbiAqL1xuY29uc3QgX2luaGVyaXRzID0gZnVuY3Rpb24oc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAnZnVuY3Rpb24nICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgJHt0eXBlb2Ygc3VwZXJDbGFzc31gKTtcbiAgfVxuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHN1YkNsYXNzLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9IH0pO1xuXG4gIGlmIChzdXBlckNsYXNzKSB7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG4gIH1cbn07XG5cbi8qKlxuICogQ29kZSByZXVzZWQgZnJvbSBCYWJlbFxuICovXG5jb25zdCBfY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbihpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpO1xuICB9XG59O1xuXG4vKipcbiAqIENvZGUgcmV1c2VkIGZyb20gQmFiZWxcbiAqL1xuY29uc3QgX3N1YkNsYXNzID0gZnVuY3Rpb24oU3VwZXJDbGFzcywgbSkge1xuICBmdW5jdGlvbiBTdWJDbGFzcygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3ViQ2xhc3MpO1xuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoU3ViQ2xhc3MuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihTdWJDbGFzcykpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG4gIF9pbmhlcml0cyhTdWJDbGFzcywgU3VwZXJDbGFzcyk7XG5cbiAgX2NyZWF0ZUNsYXNzKFN1YkNsYXNzLCBtKTtcblxuICByZXR1cm4gU3ViQ2xhc3M7XG59O1xuXG4vLyAtLSBQdWJsaWMgTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiogVGhpcyBsaWJyYXJ5IHJlbmRlcnMgdGhlIFZpZXcgaW4gdGhlIERPTS5cbipcbiogQG5hbWVzcGFjZSBWaXp1XG4qL1xuY29uc3QgVml6dSA9IHtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmVyc2lvbiBvZiB0aGlzIGxpYnJhcnkuXG4gICAqXG4gICAqIEBtZXRob2QgKClcbiAgICogQHB1YmxpY1xuICAgKiBAcGFyYW0ge30gICAgICAgICAgLSxcbiAgICogQHJldHVybnMge1N0cmluZ30gIHJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhpcyBsaWJyYXJ5LFxuICAgKi9cbiAgdmVyc2lvbigpIHtcbiAgICByZXR1cm4gJ3t7bGliOnZlcnNpb259fSc7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIFZpZXcgaW4gdGhlIERPTS5cbiAgICpcbiAgICogQG1ldGhvZCAoYXJnMSwgYXJnMiwgYXJnMylcbiAgICogQHB1YmxpY1xuICAgKiBAcGFyYW0ge1N0cmluZ30gICAgdGhlIGFnZ3JlZ2F0ZWQgd2ViIGNvbXBvbmVudHMsXG4gICAqIEBwYXJhbSB7T2JqZWN0fSAgICB0aGUgbGlzdCBvZiB3ZWIgY29tcG9uZW50cyBhbmQgdGhlaXIgcmVmZXJlbmNlLFxuICAgKiBAcGFyYW0ge09iamVjdH0gICAgdGhlIERPTSBlbGVtZW50IHdoZXJlIHRoZSB2aWV3ICh0aGUgYWdncmVnYXRlIG9mIHdlYiBjb21wb25lbnRzKSBpcyBpbnNlcnRlZCxcbiAgICogQHJldHVybnMge09iamVjdH0gIHJldHVybnMgdGhlIHZpZXcgb2JqZWN0LFxuICAgKiBAc2luY2UgMC4wLjBcbiAgICovXG4gIHJlbmRlcih0ZW1wbGF0ZSwgY0xpc3QsIGVsKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChjTGlzdCkgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gT2JqZWN0LmtleXMoY0xpc3QpIDogW11cbiAgICAgICAgLCB2aWV3ID0ge31cbiAgICAgICAgO1xuICAgIGxldCB0O1xuXG4gICAgLy8gUmV0dXJuIG51bGwgaWYgdGhlIHRlbXBsYXRlIGlzIG5vdCBhIHN0cmluZzpcbiAgICBpZiAodHlwZW9mIHRlbXBsYXRlICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gSWYgbm8gY29tcG9uZW50cywgcmVuZGVyIHRoZSB0ZW1wbGF0ZSBhcyBpczpcbiAgICBpZiAoIWNMaXN0KSB7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwuaW5uZXJIVE1MID0gdGVtcGxhdGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBWaXp1LnZkb21cbiAgICAgICAgICA/IChWaXp1LnZkb20ud2luZG93LmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MICs9IHRlbXBsYXRlKVxuICAgICAgICAgIDogKGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MICs9IHRlbXBsYXRlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRoaXMgdmlldyBpbmNsdWRlcyBjb21wb25lbnRzLCByZW5kZXIgdGhlbTpcbiAgICB0ID0gdGVtcGxhdGU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjID0gbmV3IGNMaXN0W2tleXNbaV1dKCk7XG4gICAgICB0ID0gdC5yZXBsYWNlKGtleXNbaV0sIGMucmVuZGVyZWQpO1xuICAgICAgdmlld1trZXlzW2ldLnJlcGxhY2UoL1teYS16QS16MC05XS9nLCAnJyldID0gYztcbiAgICB9XG4gICAgLy8gQXR0YWNoIGNMaXN0OlxuICAgIHZpZXcuY0xpc3QgPSBrZXlzLmxlbmd0aCA+IDAgPyBjTGlzdCA6IG51bGw7XG5cbiAgICAvLyBGaWxsIHRoZSBET006XG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC5pbm5lckhUTUwgPSB0O1xuICAgIH0gZWxzZSB7XG4gICAgICBlbCA9IFZpenUudmRvbSA/IFZpenUudmRvbS53aW5kb3cuZG9jdW1lbnQuYm9keSA6IGRvY3VtZW50LmJvZHk7XG4gICAgICBlbC5pbm5lckhUTUwgPSArdDtcbiAgICB9XG4gICAgLy8gQXR0YWNoIHBhcmVudCBlbGVtZW50OlxuICAgIHZpZXcuZWwgPSBlbDtcblxuICAgIC8vIFJldHVybiB0aGUgcmVuZGVyZWQgb2JqZWN0ICh3aXRoIGEgcmVmZXJlbmNlIHRvIGFsbCB0aGUgd2ViIGNvbXBvbmVudHMpOlxuICAgIHJldHVybiB2aWV3O1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhIGNvbXBvbmVudCB3aXRoIGFub3RoZXIgY29tcG9uZW50IGhhdmluZyB0aGUgc2FtZSB0YWcuXG4gICAqXG4gICAqIEBtZXRob2QgKGFyZzEsIGFyZzIpXG4gICAqIEBwdWJsaWNcbiAgICogQHBhcmFtIHtPYmplY3R9ICAgIHRoZSB2aWV3IG9iamVjdCxcbiAgICogQHBhcmFtIHtPYmplY3R9ICAgIHRoZSBuZXcgY29tcG9uZW50ICh7ICc8QWFhIC8+JzogJ25ldyBjbGFzcycgfSksXG4gICAqIEByZXR1cm5zIHt9ICAgICAgICAtLFxuICAgKiBAc2luY2UgMC4wLjBcbiAgICovXG4gIHJlcGxhY2UodmlldywgY29tcG9uZW50KSB7XG4gICAgbGV0IGlkXG4gICAgICAsIHR5cGVcbiAgICAgIDtcblxuICAgIC8vIENoZWNrIHRoYXQgdmlldyBpcyBhbiBvYmplY3Qgd2l0aCwgYXQgbGVhc3QsIHRoZSBwcm9wZXJ0aWVzIGNMaXN0IGFuZCBlbDpcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZpZXcpICE9PSAnW29iamVjdCBPYmplY3RdJyB8fCAhdmlldy5jTGlzdCB8fCAhdmlldy5lbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHRoYXQgY29tcG9uZW50IGlzIGFuIG9iamVjdDpcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGNvbXBvbmVudCkgIT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyB0aGUgbmV3IGNvbXBvbmVudDpcbiAgICBjb25zdCBuZXdjdGFnID0gT2JqZWN0LmtleXMoY29tcG9uZW50KVswXTtcbiAgICBjb25zdCBuZXdjbmFtZSA9IG5ld2N0YWcucmVwbGFjZSgvW15hLXpBLXowLTldL2csICcnKTtcbiAgICBjb25zdCBuZXdjID0gbmV3IGNvbXBvbmVudFtuZXdjdGFnXSgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgYSBjb21wb25lbnQgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoZSB2aWV3OlxuICAgIGNvbnN0IHBhdGggPSBleHBsb3JlKHZpZXcsIG5ld2N0YWcpO1xuICAgIGlmIChwYXRoKSB7XG4gICAgICAvLyBHZXQgaXRzIGlkIGFuZCByZW1vdmUgaXQ6XG4gICAgICBpZiAocGF0aFtuZXdjbmFtZV0pIHtcbiAgICAgICAgaWQgPSBwYXRoW25ld2NuYW1lXS5pZDtcbiAgICAgICAgcGF0aFtuZXdjbmFtZV0gPSBudWxsO1xuICAgICAgICB0eXBlID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlkID0gcGF0aC5jb21wb25lbnRzW25ld2NuYW1lXS5pZDtcbiAgICAgICAgcGF0aC5jb21wb25lbnRzW25ld2NuYW1lXSA9IG51bGw7XG4gICAgICAgIHR5cGUgPSAyO1xuICAgICAgfVxuICAgICAgcGF0aC5jTGlzdFtuZXdjdGFnXSA9IG51bGw7XG5cbiAgICAgIC8vIEdldCBpdHMgaWQgYW5kIGNsZWFyIGl0OlxuICAgICAgY29uc3Qgd3JhcHBlciA9IFZpenUudmRvbVxuICAgICAgICA/IFZpenUudmRvbS53aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICAgICAgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgY29uc3Qgb2xkTm9kZSA9IFZpenUudmRvbVxuICAgICAgICA/IFZpenUudmRvbS53aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICAgIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuXG4gICAgICB3cmFwcGVyLmlubmVySFRNTCA9IG5ld2MucmVuZGVyZWQ7XG4gICAgICBvbGROb2RlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHdyYXBwZXIuZmlyc3RDaGlsZCwgb2xkTm9kZSk7XG5cbiAgICAgIC8vIEF0dGFjaCB0aGUgbmV3IG5vZGUgdG8gdmlldzpcbiAgICAgIGlmICh0eXBlID09PSAxKSB7XG4gICAgICAgIHBhdGhbbmV3Y25hbWVdID0gbmV3YztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhdGguY29tcG9uZW50c1tuZXdjbmFtZV0gPSBuZXdjO1xuICAgICAgfVxuICAgICAgcGF0aC5jTGlzdFtuZXdjdGFnXSA9IGNvbXBvbmVudFtuZXdjdGFnXTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEV4dGVuZHMgdGhlIGNsYXNzIENvbXBvbmVudC5cbiAgICpcbiAgICogQG1ldGhvZCAoYXJnMSlcbiAgICogQHB1YmxpY1xuICAgKiBAcGFyYW0ge09iamVjdH0gICAgdGhlIG1ldGhvZHMgdG8gYWRkIHRvIENvbXBvbmVudCxcbiAgICogQHJldHVybnMge09iamVjdH0gIHJldHVybnMgdGhlIGV4dGVuZGVkIGNsYXNzIGNvbXBvbmVudCxcbiAgICogQHNpbmNlIDAuMC4zXG4gICAqL1xuICBjcmVhdGVDbGFzcyhtZXRob2RzKSB7XG4gICAgLy8gQ2hlY2sgdGhhdCBtZXRob2RzIGlzIGFuIG9iamVjdDpcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG1ldGhvZHMpICE9PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCBrZXlzOlxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhtZXRob2RzKTtcbiAgICBjb25zdCBvID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvLnB1c2goe1xuICAgICAgICBrZXk6IGtleXNbaV0sXG4gICAgICAgIHZhbHVlOiBtZXRob2RzW2tleXNbaV1dLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9zdWJDbGFzcyhDb21wb25lbnQsIG8pO1xuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgVml6dTtcbiJdfQ=="} \ No newline at end of file +{"version":3,"sources":["node_modules/browser-pack/_prelude.js","index.js","src/component.js","src/vizu.js"],"names":[],"mappings":"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","file":"vizu.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o${this.id}
`;\n }\n\n /**\n * Processes the web component to convert child(s) to plain HTML.\n *\n * @method ()\n * @private\n * @param {} -,\n * @returns {String} returns the web component,\n * @since 0.0.0\n */\n get rendered() {\n let t;\n // Initializes:\n this.getInitialState();\n // Add an unique ID to this component:\n // let t = this.render().replace(/
/, `
`);\n const co = this.render();\n if (co.match(/^\\s*
0 ? cList : null;\n\n // Fill the DOM:\n if (el) {\n el.innerHTML = t;\n } else {\n el = Vizu.vdom ? Vizu.vdom.window.document.body : document.body;\n el.innerHTML = +t;\n }\n\n // Attach event(s)\n // parse all components and for each component execute evented!\n attachEvents(view);\n\n // Attach parent element:\n view.el = el;\n\n // Return the rendered object (with a reference to all the web components):\n return view;\n },\n\n /**\n * Replaces a component with another component having the same tag.\n *\n * @method (arg1, arg2)\n * @public\n * @param {Object} the view object,\n * @param {Object} the new component ({ '': 'new class' }),\n * @returns {} -,\n * @since 0.0.0\n */\n replace(view, component) {\n let id\n , type\n ;\n\n // Check that view is an object with, at least, the properties cList and el:\n if (Object.prototype.toString.call(view) !== '[object Object]' || !view.cList || !view.el) {\n return;\n }\n\n // Check that component is an object:\n if (Object.prototype.toString.call(component) !== '[object Object]') {\n return;\n }\n\n // Process the new component:\n const newctag = Object.keys(component)[0];\n const newcname = newctag.replace(/[^a-zA-z0-9]/g, '');\n const newc = new component[newctag]();\n\n // Check if a component with the same name already exists in the view:\n const path = explore(view, newctag);\n if (path) {\n // Get its id and remove it:\n if (path[newcname]) {\n id = path[newcname].id;\n path[newcname] = null;\n type = 1;\n } else {\n id = path.components[newcname].id;\n path.components[newcname] = null;\n type = 2;\n }\n path.cList[newctag] = null;\n\n // Get its id and clear it:\n const wrapper = Vizu.vdom\n ? Vizu.vdom.window.document.createElement('div')\n : document.createElement('div');\n\n const oldNode = Vizu.vdom\n ? Vizu.vdom.window.document.getElementById(id)\n : document.getElementById(id);\n\n wrapper.innerHTML = newc.rendered;\n oldNode.parentNode.replaceChild(wrapper.firstChild, oldNode);\n\n // Attach the new node to view:\n if (type === 1) {\n path[newcname] = newc;\n } else {\n path.components[newcname] = newc;\n }\n path.cList[newctag] = component[newctag];\n }\n },\n\n /**\n * Extends the class Component.\n *\n * @method (arg1)\n * @public\n * @param {Object} the methods to add to Component,\n * @returns {Object} returns the extended class component,\n * @since 0.0.3\n */\n createClass(methods) {\n // Check that methods is an object:\n if (Object.prototype.toString.call(methods) !== '[object Object]') {\n return null;\n }\n\n // Extract keys:\n const keys = Object.keys(methods);\n const o = [];\n for (let i = 0; i < keys.length; i++) {\n o.push({\n key: keys[i],\n value: methods[keys[i]],\n });\n }\n\n return _subClass(Component, o);\n },\n};\n\nexport default Vizu;\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJpbmRleC5qcyIsInNyYy9jb21wb25lbnQuanMiLCJzcmMvdml6dS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztBQ0FBOzs7O0FBQ0E7Ozs7OztrQkFFZSxFQUFFLDhCQUFGLEVBQWEsb0JBQWIsRTs7Ozs7Ozs7OztxakJDSGY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUNBOzs7Ozs7OztBQUVBOztBQUVBOzs7QUFHQTs7O0FBR0E7O0FBRUE7Ozs7O0lBS00sUztBQUNOOzs7Ozs7O0FBT0UsdUJBQWM7QUFBQTs7QUFDWjtBQUNBLFNBQUssRUFBTCxTQUFjLEtBQUssTUFBTCxHQUFjLFFBQWQsQ0FBdUIsRUFBdkIsRUFBMkIsTUFBM0IsQ0FBa0MsQ0FBbEMsRUFBcUMsQ0FBckMsQ0FBZDtBQUNBLFNBQUssS0FBTCxHQUFhLElBQWI7QUFDQSxTQUFLLFVBQUwsR0FBa0IsSUFBbEI7QUFDQSxTQUFLLEtBQUwsR0FBYSxFQUFiO0FBQ0EsU0FBSyxLQUFMLENBQVcsT0FBWCxHQUFxQixFQUFyQjtBQUNEOztBQUVEOzs7Ozs7Ozs7Ozs7O3NDQVNrQjtBQUNoQjtBQUNBLFdBQUssS0FBTCxHQUFhLEVBQWI7QUFDQSxXQUFLLEtBQUwsQ0FBVyxPQUFYLEdBQXFCLEVBQXJCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7Ozs7c0JBVUUsRSxFQUFJO0FBQ0osVUFBTSxPQUFPLElBQWI7O0FBRUE7Ozs7Ozs7Ozs7QUFVQSxVQUFNLGFBQWEsU0FBYixVQUFhLEdBQVc7QUFDNUIsWUFBSSxFQUFKLEVBQVE7QUFDTjtBQUNBLGlCQUFPLGVBQUssSUFBTCxHQUNILGVBQUssSUFBTCxDQUFVLE1BQVYsQ0FBaUIsUUFBakIsQ0FBMEIsYUFBMUIsT0FBNEMsS0FBSyxFQUFqRCxFQUF1RCxhQUF2RCxDQUFxRSxFQUFyRTtBQUNGO0FBRkssWUFHSCxTQUFTLGFBQVQsT0FBMkIsS0FBSyxFQUFo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S2UsSSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJpbXBvcnQgQ29tcG9uZW50IGZyb20gJy4vc3JjL2NvbXBvbmVudCc7XG5pbXBvcnQgVml6dSBmcm9tICcuL3NyYy92aXp1JztcblxuZXhwb3J0IGRlZmF1bHQgeyBDb21wb25lbnQsIFZpenUgfTtcbiIsIi8qIGdsb2JhbCBkb2N1bWVudCAqL1xuLyogZXNsaW50IGluZGVudDogW1wiZXJyb3JcIiwgMiwgeyBcIlZhcmlhYmxlRGVjbGFyYXRvclwiOiB7IFwidmFyXCI6IDEsIFwibGV0XCI6IDEsIFwiY29uc3RcIjogMiB9IH1dICovXG4vKiBlc2xpbnQgb25lLXZhcjogMCAqL1xuLy8gLS0gVmVuZG9yIG1vZHVsZXNcblxuLy8gLS0gTG9jYWwgbW9kdWxlc1xuaW1wb3J0IFZpenUgZnJvbSAnLi92aXp1JztcblxuLy8gLS0gR2xvYmFsIGNvbnN0YW50cyAoaW4gdGhlIHNjb3BlIG9mIHRoaXMgbW9kdWxlKVxuXG4vLyAtLSBHbG9iYWwgdmFyaWFibGVzIChpbiB0aGUgc2NvcGUgb2YgdGhpcyBtb2R1bGUpXG5cblxuLy8gLS0gUHJpdmF0ZSBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyAtLSBQdWJsaWMgTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiogVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSB3ZWIgY29tcG9uZW50LlxuKlxuKiBAbmFtZXNwYWNlIHZpenVcbiovXG5jbGFzcyBDb21wb25lbnQge1xuLyoqXG4gKiBDcmVhdGVzIGFuIHVuaXF1ZSBJRCBmb3IgdGhpcyBjb21wb25lbnQuXG4gKlxuICogQGNvbnN0cnVjdG9yICgpXG4gKiBAcHVibGljXG4gKiBAcGFyYW0ge30gICAgICAgICAgLSxcbiAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBDcmVhdGUgYW4gdW5pcXVlIGlkIGZvciB0aGlzIGNvbXBvbmVudDpcbiAgICB0aGlzLmlkID0gYGkke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA3KX1gO1xuICAgIHRoaXMuY0xpc3QgPSBudWxsO1xuICAgIHRoaXMuY29tcG9uZW50cyA9IG51bGw7XG4gICAgdGhpcy5wcm9wcyA9IHt9O1xuICAgIHRoaXMucHJvcHMub3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpc2VzIHRoZSB2YXJpYWJsZXMgd2hlbiB0aGUgY29tcG9uZW50IGlzIHJlbmRlcmVkLlxuICAgKlxuICAgKiBAbWV0aG9kICgpXG4gICAqIEBwdWJsaWNcbiAgICogQHBhcmFtIHt9ICAgICAgICAtLFxuICAgKiBAcmV0dXJucyB7fSAgICAgIC0sXG4gICAqIEBzaW5jZSAwLjAuMFxuICAgKi9cbiAgZ2V0SW5pdGlhbFN0YXRlKCkge1xuICAgIC8vIFRvIGF2b2lkIGVzbGludCBlcnJvciFcbiAgICB0aGlzLnByb3BzID0ge307XG4gICAgdGhpcy5wcm9wcy5vcHRpb25zID0ge307XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgQ1NTIHNlbGVjdG9yKHMpLlxuICAgKlxuICAgKiBAbWV0aG9kIChhcmcxKVxuICAgKiBAcHVibGljXG4gICAqIEBwYXJhbSB7U3RyaW5nfSAgICB0aGUgQ1NTIHNlbGVjdG9yKHMpLFxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSAgcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IG1hdGNoZXMgYSBzcGVjaWZpZWRcbiAgICogICAgICAgICAgICAgICAgICAgIENTUyBzZWxlY3RvcihzKSxcbiAgICogQHNpbmNlIDAuMC4wXG4gICAqL1xuICAkKGVsKSB7XG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBDU1Mgc2VsZWN0b3IocykuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIChhcmcxKVxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gICAgdGhlIENTUyBzZWxlY3RvcihzKSxcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSAgcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IG1hdGNoZXMgYSBzcGVjaWZpZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgQ1NTIHNlbGVjdG9yKHMpLFxuICAgICAqIEBzaW5jZSAwLjAuMFxuICAgICAqL1xuICAgIGNvbnN0IGdldEVsZW1lbnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChlbCkge1xuICAgICAgICAvLyBSZXR1cm5zIHRoZSB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yKHMpOlxuICAgICAgICByZXR1cm4gVml6dS52ZG9tXG4gICAgICAgICAgPyBWaXp1LnZkb20ud2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3RoYXQuaWR9YCkucXVlcnlTZWxlY3RvcihlbClcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgIDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7dGhhdC5pZH1gKS5xdWVyeVNlbGVjdG9yKGVsKTtcbiAgICAgIH1cbiAgICAgIC8vIFJldHVybiB0aGUgZW50aXJlICd3ZWIgY29tcG9uZW50JzpcbiAgICAgIHJldHVybiBWaXp1LnZkb21cbiAgICAgICAgPyBWaXp1LnZkb20ud2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3RoYXQuaWR9YClcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHt0aGF0LmlkfWApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBET01Ub2tlbkxpc3QgY29sbGVjdGlvbiBvZiB0aGUgY2xhc3MgYXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBtZXRob2QgKClcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtIHt9ICAgICAgICAgIC0sXG4gICAgICogQHJldHVybnMge09iamVjdH0gIHJldHVybnMgdGhlIERPTVRva2VuTGlzdCBvZiB0aGUgZWxlbWVudCxcbiAgICAgKiBAc2luY2UgMC4wLjBcbiAgICAgKi9cbiAgICBjb25zdCBnZXRDbGFzc0xpc3QgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBnZXRFbGVtZW50KCkuY2xhc3NMaXN0O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY2xhc3MgbmFtZSB0byB0aGUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBtZXRob2QgKGFyZzEpXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgICB0aGUgY2xhc3MgbmFtZSB0byBhZGQsXG4gICAgICogQHJldHVybnMge30gICAgICAgIC0sXG4gICAgICogQHNpbmNlIDAuMC4wXG4gICAgICovXG4gICAgY29uc3QgYWRkQ2xhc3MgPSBmdW5jdGlvbihjbGFzc05hbWUpIHtcbiAgICAgIGdldEVsZW1lbnQoKS5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBjbGFzcyBuYW1lIHRvIHRoZSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQG1ldGhvZCAoYXJnMSlcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtIHtTdHJpbmd9ICAgIHRoZSBjbGFzcyBuYW1lIHRvIHJlbW92ZSxcbiAgICAgKiBAcmV0dXJucyB7fSAgICAgICAgLSxcbiAgICAgKiBAc2luY2UgMC4wLjBcbiAgICAgKi9cbiAgICBjb25zdCByZW1vdmVDbGFzcyA9IGZ1bmN0aW9uKGNsYXNzTmFtZSkge1xuICAgICAgZ2V0RWxlbWVudCgpLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyBhIGNsYXNzIG5hbWUgZm9yIHRoZSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQG1ldGhvZCAoYXJnMSlcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtIHtTdHJpbmd9ICAgIHRoZSBjbGFzcyBuYW1lIHRvIGFkZC9yZW1vdmUsXG4gICAgICogQHJldHVybnMge30gICAgICAgIC0sXG4gICAgICogQHNpbmNlIDAuMC4wXG4gICAgICovXG4gICAgY29uc3QgdG9nZ2xlQ2xhc3MgPSBmdW5jdGlvbihjbGFzc05hbWUpIHtcbiAgICAgIGdldEVsZW1lbnQoKS5jbGFzc0xpc3QudG9nZ2xlKGNsYXNzTmFtZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgSFRNTCBjb250ZW50cyBvZiB0aGUgZWxlbWVudCxcbiAgICAgKlxuICAgICAqIEBtZXRob2QgKGFyZzEpXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgICB0aGUgaHRtbCBjb250ZW50cyB0byBhZGQsXG4gICAgICogQHJldHVybnMge30gICAgICAgIC0sXG4gICAgICogQHNpbmNlIDAuMC4wXG4gICAgICovXG4gICAgY29uc3QgaHRtbCA9IGZ1bmN0aW9uKGh0bWxzdHJpbmcpIHtcbiAgICAgIGlmIChodG1sc3RyaW5nKSB7XG4gICAgICAgIGdldEVsZW1lbnQoKS5pbm5lckhUTUwgPSBodG1sc3RyaW5nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKS5pbm5lckhUTUw7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgdGV4dCBjb250ZW50cyBvZiB0aGUgZWxlbWVudCxcbiAgICAgKlxuICAgICAqIEBtZXRob2QgKGFyZzEpXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgICB0aGUgdGV4dCBjb250ZW50cyB0byBhZGQsXG4gICAgICogQHJldHVybnMge30gICAgICAgIC0sXG4gICAgICogQHNpbmNlIDAuMC4wXG4gICAgICovXG4gICAgY29uc3QgdGV4dCA9IGZ1bmN0aW9uKHRleHRlKSB7XG4gICAgICBpZiAodGV4dGUpIHtcbiAgICAgICAgZ2V0RWxlbWVudCgpLnRleHRDb250ZW50ID0gdGV4dGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2V0RWxlbWVudCgpLnRleHRDb250ZW50O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHN0eWxlIGF0dHJpYnV0ZSBvZiB0aGUgZWxlbWVudCxcbiAgICAgKlxuICAgICAqIEBtZXRob2QgKGFyZzEsIGFyZzIpXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgICB0aGUgc3R5bGUgYXR0cmlidXRlLFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgICB0aGUgc3R5bGUgYXR0cmlidXRlIHZhbHVlLFxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9ICB1bmRlZmluZWQgb3IgdGhlIHN0eWxlIGF0dHJpYnV0ZSB2YWx1ZSxcbiAgICAgKiBAc2luY2UgMC4wLjNcbiAgICAgKi9cbiAgICBjb25zdCBjc3MgPSBmdW5jdGlvbihzdHlsZUF0dHIsIHZhbHVlKSB7XG4gICAgICBjb25zdCBhcnIgPSB0eXBlb2Ygc3R5bGVBdHRyID09PSAnc3RyaW5nJyA/IHN0eWxlQXR0ci5zcGxpdCgnLScpIDogW107XG4gICAgICBsZXQgYXR0ciA9ICcnO1xuXG4gICAgICAvLyBDb252ZXJ0IHN0eWxlIGF0dHJpYnV0ZSBuYW1lIHdpdGggJy0nIChleC46ICdmb250LXNpemUnIHRvICdmb250U2l6ZScpOlxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICBhdHRyICs9IGFycltpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhdHRyICs9IGFycltpXS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGFycltpXS5zbGljZSgxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIC8vIEdldCBhdHRyaWJ1dGU6XG4gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCkuc3R5bGVbYXR0cl07XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBhdHRyaWJ1dGU6XG4gICAgICBnZXRFbGVtZW50KCkuc3R5bGVbYXR0cl0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIHRoZSBjaGlsZHMgb2YgdGhlIGN1cnJlbnQgbm9kZS5cbiAgICAgKlxuICAgICAqIEBtZXRob2QgKClcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtIHt9ICAgICAgICAgIC0sXG4gICAgICogQHJldHVybnMge30gICAgICAgIC0sXG4gICAgICogQHNpbmNlIDAuMC40XG4gICAgICovXG4gICAgY29uc3QgZW1wdHkgPSBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBnZXRFbGVtZW50KCk7XG4gICAgICB3aGlsZSAobm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQobm9kZS5maXJzdENoaWxkKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBhbiBIVE1MIHN0cmluZyBhZnRlciB0aGUgbGFzdCBjaGlsZCBvZiB0aGUgY3VycmVudCBub2RlLlxuICAgICAqXG4gICAgICogQG1ldGhvZCAoYXJnMSlcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtIHtTdHJpbmd9ICAgIGFuIEhUTUwgc3RyaW5nLFxuICAgICAqIEByZXR1cm5zIHt9ICAgICAgICAtLFxuICAgICAqIEBzaW5jZSAwLjAuNFxuICAgICAqL1xuICAgIGNvbnN0IGFwcGVuZCA9IGZ1bmN0aW9uKGh0bWxzdHJpbmcpIHtcbiAgICAgIGdldEVsZW1lbnQoKS5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGh0bWxzdHJpbmcpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBjdXJyZW50IG5vZGUuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIChhcmcxLCBhcmcyKVxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gICAgdGhlIERPTSBldmVudCBzdHJpbmcsXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gIHRoZSBsaXN0bmVyIGZ1bmN0aW9uLFxuICAgICAqIEByZXR1cm5zIHt9ICAgICAgICAtLFxuICAgICAqIEBzaW5jZSAwLjAuNVxuICAgICAqL1xuICAgIGNvbnN0IG9uID0gZnVuY3Rpb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICBnZXRFbGVtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIGN1cnJlbnQgbm9kZS5cbiAgICAgKlxuICAgICAqIEBtZXRob2QgKGFyZzEsIGFyZzIpXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgICB0aGUgRE9NIGV2ZW50IHN0cmluZyxcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSAgdGhlIGxpc3RuZXIgZnVuY3Rpb24sXG4gICAgICogQHJldHVybnMge30gICAgICAgIC0sXG4gICAgICogQHNpbmNlIDAuMC41XG4gICAgICovXG4gICAgY29uc3Qgb2ZmID0gZnVuY3Rpb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICBnZXRFbGVtZW50KCkucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGdldEVsZW1lbnQoKSA/IGdldEVsZW1lbnQoKS5pZCA6IG51bGwsXG4gICAgICBnZXRFbGVtZW50LFxuICAgICAgZ2V0Q2xhc3NMaXN0LFxuICAgICAgYWRkQ2xhc3MsXG4gICAgICByZW1vdmVDbGFzcyxcbiAgICAgIHRvZ2dsZUNsYXNzLFxuICAgICAgaHRtbCxcbiAgICAgIHRleHQsXG4gICAgICBjc3MsXG4gICAgICBlbXB0eSxcbiAgICAgIGFwcGVuZCxcbiAgICAgIG9uLFxuICAgICAgb2ZmLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoZXMgZXZlbnQocykgdG8gdGhlIGdpdmVuIG5vZGUuXG4gICAqXG4gICAqIEBtZXRob2QgKGFyZzEsIGFyZzIpXG4gICAqIEBwdWJsaWNcbiAgICogQHBhcmFtIHtTdHJpbmd9ICAgIHRoZSBET00gZXZlbnQgbmFtZSxcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gIHRoZSBldmVudCBsaXN0ZW5lcixcbiAgICogQHJldHVybnMge0Z1bnRpb259IHJldHVybnMgdGhpcyxcbiAgICogQHNpbmNlIDAuMC41XG4gICAqL1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBldmVudHMoKSB7XG4gICAgLy8gSnVzdCB0byBhdm9pZCBlc2xpbnQgZXJyb3IhXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGVmaW5lZCB3ZWIgY29tcG9uZW50LlxuICAgKlxuICAgKiBAbWV0aG9kICgpXG4gICAqIEBwdWJsaWNcbiAgICogQHBhcmFtIHt9ICAgICAgICAgIC0sXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9ICByZXR1cm5zIHRoZSB3ZWIgY29tcG9uZW50LFxuICAgKiBAc2luY2UgMC4wLjBcbiAgICovXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gYDxkaXY+JHt0aGlzLmlkfTwvZGl2PmA7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2Vzc2VzIHRoZSB3ZWIgY29tcG9uZW50IHRvIGNvbnZlcnQgY2hpbGQocykgdG8gcGxhaW4gSFRNTC5cbiAgICpcbiAgICogQG1ldGhvZCAoKVxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge30gICAgICAgICAgLSxcbiAgICogQHJldHVybnMge1N0cmluZ30gIHJldHVybnMgdGhlIHdlYiBjb21wb25lbnQsXG4gICAqIEBzaW5jZSAwLjAuMFxuICAgKi9cbiAgZ2V0IHJlbmRlcmVkKCkge1xuICAgIGxldCB0O1xuICAgIC8vIEluaXRpYWxpemVzOlxuICAgIHRoaXMuZ2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgLy8gQWRkIGFuIHVuaXF1ZSBJRCB0byB0aGlzIGNvbXBvbmVudDpcbiAgICAvLyBsZXQgdCA9IHRoaXMucmVuZGVyKCkucmVwbGFjZSgvPGRpdj4vLCBgPGRpdiBpZD1cIiR7dGhpcy5pZH1cIj5gKTtcbiAgICBjb25zdCBjbyA9IHRoaXMucmVuZGVyKCk7XG4gICAgaWYgKGNvLm1hdGNoKC9eXFxzKjxkaXYvKSkge1xuICAgICAgdCA9IGNvLnJlcGxhY2UoL15cXHMqPGRpdi8sIGA8ZGl2IGlkPSBcIiR7dGhpcy5pZH1cImApO1xuICAgIH0gZWxzZSBpZiAoY28ubWF0Y2goL15cXHMqPGhlYWRlci8pKSB7XG4gICAgICB0ID0gY28ucmVwbGFjZSgvXlxccyo8aGVhZGVyLywgYDxoZWFkZXIgaWQ9IFwiJHt0aGlzLmlkfVwiYCk7XG4gICAgfSBlbHNlIGlmIChjby5tYXRjaCgvXlxccyo8Zm9vdGVyLykpIHtcbiAgICAgIHQgPSBjby5yZXBsYWNlKC9eXFxzKjxmb290ZXIvLCBgPGZvb3RlciBpZD0gXCIke3RoaXMuaWR9XCJgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdCA9IGNvO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNMaXN0KSB7XG4gICAgICAvLyBUaGlzIGNvbXBvbmVudCBpbmNsdWRlcyBjb21wb25lbnRzLCByZW5kZXIgdGhlbTpcbiAgICAgIHRoaXMuY29tcG9uZW50cyA9IHt9O1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuY0xpc3QpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGMgPSBuZXcgdGhpcy5jTGlzdFtrZXlzW2ldXSgpO1xuICAgICAgICB0ID0gdC5yZXBsYWNlKGtleXNbaV0sIGMucmVuZGVyZWQpO1xuICAgICAgICB0aGlzLmNvbXBvbmVudHNba2V5c1tpXS5yZXBsYWNlKC9bXmEtekEtejAtOV0vZywgJycpXSA9IGM7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFJldHVybiB0aGUgcmVuZGVyZWQgd2ViIGNvbXBvbmVudDpcbiAgICByZXR1cm4gdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgdGhlIHdlYiBjb21wb25lbnQgZXZlbnRzLlxuICAgKlxuICAgKiBAbWV0aG9kICgpXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7fSAgICAgICAgICAtLFxuICAgKiBAcmV0dXJucyB7fSAgICAgICAgLSxcbiAgICogQHNpbmNlIDAuMC41XG4gICAqL1xuICBnZXQgZXZlbnRlZCgpIHtcbiAgICB0aGlzLmV2ZW50cygpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbXBvbmVudDtcbiIsIi8qIGdsb2JhbCBkb2N1bWVudCAqL1xuLyogZXNsaW50IGluZGVudDogW1wiZXJyb3JcIiwgMiwgeyBcIlZhcmlhYmxlRGVjbGFyYXRvclwiOiB7IFwidmFyXCI6IDEsIFwibGV0XCI6IDEsIFwiY29uc3RcIjogMiB9IH1dICovXG4vKiBlc2xpbnQgb25lLXZhcjogMCwgbm8tcGFyYW0tcmVhc3NpZ246IDAsIG1heC1sZW46IFsxLCAxMzBdLFxuICBuby11bnVzZWQtZXhwcmVzc2lvbnM6IFtcImVycm9yXCIsIHsgXCJhbGxvd1Rlcm5hcnlcIjogdHJ1ZSB9XSwgbm8tdW5kZXJzY29yZS1kYW5nbGU6IDAsXG4gIG5vLXByb3RvOiAxLCBwcmVmZXItcmVzdC1wYXJhbXM6IDEgKi9cblxuLy8gLS0gVmVuZG9yIG1vZHVsZXNcblxuLy8gLS0gTG9jYWwgbW9kdWxlc1xuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuL2NvbXBvbmVudCc7XG5cbi8vIC0tIEdsb2JhbCBjb25zdGFudHMgKGluIHRoZSBzY29wZSBvZiB0aGlzIG1vZHVsZSlcblxuLy8gLS0gR2xvYmFsIHZhcmlhYmxlcyAoaW4gdGhlIHNjb3BlIG9mIHRoaXMgbW9kdWxlKVxuXG5cbi8vIC0tIFByaXZhdGUgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgbWF0Y2hpbmcgV2ViIENvbXBvbmVudC5cbiAqXG4gKiBAZnVuY3Rpb24gKClcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gICAgdGhlIHZpZXcgb2JqZWN0LFxuICogQHBhcmFtIHtTdHJpbmd9ICAgIHRoZSB0YWcgZGVmaW5pbmcgYSBXZWIgQ29tcG9uZW50XG4gKiBAcmV0dXJucyB7T2JqZWN0fSAgdGhlIHBhdGggb2YgdGhlIG1hdGNoaW5nIFdlYiBDb21wb25lbnQsXG4gKi9cbmNvbnN0IGV4cGxvcmUgPSBmdW5jdGlvbih2aWV3LCB0YWcpIHtcbiAgaWYgKHZpZXcuY0xpc3QgJiYgdmlldy5jTGlzdFt0YWddKSB7XG4gICAgcmV0dXJuIHZpZXc7XG4gIH1cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZpZXcpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAodmlld1trZXlzW2ldXS5jTGlzdCkge1xuICAgICAgaWYgKHZpZXdba2V5c1tpXV0uY0xpc3RbdGFnXSkge1xuICAgICAgICByZXR1cm4gdmlld1trZXlzW2ldXTtcbiAgICAgIH1cbiAgICAgIGlmICh2aWV3W2tleXNbaV1dLmNvbXBvbmVudHMpIHtcbiAgICAgICAgcmV0dXJuIGV4cGxvcmUodmlld1trZXlzW2ldXS5jb21wb25lbnRzLCB0YWcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogQXR0YWNoZXMgZXZlbnRzIHRvIHRoZSByZW5kZXJlZCBjb21wb25lbnRzLlxuICpcbiAqIEBmdW5jdGlvbiAoYXJnMSlcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gICAgdGhlIHZpZXcgb2JqZWN0LFxuICogQHJldHVybnMge30gICAgICAgIC0sXG4gKi9cbmNvbnN0IGF0dGFjaEV2ZW50cyA9IGZ1bmN0aW9uKHZpZXcpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gIGlmICh2aWV3LmNMaXN0KSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZpZXcuY0xpc3QpO1xuICAgIGxldCBmbjtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF2aWV3LmNvbXBvbmVudHMpIHtcbiAgICAgICAgLy8gRXh0cmFjdCBjb21wb25lbnRzIGF0IHRoZSBmaXJzdCBsZXZlbDpcbiAgICAgICAgZm4gPSB2aWV3W2tleXNbaV0ucmVwbGFjZSgvW15hLXpBLXowLTldL2csICcnKV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBFeHRyYWN0IGNvbXBvbmVudHMgYXQgbGV2ZWxzIG4gKyAxOlxuICAgICAgICBmbiA9IHZpZXcuY29tcG9uZW50c1trZXlzW2ldLnJlcGxhY2UoL1teYS16QS16MC05XS9nLCAnJyldO1xuICAgICAgfVxuICAgICAgLy8gUnVuIENvbXBvbmVudCBldmVudHMgZnVuY3Rpb246XG4gICAgICBmbi5ldmVudGVkO1xuICAgICAgLy8gUHJvY2VzcyBzdWIgY29tcG9uZW50cyByZWN1cnNpdmVseTpcbiAgICAgIGF0dGFjaEV2ZW50cyhmbik7XG4gICAgfVxuICB9XG59OyAvKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuXG4vKipcbiAqIENvZGUgcmV1c2VkIGZyb20gQmFiZWxcbiAqL1xuY29uc3QgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikge1xuICAgICAgICBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIHtcbiAgICAgIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICB9XG4gICAgaWYgKHN0YXRpY1Byb3BzKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIH1cbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH07XG59KCkpO1xuXG4vKipcbiAqIENvZGUgcmV1c2VkIGZyb20gQmFiZWxcbiAqL1xuY29uc3QgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gPSBmdW5jdGlvbihzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIGNhbGwgPT09ICdmdW5jdGlvbicpID8gY2FsbCA6IHNlbGY7XG59O1xuXG4vKipcbiAqIENvZGUgcmV1c2VkIGZyb20gQmFiZWxcbiAqL1xuY29uc3QgX2luaGVyaXRzID0gZnVuY3Rpb24oc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAnZnVuY3Rpb24nICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgJHt0eXBlb2Ygc3VwZXJDbGFzc31gKTtcbiAgfVxuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHN1YkNsYXNzLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9IH0pO1xuXG4gIGlmIChzdXBlckNsYXNzKSB7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG4gIH1cbn07XG5cbi8qKlxuICogQ29kZSByZXVzZWQgZnJvbSBCYWJlbFxuICovXG5jb25zdCBfY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbihpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpO1xuICB9XG59O1xuXG4vKipcbiAqIENvZGUgcmV1c2VkIGZyb20gQmFiZWxcbiAqL1xuY29uc3QgX3N1YkNsYXNzID0gZnVuY3Rpb24oU3VwZXJDbGFzcywgbSkge1xuICBmdW5jdGlvbiBTdWJDbGFzcygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3ViQ2xhc3MpO1xuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoU3ViQ2xhc3MuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihTdWJDbGFzcykpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG4gIF9pbmhlcml0cyhTdWJDbGFzcywgU3VwZXJDbGFzcyk7XG5cbiAgX2NyZWF0ZUNsYXNzKFN1YkNsYXNzLCBtKTtcblxuICByZXR1cm4gU3ViQ2xhc3M7XG59O1xuXG4vLyAtLSBQdWJsaWMgTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiogVGhpcyBsaWJyYXJ5IHJlbmRlcnMgdGhlIFZpZXcgaW4gdGhlIERPTS5cbipcbiogQG5hbWVzcGFjZSBWaXp1XG4qL1xuY29uc3QgVml6dSA9IHtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmVyc2lvbiBvZiB0aGlzIGxpYnJhcnkuXG4gICAqXG4gICAqIEBtZXRob2QgKClcbiAgICogQHB1YmxpY1xuICAgKiBAcGFyYW0ge30gICAgICAgICAgLSxcbiAgICogQHJldHVybnMge1N0cmluZ30gIHJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhpcyBsaWJyYXJ5LFxuICAgKi9cbiAgdmVyc2lvbigpIHtcbiAgICByZXR1cm4gJ3t7bGliOnZlcnNpb259fSc7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIFZpZXcgaW4gdGhlIERPTS5cbiAgICpcbiAgICogQG1ldGhvZCAoYXJnMSwgYXJnMiwgYXJnMylcbiAgICogQHB1YmxpY1xuICAgKiBAcGFyYW0ge1N0cmluZ30gICAgdGhlIGFnZ3JlZ2F0ZWQgd2ViIGNvbXBvbmVudHMsXG4gICAqIEBwYXJhbSB7T2JqZWN0fSAgICB0aGUgbGlzdCBvZiB3ZWIgY29tcG9uZW50cyBhbmQgdGhlaXIgcmVmZXJlbmNlLFxuICAgKiBAcGFyYW0ge09iamVjdH0gICAgdGhlIERPTSBlbGVtZW50IHdoZXJlIHRoZSB2aWV3ICh0aGUgYWdncmVnYXRlIG9mIHdlYiBjb21wb25lbnRzKSBpcyBpbnNlcnRlZCxcbiAgICogQHJldHVybnMge09iamVjdH0gIHJldHVybnMgdGhlIHZpZXcgb2JqZWN0LFxuICAgKiBAc2luY2UgMC4wLjBcbiAgICovXG4gIHJlbmRlcih0ZW1wbGF0ZSwgY0xpc3QsIGVsKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChjTGlzdCkgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gT2JqZWN0LmtleXMoY0xpc3QpIDogW11cbiAgICAgICAgLCB2aWV3ID0ge31cbiAgICAgICAgO1xuICAgIGxldCB0O1xuXG4gICAgLy8gUmV0dXJuIG51bGwgaWYgdGhlIHRlbXBsYXRlIGlzIG5vdCBhIHN0cmluZzpcbiAgICBpZiAodHlwZW9mIHRlbXBsYXRlICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gSWYgbm8gY29tcG9uZW50cywgcmVuZGVyIHRoZSB0ZW1wbGF0ZSBhcyBpczpcbiAgICBpZiAoIWNMaXN0KSB7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwuaW5uZXJIVE1MID0gdGVtcGxhdGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBWaXp1LnZkb21cbiAgICAgICAgICA/IChWaXp1LnZkb20ud2luZG93LmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MICs9IHRlbXBsYXRlKVxuICAgICAgICAgIDogKGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MICs9IHRlbXBsYXRlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRoaXMgdmlldyBpbmNsdWRlcyBjb21wb25lbnRzLCByZW5kZXIgdGhlbTpcbiAgICB0ID0gdGVtcGxhdGU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjID0gbmV3IGNMaXN0W2tleXNbaV1dKCk7XG4gICAgICB0ID0gdC5yZXBsYWNlKGtleXNbaV0sIGMucmVuZGVyZWQpO1xuICAgICAgdmlld1trZXlzW2ldLnJlcGxhY2UoL1teYS16QS16MC05XS9nLCAnJyldID0gYztcbiAgICB9XG4gICAgLy8gQXR0YWNoIGNMaXN0OlxuICAgIHZpZXcuY0xpc3QgPSBrZXlzLmxlbmd0aCA+IDAgPyBjTGlzdCA6IG51bGw7XG5cbiAgICAvLyBGaWxsIHRoZSBET006XG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC5pbm5lckhUTUwgPSB0O1xuICAgIH0gZWxzZSB7XG4gICAgICBlbCA9IFZpenUudmRvbSA/IFZpenUudmRvbS53aW5kb3cuZG9jdW1lbnQuYm9keSA6IGRvY3VtZW50LmJvZHk7XG4gICAgICBlbC5pbm5lckhUTUwgPSArdDtcbiAgICB9XG5cbiAgICAvLyBBdHRhY2ggZXZlbnQocylcbiAgICAvLyBwYXJzZSBhbGwgY29tcG9uZW50cyBhbmQgZm9yIGVhY2ggY29tcG9uZW50IGV4ZWN1dGUgZXZlbnRlZCFcbiAgICBhdHRhY2hFdmVudHModmlldyk7XG5cbiAgICAvLyBBdHRhY2ggcGFyZW50IGVsZW1lbnQ6XG4gICAgdmlldy5lbCA9IGVsO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByZW5kZXJlZCBvYmplY3QgKHdpdGggYSByZWZlcmVuY2UgdG8gYWxsIHRoZSB3ZWIgY29tcG9uZW50cyk6XG4gICAgcmV0dXJuIHZpZXc7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGEgY29tcG9uZW50IHdpdGggYW5vdGhlciBjb21wb25lbnQgaGF2aW5nIHRoZSBzYW1lIHRhZy5cbiAgICpcbiAgICogQG1ldGhvZCAoYXJnMSwgYXJnMilcbiAgICogQHB1YmxpY1xuICAgKiBAcGFyYW0ge09iamVjdH0gICAgdGhlIHZpZXcgb2JqZWN0LFxuICAgKiBAcGFyYW0ge09iamVjdH0gICAgdGhlIG5ldyBjb21wb25lbnQgKHsgJzxBYWEgLz4nOiAnbmV3IGNsYXNzJyB9KSxcbiAgICogQHJldHVybnMge30gICAgICAgIC0sXG4gICAqIEBzaW5jZSAwLjAuMFxuICAgKi9cbiAgcmVwbGFjZSh2aWV3LCBjb21wb25lbnQpIHtcbiAgICBsZXQgaWRcbiAgICAgICwgdHlwZVxuICAgICAgO1xuXG4gICAgLy8gQ2hlY2sgdGhhdCB2aWV3IGlzIGFuIG9iamVjdCB3aXRoLCBhdCBsZWFzdCwgdGhlIHByb3BlcnRpZXMgY0xpc3QgYW5kIGVsOlxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmlldykgIT09ICdbb2JqZWN0IE9iamVjdF0nIHx8ICF2aWV3LmNMaXN0IHx8ICF2aWV3LmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgdGhhdCBjb21wb25lbnQgaXMgYW4gb2JqZWN0OlxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoY29tcG9uZW50KSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIHRoZSBuZXcgY29tcG9uZW50OlxuICAgIGNvbnN0IG5ld2N0YWcgPSBPYmplY3Qua2V5cyhjb21wb25lbnQpWzBdO1xuICAgIGNvbnN0IG5ld2NuYW1lID0gbmV3Y3RhZy5yZXBsYWNlKC9bXmEtekEtejAtOV0vZywgJycpO1xuICAgIGNvbnN0IG5ld2MgPSBuZXcgY29tcG9uZW50W25ld2N0YWddKCk7XG5cbiAgICAvLyBDaGVjayBpZiBhIGNvbXBvbmVudCB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHZpZXc6XG4gICAgY29uc3QgcGF0aCA9IGV4cGxvcmUodmlldywgbmV3Y3RhZyk7XG4gICAgaWYgKHBhdGgpIHtcbiAgICAgIC8vIEdldCBpdHMgaWQgYW5kIHJlbW92ZSBpdDpcbiAgICAgIGlmIChwYXRoW25ld2NuYW1lXSkge1xuICAgICAgICBpZCA9IHBhdGhbbmV3Y25hbWVdLmlkO1xuICAgICAgICBwYXRoW25ld2NuYW1lXSA9IG51bGw7XG4gICAgICAgIHR5cGUgPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWQgPSBwYXRoLmNvbXBvbmVudHNbbmV3Y25hbWVdLmlkO1xuICAgICAgICBwYXRoLmNvbXBvbmVudHNbbmV3Y25hbWVdID0gbnVsbDtcbiAgICAgICAgdHlwZSA9IDI7XG4gICAgICB9XG4gICAgICBwYXRoLmNMaXN0W25ld2N0YWddID0gbnVsbDtcblxuICAgICAgLy8gR2V0IGl0cyBpZCBhbmQgY2xlYXIgaXQ6XG4gICAgICBjb25zdCB3cmFwcGVyID0gVml6dS52ZG9tXG4gICAgICAgID8gVml6dS52ZG9tLndpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgICAgICA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICBjb25zdCBvbGROb2RlID0gVml6dS52ZG9tXG4gICAgICAgID8gVml6dS52ZG9tLndpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgICAgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG5cbiAgICAgIHdyYXBwZXIuaW5uZXJIVE1MID0gbmV3Yy5yZW5kZXJlZDtcbiAgICAgIG9sZE5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQod3JhcHBlci5maXJzdENoaWxkLCBvbGROb2RlKTtcblxuICAgICAgLy8gQXR0YWNoIHRoZSBuZXcgbm9kZSB0byB2aWV3OlxuICAgICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgICAgcGF0aFtuZXdjbmFtZV0gPSBuZXdjO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0aC5jb21wb25lbnRzW25ld2NuYW1lXSA9IG5ld2M7XG4gICAgICB9XG4gICAgICBwYXRoLmNMaXN0W25ld2N0YWddID0gY29tcG9uZW50W25ld2N0YWddO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogRXh0ZW5kcyB0aGUgY2xhc3MgQ29tcG9uZW50LlxuICAgKlxuICAgKiBAbWV0aG9kIChhcmcxKVxuICAgKiBAcHVibGljXG4gICAqIEBwYXJhbSB7T2JqZWN0fSAgICB0aGUgbWV0aG9kcyB0byBhZGQgdG8gQ29tcG9uZW50LFxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSAgcmV0dXJucyB0aGUgZXh0ZW5kZWQgY2xhc3MgY29tcG9uZW50LFxuICAgKiBAc2luY2UgMC4wLjNcbiAgICovXG4gIGNyZWF0ZUNsYXNzKG1ldGhvZHMpIHtcbiAgICAvLyBDaGVjayB0aGF0IG1ldGhvZHMgaXMgYW4gb2JqZWN0OlxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobWV0aG9kcykgIT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IGtleXM6XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG1ldGhvZHMpO1xuICAgIGNvbnN0IG8gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG8ucHVzaCh7XG4gICAgICAgIGtleToga2V5c1tpXSxcbiAgICAgICAgdmFsdWU6IG1ldGhvZHNba2V5c1tpXV0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3N1YkNsYXNzKENvbXBvbmVudCwgbyk7XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBWaXp1O1xuIl19"} \ No newline at end of file diff --git a/package.json b/package.json index a36f6c0..1d69eee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vizu", - "version": "0.0.4", + "version": "0.0.5", "description": "A Javascript View library for building web and hybrid mobile applications", "bin": {}, "main": "_dist/vizu-min.js", diff --git a/src/component.js b/src/component.js index ba1e73b..1d33995 100644 --- a/src/component.js +++ b/src/component.js @@ -237,6 +237,34 @@ class Component { getElement().insertAdjacentHTML('beforeend', htmlstring); }; + /** + * Attachs an event listener to the current node. + * + * @method (arg1, arg2) + * @public + * @param {String} the DOM event string, + * @param {Function} the listner function, + * @returns {} -, + * @since 0.0.5 + */ + const on = function(event, listener) { + getElement().addEventListener(event, listener); + }; + + /** + * Removes an event listener from the current node. + * + * @method (arg1, arg2) + * @public + * @param {String} the DOM event string, + * @param {Function} the listner function, + * @returns {} -, + * @since 0.0.5 + */ + const off = function(event, listener) { + getElement().removeEventListener(event, listener); + }; + return { id: getElement() ? getElement().id : null, getElement, @@ -249,9 +277,27 @@ class Component { css, empty, append, + on, + off, }; } + /** + * Attaches event(s) to the given node. + * + * @method (arg1, arg2) + * @public + * @param {String} the DOM event name, + * @param {Function} the event listener, + * @returns {Funtion} returns this, + * @since 0.0.5 + */ + /* istanbul ignore next */ + events() { + // Just to avoid eslint error! + return this; + } + /** * Returns the defined web component. * @@ -270,7 +316,7 @@ class Component { * Processes the web component to convert child(s) to plain HTML. * * @method () - * @public + * @private * @param {} -, * @returns {String} returns the web component, * @since 0.0.0 @@ -305,6 +351,19 @@ class Component { // Return the rendered web component: return t; } + + /** + * Processes the web component events. + * + * @method () + * @private + * @param {} -, + * @returns {} -, + * @since 0.0.5 + */ + get evented() { + this.events(); + } } export default Component; diff --git a/src/vizu.js b/src/vizu.js index 817bd1d..49fcfd5 100644 --- a/src/vizu.js +++ b/src/vizu.js @@ -43,6 +43,35 @@ const explore = function(view, tag) { return null; }; +/** + * Attaches events to the rendered components. + * + * @function (arg1) + * @private + * @param {Object} the view object, + * @returns {} -, + */ +const attachEvents = function(view) { + /* eslint-disable no-unused-expressions */ + if (view.cList) { + const keys = Object.keys(view.cList); + let fn; + + for (let i = 0; i < keys.length; i++) { + if (!view.components) { + // Extract components at the first level: + fn = view[keys[i].replace(/[^a-zA-z0-9]/g, '')]; + } else { + // Extract components at levels n + 1: + fn = view.components[keys[i].replace(/[^a-zA-z0-9]/g, '')]; + } + // Run Component events function: + fn.evented; + // Process sub components recursively: + attachEvents(fn); + } + } +}; /* eslint-enable no-unused-expressions */ /** * Code reused from Babel @@ -199,6 +228,11 @@ const Vizu = { el = Vizu.vdom ? Vizu.vdom.window.document.body : document.body; el.innerHTML = +t; } + + // Attach event(s) + // parse all components and for each component execute evented! + attachEvents(view); + // Attach parent element: view.el = el; diff --git a/test/main.js b/test/main.js index 1e0dc88..a7db622 100644 --- a/test/main.js +++ b/test/main.js @@ -46,6 +46,7 @@ const HTML = `
+
diff --git a/test/testvizucomponent.js b/test/testvizucomponent.js index faf0735..341165f 100644 --- a/test/testvizucomponent.js +++ b/test/testvizucomponent.js @@ -29,6 +29,29 @@ class Ccc extends Component { } } +class Ddd extends Component { + getInitialState() { + this.props.options.title = 'Hello!'; + } + + events() { + const listener = function() { + // + }; + this.$('.plus').on('click', listener); + this.$('.plus').off('click', listener); + } + + render() { + return ` +
+

${this.props.options.title}

+ +
+ `; + } +} + // -- Main export default function(dom) { describe('Test the method Component.$().id:', () => { @@ -161,4 +184,16 @@ export default function(dom) { expect(view.Ccc.$().getElement().lastChild.textContent).to.be.equal('Hello!'); }); }); + + // This should be improved! + describe('Test the methods Component.$().on() and Component.$().off():', () => { + Vizu.render( + '', + { '': Ddd }, + dom.window.document.getElementById('app47'), + ); + it('Expects the component "Ddd" to be rendered.', () => { + expect(true).to.be.true; + }); + }); }