/******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = "./src/index.ts"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./node_modules/@polymer/lit-element/lit-element.js": /*!**********************************************************!*\ !*** ./node_modules/@polymer/lit-element/lit-element.js ***! \**********************************************************/ /*! exports provided: html, svg, renderAttributes, classString, styleString, LitElement */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "renderAttributes", function() { return renderAttributes; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "classString", function() { return classString; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "styleString", function() { return styleString; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LitElement", function() { return LitElement; }); /* harmony import */ var _polymer_polymer_lib_mixins_properties_mixin_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @polymer/polymer/lib/mixins/properties-mixin.js */ "./node_modules/@polymer/polymer/lib/mixins/properties-mixin.js"); /* harmony import */ var _polymer_polymer_lib_utils_case_map_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @polymer/polymer/lib/utils/case-map.js */ "./node_modules/@polymer/polymer/lib/utils/case-map.js"); /* harmony import */ var lit_html_lib_shady_render_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lit-html/lib/shady-render.js */ "./node_modules/lit-html/lib/shady-render.js"); /* harmony import */ var lit_html_lib_lit_extended_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lit-html/lib/lit-extended.js */ "./node_modules/lit-html/lib/lit-extended.js"); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "html", function() { return lit_html_lib_lit_extended_js__WEBPACK_IMPORTED_MODULE_3__["html"]; }); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "svg", function() { return lit_html_lib_lit_extended_js__WEBPACK_IMPORTED_MODULE_3__["svg"]; }); /** * Renders attributes to the given element based on the `attrInfo` object where * boolean values are added/removed as attributes. * @param element Element on which to set attributes. * @param attrInfo Object describing attributes. */ function renderAttributes(element, attrInfo) { for (const a in attrInfo) { const v = attrInfo[a] === true ? '' : attrInfo[a]; if (v || v === '' || v === 0) { if (element.getAttribute(a) !== v) { element.setAttribute(a, String(v)); } } else if (element.hasAttribute(a)) { element.removeAttribute(a); } } } /** * Returns a string of css class names formed by taking the properties * in the `classInfo` object and appending the property name to the string of * class names if the property value is truthy. * @param classInfo */ function classString(classInfo) { const o = []; for (const name in classInfo) { const v = classInfo[name]; if (v) { o.push(name); } } return o.join(' '); } /** * Returns a css style string formed by taking the properties in the `styleInfo` * object and appending the property name (dash-cased) colon the * property value. Properties are separated by a semi-colon. * @param styleInfo */ function styleString(styleInfo) { const o = []; for (const name in styleInfo) { const v = styleInfo[name]; if (v || v === 0) { o.push(`${Object(_polymer_polymer_lib_utils_case_map_js__WEBPACK_IMPORTED_MODULE_1__["camelToDashCase"])(name)}: ${v}`); } } return o.join('; '); } class LitElement extends Object(_polymer_polymer_lib_mixins_properties_mixin_js__WEBPACK_IMPORTED_MODULE_0__["PropertiesMixin"])(HTMLElement) { constructor() { super(...arguments); this.__renderComplete = null; this.__resolveRenderComplete = null; this.__isInvalid = false; this.__isChanging = false; } /** * Override which sets up element rendering by calling* `_createRoot` * and `_firstRendered`. */ ready() { this._root = this._createRoot(); super.ready(); this._firstRendered(); } connectedCallback() { if (window.ShadyCSS && this._root) { window.ShadyCSS.styleElement(this); } super.connectedCallback(); } /** * Called after the element DOM is rendered for the first time. * Implement to perform tasks after first rendering like capturing a * reference to a static node which must be directly manipulated. * This should not be commonly needed. For tasks which should be performed * before first render, use the element constructor. */ _firstRendered() { } /** * Implement to customize where the element's template is rendered by * returning an element into which to render. By default this creates * a shadowRoot for the element. To render into the element's childNodes, * return `this`. * @returns {Element|DocumentFragment} Returns a node into which to render. */ _createRoot() { return this.attachShadow({ mode: 'open' }); } /** * Override which returns the value of `_shouldRender` which users * should implement to control rendering. If this method returns false, * _propertiesChanged will not be called and no rendering will occur even * if property values change or `requestRender` is called. * @param _props Current element properties * @param _changedProps Changing element properties * @param _prevProps Previous element properties * @returns {boolean} Default implementation always returns true. */ _shouldPropertiesChange(_props, _changedProps, _prevProps) { const shouldRender = this._shouldRender(_props, _changedProps, _prevProps); if (!shouldRender && this.__resolveRenderComplete) { this.__resolveRenderComplete(false); } return shouldRender; } /** * Implement to control if rendering should occur when property values * change or `requestRender` is called. By default, this method always * returns true, but this can be customized as an optimization to avoid * rendering work when changes occur which should not be rendered. * @param _props Current element properties * @param _changedProps Changing element properties * @param _prevProps Previous element properties * @returns {boolean} Default implementation always returns true. */ _shouldRender(_props, _changedProps, _prevProps) { return true; } /** * Override which performs element rendering by calling * `_render`, `_applyRender`, and finally `_didRender`. * @param props Current element properties * @param changedProps Changing element properties * @param prevProps Previous element properties */ _propertiesChanged(props, changedProps, prevProps) { super._propertiesChanged(props, changedProps, prevProps); const result = this._render(props); if (result && this._root !== undefined) { this._applyRender(result, this._root); } this._didRender(props, changedProps, prevProps); if (this.__resolveRenderComplete) { this.__resolveRenderComplete(true); } } _flushProperties() { this.__isChanging = true; this.__isInvalid = false; super._flushProperties(); this.__isChanging = false; } /** * Override which warns when a user attempts to change a property during * the rendering lifecycle. This is an anti-pattern and should be avoided. * @param property {string} * @param value {any} * @param old {any} */ // tslint:disable-next-line no-any _shouldPropertyChange(property, value, old) { const change = super._shouldPropertyChange(property, value, old); if (change && this.__isChanging) { console.trace(`Setting properties in response to other properties changing ` + `considered harmful. Setting '${property}' from ` + `'${this._getProperty(property)}' to '${value}'.`); } return change; } /** * Implement to describe the DOM which should be rendered in the element. * Ideally, the implementation is a pure function using only props to describe * the element template. The implementation must return a `lit-html` * TemplateResult. By default this template is rendered into the element's * shadowRoot. This can be customized by implementing `_createRoot`. This * method must be implemented. * @param {*} _props Current element properties * @returns {TemplateResult} Must return a lit-html TemplateResult. */ _render(_props) { throw new Error('_render() not implemented'); } /** * Renders the given lit-html template `result` into the given `node`. * Implement to customize the way rendering is applied. This is should not * typically be needed and is provided for advanced use cases. * @param result {TemplateResult} `lit-html` template result to render * @param node {Element|DocumentFragment} node into which to render */ _applyRender(result, node) { Object(lit_html_lib_shady_render_js__WEBPACK_IMPORTED_MODULE_2__["render"])(result, node, this.localName); } /** * Called after element DOM has been rendered. Implement to * directly control rendered DOM. Typically this is not needed as `lit-html` * can be used in the `_render` method to set properties, attributes, and * event listeners. However, it is sometimes useful for calling methods on * rendered elements, like calling `focus()` on an element to focus it. * @param _props Current element properties * @param _changedProps Changing element properties * @param _prevProps Previous element properties */ _didRender(_props, _changedProps, _prevProps) { } /** * Call to request the element to asynchronously re-render regardless * of whether or not any property changes are pending. */ requestRender() { this._invalidateProperties(); } /** * Override which provides tracking of invalidated state. */ _invalidateProperties() { this.__isInvalid = true; super._invalidateProperties(); } /** * Returns a promise which resolves after the element next renders. * The promise resolves to `true` if the element rendered and `false` if the * element did not render. * This is useful when users (e.g. tests) need to react to the rendered state * of the element after a change is made. * This can also be useful in event handlers if it is desireable to wait * to send an event until after rendering. If possible implement the * `_didRender` method to directly respond to rendering within the * rendering lifecycle. */ get renderComplete() { if (!this.__renderComplete) { this.__renderComplete = new Promise((resolve) => { this.__resolveRenderComplete = (value) => { this.__resolveRenderComplete = this.__renderComplete = null; resolve(value); }; }); if (!this.__isInvalid && this.__resolveRenderComplete) { Promise.resolve().then(() => this.__resolveRenderComplete(false)); } } return this.__renderComplete; } } //# sourceMappingURL=lit-element.js.map /***/ }), /***/ "./node_modules/@polymer/polymer/lib/mixins/properties-changed.js": /*!************************************************************************!*\ !*** ./node_modules/@polymer/polymer/lib/mixins/properties-changed.js ***! \************************************************************************/ /*! exports provided: PropertiesChanged */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PropertiesChanged", function() { return PropertiesChanged; }); /* harmony import */ var _utils_boot_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/boot.js */ "./node_modules/@polymer/polymer/lib/utils/boot.js"); /* harmony import */ var _utils_boot_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_utils_boot_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _utils_mixin_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/mixin.js */ "./node_modules/@polymer/polymer/lib/utils/mixin.js"); /* harmony import */ var _utils_async_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/async.js */ "./node_modules/@polymer/polymer/lib/utils/async.js"); /** @license Copyright (c) 2017 The Polymer Project Authors. All rights reserved. This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ /** @const {!AsyncInterface} */ const microtask = _utils_async_js__WEBPACK_IMPORTED_MODULE_2__["microTask"]; /** * Element class mixin that provides basic meta-programming for creating one * or more property accessors (getter/setter pair) that enqueue an async * (batched) `_propertiesChanged` callback. * * For basic usage of this mixin, call `MyClass.createProperties(props)` * once at class definition time to create property accessors for properties * named in props, implement `_propertiesChanged` to react as desired to * property changes, and implement `static get observedAttributes()` and * include lowercase versions of any property names that should be set from * attributes. Last, call `this._enableProperties()` in the element's * `connectedCallback` to enable the accessors. * * @mixinFunction * @polymer * @summary Element class mixin for reacting to property changes from * generated property accessors. */ const PropertiesChanged = Object(_utils_mixin_js__WEBPACK_IMPORTED_MODULE_1__["dedupingMixin"])( /** * @template T * @param {function(new:T)} superClass Class to apply mixin to. * @return {function(new:T)} superClass with mixin applied. */ (superClass) => { /** * @polymer * @mixinClass * @implements {Polymer_PropertiesChanged} * @unrestricted */ class PropertiesChanged extends superClass { /** * Creates property accessors for the given property names. * @param {!Object} props Object whose keys are names of accessors. * @return {void} * @protected */ static createProperties(props) { const proto = this.prototype; for (let prop in props) { // don't stomp an existing accessor if (!(prop in proto)) { proto._createPropertyAccessor(prop); } } } /** * Returns an attribute name that corresponds to the given property. * The attribute name is the lowercased property name. Override to * customize this mapping. * @param {string} property Property to convert * @return {string} Attribute name corresponding to the given property. * * @protected */ static attributeNameForProperty(property) { return property.toLowerCase(); } /** * Override point to provide a type to which to deserialize a value to * a given property. * @param {string} name Name of property * * @protected */ static typeForProperty(name) { } //eslint-disable-line no-unused-vars /** * Creates a setter/getter pair for the named property with its own * local storage. The getter returns the value in the local storage, * and the setter calls `_setProperty`, which updates the local storage * for the property and enqueues a `_propertiesChanged` callback. * * This method may be called on a prototype or an instance. Calling * this method may overwrite a property value that already exists on * the prototype/instance by creating the accessor. * * @param {string} property Name of the property * @param {boolean=} readOnly When true, no setter is created; the * protected `_setProperty` function must be used to set the property * @return {void} * @protected * @override */ _createPropertyAccessor(property, readOnly) { this._addPropertyToAttributeMap(property); if (!this.hasOwnProperty('__dataHasAccessor')) { this.__dataHasAccessor = Object.assign({}, this.__dataHasAccessor); } if (!this.__dataHasAccessor[property]) { this.__dataHasAccessor[property] = true; this._definePropertyAccessor(property, readOnly); } } /** * Adds the given `property` to a map matching attribute names * to property names, using `attributeNameForProperty`. This map is * used when deserializing attribute values to properties. * * @param {string} property Name of the property * @override */ _addPropertyToAttributeMap(property) { if (!this.hasOwnProperty('__dataAttributes')) { this.__dataAttributes = Object.assign({}, this.__dataAttributes); } if (!this.__dataAttributes[property]) { const attr = this.constructor.attributeNameForProperty(property); this.__dataAttributes[attr] = property; } } /** * Defines a property accessor for the given property. * @param {string} property Name of the property * @param {boolean=} readOnly When true, no setter is created * @return {void} * @override */ _definePropertyAccessor(property, readOnly) { Object.defineProperty(this, property, { /* eslint-disable valid-jsdoc */ /** @this {PropertiesChanged} */ get() { return this._getProperty(property); }, /** @this {PropertiesChanged} */ set: readOnly ? function () {} : function (value) { this._setProperty(property, value); } /* eslint-enable */ }); } constructor() { super(); this.__dataEnabled = false; this.__dataReady = false; this.__dataInvalid = false; this.__data = {}; this.__dataPending = null; this.__dataOld = null; this.__dataInstanceProps = null; this.__serializing = false; this._initializeProperties(); } /** * Lifecycle callback called when properties are enabled via * `_enableProperties`. * * Users may override this function to implement behavior that is * dependent on the element having its property data initialized, e.g. * from defaults (initialized from `constructor`, `_initializeProperties`), * `attributeChangedCallback`, or values propagated from host e.g. via * bindings. `super.ready()` must be called to ensure the data system * becomes enabled. * * @return {void} * @public * @override */ ready() { this.__dataReady = true; this._flushProperties(); } /** * Initializes the local storage for property accessors. * * Provided as an override point for performing any setup work prior * to initializing the property accessor system. * * @return {void} * @protected * @override */ _initializeProperties() { // Capture instance properties; these will be set into accessors // during first flush. Don't set them here, since we want // these to overwrite defaults/constructor assignments for (let p in this.__dataHasAccessor) { if (this.hasOwnProperty(p)) { this.__dataInstanceProps = this.__dataInstanceProps || {}; this.__dataInstanceProps[p] = this[p]; delete this[p]; } } } /** * Called at ready time with bag of instance properties that overwrote * accessors when the element upgraded. * * The default implementation sets these properties back into the * setter at ready time. This method is provided as an override * point for customizing or providing more efficient initialization. * * @param {Object} props Bag of property values that were overwritten * when creating property accessors. * @return {void} * @protected * @override */ _initializeInstanceProperties(props) { Object.assign(this, props); } /** * Updates the local storage for a property (via `_setPendingProperty`) * and enqueues a `_proeprtiesChanged` callback. * * @param {string} property Name of the property * @param {*} value Value to set * @return {void} * @protected * @override */ _setProperty(property, value) { if (this._setPendingProperty(property, value)) { this._invalidateProperties(); } } /** * Returns the value for the given property. * @param {string} property Name of property * @return {*} Value for the given property * @protected * @override */ _getProperty(property) { return this.__data[property]; } /* eslint-disable no-unused-vars */ /** * Updates the local storage for a property, records the previous value, * and adds it to the set of "pending changes" that will be passed to the * `_propertiesChanged` callback. This method does not enqueue the * `_propertiesChanged` callback. * * @param {string} property Name of the property * @param {*} value Value to set * @param {boolean=} ext Not used here; affordance for closure * @return {boolean} Returns true if the property changed * @protected * @override */ _setPendingProperty(property, value, ext) { let old = this.__data[property]; let changed = this._shouldPropertyChange(property, value, old); if (changed) { if (!this.__dataPending) { this.__dataPending = {}; this.__dataOld = {}; } // Ensure old is captured from the last turn if (this.__dataOld && !(property in this.__dataOld)) { this.__dataOld[property] = old; } this.__data[property] = value; this.__dataPending[property] = value; } return changed; } /* eslint-enable */ /** * Marks the properties as invalid, and enqueues an async * `_propertiesChanged` callback. * * @return {void} * @protected * @override */ _invalidateProperties() { if (!this.__dataInvalid && this.__dataReady) { this.__dataInvalid = true; microtask.run(() => { if (this.__dataInvalid) { this.__dataInvalid = false; this._flushProperties(); } }); } } /** * Call to enable property accessor processing. Before this method is * called accessor values will be set but side effects are * queued. When called, any pending side effects occur immediately. * For elements, generally `connectedCallback` is a normal spot to do so. * It is safe to call this method multiple times as it only turns on * property accessors once. * * @return {void} * @protected * @override */ _enableProperties() { if (!this.__dataEnabled) { this.__dataEnabled = true; if (this.__dataInstanceProps) { this._initializeInstanceProperties(this.__dataInstanceProps); this.__dataInstanceProps = null; } this.ready(); } } /** * Calls the `_propertiesChanged` callback with the current set of * pending changes (and old values recorded when pending changes were * set), and resets the pending set of changes. Generally, this method * should not be called in user code. * * @return {void} * @protected * @override */ _flushProperties() { const props = this.__data; const changedProps = this.__dataPending; const old = this.__dataOld; if (this._shouldPropertiesChange(props, changedProps, old)) { this.__dataPending = null; this.__dataOld = null; this._propertiesChanged(props, changedProps, old); } } /** * Called in `_flushProperties` to determine if `_propertiesChanged` * should be called. The default implementation returns true if * properties are pending. Override to customize when * `_propertiesChanged` is called. * @param {!Object} currentProps Bag of all current accessor values * @param {?Object} changedProps Bag of properties changed since the last * call to `_propertiesChanged` * @param {?Object} oldProps Bag of previous values for each property * in `changedProps` * @return {boolean} true if changedProps is truthy * @override */ _shouldPropertiesChange(currentProps, changedProps, oldProps) { // eslint-disable-line no-unused-vars return Boolean(changedProps); } /** * Callback called when any properties with accessors created via * `_createPropertyAccessor` have been set. * * @param {!Object} currentProps Bag of all current accessor values * @param {?Object} changedProps Bag of properties changed since the last * call to `_propertiesChanged` * @param {?Object} oldProps Bag of previous values for each property * in `changedProps` * @return {void} * @protected * @override */ _propertiesChanged(currentProps, changedProps, oldProps) { // eslint-disable-line no-unused-vars } /** * Method called to determine whether a property value should be * considered as a change and cause the `_propertiesChanged` callback * to be enqueued. * * The default implementation returns `true` if a strict equality * check fails. The method always returns false for `NaN`. * * Override this method to e.g. provide stricter checking for * Objects/Arrays when using immutable patterns. * * @param {string} property Property name * @param {*} value New property value * @param {*} old Previous property value * @return {boolean} Whether the property should be considered a change * and enqueue a `_proeprtiesChanged` callback * @protected * @override */ _shouldPropertyChange(property, value, old) { return ( // Strict equality check (old !== value && // This ensures (old==NaN, value==NaN) always returns false (old === old || value === value)) ); } /** * Implements native Custom Elements `attributeChangedCallback` to * set an attribute value to a property via `_attributeToProperty`. * * @param {string} name Name of attribute that changed * @param {?string} old Old attribute value * @param {?string} value New attribute value * @param {?string} namespace Attribute namespace. * @return {void} * @suppress {missingProperties} Super may or may not implement the callback * @override */ attributeChangedCallback(name, old, value, namespace) { if (old !== value) { this._attributeToProperty(name, value); } if (super.attributeChangedCallback) { super.attributeChangedCallback(name, old, value, namespace); } } /** * Deserializes an attribute to its associated property. * * This method calls the `_deserializeValue` method to convert the string to * a typed value. * * @param {string} attribute Name of attribute to deserialize. * @param {?string} value of the attribute. * @param {*=} type type to deserialize to, defaults to the value * returned from `typeForProperty` * @return {void} * @override */ _attributeToProperty(attribute, value, type) { if (!this.__serializing) { const map = this.__dataAttributes; const property = map && map[attribute] || attribute; this[property] = this._deserializeValue(value, type || this.constructor.typeForProperty(property)); } } /** * Serializes a property to its associated attribute. * * @suppress {invalidCasts} Closure can't figure out `this` is an element. * * @param {string} property Property name to reflect. * @param {string=} attribute Attribute name to reflect to. * @param {*=} value Property value to refect. * @return {void} * @override */ _propertyToAttribute(property, attribute, value) { this.__serializing = true; value = (arguments.length < 3) ? this[property] : value; this._valueToNodeAttribute(/** @type {!HTMLElement} */(this), value, attribute || this.constructor.attributeNameForProperty(property)); this.__serializing = false; } /** * Sets a typed value to an HTML attribute on a node. * * This method calls the `_serializeValue` method to convert the typed * value to a string. If the `_serializeValue` method returns `undefined`, * the attribute will be removed (this is the default for boolean * type `false`). * * @param {Element} node Element to set attribute to. * @param {*} value Value to serialize. * @param {string} attribute Attribute name to serialize to. * @return {void} * @override */ _valueToNodeAttribute(node, value, attribute) { const str = this._serializeValue(value); if (str === undefined) { node.removeAttribute(attribute); } else { node.setAttribute(attribute, str); } } /** * Converts a typed JavaScript value to a string. * * This method is called when setting JS property values to * HTML attributes. Users may override this method to provide * serialization for custom types. * * @param {*} value Property value to serialize. * @return {string | undefined} String serialized from the provided * property value. * @override */ _serializeValue(value) { switch (typeof value) { case 'boolean': return value ? '' : undefined; default: return value != null ? value.toString() : undefined; } } /** * Converts a string to a typed JavaScript value. * * This method is called when reading HTML attribute values to * JS properties. Users may override this method to provide * deserialization for custom `type`s. Types for `Boolean`, `String`, * and `Number` convert attributes to the expected types. * * @param {?string} value Value to deserialize. * @param {*=} type Type to deserialize the string to. * @return {*} Typed value deserialized from the provided string. * @override */ _deserializeValue(value, type) { switch (type) { case Boolean: return (value !== null); case Number: return Number(value); default: return value; } } } return PropertiesChanged; }); /***/ }), /***/ "./node_modules/@polymer/polymer/lib/mixins/properties-mixin.js": /*!**********************************************************************!*\ !*** ./node_modules/@polymer/polymer/lib/mixins/properties-mixin.js ***! \**********************************************************************/ /*! exports provided: PropertiesMixin */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PropertiesMixin", function() { return PropertiesMixin; }); /* harmony import */ var _utils_boot_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/boot.js */ "./node_modules/@polymer/polymer/lib/utils/boot.js"); /* harmony import */ var _utils_boot_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_utils_boot_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _utils_mixin_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/mixin.js */ "./node_modules/@polymer/polymer/lib/utils/mixin.js"); /* harmony import */ var _properties_changed_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./properties-changed.js */ "./node_modules/@polymer/polymer/lib/mixins/properties-changed.js"); /** @license Copyright (c) 2017 The Polymer Project Authors. All rights reserved. This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ /** * Creates a copy of `props` with each property normalized such that * upgraded it is an object with at least a type property { type: Type}. * * @param {Object} props Properties to normalize * @return {Object} Copy of input `props` with normalized properties that * are in the form {type: Type} * @private */ function normalizeProperties(props) { const output = {}; for (let p in props) { const o = props[p]; output[p] = (typeof o === 'function') ? {type: o} : o; } return output; } /** * Mixin that provides a minimal starting point to using the PropertiesChanged * mixin by providing a mechanism to declare properties in a static * getter (e.g. static get properties() { return { foo: String } }). Changes * are reported via the `_propertiesChanged` method. * * This mixin provides no specific support for rendering. Users are expected * to create a ShadowRoot and put content into it and update it in whatever * way makes sense. This can be done in reaction to properties changing by * implementing `_propertiesChanged`. * * @mixinFunction * @polymer * @appliesMixin PropertiesChanged * @summary Mixin that provides a minimal starting point for using * the PropertiesChanged mixin by providing a declarative `properties` object. */ const PropertiesMixin = Object(_utils_mixin_js__WEBPACK_IMPORTED_MODULE_1__["dedupingMixin"])(superClass => { /** * @constructor * @implements {Polymer_PropertiesChanged} * @private */ const base = Object(_properties_changed_js__WEBPACK_IMPORTED_MODULE_2__["PropertiesChanged"])(superClass); /** * Returns the super class constructor for the given class, if it is an * instance of the PropertiesMixin. * * @param {!PropertiesMixinConstructor} constructor PropertiesMixin constructor * @return {?PropertiesMixinConstructor} Super class constructor */ function superPropertiesClass(constructor) { const superCtor = Object.getPrototypeOf(constructor); // Note, the `PropertiesMixin` class below only refers to the class // generated by this call to the mixin; the instanceof test only works // because the mixin is deduped and guaranteed only to apply once, hence // all constructors in a proto chain will see the same `PropertiesMixin` return (superCtor.prototype instanceof PropertiesMixin) ? /** @type {!PropertiesMixinConstructor} */ (superCtor) : null; } /** * Returns a memoized version of the `properties` object for the * given class. Properties not in object format are converted to at * least {type}. * * @param {PropertiesMixinConstructor} constructor PropertiesMixin constructor * @return {Object} Memoized properties object */ function ownProperties(constructor) { if (!constructor.hasOwnProperty(JSCompiler_renameProperty('__ownProperties', constructor))) { let props = null; if (constructor.hasOwnProperty(JSCompiler_renameProperty('properties', constructor)) && constructor.properties) { props = normalizeProperties(constructor.properties); } constructor.__ownProperties = props; } return constructor.__ownProperties; } /** * @polymer * @mixinClass * @extends {base} * @implements {Polymer_PropertiesMixin} * @unrestricted */ class PropertiesMixin extends base { /** * Implements standard custom elements getter to observes the attributes * listed in `properties`. * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do */ static get observedAttributes() { const props = this._properties; return props ? Object.keys(props).map(p => this.attributeNameForProperty(p)) : []; } /** * Finalizes an element definition, including ensuring any super classes * are also finalized. This includes ensuring property * accessors exist on the element prototype. This method calls * `_finalizeClass` to finalize each constructor in the prototype chain. * @return {void} */ static finalize() { if (!this.hasOwnProperty(JSCompiler_renameProperty('__finalized', this))) { const superCtor = superPropertiesClass(/** @type {!PropertiesMixinConstructor} */(this)); if (superCtor) { superCtor.finalize(); } this.__finalized = true; this._finalizeClass(); } } /** * Finalize an element class. This includes ensuring property * accessors exist on the element prototype. This method is called by * `finalize` and finalizes the class constructor. * * @protected */ static _finalizeClass() { const props = ownProperties(/** @type {!PropertiesMixinConstructor} */(this)); if (props) { this.createProperties(props); } } /** * Returns a memoized version of all properties, including those inherited * from super classes. Properties not in object format are converted to * at least {type}. * * @return {Object} Object containing properties for this class * @protected */ static get _properties() { if (!this.hasOwnProperty( JSCompiler_renameProperty('__properties', this))) { const superCtor = superPropertiesClass(/** @type {!PropertiesMixinConstructor} */(this)); this.__properties = Object.assign({}, superCtor && superCtor._properties, ownProperties(/** @type {PropertiesMixinConstructor} */(this))); } return this.__properties; } /** * Overrides `PropertiesChanged` method to return type specified in the * static `properties` object for the given property. * @param {string} name Name of property * @return {*} Type to which to deserialize attribute * * @protected */ static typeForProperty(name) { const info = this._properties[name]; return info && info.type; } /** * Overrides `PropertiesChanged` method and adds a call to * `finalize` which lazily configures the element's property accessors. * @override * @return {void} */ _initializeProperties() { this.constructor.finalize(); super._initializeProperties(); } /** * Called when the element is added to a document. * Calls `_enableProperties` to turn on property system from * `PropertiesChanged`. * @suppress {missingProperties} Super may or may not implement the callback * @return {void} * @override */ connectedCallback() { if (super.connectedCallback) { super.connectedCallback(); } this._enableProperties(); } /** * Called when the element is removed from a document * @suppress {missingProperties} Super may or may not implement the callback * @return {void} * @override */ disconnectedCallback() { if (super.disconnectedCallback) { super.disconnectedCallback(); } } } return PropertiesMixin; }); /***/ }), /***/ "./node_modules/@polymer/polymer/lib/utils/array-splice.js": /*!*****************************************************************!*\ !*** ./node_modules/@polymer/polymer/lib/utils/array-splice.js ***! \*****************************************************************/ /*! exports provided: calculateSplices */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "calculateSplices", function() { return calculateSplices; }); /* harmony import */ var _boot_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./boot.js */ "./node_modules/@polymer/polymer/lib/utils/boot.js"); /* harmony import */ var _boot_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_boot_js__WEBPACK_IMPORTED_MODULE_0__); /** @license Copyright (c) 2017 The Polymer Project Authors. All rights reserved. This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ function newSplice(index, removed, addedCount) { return { index: index, removed: removed, addedCount: addedCount }; } const EDIT_LEAVE = 0; const EDIT_UPDATE = 1; const EDIT_ADD = 2; const EDIT_DELETE = 3; // Note: This function is *based* on the computation of the Levenshtein // "edit" distance. The one change is that "updates" are treated as two // edits - not one. With Array splices, an update is really a delete // followed by an add. By retaining this, we optimize for "keeping" the // maximum array items in the original array. For example: // // 'xxxx123' -> '123yyyy' // // With 1-edit updates, the shortest path would be just to update all seven // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This // leaves the substring '123' intact. function calcEditDistances(current, currentStart, currentEnd, old, oldStart, oldEnd) { // "Deletion" columns let rowCount = oldEnd - oldStart + 1; let columnCount = currentEnd - currentStart + 1; let distances = new Array(rowCount); // "Addition" rows. Initialize null column. for (let i = 0; i < rowCount; i++) { distances[i] = new Array(columnCount); distances[i][0] = i; } // Initialize null row for (let j = 0; j < columnCount; j++) distances[0][j] = j; for (let i = 1; i < rowCount; i++) { for (let j = 1; j < columnCount; j++) { if (equals(current[currentStart + j - 1], old[oldStart + i - 1])) distances[i][j] = distances[i - 1][j - 1]; else { let north = distances[i - 1][j] + 1; let west = distances[i][j - 1] + 1; distances[i][j] = north < west ? north : west; } } } return distances; } // This starts at the final weight, and walks "backward" by finding // the minimum previous weight recursively until the origin of the weight // matrix. function spliceOperationsFromEditDistances(distances) { let i = distances.length - 1; let j = distances[0].length - 1; let current = distances[i][j]; let edits = []; while (i > 0 || j > 0) { if (i == 0) { edits.push(EDIT_ADD); j--; continue; } if (j == 0) { edits.push(EDIT_DELETE); i--; continue; } let northWest = distances[i - 1][j - 1]; let west = distances[i - 1][j]; let north = distances[i][j - 1]; let min; if (west < north) min = west < northWest ? west : northWest; else min = north < northWest ? north : northWest; if (min == northWest) { if (northWest == current) { edits.push(EDIT_LEAVE); } else { edits.push(EDIT_UPDATE); current = northWest; } i--; j--; } else if (min == west) { edits.push(EDIT_DELETE); i--; current = west; } else { edits.push(EDIT_ADD); j--; current = north; } } edits.reverse(); return edits; } /** * Splice Projection functions: * * A splice map is a representation of how a previous array of items * was transformed into a new array of items. Conceptually it is a list of * tuples of * * * * which are kept in ascending index order of. The tuple represents that at * the |index|, |removed| sequence of items were removed, and counting forward * from |index|, |addedCount| items were added. */ /** * Lacking individual splice mutation information, the minimal set of * splices can be synthesized given the previous state and final state of an * array. The basic approach is to calculate the edit distance matrix and * choose the shortest path through it. * * Complexity: O(l * p) * l: The length of the current array * p: The length of the old array * * @param {!Array} current The current "changed" array for which to * calculate splices. * @param {number} currentStart Starting index in the `current` array for * which splices are calculated. * @param {number} currentEnd Ending index in the `current` array for * which splices are calculated. * @param {!Array} old The original "unchanged" array to compare `current` * against to determine splices. * @param {number} oldStart Starting index in the `old` array for * which splices are calculated. * @param {number} oldEnd Ending index in the `old` array for * which splices are calculated. * @return {!Array} Returns an array of splice record objects. Each of these * contains: `index` the location where the splice occurred; `removed` * the array of removed items from this location; `addedCount` the number * of items added at this location. */ function calcSplices(current, currentStart, currentEnd, old, oldStart, oldEnd) { let prefixCount = 0; let suffixCount = 0; let splice; let minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart); if (currentStart == 0 && oldStart == 0) prefixCount = sharedPrefix(current, old, minLength); if (currentEnd == current.length && oldEnd == old.length) suffixCount = sharedSuffix(current, old, minLength - prefixCount); currentStart += prefixCount; oldStart += prefixCount; currentEnd -= suffixCount; oldEnd -= suffixCount; if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0) return []; if (currentStart == currentEnd) { splice = newSplice(currentStart, [], 0); while (oldStart < oldEnd) splice.removed.push(old[oldStart++]); return [ splice ]; } else if (oldStart == oldEnd) return [ newSplice(currentStart, [], currentEnd - currentStart) ]; let ops = spliceOperationsFromEditDistances( calcEditDistances(current, currentStart, currentEnd, old, oldStart, oldEnd)); splice = undefined; let splices = []; let index = currentStart; let oldIndex = oldStart; for (let i = 0; i < ops.length; i++) { switch(ops[i]) { case EDIT_LEAVE: if (splice) { splices.push(splice); splice = undefined; } index++; oldIndex++; break; case EDIT_UPDATE: if (!splice) splice = newSplice(index, [], 0); splice.addedCount++; index++; splice.removed.push(old[oldIndex]); oldIndex++; break; case EDIT_ADD: if (!splice) splice = newSplice(index, [], 0); splice.addedCount++; index++; break; case EDIT_DELETE: if (!splice) splice = newSplice(index, [], 0); splice.removed.push(old[oldIndex]); oldIndex++; break; } } if (splice) { splices.push(splice); } return splices; } function sharedPrefix(current, old, searchLength) { for (let i = 0; i < searchLength; i++) if (!equals(current[i], old[i])) return i; return searchLength; } function sharedSuffix(current, old, searchLength) { let index1 = current.length; let index2 = old.length; let count = 0; while (count < searchLength && equals(current[--index1], old[--index2])) count++; return count; } /** * Returns an array of splice records indicating the minimum edits required * to transform the `previous` array into the `current` array. * * Splice records are ordered by index and contain the following fields: * - `index`: index where edit started * - `removed`: array of removed items from this index * - `addedCount`: number of items added at this index * * This function is based on the Levenshtein "minimum edit distance" * algorithm. Note that updates are treated as removal followed by addition. * * The worst-case time complexity of this algorithm is `O(l * p)` * l: The length of the current array * p: The length of the previous array * * However, the worst-case complexity is reduced by an `O(n)` optimization * to detect any shared prefix & suffix between the two arrays and only * perform the more expensive minimum edit distance calculation over the * non-shared portions of the arrays. * * @function * @param {!Array} current The "changed" array for which splices will be * calculated. * @param {!Array} previous The "unchanged" original array to compare * `current` against to determine the splices. * @return {!Array} Returns an array of splice record objects. Each of these * contains: `index` the location where the splice occurred; `removed` * the array of removed items from this location; `addedCount` the number * of items added at this location. */ function calculateSplices(current, previous) { return calcSplices(current, 0, current.length, previous, 0, previous.length); } function equals(currentValue, previousValue) { return currentValue === previousValue; } /***/ }), /***/ "./node_modules/@polymer/polymer/lib/utils/async.js": /*!**********************************************************!*\ !*** ./node_modules/@polymer/polymer/lib/utils/async.js ***! \**********************************************************/ /*! exports provided: timeOut, animationFrame, idlePeriod, microTask */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeOut", function() { return timeOut; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "animationFrame", function() { return animationFrame; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "idlePeriod", function() { return idlePeriod; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "microTask", function() { return microTask; }); /* harmony import */ var _boot_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./boot.js */ "./node_modules/@polymer/polymer/lib/utils/boot.js"); /* harmony import */ var _boot_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_boot_js__WEBPACK_IMPORTED_MODULE_0__); /** @license Copyright (c) 2017 The Polymer Project Authors. All rights reserved. This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ /** * @fileoverview * * This module provides a number of strategies for enqueuing asynchronous * tasks. Each sub-module provides a standard `run(fn)` interface that returns a * handle, and a `cancel(handle)` interface for canceling async tasks before * they run. * * @summary Module that provides a number of strategies for enqueuing * asynchronous tasks. */ // Microtask implemented using Mutation Observer let microtaskCurrHandle = 0; let microtaskLastHandle = 0; let microtaskCallbacks = []; let microtaskNodeContent = 0; let microtaskNode = document.createTextNode(''); new window.MutationObserver(microtaskFlush).observe(microtaskNode, {characterData: true}); function microtaskFlush() { const len = microtaskCallbacks.length; for (let i = 0; i < len; i++) { let cb = microtaskCallbacks[i]; if (cb) { try { cb(); } catch (e) { setTimeout(() => { throw e; }); } } } microtaskCallbacks.splice(0, len); microtaskLastHandle += len; } /** * Async interface wrapper around `setTimeout`. * * @namespace * @summary Async interface wrapper around `setTimeout`. */ const timeOut = { /** * Returns a sub-module with the async interface providing the provided * delay. * * @memberof timeOut * @param {number=} delay Time to wait before calling callbacks in ms * @return {!AsyncInterface} An async timeout interface */ after(delay) { return { run(fn) { return window.setTimeout(fn, delay); }, cancel(handle) { window.clearTimeout(handle); } }; }, /** * Enqueues a function called in the next task. * * @memberof timeOut * @param {!Function} fn Callback to run * @param {number=} delay Delay in milliseconds * @return {number} Handle used for canceling task */ run(fn, delay) { return window.setTimeout(fn, delay); }, /** * Cancels a previously enqueued `timeOut` callback. * * @memberof timeOut * @param {number} handle Handle returned from `run` of callback to cancel * @return {void} */ cancel(handle) { window.clearTimeout(handle); } }; /** * Async interface wrapper around `requestAnimationFrame`. * * @namespace * @summary Async interface wrapper around `requestAnimationFrame`. */ const animationFrame = { /** * Enqueues a function called at `requestAnimationFrame` timing. * * @memberof animationFrame * @param {function(number):void} fn Callback to run * @return {number} Handle used for canceling task */ run(fn) { return window.requestAnimationFrame(fn); }, /** * Cancels a previously enqueued `animationFrame` callback. * * @memberof animationFrame * @param {number} handle Handle returned from `run` of callback to cancel * @return {void} */ cancel(handle) { window.cancelAnimationFrame(handle); } }; /** * Async interface wrapper around `requestIdleCallback`. Falls back to * `setTimeout` on browsers that do not support `requestIdleCallback`. * * @namespace * @summary Async interface wrapper around `requestIdleCallback`. */ const idlePeriod = { /** * Enqueues a function called at `requestIdleCallback` timing. * * @memberof idlePeriod * @param {function(!IdleDeadline):void} fn Callback to run * @return {number} Handle used for canceling task */ run(fn) { return window.requestIdleCallback ? window.requestIdleCallback(fn) : window.setTimeout(fn, 16); }, /** * Cancels a previously enqueued `idlePeriod` callback. * * @memberof idlePeriod * @param {number} handle Handle returned from `run` of callback to cancel * @return {void} */ cancel(handle) { window.cancelIdleCallback ? window.cancelIdleCallback(handle) : window.clearTimeout(handle); } }; /** * Async interface for enqueuing callbacks that run at microtask timing. * * Note that microtask timing is achieved via a single `MutationObserver`, * and thus callbacks enqueued with this API will all run in a single * batch, and not interleaved with other microtasks such as promises. * Promises are avoided as an implementation choice for the time being * due to Safari bugs that cause Promises to lack microtask guarantees. * * @namespace * @summary Async interface for enqueuing callbacks that run at microtask * timing. */ const microTask = { /** * Enqueues a function called at microtask timing. * * @memberof microTask * @param {!Function=} callback Callback to run * @return {number} Handle used for canceling task */ run(callback) { microtaskNode.textContent = microtaskNodeContent++; microtaskCallbacks.push(callback); return microtaskCurrHandle++; }, /** * Cancels a previously enqueued `microTask` callback. * * @memberof microTask * @param {number} handle Handle returned from `run` of callback to cancel * @return {void} */ cancel(handle) { const idx = handle - microtaskLastHandle; if (idx >= 0) { if (!microtaskCallbacks[idx]) { throw new Error('invalid async handle: ' + handle); } microtaskCallbacks[idx] = null; } } }; /***/ }), /***/ "./node_modules/@polymer/polymer/lib/utils/boot.js": /*!*********************************************************!*\ !*** ./node_modules/@polymer/polymer/lib/utils/boot.js ***! \*********************************************************/ /*! no static exports found */ /***/ (function(module, exports) { /** @license Copyright (c) 2017 The Polymer Project Authors. All rights reserved. This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ window.JSCompiler_renameProperty = function(prop) { return prop; }; /***/ }), /***/ "./node_modules/@polymer/polymer/lib/utils/case-map.js": /*!*************************************************************!*\ !*** ./node_modules/@polymer/polymer/lib/utils/case-map.js ***! \*************************************************************/ /*! exports provided: dashToCamelCase, camelToDashCase */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dashToCamelCase", function() { return dashToCamelCase; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "camelToDashCase", function() { return camelToDashCase; }); /* harmony import */ var _boot_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./boot.js */ "./node_modules/@polymer/polymer/lib/utils/boot.js"); /* harmony import */ var _boot_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_boot_js__WEBPACK_IMPORTED_MODULE_0__); /** @license Copyright (c) 2017 The Polymer Project Authors. All rights reserved. This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ const caseMap = {}; const DASH_TO_CAMEL = /-[a-z]/g; const CAMEL_TO_DASH = /([A-Z])/g; /** * @fileoverview Module with utilities for converting between "dash-case" and * "camelCase" identifiers. */ /** * Converts "dash-case" identifier (e.g. `foo-bar-baz`) to "camelCase" * (e.g. `fooBarBaz`). * * @param {string} dash Dash-case identifier * @return {string} Camel-case representation of the identifier */ function dashToCamelCase(dash) { return caseMap[dash] || ( caseMap[dash] = dash.indexOf('-') < 0 ? dash : dash.replace(DASH_TO_CAMEL, (m) => m[1].toUpperCase() ) ); } /** * Converts "camelCase" identifier (e.g. `fooBarBaz`) to "dash-case" * (e.g. `foo-bar-baz`). * * @param {string} camel Camel-case identifier * @return {string} Dash-case representation of the identifier */ function camelToDashCase(camel) { return caseMap[camel] || ( caseMap[camel] = camel.replace(CAMEL_TO_DASH, '-$1').toLowerCase() ); } /***/ }), /***/ "./node_modules/@polymer/polymer/lib/utils/flattened-nodes-observer.js": /*!*****************************************************************************!*\ !*** ./node_modules/@polymer/polymer/lib/utils/flattened-nodes-observer.js ***! \*****************************************************************************/ /*! exports provided: FlattenedNodesObserver */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FlattenedNodesObserver", function() { return FlattenedNodesObserver; }); /* harmony import */ var _boot_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./boot.js */ "./node_modules/@polymer/polymer/lib/utils/boot.js"); /* harmony import */ var _boot_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_boot_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _array_splice_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./array-splice.js */ "./node_modules/@polymer/polymer/lib/utils/array-splice.js"); /* harmony import */ var _async_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./async.js */ "./node_modules/@polymer/polymer/lib/utils/async.js"); /** @license Copyright (c) 2017 The Polymer Project Authors. All rights reserved. This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ /** * Returns true if `node` is a slot element * @param {Node} node Node to test. * @return {boolean} Returns true if the given `node` is a slot * @private */ function isSlot(node) { return (node.localName === 'slot'); } /** * Class that listens for changes (additions or removals) to * "flattened nodes" on a given `node`. The list of flattened nodes consists * of a node's children and, for any children that are `` elements, * the expanded flattened list of `assignedNodes`. * For example, if the observed node has children `` * and the `` has one `
` assigned to it, then the flattened * nodes list is `
`. If the `` has other * `` elements assigned to it, these are flattened as well. * * The provided `callback` is called whenever any change to this list * of flattened nodes occurs, where an addition or removal of a node is * considered a change. The `callback` is called with one argument, an object * containing an array of any `addedNodes` and `removedNodes`. * * Note: the callback is called asynchronous to any changes * at a microtask checkpoint. This is because observation is performed using * `MutationObserver` and the `` element's `slotchange` event which * are asynchronous. * * An example: * ```js * class TestSelfObserve extends PolymerElement { * static get is() { return 'test-self-observe';} * connectedCallback() { * super.connectedCallback(); * this._observer = new FlattenedNodesObserver(this, (info) => { * this.info = info; * }); * } * disconnectedCallback() { * super.disconnectedCallback(); * this._observer.disconnect(); * } * } * customElements.define(TestSelfObserve.is, TestSelfObserve); * ``` * * @summary Class that listens for changes (additions or removals) to * "flattened nodes" on a given `node`. */ class FlattenedNodesObserver { /** * Returns the list of flattened nodes for the given `node`. * This list consists of a node's children and, for any children * that are `` elements, the expanded flattened list of `assignedNodes`. * For example, if the observed node has children `` * and the `` has one `
` assigned to it, then the flattened * nodes list is `
`. If the `` has other * `` elements assigned to it, these are flattened as well. * * @param {HTMLElement|HTMLSlotElement} node The node for which to return the list of flattened nodes. * @return {Array} The list of flattened nodes for the given `node`. */ static getFlattenedNodes(node) { if (isSlot(node)) { node = /** @type {HTMLSlotElement} */(node); // eslint-disable-line no-self-assign return node.assignedNodes({flatten: true}); } else { return Array.from(node.childNodes).map((node) => { if (isSlot(node)) { node = /** @type {HTMLSlotElement} */(node); // eslint-disable-line no-self-assign return node.assignedNodes({flatten: true}); } else { return [node]; } }).reduce((a, b) => a.concat(b), []); } } /** * @param {Element} target Node on which to listen for changes. * @param {?function(!Element, { target: !Element, addedNodes: !Array, removedNodes: !Array }):void} callback Function called when there are additions * or removals from the target's list of flattened nodes. */ constructor(target, callback) { /** * @type {MutationObserver} * @private */ this._shadyChildrenObserver = null; /** * @type {MutationObserver} * @private */ this._nativeChildrenObserver = null; this._connected = false; /** * @type {Element} * @private */ this._target = target; this.callback = callback; this._effectiveNodes = []; this._observer = null; this._scheduled = false; /** * @type {function()} * @private */ this._boundSchedule = () => { this._schedule(); }; this.connect(); this._schedule(); } /** * Activates an observer. This method is automatically called when * a `FlattenedNodesObserver` is created. It should only be called to * re-activate an observer that has been deactivated via the `disconnect` method. * * @return {void} */ connect() { if (isSlot(this._target)) { this._listenSlots([this._target]); } else if (this._target.children) { this._listenSlots(this._target.children); if (window.ShadyDOM) { this._shadyChildrenObserver = ShadyDOM.observeChildren(this._target, (mutations) => { this._processMutations(mutations); }); } else { this._nativeChildrenObserver = new MutationObserver((mutations) => { this._processMutations(mutations); }); this._nativeChildrenObserver.observe(this._target, {childList: true}); } } this._connected = true; } /** * Deactivates the flattened nodes observer. After calling this method * the observer callback will not be called when changes to flattened nodes * occur. The `connect` method may be subsequently called to reactivate * the observer. * * @return {void} */ disconnect() { if (isSlot(this._target)) { this._unlistenSlots([this._target]); } else if (this._target.children) { this._unlistenSlots(this._target.children); if (window.ShadyDOM && this._shadyChildrenObserver) { ShadyDOM.unobserveChildren(this._shadyChildrenObserver); this._shadyChildrenObserver = null; } else if (this._nativeChildrenObserver) { this._nativeChildrenObserver.disconnect(); this._nativeChildrenObserver = null; } } this._connected = false; } /** * @return {void} * @private */ _schedule() { if (!this._scheduled) { this._scheduled = true; _async_js__WEBPACK_IMPORTED_MODULE_2__["microTask"].run(() => this.flush()); } } /** * @param {Array} mutations Mutations signaled by the mutation observer * @return {void} * @private */ _processMutations(mutations) { this._processSlotMutations(mutations); this.flush(); } /** * @param {Array} mutations Mutations signaled by the mutation observer * @return {void} * @private */ _processSlotMutations(mutations) { if (mutations) { for (let i=0; i < mutations.length; i++) { let mutation = mutations[i]; if (mutation.addedNodes) { this._listenSlots(mutation.addedNodes); } if (mutation.removedNodes) { this._unlistenSlots(mutation.removedNodes); } } } } /** * Flushes the observer causing any pending changes to be immediately * delivered the observer callback. By default these changes are delivered * asynchronously at the next microtask checkpoint. * * @return {boolean} Returns true if any pending changes caused the observer * callback to run. */ flush() { if (!this._connected) { return false; } if (window.ShadyDOM) { ShadyDOM.flush(); } if (this._nativeChildrenObserver) { this._processSlotMutations(this._nativeChildrenObserver.takeRecords()); } else if (this._shadyChildrenObserver) { this._processSlotMutations(this._shadyChildrenObserver.takeRecords()); } this._scheduled = false; let info = { target: this._target, addedNodes: [], removedNodes: [] }; let newNodes = this.constructor.getFlattenedNodes(this._target); let splices = Object(_array_splice_js__WEBPACK_IMPORTED_MODULE_1__["calculateSplices"])(newNodes, this._effectiveNodes); // process removals for (let i=0, s; (i|!NodeList} nodeList Nodes that could change * @return {void} * @private */ _listenSlots(nodeList) { for (let i=0; i < nodeList.length; i++) { let n = nodeList[i]; if (isSlot(n)) { n.addEventListener('slotchange', this._boundSchedule); } } } /** * @param {!Array|!NodeList} nodeList Nodes that could change * @return {void} * @private */ _unlistenSlots(nodeList) { for (let i=0; i < nodeList.length; i++) { let n = nodeList[i]; if (isSlot(n)) { n.removeEventListener('slotchange', this._boundSchedule); } } } } /***/ }), /***/ "./node_modules/@polymer/polymer/lib/utils/mixin.js": /*!**********************************************************!*\ !*** ./node_modules/@polymer/polymer/lib/utils/mixin.js ***! \**********************************************************/ /*! exports provided: dedupingMixin */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dedupingMixin", function() { return dedupingMixin; }); /* harmony import */ var _boot_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./boot.js */ "./node_modules/@polymer/polymer/lib/utils/boot.js"); /* harmony import */ var _boot_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_boot_js__WEBPACK_IMPORTED_MODULE_0__); /** @license Copyright (c) 2017 The Polymer Project Authors. All rights reserved. This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ // unique global id for deduping mixins. let dedupeId = 0; /** * @constructor * @extends {Function} * @private */ function MixinFunction(){} /** @type {(WeakMap | undefined)} */ MixinFunction.prototype.__mixinApplications; /** @type {(Object | undefined)} */ MixinFunction.prototype.__mixinSet; /* eslint-disable valid-jsdoc */ /** * Wraps an ES6 class expression mixin such that the mixin is only applied * if it has not already been applied its base argument. Also memoizes mixin * applications. * * @template T * @param {T} mixin ES6 class expression mixin to wrap * @return {T} * @suppress {invalidCasts} */ const dedupingMixin = function(mixin) { let mixinApplications = /** @type {!MixinFunction} */(mixin).__mixinApplications; if (!mixinApplications) { mixinApplications = new WeakMap(); /** @type {!MixinFunction} */(mixin).__mixinApplications = mixinApplications; } // maintain a unique id for each mixin let mixinDedupeId = dedupeId++; function dedupingMixin(base) { let baseSet = /** @type {!MixinFunction} */(base).__mixinSet; if (baseSet && baseSet[mixinDedupeId]) { return base; } let map = mixinApplications; let extended = map.get(base); if (!extended) { extended = /** @type {!Function} */(mixin)(base); map.set(base, extended); } // copy inherited mixin set from the extended class, or the base class // NOTE: we avoid use of Set here because some browser (IE11) // cannot extend a base Set via the constructor. let mixinSet = Object.create(/** @type {!MixinFunction} */(extended).__mixinSet || baseSet || null); mixinSet[mixinDedupeId] = true; /** @type {!MixinFunction} */(extended).__mixinSet = mixinSet; return extended; } return dedupingMixin; }; /* eslint-enable valid-jsdoc */ /***/ }), /***/ "./node_modules/@tensorflow-models/posenet/dist/posenet.esm.js": /*!*********************************************************************!*\ !*** ./node_modules/@tensorflow-models/posenet/dist/posenet.esm.js ***! \*********************************************************************/ /*! exports provided: MobileNet, mobileNetArchitectures, CheckpointLoader, decodeMultiplePoses, decodeSinglePose, load, PoseNet, partIds, partNames, poseChain, getAdjacentKeyPoints, getBoundingBox, getBoundingBoxPoints */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MobileNet", function() { return MobileNet; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mobileNetArchitectures", function() { return mobileNetArchitectures; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CheckpointLoader", function() { return CheckpointLoader; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "decodeMultiplePoses", function() { return decodeMultiplePoses; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "decodeSinglePose", function() { return decodeSinglePose; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "load", function() { return load; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PoseNet", function() { return PoseNet; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "partIds", function() { return partIds; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "partNames", function() { return partNames; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "poseChain", function() { return poseChain; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getAdjacentKeyPoints", function() { return getAdjacentKeyPoints; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getBoundingBox", function() { return getBoundingBox; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getBoundingBoxPoints", function() { return getBoundingBoxPoints; }); /* harmony import */ var _tensorflow_tfjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs */ "./node_modules/@tensorflow/tfjs/dist/tf.esm.js"); // @tensorflow/tfjs-models Copyright 2018 Google var MANIFEST_FILE="manifest.json",CheckpointLoader=function(){function e(e){this.urlPath=e,"/"!==this.urlPath.charAt(this.urlPath.length-1)&&(this.urlPath+="/")}return e.prototype.loadManifest=function(){var e=this;return new Promise(function(t,r){var n=new XMLHttpRequest;n.open("GET",e.urlPath+MANIFEST_FILE),n.onload=function(){e.checkpointManifest=JSON.parse(n.responseText),t()},n.onerror=function(t){throw new Error(MANIFEST_FILE+" not found at "+e.urlPath+". "+t)},n.send()})},e.prototype.getCheckpointManifest=function(){var e=this;return null==this.checkpointManifest?new Promise(function(t,r){e.loadManifest().then(function(){t(e.checkpointManifest)})}):new Promise(function(t,r){t(e.checkpointManifest)})},e.prototype.getAllVariables=function(){var e=this;return null!=this.variables?new Promise(function(t,r){t(e.variables)}):new Promise(function(t,r){e.getCheckpointManifest().then(function(r){for(var n=Object.keys(e.checkpointManifest),o=[],i=0;i=0,"outputStride of "+e+" is invalid. It must be either 8, 16, or 32")}function assertValidScaleFactor(e){_tensorflow_tfjs__WEBPACK_IMPORTED_MODULE_0__["util"].assert("number"==typeof e,"imageScaleFactor is not a number"),_tensorflow_tfjs__WEBPACK_IMPORTED_MODULE_0__["util"].assert(e>=.2&&e<=1,"imageScaleFactor must be between 0.2 and 1.0")}var mobileNetArchitectures={100:mobileNet100Architecture,75:mobileNet75Architecture,50:mobileNet50Architecture};function toOutputStridedLayers(e,t){var r=1,n=1;return e.map(function(e,o){var i,a,s=e[0],u=e[1];return r===t?(i=1,a=n,n*=u):(i=u,a=1,r*=u),{blockId:o,convType:s,stride:i,rate:a,outputStride:r}})}var MobileNet=function(){function e(e,t){this.PREPROCESS_DIVISOR=Object(_tensorflow_tfjs__WEBPACK_IMPORTED_MODULE_0__["scalar"])(127.5),this.ONE=Object(_tensorflow_tfjs__WEBPACK_IMPORTED_MODULE_0__["scalar"])(1),this.variables=e,this.convolutionDefinitions=t}return e.prototype.predict=function(e,t){var r=this,n=Object(_tensorflow_tfjs__WEBPACK_IMPORTED_MODULE_0__["cast"])(e,"float32").div(this.PREPROCESS_DIVISOR).sub(this.ONE);return toOutputStridedLayers(this.convolutionDefinitions,t).reduce(function(e,t){var n=t.blockId,o=t.stride,i=t.convType,a=t.rate;if("conv2d"===i)return r.conv(e,o,n);if("separableConv"===i)return r.separableConv(e,o,n,a);throw Error("Unknown conv type of "+i)},n)},e.prototype.convToOutput=function(e,t){return e.conv2d(this.weights(t),1,"same").add(this.biases(t))},e.prototype.conv=function(e,t,r){return e.conv2d(this.weights("Conv2d_"+String(r)),t,"same").add(this.biases("Conv2d_"+String(r))).clipByValue(0,6)},e.prototype.separableConv=function(e,t,r,n){void 0===n&&(n=1);var o="Conv2d_"+String(r)+"_depthwise",i="Conv2d_"+String(r)+"_pointwise";return e.depthwiseConv2D(this.depthwiseWeights(o),t,"same","NHWC",n).add(this.biases(o)).clipByValue(0,6).conv2d(this.weights(i),[1,1],"same").add(this.biases(i)).clipByValue(0,6)},e.prototype.weights=function(e){return this.variables["MobilenetV1/"+e+"/weights"]},e.prototype.biases=function(e){return this.variables["MobilenetV1/"+e+"/biases"]},e.prototype.depthwiseWeights=function(e){return this.variables["MobilenetV1/"+e+"/depthwise_weights"]},e.prototype.dispose=function(){for(var e in this.variables)this.variables[e].dispose()},e}();function __awaiter(e,t,r,n){return new(r||(r=Promise))(function(o,i){function a(e){try{u(n.next(e))}catch(e){i(e)}}function s(e){try{u(n.throw(e))}catch(e){i(e)}}function u(e){e.done?o(e.value):new r(function(t){t(e.value)}).then(a,s)}u((n=n.apply(e,t||[])).next())})}function __generator(e,t){var r,n,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,n&&(o=2&i[0]?n.return:i[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,i[1])).done)return o;switch(n=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,n=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&this.less(half(e),e);)this.exchange(e,half(e)),e=half(e)},e.prototype.sink=function(e){for(;2*e<=this.numberOfElements;){var t=2*e;if(tt){l=!1;break}if(!l)break}return l}function buildPartWithScoreQueue(e,t,r){for(var n=r.shape,o=n[0],i=n[1],a=n[2],s=new MaxHeap(o*i*a,function(e){return e.score}),u=0;ur?r:e}function squaredDistance(e,t,r,n){var o=r-e,i=n-t;return o*o+i*i}function addVectors(e,t){return{x:e.x+t.x,y:e.y+t.y}}var parentChildrenTuples=poseChain.map(function(e){var t=e[0],r=e[1];return[partIds[t],partIds[r]]}),parentToChildEdges=parentChildrenTuples.map(function(e){return e[1]}),childToParentEdges=parentChildrenTuples.map(function(e){return e[0]});function getDisplacement(e,t,r){var n=r.shape[2]/2;return{y:r.get(t.y,t.x,e),x:r.get(t.y,t.x,n+e)}}function getStridedIndexNearPoint(e,t,r,n){return{y:clamp(Math.round(e.y/t),0,r-1),x:clamp(Math.round(e.x/t),0,n-1)}}function traverseToTargetKeypoint(e,t,r,n,o,i,a){var s=n.shape,u=s[0],l=s[1],c=getDisplacement(e,getStridedIndexNearPoint(t.position,i,u,l),a),p=getStridedIndexNearPoint(addVectors(t.position,c),i,u,l),f=getOffsetPoint(p.y,p.x,r,o),h=n.get(p.y,p.x,r);return{position:addVectors({x:p.x*i,y:p.y*i},{x:f.x,y:f.y}),part:partNames[r],score:h}}function decodePose(e,t,r,n,o,i){var a=t.shape[2],s=parentToChildEdges.length,u=new Array(a),l=e.part,c=e.score,p=getImageCoords(l,n,r);u[l.id]={score:c,part:partNames[l.id],position:p};for(var f=s-1;f>=0;--f){var h=parentToChildEdges[f],d=childToParentEdges[f];u[h]&&!u[d]&&(u[d]=traverseToTargetKeypoint(f,u[h],d,t,r,n,i))}for(f=0;f tag, please also include @tensorflow/tfjs on the page before using this model.");return t=Object.keys(checkpoints),_tensorflow_tfjs__WEBPACK_IMPORTED_MODULE_0__["util"].assert("number"==typeof e,"got multiplier type of "+typeof e+" when it should be a number."),_tensorflow_tfjs__WEBPACK_IMPORTED_MODULE_0__["util"].assert(t.indexOf(e.toString())>=0,"invalid multiplier value of "+e+". No checkpoint exists for that multiplier. Must be one of "+t.join(",")+"."),[4,mobilenetLoader.load(e)];case 1:return r=n.sent(),[2,new PoseNet(r)]}})})}var mobilenetLoader={load:function(e){return __awaiter(_this,void 0,void 0,function(){var t,r;return __generator(this,function(n){switch(n.label){case 0:return t=checkpoints[e],[4,new CheckpointLoader(t.url).getAllVariables()];case 1:return r=n.sent(),[2,new MobileNet(r,t.architecture)]}})})}}; /***/ }), /***/ "./node_modules/@tensorflow/tfjs-converter/dist/tf-converter.esm.js": /*!**************************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-converter/dist/tf-converter.esm.js ***! \**************************************************************************/ /*! exports provided: FrozenModel, loadFrozenModel, version_converter */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FrozenModel", function() { return FrozenModel; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "loadFrozenModel", function() { return loadFrozenModel; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version_converter", function() { return version; }); /* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/tf-core.esm.js"); /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var __assign=Object.assign||function(e){for(var t,a=1,r=arguments.length;a0&&n[n.length-1])&&(6===o[0]||2===o[0])){s=0;continue}if(3===o[0]&&(!n||o[1]>n[0]&&o[1]1&&"="===e.charAt(t);)++a;return Math.ceil(3*e.length)/4-a};for(var r=new Array(64),n=new Array(123),o=0;o<64;)n[r[o]=o<26?o+65:o<52?o+71:o<62?o-4:o-59|43]=o++;a.encode=function(e,t,a){for(var n,o=null,s=[],i=0,p=0;t>2],n=(3&u)<<4,p=1;break;case 1:s[i++]=r[n|u>>4],n=(15&u)<<2,p=2;break;case 2:s[i++]=r[n|u>>6],s[i++]=r[63&u],p=0}i>8191&&((o||(o=[])).push(String.fromCharCode.apply(String,s)),i=0)}return p&&(s[i++]=r[n],s[i++]=61,1===p&&(s[i++]=61)),o?(i&&o.push(String.fromCharCode.apply(String,s.slice(0,i))),o.join("")):String.fromCharCode.apply(String,s.slice(0,i))};a.decode=function(e,t,a){for(var r,o=a,s=0,i=0;i1)break;if(void 0===(p=n[p]))throw Error("invalid encoding");switch(s){case 0:r=p,s=1;break;case 1:t[a++]=r<<2|(48&p)>>4,r=p,s=2;break;case 2:t[a++]=(15&r)<<4|(60&p)>>2,r=p,s=3;break;case 3:t[a++]=(3&r)<<6|p,s=0}}if(1===s)throw Error("invalid encoding");return a-o},a.test=function(e){return/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(e)}}),eventemitter=EventEmitter;function EventEmitter(){this._listeners={}}EventEmitter.prototype.on=function(e,t,a){return(this._listeners[e]||(this._listeners[e]=[])).push({fn:t,ctx:a||this}),this},EventEmitter.prototype.off=function(e,t){if(void 0===e)this._listeners={};else if(void 0===t)this._listeners[e]=[];else for(var a=this._listeners[e],r=0;r0?0:2147483648,a,r);else if(isNaN(t))e(2143289344,a,r);else if(t>3.4028234663852886e38)e((n<<31|2139095040)>>>0,a,r);else if(t<1.1754943508222875e-38)e((n<<31|Math.round(t/1.401298464324817e-45))>>>0,a,r);else{var o=Math.floor(Math.log(t)/Math.LN2);e((n<<31|o+127<<23|8388607&Math.round(t*Math.pow(2,-o)*8388608))>>>0,a,r)}}function a(e,t,a){var r=e(t,a),n=2*(r>>31)+1,o=r>>>23&255,s=8388607&r;return 255===o?s?NaN:n*(1/0):0===o?1.401298464324817e-45*n*s:n*Math.pow(2,o-150)*(s+8388608)}e.writeFloatLE=t.bind(null,writeUintLE),e.writeFloatBE=t.bind(null,writeUintBE),e.readFloatLE=a.bind(null,readUintLE),e.readFloatBE=a.bind(null,readUintBE)}(),"undefined"!=typeof Float64Array?function(){var t=new Float64Array([-0]),a=new Uint8Array(t.buffer),r=128===a[7];function n(e,r,n){t[0]=e,r[n]=a[0],r[n+1]=a[1],r[n+2]=a[2],r[n+3]=a[3],r[n+4]=a[4],r[n+5]=a[5],r[n+6]=a[6],r[n+7]=a[7]}function o(e,r,n){t[0]=e,r[n]=a[7],r[n+1]=a[6],r[n+2]=a[5],r[n+3]=a[4],r[n+4]=a[3],r[n+5]=a[2],r[n+6]=a[1],r[n+7]=a[0]}function s(e,r){return a[0]=e[r],a[1]=e[r+1],a[2]=e[r+2],a[3]=e[r+3],a[4]=e[r+4],a[5]=e[r+5],a[6]=e[r+6],a[7]=e[r+7],t[0]}function i(e,r){return a[7]=e[r],a[6]=e[r+1],a[5]=e[r+2],a[4]=e[r+3],a[3]=e[r+4],a[2]=e[r+5],a[1]=e[r+6],a[0]=e[r+7],t[0]}e.writeDoubleLE=r?n:o,e.writeDoubleBE=r?o:n,e.readDoubleLE=r?s:i,e.readDoubleBE=r?i:s}():function(){function t(e,t,a,r,n,o){var s=r<0?1:0;if(s&&(r=-r),0===r)e(0,n,o+t),e(1/r>0?0:2147483648,n,o+a);else if(isNaN(r))e(0,n,o+t),e(2146959360,n,o+a);else if(r>1.7976931348623157e308)e(0,n,o+t),e((s<<31|2146435072)>>>0,n,o+a);else{var i;if(r<2.2250738585072014e-308)e((i=r/5e-324)>>>0,n,o+t),e((s<<31|i/4294967296)>>>0,n,o+a);else{var p=Math.floor(Math.log(r)/Math.LN2);1024===p&&(p=1023),e(4503599627370496*(i=r*Math.pow(2,-p))>>>0,n,o+t),e((s<<31|p+1023<<20|1048576*i&1048575)>>>0,n,o+a)}}}function a(e,t,a,r,n){var o=e(r,n+t),s=e(r,n+a),i=2*(s>>31)+1,p=s>>>20&2047,u=4294967296*(1048575&s)+o;return 2047===p?u?NaN:i*(1/0):0===p?5e-324*i*u:i*Math.pow(2,p-1075)*(u+4503599627370496)}e.writeDoubleLE=t.bind(null,writeUintLE,0,4),e.writeDoubleBE=t.bind(null,writeUintBE,4,0),e.readDoubleLE=a.bind(null,readUintLE,0,4),e.readDoubleBE=a.bind(null,readUintBE,4,0)}(),e}function writeUintLE(e,t,a){t[a]=255&e,t[a+1]=e>>>8&255,t[a+2]=e>>>16&255,t[a+3]=e>>>24}function writeUintBE(e,t,a){t[a]=e>>>24,t[a+1]=e>>>16&255,t[a+2]=e>>>8&255,t[a+3]=255&e}function readUintLE(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0}function readUintBE(e,t){return(e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3])>>>0}var inquire_1=inquire;function inquire(moduleName){try{var mod$$1=eval("quire".replace(/^/,"re"))(moduleName);if(mod$$1&&(mod$$1.length||Object.keys(mod$$1).length))return mod$$1}catch(e){}return null}var utf8_1=createCommonjsModule(function(e,t){var a=t;a.length=function(e){for(var t=0,a=0,r=0;r191&&r<224?o[s++]=(31&r)<<6|63&e[t++]:r>239&&r<365?(r=((7&r)<<18|(63&e[t++])<<12|(63&e[t++])<<6|63&e[t++])-65536,o[s++]=55296+(r>>10),o[s++]=56320+(1023&r)):o[s++]=(15&r)<<12|(63&e[t++])<<6|63&e[t++],s>8191&&((n||(n=[])).push(String.fromCharCode.apply(String,o)),s=0);return n?(s&&n.push(String.fromCharCode.apply(String,o.slice(0,s))),n.join("")):String.fromCharCode.apply(String,o.slice(0,s))},a.write=function(e,t,a){for(var r,n,o=a,s=0;s>6|192,t[a++]=63&r|128):55296==(64512&r)&&56320==(64512&(n=e.charCodeAt(s+1)))?(r=65536+((1023&r)<<10)+(1023&n),++s,t[a++]=r>>18|240,t[a++]=r>>12&63|128,t[a++]=r>>6&63|128,t[a++]=63&r|128):(t[a++]=r>>12|224,t[a++]=r>>6&63|128,t[a++]=63&r|128);return a-o}}),pool_1=pool;function pool(e,t,a){var r=a||8192,n=r>>>1,o=null,s=r;return function(a){if(a<1||a>n)return e(a);s+a>r&&(o=e(r),s=0);var i=t.call(o,s,s+=a);return 7&s&&(s=1+(7|s)),i}}var longbits=LongBits;function LongBits(e,t){this.lo=e>>>0,this.hi=t>>>0}var zero=LongBits.zero=new LongBits(0,0);zero.toNumber=function(){return 0},zero.zzEncode=zero.zzDecode=function(){return this},zero.length=function(){return 1};var zeroHash=LongBits.zeroHash="\0\0\0\0\0\0\0\0";LongBits.fromNumber=function(e){if(0===e)return zero;var t=e<0;t&&(e=-e);var a=e>>>0,r=(e-a)/4294967296>>>0;return t&&(r=~r>>>0,a=~a>>>0,++a>4294967295&&(a=0,++r>4294967295&&(r=0))),new LongBits(a,r)},LongBits.from=function(e){if("number"==typeof e)return LongBits.fromNumber(e);if(minimal.isString(e)){if(!minimal.Long)return LongBits.fromNumber(parseInt(e,10));e=minimal.Long.fromString(e)}return e.low||e.high?new LongBits(e.low>>>0,e.high>>>0):zero},LongBits.prototype.toNumber=function(e){if(!e&&this.hi>>>31){var t=1+~this.lo>>>0,a=~this.hi>>>0;return t||(a=a+1>>>0),-(t+4294967296*a)}return this.lo+4294967296*this.hi},LongBits.prototype.toLong=function(e){return minimal.Long?new minimal.Long(0|this.lo,0|this.hi,Boolean(e)):{low:0|this.lo,high:0|this.hi,unsigned:Boolean(e)}};var charCodeAt=String.prototype.charCodeAt;LongBits.fromHash=function(e){return e===zeroHash?zero:new LongBits((charCodeAt.call(e,0)|charCodeAt.call(e,1)<<8|charCodeAt.call(e,2)<<16|charCodeAt.call(e,3)<<24)>>>0,(charCodeAt.call(e,4)|charCodeAt.call(e,5)<<8|charCodeAt.call(e,6)<<16|charCodeAt.call(e,7)<<24)>>>0)},LongBits.prototype.toHash=function(){return String.fromCharCode(255&this.lo,this.lo>>>8&255,this.lo>>>16&255,this.lo>>>24,255&this.hi,this.hi>>>8&255,this.hi>>>16&255,this.hi>>>24)},LongBits.prototype.zzEncode=function(){var e=this.hi>>31;return this.hi=((this.hi<<1|this.lo>>>31)^e)>>>0,this.lo=(this.lo<<1^e)>>>0,this},LongBits.prototype.zzDecode=function(){var e=-(1&this.lo);return this.lo=((this.lo>>>1|this.hi<<31)^e)>>>0,this.hi=(this.hi>>>1^e)>>>0,this},LongBits.prototype.length=function(){var e=this.lo,t=(this.lo>>>28|this.hi<<4)>>>0,a=this.hi>>>24;return 0===a?0===t?e<16384?e<128?1:2:e<2097152?3:4:t<16384?t<128?5:6:t<2097152?7:8:a<128?9:10};var minimal=createCommonjsModule(function(e,t){var a=t;function r(e,t,a){for(var r=Object.keys(t),n=0;n0)},a.Buffer=function(){try{var e=a.inquire("buffer").Buffer;return e.prototype.utf8Write?e:null}catch(e){return null}}(),a._Buffer_from=null,a._Buffer_allocUnsafe=null,a.newBuffer=function(e){return"number"==typeof e?a.Buffer?a._Buffer_allocUnsafe(e):new a.Array(e):a.Buffer?a._Buffer_from(e):"undefined"==typeof Uint8Array?e:new Uint8Array(e)},a.Array="undefined"!=typeof Uint8Array?Uint8Array:Array,a.Long=commonjsGlobal.dcodeIO&&commonjsGlobal.dcodeIO.Long||a.inquire("long"),a.key2Re=/^true|false|0|1$/,a.key32Re=/^-?(?:0|[1-9][0-9]*)$/,a.key64Re=/^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/,a.longToHash=function(e){return e?a.LongBits.from(e).toHash():a.LongBits.zeroHash},a.longFromHash=function(e,t){var r=a.LongBits.fromHash(e);return a.Long?a.Long.fromBits(r.lo,r.hi,t):r.toNumber(Boolean(t))},a.merge=r,a.lcFirst=function(e){return e.charAt(0).toLowerCase()+e.substring(1)},a.newError=n,a.ProtocolError=n("ProtocolError"),a.oneOfGetter=function(e){for(var t={},a=0;a-1;--a)if(1===t[e[a]]&&void 0!==this[e[a]]&&null!==this[e[a]])return e[a]}},a.oneOfSetter=function(e){return function(t){for(var a=0;a127;)t[a++]=127&e|128,e>>>=7;t[a]=e}function VarintOp(e,t){this.len=e,this.next=void 0,this.val=t}function writeVarint64(e,t,a){for(;e.hi;)t[a++]=127&e.lo|128,e.lo=(e.lo>>>7|e.hi<<25)>>>0,e.hi>>>=7;for(;e.lo>127;)t[a++]=127&e.lo|128,e.lo=e.lo>>>7;t[a++]=e.lo}function writeFixed32(e,t,a){t[a]=255&e,t[a+1]=e>>>8&255,t[a+2]=e>>>16&255,t[a+3]=e>>>24}Writer.create=minimal.Buffer?function(){return(Writer.create=function(){return new BufferWriter})()}:function(){return new Writer},Writer.alloc=function(e){return new minimal.Array(e)},minimal.Array!==Array&&(Writer.alloc=minimal.pool(Writer.alloc,minimal.Array.prototype.subarray)),Writer.prototype._push=function(e,t,a){return this.tail=this.tail.next=new Op(e,t,a),this.len+=t,this},VarintOp.prototype=Object.create(Op.prototype),VarintOp.prototype.fn=writeVarint32,Writer.prototype.uint32=function(e){return this.len+=(this.tail=this.tail.next=new VarintOp((e>>>=0)<128?1:e<16384?2:e<2097152?3:e<268435456?4:5,e)).len,this},Writer.prototype.int32=function(e){return e<0?this._push(writeVarint64,10,LongBits$1.fromNumber(e)):this.uint32(e)},Writer.prototype.sint32=function(e){return this.uint32((e<<1^e>>31)>>>0)},Writer.prototype.uint64=function(e){var t=LongBits$1.from(e);return this._push(writeVarint64,t.length(),t)},Writer.prototype.int64=Writer.prototype.uint64,Writer.prototype.sint64=function(e){var t=LongBits$1.from(e).zzEncode();return this._push(writeVarint64,t.length(),t)},Writer.prototype.bool=function(e){return this._push(writeByte,1,e?1:0)},Writer.prototype.fixed32=function(e){return this._push(writeFixed32,4,e>>>0)},Writer.prototype.sfixed32=Writer.prototype.fixed32,Writer.prototype.fixed64=function(e){var t=LongBits$1.from(e);return this._push(writeFixed32,4,t.lo)._push(writeFixed32,4,t.hi)},Writer.prototype.sfixed64=Writer.prototype.fixed64,Writer.prototype.float=function(e){return this._push(minimal.float.writeFloatLE,4,e)},Writer.prototype.double=function(e){return this._push(minimal.float.writeDoubleLE,8,e)};var writeBytes=minimal.Array.prototype.set?function(e,t,a){t.set(e,a)}:function(e,t,a){for(var r=0;r>>0;if(!t)return this._push(writeByte,1,0);if(minimal.isString(e)){var a=Writer.alloc(t=base64.length(e));base64.decode(e,a,0),e=a}return this.uint32(t)._push(writeBytes,t,e)},Writer.prototype.string=function(e){var t=utf8.length(e);return t?this.uint32(t)._push(utf8.write,t,e):this._push(writeByte,1,0)},Writer.prototype.fork=function(){return this.states=new State(this),this.head=this.tail=new Op(noop,0,0),this.len=0,this},Writer.prototype.reset=function(){return this.states?(this.head=this.states.head,this.tail=this.states.tail,this.len=this.states.len,this.states=this.states.next):(this.head=this.tail=new Op(noop,0,0),this.len=0),this},Writer.prototype.ldelim=function(){var e=this.head,t=this.tail,a=this.len;return this.reset().uint32(a),a&&(this.tail.next=e.next,this.tail=t,this.len+=a),this},Writer.prototype.finish=function(){for(var e=this.head.next,t=this.constructor.alloc(this.len),a=0;e;)e.fn(e.val,t,a),a+=e.len,e=e.next;return t},Writer._configure=function(e){BufferWriter=e};var writer_buffer=BufferWriter$1;(BufferWriter$1.prototype=Object.create(writer.prototype)).constructor=BufferWriter$1;var Buffer=minimal.Buffer;function BufferWriter$1(){writer.call(this)}BufferWriter$1.alloc=function(e){return(BufferWriter$1.alloc=minimal._Buffer_allocUnsafe)(e)};var writeBytesBuffer=Buffer&&Buffer.prototype instanceof Uint8Array&&"set"===Buffer.prototype.set.name?function(e,t,a){t.set(e,a)}:function(e,t,a){if(e.copy)e.copy(t,a,0,e.length);else for(var r=0;r>>0;return this.uint32(t),t&&this._push(writeBytesBuffer,t,e),this},BufferWriter$1.prototype.string=function(e){var t=Buffer.byteLength(e);return this.uint32(t),t&&this._push(writeStringBuffer,t,e),this};var reader=Reader,BufferReader,LongBits$2=minimal.LongBits,utf8$1=minimal.utf8;function indexOutOfRange(e,t){return RangeError("index out of range: "+e.pos+" + "+(t||1)+" > "+e.len)}function Reader(e){this.buf=e,this.pos=0,this.len=e.length}var create_array="undefined"!=typeof Uint8Array?function(e){if(e instanceof Uint8Array||Array.isArray(e))return new Reader(e);throw Error("illegal buffer")}:function(e){if(Array.isArray(e))return new Reader(e);throw Error("illegal buffer")};function readLongVarint(){var e=new LongBits$2(0,0),t=0;if(!(this.len-this.pos>4)){for(;t<3;++t){if(this.pos>=this.len)throw indexOutOfRange(this);if(e.lo=(e.lo|(127&this.buf[this.pos])<<7*t)>>>0,this.buf[this.pos++]<128)return e}return e.lo=(e.lo|(127&this.buf[this.pos++])<<7*t)>>>0,e}for(;t<4;++t)if(e.lo=(e.lo|(127&this.buf[this.pos])<<7*t)>>>0,this.buf[this.pos++]<128)return e;if(e.lo=(e.lo|(127&this.buf[this.pos])<<28)>>>0,e.hi=(e.hi|(127&this.buf[this.pos])>>4)>>>0,this.buf[this.pos++]<128)return e;if(t=0,this.len-this.pos>4){for(;t<5;++t)if(e.hi=(e.hi|(127&this.buf[this.pos])<<7*t+3)>>>0,this.buf[this.pos++]<128)return e}else for(;t<5;++t){if(this.pos>=this.len)throw indexOutOfRange(this);if(e.hi=(e.hi|(127&this.buf[this.pos])<<7*t+3)>>>0,this.buf[this.pos++]<128)return e}throw Error("invalid varint encoding")}function readFixed32_end(e,t){return(e[t-4]|e[t-3]<<8|e[t-2]<<16|e[t-1]<<24)>>>0}function readFixed64(){if(this.pos+8>this.len)throw indexOutOfRange(this,8);return new LongBits$2(readFixed32_end(this.buf,this.pos+=4),readFixed32_end(this.buf,this.pos+=4))}Reader.create=minimal.Buffer?function(e){return(Reader.create=function(e){return minimal.Buffer.isBuffer(e)?new BufferReader(e):create_array(e)})(e)}:create_array,Reader.prototype._slice=minimal.Array.prototype.subarray||minimal.Array.prototype.slice,Reader.prototype.uint32=function(){var e=4294967295;return function(){if(e=(127&this.buf[this.pos])>>>0,this.buf[this.pos++]<128)return e;if(e=(e|(127&this.buf[this.pos])<<7)>>>0,this.buf[this.pos++]<128)return e;if(e=(e|(127&this.buf[this.pos])<<14)>>>0,this.buf[this.pos++]<128)return e;if(e=(e|(127&this.buf[this.pos])<<21)>>>0,this.buf[this.pos++]<128)return e;if(e=(e|(15&this.buf[this.pos])<<28)>>>0,this.buf[this.pos++]<128)return e;if((this.pos+=5)>this.len)throw this.pos=this.len,indexOutOfRange(this,10);return e}}(),Reader.prototype.int32=function(){return 0|this.uint32()},Reader.prototype.sint32=function(){var e=this.uint32();return e>>>1^-(1&e)|0},Reader.prototype.bool=function(){return 0!==this.uint32()},Reader.prototype.fixed32=function(){if(this.pos+4>this.len)throw indexOutOfRange(this,4);return readFixed32_end(this.buf,this.pos+=4)},Reader.prototype.sfixed32=function(){if(this.pos+4>this.len)throw indexOutOfRange(this,4);return 0|readFixed32_end(this.buf,this.pos+=4)},Reader.prototype.float=function(){if(this.pos+4>this.len)throw indexOutOfRange(this,4);var e=minimal.float.readFloatLE(this.buf,this.pos);return this.pos+=4,e},Reader.prototype.double=function(){if(this.pos+8>this.len)throw indexOutOfRange(this,4);var e=minimal.float.readDoubleLE(this.buf,this.pos);return this.pos+=8,e},Reader.prototype.bytes=function(){var e=this.uint32(),t=this.pos,a=this.pos+e;if(a>this.len)throw indexOutOfRange(this,e);return this.pos+=e,Array.isArray(this.buf)?this.buf.slice(t,a):t===a?new this.buf.constructor(0):this._slice.call(this.buf,t,a)},Reader.prototype.string=function(){var e=this.bytes();return utf8$1.read(e,0,e.length)},Reader.prototype.skip=function(e){if("number"==typeof e){if(this.pos+e>this.len)throw indexOutOfRange(this,e);this.pos+=e}else do{if(this.pos>=this.len)throw indexOutOfRange(this)}while(128&this.buf[this.pos++]);return this},Reader.prototype.skipType=function(e){switch(e){case 0:this.skip();break;case 1:this.skip(8);break;case 2:this.skip(this.uint32());break;case 3:for(;;){if(4==(e=7&this.uint32()))break;this.skipType(e)}break;case 5:this.skip(4);break;default:throw Error("invalid wire type "+e+" at offset "+this.pos)}return this},Reader._configure=function(e){BufferReader=e;var t=minimal.Long?"toLong":"toNumber";minimal.merge(Reader.prototype,{int64:function(){return readLongVarint.call(this)[t](!1)},uint64:function(){return readLongVarint.call(this)[t](!0)},sint64:function(){return readLongVarint.call(this).zzDecode()[t](!1)},fixed64:function(){return readFixed64.call(this)[t](!0)},sfixed64:function(){return readFixed64.call(this)[t](!1)}})};var reader_buffer=BufferReader$1;function BufferReader$1(e){reader.call(this,e)}(BufferReader$1.prototype=Object.create(reader.prototype)).constructor=BufferReader$1,minimal.Buffer&&(BufferReader$1.prototype._slice=minimal.Buffer.prototype.slice),BufferReader$1.prototype.string=function(){var e=this.uint32();return this.buf.utf8Slice(this.pos,this.pos=Math.min(this.pos+e,this.len))};var service=Service;function Service(e,t,a){if("function"!=typeof e)throw TypeError("rpcImpl must be a function");minimal.EventEmitter.call(this),this.rpcImpl=e,this.requestDelimited=Boolean(t),this.responseDelimited=Boolean(a)}(Service.prototype=Object.create(minimal.EventEmitter.prototype)).constructor=Service,Service.prototype.rpcCall=function e(t,a,r,n,o){if(!n)throw TypeError("request must be specified");var s=this;if(!o)return minimal.asPromise(e,s,t,a,r,n);if(s.rpcImpl)try{return s.rpcImpl(t,a[s.requestDelimited?"encodeDelimited":"encode"](n).finish(),function(e,a){if(e)return s.emit("error",e,t),o(e);if(null!==a){if(!(a instanceof r))try{a=r[s.responseDelimited?"decodeDelimited":"decode"](a)}catch(e){return s.emit("error",e,t),o(e)}return s.emit("data",a,t),o(null,a)}s.end(!0)})}catch(e){return s.emit("error",e,t),void setTimeout(function(){o(e)},0)}else setTimeout(function(){o(Error("already ended"))},0)},Service.prototype.end=function(e){return this.rpcImpl&&(e||this.rpcImpl(null,null,null),this.rpcImpl=null,this.emit("end").off()),this};var rpc_1=createCommonjsModule(function(e,t){t.Service=service}),roots={},indexMinimal=createCommonjsModule(function(e,t){var a=t;function r(){a.Reader._configure(a.BufferReader),a.util._configure()}a.build="minimal",a.Writer=writer,a.BufferWriter=writer_buffer,a.Reader=reader,a.BufferReader=reader_buffer,a.util=minimal,a.rpc=rpc_1,a.roots=roots,a.configure=r,a.Writer._configure(a.BufferWriter),r()}),minimal$1=indexMinimal,minimal_1=minimal$1.roots,minimal_2=minimal$1.Reader,minimal_3=minimal$1.util,$Reader=minimal$1.Reader,$util=minimal$1.util,$root=minimal$1.roots.default||(minimal$1.roots.default={});$root.tensorflow=function(){var e,t,a={};return a.Any=function(){function e(e){if(e)for(var t=Object.keys(e),a=0;a>>3){case 1:r.typeUrl=e.string();break;case 2:r.value=e.bytes();break;default:e.skipType(7&n)}}return r},e}(),a.DataType=(e={},(t=Object.create(e))[e[0]="DT_INVALID"]=0,t[e[1]="DT_FLOAT"]=1,t[e[2]="DT_DOUBLE"]=2,t[e[3]="DT_INT32"]=3,t[e[4]="DT_UINT8"]=4,t[e[5]="DT_INT16"]=5,t[e[6]="DT_INT8"]=6,t[e[7]="DT_STRING"]=7,t[e[8]="DT_COMPLEX64"]=8,t[e[9]="DT_INT64"]=9,t[e[10]="DT_BOOL"]=10,t[e[11]="DT_QINT8"]=11,t[e[12]="DT_QUINT8"]=12,t[e[13]="DT_QINT32"]=13,t[e[14]="DT_BFLOAT16"]=14,t[e[101]="DT_FLOAT_REF"]=101,t[e[102]="DT_DOUBLE_REF"]=102,t[e[103]="DT_INT32_REF"]=103,t[e[104]="DT_UINT8_REF"]=104,t[e[105]="DT_INT16_REF"]=105,t[e[106]="DT_INT8_REF"]=106,t[e[107]="DT_STRING_REF"]=107,t[e[108]="DT_COMPLEX64_REF"]=108,t[e[109]="DT_INT64_REF"]=109,t[e[110]="DT_BOOL_REF"]=110,t[e[111]="DT_QINT8_REF"]=111,t[e[112]="DT_QUINT8_REF"]=112,t[e[113]="DT_QINT32_REF"]=113,t[e[114]="DT_BFLOAT16_REF"]=114,t),a.TensorShape=function(){function e(e){if(this.dim=[],e)for(var t=Object.keys(e),a=0;a>>3){case 2:r.dim&&r.dim.length||(r.dim=[]),r.dim.push($root.tensorflow.TensorShape.Dim.decode(e,e.uint32()));break;case 3:r.unknownRank=e.bool();break;default:e.skipType(7&n)}}return r},e.Dim=function(){function e(e){if(e)for(var t=Object.keys(e),a=0;a>>3){case 1:r.size=e.int64();break;case 2:r.name=e.string();break;default:e.skipType(7&n)}}return r},e}(),e}(),a.Tensor=function(){function e(e){if(this.floatVal=[],this.doubleVal=[],this.intVal=[],this.stringVal=[],this.scomplexVal=[],this.int64Val=[],this.boolVal=[],this.uint32Val=[],this.uint64Val=[],e)for(var t=Object.keys(e),a=0;a>>3){case 1:r.dtype=e.int32();break;case 2:r.tensorShape=$root.tensorflow.TensorShape.decode(e,e.uint32());break;case 3:r.versionNumber=e.int32();break;case 4:r.tensorContent=e.bytes();break;case 5:if(r.floatVal&&r.floatVal.length||(r.floatVal=[]),2==(7&n))for(var o=e.uint32()+e.pos;e.pos>>3){case 1:r.list=$root.tensorflow.AttrValue.ListValue.decode(e,e.uint32());break;case 2:r.s=e.bytes();break;case 3:r.i=e.int64();break;case 4:r.f=e.float();break;case 5:r.b=e.bool();break;case 6:r.type=e.int32();break;case 7:r.shape=$root.tensorflow.TensorShape.decode(e,e.uint32());break;case 8:r.tensor=$root.tensorflow.Tensor.decode(e,e.uint32());break;case 9:r.placeholder=e.string();break;case 10:r.func=$root.tensorflow.NameAttrList.decode(e,e.uint32());break;default:e.skipType(7&n)}}return r},e.ListValue=function(){function e(e){if(this.s=[],this.i=[],this.f=[],this.b=[],this.type=[],this.shape=[],this.tensor=[],this.func=[],e)for(var t=Object.keys(e),a=0;a>>3){case 2:r.s&&r.s.length||(r.s=[]),r.s.push(e.bytes());break;case 3:if(r.i&&r.i.length||(r.i=[]),2==(7&n))for(var o=e.uint32()+e.pos;e.pos>>3){case 1:n.name=e.string();break;case 2:e.skip().pos++,n.attr===$util.emptyObject&&(n.attr={}),a=e.string(),e.pos++,n.attr[a]=$root.tensorflow.AttrValue.decode(e,e.uint32());break;default:e.skipType(7&o)}}return n},e}(),a.NodeDef=function(){function e(e){if(this.input=[],this.attr={},e)for(var t=Object.keys(e),a=0;a>>3){case 1:n.name=e.string();break;case 2:n.op=e.string();break;case 3:n.input&&n.input.length||(n.input=[]),n.input.push(e.string());break;case 4:n.device=e.string();break;case 5:e.skip().pos++,n.attr===$util.emptyObject&&(n.attr={}),a=e.string(),e.pos++,n.attr[a]=$root.tensorflow.AttrValue.decode(e,e.uint32());break;default:e.skipType(7&o)}}return n},e}(),a.VersionDef=function(){function e(e){if(this.badConsumers=[],e)for(var t=Object.keys(e),a=0;a>>3){case 1:r.producer=e.int32();break;case 2:r.minConsumer=e.int32();break;case 3:if(r.badConsumers&&r.badConsumers.length||(r.badConsumers=[]),2==(7&n))for(var o=e.uint32()+e.pos;e.pos>>3){case 1:r.node&&r.node.length||(r.node=[]),r.node.push($root.tensorflow.NodeDef.decode(e,e.uint32()));break;case 4:r.versions=$root.tensorflow.VersionDef.decode(e,e.uint32());break;case 2:r.library=$root.tensorflow.FunctionDefLibrary.decode(e,e.uint32());break;default:e.skipType(7&n)}}return r},e}(),a.CollectionDef=function(){function e(e){if(e)for(var t=Object.keys(e),a=0;a>>3){case 1:r.nodeList=$root.tensorflow.CollectionDef.NodeList.decode(e,e.uint32());break;case 2:r.bytesList=$root.tensorflow.CollectionDef.BytesList.decode(e,e.uint32());break;case 3:r.int64List=$root.tensorflow.CollectionDef.Int64List.decode(e,e.uint32());break;case 4:r.floatList=$root.tensorflow.CollectionDef.FloatList.decode(e,e.uint32());break;case 5:r.anyList=$root.tensorflow.CollectionDef.AnyList.decode(e,e.uint32());break;default:e.skipType(7&n)}}return r},e.NodeList=function(){function e(e){if(this.value=[],e)for(var t=Object.keys(e),a=0;a>>3){case 1:r.value&&r.value.length||(r.value=[]),r.value.push(e.string());break;default:e.skipType(7&n)}}return r},e}(),e.BytesList=function(){function e(e){if(this.value=[],e)for(var t=Object.keys(e),a=0;a>>3){case 1:r.value&&r.value.length||(r.value=[]),r.value.push(e.bytes());break;default:e.skipType(7&n)}}return r},e}(),e.Int64List=function(){function e(e){if(this.value=[],e)for(var t=Object.keys(e),a=0;a>>3){case 1:if(r.value&&r.value.length||(r.value=[]),2==(7&n))for(var o=e.uint32()+e.pos;e.pos>>3){case 1:if(r.value&&r.value.length||(r.value=[]),2==(7&n))for(var o=e.uint32()+e.pos;e.pos>>3){case 1:r.value&&r.value.length||(r.value=[]),r.value.push($root.tensorflow.Any.decode(e,e.uint32()));break;default:e.skipType(7&n)}}return r},e}(),e}(),a.SaverDef=function(){function e(e){if(e)for(var t=Object.keys(e),a=0;a>>3){case 1:r.filenameTensorName=e.string();break;case 2:r.saveTensorName=e.string();break;case 3:r.restoreOpName=e.string();break;case 4:r.maxToKeep=e.int32();break;case 5:r.sharded=e.bool();break;case 6:r.keepCheckpointEveryNHours=e.float();break;case 7:r.version=e.int32();break;default:e.skipType(7&n)}}return r},e.CheckpointFormatVersion=(t={},(a=Object.create(t))[t[0]="LEGACY"]=0,a[t[1]="V1"]=1,a[t[2]="V2"]=2,a),e}(),a.TensorInfo=function(){function e(e){if(e)for(var t=Object.keys(e),a=0;a>>3){case 1:r.name=e.string();break;case 4:r.cooSparse=$root.tensorflow.TensorInfo.CooSparse.decode(e,e.uint32());break;case 2:r.dtype=e.int32();break;case 3:r.tensorShape=$root.tensorflow.TensorShape.decode(e,e.uint32());break;default:e.skipType(7&n)}}return r},e.CooSparse=function(){function e(e){if(e)for(var t=Object.keys(e),a=0;a>>3){case 1:r.valuesTensorName=e.string();break;case 2:r.indicesTensorName=e.string();break;case 3:r.denseShapeTensorName=e.string();break;default:e.skipType(7&n)}}return r},e}(),e}(),a.SignatureDef=function(){function e(e){if(this.inputs={},this.outputs={},e)for(var t=Object.keys(e),a=0;a>>3){case 1:e.skip().pos++,n.inputs===$util.emptyObject&&(n.inputs={}),a=e.string(),e.pos++,n.inputs[a]=$root.tensorflow.TensorInfo.decode(e,e.uint32());break;case 2:e.skip().pos++,n.outputs===$util.emptyObject&&(n.outputs={}),a=e.string(),e.pos++,n.outputs[a]=$root.tensorflow.TensorInfo.decode(e,e.uint32());break;case 3:n.methodName=e.string();break;default:e.skipType(7&o)}}return n},e}(),a.AssetFileDef=function(){function e(e){if(e)for(var t=Object.keys(e),a=0;a>>3){case 1:r.tensorInfo=$root.tensorflow.TensorInfo.decode(e,e.uint32());break;case 2:r.filename=e.string();break;default:e.skipType(7&n)}}return r},e}(),a.OpDef=function(){function e(e){if(this.inputArg=[],this.outputArg=[],this.attr=[],e)for(var t=Object.keys(e),a=0;a>>3){case 1:r.name=e.string();break;case 2:r.inputArg&&r.inputArg.length||(r.inputArg=[]),r.inputArg.push($root.tensorflow.OpDef.ArgDef.decode(e,e.uint32()));break;case 3:r.outputArg&&r.outputArg.length||(r.outputArg=[]),r.outputArg.push($root.tensorflow.OpDef.ArgDef.decode(e,e.uint32()));break;case 4:r.attr&&r.attr.length||(r.attr=[]),r.attr.push($root.tensorflow.OpDef.AttrDef.decode(e,e.uint32()));break;case 8:r.deprecation=$root.tensorflow.OpDef.OpDeprecation.decode(e,e.uint32());break;case 5:r.summary=e.string();break;case 6:r.description=e.string();break;case 18:r.isCommutative=e.bool();break;case 16:r.isAggregate=e.bool();break;case 17:r.isStateful=e.bool();break;case 19:r.allowsUninitializedInput=e.bool();break;default:e.skipType(7&n)}}return r},e.ArgDef=function(){function e(e){if(e)for(var t=Object.keys(e),a=0;a>>3){case 1:r.name=e.string();break;case 2:r.description=e.string();break;case 3:r.type=e.int32();break;case 4:r.typeAttr=e.string();break;case 5:r.numberAttr=e.string();break;case 6:r.typeListAttr=e.string();break;case 16:r.isRef=e.bool();break;default:e.skipType(7&n)}}return r},e}(),e.AttrDef=function(){function e(e){if(e)for(var t=Object.keys(e),a=0;a>>3){case 1:r.name=e.string();break;case 2:r.type=e.string();break;case 3:r.defaultValue=$root.tensorflow.AttrValue.decode(e,e.uint32());break;case 4:r.description=e.string();break;case 5:r.hasMinimum=e.bool();break;case 6:r.minimum=e.int64();break;case 7:r.allowedValues=$root.tensorflow.AttrValue.decode(e,e.uint32());break;default:e.skipType(7&n)}}return r},e}(),e.OpDeprecation=function(){function e(e){if(e)for(var t=Object.keys(e),a=0;a>>3){case 1:r.version=e.int32();break;case 2:r.explanation=e.string();break;default:e.skipType(7&n)}}return r},e}(),e}(),a.OpList=function(){function e(e){if(this.op=[],e)for(var t=Object.keys(e),a=0;a>>3){case 1:r.op&&r.op.length||(r.op=[]),r.op.push($root.tensorflow.OpDef.decode(e,e.uint32()));break;default:e.skipType(7&n)}}return r},e}(),a.MetaGraphDef=function(){function e(e){if(this.collectionDef={},this.signatureDef={},this.assetFileDef=[],e)for(var t=Object.keys(e),a=0;a>>3){case 1:n.metaInfoDef=$root.tensorflow.MetaGraphDef.MetaInfoDef.decode(e,e.uint32());break;case 2:n.graphDef=$root.tensorflow.GraphDef.decode(e,e.uint32());break;case 3:n.saverDef=$root.tensorflow.SaverDef.decode(e,e.uint32());break;case 4:e.skip().pos++,n.collectionDef===$util.emptyObject&&(n.collectionDef={}),a=e.string(),e.pos++,n.collectionDef[a]=$root.tensorflow.CollectionDef.decode(e,e.uint32());break;case 5:e.skip().pos++,n.signatureDef===$util.emptyObject&&(n.signatureDef={}),a=e.string(),e.pos++,n.signatureDef[a]=$root.tensorflow.SignatureDef.decode(e,e.uint32());break;case 6:n.assetFileDef&&n.assetFileDef.length||(n.assetFileDef=[]),n.assetFileDef.push($root.tensorflow.AssetFileDef.decode(e,e.uint32()));break;default:e.skipType(7&o)}}return n},e.MetaInfoDef=function(){function e(e){if(this.tags=[],e)for(var t=Object.keys(e),a=0;a>>3){case 1:r.metaGraphVersion=e.string();break;case 2:r.strippedOpList=$root.tensorflow.OpList.decode(e,e.uint32());break;case 3:r.anyInfo=$root.tensorflow.Any.decode(e,e.uint32());break;case 4:r.tags&&r.tags.length||(r.tags=[]),r.tags.push(e.string());break;case 5:r.tensorflowVersion=e.string();break;case 6:r.tensorflowGitVersion=e.string();break;default:e.skipType(7&n)}}return r},e}(),e}(),a.SavedModel=function(){function e(e){if(this.metaGraphs=[],e)for(var t=Object.keys(e),a=0;a>>3){case 1:r.savedModelSchemaVersion=e.int64();break;case 2:r.metaGraphs&&r.metaGraphs.length||(r.metaGraphs=[]),r.metaGraphs.push($root.tensorflow.MetaGraphDef.decode(e,e.uint32()));break;default:e.skipType(7&n)}}return r},e}(),a.FunctionDefLibrary=function(){function e(e){if(this.function=[],this.gradient=[],e)for(var t=Object.keys(e),a=0;a>>3){case 1:r.function&&r.function.length||(r.function=[]),r.function.push($root.tensorflow.FunctionDef.decode(e,e.uint32()));break;case 2:r.gradient&&r.gradient.length||(r.gradient=[]),r.gradient.push($root.tensorflow.GradientDef.decode(e,e.uint32()));break;default:e.skipType(7&n)}}return r},e}(),a.FunctionDef=function(){function e(e){if(this.attr={},this.nodeDef=[],this.ret={},e)for(var t=Object.keys(e),a=0;a>>3){case 1:n.signature=$root.tensorflow.OpDef.decode(e,e.uint32());break;case 5:e.skip().pos++,n.attr===$util.emptyObject&&(n.attr={}),a=e.string(),e.pos++,n.attr[a]=$root.tensorflow.AttrValue.decode(e,e.uint32());break;case 3:n.nodeDef&&n.nodeDef.length||(n.nodeDef=[]),n.nodeDef.push($root.tensorflow.NodeDef.decode(e,e.uint32()));break;case 4:e.skip().pos++,n.ret===$util.emptyObject&&(n.ret={}),a=e.string(),e.pos++,n.ret[a]=e.string();break;default:e.skipType(7&o)}}return n},e}(),a.GradientDef=function(){function e(e){if(e)for(var t=Object.keys(e),a=0;a>>3){case 1:r.functionName=e.string();break;case 2:r.gradientFunc=e.string();break;default:e.skipType(7&n)}}return r},e}(),a}();var compiled_api=$root,compiled_api_1=compiled_api.tensorflow;function getParamValue(e,t,a,r){var n=t.params[e];if(n&&void 0!==n.inputIndex){if("tensor"===n.type)return getTensor(t.inputNames[n.inputIndex],a,r);if("tensors"===n.type)return(0===n.inputIndex?0===n.inputParamLength?t.inputNames:t.inputNames.slice(n.inputIndex,-n.inputParamLength):t.inputNames.splice(n.inputIndex)).map(function(e){return getTensor(e,a,r)});var o=Array.prototype.slice.call(getTensor(t.inputNames.slice(n.inputIndex)[0],a,r).dataSync());return"number"===n.type?o[0]:o}return n&&n.value}function getTensor(e,t,a){var r=parseNodeName(e),n=r[0],o=r[1],s=a.currentContextIds.find(function(e){return!!t[getNodeNameWithContextId(n,e)]});return void 0!==s?t[getNodeNameWithContextId(n,s)][o]:void 0}function getNodeNameAndIndex(e,t){var a=parseNodeName(e),r=a[0],n=a[1];return[getNodeNameWithContextId(r,t&&t.currentContextId),n]}function getNodeNameWithContextId(e,t){return t?e+"-"+t:e}function parseNodeName(e){var t=e.lastIndexOf(":");return-1===t?[e,0]:[e.substring(0,t),Number(e.substring(t+1))]}function split$1(e,t){for(var a=[],r=0;r=this.tensors.length)throw new Error("Tried to read from index "+e+", but array size is: "+this.tensors.length);var t=this.tensors[e];if(t.cleared)throw new Error("TensorArray "+this.name+": Could not read index "+e+" twice because it was cleared after a previous read (perhaps try setting clear_after_read = false?).");return this.clearAfterRead&&(t.cleared=!0),t.read=!0,t.tensor},e.prototype.readMany=function(e){var t=this;return e.map(function(e){return t.read(e)})},e.prototype.write=function(e,t){if(this.closed_)throw new Error("TensorArray "+this.name+" has already been closed.");if(e<0||!this.dynamicSize&&e>=this.maxSize)throw new Error("Tried to write to index "+e+", but array is not resizeable and size is: "+this.maxSize);var a=this.tensors[e]||{};if(t.dtype!==this.dtype)throw new Error("TensorArray "+this.name+": Could not write to TensorArray index "+e+",\n because the value dtype is "+t.dtype+", but TensorArray dtype is "+this.dtype+".");if(0===this.size()&&0===this.elementShape.length&&(this.elementShape=t.shape),this.assertShapesMatch(this.elementShape,t.shape,"TensorArray "+this.name+": Could not write to TensorArray index "+e+"."),a&&a.read)throw new Error("TensorArray "+this.name+": Could not write to TensorArray index "+e+", because it has already been read.");if(a&&a.written)throw new Error("TensorArray "+this.name+": Could not write to TensorArray index "+e+", because it has already been written.");a.tensor=t,a.written=!0,this.tensors[e]=a},e.prototype.writeMany=function(e,t){var a=this;if(e.length!==t.length)throw new Error("TensorArray "+this.name+": could not write multiple tensors,because the index size: "+e.length+" is not the same as tensors size: "+t.length+".");e.forEach(function(e,r){return a.write(e,t[r])})},e.prototype.gather=function(e,t){if(t&&t!==this.dtype)throw new Error("TensorArray dtype is "+this.dtype+" but gather requested dtype "+t);if(!e){e=[];for(var a=0;a=this.maxSize)throw new Error("Max index must be < array size ("+a+" vs. "+this.maxSize+")");this.writeMany(e,Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["unstack"])(t,0))},e.prototype.split=function(e,t){var a=this;if(t.dtype!==this.dtype)throw new Error("TensorArray dtype is "+this.dtype+" but tensor has dtype "+t.dtype);var r=0,n=e.map(function(e){return r+=e});if(r!==t.shape[0])throw new Error("Expected sum of lengths to be equal to\n tensor.shape[0], but sum of lengths is\n "+r+", and tensor's shape is: "+t.shape);if(!this.dynamicSize&&e.length!==this.maxSize)throw new Error("TensorArray's size is not equal to the size of lengths ("+this.maxSize+" vs. "+e.length+"), and the TensorArray is not marked as dynamically resizeable");var o=0===r?0:t.size/r,s=[];Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){t=t.reshape([1,r,o]);for(var i=0;i1)for(var g=1;g1))throw new Error("Cannot exit frame, the context is empty");this.contexts=this.contexts.slice(),this.contexts.splice(-1),this.currentContextIds.shift()},e.prototype.nextIteration=function(){if(!(this.contexts&&this.contexts.length>0))throw new Error("Cannot increase frame iteration, the context is empty");this.contexts=this.contexts.slice(),this.lastId++;var e=Object.assign({},this.contexts[this.contexts.length-1]);e.iterationId+=1,e.id=this.lastId,this.contexts.splice(-1,1,e),this._currentContextIds.splice(0,1,this.contextIdforContexts(this.contexts))},e.prototype.getWeight=function(e){return this.weightMap[e]},e.prototype.addTensorArray=function(e){this.tensorArrayMap[e.id]=e},e.prototype.getTensorArray=function(e){return this.tensorArrayMap[e]},e}(),GraphExecutor=function(){function e(e){this.graph=e,this.compiledMap=new Map,this._weightMap={},this.SEPERATOR=",",this.placeholders=e.placeholders,this._outputs=e.outputs,this.compile()}return Object.defineProperty(e.prototype,"weightMap",{get:function(){return this._weightMap},set:function(e){var t=Object.keys(e).map(function(t){return e[t].map(function(e){return e.id})});this.weightIds=[].concat.apply([],t),this._weightMap=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"inputs",{get:function(){return this.placeholders.map(function(e){return{name:e.name,shape:e.params.shape?e.params.shape.value:void 0,dtype:e.params.dtype?e.params.dtype.value:void 0}})},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"outputs",{get:function(){return this._outputs.map(function(e){return{name:e.name,shape:e.params.shape?e.params.shape.value:void 0,dtype:e.params.dtype?e.params.dtype.value:void 0}})},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"inputNodes",{get:function(){return this.placeholders.map(function(e){return e.name})},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"outputNodes",{get:function(){return this.outputs.map(function(e){return e.name})},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isControlFlowModel",{get:function(){return this.graph.withControlFlow},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isDynamicShapeModel",{get:function(){return this.graph.withDynamicShape},enumerable:!0,configurable:!0}),e.prototype.compile=function(e){if(!this.graph.withControlFlow&&!this.graph.withDynamicShape){var t=[],a=e||this.graph.placeholders,r=a.map(function(e){return e.name}).sort().join(this.SEPERATOR);if(!this.compiledMap.get(r)){for(var n=a.concat(this.graph.weights),o={};n.length>0;){var s=n.pop();o[s.name]=!0,t.push(s),s.children.forEach(function(e){!o[e.name]&&e.inputNames.every(function(e){var t=getNodeNameAndIndex(e)[0];return o[t]})&&n.push(e)})}this.compiledMap.set(r,t)}}},e.prototype.execute=function(e,t,a){var r=this;void 0===t&&(t=!0);var n=Object.keys(e).sort();this.checkInput(e,t),this.checkInputShapeAndType(e,t),this.compile(n.map(function(e){return r.graph.nodes[e]}));var o=this.calculateOutputs(a);this.checkOutput(this.compiledMap.get(n.join(this.SEPERATOR)),o);var s={};return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){for(var t=new ExecutionContext(r._weightMap,s),a=__assign({},r.weightMap,e),i=r.compiledMap.get(n.join(r.SEPERATOR)),p=0;p0?(i=this.processStack(r,n,t,o,s),[4,Promise.all(i)]):[3,3];case 2:return u.sent(),[3,1];case 3:return[2,o]}})})},e.prototype.processStack=function(e,t,a,r,n){for(var o=this,s=[],i=function(){var i=t.pop();a.currentContext=i.contexts;var u="";if("enter"===i.node.op&&getParamValue("isConstant",i.node,r,a)&&(u=getNodeNameAndIndex(i.node.name,a)[0]),-1===e.indexOf(i.node)){var m=executeOp$15(i.node,r,a);u||(u=getNodeNameAndIndex(i.node.name,a)[0]);var l=a.currentContext;m instanceof Promise?s.push(m.then(function(e){return r[u]=e,a.currentContext=l,o.processChildNodes(i.node,t,a,r,n),e})):(r[u]=m,p.processChildNodes(i.node,t,a,r,n))}else p.processChildNodes(i.node,t,a,r,n)},p=this;t.length>0;)i();return s},e.prototype.processChildNodes=function(e,t,a,r,n){e.children.forEach(function(e){var o=getNodeNameAndIndex(e.name,a)[0];n[o]||("merge"===e.op?e.inputNames.some(function(e){return!!getTensor(e,r,a)})&&(n[o]=!0,t.push({contexts:a.currentContext,node:e})):e.inputNames.every(function(e){return!!getTensor(e,r,a)})&&(n[o]=!0,t.push({contexts:a.currentContext,node:e})))})},e.prototype.calculateOutputs=function(e){return!e||e instanceof Array||(e=[e]),e||this.graph.outputs.map(function(e){return e.name})},e.prototype.findOutputs=function(e,t,a){return this.calculateOutputs(a).reduce(function(a,r){return a[r]=getTensor(r,e,t),a},{})},e.prototype.dispose=function(){var e=this;Object.keys(this.weightMap).forEach(function(t){return e.weightMap[t].forEach(function(e){return e.dispose()})})},e.prototype.checkInputShapeAndType=function(e,t){void 0===t&&(t=!0),this.placeholders.forEach(function(a){var r=e[a.name];if(t||r){var n=r[0];if(a.params.shape&&a.params.shape.value){var o=a.params.shape.value,s=o.length===n.shape.length&&n.shape.every(function(e,t){return-1===o[t]||o[t]===e});_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(s,"The shape of dict['"+a.name+"'] provided in model.execute(dict) must be ["+o+"], but was ["+n.shape+"]")}a.params.dtype&&a.params.dtype.value&&_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(n.dtype===a.params.dtype.value,"The dtype of dict['"+a.name+"'] provided in model.execute(dict) must be "+a.params.dtype.value+", but was "+n.dtype)}})},e.prototype.checkInput=function(e,t){var a=this;void 0===t&&(t=!0);var r=Object.keys(e),n=[],o=[];this.inputNodes.forEach(function(e){-1===r.indexOf(e)&&n.push(e)}),r.forEach(function(e){-1===a.inputNodes.indexOf(e)&&o.push(e)});var s=o.filter(function(e){return!a.graph.nodes[e]});if(n.length>0&&t)throw new Error("The dict provided in model.execute(dict) has the keys ["+r+"], but is missing the required keys: ["+n+"].");if(o.length>0&&t)throw new Error("The dict provided in model.execute(dict) has unused keys: ["+o+"]. Please provide only the following keys: ["+this.inputNodes+"].");if(s.length>0)throw new Error("The dict provided in model.execute(dict) has keys: ["+s+"] not part of model graph.")},e.prototype.checkOutput=function(e,t){var a=e.map(function(e){return e.name}),r=[];if(t.forEach(function(e){-1===a.indexOf(e)&&r.push(e)}),r.length>0)throw new Error("The following outputs are not be generated by the execution: ["+r+"].")},e}(),FrozenModel=function(){function e(e,t,a){this.modelUrl=e,this.weightManifestUrl=t,this.requestOption=a,this.version="n/a"}return Object.defineProperty(e.prototype,"modelVersion",{get:function(){return this.version},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"inputNodes",{get:function(){return this.executor.inputNodes},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"outputNodes",{get:function(){return this.executor.outputNodes},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"inputs",{get:function(){return this.executor.inputs},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"outputs",{get:function(){return this.executor.outputs},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"weights",{get:function(){return this.executor.weightMap},enumerable:!0,configurable:!0}),e.prototype.findIOHandler=function(){var e=[this.modelUrl,this.weightManifestUrl];if(this.requestOption)this.handler=_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["io"].browserHTTPRequest(e,this.requestOption);else{var t=_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["io"].getLoadHandlers(e);if(0===t.length)t.push(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["io"].browserHTTPRequest(e,this.requestOption));else if(t.length>1)throw new Error("Found more than one ("+t.length+") load handlers for URL '"+[e]+"'");this.handler=t[0]}},e.prototype.load=function(){return __awaiter(this,void 0,void 0,function(){var e,t,a;return __generator(this,function(r){switch(r.label){case 0:if(this.findIOHandler(),null==this.handler.load)throw new Error("Cannot proceed with model loading because the IOHandler provided does not have the `load` method implemented.");return[4,this.handler.load()];case 1:return e=r.sent(),t=compiled_api_1.GraphDef.decode(new Uint8Array(e.modelTopology)),this.version=t.versions.producer+"."+t.versions.minConsumer,a=_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["io"].decodeWeights(e.weightData,e.weightSpecs),this.executor=new GraphExecutor(OperationMapper.Instance.transformGraph(t)),this.executor.weightMap=this.convertTensorMapToTensorsMap(a),[2,!0]}})})},e.prototype.predict=function(e,t){return this.execute_(e,!0,this.outputNodes)},e.prototype.constructTensorMap=function(e){var t=e instanceof _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Tensor"]?[e]:e;if(t.length!==this.inputNodes.length)throw new Error("Input tensor count mismatch,the frozen model has "+this.inputNodes.length+" placeholders, while there are "+t.length+" input tensors.");return this.inputNodes.reduce(function(e,a,r){return e[a]=t[r],e},{})},e.prototype.execute=function(e,t){return this.execute_(e,!1,t)},e.prototype.execute_=function(e,t,a){if(void 0===t&&(t=!0),a=a||this.outputNodes,(e instanceof _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Tensor"]||Array.isArray(e))&&(e=this.constructTensorMap(e)),this.executor.isControlFlowModel||this.executor.isDynamicShapeModel)throw new Error("The model contains control flow or dynamic shape ops, please use executeAsync method");var r=this.executor.execute(this.convertTensorMapToTensorsMap(e),t,a),n=Object.keys(r);return Array.isArray(a)&&a.length>1?a.map(function(e){return r[e]}):r[n[0]]},e.prototype.executeAsync=function(e,t){return __awaiter(this,void 0,void 0,function(){var a,r;return __generator(this,function(n){switch(n.label){case 0:if(!this.executor.isControlFlowModel&&!this.executor.isDynamicShapeModel)throw new Error("The model does not contain control flow or dynamic shape ops, please use execute method for better performance.");return t=t||this.outputNodes,(e instanceof _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Tensor"]||Array.isArray(e))&&(e=this.constructTensorMap(e)),[4,this.executor.executeAsync(this.convertTensorMapToTensorsMap(e),t)];case 1:return a=n.sent(),r=Object.keys(a),[2,Array.isArray(t)&&t.length>1?t.map(function(e){return a[e]}):a[r[0]]]}})})},e.prototype.convertTensorMapToTensorsMap=function(e){return Object.keys(e).reduce(function(t,a){return t[a]=[e[a]],t},{})},e.prototype.dispose=function(){this.executor.dispose()},e}();function loadFrozenModel(e,t,a){return __awaiter(this,void 0,void 0,function(){var r;return __generator(this,function(n){switch(n.label){case 0:return[4,(r=new FrozenModel(e,t,a)).load()];case 1:return n.sent(),[2,r]}})})}var version="0.6.4"; //# sourceMappingURL=tf-converter.esm.js.map /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) /***/ }), /***/ "./node_modules/@tensorflow/tfjs-core/dist/tf-core.esm.js": /*!****************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-core/dist/tf-core.esm.js ***! \****************************************************************/ /*! exports provided: setBackend, getBackend, disposeVariables, memory, version_core, nextFrame, environment, io, serialization, test_util, util, webgl, AdadeltaOptimizer, AdagradOptimizer, AdamOptimizer, AdamaxOptimizer, MomentumOptimizer, Optimizer, RMSPropOptimizer, SGDOptimizer, Tensor, TensorBuffer, variable, Variable, Rank, Reduction, ENV, Environment, DataStorage, image, linalg, losses, spectral, op, batchNormalization2d, batchNormalization3d, batchNormalization4d, batchNormalization, complex, real, imag, concat, concat1d, concat2d, concat3d, concat4d, split, conv1d, conv2d, depthwiseConv2d, separableConv2d, conv2dTranspose, matMul, dot, outerProduct, reverse, reverse1d, reverse2d, reverse3d, reverse4d, maxPool, avgPool, slice, slice1d, slice2d, slice3d, slice4d, abs, acos, acosh, asin, asinh, atan, atanh, ceil, clipByValue, cos, cosh, erf, exp, expm1, floor, log, log1p, logSigmoid, neg, reciprocal, round, rsqrt, sigmoid, sign, sin, sinh, softplus, sqrt, square, step, tan, tanh, all, any, argMax, argMin, logSumExp, max, mean, min, moments, sum, prod, equal, equalStrict, greater, greaterEqual, greaterEqualStrict, greaterStrict, less, lessEqual, lessEqualStrict, lessStrict, notEqual, notEqualStrict, add, addN, addStrict, atan2, div, divStrict, floorDiv, maximum, maximumStrict, minimum, minimumStrict, mod, modStrict, mul, mulStrict, pow, powStrict, squaredDifference, squaredDifferenceStrict, sub, subStrict, elu, leakyRelu, prelu, relu, selu, logicalAnd, logicalNot, logicalOr, logicalXor, where, whereAsync, buffer, toPixels, print, batchToSpaceND, cast, clone, cumsum, depthToSpace, expandDims, eye, fromPixels, multinomial, oneHot, pad, pad1d, pad2d, pad3d, pad4d, rand, randomNormal, randomUniform, reshape, spaceToBatchND, squeeze, stack, tile, truncatedNormal, unstack, fill, linspace, ones, range, scalar, tensor, tensor1d, tensor2d, tensor3d, tensor4d, tensor5d, tensor6d, zeros, onesLike, zerosLike, transpose, softmax, localResponseNormalization, norm, gather, unsortedSegmentSum, basicLSTMCell, multiRNNCell, movingAverage, stridedSlice, topk, scatterND, fft, gatherND, train, tidy, keep, dispose, time, profile, customGrad, grad, grads, valueAndGrad, valueAndGrads, variableGrads */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* WEBPACK VAR INJECTION */(function(process, global, setImmediate, Buffer) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setBackend", function() { return setBackend; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getBackend", function() { return getBackend; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "disposeVariables", function() { return disposeVariables; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "memory", function() { return memory; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version_core", function() { return version; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "nextFrame", function() { return nextFrame; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "environment", function() { return environment; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "io", function() { return io; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "serialization", function() { return serialization; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "test_util", function() { return test_util; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "util", function() { return util; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "webgl", function() { return webgl; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AdadeltaOptimizer", function() { return AdadeltaOptimizer; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AdagradOptimizer", function() { return AdagradOptimizer; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AdamOptimizer", function() { return AdamOptimizer; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AdamaxOptimizer", function() { return AdamaxOptimizer; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MomentumOptimizer", function() { return MomentumOptimizer; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Optimizer", function() { return Optimizer; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RMSPropOptimizer", function() { return RMSPropOptimizer; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SGDOptimizer", function() { return SGDOptimizer; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Tensor", function() { return Tensor; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TensorBuffer", function() { return TensorBuffer; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "variable", function() { return variable; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Variable", function() { return Variable; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Rank", function() { return Rank; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Reduction", function() { return Reduction; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ENV", function() { return ENV; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Environment", function() { return Environment; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DataStorage", function() { return DataStorage; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "image", function() { return image_ops; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "linalg", function() { return linalg_ops; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "losses", function() { return loss_ops; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spectral", function() { return spectral_ops; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "op", function() { return op; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "batchNormalization2d", function() { return batchNormalization2d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "batchNormalization3d", function() { return batchNormalization3d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "batchNormalization4d", function() { return batchNormalization4d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "batchNormalization", function() { return batchNormalization; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "complex", function() { return complex; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "real", function() { return real; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "imag", function() { return imag; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return concat; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concat1d", function() { return concat1d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concat2d", function() { return concat2d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concat3d", function() { return concat3d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concat4d", function() { return concat4d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "split", function() { return split$1; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "conv1d", function() { return conv1d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "conv2d", function() { return conv2d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "depthwiseConv2d", function() { return depthwiseConv2d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "separableConv2d", function() { return separableConv2d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "conv2dTranspose", function() { return conv2dTranspose; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "matMul", function() { return matMul; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dot", function() { return dot; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "outerProduct", function() { return outerProduct; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reverse", function() { return reverse; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reverse1d", function() { return reverse1d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reverse2d", function() { return reverse2d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reverse3d", function() { return reverse3d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reverse4d", function() { return reverse4d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maxPool", function() { return maxPool; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "avgPool", function() { return avgPool; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "slice", function() { return slice; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "slice1d", function() { return slice1d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "slice2d", function() { return slice2d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "slice3d", function() { return slice3d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "slice4d", function() { return slice4d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "abs", function() { return abs; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "acos", function() { return acos; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "acosh", function() { return acosh; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asin", function() { return asin; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asinh", function() { return asinh; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "atan", function() { return atan; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "atanh", function() { return atanh; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ceil", function() { return ceil; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clipByValue", function() { return clipByValue; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cos", function() { return cos; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cosh", function() { return cosh; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "erf", function() { return erf; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exp", function() { return exp; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expm1", function() { return expm1; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "floor", function() { return floor; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "log", function() { return log$1; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "log1p", function() { return log1p; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logSigmoid", function() { return logSigmoid; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "neg", function() { return neg; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reciprocal", function() { return reciprocal; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "round", function() { return round; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rsqrt", function() { return rsqrt; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sigmoid", function() { return sigmoid; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sign", function() { return sign; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sin", function() { return sin; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sinh", function() { return sinh; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "softplus", function() { return softplus; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sqrt", function() { return sqrt; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "square", function() { return square; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "step", function() { return step; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tan", function() { return tan; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tanh", function() { return tanh$1; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "all", function() { return all; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "any", function() { return any; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "argMax", function() { return argMax; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "argMin", function() { return argMin; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logSumExp", function() { return logSumExp; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "max", function() { return max; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mean", function() { return mean; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "min", function() { return min; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "moments", function() { return moments; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sum", function() { return sum; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "prod", function() { return prod; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "equal", function() { return equal; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "equalStrict", function() { return equalStrict; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "greater", function() { return greater; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "greaterEqual", function() { return greaterEqual; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "greaterEqualStrict", function() { return greaterEqualStrict; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "greaterStrict", function() { return greaterStrict; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "less", function() { return less; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lessEqual", function() { return lessEqual; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lessEqualStrict", function() { return lessEqualStrict; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lessStrict", function() { return lessStrict; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "notEqual", function() { return notEqual; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "notEqualStrict", function() { return notEqualStrict; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "add", function() { return add; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addN", function() { return addN; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addStrict", function() { return addStrict; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "atan2", function() { return atan2; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "div", function() { return div; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "divStrict", function() { return divStrict; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "floorDiv", function() { return floorDiv; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maximum", function() { return maximum; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maximumStrict", function() { return maximumStrict; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "minimum", function() { return minimum; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "minimumStrict", function() { return minimumStrict; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mod", function() { return mod; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "modStrict", function() { return modStrict; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mul", function() { return mul; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mulStrict", function() { return mulStrict; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pow", function() { return pow; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "powStrict", function() { return powStrict; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "squaredDifference", function() { return squaredDifference; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "squaredDifferenceStrict", function() { return squaredDifferenceStrict; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sub", function() { return sub; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subStrict", function() { return subStrict; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "elu", function() { return elu; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "leakyRelu", function() { return leakyRelu; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "prelu", function() { return prelu; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "relu", function() { return relu; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "selu", function() { return selu; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logicalAnd", function() { return logicalAnd; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logicalNot", function() { return logicalNot; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logicalOr", function() { return logicalOr; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logicalXor", function() { return logicalXor; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "where", function() { return where; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "whereAsync", function() { return whereAsync; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buffer", function() { return buffer; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toPixels", function() { return toPixels; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "print", function() { return print; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "batchToSpaceND", function() { return batchToSpaceND; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cast", function() { return cast; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clone", function() { return clone; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cumsum", function() { return cumsum; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "depthToSpace", function() { return depthToSpace; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expandDims", function() { return expandDims; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eye", function() { return eye; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromPixels", function() { return fromPixels; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "multinomial", function() { return multinomial; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "oneHot", function() { return oneHot; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pad", function() { return pad; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pad1d", function() { return pad1d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pad2d", function() { return pad2d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pad3d", function() { return pad3d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pad4d", function() { return pad4d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rand", function() { return rand; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "randomNormal", function() { return randomNormal; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "randomUniform", function() { return randomUniform; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reshape", function() { return reshape; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spaceToBatchND", function() { return spaceToBatchND; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "squeeze", function() { return squeeze; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stack", function() { return stack; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tile", function() { return tile; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "truncatedNormal", function() { return truncatedNormal; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unstack", function() { return unstack; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fill", function() { return fill; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "linspace", function() { return linspace; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ones", function() { return ones$1; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "range", function() { return range; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scalar", function() { return scalar; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tensor", function() { return tensor; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tensor1d", function() { return tensor1d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tensor2d", function() { return tensor2d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tensor3d", function() { return tensor3d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tensor4d", function() { return tensor4d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tensor5d", function() { return tensor5d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tensor6d", function() { return tensor6d; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zeros", function() { return zeros; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onesLike", function() { return onesLike; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zerosLike", function() { return zerosLike; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transpose", function() { return transpose; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "softmax", function() { return softmax; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "localResponseNormalization", function() { return localResponseNormalization; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "norm", function() { return norm; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "gather", function() { return gather; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unsortedSegmentSum", function() { return unsortedSegmentSum; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "basicLSTMCell", function() { return basicLSTMCell; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "multiRNNCell", function() { return multiRNNCell; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "movingAverage", function() { return movingAverage; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stridedSlice", function() { return stridedSlice; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "topk", function() { return topk; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scatterND", function() { return scatterND; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fft", function() { return fft; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "gatherND", function() { return gatherND; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "train", function() { return train; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tidy", function() { return tidy; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "keep", function() { return keep; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dispose", function() { return dispose; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "time", function() { return time; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "profile", function() { return profile; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "customGrad", function() { return customGrad; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "grad", function() { return grad; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "grads", function() { return grads; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "valueAndGrad", function() { return valueAndGrad; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "valueAndGrads", function() { return valueAndGrads; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "variableGrads", function() { return variableGrads; }); /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};function __extends(e,t){function n(){this.constructor=e}extendStatics(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var __assign=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0;)r=Math.random()*t|0,n=e[--t],e[t]=e[r],e[r]=n}function clamp(e,t,n){return Math.max(e,Math.min(t,n))}function nearestLargerEven(e){return e%2==0?e:e+1}function randUniform(e,t){var n=Math.random();return t*n+(1-n)*e}function distSquared(e,t){for(var n=0,r=0;r1;--t)if(e%t==0)return[t,e/t];return[1,e]}function createShuffledIndices(e){for(var t=new Uint32Array(e),n=0;n=n?o():setTimeout(i,s)}};i()})}function inferFromImplicitShape(e,t){for(var n=1,r=-1,o=0;o=0)n*=e[o];else if(-1===e[o]){if(-1!==r)throw Error("Shapes can only have 1 implicit size. Found -1 at dim "+r+" and dim "+o);r=o}else if(e[o]<0)throw Error("Shapes can not be < 0. Found "+e[o]+" at dim "+o);if(-1===r){if(t>0&&t!==n)throw Error("Size("+t+") must match the product of shape "+e);return e}if(0===n)throw Error("Cannot infer the missing size in ["+e+"] when there are 0 elements");if(t%n!=0)throw Error("The implicit shape can't be a fractional number. Got "+t+" / "+n);var a=e.slice();return a[r]=t/n,a}function squeezeShape(e,t){for(var n=[],r=[],o=0,a=0;aa)&&1===e[a]&&(n.push(e[a]),r.push(a)),t[o]<=a&&o++}1!==e[a]&&(n.push(e[a]),r.push(a))}return{newShape:n,keptDims:r}}function getTypedArrayFromDType(e,t){var n=null;if(null==e||"float32"===e)n=new Float32Array(t);else if("int32"===e)n=new Int32Array(t);else{if("bool"!==e)throw new Error("Unknown data type "+e);n=new Uint8Array(t)}return n}function checkComputationForNaN(e,t,n){if("float32"===t)for(var r=0;r=0;--r)n[r]=n[r+1]*e[r+1];return n}function toTypedArray(e,t,n){return noConversionNeeded(e,t)?e:(Array.isArray(e)&&(e=flatten(e)),copyTypedArray(e,t,n))}function noConversionNeeded(e,t){return e instanceof Float32Array&&"float32"===t||e instanceof Int32Array&&"int32"===t||e instanceof Uint8Array&&"bool"===t}function makeOnesTypedArray(e,t){for(var n=makeZerosTypedArray(e,t),r=0;r1)for(var l=0;lFORMAT_LIMIT_NUM_VALS){var l=FORMAT_NUM_FIRST_LAST_VALS*i,c=Array.from(e.subarray(0,l)),p=Array.from(e.subarray(s-FORMAT_NUM_FIRST_LAST_VALS*i,s));return"complex64"===n&&(c=createComplexTuples(c),p=createComplexTuples(p)),["["+c.map(function(e,t){return valToString(e,o[t])}).join(", ")+", ..., "+p.map(function(e,t){return valToString(e,o[s-FORMAT_NUM_FIRST_LAST_VALS+t])}).join(", ")+"]"]}return["["+("complex64"===n?createComplexTuples(e):Array.from(e)).map(function(e,t){return valToString(e,o[t])}).join(", ")+"]"]}var d=t.slice(1),h=r.slice(1),f=r[0]*i,m=[];if(s>FORMAT_LIMIT_NUM_VALS){for(var g=0;g=0;a--)for(i=(f=e[a]).inputs,c=0;c=0;r--)n(r)}function assertTypesMatch(e,t){assert(e.dtype===t.dtype,"The dtypes of the first("+e.dtype+") and second("+t.dtype+") input must match")}function isTensorInList(e,t){for(var n=0;n {...}) to avoid memory leaks.");return this.keepTensors.add(e.id),e},e.prototype.startScope=function(e,t){void 0===t&&(t=!1),t&&0===this.gradientScopeCount&&(this.activeTape=[]),t&&this.gradientScopeCount++;var n={track:[],name:"unnamed scope"};e&&(n.name=e),this.scopeStack.push(n),this.activeScope=n},e.prototype.endScope=function(e,t){var n=this;void 0===t&&(t=!1),t&&(this.gradientScopeCount--,0===this.gradientScopeCount&&(this.activeTape=null));var r=new Set(this.keepTensors),o=getTensorsInContainer(e);o.forEach(function(e){return r.add(e.id)});for(var a=0;a0,"gradients() received an empty list of xs."),this.tidy("gradients",function(){var a=e();assert(a instanceof Tensor,"The result y returned by f() must be a tensor.");var i=getFilteredNodesXToY(o.activeTape,t,a);if(!r&&0===i.length&&t.length>0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y.");var s={};return s[a.id]=null==n?ones(a.shape):n,backpropagateGradients(s,i),{value:a,grads:t.map(function(e){return s[e.id]})}},!0)},e.prototype.customGrad=function(e){var t=this;return assert(isFunction(e),"The f passed in customGrad(f) must be a function."),function(){for(var n,r,o=[],a=0;a {op();...}); to avoid memory leaks.");return this.activeScope.track.push(e),e},e}();function ones(e){var t=makeOnesTypedArray(sizeFromShape(e),"float32");return Tensor.make(e,{values:t})}!function(e){e[e.NUMBER=0]="NUMBER",e[e.BOOLEAN=1]="BOOLEAN",e[e.STRING=2]="STRING"}(Type||(Type={}));var MAX_TEXTURE_SIZE,URL_PROPERTIES=[{name:"DEBUG",type:Type.BOOLEAN},{name:"IS_BROWSER",type:Type.BOOLEAN},{name:"WEBGL_CONV_IM2COL",type:Type.BOOLEAN},{name:"WEBGL_MAX_TEXTURE_SIZE",type:Type.NUMBER},{name:"WEBGL_PAGING_ENABLED",type:Type.BOOLEAN},{name:"WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION",type:Type.NUMBER},{name:"WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE",type:Type.BOOLEAN},{name:"WEBGL_VERSION",type:Type.NUMBER},{name:"WEBGL_RENDER_FLOAT32_ENABLED",type:Type.BOOLEAN},{name:"WEBGL_DOWNLOAD_FLOAT_ENABLED",type:Type.BOOLEAN},{name:"WEBGL_FENCE_API_ENABLED",type:Type.BOOLEAN},{name:"WEBGL_SIZE_UPLOAD_UNIFORM",type:Type.NUMBER},{name:"BACKEND",type:Type.STRING},{name:"EPSILON",type:Type.NUMBER},{name:"PROD",type:Type.BOOLEAN},{name:"TENSORLIKE_CHECK_SHAPE_CONSISTENCY",type:Type.BOOLEAN}];function isWebGLVersionEnabled(e,t){var n;try{n=getWebGLRenderingContext(e,t)}catch(e){return!1}return null!=n&&(loseContext(n),!0)}function getWebGLMaxTextureSize(e,t){if(null==MAX_TEXTURE_SIZE){var n=getWebGLRenderingContext(e,t);MAX_TEXTURE_SIZE=n.getParameter(n.MAX_TEXTURE_SIZE)}return MAX_TEXTURE_SIZE}function getWebGLDisjointQueryTimerVersion(e,t){if(0===e)return 0;var n,r=getWebGLRenderingContext(e,t);return n=hasExtension(r,"EXT_disjoint_timer_query_webgl2")&&2===e?2:hasExtension(r,"EXT_disjoint_timer_query")?1:0,null!=r&&loseContext(r),n}function isRenderToFloatTextureEnabled(e,t){if(0===e)return!1;var n=getWebGLRenderingContext(e,t);if(1===e){if(!hasExtension(n,"OES_texture_float"))return!1}else if(!hasExtension(n,"EXT_color_buffer_float"))return!1;var r=createFloatTextureAndBindToFramebuffer(n,e);return loseContext(n),r}function isDownloadFloatTextureEnabled(e,t){if(0===e)return!1;var n=getWebGLRenderingContext(e,t);if(1===e){if(!hasExtension(n,"OES_texture_float"))return!1;if(!hasExtension(n,"WEBGL_color_buffer_float"))return!1}else if(!hasExtension(n,"EXT_color_buffer_float"))return!1;var r=createFloatTextureAndBindToFramebuffer(n,e);return loseContext(n),r}function isWebGLFenceEnabled(e,t){if(2!==e)return!1;var n=getWebGLRenderingContext(e,t),r=null!=n.fenceSync;return loseContext(n),r}function isChrome(){return"undefined"!=typeof navigator&&null!=navigator&&null!=navigator.userAgent&&/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor)}var TENSORFLOWJS_FLAGS_PREFIX="tfjsflags";function getFeaturesFromURL(){var e={};if("undefined"==typeof window||void 0===window.location)return e;var t=getQueryParams(window.location.search);if(TENSORFLOWJS_FLAGS_PREFIX in t){var n={};t[TENSORFLOWJS_FLAGS_PREFIX].split(",").forEach(function(e){var t=e.split(":"),r=t[0],o=t[1];n[r]=o}),URL_PROPERTIES.forEach(function(t){t.name in n&&(console.log("Setting feature override from URL "+t.name+": "+n[t.name]),t.type===Type.NUMBER?e[t.name]=+n[t.name]:t.type===Type.BOOLEAN?e[t.name]="true"===n[t.name]:t.type===Type.STRING?e[t.name]=n[t.name]:console.warn("Unknown URL param: "+t.name+"."))})}return e}function hasExtension(e,t){return null!=e.getExtension(t)}function getWebGLRenderingContext(e,t){if(0===e||!t)throw new Error("Cannot get WebGL rendering context, WebGL is disabled.");var n=document.createElement("canvas");return 1===e?n.getContext("webgl")||n.getContext("experimental-webgl"):n.getContext("webgl2")}function loseContext(e){if(null!=e){var t=e.getExtension("WEBGL_lose_context");if(null==t)throw new Error("Extension WEBGL_lose_context not supported on this browser.");t.loseContext()}}function createFloatTextureAndBindToFramebuffer(e,t){var n=e.createFramebuffer(),r=e.createTexture();e.bindTexture(e.TEXTURE_2D,r);var o=2===t?e.RGBA32F:e.RGBA;e.texImage2D(e.TEXTURE_2D,0,o,1,1,0,e.RGBA,e.FLOAT,null),e.bindFramebuffer(e.FRAMEBUFFER,n),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,r,0);var a=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(r),e.deleteFramebuffer(n),a}function getQueryParams(e){var t={};return e.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g,function(e){for(var n=[],r=1;r0&&!isMobile();if("HAS_WEBGL"===e)return this.get("WEBGL_VERSION")>0;if("WEBGL_VERSION"===e)return isWebGLVersionEnabled(2,this.get("IS_BROWSER"))?2:isWebGLVersionEnabled(1,this.get("IS_BROWSER"))?1:0;if("WEBGL_RENDER_FLOAT32_ENABLED"===e)return isRenderToFloatTextureEnabled(this.get("WEBGL_VERSION"),this.get("IS_BROWSER"));if("WEBGL_DOWNLOAD_FLOAT_ENABLED"===e)return isDownloadFloatTextureEnabled(this.get("WEBGL_VERSION"),this.get("IS_BROWSER"));if("WEBGL_FENCE_API_ENABLED"===e)return isWebGLFenceEnabled(this.get("WEBGL_VERSION"),this.get("IS_BROWSER"));if("WEBGL_SIZE_UPLOAD_UNIFORM"===e)return this.get("WEBGL_RENDER_FLOAT32_ENABLED")?4:0;if("TEST_EPSILON"===e)return 32===this.backend.floatPrecision()?TEST_EPSILON_FLOAT32:TEST_EPSILON_FLOAT16;if("EPSILON"===e)return 32===this.backend.floatPrecision()?EPSILON_FLOAT32:EPSILON_FLOAT16;if("PROD"===e)return!1;if("TENSORLIKE_CHECK_SHAPE_CONSISTENCY"===e)return!this.get("PROD");throw new Error("Unknown feature "+e+".")},e.prototype.setFeatures=function(e){this.features=Object.assign({},e)},e.prototype.reset=function(){this.features=getFeaturesFromURL(),null!=this.globalEngine&&(this.globalEngine=null)},Object.defineProperty(e.prototype,"backend",{get:function(){return this.engine.backend},enumerable:!0,configurable:!0}),e.prototype.findBackend=function(e){return e in this.registry?this.registry[e].backend:null},e.prototype.registerBackend=function(e,t,n,r){var o=this;if(void 0===n&&(n=1),e in this.registry)return console.warn(e+" backend was already registered. Reusing existing backend"),null!=r&&r(function(){return o.engine}),!1;try{var a=t();return a.setDataMover({moveData:function(e){return o.engine.moveData(e)}}),this.registry[e]={backend:a,priority:n},!0}catch(t){return console.warn("Registration of backend "+e+" failed"),console.warn(t.stack||t.message),!1}},e.prototype.removeBackend=function(e){if(!(e in this.registry))throw new Error(e+" backend not found in registry");this.registry[e].backend.dispose(),delete this.registry[e]},Object.defineProperty(e.prototype,"engine",{get:function(){return this.initEngine(),this.globalEngine},enumerable:!0,configurable:!0}),e.prototype.initEngine=function(){var e=this;if(null==this.globalEngine){this.backendName=this.get("BACKEND");var t=this.findBackend(this.backendName);this.globalEngine=new Engine(t,!1,function(){return e.get("DEBUG")})}},e}();function getGlobalNamespace(){var e;if("undefined"!=typeof window)e=window;else{if("undefined"==typeof process)throw new Error("Could not find a global object");e=process}return e}function getOrMakeEnvironment(){var e=getGlobalNamespace();return null==e.ENV&&(e.ENV=new Environment(getFeaturesFromURL()),setTensorTracker(function(){return e.ENV.engine})),e.ENV}var ENV=getOrMakeEnvironment(),environment=Object.freeze({Environment:Environment,ENV:ENV});function grad(e){return assert(isFunction(e),"The f passed in grad(f) must be a function"),function(t,n){return assert(t instanceof Tensor,"The x passed in grad(f)(x) must be a tensor"),assert(null==n||n instanceof Tensor,"The dy passed in grad(f)(x, dy) must be a tensor"),ENV.engine.tidy(function(){var r=ENV.engine.gradients(function(){return e(t)},[t],n),o=r.value,a=r.grads;return null!=n&&assertShapesMatch(o.shape,n.shape,"The shape of dy passed in grad(f)(x, dy) must match the shape returned by f(x)"),checkGrads(a),a[0]})}}function grads(e){return assert(isFunction(e),"The f passed in grads(f) must be a function"),function(t,n){return assert(Array.isArray(t)&&t.every(function(e){return e instanceof Tensor}),"The args passed in grads(f)(args) must be an array of tensors"),assert(null==n||n instanceof Tensor,"The dy passed in grads(f)(args, dy) must be a tensor"),ENV.engine.tidy(function(){var r=ENV.engine.gradients(function(){return e.apply(void 0,t)},t,n),o=r.value,a=r.grads;return null!=n&&assertShapesMatch(o.shape,n.shape,"The shape of dy passed in grads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),checkGrads(a),a})}}function valueAndGrad(e){return assert(isFunction(e),"The f passed in valueAndGrad(f) must be a function"),function(t,n){assert(t instanceof Tensor,"The x passed in valueAndGrad(f)(x) must be a tensor"),assert(null==n||n instanceof Tensor,"The dy passed in valueAndGrad(f)(x, dy) must be a tensor");var r=ENV.engine.gradients(function(){return e(t)},[t],n),o=r.grads,a=r.value;return checkGrads(o),{grad:o[0],value:a}}}function valueAndGrads(e){return assert(isFunction(e),"The f passed in valueAndGrads(f) must be a function"),function(t,n){assert(Array.isArray(t)&&t.every(function(e){return e instanceof Tensor}),"The args passed in valueAndGrads(f)(args) must be array of tensors"),assert(null==n||n instanceof Tensor,"The dy passed in valueAndGrads(f)(args, dy) must be a tensor");var r=ENV.engine.gradients(function(){return e.apply(void 0,t)},t,n);return null!=n&&assertShapesMatch(r.value.shape,n.shape,"The shape of dy passed in valueAndGrads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),checkGrads(r.grads),r}}function variableGrads(e,t){if(assert(isFunction(e),"The f passed in variableGrads(f) must be a function"),assert(null==t||Array.isArray(t)&&t.every(function(e){return e instanceof Variable}),"The varList passed in variableGrads(f, varList) must be an array of variables"),null==t)for(var n in t=[],ENV.engine.registeredVariables)t.push(ENV.engine.registeredVariables[n]);var r=t.length;assert((t=t.filter(function(e){return e.trainable})).length>0,"variableGrads() expects at least one of the input variables to be trainable, but none of the "+r+" variables is trainable.");var o=ENV.engine.gradients(e,t,null,!0),a=o.value,i=o.grads;assert(i.some(function(e){return null!=e}),"Cannot find a connection between any variable and the result of the loss function y=f(x). Please make sure the operations that use variables are inside the function f passed to minimize()."),assert(0===a.rank,"The f passed in variableGrads(f) must return a scalar, but it returned a rank-"+a.rank+" tensor");var s={};return t.forEach(function(e,t){null!=i[t]&&(s[e.name]=i[t])}),{value:a,grads:s}}function customGrad(e){return ENV.engine.customGrad(e)}function checkGrads(e){if(e.filter(function(e){return null==e}).length>0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that\n the f you passed encloses all operations that lead from x to y.")}var tidy=Environment.tidy,keep=Environment.keep,dispose=Environment.dispose,time=Environment.time,profile=Environment.profile;function warn(){for(var e=[],t=0;t=2*t+1||o%2==1?i.push(o):a.push(o);r.push.apply(r,a),r.push(0),r.push.apply(r,i)}return r}function getReshapedPermuted(e,t,n,r){void 0===r&&(r=!0);var o=[];r?o.push(e[0]/n):o.push(e[0]*n);for(var a=1;a=-n&&e=0&&te.rank)throw new Error("index innermost dimension length must be <= tensor rank; saw: "+t.shape[t.rank-1]+" vs. "+e.rank);if(0===e.size)throw new Error("Requested more than 0 entries, but input is empty. Input shape: "+e.shape+".");for(var n=t.shape,r=n[n.length-1],o=1,a=0;a1?t.shape[t.rank-1]:1,o=t.rank>1?t.rank-1:1,a="Must have updates.shape = indices.shape[:batchDim] + shape[sliceDim:], got updates.shape: "+n.shape+", indices.shape: "+t.shape+", shape: "+e+", sliceDim: "+r+", and batchDim: "+o+".";if(n.rank1?t.shape[t.rank-1]:1,o=n.length,a=1,i=r;it||n===e){r=!0;break}n=nearestDivisor(e,n+1)}return n}function computeOutShape$1(e,t,n){for(var r=[],o=e.length,a=0;a0?o>=c[t]:o<=c[t]);o+=r[t])n+=1;return n}),[l,h,p]}function startForAxis(e,t,n,r,o){var a=t[o];e&1<0?Number.MIN_SAFE_INTEGER:Number.MAX_SAFE_INTEGER);var i=r[o];return a<0&&(a+=i),a=clamp(0,a,i-1)}function stopForAxis(e,t,n,r,o){var a=t[o];e&1<0?Number.MAX_SAFE_INTEGER:Number.MIN_SAFE_INTEGER);var i=r[o];return a<0&&(a+=i),a=n[o]>0?clamp(0,a,i):clamp(-1,a,i-1)}function inferShape(e){var t=e;if(isTypedArray(e))return[e.length];if(!Array.isArray(e))return[];for(var n=[];t instanceof Array;)n.push(t.length),t=t[0];return e instanceof Array&&ENV.get("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")&&deepAssertShapeConsistency(e,n,[]),n}function deepAssertShapeConsistency(e,t,n){if(n=n||[],e instanceof Array){assert(t.length>0,function(){return"Element arr["+n.join("][")+"] should be a primitive, but is an array of "+e.length+" elements"}),assert(e.length===t[0],function(){return"Element arr["+n.join("][")+"] should have "+t[0]+" elements, but has "+e.length+" elements"});for(var r=t.slice(1),o=0;o1)return zeros([0],r);var o=makeZerosTypedArray(Math.abs(Math.ceil((t-e)/n)),r);to}).sort(function(e,t){return t.score-e.score}),i=[],s=0;s=0;--d){if(intersectionOverUnion(e,c,i[d])>=r){p=!0;break}}if(!p&&(i.push(c),i.length>=n))break}return tensor1d(i,"int32")}function intersectionOverUnion(e,t,n){var r=e.subarray(4*t,4*t+4),o=e.subarray(4*n,4*n+4),a=Math.min(r[0],r[2]),i=Math.min(r[1],r[3]),s=Math.max(r[0],r[2]),u=Math.max(r[1],r[3]),l=Math.min(o[0],o[2]),c=Math.min(o[1],o[3]),p=Math.max(o[0],o[2]),d=Math.max(o[1],o[3]),h=(s-a)*(u-i),f=(p-l)*(d-c);if(h<=0||f<=0)return 0;var m=Math.max(a,l),g=Math.max(i,c),v=Math.min(s,p),x=Math.min(u,d),y=Math.max(v-m,0)*Math.max(x-g,0);return y/(h+f-y)}function split(e,t,n){var r=Array(e.rank).fill(0),o=e.shape.slice();return t.map(function(t){o[n]=t;var a=e.slice(r,o);return r[n]+=t,a})}function topkImpl(e,t,n,r,o){for(var a=t[t.length-1],i=[e.length/a,a],s=i[0],u=i[1],l=getTypedArrayFromDType(n,s*r),c=getTypedArrayFromDType("int32",s*r),p=0;p":"<",u=n?"inOffset + i;":"round(getBestIndicesA(batch, inOffset + i));";this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * "+r+";\n\n int bestIndex = inOffset;\n float bestValue = getA(batch, bestIndex);\n\n for (int i = 0; i < "+r+"; i++) {\n int inIdx = "+u+";\n float candidate = getA(batch, inIdx);\n if (candidate "+s+" bestValue) {\n bestValue = candidate;\n bestIndex = inIdx;\n }\n }\n setOutput(float(bestIndex));\n }\n "}}(),AvgPool2DBackpropProgram=function(){return function(e){this.variableNames=["dy"],this.outputShape=e.inShape;var t=e.filterHeight,n=e.filterWidth,r=e.strideHeight,o=e.strideWidth,a=t-1-e.padInfo.top,i=n-1-e.padInfo.left,s=1/(t*n);this.userCode="\n const ivec2 pads = ivec2("+a+", "+i+");\n const float avgMultiplier = float("+s+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+t+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+r+".0;\n\n if (dyR < 0.0 || dyR >= "+e.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < "+n+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+o+".0;\n\n if (dyC < 0.0 || dyC >= "+e.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n setOutput(dotProd);\n }\n "}}();function getBroadcastDims(e,t){for(var n=e.length,r=[],o=0;o1&&1===i&&r.unshift(a)}return r}function getReductionAxes(e,t){for(var n=[],r=0;r1)&&n.unshift(a)}return n}function broadcastDimsAreOuter(e){for(var t=0;t= "+e.inHeight+") {\n continue;\n }\n\n for (int yC = 0; yC < "+e.outWidth+"; yC++) {\n int xC = wC + yC * "+n+" - "+o+";\n\n if (xC < 0 || xC >= "+e.inWidth+") {\n continue;\n }\n\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n setOutput(dotProd);\n }\n "}}(),Conv2DDerInputProgram=function(){return function(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;var t=e.filterHeight,n=e.filterWidth,r=e.strideHeight,o=e.strideWidth,a=t-1-e.padInfo.top,i=n-1-e.padInfo.left;this.userCode="\n const ivec2 pads = ivec2("+a+", "+i+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[3];\n\n ivec2 dyCorner = coords.yz - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+t+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+r+".0;\n\n if (dyR < 0.0 || dyR >= "+e.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = "+t+" - 1 - wR;\n\n for (int wC = 0; wC < "+n+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+o+".0;\n\n if (dyC < 0.0 || dyC >= "+e.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = "+n+" - 1 - wC;\n\n for (int d2 = 0; d2 < "+e.outChannels+"; d2++) {\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n }\n }\n setOutput(dotProd);\n }\n "}}(),DepthwiseConv2DDerFilterProgram=function(){return function(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;var t=e.strideHeight,n=e.strideWidth,r=e.padInfo.top,o=e.padInfo.left,a=e.outChannels/e.inChannels;this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int dm = coords.w;\n int d2 = d1 * "+a+" + dm;\n\n float dotProd = 0.0;\n\n // TODO: Vec4 over the batch size\n for (int b = 0; b < "+e.batchSize+"; b++) {\n for (int yR = 0; yR < "+e.outHeight+"; yR++) {\n int xR = wR + yR * "+t+" - "+r+";\n\n if (xR < 0 || xR >= "+e.inHeight+") {\n continue;\n }\n\n for (int yC = 0; yC < "+e.outWidth+"; yC++) {\n int xC = wC + yC * "+n+" - "+o+";\n\n if (xC < 0 || xC >= "+e.inWidth+") {\n continue;\n }\n\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n setOutput(dotProd);\n }\n "}}(),DepthwiseConv2DDerInputProgram=function(){return function(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;var t=e.filterHeight,n=e.filterWidth,r=e.strideHeight,o=e.strideWidth,a=t-1-e.padInfo.top,i=n-1-e.padInfo.left,s=e.outChannels/e.inChannels;this.userCode="\n const ivec2 pads = ivec2("+a+", "+i+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[3];\n ivec2 dyCorner = coords.yz - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n float dotProd = 0.0;\n\n for (int wR = 0; wR < "+t+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+r+".0;\n\n if (dyR < 0.0 || dyR >= "+e.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = "+t+" - 1 - wR;\n\n for (int wC = 0; wC < "+n+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+o+".0;\n\n if (dyC < 0.0 || dyC >= "+e.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = "+n+" - 1 - wC;\n\n // TODO: Vec4 over the channelMul\n for (int dm = 0; dm < "+s+"; dm++) {\n int d2 = d1 * "+s+" + dm;\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, dm);\n dotProd += xValue * wValue;\n }\n }\n }\n setOutput(dotProd);\n }\n "}}(),Conv2DProgram=function(){return function(e){this.variableNames=["x","W"],this.outputShape=e.outShape;var t=e.padInfo.top,n=e.padInfo.left,r=e.strideHeight,o=e.strideWidth,a=e.dilationHeight,i=e.dilationWidth,s=e.filterHeight,u=e.filterWidth,l=4*Math.floor(e.inChannels/4),c=e.inChannels%4;this.userCode="\n const ivec2 strides = ivec2("+r+", "+o+");\n const ivec2 pads = ivec2("+t+", "+n+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d2 = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, d2) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+s+"; wR++) {\n int xR = xRCorner + wR * "+a+";\n\n if (xR < 0 || xR >= "+e.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+u+"; wC++) {\n int xC = xCCorner + wC * "+i+";\n\n if (xC < 0 || xC >= "+e.inWidth+") {\n continue;\n }\n\n for (int d1 = 0; d1 < "+l+"; d1 += 4) {\n vec4 xValues = vec4(\n getX(batch, xR, xC, d1),\n getX(batch, xR, xC, d1 + 1),\n getX(batch, xR, xC, d1 + 2),\n getX(batch, xR, xC, d1 + 3)\n );\n vec4 wValues = vec4(\n getW(wR, wC, d1, d2),\n getW(wR, wC, d1 + 1, d2),\n getW(wR, wC, d1 + 2, d2),\n getW(wR, wC, d1 + 3, d2)\n );\n\n dotProd += dot(xValues, wValues);\n }\n\n if ("+(1===c)+") {\n dotProd +=\n getX(batch, xR, xC, "+l+") *\n getW(wR, wC, "+l+", d2);\n } else if ("+(2===c)+") {\n vec2 xValues = vec2(\n getX(batch, xR, xC, "+l+"),\n getX(batch, xR, xC, "+l+" + 1)\n );\n vec2 wValues = vec2(\n getW(wR, wC, "+l+", d2),\n getW(wR, wC, "+l+" + 1, d2)\n );\n dotProd += dot(xValues, wValues);\n } else if ("+(3===c)+") {\n vec3 xValues = vec3(\n getX(batch, xR, xC, "+l+"),\n getX(batch, xR, xC, "+l+" + 1),\n getX(batch, xR, xC, "+l+" + 2)\n );\n vec3 wValues = vec3(\n getW(wR, wC, "+l+", d2),\n getW(wR, wC, "+l+" + 1, d2),\n getW(wR, wC, "+l+" + 2, d2)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n }\n setOutput(dotProd);\n }\n "}}(),DepthwiseConv2DProgram=function(){return function(e){this.variableNames=["x","W"],this.outputShape=e.outShape;var t=e.inHeight,n=e.inWidth,r=e.padInfo.top,o=e.padInfo.left,a=e.strideHeight,i=e.strideWidth,s=e.dilationHeight,u=e.dilationWidth,l=e.filterHeight,c=e.filterWidth,p=e.outChannels/e.inChannels;this.userCode="\n const ivec2 strides = ivec2("+a+", "+i+");\n const ivec2 pads = ivec2("+r+", "+o+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n ivec2 xRCCorner = coords.yz * strides - pads;\n int d2 = coords.w;\n int d1 = d2 / "+p+";\n int q = d2 - d1 * "+p+";\n\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, q) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n // TODO(dsmilkov): Flatten the two for loops and vec4 the operations.\n for (int wR = 0; wR < "+l+"; wR++) {\n int xR = xRCorner + wR * "+s+";\n\n if (xR < 0 || xR >= "+t+") {\n continue;\n }\n\n for (int wC = 0; wC < "+c+"; wC++) {\n int xC = xCCorner + wC * "+u+";\n\n if (xC < 0 || xC >= "+n+") {\n continue;\n }\n\n float xVal = getX(batch, xR, xC, d1);\n float wVal = getW(wR, wC, d1, q);\n dotProd += xVal * wVal;\n }\n }\n setOutput(dotProd);\n }\n "}}(),CropAndResizeProgram=function(){return function(e,t,n,r,o){this.variableNames=["Image","Boxes","BoxInd"],this.outputShape=[];var a=e[0],i=e[1],s=e[2],u=e[3],l=t[0],c=n[0],p=n[1];this.outputShape=[l,c,p,u];var d="bilinear"===r?1:0,h=[i-1+".0",s-1+".0"],f=h[0],m=h[1],g=c>1?[""+(i-1)/(c-1),"(y2-y1) * height_ratio","y1*"+f+" + float(y)*(height_scale)"]:["0.0","0.0","0.5 * (y1+y2) * "+f],v=g[0],x=g[1],y=g[2],T=p>1?[""+(s-1)/(p-1),"(x2-x1) * width_ratio","x1*"+m+" + float(x)*(width_scale)"]:["0.0","0.0","0.5 * (x1+x2) * "+m],S=T[0],b=T[1],E=T[2];this.userCode="\n const float height_ratio = float("+v+");\n const float width_ratio = float("+S+");\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int y = coords[1];\n int x = coords[2];\n int d = coords[3];\n\n // get box vals\n float y1 = getBoxes(b,0);\n float x1 = getBoxes(b,1);\n float y2 = getBoxes(b,2);\n float x2 = getBoxes(b,3);\n\n // get image in batch index\n int bInd = round(getBoxInd(b));\n if(bInd < 0 || bInd >= "+a+") {\n return;\n }\n\n float height_scale = "+x+";\n float width_scale = "+b+";\n\n float in_y = "+y+";\n if( in_y < 0.0 || in_y > "+f+" ) {\n setOutput(float("+o+"));\n return;\n }\n float in_x = "+E+";\n if( in_x < 0.0 || in_x > "+m+" ) {\n setOutput(float("+o+"));\n return;\n }\n\n vec2 sourceFracIndexRC = vec2(in_y,in_x);\n if("+d+" == 1) {\n // Compute the four integer indices.\n ivec2 sourceFloorRC = ivec2(sourceFracIndexRC);\n ivec2 sourceCeilRC = ivec2(ceil(sourceFracIndexRC));\n\n float topLeft = getImage(b, sourceFloorRC.x, sourceFloorRC.y, d);\n float bottomLeft = getImage(b, sourceCeilRC.x, sourceFloorRC.y, d);\n float topRight = getImage(b, sourceFloorRC.x, sourceCeilRC.y, d);\n float bottomRight = getImage(b, sourceCeilRC.x, sourceCeilRC.y, d);\n\n vec2 fracRC = sourceFracIndexRC - vec2(sourceFloorRC);\n\n float top = topLeft + (topRight - topLeft) * fracRC.y;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y;\n float newValue = top + (bottom - top) * fracRC.x;\n setOutput(newValue);\n } else {\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestRC = ivec2(floor(\n sourceFracIndexRC + vec2(0.5,0.5)));\n float newValue = getImage(b, sourceNearestRC.x, sourceNearestRC.y, d);\n setOutput(newValue);\n }\n }\n "}}();function makeShader(e,t,n,r){var o=e.map(function(e){var t=sizeFromShape(e.shapeInfo.logicalShape);return e.shapeInfo.isUniform?"uniform float "+e.name+(t>1?"["+t+"]":"")+";":"uniform sampler2D "+e.name+";"});o=o.join("\n");var a,i=e.map(function(e){return getInputSamplingSnippet(e,t,r)}).join("\n"),s=t.texShape;return a=t.isPacked?getPackedOutputSamplingSnippet(t.logicalShape,s):getOutputSamplingSnippet(t.logicalShape,s),[SHADER_PREFIX,FLOAT_TEXTURE_SAMPLE_SNIPPET,FLOAT_TEXTURE_SETOUTPUT_SNIPPET,o,a,i,n].join("\n")}function getSamplerFromInInfo(e){var t=e.shapeInfo.logicalShape;switch(t.length){case 0:return getSamplerScalar(e);case 1:return getSampler1D(e);case 2:return getSampler2D(e);case 3:return getSampler3D(e);case 4:return getSampler4D(e);case 5:return getSampler5D(e);case 6:return getSampler6D(e);default:throw new Error(t.length+"-D input sampling is not yet supported")}}function getPackedSamplerFromInInfo(e){var t=e.shapeInfo.logicalShape;switch(t.length){case 2:return getPackedSampler2D(e);default:throw new Error("Packed "+t.length+"-D input sampling is not yet supported")}}function getInputSamplingSnippet(e,t,n){var r=getSamplerFlat(e);return e.shapeInfo.isPacked?r+=getPackedSamplerFromInInfo(e):r+=getSamplerFromInInfo(e),(n||arraysEqual(e.shapeInfo.logicalShape,t.logicalShape))&&(r+=getSamplerAtOutputCoords(e,t,n)),r}function getPackedOutputSamplingSnippet(e,t){switch(e.length){case 0:return getOutputScalarCoords();case 2:return getOutputPacked2DCoords(e,t);default:throw new Error(e.length+"-D output packed sampling is not yet supported")}}function getOutputSamplingSnippet(e,t){switch(e.length){case 0:return getOutputScalarCoords();case 1:return getOutput1DCoords(e,t);case 2:return getOutput2DCoords(e,t);case 3:return getOutput3DCoords(e,t);case 4:return getOutput4DCoords(e,t);case 5:return getOutput5DCoords(e,t);case 6:return getOutput6DCoords(e,t);default:throw new Error(e.length+"-D output sampling is not yet supported")}}var SAMPLE_1D_SNIPPET="\nvec2 UVfrom1D(int texNumR, int texNumC, int index) {\n int texR = index / texNumC;\n int texC = index - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n",SAMPLE_2D_SNIPPET="\nvec2 UVfrom2D(int texNumR, int texNumC, int numC, int row, int col) {\n int index = row * numC + col;\n int texR = index / texNumC;\n int texC = index - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\nvec2 packedUVfrom2D(int texelsInLogicalRow, int texNumR,\n int texNumC, int row, int col) {\n int texelIndex = (row / 2) * texelsInLogicalRow + (col / 2);\n int texR = texelIndex / texNumC;\n int texC = texelIndex - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n",SAMPLE_3D_SNIPPET="\nvec2 UVfrom3D(int texNumR, int texNumC, int stride0,\n int stride1, int row, int col, int depth) {\n // Explicitly use integer operations as dot() only works on floats.\n int index = row * stride0 + col * stride1 + depth;\n int texR = index / texNumC;\n int texC = index - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n",SAMPLE_4D_SNIPPET="\nvec2 UVfrom4D(int texNumR, int texNumC, int stride0,\n int stride1, int stride2, int row, int col, int depth,\n int depth2) {\n // Explicitly use integer operations as dot() only works on floats.\n int index = row * stride0 + col * stride1 + depth * stride2 + depth2;\n int texR = index / texNumC;\n int texC = index - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n",SAMPLE_5D_SNIPPET="\nvec2 UVfrom5D(int texNumR, int texNumC, int stride0,\n int stride1, int stride2, int stride3, int row, int col, int depth,\n int depth2, int depth3) {\n // Explicitly use integer operations as dot() only works on floats.\n int index = row * stride0 + col * stride1 +\n depth * stride2 + depth2 * stride3 + depth3;\n int texR = index / texNumC;\n int texC = index - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n",SAMPLE_6D_SNIPPET="\nvec2 UVfrom6D(int texNumR, int texNumC, int stride0,\n int stride1, int stride2, int stride3, int stride4,\n int row, int col, int depth, int depth2, int depth3, int depth4) {\n // Explicitly use integer operations as dot() only works on floats.\n int index = row * stride0 + col * stride1 + depth * stride2 + depth2 *\n stride3 + depth3 * stride4 + depth4;\n int texR = index / texNumC;\n int texC = index - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n",FLOAT_TEXTURE_SAMPLE_SNIPPET="\n float sampleTexture(sampler2D textureSampler, vec2 uv) {\n return texture2D(textureSampler, uv).r;\n }\n",FLOAT_TEXTURE_SETOUTPUT_SNIPPET="\n void setOutput(float val) {\n gl_FragColor = vec4(val, 0, 0, 0);\n }\n",SHADER_PREFIX="\n precision highp float;\n precision highp int;\n varying vec2 resultUV;\n const vec2 halfCR = vec2(0.5, 0.5);\n\n struct ivec5\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n };\n\n struct ivec6\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n int v;\n };\n\n bool isNaN(float val) {\n return (val < 0.0 || 0.0 < val || val == 0.0) ? false : true;\n }\n\n bool hasNaN(vec4 values) {\n vec4 v1 = values * values;\n vec4 v2 = values * values;\n return any(notEqual(v1, v2));\n }\n\n float getNaN(vec4 values) {\n return dot(vec4(1), values);\n }\n\n int round(float value) {\n return int(floor(value + 0.5));\n }\n\n int imod(int x, int y) {\n return x - y * (x / y);\n }\n\n //Based on the work of Dave Hoskins\n //https://www.shadertoy.com/view/4djSRW\n #define HASHSCALE1 443.8975\n float random(float seed){\n vec2 p = resultUV * seed;\n vec3 p3 = fract(vec3(p.xyx) * HASHSCALE1);\n p3 += dot(p3, p3.yzx + 19.19);\n return fract((p3.x + p3.y) * p3.z);\n }\n\n "+SAMPLE_1D_SNIPPET+"\n "+SAMPLE_2D_SNIPPET+"\n "+SAMPLE_3D_SNIPPET+"\n "+SAMPLE_4D_SNIPPET+"\n "+SAMPLE_5D_SNIPPET+"\n "+SAMPLE_6D_SNIPPET+"\n";function getOutputScalarCoords(){return"\n int getOutputCoords() {\n return 0;\n }\n "}function getOutput1DCoords(e,t){return 1===t[0]?"\n int getOutputCoords() {\n return int(resultUV.x * "+t[1]+".0);\n }\n ":1===t[1]?"\n int getOutputCoords() {\n return int(resultUV.y * "+t[0]+".0);\n }\n ":"\n int getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+t[0]+", "+t[1]+"));\n return resTexRC.x * "+t[1]+" + resTexRC.y;\n }\n "}function getOutput3DCoords(e,t){var n=e[1]*e[2],r=e[2];return"\n ivec3 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+t[0]+", "+t[1]+"));\n int index = resTexRC.x * "+t[1]+" + resTexRC.y;\n int r = index / "+n+";\n index -= r * "+n+";\n int c = index / "+r+";\n int d = index - c * "+r+";\n return ivec3(r, c, d);\n }\n "}function getOutput4DCoords(e,t){var n=e[3],r=e[2]*n,o=e[1]*r;return"\n ivec4 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+t[0]+", "+t[1]+"));\n int index = resTexRC.x * "+t[1]+" + resTexRC.y;\n\n int r = index / "+o+";\n index -= r * "+o+";\n\n int c = index / "+r+";\n index -= c * "+r+";\n\n int d = index / "+n+";\n int d2 = index - d * "+n+";\n\n return ivec4(r, c, d, d2);\n }\n "}function getOutput5DCoords(e,t){var n=e[4],r=e[3]*n,o=e[2]*r,a=e[1]*o;return"\n ivec5 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx * vec2("+t[0]+",\n "+t[1]+"));\n\n int index = resTexRC.x * "+t[1]+" + resTexRC.y;\n\n int r = index / "+a+";\n index -= r * "+a+";\n\n int c = index / "+o+";\n index -= c * "+o+";\n\n int d = index / "+r+";\n index -= d * "+r+";\n\n int d2 = index / "+n+";\n int d3 = index - d2 * "+n+";\n\n ivec5 outShape = ivec5(r, c, d, d2, d3);\n return outShape;\n }\n "}function getOutput6DCoords(e,t){var n=e[5],r=e[4]*n,o=e[3]*r,a=e[2]*o,i=e[1]*a;return"\n ivec6 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+t[0]+", "+t[1]+"));\n int index = resTexRC.x * "+t[1]+" + resTexRC.y;\n\n int r = index / "+i+";\n index -= r * "+i+";\n\n int c = index / "+a+";\n index -= c * "+a+";\n\n int d = index / "+o+";\n index -= d * "+o+";\n\n int d2 = index / "+r+";\n index -= d2 * "+r+";\n\n int d3 = index / "+n+";\n int d4 = index - d3 * "+n+";\n\n ivec6 result = ivec6(r, c, d, d2, d3, d4);\n return result;\n }\n "}function getOutputPacked2DCoords(e,t){var n=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)];if(arraysEqual(e,t))return"\n ivec2 getOutputCoords() {\n return 2 * ivec2(resultUV.yx * vec2("+n[0]+", "+n[1]+"));\n }\n ";var r=Math.ceil(e[1]/2);return"\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+n[0]+", "+n[1]+"));\n\n int index = resTexRC.x * "+n[1]+" + resTexRC.y;\n int r = 2 * (index / "+r+");\n int c = imod(index, "+r+") * 2;\n\n return ivec2(r, c);\n }\n "}function getOutput2DCoords(e,t){return arraysEqual(e,t)?"\n ivec2 getOutputCoords() {\n return ivec2(resultUV.yx * vec2("+t[0]+", "+t[1]+"));\n }\n ":1===e[1]?"\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+t[0]+", "+t[1]+"));\n int index = resTexRC.x * "+t[1]+" + resTexRC.y;\n return ivec2(index, 0);\n }\n ":1===e[0]?"\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+t[0]+", "+t[1]+"));\n int index = resTexRC.x * "+t[1]+" + resTexRC.y;\n return ivec2(0, index);\n }\n ":"\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+t[0]+", "+t[1]+"));\n int index = resTexRC.x * "+t[1]+" + resTexRC.y;\n int r = index / "+e[1]+";\n int c = index - r * "+e[1]+";\n return ivec2(r, c);\n }\n "}function getSamplerScalar(e){var t=e.name,n="get"+t.charAt(0).toUpperCase()+t.slice(1);return e.shapeInfo.isUniform?"float "+n+"() {return "+t+";}":"\n float "+n+"() {\n return sampleTexture("+t+", halfCR);\n }\n "}function getSampler1D(e){var t=e.name,n="get"+t.charAt(0).toUpperCase()+t.slice(1);return"\n float "+n+"(int index) {\n return "+n+"Flat(index);\n }\n "}function getPackedSampler2D(e){var t=e.shapeInfo.logicalShape,n=e.name,r="get"+n.charAt(0).toUpperCase()+n.slice(1),o=e.shapeInfo.texShape,a=o[0],i=o[1];if(null!=o&&arraysEqual(t,o))return"\n vec4 "+r+"(int row, int col) {\n vec2 uv = (vec2(col, row) + halfCR) / vec2("+i+".0, "+a+".0);\n\n return texture2D("+n+", uv);\n }\n ";var s=[Math.ceil(o[0]/2),Math.ceil(o[1]/2)];return"\n vec4 "+r+"(int row, int col) {\n vec2 uv = packedUVfrom2D("+Math.ceil(t[1]/2)+", "+s[0]+", "+s[1]+", row, col);\n return texture2D("+n+", uv);\n }\n "}function getSampler2D(e){var t=e.shapeInfo.logicalShape,n=e.name,r="get"+n.charAt(0).toUpperCase()+n.slice(1),o=e.shapeInfo.texShape;if(null!=o&&arraysEqual(t,o)){var a=o[0];return"\n float "+r+"(int row, int col) {\n vec2 uv = (vec2(col, row) + halfCR) / vec2("+o[1]+".0, "+a+".0);\n return sampleTexture("+n+", uv);\n }\n "}var i=squeezeShape(t),s=i.newShape,u=i.keptDims,l=s;if(l.length=1?"coords = 0;":s.map(function(e){return"coords["+(e+u)+"] = 0;"}).join("\n"))+"\n return get"+n+"("+(a<2&&o>0?"coords":e.shapeInfo.logicalShape.map(function(e,t){return"coords["+(t+u)+"]"}).join(", "))+");\n }\n "}function getSamplerAtOutputCoords(e,t,n){var r=e.name,o=r.charAt(0).toUpperCase()+r.slice(1),a="get"+o+"AtOutCoords",i=getBroadcastDims(e.shapeInfo.logicalShape,t.logicalShape),s=e.shapeInfo.logicalShape.length,u=t.logicalShape.length,l=n&&(u>s||i.length>0),c=broadcastDimsAreOuter(i),p=e.shapeInfo.isUniform;if(l&&!c)return getBroadcastOutputCoordsSampler(e,t,o,a);var d=sizeFromShape(e.shapeInfo.logicalShape),h="";l&&c&&(h="\n int mainPart = index / "+d+";\n index -= mainPart * "+d+";\n ");var f=t.texShape;if(p)return 1===d?"float "+a+"() {return "+r+";}":"\n float "+a+"() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+f[0]+", "+f[1]+"));\n int index = resTexRC.x * "+f[1]+" + resTexRC.y;\n "+h+"\n return get"+o+"Flat(index);\n }\n ";var m=e.shapeInfo.texShape;return arraysEqual(m,f)?"\n float "+a+"() {\n return sampleTexture("+r+", resultUV);\n }\n ":"\n float "+a+"() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+f[0]+", "+f[1]+"));\n int index = resTexRC.x * "+f[1]+" + resTexRC.y;\n "+h+"\n int texR = index / "+m[1]+";\n int texC = index - texR * "+m[1]+";\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2("+m[1]+".0, "+m[0]+".0);\n\n return sampleTexture("+r+", uv);\n }\n "}function getCoordsDataType(e){if(e<=1)return"int";if(2===e)return"ivec2";if(3===e)return"ivec3";if(4===e)return"ivec4";if(5===e)return"ivec5";if(6===e)return"ivec6";throw Error("GPU for rank "+e+" is not yet supported")}function squeezeInputInfo(e,t){var n=JSON.parse(JSON.stringify(e));return n.shapeInfo.logicalShape=t,n}function getSqueezedParams(e,t){return t.map(function(t){return e[t]}).join(", ")}var CumSumProgram=function(){return function(e,t,n){this.variableNames=["x"],this.outputShape=e;var r=e.length,o=e[e.length-1],a=n?"<":">";this.userCode="\n int getIndex(int i) {\n "+(n?"return "+o+" -i - 1;":"return i;")+"\n }\n\n void main() {\n "+getCoordsDataType(r)+" coords = getOutputCoords();\n int end = "+getFinalCoord(r,"coords")+";\n float val = 0.0;\n for (int i = "+o+" - 1; i >= 0; i -= 1) {\n int idx = getIndex(i);\n if (idx "+a+" end) {\n continue;\n }\n if (idx == end && "+t+") {\n continue;\n }\n "+getFinalCoord(r,"coords")+" = idx;\n val += getX("+getCoords(r,"coords")+");\n }\n setOutput(val);\n }\n "}}();function getCoords(e,t){if(1===e)return""+t;if(2===e)return t+".x, "+t+".y";if(3===e)return t+".x, "+t+".y, "+t+".z";if(4===e)return t+".x, "+t+".y, "+t+".z, "+t+".w";throw Error("Cumulative sum for rank "+e+" is not yet supported")}function getFinalCoord(e,t){if(1===e)return""+t;if(2===e)return t+".y";if(3===e)return t+".z";if(4===e)return t+".w";throw Error("Cumulative sum for rank "+e+" is not yet supported")}var DepthToSpaceProgram=function(){function e(e,t,n){this.variableNames=["x"],this.outputShape=[],this.outputShape=e,this.blockSize=t,this.dataFormat=n,this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int h = "+this.getHeightCoordString()+";\n int w = "+this.getWidthCoordString()+";\n int d = "+this.getDepthCoordString()+";\n\n int in_h = h / "+t+";\n int offset_h = imod(h, "+t+");\n int in_w = w / "+t+";\n int offset_w = imod(w, "+t+");\n int offset_d = (offset_h * "+t+" + offset_w) *\n "+this.getOutputDepthSize()+";\n int in_d = d + offset_d;\n\n float result = "+this.getInputSamplingString()+";\n setOutput(result);\n }\n "}return e.prototype.getHeightCoordString=function(){return"NHWC"===this.dataFormat?"coords[1]":"coords[2]"},e.prototype.getWidthCoordString=function(){return"NHWC"===this.dataFormat?"coords[2]":"coords[3]"},e.prototype.getDepthCoordString=function(){return"NHWC"===this.dataFormat?"coords[3]":"coords[1]"},e.prototype.getOutputDepthSize=function(){return"NHWC"===this.dataFormat?this.outputShape[3]:this.outputShape[1]},e.prototype.getInputSamplingString=function(){return"NHWC"===this.dataFormat?"getX(b, in_h, in_w, in_d)":"getX(b, in_d, in_h, in_w)"},e}(),EncodeFloatProgram=function(){return function(e){this.variableNames=["A"],this.outputShape=e,this.userCode="\n const float FLOAT_MAX = 1.70141184e38;\n const float FLOAT_MIN = 1.17549435e-38;\n\n lowp vec4 encode_float(highp float v) {\n if (isNaN(v)) {\n return vec4(255, 255, 255, 255);\n }\n\n highp float av = abs(v);\n\n if(av < FLOAT_MIN) {\n return vec4(0.0, 0.0, 0.0, 0.0);\n } else if(v > FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 127.0) / 255.0;\n } else if(v < -FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 255.0) / 255.0;\n }\n\n highp vec4 c = vec4(0,0,0,0);\n\n highp float e = floor(log2(av));\n highp float m = exp2(fract(log2(av))) - 1.0;\n\n c[2] = floor(128.0 * m);\n m -= c[2] / 128.0;\n c[1] = floor(32768.0 * m);\n m -= c[1] / 32768.0;\n c[0] = floor(8388608.0 * m);\n\n highp float ebias = e + 127.0;\n c[3] = floor(ebias / 2.0);\n ebias -= c[3] * 2.0;\n c[2] += floor(ebias) * 128.0;\n\n c[3] += 128.0 * step(0.0, -v);\n\n return c / 255.0;\n }\n\n void main() {\n float x = getAAtOutCoords();\n gl_FragColor = encode_float(x);\n }\n "}}(),COMPLEX_FFT={REAL:"return real * expR - imag * expI;",IMAG:"return real * expI + imag * expR;"},FFTProgram=function(){return function(e,t){this.variableNames=["real","imag"];var n=t[0];this.outputShape=[n],this.userCode="\n float unaryOpComplex(float real, float expR, float imag, float expI) {\n "+e+"\n }\n\n float mulMatDFT(int row) {\n // TODO: Gather constants in one place?\n const float PI = 3.1415926535897932384626433832795;\n float result = 0.0;\n\n for (int i = 0; i < "+n+"; i++) {\n float x = -2.0 * PI * float(row * i) / float("+n+");\n float expR = cos(x);\n float expI = sin(x);\n float real = getReal(i);\n float imag = getImag(i);\n\n result += unaryOpComplex(real, expR, imag, expI);\n }\n\n return result;\n }\n\n void main() {\n int row = getOutputCoords();\n setOutput(mulMatDFT(row));\n }\n "}}(),FromPixelsProgram=function(){return function(e){this.variableNames=["A"];var t=e[0],n=e[1];this.outputShape=e,this.userCode="\n void main() {\n ivec3 coords = getOutputCoords();\n int texR = coords[0];\n int texC = coords[1];\n int depth = coords[2];\n vec2 uv = (vec2(texC, texR) + halfCR) / vec2("+n+".0, "+t+".0);\n\n vec4 values = texture2D(A, uv);\n float value;\n if (depth == 0) {\n value = values.r;\n } else if (depth == 1) {\n value = values.g;\n } else if (depth == 2) {\n value = values.b;\n } else if (depth == 3) {\n value = values.a;\n }\n\n setOutput(floor(value * 255.0 + 0.5));\n }\n "}}(),GatherProgram=function(){return function(e,t,n){this.variableNames=["A","indices"];var r=e.slice();r[n]=t,this.outputShape=r,this.rank=r.length;var o=getCoordsDataType(this.rank),a=getSourceCoords(e,n);this.userCode="\n void main() {\n "+o+" resRC = getOutputCoords();\n setOutput(getA("+a+"));\n }\n "}}();function getSourceCoords(e,t){var n=e.length;if(n>4)throw Error("Gather for rank "+n+" is not yet supported");if(1===n)return"int(getIndices(resRC))";for(var r=["resRC.x","resRC.y","resRC.z","resRC.w"],o=[],a=0;a1?"strides[j]":"strides";this.userCode="\n "+r+" strides = "+r+"("+this.strides+");\n void main() {\n "+o+" coords = getOutputCoords();\n int flattenIndex = 0;\n for (int j = 0; j < "+this.sliceDim+"; j++) {\n int index = round(getIndices(coords[0], j));\n flattenIndex += index * "+a+";\n }\n setOutput(getX(flattenIndex, coords[1]));\n }\n "}}();function getUnpackedMatrixTextureShapeWidthHeight(e,t){return[t,e]}function getUnpackedArraySizeFromMatrixSize(e,t){return e*t}function getMatrixSizeFromUnpackedArraySize(e,t){if(e%t!=0)throw new Error("unpackedSize ("+e+") must be a multiple of "+t);return e/t}function encodeMatrixToUnpackedArray(e,t,n){var r=getUnpackedArraySizeFromMatrixSize(e.length,n);if(t.length= "+r);for(var o=0,a=0;a= "+r);for(var o=0,a=0;a= "+o);for(var a=getPackedMatrixTextureShapeWidthHeight(t,n),i=a[0],s=a[1],u=n%2==1,l=t%2==1,c=Math.floor(n/2),p=Math.floor(t/2),d=u?4:0,h=n,f=0,m=0;m= "+o);for(var a=n%2==1,i=t%2==1,s=Math.floor(n/2),u=Math.floor(t/2),l=getPackedMatrixTextureShapeWidthHeight(t,n),c=l[0],p=l[1],d=a?4:0,h=n+(a?1:0),f=0,m=0,g=n,v=0;vn||t>n){r="["+e+"x"+t+"]";throw new Error("Requested texture size "+r+" greater than WebGL maximum on this browser / GPU "+("["+n+"x"+n+"]")+".")}}function createFramebuffer(e){return throwIfNull(e,function(){return e.createFramebuffer()},"Unable to create WebGLFramebuffer.")}function bindVertexBufferToProgramAttribute(e,t,n,r,o,a,i){var s=e.getAttribLocation(t,n);return-1!==s&&(callAndCheck(e,function(){return e.bindBuffer(e.ARRAY_BUFFER,r)}),callAndCheck(e,function(){return e.vertexAttribPointer(s,o,e.FLOAT,!1,a,i)}),callAndCheck(e,function(){return e.enableVertexAttribArray(s)}),!0)}function bindTextureUnit(e,t,n){validateTextureUnit(e,n),callAndCheck(e,function(){return e.activeTexture(e.TEXTURE0+n)}),callAndCheck(e,function(){return e.bindTexture(e.TEXTURE_2D,t)})}function unbindTextureUnit(e,t){validateTextureUnit(e,t),callAndCheck(e,function(){return e.activeTexture(e.TEXTURE0+t)}),callAndCheck(e,function(){return e.bindTexture(e.TEXTURE_2D,null)})}function getProgramUniformLocationOrThrow(e,t,n){return throwIfNull(e,function(){return e.getUniformLocation(t,n)},'uniform "'+n+'" not present in program.')}function getProgramUniformLocation(e,t,n){return e.getUniformLocation(t,n)}function bindTextureToProgramUniformSampler(e,t,n,r,o){callAndCheck(e,function(){return bindTextureUnit(e,n,o)}),callAndCheck(e,function(){return e.uniform1i(r,o)})}function bindCanvasToFramebuffer(e){callAndCheck(e,function(){return e.bindFramebuffer(e.FRAMEBUFFER,null)}),callAndCheck(e,function(){return e.viewport(0,0,e.canvas.width,e.canvas.height)}),callAndCheck(e,function(){return e.scissor(0,0,e.canvas.width,e.canvas.height)})}function bindColorTextureToFramebuffer(e,t,n){callAndCheck(e,function(){return e.bindFramebuffer(e.FRAMEBUFFER,n)}),callAndCheck(e,function(){return e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0)})}function unbindColorTextureFromFramebuffer(e,t){callAndCheck(e,function(){return e.bindFramebuffer(e.FRAMEBUFFER,t)}),callAndCheck(e,function(){return e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,null,0)})}function validateFramebuffer(e){var t=e.checkFramebufferStatus(e.FRAMEBUFFER);if(t!==e.FRAMEBUFFER_COMPLETE)throw new Error("Error binding framebuffer: "+getFramebufferErrorMessage(e,t))}function getFramebufferErrorMessage(e,t){switch(t){case e.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:return"FRAMEBUFFER_INCOMPLETE_DIMENSIONS";case e.FRAMEBUFFER_UNSUPPORTED:return"FRAMEBUFFER_UNSUPPORTED";default:return"unknown error "+t}}function throwIfNull(e,t,n){var r=callAndCheck(e,function(){return t()});if(null==r)throw new Error(n);return r}function validateTextureUnit(e,t){var n=e.MAX_COMBINED_TEXTURE_IMAGE_UNITS-1,r=t+e.TEXTURE0;if(rn)throw new Error("textureUnit must be in "+("[gl.TEXTURE0, gl.TEXTURE"+n+"]")+".")}function getTextureShapeFromLogicalShape(e,t){void 0===t&&(t=TextureUsage.UPLOAD);var n=ENV.get("WEBGL_MAX_TEXTURE_SIZE");if(t===TextureUsage.PACK&&(n*=2,e=e.map(function(t,n){return n>=e.length-2?nearestLargerEven(e[n]):e[n]})),2!==e.length){var r=squeezeShape(e);e=r.newShape}var o=sizeFromShape(e);return e.length<=1&&o<=n?[o,1]:2===e.length&&e[0]<=n&&e[1]<=n?e:3===e.length&&e[0]*e[1]<=n&&e[2]<=n?[e[0]*e[1],e[2]]:3===e.length&&e[0]<=n&&e[1]*e[2]<=n?[e[0],e[1]*e[2]]:4===e.length&&e[0]*e[1]*e[2]<=n&&e[3]<=n?[e[0]*e[1]*e[2],e[3]]:4===e.length&&e[0]<=n&&e[1]*e[2]*e[3]<=n?[e[0],e[1]*e[2]*e[3]]:sizeToSquarishShape(o)}var webgl_util=Object.freeze({createWebGLRenderingContext:createWebGLRenderingContext,createWebGLRenderingContextFromCanvas:createWebGLRenderingContextFromCanvas,callAndCheck:callAndCheck,enableDebugWebGLErrorChecking:enableDebugWebGLErrorChecking,checkWebGLError:checkWebGLError,getWebGLErrorMessage:getWebGLErrorMessage,getExtensionOrThrow:getExtensionOrThrow,createVertexShader:createVertexShader,createFragmentShader:createFragmentShader,createProgram:createProgram,linkProgram:linkProgram,validateProgram:validateProgram,createStaticVertexBuffer:createStaticVertexBuffer,createStaticIndexBuffer:createStaticIndexBuffer,getNumChannels:getNumChannels,createTexture:createTexture,validateTextureSize:validateTextureSize,createFramebuffer:createFramebuffer,bindVertexBufferToProgramAttribute:bindVertexBufferToProgramAttribute,bindTextureUnit:bindTextureUnit,unbindTextureUnit:unbindTextureUnit,getProgramUniformLocationOrThrow:getProgramUniformLocationOrThrow,getProgramUniformLocation:getProgramUniformLocation,bindTextureToProgramUniformSampler:bindTextureToProgramUniformSampler,bindCanvasToFramebuffer:bindCanvasToFramebuffer,bindColorTextureToFramebuffer:bindColorTextureToFramebuffer,unbindColorTextureFromFramebuffer:unbindColorTextureFromFramebuffer,validateFramebuffer:validateFramebuffer,getFramebufferErrorMessage:getFramebufferErrorMessage,getTextureShapeFromLogicalShape:getTextureShapeFromLogicalShape});function getWebGLContextAttributes(){return{alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!0}}function createWebGLContext(e){var t,n=getWebGLContextAttributes();return callAndCheck(t=null!=e?createWebGLRenderingContextFromCanvas(e,n):createWebGLRenderingContext(n),function(){return t.disable(t.DEPTH_TEST)}),callAndCheck(t,function(){return t.disable(t.STENCIL_TEST)}),callAndCheck(t,function(){return t.disable(t.BLEND)}),callAndCheck(t,function(){return t.disable(t.DITHER)}),callAndCheck(t,function(){return t.disable(t.POLYGON_OFFSET_FILL)}),callAndCheck(t,function(){return t.disable(t.SAMPLE_COVERAGE)}),callAndCheck(t,function(){return t.enable(t.SCISSOR_TEST)}),callAndCheck(t,function(){return t.enable(t.CULL_FACE)}),callAndCheck(t,function(){return t.cullFace(t.BACK)}),t}function createVertexShader$1(e){return createVertexShader(e,"\n precision highp float;\n attribute vec3 clipSpacePos;\n attribute vec2 uv;\n varying vec2 resultUV;\n\n void main() {\n gl_Position = vec4(clipSpacePos, 1);\n resultUV = uv;\n }")}function createVertexBuffer(e){return createStaticVertexBuffer(e,new Float32Array([-1,1,0,0,1,-1,-1,0,0,0,1,1,0,1,1,1,-1,0,1,0]))}function createIndexBuffer(e){return createStaticIndexBuffer(e,new Uint16Array([0,1,2,2,1,3]))}function getTextureConfig(e,t){var n,r,o,a,i,s,u,l=e;return 2===ENV.get("WEBGL_VERSION")?(n=l.R32F,r=l.R16F,o=l.RGBA32F,a=l.RED,i=4,s=1,u=l.HALF_FLOAT):(n=e.RGBA,r=e.RGBA,o=l.RGBA,a=e.RGBA,i=4,s=4,u=null!=t?t.HALF_FLOAT_OES:null),{internalFormatFloat:n,internalFormatHalfFloat:r,internalFormatPackedFloat:o,textureFormatFloat:a,downloadTextureFormat:e.RGBA,downloadUnpackNumChannels:i,defaultNumChannels:s,textureTypeHalfFloat:u}}function createAndConfigureTexture(e,t,n,r,o,a){validateTextureSize(t,n);var i=createTexture(e),s=e.TEXTURE_2D;return callAndCheck(e,function(){return e.bindTexture(s,i)}),callAndCheck(e,function(){return e.texParameteri(s,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE)}),callAndCheck(e,function(){return e.texParameteri(s,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)}),callAndCheck(e,function(){return e.texParameteri(s,e.TEXTURE_MIN_FILTER,e.NEAREST)}),callAndCheck(e,function(){return e.texParameteri(s,e.TEXTURE_MAG_FILTER,e.NEAREST)}),callAndCheck(e,function(){return e.texImage2D(s,0,r,t,n,0,o,a,null)}),callAndCheck(e,function(){return e.bindTexture(e.TEXTURE_2D,null)}),i}function createFloat32MatrixTexture(e,t,n,r){var o=getUnpackedMatrixTextureShapeWidthHeight(t,n);return createAndConfigureTexture(e,o[0],o[1],r.internalFormatFloat,r.textureFormatFloat,e.FLOAT)}function createFloat16MatrixTexture(e,t,n,r){var o=getUnpackedMatrixTextureShapeWidthHeight(t,n);return createAndConfigureTexture(e,o[0],o[1],r.internalFormatFloat,r.textureFormatFloat,r.textureTypeHalfFloat)}function createUnsignedBytesMatrixTexture(e,t,n,r){var o=getUnpackedMatrixTextureShapeWidthHeight(t,n);return createAndConfigureTexture(e,o[0],o[1],e.RGBA,e.RGBA,e.UNSIGNED_BYTE)}function createPackedMatrixTexture(e,t,n,r){var o=getPackedMatrixTextureShapeWidthHeight(t,n);return createAndConfigureTexture(e,o[0],o[1],r.internalFormatPackedFloat,e.RGBA,e.FLOAT)}function createFloat16PackedMatrixTexture(e,t,n,r){var o=getPackedMatrixTextureShapeWidthHeight(t,n);return createAndConfigureTexture(e,o[0],o[1],r.internalFormatHalfFloat,e.RGBA,r.textureTypeHalfFloat)}function bindVertexProgramAttributeStreams(e,t,n){return callAndCheck(e,function(){return e.bindBuffer(e.ARRAY_BUFFER,n)}),bindVertexBufferToProgramAttribute(e,t,"clipSpacePos",n,3,20,0)&&bindVertexBufferToProgramAttribute(e,t,"uv",n,2,20,12)}function uploadPixelDataToTexture(e,t,n){callAndCheck(e,function(){return e.bindTexture(e.TEXTURE_2D,t)}),callAndCheck(e,function(){return e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,n)}),callAndCheck(e,function(){return e.bindTexture(e.TEXTURE_2D,null)})}function uploadDataToTexture(e,t,n,r,o,a){validateTextureSize(n,r),callAndCheck(e,function(){return e.bindTexture(e.TEXTURE_2D,t)}),callAndCheck(e,function(){return e.texSubImage2D(e.TEXTURE_2D,0,0,0,n,r,a,e.FLOAT,o)}),callAndCheck(e,function(){return e.bindTexture(e.TEXTURE_2D,null)})}function uploadMatrixToTexture(e,t,n,r,o,a,i){var s,u=getUnpackedMatrixTextureShapeWidthHeight(n,r),l=u[0],c=u[1];1===i.defaultNumChannels?s=o:encodeMatrixToUnpackedArray(o,s=new Float32Array(getUnpackedArraySizeFromMatrixSize(o.length,a)),a),uploadDataToTexture(e,t,l,c,s,i.textureFormatFloat)}function uploadMatrixToPackedTexture(e,t,n,r,o,a){var i=getPackedMatrixTextureShapeWidthHeight(n,r),s=i[0],u=i[1],l=new Float32Array(getPackedRGBAArraySizeFromMatrixShape(n,r));encodeMatrixToPackedRGBA(o,n,r,l),uploadDataToTexture(e,t,s,u,l,e.RGBA)}function maybeCreateBufferFromOutputTexture(e,t,n,r,o){var a=t;if(2===ENV.get("WEBGL_VERSION")){var i=e,s=i.createBuffer();callAndCheck(e,function(){return e.bindBuffer(i.PIXEL_PACK_BUFFER,s)});var u=4*getUnpackedArraySizeFromMatrixSize(n*r,o.downloadUnpackNumChannels);callAndCheck(e,function(){return e.bufferData(i.PIXEL_PACK_BUFFER,u,e.STATIC_DRAW)}),callAndCheck(e,function(){return i.readPixels(0,0,r,n,e.RGBA,e.FLOAT,0)}),callAndCheck(e,function(){return e.bindBuffer(i.PIXEL_PACK_BUFFER,null)}),a=s}return a}function downloadFloat32MatrixFromBuffer(e,t,n,r,o){var a=e,i=new Float32Array(getUnpackedArraySizeFromMatrixSize(n*r,o.downloadUnpackNumChannels));a.bindBuffer(e.ARRAY_BUFFER,t),a.getBufferSubData(e.ARRAY_BUFFER,0,i),a.bindBuffer(e.ARRAY_BUFFER,null);var s=new Float32Array(n*r);return decodeMatrixFromUnpackedArray(i,s,o.downloadUnpackNumChannels),s}function downloadFloat32MatrixFromOutputTexture(e,t,n,r){var o=getUnpackedMatrixTextureShapeWidthHeight(t,n),a=o[0],i=o[1],s=new Float32Array(getUnpackedArraySizeFromMatrixSize(t*n,r.downloadUnpackNumChannels));callAndCheck(e,function(){return e.readPixels(0,0,a,i,r.downloadTextureFormat,e.FLOAT,s)});var u=new Float32Array(t*n);return decodeMatrixFromUnpackedArray(s,u,r.downloadUnpackNumChannels),u}function downloadByteEncodedFloatMatrixFromOutputTexture(e,t,n,r){var o=getUnpackedMatrixTextureShapeWidthHeight(t,n),a=o[0],i=o[1],s=new Uint8Array(getUnpackedArraySizeFromMatrixSize(t*n,4));return callAndCheck(e,function(){return e.readPixels(0,0,a,i,r.downloadTextureFormat,e.UNSIGNED_BYTE,s)}),new Float32Array(s.buffer)}function downloadMatrixFromPackedOutputTexture(e,t,n,r,o,a){var i=getPackedMatrixTextureShapeWidthHeight(r,o),s=i[0],u=i[1],l=new Float32Array(getPackedRGBAArraySizeFromMatrixShape(r,o));callAndCheck(e,function(){return e.readPixels(0,0,s,u,e.RGBA,e.FLOAT,l)});var c=new Float32Array(t*n);return decodeMatrixFromPackedRGBA(l,t,n,c)}var gpgpu_util=Object.freeze({getWebGLContextAttributes:getWebGLContextAttributes,createWebGLContext:createWebGLContext,createVertexShader:createVertexShader$1,createVertexBuffer:createVertexBuffer,createIndexBuffer:createIndexBuffer,getTextureConfig:getTextureConfig,createFloat32MatrixTexture:createFloat32MatrixTexture,createFloat16MatrixTexture:createFloat16MatrixTexture,createUnsignedBytesMatrixTexture:createUnsignedBytesMatrixTexture,createPackedMatrixTexture:createPackedMatrixTexture,createFloat16PackedMatrixTexture:createFloat16PackedMatrixTexture,bindVertexProgramAttributeStreams:bindVertexProgramAttributeStreams,uploadPixelDataToTexture:uploadPixelDataToTexture,uploadMatrixToTexture:uploadMatrixToTexture,uploadMatrixToPackedTexture:uploadMatrixToPackedTexture,maybeCreateBufferFromOutputTexture:maybeCreateBufferFromOutputTexture,downloadFloat32MatrixFromBuffer:downloadFloat32MatrixFromBuffer,downloadFloat32MatrixFromOutputTexture:downloadFloat32MatrixFromOutputTexture,downloadByteEncodedFloatMatrixFromOutputTexture:downloadByteEncodedFloatMatrixFromOutputTexture,downloadMatrixFromPackedOutputTexture:downloadMatrixFromPackedOutputTexture}),GPGPUContext=function(){function e(e){this.outputTexture=null,this.program=null,this.disposed=!1,this.autoDebugValidate=!1,this.vertexAttrsAreBound=!1,this.itemsToPoll=[],this.gl=null!=e?e:createWebGLContext(),1===ENV.get("WEBGL_VERSION")?(this.textureFloatExtension=getExtensionOrThrow(this.gl,"OES_texture_float"),this.colorBufferFloatExtension=this.gl.getExtension("WEBGL_color_buffer_float"),ENV.get("WEBGL_RENDER_FLOAT32_ENABLED")||(this.textureHalfFloatExtension=getExtensionOrThrow(this.gl,"OES_texture_half_float"),this.colorBufferHalfFloatExtension=this.gl.getExtension("EXT_color_buffer_half_float"))):this.colorBufferFloatExtension=getExtensionOrThrow(this.gl,"EXT_color_buffer_float"),this.loseContextExtension=getExtensionOrThrow(this.gl,"WEBGL_lose_context"),this.vertexBuffer=createVertexBuffer(this.gl),this.indexBuffer=createIndexBuffer(this.gl),this.framebuffer=createFramebuffer(this.gl),this.textureConfig=getTextureConfig(this.gl,this.textureHalfFloatExtension)}return e.prototype.dispose=function(){var e=this;if(!this.disposed){null!=this.program&&console.warn("Disposing a GPGPUContext that still has a bound WebGLProgram. This is probably a resource leak, delete the program with GPGPUContext.deleteProgram before disposing."),null!=this.outputTexture&&console.warn("Disposing a GPGPUContext that still has a bound output matrix texture. This is probably a resource leak, delete the output matrix texture with GPGPUContext.deleteMatrixTexture before disposing.");var t=this.gl;callAndCheck(t,function(){return t.finish()}),callAndCheck(t,function(){return t.bindFramebuffer(t.FRAMEBUFFER,null)}),callAndCheck(t,function(){return t.deleteFramebuffer(e.framebuffer)}),callAndCheck(t,function(){return t.bindBuffer(t.ARRAY_BUFFER,null)}),callAndCheck(t,function(){return t.deleteBuffer(e.vertexBuffer)}),callAndCheck(t,function(){return t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,null)}),callAndCheck(t,function(){return t.deleteBuffer(e.indexBuffer)}),this.loseContextExtension.loseContext(),this.disposed=!0}},e.prototype.enableAutomaticDebugValidation=function(e){this.autoDebugValidate=e,enableDebugWebGLErrorChecking(e)},e.prototype.createFloat32MatrixTexture=function(e,t){return this.throwIfDisposed(),createFloat32MatrixTexture(this.gl,e,t,this.textureConfig)},e.prototype.createFloat16MatrixTexture=function(e,t){return this.throwIfDisposed(),createFloat16MatrixTexture(this.gl,e,t,this.textureConfig)},e.prototype.createUnsignedBytesMatrixTexture=function(e,t){return this.throwIfDisposed(),createUnsignedBytesMatrixTexture(this.gl,e,t,this.textureConfig)},e.prototype.uploadPixelDataToTexture=function(e,t){this.throwIfDisposed(),uploadPixelDataToTexture(this.gl,e,t)},e.prototype.createFloat16PackedMatrixTexture=function(e,t){return this.throwIfDisposed(),createFloat16PackedMatrixTexture(this.gl,e,t,this.textureConfig)},e.prototype.createPackedMatrixTexture=function(e,t){return this.throwIfDisposed(),createPackedMatrixTexture(this.gl,e,t,this.textureConfig)},e.prototype.deleteMatrixTexture=function(e){var t=this;this.throwIfDisposed(),this.outputTexture===e&&(unbindColorTextureFromFramebuffer(this.gl,this.framebuffer),this.outputTexture=null),callAndCheck(this.gl,function(){return t.gl.deleteTexture(e)})},e.prototype.uploadMatrixToTexture=function(e,t,n,r){this.throwIfDisposed();var o=getNumChannels();return uploadMatrixToTexture(this.gl,e,t,n,r,o,this.textureConfig)},e.prototype.uploadMatrixToPackedTexture=function(e,t,n,r){return this.throwIfDisposed(),uploadMatrixToPackedTexture(this.gl,e,t,n,r,this.textureConfig)},e.prototype.downloadFloat32MatrixFromOutputTexture=function(e,t,n){var r=this;return this.downloadMatrixDriver(e,function(){return downloadFloat32MatrixFromOutputTexture(r.gl,t,n,r.textureConfig)})},e.prototype.downloadByteEncodedFloatMatrixFromOutputTexture=function(e,t,n){var r=this;return this.downloadMatrixDriver(e,function(){return downloadByteEncodedFloatMatrixFromOutputTexture(r.gl,t,n,r.textureConfig)})},e.prototype.downloadFloat32MatrixFromBuffer=function(e,t,n){return downloadFloat32MatrixFromBuffer(this.gl,e,t,n,this.textureConfig)},e.prototype.maybeCreateBufferFromTexture=function(e,t,n){this.bindTextureToFrameBuffer(e);var r=maybeCreateBufferFromOutputTexture(this.gl,e,t,n,this.textureConfig);return this.unbindTextureToFrameBuffer(),r},e.prototype.createAndWaitForFence=function(){var e=this.createFence(this.gl);return this.pollFence(e)},e.prototype.createFence=function(e){var t,n,r=this;if(ENV.get("WEBGL_FENCE_API_ENABLED")){var o=e,a=o.fenceSync(o.SYNC_GPU_COMMANDS_COMPLETE,0);e.flush(),n=function(){var e=o.clientWaitSync(a,0,0);return e===o.ALREADY_SIGNALED||e===o.CONDITION_SATISFIED},t=a}else ENV.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0?(t=this.beginQuery(),this.endQuery(),n=function(){return r.isQueryAvailable(t,ENV.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))}):n=function(){return!0};return{query:t,isFencePassed:n}},e.prototype.downloadMatrixFromPackedTexture=function(e,t,n,r){var o=this;return this.downloadMatrixDriver(e,function(){return downloadMatrixFromPackedOutputTexture(o.gl,t[0],t[1],n,r,o.textureConfig)})},e.prototype.createProgram=function(e){this.throwIfDisposed();var t=this.gl,n=createFragmentShader(t,e),r=createVertexShader$1(t),o=createProgram(t);return callAndCheck(t,function(){return t.attachShader(o,r)}),callAndCheck(t,function(){return t.attachShader(o,n)}),linkProgram(t,o),this.autoDebugValidate&&validateProgram(t,o),this.vertexAttrsAreBound||(this.setProgram(o),this.vertexAttrsAreBound=bindVertexProgramAttributeStreams(t,this.program,this.vertexBuffer)),o},e.prototype.deleteProgram=function(e){var t=this;this.throwIfDisposed(),e===this.program&&(this.program=null),null!=e&&callAndCheck(this.gl,function(){return t.gl.deleteProgram(e)})},e.prototype.setProgram=function(e){var t=this;this.throwIfDisposed(),this.program=e,null!=this.program&&this.autoDebugValidate&&validateProgram(this.gl,this.program),callAndCheck(this.gl,function(){return t.gl.useProgram(e)})},e.prototype.getUniformLocation=function(e,t,n){return void 0===n&&(n=!0),this.throwIfDisposed(),n?getProgramUniformLocationOrThrow(this.gl,e,t):getProgramUniformLocation(this.gl,e,t)},e.prototype.getAttributeLocation=function(e,t){var n=this;return this.throwIfDisposed(),callAndCheck(this.gl,function(){return n.gl.getAttribLocation(e,t)})},e.prototype.getUniformLocationNoThrow=function(e,t){return this.throwIfDisposed(),this.gl.getUniformLocation(e,t)},e.prototype.setInputMatrixTexture=function(e,t,n){this.throwIfDisposed(),this.throwIfNoProgram(),bindTextureToProgramUniformSampler(this.gl,this.program,e,t,n)},e.prototype.setOutputMatrixTexture=function(e,t,n){this.setOutputMatrixTextureDriver(e,n,t)},e.prototype.setOutputPackedMatrixTexture=function(e,t,n){this.throwIfDisposed();var r=getPackedMatrixTextureShapeWidthHeight(t,n),o=r[0],a=r[1];this.setOutputMatrixTextureDriver(e,o,a)},e.prototype.setOutputMatrixWriteRegion=function(e,t,n,r){this.setOutputMatrixWriteRegionDriver(n,e,r,t)},e.prototype.setOutputPackedMatrixWriteRegion=function(e,t,n,r){throw new Error("setOutputPackedMatrixWriteRegion not implemented.")},e.prototype.debugValidate=function(){null!=this.program&&validateProgram(this.gl,this.program),validateFramebuffer(this.gl)},e.prototype.executeProgram=function(){this.throwIfDisposed(),this.throwIfNoProgram();var e=this.gl;this.autoDebugValidate&&this.debugValidate(),callAndCheck(e,function(){return e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0)})},e.prototype.blockUntilAllProgramsCompleted=function(){var e=this;this.throwIfDisposed(),callAndCheck(this.gl,function(){return e.gl.finish()})},e.prototype.getQueryTimerExtension=function(){return null==this.disjointQueryTimerExtension&&(this.disjointQueryTimerExtension=getExtensionOrThrow(this.gl,2===ENV.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")?"EXT_disjoint_timer_query_webgl2":"EXT_disjoint_timer_query")),this.disjointQueryTimerExtension},e.prototype.getQueryTimerExtensionWebGL2=function(){return this.getQueryTimerExtension()},e.prototype.getQueryTimerExtensionWebGL1=function(){return this.getQueryTimerExtension()},e.prototype.beginQuery=function(){if(2===ENV.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")){var e=this.gl,t=this.getQueryTimerExtensionWebGL2(),n=e.createQuery();return e.beginQuery(t.TIME_ELAPSED_EXT,n),n}var r=this.getQueryTimerExtensionWebGL1(),o=r.createQueryEXT();return r.beginQueryEXT(r.TIME_ELAPSED_EXT,o),o},e.prototype.endQuery=function(){if(2!==ENV.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")){var e=this.getQueryTimerExtensionWebGL1();e.endQueryEXT(e.TIME_ELAPSED_EXT)}else{var t=this.gl,n=this.getQueryTimerExtensionWebGL2();t.endQuery(n.TIME_ELAPSED_EXT)}},e.prototype.waitForQueryAndGetTime=function(e){return __awaiter(this,void 0,void 0,function(){var t=this;return __generator(this,function(n){switch(n.label){case 0:return[4,repeatedTry(function(){return t.isQueryAvailable(e,ENV.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))})];case 1:return n.sent(),[2,this.getQueryTime(e,ENV.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))]}})})},e.prototype.getQueryTime=function(e,t){if(0===t)return null;if(2===t){var n=this.gl;return n.getQueryParameter(e,n.QUERY_RESULT)/1e6}var r=this.getQueryTimerExtensionWebGL1();return r.getQueryObjectEXT(e,r.QUERY_RESULT_EXT)/1e6},e.prototype.isQueryAvailable=function(e,t){if(0===t)return!0;if(2===t){var n=this.gl,r=this.getQueryTimerExtensionWebGL2(),o=n.getQueryParameter(e,n.QUERY_RESULT_AVAILABLE);return null==this.disjoint&&(this.disjoint=this.gl.getParameter(r.GPU_DISJOINT_EXT)),o&&!this.disjoint}o=(r=this.getQueryTimerExtensionWebGL1()).getQueryObjectEXT(e,r.QUERY_RESULT_AVAILABLE_EXT);return null==this.disjoint&&(this.disjoint=this.gl.getParameter(r.GPU_DISJOINT_EXT)),o&&!this.disjoint},e.prototype.pollFence=function(e){var t=this;return new Promise(function(n){t.addItemToPoll(function(){return e.isFencePassed()},function(){return n()})})},e.prototype.pollItems=function(){for(var e=binSearchLastTrue(this.itemsToPoll.map(function(e){return e.isDoneFn})),t=0;t<=e;++t){(0,this.itemsToPoll[t].resolveFn)()}this.itemsToPoll=this.itemsToPoll.slice(e+1)},e.prototype.addItemToPoll=function(e,t){var n=this;this.itemsToPoll.push({isDoneFn:e,resolveFn:t}),this.itemsToPoll.length>1||repeatedTry(function(){return n.pollItems(),0===n.itemsToPoll.length})},e.prototype.bindTextureToFrameBuffer=function(e){this.throwIfDisposed(),bindColorTextureToFramebuffer(this.gl,e,this.framebuffer),this.autoDebugValidate&&validateFramebuffer(this.gl)},e.prototype.unbindTextureToFrameBuffer=function(){null!=this.outputTexture?(bindColorTextureToFramebuffer(this.gl,this.outputTexture,this.framebuffer),this.autoDebugValidate&&validateFramebuffer(this.gl)):unbindColorTextureFromFramebuffer(this.gl,this.framebuffer)},e.prototype.downloadMatrixDriver=function(e,t){this.bindTextureToFrameBuffer(e);var n=t();return this.unbindTextureToFrameBuffer(),n},e.prototype.setOutputMatrixTextureDriver=function(e,t,n){this.throwIfDisposed();var r=this.gl;bindColorTextureToFramebuffer(r,e,this.framebuffer),this.autoDebugValidate&&validateFramebuffer(r),this.outputTexture=e,callAndCheck(r,function(){return r.viewport(0,0,t,n)}),callAndCheck(r,function(){return r.scissor(0,0,t,n)})},e.prototype.setOutputMatrixWriteRegionDriver=function(e,t,n,r){var o=this;this.throwIfDisposed(),callAndCheck(this.gl,function(){return o.gl.scissor(e,t,n,r)})},e.prototype.throwIfDisposed=function(){if(this.disposed)throw new Error("Attempted to use disposed GPGPUContext.")},e.prototype.throwIfNoProgram=function(){if(null==this.program)throw new Error("No GPU program is currently set.")},e}();function binSearchLastTrue(e){for(var t=0,n=e.length-1,r=-1;t<=n;){var o=t+n>>1;e[o]()?(r=o,t=o+1):n=o-1}return r}function compileProgram(e,t,n,r){for(var o=t.userCode,a=n.map(function(e,n){var r={logicalShape:e.shape,texShape:e.isUniform?null:e.texData.texShape,isUniform:e.isUniform,isPacked:!e.isUniform&&e.texData.usage===TextureUsage.PACK};return{name:t.variableNames[n],shapeInfo:r}}),i=a.map(function(e){return e.shapeInfo}),s={logicalShape:r.shape,texShape:r.texData.texShape,isUniform:!1,isPacked:r.texData.usage===TextureUsage.PACK},u=makeShader(a,s,o,!0===t.supportsBroadcasting),l=e.createProgram(u),c={},p=0;p= "+e[1]+" || pos >= "+e[0]+") continue;\n\n int offsetY = int(blockIndex / ("+u+")) * "+i+" - "+d+";\n int d0 = offsetY + "+c+" * (pos / "+h+");\n\n if(d0 >= "+t[0]+" || d0 < 0) continue;\n\n int offsetX = int(mod(float(blockIndex), "+u+".) * "+a+". - "+p+".);\n int d1 = offsetX + "+l+" * (int(mod(float(pos), "+h+".) / "+o+".));\n\n if(d1 >= "+t[1]+" || d1 < 0) continue;\n\n result[row * 2 + col] = getA(d0, d1, int(mod(float(pos), "+o+".)));\n }\n }\n\n gl_FragColor = result;\n }\n "}}(),LRNProgram=function(){return function(e,t,n,r,o){this.variableNames=["x"],this.outputShape=[];var a,i=t,s=e[3]-1;this.outputShape=e;var u="float("+n+") + float("+r+") * sum";a=.5===o?"inversesqrt("+u+")":1===o?"1.0/("+u+")":"exp(log("+u+") * float(-"+o+"));",this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n int d = coords[3];\n float x = getX(b, r, c, d);\n float sum = 0.0;\n for (int j = -"+i+"; j <= "+i+"; j++) {\n int idx = d + j;\n if (idx >= 0 && idx <= "+s+") {\n float z = getX(b, r, c, idx);\n sum += z * z;\n }\n }\n float val = x * "+a+";\n setOutput(val);\n }\n "}}(),LRNGradProgram=function(){return function(e,t,n,r,o){this.variableNames=["inputImage","outputImage","dy"],this.outputShape=[],this.outputShape=e,this.depth=e[3],this.depthRadius=t,this.bias=n,this.alpha=r,this.beta=o,this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n\n float result = 0.0;\n for (int d = 0; d < "+this.depth+"; ++d) {\n int depthBegin = int(max(0.0, float(d - "+t+")));\n int depthEnd = int(min(float("+this.depth+"),\n float(d + "+t+" + 1)));\n\n const int MIN_DEPTH_BEGIN = 0;\n const int MAX_DEPTH_END = "+this.depth+";\n\n float norm = 0.0;\n for (int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k) {\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd) {\n norm += getInputImage(b, r, c, k) * getInputImage(b, r, c, k);\n }\n else {\n break;\n }\n }\n\n norm = float("+r+") * norm + float("+n+");\n\n for(int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k){\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd){\n float dyi = -2.0 * float("+r+")\n * float("+o+")\n * getInputImage(b ,r ,c, k) * getOutputImage(b, r, c, d)\n / norm;\n if (k == d) {\n dyi += pow(norm, -1.0 * "+o+");\n }\n if (k == coords[3]) {\n dyi *= getDy(b, r, c, d);\n result += dyi;\n }\n }\n else {\n break;\n }\n }\n }\n setOutput(result);\n }\n "}}(),MaxPool2DBackpropProgram=function(){return function(e){this.variableNames=["dy","maxPos"],this.outputShape=e.inShape;var t=e.filterHeight,n=e.filterWidth,r=e.strideHeight,o=e.strideWidth,a=t-1-e.padInfo.top,i=n-1-e.padInfo.left,s=t*n-1;this.userCode="\n const ivec2 pads = ivec2("+a+", "+i+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+t+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+r+".0;\n\n if (dyR < 0.0 || dyR >= "+e.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < "+n+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+o+".0;\n\n if (dyC < 0.0 || dyC >= "+e.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n int maxPosValue = "+s+" - int(getMaxPos(b, idyR, idyC, d));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue = wR * "+n+" + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n setOutput(dotProd);\n }\n "}}(),MatMulProgram=function(){return function(e,t,n,r){void 0===n&&(n=!1),void 0===r&&(r=!1),this.variableNames=["matrixA","matrixB"];var o=e[0],a=n?e[2]:e[1],i=r?t[1]:t[2],s=n?e[1]:e[2];this.outputShape=[o,a,i];var u=function(e,t){return n?"batch, "+t+" + "+e+", aRow":"batch, aRow, "+t+" + "+e},l=function(e,t){return r?"batch, bCol, "+t+" + "+e:"batch, "+t+" + "+e+", bCol"},c=4*Math.floor(s/4),p=s%4;this.userCode=" float dotARowBCol(int batch, int aRow, int bCol) {\n float result = 0.0;\n for (int i = 0; i < "+c+"; i += 4) {\n vec4 a = vec4(\n getMatrixA("+u(0,"i")+"),\n getMatrixA("+u(1,"i")+"),\n getMatrixA("+u(2,"i")+"),\n getMatrixA("+u(3,"i")+")\n );\n vec4 b = vec4(\n getMatrixB("+l(0,"i")+"),\n getMatrixB("+l(1,"i")+"),\n getMatrixB("+l(2,"i")+"),\n getMatrixB("+l(3,"i")+")\n );\n\n result += dot(a, b);\n }\n\n if ("+(1===p)+") {\n result += getMatrixA("+u(0,c)+") *\n getMatrixB("+l(0,c)+");\n } else if ("+(2===p)+") {\n vec2 a = vec2(\n getMatrixA("+u(0,c)+"),\n getMatrixA("+u(1,c)+")\n );\n vec2 b = vec2(\n getMatrixB("+l(0,c)+"),\n getMatrixB("+l(1,c)+")\n );\n result += dot(a, b);\n } else if ("+(3===p)+") {\n vec3 a = vec3(\n getMatrixA("+u(0,c)+"),\n getMatrixA("+u(1,c)+"),\n getMatrixA("+u(2,c)+")\n );\n vec3 b = vec3(\n getMatrixB("+l(0,c)+"),\n getMatrixB("+l(1,c)+"),\n getMatrixB("+l(2,c)+")\n );\n result += dot(a, b);\n }\n\n return result;\n }\n\n void main() {\n ivec3 resBRC = getOutputCoords();\n setOutput(dotARowBCol(resBRC.x, resBRC.y, resBRC.z));\n }\n "}}(),MatMulPackedProgram=function(){return function(e,t,n,r,o){void 0===r&&(r=!1),void 0===o&&(o=!1),this.variableNames=["matrixA","matrixB"],this.outputShape=n;var a=r?e[0]:e[1],i=Math.ceil(a/2),s=r?"i * 2, rc.x":"rc.x, i * 2",u=o?"rc.y, i * 2":"i * 2, rc.y",l=r?["a.xxyy","a.zzww"]:["a.xxzz","a.yyww"],c=o?["b.xzxz","b.ywyw"]:["b.xyxy","b.zwzw"];this.userCode="\n const float sharedDimension = "+i+".0;\n\n vec4 dot2x2ARowBCol(ivec2 rc) {\n vec4 result = vec4(0);\n for (int i = 0; i < "+i+"; i++) {\n vec4 a = getMatrixA("+s+");\n vec4 b = getMatrixB("+u+");\n\n result += ("+l[0]+" * "+c[0]+") + ("+l[1]+" * "+c[1]+");\n }\n return result;\n }\n\n void main() {\n ivec2 rc = getOutputCoords();\n gl_FragColor = dot2x2ARowBCol(rc);\n }\n "}}(),MultinomialProgram=function(){function e(e,t,n){this.variableNames=["probs"],this.outputShape=[e,n],this.userCode="\n uniform float seed;\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n\n float r = random(seed);\n float cdf = 0.0;\n\n for (int i = 0; i < "+(t-1)+"; i++) {\n cdf += getProbs(batch, i);\n\n if (r < cdf) {\n setOutput(float(i));\n return;\n }\n }\n\n // If no other event happened, last event happened.\n setOutput(float("+(t-1)+"));\n }\n "}return e.prototype.getCustomSetupFunc=function(e){var t=this;return function(n,r){null==t.seedLoc&&(t.seedLoc=n.getUniformLocation(r,"seed")),n.gl.uniform1f(t.seedLoc,e)}},e}(),OneHotProgram=function(){return function(e,t,n,r){this.variableNames=["indices"],this.outputShape=[e,t],this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n int index = round(getIndices(coords.x));\n setOutput(mix(float("+r+"), float("+n+"),\n float(index == coords.y)));\n }\n "}}(),PackProgram=function(){return function(e){this.variableNames=["A"],this.outputShape=e,this.userCode="\n void main() {\n ivec2 rc = getOutputCoords();\n\n int r = rc.x;\n int c = rc.y;\n\n if(r >= "+e[0]+" || c >= "+e[1]+") {\n gl_FragColor = vec4(0);\n } else {\n int rp1 = r + 1;\n int cp1 = c + 1;\n\n bool cEdge = cp1 >= "+e[1]+";\n bool rEdge = rp1 >= "+e[0]+";\n\n gl_FragColor = vec4(\n getA(r, c),\n cEdge ? 0. : getA(r, cp1),\n rEdge ? 0. : getA(rp1, c),\n rEdge || cEdge ? 0. : getA(rp1, cp1)\n );\n }\n }\n "}}(),PadProgram=function(){return function(e,t,n){this.variableNames=["x"],this.outputShape=t.map(function(t,n){return t[0]+e[n]+t[1]});var r=e.length,o=getCoordsDataType(r),a=t.map(function(e){return e[0]}).join(","),i=t.map(function(t,n){return t[0]+e[n]}).join(","),s=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,r);this.userCode=1!==r?"\n "+o+" start = "+o+"("+a+");\n "+o+" end = "+o+"("+i+");\n\n void main() {\n "+o+" outC = getOutputCoords();\n if (any(lessThan(outC, start)) || any(greaterThanEqual(outC, end))) {\n setOutput(float("+n+"));\n } else {\n "+o+" coords = outC - start;\n setOutput(getX("+s+"));\n }\n }\n ":"\n int start = "+a+";\n int end = "+i+";\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start || outC >= end) {\n setOutput(float("+n+"));\n } else {\n setOutput(getX(outC - start));\n }\n }\n "}}(),Pool2DProgram=function(){return function(e,t,n){if(this.variableNames=["x"],"avg"===t&&n)throw new Error("Cannot compute positions for average pool.");var r=e.filterHeight,o=e.filterWidth,a=e.strideHeight,i=e.strideWidth,s=e.padInfo.top,u=e.padInfo.left;this.outputShape=e.outShape;var l="avg"===t,c="0.0";if(l||(c="-1.0 / 0.0"),n)this.userCode="\n const ivec2 strides = ivec2("+a+", "+i+");\n const ivec2 pads = ivec2("+s+", "+u+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n float minMaxValue = 0.0;\n float minMaxValueFound = 0.0;\n int minMaxPosition = 0;\n float avgValue = 0.0;\n\n for (int wR = 0; wR < "+r+"; wR++) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= "+e.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+o+"; wC++) {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= "+e.inWidth+") {\n continue;\n }\n\n float value = getX(batch, xR, xC, d);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value >= currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = wR * "+o+" + wC;\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n ";else{var p=t+"("+t+"("+t+"(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])";"avg"===t&&(p="avgValue / count");var d=4*Math.floor(o/4),h=o%4,f="\n if ("+l+") {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = max(values, minMaxValue);\n }\n ";this.userCode="\n const ivec2 strides = ivec2("+a+", "+i+");\n const ivec2 pads = ivec2("+s+", "+u+");\n const float initializationValue = "+c+";\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xR, int xC, int d) {\n if (xC < 0 || xC >= "+e.inWidth+") {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xR, xC, d);\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n vec4 minMaxValue = vec4("+c+");\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wR = 0; wR < "+r+"; wR++) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= "+e.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+d+"; wC += 4) {\n int xC = xCCorner + wC;\n\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + 1, d),\n getValue(batch, xR, xC + 2, d),\n getValue(batch, xR, xC + 3, d)\n );\n\n "+f+"\n }\n\n int xC = xCCorner + "+d+";\n if ("+(1===h)+") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n "+f+"\n } else if ("+(2===h)+") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + 1, d),\n initializationValue,\n initializationValue\n );\n\n "+f+"\n } else if ("+(3===h)+") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + 1, d),\n getValue(batch, xR, xC + 2, d),\n initializationValue\n );\n\n "+f+"\n }\n }\n setOutput("+p+");\n }\n "}}}(),ReduceProgram=function(){return function(e,t){this.variableNames=["x"];var n=e.windowSize,r=e.batchSize,o=e.inSize,a=Math.ceil(o/n);this.outputShape=[r,a];var i="0.0",s="";"prod"===t?i="1.0":"min"===t?(i="1.0 / 0.0",s="min"):"max"===t&&(i="-1.0 / 0.0",s="max");var u=t+"("+t+"("+t+"(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])";"sum"===t?u="sumValue":"prod"===t?u="prodValue":"all"===t?u="allValue":"any"===t&&(u="anyValue");var l=4*Math.floor(n/4),c=n%4,p="\n if ("+("sum"===t)+") {\n sumValue += dot(values, ones);\n } else if ("+("prod"===t)+") {\n vec2 tmp = vec2(values[0], values[1]) * vec2(values[2], values[3]);\n prodValue *= tmp[0] * tmp[1];\n } else {\n minMaxValue = "+s+"(values, minMaxValue);\n }\n ",d="vec4";"all"===t?(i="1.0",p="\n bool reducedAllValue = all(values);\n float floatedReducedAllValue = float(reducedAllValue);\n allValue = float(allValue >= 1.0 && floatedReducedAllValue >= 1.0);\n ",d="bvec4"):"any"===t&&(i="0.0",p="\n bool reducedAnyValue = any(values);\n float floatedReducedAnyValue = float(reducedAnyValue);\n anyValue = float(anyValue >= 1.0 || floatedReducedAnyValue >= 1.0);\n ",d="bvec4");var h="";o%n>0&&(h="\n if (inIdx < 0 || inIdx >= "+o+") {\n return initializationValue;\n }\n "),this.userCode="\n const float initializationValue = "+i+";\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n "+h+"\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * "+n+";\n\n vec4 minMaxValue = vec4("+i+");\n float prodValue = 1.0;\n float sumValue = 0.0;\n float allValue = 1.0;\n float anyValue = 0.0;\n\n for (int i = 0; i < "+l+"; i += 4) {\n int inIdx = inOffset + i;\n "+d+" values = "+d+"(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n "+p+"\n }\n\n int inIdx = inOffset + "+l+";\n if ("+(1===c)+") {\n "+d+" values = "+d+"(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n "+p+"\n } else if ("+(2===c)+") {\n "+d+" values = "+d+"(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n "+p+"\n } else if ("+(3===c)+") {\n "+d+" values = "+d+"(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n "+p+"\n }\n setOutput("+u+");\n }\n "}}(),ResizeBilinearBackpropProgram=function(){return function(e,t,n){this.variableNames=["dy"],this.outputShape=[],this.outputShape=t.shape;var r=t.shape,o=r[1],a=r[2],i=e.shape,s=i[1],u=i[2],l=[n&&s>1?o-1:o,n&&u>1?a-1:a],c=[n&&s>1?s-1:s,n&&u>1?u-1:u],p=l[0]/c[0],d=l[1]/c[1],h=1/p,f=1/d,m=2*Math.ceil(h)+2,g=2*Math.ceil(f)+2;this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float("+p+");\n const float widthScale = float("+d+");\n\n const float invHeightScale = float("+h+");\n const float invWidthScale = float("+f+");\n\n const int winHeight = int("+m+");\n const int winWidth = int("+g+");\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(startRLerp - float(winHeight / 2));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(startCLerp - float(winWidth / 2));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= "+s+") {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= "+u+") {\n continue;\n }\n\n float dxR = float(dyR) * heightScale;\n int topDxRIndex = int(floor(dxR));\n int bottomDxRIndex = int(min(ceil(dxR), "+(o-1)+".0));\n float dxRLerp = dxR - float(topDxRIndex);\n float inverseDxRLerp = 1.0 - dxRLerp;\n\n float dxC = float(dyC) * widthScale;\n int leftDxCIndex = int(floor(dxC));\n int rightDxCIndex = int(min(ceil(dxC), "+(a-1)+".0));\n float dxCLerp = dxC - float(leftDxCIndex);\n float inverseDxCLerp = 1.0 - dxCLerp;\n\n if (r == topDxRIndex && c == leftDxCIndex) {\n // topLeft\n accumulator +=\n getDy(b, dyR, dyC, d) * inverseDxRLerp * inverseDxCLerp;\n }\n\n if (r == topDxRIndex && c == rightDxCIndex) {\n // topRight\n accumulator += getDy(b, dyR, dyC, d) * inverseDxRLerp * dxCLerp;\n }\n\n if (r == bottomDxRIndex && c == leftDxCIndex) {\n // bottomLeft\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * inverseDxCLerp;\n }\n\n if (r == bottomDxRIndex && c == rightDxCIndex) {\n // bottomRight\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * dxCLerp;\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n "}}(),ResizeBilinearProgram=function(){return function(e,t,n,r){this.variableNames=["A"],this.outputShape=[];var o=e[0],a=e[1],i=e[2],s=e[3];this.outputShape=[o,t,n,s];var u=[r&&t>1?a-1:a,r&&n>1?i-1:i],l=[r&&t>1?t-1:t,r&&n>1?n-1:n];this.userCode="\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n "+u[0]/l[0]+",\n "+u[1]/l[1]+");\n const vec2 inputShapeRC = vec2("+a+".0, "+i+".0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = vec2(yRC) * effectiveInputOverOutputRatioRC;\n\n // Compute the four integer indices.\n ivec2 sourceFloorRC = ivec2(sourceFracIndexRC);\n ivec2 sourceCeilRC = ivec2(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n float topLeft = getA(b, sourceFloorRC.x, sourceFloorRC.y, d);\n float bottomLeft = getA(b, sourceCeilRC.x, sourceFloorRC.y, d);\n float topRight = getA(b, sourceFloorRC.x, sourceCeilRC.y, d);\n float bottomRight = getA(b, sourceCeilRC.x, sourceCeilRC.y, d);\n\n vec2 fracRC = sourceFracIndexRC - vec2(sourceFloorRC);\n\n float top = topLeft + (topRight - topLeft) * fracRC.y;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y;\n float newValue = top + (bottom - top) * fracRC.x;\n\n setOutput(newValue);\n }\n "}}(),ResizeNearestNeigborBackpropProgram=function(){return function(e,t,n){this.variableNames=["dy"],this.outputShape=[],this.outputShape=t.shape;var r=t.shape,o=r[1],a=r[2],i=e.shape,s=i[1],u=i[2],l=[n&&s>1?o-1:o,n&&u>1?a-1:a],c=[n&&s>1?s-1:s,n&&u>1?u-1:u],p=l[0]/c[0],d=l[1]/c[1],h=1/p,f=1/d,m=2*Math.ceil(h)+2,g=2*Math.ceil(f)+2;this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float("+p+");\n const float widthScale = float("+d+");\n\n const float invHeightScale = float("+h+");\n const float invWidthScale = float("+f+");\n\n const int winHeight = int("+m+");\n const int winWidth = int("+g+");\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(floor(startRLerp - float(winHeight / 2)));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(floor(startCLerp - float(winWidth / 2)));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= "+s+") {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= "+u+") {\n continue;\n }\n\n float sourceFracRow =\n float("+l[0]+") *\n (float(dyR) / float("+c[0]+"));\n\n float sourceFracCol =\n float("+l[1]+") *\n (float(dyC) / float("+c[1]+"));\n\n int sourceNearestRow = int(min(\n float(int("+o+") - 1),\n "+n+" ? float(round(sourceFracRow)) :\n float(floor(sourceFracRow))));\n\n int sourceNearestCol = int(min(\n float(int("+a+") - 1),\n "+n+" ? float(round(sourceFracCol)) :\n float(floor(sourceFracCol))));\n\n if (r == sourceNearestRow && c == sourceNearestCol) {\n accumulator += getDy(b, dyR, dyC, d);\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n "}}(),ResizeNearestNeighborProgram=function(){return function(e,t,n,r){this.variableNames=["A"],this.outputShape=[];var o=e[0],a=e[1],i=e[2],s=e[3];this.outputShape=[o,t,n,s];var u=[r&&t>1?a-1:a,r&&n>1?i-1:i],l=[r&&t>1?t-1:t,r&&n>1?n-1:n],c=r?"0.5":"0.0";this.userCode="\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n "+u[0]/l[0]+",\n "+u[1]/l[1]+");\n const vec2 inputShapeRC = vec2("+a+".0, "+i+".0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = vec2(yRC) * effectiveInputOverOutputRatioRC;\n\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestRC = ivec2(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + "+c+")));\n\n float newValue = getA(b, sourceNearestRC.x, sourceNearestRC.y, d);\n\n setOutput(newValue);\n }\n "}}(),ReverseProgram=function(){return function(e,t){this.variableNames=["x"];var n=e.length;if(n>4)throw new Error("WebGL backend: Reverse of rank-"+n+" tensor is not yet supported");if(this.outputShape=e,1!==n){var r=e.map(function(n,r){return function(n){return-1!==t.indexOf(n)&&1!==e[n]?e[n]+" - coords["+n+"] - 1":"coords["+n+"]"}(r)}).join(","),o=getCoordsDataType(n);this.userCode="\n void main() {\n "+o+" coords = getOutputCoords();\n setOutput(getX("+r+"));\n }\n "}else this.userCode="\n void main() {\n int coord = getOutputCoords();\n setOutput(getX("+e[0]+" - coord - 1));\n }\n "}}(),ScatterNDProgram=function(){return function(e,t,n,r){this.updateSize=e,this.sliceDim=t,this.strides=n,this.variableNames=["updates","indices"],this.outputShape=r;var o=getCoordsDataType(n.length),a=getCoordsDataType(r.length),i=this.sliceDim>1?"strides[j]":"strides";this.userCode="\n "+o+" strides = "+o+"("+this.strides+");\n\n void main() {\n "+a+" coords = getOutputCoords();\n float sum = 0.0;\n for (int i = 0; i < "+this.updateSize+"; i++) {\n int flattenIndex = 0;\n for (int j = 0; j < "+this.sliceDim+"; j++) {\n int index = round(getIndices(i, j));\n flattenIndex += index * "+i+";\n }\n if (flattenIndex == coords[0]) {\n sum += getUpdates(i, coords[1]);\n }\n }\n setOutput(sum);\n }\n "}}(),SegmentOpProgram=function(){return function(e,t){this.variableNames=["x","segmentIds"];var n=e.windowSize,r=e.batchSize,o=e.inSize,a=e.numSegments,i=a*Math.ceil(o/n);this.outputShape=[r,i];var s=4*Math.floor(n/4),u=n%4,l="\n sumValue += dot(values, filter);\n ",c="";o%n>0&&(c="\n if (inIdx < 0 || inIdx >= "+o+") {\n return initializationValue;\n }\n ");var p="";o%n>0&&(p="\n if (inIdx < 0 || inIdx >= "+o+") {\n return -1.0;\n }\n "),this.userCode="\n const float initializationValue = 0.0;\n\n float getValue(int batch, int inIdx) {\n "+c+"\n return getX(batch, inIdx);\n }\n\n float getSegmentIdAtIndex(int inIdx) {\n "+p+"\n return getSegmentIds(inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = int(floor(float(outIdx) / float(\n "+a+")) * float("+n+"));\n int currentSeg = int(mod(float(outIdx), float("+a+")));\n\n float sumValue = 0.0;\n\n for (int i = 0; i < "+s+"; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n vec4 filter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 3)) == currentSeg ? 1 : 0\n );\n\n "+l+"\n }\n\n int inIdx = inOffset + "+s+";\n if ("+(1===u)+") {\n vec4 values = vec4(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n int inIdxSeg = int(getSegmentIdAtIndex(inIdx));\n\n vec4 filter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n 0,\n 0,\n 0\n );\n\n "+l+"\n } else if ("+(2===u)+") {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n vec4 filter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n 0,\n 0\n );\n\n "+l+"\n } else if ("+(3===u)+") {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n vec4 filter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n 0\n );\n\n "+l+"\n }\n setOutput(sumValue);\n }\n "}}(),SelectProgram=function(){return function(e,t,n){var r,o;if(this.variableNames=["c","a","b"],this.outputShape=t,n>4)throw Error("Where for rank "+n+" is not yet supported");if(1===n)o="resRC",r="resRC";else{for(var a=["resRC.x","resRC.y","resRC.z","resRC.w"],i=[],s=[],u=0;u= 1.0) {\n setOutput(getA("+o+"));\n } else {\n setOutput(getB("+o+"));\n }\n }\n "}}(),SliceProgram=function(){function e(e){this.variableNames=["source"],this.outputShape=e,this.rank=e.length;var t=getCoordsDataType(this.rank),n=getCoords$1(this.rank);this.userCode="\n uniform "+t+" start;\n\n void main() {\n "+t+" sourceLoc = start + getOutputCoords();\n setOutput(getSource("+n+"));\n }\n "}return e.prototype.getCustomSetupFunc=function(e){var t=this;if(e.length!==this.rank)throw Error("The rank ("+this.rank+") of the program must match the length of start ("+e.length+")");return function(n,r){if(null!=t.startLoc||(t.startLoc=n.getUniformLocationNoThrow(r,"start"),null!=t.startLoc))if(1===t.rank)n.gl.uniform1i(t.startLoc,e[0]);else if(2===t.rank)n.gl.uniform2i(t.startLoc,e[0],e[1]);else if(3===t.rank)n.gl.uniform3i(t.startLoc,e[0],e[1],e[2]);else{if(4!==t.rank)throw Error("Slicing for rank "+t.rank+" is not yet supported");n.gl.uniform4i(t.startLoc,e[0],e[1],e[2],e[3])}}},e}();function getCoords$1(e){if(1===e)return"sourceLoc";if(2===e)return"sourceLoc.x, sourceLoc.y";if(3===e)return"sourceLoc.x, sourceLoc.y, sourceLoc.z";if(4===e)return"sourceLoc.x, sourceLoc.y, sourceLoc.z, sourceLoc.w";throw Error("Slicing for rank "+e+" is not yet supported")}var StridedSliceProgram=function(){return function(e,t,n,r){this.variableNames=["x"];var o=n.filter(function(e,t){return-1===r.indexOf(t)});this.outputShape=o;var a=n.length,i=getCoordsDataType(n.length),s=getCoordsDataType(o.length),u="";if(1===a)u="coords * strides + begin";else{var l=0;u=n.map(function(e,t){return-1===r.indexOf(t)?(l++,1===o.length?"coords * strides["+t+"] + begin["+t+"]":"coords["+(l-1)+"] * strides["+t+"] + begin["+t+"]"):"begin["+t+"]"}).join(",")}this.userCode="\n "+i+" begin = "+i+"("+e+");\n "+i+" strides = "+i+"("+t+");\n\n void main() {\n "+s+" coords = getOutputCoords();\n setOutput(getX("+u+"));\n }\n "}}(),TextureManager=function(){function e(e){this.gpgpu=e,this.numUsedTextures=0,this.numFreeTextures=0,this.freeTextures={},this.logEnabled=!1,this.usedTextures={}}return e.prototype.acquireTexture=function(e,t){var n,r=getPhysicalFromLogicalTextureType(t),o=getKeyFromTextureShape(e,r);if(o in this.freeTextures||(this.freeTextures[o]=[]),o in this.usedTextures||(this.usedTextures[o]=[]),this.freeTextures[o].length>0){this.numFreeTextures--,this.numUsedTextures++,this.log();var a=this.freeTextures[o].shift();return this.usedTextures[o].push(a),a}return this.numUsedTextures++,this.log(),r===PhysicalTextureType.PACKED_2X2_FLOAT32?n=this.gpgpu.createPackedMatrixTexture(e[0],e[1]):r===PhysicalTextureType.PACKED_2X2_FLOAT16?n=this.gpgpu.createFloat16PackedMatrixTexture(e[0],e[1]):r===PhysicalTextureType.UNPACKED_FLOAT32?n=this.gpgpu.createFloat32MatrixTexture(e[0],e[1]):r===PhysicalTextureType.UNPACKED_FLOAT16?n=this.gpgpu.createFloat16MatrixTexture(e[0],e[1]):r===PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE&&(n=this.gpgpu.createUnsignedBytesMatrixTexture(e[0],e[1])),this.usedTextures[o].push(n),n},e.prototype.releaseTexture=function(e,t,n){if(null!=this.freeTextures){var r=getKeyFromTextureShape(t,getPhysicalFromLogicalTextureType(n));r in this.freeTextures||(this.freeTextures[r]=[]),this.freeTextures[r].push(e),this.numFreeTextures++,this.numUsedTextures--;var o=this.usedTextures[r],a=o.indexOf(e);if(a<0)throw new Error("Cannot release a texture that was never provided by this texture manager");o.splice(a,1),this.log()}},e.prototype.log=function(){if(this.logEnabled){var e=this.numFreeTextures+this.numUsedTextures;console.log("Free/Used",this.numFreeTextures+" / "+this.numUsedTextures,"("+e+")")}},e.prototype.getNumUsedTextures=function(){return this.numUsedTextures},e.prototype.getNumFreeTextures=function(){return this.numFreeTextures},e.prototype.dispose=function(){var e=this;if(null!=this.freeTextures){for(var t in this.freeTextures)this.freeTextures[t].forEach(function(t){e.gpgpu.deleteMatrixTexture(t)});for(var t in this.usedTextures)this.usedTextures[t].forEach(function(t){e.gpgpu.deleteMatrixTexture(t)});this.freeTextures=null,this.usedTextures=null,this.numUsedTextures=0,this.numFreeTextures=0}},e}();function getPhysicalFromLogicalTextureType(e){if(e===TextureUsage.DOWNLOAD||e===TextureUsage.PIXELS)return PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE;if(e===TextureUsage.UPLOAD)return PhysicalTextureType.UNPACKED_FLOAT32;if(e===TextureUsage.RENDER)return ENV.get("WEBGL_RENDER_FLOAT32_ENABLED")?PhysicalTextureType.UNPACKED_FLOAT32:PhysicalTextureType.UNPACKED_FLOAT16;if(e===TextureUsage.PACK)return ENV.get("WEBGL_RENDER_FLOAT32_ENABLED")?PhysicalTextureType.PACKED_2X2_FLOAT32:PhysicalTextureType.PACKED_2X2_FLOAT16;throw new Error("Unknown logical texture type "+e)}function getKeyFromTextureShape(e,t){return e[0]+"_"+e[1]+"_"+t}var TileProgram=function(){return function(e,t){this.variableNames=["A"];for(var n=new Array(e.length),r=0;r5)throw Error("Tile for rank "+t+" is not yet supported");if(1===t)return"imod(resRC, "+e[0]+")";for(var n=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u"],r=[],o=0;o6)throw Error("Transpose for rank "+t+" is not yet supported");for(var n=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u","resRC.v"],r=new Array(t),o=0;o= 0.0) ? scale * x : scaleAlpha * (exp(x) - 1.0);\n";function STEP(e){return void 0===e&&(e=0),CHECK_NAN_SNIPPET$1+"\n return x > 0.0 ? 1.0 : float("+e+");\n "}var NEG="return -x;",CEIL="return ceil(x);",FLOOR="return floor(x);",SIGN="\n if (isNaN(x)) { return 0.0; }\n return sign(x);\n",ROUND="\n // OpenGL ES does not support round function.\n // The algorithm is based on banker's rounding.\n float base = floor(x);\n if ((x - base) < 0.5) {\n return floor(x);\n } else if ((x - base) > 0.5) {\n return ceil(x);\n } else {\n if (mod(base, 2.0) == 0.0) {\n return base;\n } else {\n return base + 1.0;\n }\n }\n",EXP="return exp(x);",EXPM1="return exp(x) - 1.0;",LOG="if (x < 0.0) return NAN;\n return log(x);",LOG1P="return log(1.0 + x);",SQRT="return sqrt(x);",RSQRT="return inversesqrt(x);",SIGMOID="return 1.0 / (1.0 + exp(-1.0 * x));",SOFTPLUS="\n float epsilon = 1.1920928955078125e-7;\n float threshold = log(epsilon) + 2.0;\n\n bool too_large = x > -threshold;\n bool too_small = x < threshold;\n\n float result;\n float exp_x = exp(x);\n\n if (too_large){\n result = x;\n }\n else if (too_small){\n result = exp_x;\n }\n else{\n result = log(exp_x + 1.0);\n }\n return result;\n",SIN=CHECK_NAN_SNIPPET$1+"\n return sin(x);\n",COS=CHECK_NAN_SNIPPET$1+"\n return cos(x);\n",TAN="return tan(x);",ASIN="return asin(x);",ACOS="return acos(x);",ATAN=CHECK_NAN_SNIPPET$1+"\n return atan(x);\n",SINH="\n float e2x = exp(x);\n return (e2x - 1.0 / e2x) / 2.0;\n",COSH="\n float e2x = exp(-x);\n return (e2x + 1.0 / e2x) / 2.0;\n",TANH="\n float e2x = exp(-2.0 * abs(x));\n return sign(x) * (1.0 - e2x) / (1.0 + e2x);\n",ASINH="return log(x + sqrt(x * x + 1.0));",ACOSH=CHECK_NAN_SNIPPET$1+"\n if (x < 1.0) return NAN;\n return log(x + sqrt(x * x - 1.0));",ATANH=CHECK_NAN_SNIPPET$1+"\n if ((x < -1.0) || (x > 1.0)) return NAN;\n return (log(1.0 + x) - log(1.0 - x)) / 2.0;",ERF='\n // Error function is calculated approximately with elementary function.\n // See "Handbook of Mathematical Functions with Formulas,\n // Graphs, and Mathematical Tables", Abramowitz and Stegun.\n float p = '+ERF_P+";\n float a1 = "+ERF_A1+";\n float a2 = "+ERF_A2+";\n float a3 = "+ERF_A3+";\n float a4 = "+ERF_A4+";\n float a5 = "+ERF_A5+";\n\n float t = 1.0 / (1.0 + p * x);\n return 1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x);\n",SQUARE="return x * x;",RECIPROCAL="return 1.0 / x;",LOGICAL_NOT="return float(!(x >= 1.0));",TO_INT="return float(int(x));",UnpackProgram=function(){return function(e){this.variableNames=["A"],this.outputShape=e,this.userCode="\n const vec2 onePixel = 1. / vec2("+e[1]+", "+e[0]+");\n\n void main() {\n ivec2 rc = getOutputCoords();\n vec2 modCoord = mod(vec2(rc.y, rc.x), 2.);\n vec4 packedInput = getA(rc.x, rc.y);\n\n setOutput(\n modCoord.x == 0. ?\n (modCoord.y == 0. ? packedInput.r : packedInput.b) :\n (modCoord.y == 0. ? packedInput.g : packedInput.a)\n );\n }\n "}}();function concat1d_(e){return concat(e,0)}function concat2d_(e,t){return concat(e,t)}function concat3d_(e,t){return concat(e,t)}function concat4d_(e,t){return concat(e,t)}function concat_(e,t){void 0===t&&(t=0),assert(e.length>=1,"Pass at least one tensor to concat");var n=convertToTensorArray(e,"tensors","concat");t=parseAxisParam(t,n[0].shape)[0];var r=computeOutShape(n.map(function(e){return e.shape}),t);if(0===sizeFromShape(r))return tensor([],r);if(1===(n=n.filter(function(e){return e.size>0})).length)return n[0];var o=n.map(function(e){return e.shape});assertParamsConsistent(o,t);var a=n;return ENV.engine.runKernel(function(e){return e.concat(n,t)},a,function(e){var n=o.map(function(e){return e[t]});return split$1(e,n,t).map(function(e){return function(){return e}})})}function split_(e,t,n){void 0===n&&(n=0);var r,o=convertToTensor(e,"x","split");n=parseAxisParam(n,o.shape)[0],"number"==typeof t?(assert(o.shape[n]%t==0,"Number of splits must evenly divide the axis."),r=Array(t).fill(o.shape[n]/t)):(assert(o.shape[n]===t.reduce(function(e,t){return e+t}),"The sum of sizes must match the size of the axis dimension."),r=t);return ENV.engine.runKernel(function(e){return e.split(o,r,n)},{$x:o},function(e){return{$x:function(){return concat(e,n)}}})}var concat=op({concat_:concat_}),concat1d=op({concat1d_:concat1d_}),concat2d=op({concat2d_:concat2d_}),concat3d=op({concat3d_:concat3d_}),concat4d=op({concat4d_:concat4d_}),split$1=op({split_:split_}),commonjsGlobal="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function createCommonjsModule(e,t){return e(t={exports:{}},t.exports),t.exports}var alea=createCommonjsModule(function(e){!function(e,t,n){function r(e,t){return t.c=e.c,t.s0=e.s0,t.s1=e.s1,t.s2=e.s2,t}function o(e,t){var n=new function(e){var t,n=this,r=(t=4022871197,function(e){e=e.toString();for(var n=0;n>>0,t=(r*=t)>>>0,t+=4294967296*(r-=t)}return 2.3283064365386963e-10*(t>>>0)});n.next=function(){var e=2091639*n.s0+2.3283064365386963e-10*n.c;return n.s0=n.s1,n.s1=n.s2,n.s2=e-(n.c=0|e)},n.c=1,n.s0=r(" "),n.s1=r(" "),n.s2=r(" "),n.s0-=r(e),n.s0<0&&(n.s0+=1),n.s1-=r(e),n.s1<0&&(n.s1+=1),n.s2-=r(e),n.s2<0&&(n.s2+=1),r=null}(e),o=t&&t.state,a=n.next;return a.int32=function(){return 4294967296*n.next()|0},a.double=function(){return a()+1.1102230246251565e-16*(2097152*a()|0)},a.quick=a,o&&("object"==typeof o&&r(o,n),a.state=function(){return r(n,{})}),a}t&&t.exports?t.exports=o:n&&n.amd?n(function(){return o}):this.alea=o}(0,e,!1)}),xor128=createCommonjsModule(function(e){!function(e,t,n){function r(e,t){return t.x=e.x,t.y=e.y,t.z=e.z,t.w=e.w,t}function o(e,t){var n=new function(e){var t=this,n="";t.x=0,t.y=0,t.z=0,t.w=0,t.next=function(){var e=t.x^t.x<<11;return t.x=t.y,t.y=t.z,t.z=t.w,t.w^=t.w>>>19^e^e>>>8},e===(0|e)?t.x=e:n+=e;for(var r=0;r>>0)/4294967296};return a.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},a.int32=n.next,a.quick=a,o&&("object"==typeof o&&r(o,n),a.state=function(){return r(n,{})}),a}t&&t.exports?t.exports=o:n&&n.amd?n(function(){return o}):this.xor128=o}(0,e,!1)}),xorwow=createCommonjsModule(function(e){!function(e,t,n){function r(e,t){return t.x=e.x,t.y=e.y,t.z=e.z,t.w=e.w,t.v=e.v,t.d=e.d,t}function o(e,t){var n=new function(e){var t=this,n="";t.next=function(){var e=t.x^t.x>>>2;return t.x=t.y,t.y=t.z,t.z=t.w,t.w=t.v,(t.d=t.d+362437|0)+(t.v=t.v^t.v<<4^e^e<<1)|0},t.x=0,t.y=0,t.z=0,t.w=0,t.v=0,e===(0|e)?t.x=e:n+=e;for(var r=0;r>>4),t.next()}(e),o=t&&t.state,a=function(){return(n.next()>>>0)/4294967296};return a.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},a.int32=n.next,a.quick=a,o&&("object"==typeof o&&r(o,n),a.state=function(){return r(n,{})}),a}t&&t.exports?t.exports=o:n&&n.amd?n(function(){return o}):this.xorwow=o}(0,e,!1)}),xorshift7=createCommonjsModule(function(e){!function(e,t,n){function r(e,t){return t.x=e.x.slice(),t.i=e.i,t}function o(e,t){null==e&&(e=+new Date);var n=new function(e){var t=this;t.next=function(){var e,n,r=t.x,o=t.i;return e=r[o],n=(e^=e>>>7)^e<<24,n^=(e=r[o+1&7])^e>>>10,n^=(e=r[o+3&7])^e>>>3,n^=(e=r[o+4&7])^e<<7,e=r[o+7&7],n^=(e^=e<<13)^e<<9,r[o]=n,t.i=o+1&7,n},function(e,t){var n,r=[];if(t===(0|t))r[0]=t;else for(t=""+t,n=0;n0;--n)e.next()}(t,e)}(e),o=t&&t.state,a=function(){return(n.next()>>>0)/4294967296};return a.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},a.int32=n.next,a.quick=a,o&&(o.x&&r(o,n),a.state=function(){return r(n,{})}),a}t&&t.exports?t.exports=o:n&&n.amd?n(function(){return o}):this.xorshift7=o}(0,e,!1)}),xor4096=createCommonjsModule(function(e){!function(e,t,n){function r(e,t){return t.i=e.i,t.w=e.w,t.X=e.X.slice(),t}function o(e,t){null==e&&(e=+new Date);var n=new function(e){var t=this;t.next=function(){var e,n,r=t.w,o=t.X,a=t.i;return t.w=r=r+1640531527|0,n=o[a+34&127],e=o[a=a+1&127],n^=n<<13,e^=e<<17,n^=n>>>15,e^=e>>>12,n=o[a]=n^e,t.i=a,n+(r^r>>>16)|0},function(e,t){var n,r,o,a,i,s=[],u=128;for(t===(0|t)?(r=t,t=null):(t+="\0",r=0,u=Math.max(u,t.length)),o=0,a=-32;a>>15,r^=r<<4,r^=r>>>13,a>=0&&(i=i+1640531527|0,o=0==(n=s[127&a]^=r+i)?o+1:0);for(o>=128&&(s[127&(t&&t.length||0)]=-1),o=127,a=512;a>0;--a)r=s[o+34&127],n=s[o=o+1&127],r^=r<<13,n^=n<<17,r^=r>>>15,n^=n>>>12,s[o]=r^n;e.w=i,e.X=s,e.i=o}(t,e)}(e),o=t&&t.state,a=function(){return(n.next()>>>0)/4294967296};return a.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},a.int32=n.next,a.quick=a,o&&(o.X&&r(o,n),a.state=function(){return r(n,{})}),a}t&&t.exports?t.exports=o:n&&n.amd?n(function(){return o}):this.xor4096=o}(0,e,!1)}),tychei=createCommonjsModule(function(e){!function(e,t,n){function r(e,t){return t.a=e.a,t.b=e.b,t.c=e.c,t.d=e.d,t}function o(e,t){var n=new function(e){var t=this,n="";t.next=function(){var e=t.b,n=t.c,r=t.d,o=t.a;return e=e<<25^e>>>7^n,n=n-r|0,r=r<<24^r>>>8^o,o=o-e|0,t.b=e=e<<20^e>>>12^n,t.c=n=n-r|0,t.d=r<<16^n>>>16^o,t.a=o-e|0},t.a=0,t.b=0,t.c=-1640531527,t.d=1367130551,e===Math.floor(e)?(t.a=e/4294967296|0,t.b=0|e):n+=e;for(var r=0;r>>0)/4294967296};return a.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},a.int32=n.next,a.quick=a,o&&("object"==typeof o&&r(o,n),a.state=function(){return r(n,{})}),a}t&&t.exports?t.exports=o:n&&n.amd?n(function(){return o}):this.tychei=o}(0,e,!1)}),seedrandom=createCommonjsModule(function(e){!function(t,n){var r,o=this,a=256,i=6,s="random",u=n.pow(a,i),l=n.pow(2,52),c=2*l,p=a-1;function d(e,d,g){var v=[],x=f(function e(t,n){var r,o=[],a=typeof t;if(n&&"object"==a)for(r in t)try{o.push(e(t[r],n-1))}catch(e){}return o.length?o:"string"==a?t:t+"\0"}((d=1==d?{entropy:!0}:d||{}).entropy?[e,m(t)]:null==e?function(){try{var e;return r&&(e=r.randomBytes)?e=e(a):(e=new Uint8Array(a),(o.crypto||o.msCrypto).getRandomValues(e)),m(e)}catch(e){var n=o.navigator,i=n&&n.plugins;return[+new Date,o,i,o.screen,m(t)]}}():e,3),v),y=new function(e){var t,n=e.length,r=this,o=0,i=r.i=r.j=0,s=r.S=[];n||(e=[n++]);for(;o=c;)e/=2,t/=2,n>>>=1;return(e+n)/t};return T.int32=function(){return 0|y.g(4)},T.quick=function(){return y.g(4)/4294967296},T.double=T,f(m(y.S),t),(d.pass||g||function(e,t,r,o){return o&&(o.S&&h(o,y),e.state=function(){return h(y,{})}),r?(n[s]=e,t):e})(T,x,"global"in d?d.global:this==n,d.state)}function h(e,t){return t.i=e.i,t.j=e.j,t.S=e.S.slice(),t}function f(e,t){for(var n,r=e+"",o=0;o=1||0===i);var s=Math.sqrt(-2*Math.log(i)/i);t=this.mean+this.stdDev*o*s,n=this.mean+this.stdDev*a*s,this.truncated&&!this.isValidTruncated(t)||(r=!0)}return this.truncated&&!this.isValidTruncated(n)||(this.nextVal=this.convertValue(n)),this.convertValue(t)},e.prototype.convertValue=function(e){return null==this.dtype||"float32"===this.dtype?e:Math.round(e)},e.prototype.isValidTruncated=function(e){return e<=this.upper&&e>=this.lower},e}();function clone_(e){var t=convertToTensor(e,"x","clone");return ENV.engine.runKernel(function(e){return Tensor.make(t.shape,{dataId:t.dataId},t.dtype)},{$x:t},function(e){return{$x:function(){return e.toFloat()}}})}function eye_(e,t,n,r){void 0===r&&(r="float32"),null==t&&(t=e);for(var o=buffer([e,t],r),a=e<=t?e:t,i=0;i2)throw new Error("Rank of probabilities must be 1 or 2, but is "+i);n=n||Math.random();var s=1===i?o.as2D(1,-1):o,u=ENV.engine.runKernel(function(e){return e.multinomial(s,r,t,n)},{logits2D:s});return 1===i?u.as1D():u}function oneHot_(e,t,n,r){void 0===n&&(n=1),void 0===r&&(r=0);var o=convertToTensor(e,"indices","oneHot","int32");if(assert("int32"===o.dtype,"Indices must be of dtype `int32`"),t<2)throw new Error("Error in oneHot: depth must be >=2, but it is "+t);return ENV.engine.runKernel(function(e){return e.oneHot(o,t,n,r)},{$indices:o},function(e){return{$indices:function(){return zerosLike(o)}}})}function fromPixels_(e,t){if(void 0===t&&(t=3),t>4)throw new Error("Cannot construct Tensor with more than 4 channels from pixels.");return ENV.engine.fromPixels(e,t)}function toPixels(e,t){return __awaiter(this,void 0,void 0,function(){var n,r,o,a,i,s,u,l,c,p,d,h,f,m,g,v,x,y,T,S;return __generator(this,function(b){switch(b.label){case 0:if(2!==(n=convertToTensor(e,"img","toPixels","int32")).rank&&3!==n.rank)throw new Error("toPixels only supports rank 2 or 3 tensors, got rank "+n.rank+".");if(r=n.shape.slice(0,2),o=r[0],a=r[1],(i=2===n.rank?1:n.shape[2])>4||2===i)throw new Error("toPixels only supports depth of size 1, 3 or 4 but got "+i);return s=n.min(),u=n.max(),[4,s.data()];case 1:return l=b.sent()[0],[4,u.data()];case 2:if(c=b.sent()[0],s.dispose(),u.dispose(),"float32"===n.dtype){if(l<0||c>1)throw new Error("Tensor values for a float32 Tensor must be in the range [0 - 1] but got range ["+l+" - "+c+"].")}else{if("int32"!==n.dtype)throw new Error("Unsupported type for toPixels: "+n.dtype+". Please use float32 or int32 tensors.");if(l<0||c>255)throw new Error("Tensor values for a int32 Tensor must be in the range [0 - 255] but got range ["+l+" - "+c+"].")}return[4,n.data()];case 3:for(p=b.sent(),d="float32"===n.dtype?255:1,h=new Uint8ClampedArray(a*o*4),f=0;f=1,"Pass at least one tensor to tf.stack"),1===n.length)return n[0].expandDims(t);var r=n[0].rank,o=n[0].shape,a=n[0].dtype;assert(t<=r,"Axis must be <= rank of the tensor"),n.forEach(function(e){assertShapesMatch(o,e.shape,"All tensors passed to stack must have matching shapes")}),n.forEach(function(e){assert(a===e.dtype,"All tensors passed to stack must have matching dtypes")});var i=n.map(function(e){return e.expandDims(t)});return concat(i,t)}function batchToSpaceND_(e,t,n){var r=convertToTensor(e,"x","batchToSpaceND"),o=t.reduce(function(e,t){return e*t});assert(r.rank>=1+t.length,"input rank is "+r.rank+" but should be > than blockShape.length "+t.length),assert(n.length===t.length,"crops.length is "+n.length+" but should be equal to blockShape.length "+t.length),assert(r.shape[0]%o==0,"input tensor batch is "+r.shape[0]+" but is not divisible by the product of the elements of blockShape "+t.join(" * ")+" === "+o);return ENV.engine.runKernel(function(e){return e.batchToSpaceND(r,t,n)},{$x:r},function(e){return{$x:function(){return e.spaceToBatchND(t,n)}}})}function spaceToBatchND_(e,t,n){var r=convertToTensor(e,"x","spaceToBatchND");assert(r.rank>=1+t.length,"input rank "+r.rank+" should be > than [blockShape] "+t.length),assert(n.length===t.length,"paddings.shape[0] "+n.length+" must be equal to [blockShape] "+t.length),assert(r.shape.reduce(function(e,r,o){return o>0&&o<=t.length?e&&(r+n[o-1][0]+n[o-1][1])%t[o-1]==0:e},!0),"input spatial dimensions "+r.shape.slice(1)+" with paddings "+n.toString()+" must be divisible by blockShapes "+t.toString());return ENV.engine.runKernel(function(e){return e.spaceToBatchND(r,t,n)},{$x:r},function(e){return{$x:function(){return e.batchToSpaceND(t,n)}}})}function unstack_(e,t){void 0===t&&(t=0);for(var n,r=convertToTensor(e,"x","unstack"),o=r.shape[t],a=Array(r.rank-1).fill(0),i=0,s=0;s=0,"Negative dimension size caused by overflow when multiplying\n "+o+" and "+t+" for depthToSpace with input shape\n "+r.shape),assert(a*t>=0,"Negative dimension size caused by overflow when multiplying\n "+a+" and "+t+" for depthToSpace with input shape\n "+r.shape),assert(i%(t*t)==0,"Dimension size must be evenly divisible by "+t*t+" but is "+i+" for depthToSpace with input shape "+r.shape),ENV.engine.runKernel(function(e){return e.depthToSpace(r,t,n)},{$x:r})}function buffer(e,t,n){return void 0===t&&(t="float32"),new TensorBuffer(e,t,n)}function print(e,t){void 0===t&&(t=!1),console.log(e.toString(t))}var batchToSpaceND=op({batchToSpaceND_:batchToSpaceND_}),cast=op({cast_:cast_}),clone=op({clone_:clone_}),cumsum=op({cumsum_:cumsum_}),depthToSpace=op({depthToSpace_:depthToSpace_}),expandDims=op({expandDims_:expandDims_}),eye=op({eye_:eye_}),fromPixels=op({fromPixels_:fromPixels_}),multinomial=op({multinomial_:multinomial_}),oneHot=op({oneHot_:oneHot_}),pad=op({pad_:pad_}),pad1d=op({pad1d_:pad1d_}),pad2d=op({pad2d_:pad2d_}),pad3d=op({pad3d_:pad3d_}),pad4d=op({pad4d_:pad4d_}),rand=op({rand_:rand_}),randomNormal=op({randomNormal_:randomNormal_}),randomUniform=op({randomUniform_:randomUniform_}),reshape=op({reshape_:reshape_}),spaceToBatchND=op({spaceToBatchND_:spaceToBatchND_}),squeeze=op({squeeze_:squeeze_}),stack=op({stack_:stack_}),tile=op({tile_:tile_}),truncatedNormal=op({truncatedNormal_:truncatedNormal_}),unstack=op({unstack_:unstack_});function whereImpl(e,t){for(var n=[],r=0;r0?this.gpgpu.beginQuery():{startMs:performance.now(),endMs:null}},e.prototype.endTimer=function(e){return ENV.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0?(this.gpgpu.endQuery(),e):(e.endMs=performance.now(),e)},e.prototype.getQueryTime=function(e){return __awaiter(this,void 0,void 0,function(){var t;return __generator(this,function(n){return ENV.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0?[2,this.gpgpu.waitForQueryAndGetTime(e)]:[2,(t=e).endMs-t.startMs]})})},e.prototype.disposeData=function(e){if(!this.pendingDisposal.has(e))if(this.pendingRead.has(e))this.pendingDisposal.add(e);else if(this.texData.has(e)){var t=this.texData.get(e),n=t.texture,r=t.texShape,o=t.usage,a=t.complexTensors;null!=n&&this.releaseTexture(e,n,r,o),null!=a&&(a.real.dispose(),a.imag.dispose()),this.texData.delete(e)}},e.prototype.getTexture=function(e){return this.uploadToGPU(e),this.texData.get(e).texture},e.prototype.getGPGPUContext=function(){return this.gpgpu},e.prototype.getCanvas=function(){return this.canvas},e.prototype.complex=function(e,t){var n=this.makeOutputArray(e.shape,"complex64");return this.texData.get(n.dataId).complexTensors={real:ENV.engine.keep(e.clone()),imag:ENV.engine.keep(t.clone())},n},e.prototype.real=function(e){return this.texData.get(e.dataId).complexTensors.real.clone()},e.prototype.imag=function(e){return this.texData.get(e.dataId).complexTensors.imag.clone()},e.prototype.slice=function(e,t,n){var r=new SliceProgram(n),o=r.getCustomSetupFunc(t);return this.compileAndRun(r,[e],null,o)},e.prototype.stridedSlice=function(e,t,n,r,o,a,i,s,u){var l=getStridedSlicedInfo(e.shape,t,n,r,o,a,i,s,u),c=l[0],p=l[1],d=l[2],h=p.filter(function(e,t){return-1===d.indexOf(t)});if(h.some(function(e){return 0===e}))return tensor([],h);var f=new StridedSliceProgram(c,r,p,d);return this.compileAndRun(f,[e])},e.prototype.reverse=function(e,t){var n=new ReverseProgram(e.shape,t);return this.compileAndRun(n,[e])},e.prototype.concat2Tensors=function(e,t,n){var r=computeOutShape([e.shape,t.shape],n),o=e.as2D(-1,sizeFromShape(e.shape.slice(n))),a=t.as2D(-1,sizeFromShape(t.shape.slice(n))),i=new ConcatProgram(o.shape,a.shape);return this.compileAndRun(i,[o,a]).reshape(r)},e.prototype.concat=function(e,t){if(1===e.length)return e[0];for(var n=e[0],r=1;r 4 with a WebGL backend not implemented yet");var r=t.reduce(function(e,t){return e*t}),o=getReshaped(e.shape,t,r),a=getPermuted(o.length,t.length),i=getReshapedPermuted(e.shape,t,r),s=getSliceBeginCoords(n,t.length),u=getSliceSize(i,n,t.length);return e.reshape(o).transpose(a).reshape(i).slice(s,u)},e.prototype.spaceToBatchND=function(e,t,n){assert(e.rank<=4,"spaceToBatchND for rank > 4 with a WebGL backend not implemented yet");var r=t.reduce(function(e,t){return e*t}),o=[[0,0]];o.push.apply(o,n);for(var a=1+t.length;a1,"blockSize should be > 1 for depthToSpace, but was: "+t);var r=e.shape[0],o=("NHWC"===n?e.shape[1]:e.shape[2])*t,a=("NHWC"===n?e.shape[2]:e.shape[3])*t,i=("NHWC"===n?e.shape[3]:e.shape[1])/(t*t),s=new DepthToSpaceProgram("NHWC"===n?[r,o,a,i]:[r,i,o,a],t,n);return this.compileAndRun(s,[e])},e.prototype.split=function(e,t,n){return split(e,t,n)},e.prototype.scatterND=function(e,t,n){var r=prepareAndValidate$1(t,e,n),o=r[0],a=r[1],i=r[2],s=r[3],u=r[4],l=[u/i,i],c=e.reshape([a,o]),p=t.reshape([a,i]);if(0===u)return reshapeTensor(tensor([]),n);var d=new ScatterNDProgram(a,o,s,l);return this.compileAndRun(d,[p,c]).reshape(n)},e.prototype.fft=function(e){var t=this.texData.get(e.dataId),n=new FFTProgram(COMPLEX_FFT.REAL,e.shape),r=new FFTProgram(COMPLEX_FFT.IMAG,e.shape),o=[this.makeComplexComponentTensorHandle(e,t.complexTensors.real),this.makeComplexComponentTensorHandle(e,t.complexTensors.imag)],a=this.compileAndRun(n,o),i=this.compileAndRun(r,o),s=this.complex(a,i).as1D();return a.dispose(),i.dispose(),s},e.prototype.gatherND=function(e,t){var n=t.shape,r=n[n.length-1],o=prepareAndValidate(e,t),a=o[0],i=o[1],s=o[2],u=o[3],l=t.reshape([i,r]),c=e.reshape([e.size/s,s]),p=new GatherNDProgram(r,u,[i,s]);return this.compileAndRun(p,[c,l]).reshape(a)},e.prototype.makeOutputArray=function(e,t){return Tensor.make(e,{},t)},e.prototype.makePackedTensor=function(e){var t=Tensor.make(e,{});return this.texData.get(t.dataId).usage=TextureUsage.PACK,t},e.prototype.compileAndRun=function(e,t,n,r,o){var a=this;if(void 0===o&&(o=!0),null==n&&(n=this.makeOutputArray(e.outputShape,t[0].dtype)),0===n.size)return this.texData.get(n.dataId).values=getTypedArrayFromDType(n.dtype,0),n;var i=t.map(function(e){if("complex64"===e.dtype)throw new Error("GPGPUProgram does not support complex64 input. For complex64 dtypes, please separate the program into real and imaginary parts.");var t=a.texData.get(e.dataId);return null==t.texture&&sizeFromShape(e.shape)<=ENV.get("WEBGL_SIZE_UPLOAD_UNIFORM")?{shape:e.shape,texData:null,isUniform:!0,uniformValues:a.readSync(e.dataId)}:(a.uploadToGPU(e.dataId),{shape:e.shape,texData:t,isUniform:!1})});this.uploadToGPU(n.dataId);var s,u={shape:n.shape,texData:this.texData.get(n.dataId),isUniform:!1},l=makeShaderKey(e,i,u),c=this.getAndSaveBinary(l,function(){return compileProgram(a.gpgpu,e,i,u)}),p=null!=this.activeTimers;if(p&&(s=this.startTimer()),runProgram(c,i,u,r),ENV.get("WEBGL_PAGING_ENABLED")&&o&&this.numBytesInGPU>this.NUM_BYTES_BEFORE_PAGING)for(var d=this.numBytesInGPU-this.NUM_BYTES_BEFORE_PAGING;d>0&&this.lruDataGPU.length>0;){var h=this.lruDataGPU.shift(),f=this.texData.get(h),m=f.shape,g=f.dtype;d-=this.computeBytes(m,g),this.read(h)}return p&&(s=this.endTimer(s),this.activeTimers.push(this.getQueryTime(s))),n},e.prototype.getAndSaveBinary=function(e,t){return e in this.binaryCache||(this.binaryCache[e]=t()),this.binaryCache[e]},e.prototype.getTextureManager=function(){return this.textureManager},e.prototype.dispose=function(){if(!this.disposed){for(var e in this.binaryCache)this.gpgpu.deleteProgram(this.binaryCache[e].webGLProgram);this.textureManager.dispose(),this.canvas.remove(),null!=this.fromPixelsCanvas&&this.fromPixelsCanvas.remove(),this.gpgpuCreatedLocally&&this.gpgpu.dispose(),this.disposed=!0}},e.prototype.floatPrecision=function(){var e=this;return tidy(function(){return e.abs(scalar(1e-8)).get()>0?32:16})},e.prototype.uploadToGPU=function(e){var t=this.texData.get(e),n=t.shape,r=t.values,o=t.texture,a=t.dtype,i=t.usage;if(null==o){var s,u=null!=this.activeTimers;u&&(s=performance.now());var l=getTextureShapeFromLogicalShape(n,i);t.texShape=l;var c=this.acquireTexture(e,l,i);t.texture=c,null!=r&&(this.gpgpu.uploadMatrixToTexture(c,l[0],l[1],typedArrayToFloat32(r,a)),t.values=null,u&&(this.uploadWaitMs+=performance.now()-s))}else{ENV.get("WEBGL_PAGING_ENABLED")&&this.lruDataGPU.indexOf(e)>=0&&(this.lruDataGPU.splice(this.lruDataGPU.indexOf(e),1),this.lruDataGPU.push(e))}},e.prototype.cacheOnCPU=function(e,t){var n=this.delayedStorage,r=this.texData.get(e),o=r.texture,a=r.texShape,i=r.dtype,s=r.usage;n&&null!=o&&(this.releaseTexture(e,o,a,s),r.texture=null,r.texShape=null),r.usage=TextureUsage.UPLOAD,null!=t&&(r.values=float32ToTypedArray(t,i))},e.prototype.releaseTexture=function(e,t,n,r){var o=this.texData.get(e),a=o.shape,i=o.dtype;if(ENV.get("WEBGL_PAGING_ENABLED")){var s=this.lruDataGPU.indexOf(e);s>=0&&this.lruDataGPU.splice(s,1)}this.numBytesInGPU-=this.computeBytes(a,i),this.textureManager.releaseTexture(t,n,r)},e.prototype.acquireTexture=function(e,t,n){var r=this.texData.get(e),o=r.shape,a=r.dtype;return ENV.get("WEBGL_PAGING_ENABLED")&&this.lruDataGPU.push(e),this.numBytesInGPU+=this.computeBytes(o,a),this.textureManager.acquireTexture(t,n)},e.prototype.computeBytes=function(e,t){return sizeFromShape(e)*bytesPerElement(t)},e}();function float32ToTypedArray(e,t){if("float32"===t||"complex64"===t)return e;if("int32"===t||"bool"===t){for(var n="int32"===t?new Int32Array(e.length):new Uint8Array(e.length),r=0;r=2&&a.rank>=2&&o.rank===a.rank,"Error in matMul: inputs must have the same rank of at least 2, got ranks "+o.rank+" and "+a.rank+"."),assert(arraysEqual(c,p),"Error in matMul: outer dimensions ("+c+") and ("+p+") of Tensors with shapes "+o.shape+" and "+a.shape+" must match."),assert(i===s,"Error in matMul: inner shapes ("+i+") and ("+s+") of Tensors with shapes "+o.shape+" and "+a.shape+" and transposeA="+n+" and transposeB="+r+" must match.");var f=o.shape.slice(0,-2).concat([u,l]),m=n?o.as3D(d,i,u):o.as3D(d,u,i),g=r?a.as3D(h,l,s):a.as3D(h,s,l);return ENV.engine.runKernel(function(e){return e.batchMatMul(m,g,n,r)},{$a:m,$b:g},function(e){return n||r?!n&&r?{$a:function(){return e.matMul(g.toFloat(),!1,!1)},$b:function(){return e.matMul(m.toFloat(),!0,!1)}}:n&&!r?{$a:function(){return g.toFloat().matMul(e,!1,!0)},$b:function(){return m.toFloat().matMul(e,!1,!1)}}:{$a:function(){return g.toFloat().matMul(e,!0,!0)},$b:function(){return e.matMul(m.toFloat(),!0,!0)}}:{$a:function(){return e.matMul(g.toFloat(),!1,!0)},$b:function(){return m.toFloat().matMul(e,!0,!1)}}}).reshape(f)}function outerProduct_(e,t){var n=convertToTensor(e,"v1","outerProduct"),r=convertToTensor(t,"v2","outerProduct");return assert(1===n.rank&&1===r.rank,"Error in outerProduct: inputs must be rank 1, but got ranks "+n.rank+" and "+r.rank+"."),n.as2D(-1,1).matMul(r.as2D(1,-1))}function dot_(e,t){var n=convertToTensor(e,"t1","dot"),r=convertToTensor(t,"t2","dot");assert(!(1!==n.rank&&2!==n.rank||1!==r.rank&&2!==r.rank),"Error in dot: inputs must all be rank 1 or 2, but got ranks "+n.rank+" and "+r.rank+".");var o=1===n.rank?n.size:n.shape[1],a=1===r.rank?r.size:r.shape[0];return assert(o===a,"Error in dot: inner dimensions of inputs must match, but got "+o+" and "+a+"."),1===n.rank&&1===r.rank?n.as2D(1,-1).matMul(r.as2D(-1,1)).asScalar():1===n.rank&&2===r.rank?n.as2D(1,-1).matMul(r.as2D(r.shape[0],r.shape[1])).as1D():2===n.rank&&1===r.rank?n.matMul(r.as2D(-1,1)).as1D():n.matMul(r.as2D(r.shape[0],r.shape[1]))}var matMul=op({matMul_:matMul_}),dot=op({dot_:dot_}),outerProduct=op({outerProduct_:outerProduct_});function conv1d_(e,t,n,r,o,a,i){void 0===o&&(o="NWC"),void 0===a&&(a=1);var s=convertToTensor(e,"x","conv1d"),u=convertToTensor(t,"filter","conv1d"),l=s,c=!1;2===s.rank&&(c=!0,l=s.as3D(1,s.shape[0],s.shape[1])),assert(3===l.rank,"Error in conv1d: input must be rank 3, but got rank "+l.rank+"."),assert(3===u.rank,"Error in conv1d: filter must be rank 3, but got rank "+u.rank+"."),null!=i&&assert(isInt(r),"Error in conv1d: pad must be an integer when using, dimRoundingMode "+i+" but got pad "+r+"."),assert(l.shape[2]===u.shape[1],"Error in conv1d: depth of input ("+l.shape[2]+") must match input depth for filter "+u.shape[1]+"."),assert(eitherStridesOrDilationsAreOne(n,a),"Error in conv1D: Either stride or dilation must be 1. Got stride "+n+" and dilation '"+a+"'"),assert("NWC"===o,"Error in conv1d: got dataFormat of "+o+" but only NWC is currently supported.");var p=u.as4D(1,u.shape[0],u.shape[1],u.shape[2]),d=l.as4D(l.shape[0],1,l.shape[1],l.shape[2]),h=conv2d(d,p,[1,n],r,"NHWC",[1,a],i);return c?h.as2D(h.shape[2],h.shape[3]):h.as3D(h.shape[0],h.shape[2],h.shape[3])}function conv2d_(e,t,n,r,o,a,i){void 0===o&&(o="NHWC"),void 0===a&&(a=[1,1]);var s=convertToTensor(e,"x","conv2d"),u=convertToTensor(t,"filter","conv2d"),l=s,c=!1;3===s.rank&&(c=!0,l=s.as4D(1,s.shape[0],s.shape[1],s.shape[2])),assert(4===l.rank,"Error in conv2d: input must be rank 4, but got rank "+l.rank+"."),assert(4===u.rank,"Error in conv2d: filter must be rank 4, but got rank "+u.rank+"."),null!=i&&assert(isInt(r),"Error in conv2d: pad must be an integer when using, dimRoundingMode "+i+" but got pad "+r+"."),assert(l.shape[3]===u.shape[2],"Error in conv2d: depth of input ("+l.shape[3]+") must match input depth for filter "+u.shape[2]+"."),assert(eitherStridesOrDilationsAreOne(n,a),"Error in conv2D: Either strides or dilations must be 1. Got strides "+n+" and dilations '"+a+"'"),assert("NHWC"===o,"Error in conv2d: got dataFormat of "+o+" but only NHWC is currently supported.");var p,d=computeConv2DInfo(l.shape,u.shape,n,a,r,i);if(1!==d.filterHeight||1!==d.filterWidth||1!==d.dilationHeight||1!==d.dilationWidth||1!==d.strideHeight||1!==d.strideWidth||"SAME"!==d.padInfo.type&&"VALID"!==d.padInfo.type){p=ENV.engine.runKernel(function(e){return e.conv2d(l,u,d)},{x:l,$filter:u},function(e){return assert(tupleValuesAreOne(a),"Error in gradient of conv2D: dilation rates greater than 1 are notyet supported in gradients. Got dilations '"+a+"'"),{x:function(){return conv2dDerInput_(l.shape,e,u,n,r)},$filter:function(){return conv2dDerFilter_(l,e,u.shape,n,r)}}})}else{var h=l.reshape([-1,d.inChannels]),f=u.reshape([d.inChannels,d.outChannels]);p=matMul(h,f).reshape(d.outShape)}return c?p.as3D(p.shape[1],p.shape[2],p.shape[3]):p}function conv2dDerInput_(e,t,n,r,o,a){assert(e.length===t.rank,"Length of inShape ("+e.length+") and rank of dy ("+t.rank+") must match");var i=e,s=t,u=!1;3===t.rank&&(u=!0,s=t.as4D(1,t.shape[0],t.shape[1],t.shape[2]),i=[1,e[0],e[1],e[2]]);var l=i[3],c=s.shape[3];assert(4===i.length,"Error in conv2dDerInput: inShape must be length 4, but got length "+i.length+"."),assert(4===s.rank,"Error in conv2dDerInput: dy must be rank 4, but got rank "+s.rank),assert(4===n.rank,"Error in conv2dDerInput: filter must be rank 4, but got rank "+n.rank),assert(l===n.shape[2],"Error in conv2dDerInput: depth of input ("+l+") must match input depth for filter "+n.shape[2]+"."),assert(c===n.shape[3],"Error in conv2dDerInput: depth of output ("+c+") must match output depth for filter "+n.shape[3]+"."),null!=a&&assert(isInt(o),"Error in conv2dDerInput: pad must be an integer when using, dimRoundingMode "+a+" but got pad "+o+".");var p=computeConv2DInfo(i,n.shape,r,1,o,a),d=ENV.engine.runKernel(function(e){return e.conv2dDerInput(s,n,p)},{dy4D:s});return u?d.as3D(d.shape[1],d.shape[2],d.shape[3]):d}function conv2dDerFilter_(e,t,n,r,o,a){var i=e;3===e.rank&&(i=e.as4D(1,e.shape[0],e.shape[1],e.shape[2]));var s=t;3===s.rank&&(s=t.as4D(1,t.shape[0],t.shape[1],t.shape[2])),assert(4===i.rank,"Error in conv2dDerFilter: input must be rank 4, but got shape "+i.shape+"."),assert(4===s.rank,"Error in conv2dDerFilter: dy must be rank 4, but got shape "+s.shape+"."),assert(4===n.length,"Error in conv2dDerFilter: filterShape must be length 4, but got "+n+"."),assert(i.shape[3]===n[2],"Error in conv2dDerFilter: depth of input "+i.shape[3]+") must match input depth in filter ("+n[2]+"."),assert(s.shape[3]===n[3],"Error in conv2dDerFilter: depth of dy ("+s.shape[3]+") must match output depth for filter ("+n[3]+")."),null!=a&&assert(isInt(o),"Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode "+a+" but got pad "+o+".");var u=computeConv2DInfo(i.shape,n,r,1,o,a);return ENV.engine.runKernel(function(e){return e.conv2dDerFilter(i,s,u)},{x4D:i,dy4D:s})}function conv2dTranspose_(e,t,n,r,o,a){return conv2dDerInput_(n,convertToTensor(e,"x","conv2dTranspose"),convertToTensor(t,"filter","conv2dTranspose"),r,o,a)}function depthwiseConv2d_(e,t,n,r,o,a,i){void 0===o&&(o="NHWC"),void 0===a&&(a=[1,1]);var s=convertToTensor(e,"x","depthwiseConv2d"),u=convertToTensor(t,"filter","depthwiseConv2d"),l=s,c=!1;3===s.rank&&(c=!0,l=s.as4D(1,s.shape[0],s.shape[1],s.shape[2])),assert(4===l.rank,"Error in depthwiseConv2d: input must be rank 4, but got rank "+l.rank+"."),assert(4===u.rank,"Error in depthwiseConv2d: filter must be rank 4, but got rank "+u.rank+"."),assert(l.shape[3]===u.shape[2],"Error in depthwiseConv2d: number of input channels ("+l.shape[3]+") must match the inChannels dimension in filter "+u.shape[2]+"."),null==a&&(a=[1,1]),assert(eitherStridesOrDilationsAreOne(n,a),"Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides "+n+" and dilations '"+a+"'"),null!=i&&assert(isInt(r),"Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode "+i+" but got pad "+r+".");var p=computeConv2DInfo(l.shape,u.shape,n,a,r,i,!0),d=ENV.engine.runKernel(function(e){return e.depthwiseConv2D(l,u,p)},{x:l,$filter:u},function(e){return assert(tupleValuesAreOne(a),"Error in gradient of depthwiseConv2d: dilation rates greater than 1 are not yet supported. Got dilations '"+a+"'"),{x:function(){return depthwiseConv2dDerInput(l.shape,e,u,p)},$filter:function(){return depthwiseConv2dDerFilter(l,e,u.shape,p)}}});return c?d.as3D(d.shape[1],d.shape[2],d.shape[3]):d}function separableConv2d_(e,t,n,r,o,a,i){void 0===a&&(a=[1,1]),void 0===i&&(i="NHWC");var s=convertToTensor(e,"x","separableConv2d"),u=convertToTensor(t,"depthwiseFilter","separableConv2d"),l=convertToTensor(n,"pointwiseFilter","separableConv2d"),c=s,p=!1;if(3===s.rank&&(p=!0,c=s.as4D(1,s.shape[0],s.shape[1],s.shape[2])),"NCHW"===i)throw new Error("separableConv2d currently does not support dataFormat NCHW; only NHWC is supported");assert(4===c.rank,"Error in separableConv2d: input must be rank 4, but got rank "+c.rank+"."),assert(4===u.rank,"Error in separableConv2d: depthwise filter must be rank 4, but got rank "+u.rank+"."),assert(4===l.rank,"Error in separableConv2d: pointwise filter must be rank 4, but got rank "+u.rank+"."),assert(1===l.shape[0],"Error in separableConv2d: the first dimension of pointwise filter must be 1, but got "+l.shape[0]+"."),assert(1===l.shape[1],"Error in separableConv2d: the second dimension of pointwise filter must be 1, but got "+l.shape[1]+".");var d=u.shape[2],h=u.shape[3];assert(l.shape[2]===d*h,"Error in separableConv2d: the third dimension of pointwise filter must be "+d*h+", but got "+l.shape[2]+".");var f=depthwiseConv2d(c,u,r,o,i,a),m=conv2d(f,l,1,"valid",i);return p?m.as3D(m.shape[1],m.shape[2],m.shape[3]):m}function parseTupleParam$1(e){return"number"==typeof e?[e,e]:e}function tupleValuesAreOne(e){var t=parseTupleParam$1(e),n=t[0],r=t[1];return 1===n&&1===r}function eitherStridesOrDilationsAreOne(e,t){return tupleValuesAreOne(e)||tupleValuesAreOne(t)}function depthwiseConv2dDerInput(e,t,n,r){var o=t,a=!1;3===t.rank&&(a=!0,o=t.as4D(1,t.shape[0],t.shape[1],t.shape[2]));var i=ENV.engine.runKernel(function(e){return e.depthwiseConv2DDerInput(o,n,r)},{dy4D:o});return a?i.as3D(i.shape[1],i.shape[2],i.shape[3]):i}function depthwiseConv2dDerFilter(e,t,n,r){var o=e;3===e.rank&&(o=e.as4D(1,e.shape[0],e.shape[1],e.shape[2]));var a=t;return 3===a.rank&&(a=t.as4D(1,t.shape[0],t.shape[1],t.shape[2])),ENV.engine.runKernel(function(e){return e.depthwiseConv2DDerFilter(o,a,r)},{x4D:o,dy4D:a})}var conv1d=op({conv1d_:conv1d_}),conv2d=op({conv2d_:conv2d_}),depthwiseConv2d=op({depthwiseConv2d_:depthwiseConv2d_}),separableConv2d=op({separableConv2d_:separableConv2d_}),conv2dTranspose=op({conv2dTranspose_:conv2dTranspose_});function reverse1d_(e){var t=convertToTensor(e,"x","reverse");return assert(1===t.rank,"Error in reverse1D: x must be rank 1 but got\n rank "+t.rank+"."),reverse(t,0)}function reverse2d_(e,t){var n=convertToTensor(e,"x","reverse");return assert(2===n.rank,"Error in reverse2D: x must be rank 2 but got\n rank "+n.rank+"."),reverse(n,t)}function reverse3d_(e,t){var n=convertToTensor(e,"x","reverse");return assert(3===n.rank,"Error in reverse3D: x must be rank 3 but got\n rank "+n.rank+"."),reverse(n,t)}function reverse4d_(e,t){var n=convertToTensor(e,"x","reverse");return assert(4===n.rank,"Error in reverse4D: x must be rank 4 but got\n rank "+n.rank+"."),reverse(n,t)}function reverse_(e,t){var n=convertToTensor(e,"x","reverse");if(0===n.rank)return n.clone();var r=parseAxisParam(t,n.shape);return ENV.engine.runKernel(function(e){return e.reverse(n,r)},{$x:n},function(e){return{$x:function(){return e.reverse(r)}}}).reshapeAs(n)}var reverse=op({reverse_:reverse_}),reverse1d=op({reverse1d_:reverse1d_}),reverse2d=op({reverse2d_:reverse2d_}),reverse3d=op({reverse3d_:reverse3d_}),reverse4d=op({reverse4d_:reverse4d_});function maxPool_(e,t,n,r,o){var a=convertToTensor(e,"x","maxPool"),i=a,s=!1;3===a.rank&&(s=!0,i=a.as4D(1,a.shape[0],a.shape[1],a.shape[2])),assert(4===i.rank,"Error in maxPool: input must be rank 4 but got rank "+i.rank+"."),null!=o&&assert(isInt(r),"Error in maxPool: pad must be an integer when using, dimRoundingMode "+o+" but got pad "+r+".");var u=computePool2DInfo(i.shape,t,n,r,o),l=ENV.engine.runKernel(function(e,t){return t(e.maxPool(i,u))},{x:i},function(e,o){var a=o[0];return{x:function(){return maxPoolBackprop(e,i,a,t,n,r)}}});return s?l.as3D(l.shape[1],l.shape[2],l.shape[3]):l}function avgPool_(e,t,n,r,o){var a=convertToTensor(e,"x","avgPool");assert("float32"===a.dtype,"The input dtype to avgPool must be float32");var i=a,s=!1;3===a.rank&&(s=!0,i=a.as4D(1,a.shape[0],a.shape[1],a.shape[2])),assert(4===i.rank,"Error in avgPool: x must be rank 4 but got rank "+i.rank+"."),null!=o&&assert(isInt(r),"Error in avgPool: pad must be an integer when using, dimRoundingMode "+o+" but got pad "+r+".");var u=computePool2DInfo(i.shape,t,n,r),l=ENV.engine.runKernel(function(e){return e.avgPool(i,u)},{x:i},function(e){return{x:function(){return avgPoolBackprop(e,i,t,n,r)}}});return l=l.cast(a.dtype),s?l.as3D(l.shape[1],l.shape[2],l.shape[3]):l}function maxPoolBackprop(e,t,n,r,o,a,i){var s=convertToTensor(e,"dy","maxPoolBackprop"),u=convertToTensor(t,"input","maxPoolBackprop"),l=convertToTensor(n,"output","maxPoolBackprop");assert(u.rank===s.rank,"Rank of input ("+u.rank+") does not match rank of dy ("+s.rank+")"),assert(4===s.rank,"Error in maxPoolBackprop: dy must be rank 4 but got rank "+s.rank+"."),assert(4===u.rank,"Error in maxPoolBackprop: input must be rank 4 but got rank "+u.rank+"."),null!=i&&assert(isInt(a),"Error in maxPoolBackprop: pad must be an integer when using, dimRoundingMode "+i+" but got pad "+a+".");var c=computePool2DInfo(u.shape,r,o,a,i);return ENV.engine.runKernel(function(e){return e.maxPoolBackprop(s,u,l,c)},{$dy:s,$input:u})}function avgPoolBackprop(e,t,n,r,o){var a=convertToTensor(e,"dy","avgPoolBackprop"),i=convertToTensor(t,"input","avgPoolBackprop");assert(i.rank===a.rank,"Rank of input ("+i.rank+") does not match rank of dy ("+a.rank+")");var s=i,u=a,l=!1;3===i.rank&&(l=!0,s=i.as4D(1,i.shape[0],i.shape[1],i.shape[2]),u=a.as4D(1,a.shape[0],a.shape[1],a.shape[2])),assert(4===u.rank,"Error in avgPoolBackprop: dy must be rank 4 but got rank "+u.rank+"."),assert(4===s.rank,"Error in avgPoolBackprop: input must be rank 4 but got rank "+s.rank+".");var c=computePool2DInfo(s.shape,n,r,o),p=ENV.engine.runKernel(function(e){return e.avgPoolBackprop(u,s,c)},{dy4D:u,input4D:s});return l?p.as3D(p.shape[1],p.shape[2],p.shape[3]):p}var maxPool=op({maxPool_:maxPool_}),avgPool=op({avgPool_:avgPool_});function slice1d_(e,t,n){var r=convertToTensor(e,"x","slice1d");return assert(1===r.rank,"slice1d expects a rank-1 tensor, but got a rank-"+r.rank+" tensor"),slice(r,[t],[n])}function slice2d_(e,t,n){var r=convertToTensor(e,"x","slice2d");return assert(2===r.rank,"slice2d expects a rank-2 tensor, but got a rank-"+r.rank+" tensor"),slice(r,t,n)}function slice3d_(e,t,n){var r=convertToTensor(e,"x","slice3d");return assert(3===r.rank,"slice3d expects a rank-3 tensor, but got a rank-"+r.rank+" tensor"),slice(r,t,n)}function slice4d_(e,t,n){var r=convertToTensor(e,"x","slice4d");return assert(4===r.rank,"slice4d expects a rank-4 tensor, but got a rank-"+r.rank+" tensor"),slice(r,t,n)}function slice_(e,t,n){var r,o,a=convertToTensor(e,"x","slice");if(0===a.rank)throw new Error("Slicing scalar is not possible");r="number"==typeof t?[t].concat(new Array(a.rank-1).fill(0)):t.length=0?e:(assert(-1===e,"Bad value in size"),a.shape[t]-r[t])}),assertParamsValid(a,r,o);var i=a.shape;return ENV.engine.runKernel(function(e){return e.slice(a,r,o)},{$x:a},function(e){for(var t=[],n=0;n0&&(t=t.sum(r)),t.reshape(n.shape)},$b:function(){var t=e,n=getReductionAxes(r.shape,o);return n.length>0&&(t=t.sum(n)),t.reshape(r.shape)}}})}function addN_(e){assert(Array.isArray(e),function(){return"The argument passed to tf.addN() must be a list of tensors"}),assert(e.length>=1,function(){return"Must pass at least one tensor to tf.addN(), but got "+e.length});var t=e.map(function(e,t){return convertToTensor(e,"tensors"+t,"addN")}),n=t[0];t.forEach(function(e){if(e.dtype!==n.dtype)throw new Error("All tensors passed to tf.addN() must have the same dtype")}),t.forEach(function(e){if(!arraysEqual(e.shape,n.shape))throw new Error("All tensors passed to tf.addN() must have the same shape")});var r=t;return ENV.engine.runKernel(function(e){return e.addN(t)},r,function(e){var n={};return t.forEach(function(t,r){n[r]=function(){return e.clone()}}),n})}function addStrict_(e,t){return assertShapesMatch(e.shape,t.shape,"Error in addStrict: "),e.add(t)}function sub_(e,t){var n=convertToTensor(e,"a","sub"),r=convertToTensor(t,"b","sub");assertTypesMatch(n,r);var o=assertAndGetBroadcastShape(n.shape,r.shape);return ENV.engine.runKernel(function(e){return e.subtract(n,r)},{$a:n,$b:r},function(e){return{$a:function(){var t=e,r=getReductionAxes(n.shape,o);return r.length>0&&(t=t.sum(r)),t.reshape(n.shape)},$b:function(){var t=e,n=getReductionAxes(r.shape,o);return n.length>0&&(t=t.sum(n)),t.neg().reshape(r.shape)}}})}function subStrict_(e,t){return assertShapesMatch(e.shape,t.shape,"Error in subStrict: "),e.sub(t)}function pow_(e,t){var n=convertToTensor(e,"base","pow"),r=convertToTensor(t,"exp","pow"),o=assertAndGetBroadcastShape(n.shape,r.shape);e=n.cast(upcastType(n.dtype,r.dtype)),t=r.cast(upcastType(n.dtype,r.dtype));return ENV.engine.runKernel(function(e,t){return t(e.pow(n,r))},{$base:n,$exp:r},function(e,t){var a=t[0];return{$base:function(){var t=e.mul(r.toFloat().mul(a.div(n))),i=getReductionAxes(n.shape,o);return i.length>0&&(t=t.sum(i)),t.reshape(n.shape)},$exp:function(){var t=e.mul(a.mul(n.log()).toFloat()),i=getReductionAxes(r.shape,o);return i.length>0&&(t=t.sum(i)),t.reshape(r.shape)}}})}function powStrict_(e,t){return assertShapesMatch(e.shape,t.shape,"Error in powStrict: "),e.pow(t)}function mul_(e,t){var n=convertToTensor(e,"a","mul"),r=convertToTensor(t,"b","mul");assertTypesMatch(n,r);var o=assertAndGetBroadcastShape(n.shape,r.shape);return ENV.engine.runKernel(function(e){return e.multiply(n,r)},{$a:n,$b:r},function(e){return{$a:function(){var t=e.mul(r.toFloat()),a=getReductionAxes(n.shape,o);return a.length>0?t.sum(a).reshape(n.shape):t},$b:function(){var t=e.mul(n.toFloat()),a=getReductionAxes(r.shape,o);return a.length>0?t.sum(a).reshape(r.shape):t}}})}function mulStrict_(e,t){return assertShapesMatch(e.shape,t.shape,"Error in multiplyStrict: "),e.mul(t)}function div_(e,t){var n,r=convertToTensor(e,"a","div"),o=convertToTensor(t,"b","div");if(assertTypesMatch(r,o),"int32"===r.dtype&&"int32"===o.dtype)return floorDiv(r,o);n=function(e){return e.realDivide(r,o)};var a=assertAndGetBroadcastShape(r.shape,o.shape);return ENV.engine.runKernel(n,{$a:r,$b:o},function(e){return{$a:function(){var t=e.div(o.toFloat()),n=getReductionAxes(r.shape,a);return n.length>0?t.sum(n).reshape(r.shape):t},$b:function(){var t=e.mul(r.toFloat()),n=getReductionAxes(o.shape,a);n.length>0&&(t=t.sum(n).reshape(o.shape));var i=o.square();return t.div(i.toFloat()).neg()}}})}function floorDiv_(e,t){var n=convertToTensor(e,"a","floorDiv"),r=convertToTensor(t,"b","floorDiv");assertTypesMatch(n,r);var o=assertAndGetBroadcastShape(n.shape,r.shape);return ENV.engine.runKernel(function(e){return e.floorDiv(n,r)},{$a:n,$b:r},function(e){return{$a:function(){var t=e.div(r.toFloat()),a=getReductionAxes(n.shape,o);return a.length>0?t.sum(a).reshape(n.shape):t},$b:function(){var t=e.mul(n.toFloat()),a=getReductionAxes(r.shape,o);a.length>0&&(t=t.sum(a).reshape(r.shape));var i=r.square();return t.div(i.toFloat()).neg()}}})}function divStrict_(e,t){return assertShapesMatch(e.shape,t.shape,"Error in divideStrict: "),e.div(t)}function mod_(e,t){var n=convertToTensor(e,"a","mod"),r=convertToTensor(t,"b","mod");assertTypesMatch(n,r);var o=assertAndGetBroadcastShape(n.shape,r.shape);return ENV.engine.runKernel(function(e){return e.mod(n,r)},{$a:n,$b:r},function(e){return{$a:function(){var t=getReductionAxes(n.shape,o);return t.length>0?e.sum(t).reshape(n.shape):e},$b:function(){var t=e.mul(n.div(r).floor().neg()),a=getReductionAxes(r.shape,o);return a.length>0?t.sum(a).reshape(r.shape):t}}})}function modStrict_(e,t){return assertShapesMatch(e.shape,t.shape,"Error in modStrict: "),e.mod(t)}function minimum_(e,t){var n=convertToTensor(e,"a","minimum"),r=convertToTensor(t,"b","minimum");assertTypesMatch(n,r),"bool"===n.dtype&&(n=n.toInt()),"bool"===r.dtype&&(r=r.toInt()),assertAndGetBroadcastShape(n.shape,r.shape);return ENV.engine.runKernel(function(e){return e.minimum(n,r)},{$a:n,$b:r},function(e){return{$a:function(){return e.mul(n.lessEqual(r).toFloat())},$b:function(){return e.mul(n.greater(r).toFloat())}}})}function minimumStrict_(e,t){return assertShapesMatch(e.shape,t.shape,"Error in minimumStrict: "),e.minimum(t)}function maximum_(e,t){var n=convertToTensor(e,"a","maximum"),r=convertToTensor(t,"b","maximum");assertTypesMatch(n,r),"bool"===n.dtype&&(n=n.toInt()),"bool"===r.dtype&&(r=r.toInt()),assertAndGetBroadcastShape(n.shape,r.shape);return ENV.engine.runKernel(function(e){return e.maximum(n,r)},{$a:n,$b:r},function(e){return{$a:function(){return e.mul(n.greaterEqual(r).toFloat())},$b:function(){return e.mul(n.less(r).toFloat())}}})}function maximumStrict_(e,t){return assertShapesMatch(e.shape,t.shape,"Error in maximumStrict: "),e.maximum(t)}function squaredDifference_(e,t){var n=convertToTensor(e,"a","squaredDifference"),r=convertToTensor(t,"b","squaredDifference");assertTypesMatch(n,r),assertAndGetBroadcastShape(n.shape,r.shape);return ENV.engine.runKernel(function(e){return e.squaredDifference(n,r)},{$a:n,$b:r},function(e){var t=scalar(2);return{$a:function(){return e.mul(n.sub(r).mul(t))},$b:function(){return e.mul(r.sub(n).mul(t))}}})}function squaredDifferenceStrict_(e,t){return assertShapesMatch(e.shape,t.shape,"Error in squaredDifferenceStrict: "),e.squaredDifference(t)}function atan2_(e,t){var n=convertToTensor(e,"a","atan2"),r=convertToTensor(t,"b","atan2");assertTypesMatch(n,r);var o=assertAndGetBroadcastShape(n.shape,r.shape);return ENV.engine.runKernel(function(e){return e.atan2(n,r)},{$a:n,$b:r},function(e){return{$a:function(){var t=add(n.square(),r.square()),a=e.mul(r.div(t)),i=getReductionAxes(n.shape,o);return i.length>0&&(a=a.sum(i)),a.reshape(n.shape)},$b:function(){var t=add(n.square(),r.square()),a=neg(e.mul(n.div(t))),i=getReductionAxes(r.shape,o);return i.length>0&&(a=a.sum(i)),a.reshape(r.shape)}}})}var add=op({add_:add_}),addN=op({addN_:addN_}),addStrict=op({addStrict_:addStrict_}),atan2=op({atan2_:atan2_}),div=op({div_:div_}),divStrict=op({divStrict_:divStrict_}),floorDiv=op({floorDiv_:floorDiv_}),maximum=op({maximum_:maximum_}),maximumStrict=op({maximumStrict_:maximumStrict_}),minimum=op({minimum_:minimum_}),minimumStrict=op({minimumStrict_:minimumStrict_}),mod=op({mod_:mod_}),modStrict=op({modStrict_:modStrict_}),mul=op({mul_:mul_}),mulStrict=op({mulStrict_:mulStrict_}),pow=op({pow_:pow_}),powStrict=op({powStrict_:powStrict_}),squaredDifference=op({squaredDifference_:squaredDifference_}),squaredDifferenceStrict=op({squaredDifferenceStrict_:squaredDifferenceStrict_}),sub=op({sub_:sub_}),subStrict=op({subStrict_:subStrict_});function logicalNot_(e){var t=convertToTensor(e,"x","logicalNot","bool");return assert("bool"===t.dtype,"Error Array must be of type bool."),ENV.engine.runKernel(function(e){return e.logicalNot(t)},{$x:t})}function logicalAnd_(e,t){var n=convertToTensor(e,"a","logicalAnd","bool"),r=convertToTensor(t,"b","logicalAnd","bool");return assert("bool"===n.dtype&&"bool"===r.dtype,"Error Array must be of type bool."),assertAndGetBroadcastShape(n.shape,r.shape),ENV.engine.runKernel(function(e){return e.logicalAnd(n,r)},{$a:n,$b:r})}function logicalOr_(e,t){var n=convertToTensor(e,"a","logicalOr","bool"),r=convertToTensor(t,"b","logicalOr","bool");return assert("bool"===n.dtype&&"bool"===r.dtype,"Error Array must be of type bool."),assertAndGetBroadcastShape(n.shape,r.shape),ENV.engine.runKernel(function(e){return e.logicalOr(n,r)},{$a:n,$b:r})}function logicalXor_(e,t){var n=convertToTensor(e,"a","logicalXor","bool"),r=convertToTensor(t,"b","logicalXor","bool");return assert("bool"===n.dtype&&"bool"===r.dtype,"Error Array must be of type bool."),assertAndGetBroadcastShape(n.shape,r.shape),logicalOr(e,t).logicalAnd(logicalAnd(e,t).logicalNot())}function where_(e,t,n){var r=convertToTensor(t,"a","where"),o=convertToTensor(n,"b","where"),a=convertToTensor(e,"condition","where","bool");assert("bool"===a.dtype,"Error Condition must be of type bool."),assertShapesMatch(r.shape,o.shape,"Error in where: "),1===a.rank?assert(a.shape[0]===r.shape[0],"The first dimension of `a` must match the size of `condition`."):assertShapesMatch(a.shape,o.shape,"Error in where: ");return ENV.engine.runKernel(function(e){return e.select(a,r,o)},{$condition:a,$a:r,$b:o},function(e){return{$condition:function(){return zerosLike(a)},$a:function(){return e.mul(a.cast(r.dtype))},$b:function(){return e.mul(a.logicalNot().cast(o.dtype))}}})}function whereAsync_(e){return __awaiter(this,void 0,void 0,function(){var t,n,r;return __generator(this,function(o){switch(o.label){case 0:return assert("bool"===(t=convertToTensor(e,"condition","where","bool")).dtype,"Condition must be of type bool."),[4,t.data()];case 1:return n=o.sent(),r=whereImpl(t.shape,n),e!==t&&t.dispose(),[2,r]}})})}var logicalAnd=op({logicalAnd_:logicalAnd_}),logicalNot=op({logicalNot_:logicalNot_}),logicalOr=op({logicalOr_:logicalOr_}),logicalXor=op({logicalXor_:logicalXor_}),where=op({where_:where_}),whereAsync=whereAsync_;function relu_(e){var t=convertToTensor(e,"x","relu");if("bool"===t.dtype)return t.toInt();return ENV.engine.runKernel(function(e){return e.relu(t)},{$x:t},function(e){var n=t.step();return{$x:function(){return e.mulStrict(n.toFloat())}}})}function elu_(e){var t=convertToTensor(e,"x","elu");return ENV.engine.runKernel(function(e,n){return n(e.elu(t))},{$x:t},function(e,t){var n=t[0];return{$x:function(){return ENV.engine.runKernel(function(t){return t.eluDer(e,n)},{dy:e,y:n})}}})}function selu_(e){var t=convertToTensor(e,"x","selu");return ENV.engine.runKernel(function(e){return e.selu(t)},{$x:t},function(e){return{$x:function(){var n=t.greater(scalar(0)),r=scalar(SELU_SCALEALPHA),o=scalar(SELU_SCALE),a=e.mul(o),i=e.mul(r).mul(t.toFloat().exp());return where(n,a,i)}}})}function leakyRelu_(e,t){void 0===t&&(t=.2);var n=convertToTensor(e,"x","leakyRelu");return maximum(scalar(t).mul(n),n)}function prelu_(e,t){var n=convertToTensor(e,"x","prelu"),r=convertToTensor(t,"alpha","prelu"),o=scalar(0);return maximum(o,n).add(r.mul(minimum(o,n)))}var elu=op({elu_:elu_}),leakyRelu=op({leakyRelu_:leakyRelu_}),prelu=op({prelu_:prelu_}),relu=op({relu_:relu_}),selu=op({selu_:selu_});function transpose_(e,t){var n=convertToTensor(e,"x","transpose");if(null==t&&(t=n.shape.map(function(e,t){return t}).reverse()),assert(n.rank===t.length,"Error in transpose: rank of input "+n.rank+" must match length of perm "+t+"."),t.forEach(function(e){assert(e>=0&&eo)throw new Error("'k' passed to topk() must be <= the last dimension ("+o+") but got "+t);var a=ENV.engine.runKernel(function(e){return e.topk(r,t,n)},{$x:r});return{values:a[0],indices:a[1]}}var topk=op({topk_:topk_});function scatterND_(e,t,n){var r=convertToTensor(e,"indices","scatterND","int32"),o=convertToTensor(t,"updates","scatterND");return ENV.engine.runKernel(function(e){return e.scatterND(r,o,n)},{$indices:r,$updates:o})}var scatterND=op({scatterND_:scatterND_});function fft_(e){return assert("complex64"===e.dtype,"dtype must be complex64"),assert(1===e.rank,"input rank must be 1"),ENV.engine.runKernel(function(t){return t.fft(e)},{input:e})}var fft=op({fft_:fft_}),spectral_ops=Object.freeze({fft:fft});function gatherND_(e,t){var n=convertToTensor(t,"indices","gatherND","int32"),r=convertToTensor(e,"x","gatherND");return ENV.engine.runKernel(function(e){return e.gatherND(r,n)},{$x:r,$indices:n})}var Reduction,gatherND=op({gatherND_:gatherND_});function computeWeightedLoss_(e,t,n){void 0===n&&(n=Reduction.SUM_BY_NONZERO_WEIGHTS);var r=convertToTensor(e,"losses","computeWeightedLoss"),o=null;null!=t&&(o=convertToTensor(t,"weights","computeWeightedLoss"));var a=null==o?r:r.mul(o);if(n===Reduction.NONE)return a;if(n===Reduction.SUM)return a.sum();if(n===Reduction.MEAN){if(null==o)return a.mean();var i=sizeFromShape(r.shape)/sizeFromShape(o.shape),s=a.sum().div(o.sum());return i>1?s.div(scalar(i)):s}if(n===Reduction.SUM_BY_NONZERO_WEIGHTS){if(null==o)return a.sum().div(scalar(r.size));var u=o.mul(ones$1(r.shape)).notEqual(scalar(0)).sum().toFloat();return a.sum().div(u)}throw Error("Unknown reduction: "+n)}function absoluteDifference_(e,t,n,r){void 0===r&&(r=Reduction.SUM_BY_NONZERO_WEIGHTS);var o=convertToTensor(e,"labels","absoluteDifference"),a=convertToTensor(t,"predictions","absoluteDifference"),i=null;null!=n&&(i=convertToTensor(n,"weights","absoluteDifference")),assertShapesMatch(o.shape,a.shape,"Error in absoluteDifference: ");var s=o.sub(a).abs();return computeWeightedLoss(s,i,r)}function meanSquaredError_(e,t,n,r){void 0===r&&(r=Reduction.SUM_BY_NONZERO_WEIGHTS);var o=convertToTensor(e,"labels","meanSquaredError"),a=convertToTensor(t,"predictions","meanSquaredError"),i=null;null!=n&&(i=convertToTensor(n,"weights","meanSquaredError")),assertShapesMatch(o.shape,a.shape,"Error in meanSquaredError: ");var s=o.squaredDifference(a);return computeWeightedLoss(s,i,r)}function cosineDistance_(e,t,n,r,o){void 0===o&&(o=Reduction.SUM_BY_NONZERO_WEIGHTS);var a=convertToTensor(e,"labels","cosineDistance"),i=convertToTensor(t,"predictions","cosineDistance"),s=null;null!=r&&(s=convertToTensor(r,"weights","cosineDistance")),assertShapesMatch(a.shape,i.shape,"Error in cosineDistance: ");var u=scalar(1).sub(a.mul(i).sum(n,!0));return computeWeightedLoss(u,s,o)}function hingeLoss_(e,t,n,r){void 0===r&&(r=Reduction.SUM_BY_NONZERO_WEIGHTS);var o=convertToTensor(e,"labels","hingeLoss"),a=convertToTensor(t,"predictions","hingeLoss"),i=null;null!=n&&(i=convertToTensor(n,"weights","hingeLoss")),assertShapesMatch(o.shape,a.shape,"Error in hingeLoss: ");var s=scalar(1);o=scalar(2).mul(o).sub(s);var u=s.sub(o.mul(a)).relu();return computeWeightedLoss(u,i,r)}function logLoss_(e,t,n,r,o){void 0===r&&(r=1e-7),void 0===o&&(o=Reduction.SUM_BY_NONZERO_WEIGHTS);var a=convertToTensor(e,"labels","logLoss"),i=convertToTensor(t,"predictions","logLoss"),s=null;null!=n&&(s=convertToTensor(n,"weights","logLoss")),assertShapesMatch(a.shape,i.shape,"Error in logLoss: ");var u=scalar(1),l=scalar(r),c=a.mul(i.add(l).log()).neg().sub(u.sub(a).mul(u.sub(i).add(l).log()));return computeWeightedLoss(c,s,o)}function sigmoidCrossEntropyWithLogits_(e,t){var n=convertToTensor(e,"labels","sigmoidCrossEntropyWithLogits"),r=convertToTensor(t,"logits","sigmoidCrossEntropyWithLogits");assertShapesMatch(n.shape,r.shape,"Error in sigmoidCrossEntropyWithLogits: ");var o=r.relu(),a=r.mul(n),i=r.abs().neg().exp().log1p();return o.sub(a).add(i)}function sigmoidCrossEntropy_(e,t,n,r,o){void 0===r&&(r=0),void 0===o&&(o=Reduction.SUM_BY_NONZERO_WEIGHTS);var a=convertToTensor(e,"multiClassLabels","sigmoidCrossEntropy"),i=convertToTensor(t,"logits","sigmoidCrossEntropy"),s=null;if(null!=n&&(s=convertToTensor(n,"weights","sigmoidCrossEntropy")),assertShapesMatch(a.shape,i.shape,"Error in sigmoidCrossEntropy: "),r>0){var u=scalar(r),l=scalar(1),c=scalar(.5);a=a.mul(l.sub(u)).add(c.mul(u))}var p=sigmoidCrossEntropyWithLogits_(a,i);return computeWeightedLoss(p,s,o)}function huberLoss_(e,t,n,r,o){void 0===r&&(r=1),void 0===o&&(o=Reduction.SUM_BY_NONZERO_WEIGHTS);var a=convertToTensor(e,"labels","huberLoss"),i=convertToTensor(t,"predictions","huberLoss"),s=null;null!=n&&(s=convertToTensor(n,"weights","huberLoss")),assertShapesMatch(a.shape,i.shape,"Error in huberLoss: ");var u=scalar(r),l=i.sub(a).abs(),c=minimum(l,u),p=l.sub(c),d=scalar(.5).mul(c.square()).add(u.mul(p));return computeWeightedLoss(d,s,o)}function softmaxCrossEntropyWithLogits_(e,t,n){if(void 0===n&&(n=-1),-1===n&&(n=t.rank-1),n!==t.rank-1)throw Error("Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank "+t.rank+" and dim was "+n);return customGrad(function(e,t){var r=t.logSumExp([n],!0),o=t.toFloat().sub(r);return{value:o.mul(e).neg().sum([n]),gradFunc:function(t){var r=expandShapeToKeepDim(t.shape,[n]);return[t.reshape(r).mul(e.toFloat().sub(o.exp())),t.reshape(r).mul(o.exp().sub(e.toFloat()))]}}})(e,t)}function softmaxCrossEntropy_(e,t,n,r,o){void 0===r&&(r=0),void 0===o&&(o=Reduction.SUM_BY_NONZERO_WEIGHTS);var a=convertToTensor(e,"onehotLabels","softmaxCrossEntropy"),i=convertToTensor(t,"logits","softmaxCrossEntropy"),s=null;if(null!=n&&(s=convertToTensor(n,"weights","softmaxCrossEntropy")),assertShapesMatch(a.shape,i.shape,"Error in softmaxCrossEntropy: "),r>0){var u=scalar(r),l=scalar(1),c=scalar(a.shape[1]);a=a.mul(l.sub(u)).add(u.div(c))}var p=softmaxCrossEntropyWithLogits_(a,i);return computeWeightedLoss(p,s,o)}!function(e){e[e.NONE=0]="NONE",e[e.MEAN=1]="MEAN",e[e.SUM=2]="SUM",e[e.SUM_BY_NONZERO_WEIGHTS=3]="SUM_BY_NONZERO_WEIGHTS"}(Reduction||(Reduction={}));var absoluteDifference=op({absoluteDifference_:absoluteDifference_}),computeWeightedLoss=op({computeWeightedLoss_:computeWeightedLoss_}),cosineDistance=op({cosineDistance_:cosineDistance_}),hingeLoss=op({hingeLoss_:hingeLoss_}),huberLoss=op({huberLoss_:huberLoss_}),logLoss=op({logLoss_:logLoss_}),meanSquaredError=op({meanSquaredError_:meanSquaredError_}),sigmoidCrossEntropy=op({sigmoidCrossEntropy_:sigmoidCrossEntropy_}),softmaxCrossEntropy=op({softmaxCrossEntropy_:softmaxCrossEntropy_}),loss_ops=Object.freeze({get Reduction(){return Reduction},absoluteDifference:absoluteDifference,computeWeightedLoss:computeWeightedLoss,cosineDistance:cosineDistance,hingeLoss:hingeLoss,huberLoss:huberLoss,logLoss:logLoss,meanSquaredError:meanSquaredError,sigmoidCrossEntropy:sigmoidCrossEntropy,softmaxCrossEntropy:softmaxCrossEntropy});function gramSchmidt_(e){var t;if(Array.isArray(e)){t=!1,assert(null!=e&&e.length>0,"Gram-Schmidt process: input must not be null, undefined, or empty");for(var n=e[0].shape[0],r=1;r0)for(var n=0;n= 2, but got rank "+e.rank);if(2===e.rank)return qr2d(e,t);var n=e.shape.slice(0,e.shape.length-2).reduce(function(e,t){return e*t}),r=[],o=[];return unstack(e.reshape([n,e.shape[e.shape.length-2],e.shape[e.shape.length-1]]),0).forEach(function(e){var n=qr2d(e,t),a=n[0],i=n[1];r.push(a),o.push(i)}),[stack(r,0).reshape(e.shape),stack(o,0).reshape(e.shape)]}function qr2d(e,t){return void 0===t&&(t=!1),ENV.engine.tidy(function(){if(2!==e.shape.length)throw new Error("qr2d() requires a 2D Tensor, but got a "+e.shape.length+"D Tensor.");for(var n=e.shape[0],r=e.shape[1],o=eye(n),a=e.clone(),i=tensor2d([[1]],[1,1]),s=i.clone(),u=n>=r?r:n,l=function(e){var t,u=a,l=s,c=o;t=ENV.engine.tidy(function(){var t=a.slice([e,e],[n-e,1]),u=t.norm(),l=a.slice([e,e],[1,1]),c=l.sign().neg(),p=l.sub(c.mul(u)),d=t.div(p);s=1===d.shape[0]?i.clone():i.concat(d.slice([1,0],[d.shape[0]-1,d.shape[1]]),0);var h=c.matMul(p).div(u).neg(),f=a.slice([e,0],[n-e,r]),m=h.mul(s);a=0===e?f.sub(m.matMul(s.transpose().matMul(f))):a.slice([0,0],[e,r]).concat(f.sub(m.matMul(s.transpose().matMul(f))),0);var g=o.slice([0,e],[n,o.shape[1]-e]);return o=0===e?g.sub(g.matMul(s).matMul(m.transpose())):o.slice([0,0],[n,e]).concat(g.sub(g.matMul(s).matMul(m.transpose())),1),[s,a,o]}),s=t[0],a=t[1],o=t[2],dispose([u,l,c])},c=0;cr&&(o=o.slice([0,0],[n,r]),a=a.slice([0,0],[r,r])),[o,a]})}var gramSchmidt=op({gramSchmidt_:gramSchmidt_}),qr=op({qr_:qr_}),linalg_ops=Object.freeze({gramSchmidt:gramSchmidt,qr:qr});function resizeBilinear_(e,t,n){void 0===n&&(n=!1);var r=convertToTensor(e,"images","resizeBilinear");assert(3===r.rank||4===r.rank,"Error in resizeBilinear: x must be rank 3 or 4, but got rank "+r.rank+"."),assert(2===t.length,"Error in resizeBilinear: new shape must 2D, but got shape "+t+".");var o=r,a=!1;3===r.rank&&(a=!0,o=r.as4D(1,r.shape[0],r.shape[1],r.shape[2]));var i=t[0],s=t[1],u=ENV.engine.runKernel(function(e,t){return e.resizeBilinear(o,i,s,n)},{batchImages:o},function(e,t){return{batchImages:function(){return ENV.engine.runKernel(function(t){return t.resizeBilinearBackprop(e,o,n)},{})}}});return a?u.as3D(u.shape[1],u.shape[2],u.shape[3]):u}function resizeNearestNeighbor_(e,t,n){void 0===n&&(n=!1);var r=convertToTensor(e,"images","resizeNearestNeighbor");assert(3===r.rank||4===r.rank,"Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank "+r.rank+"."),assert(2===t.length,"Error in resizeNearestNeighbor: new shape must 2D, but got shape "+t+"."),assert("float32"===r.dtype||"int32"===r.dtype,"`images` must have `int32` or `float32` as dtype");var o=r,a=!1;3===r.rank&&(a=!0,o=r.as4D(1,r.shape[0],r.shape[1],r.shape[2]));var i=t[0],s=t[1],u=ENV.engine.runKernel(function(e,t){return e.resizeNearestNeighbor(o,i,s,n)},{batchImages:o},function(e,t){return{batchImages:function(){return ENV.engine.runKernel(function(t){return t.resizeNearestNeighborBackprop(e,o,n)},{})}}});return a?u.as3D(u.shape[1],u.shape[2],u.shape[3]):u}function nonMaxSuppression_(e,t,n,r,o){void 0===r&&(r=.5),void 0===o&&(o=Number.NEGATIVE_INFINITY);var a=convertToTensor(e,"boxes","nonMaxSuppression"),i=convertToTensor(t,"scores","nonMaxSuppression"),s=nonMaxSuppSanityCheck(a,i,n,r,o);return n=s.maxOutputSize,r=s.iouThreshold,o=s.scoreThreshold,ENV.engine.runKernel(function(e){return e.nonMaxSuppression(a,i,n,r,o)},{$boxes:a})}function nonMaxSuppressionAsync_(e,t,n,r,o){return void 0===r&&(r=.5),void 0===o&&(o=Number.NEGATIVE_INFINITY),__awaiter(this,void 0,void 0,function(){var a,i,s,u,l,c;return __generator(this,function(p){switch(p.label){case 0:return a=convertToTensor(e,"boxes","nonMaxSuppressionAsync"),i=convertToTensor(t,"scores","nonMaxSuppressionAsync"),s=nonMaxSuppSanityCheck(a,i,n,r,o),n=s.maxOutputSize,r=s.iouThreshold,o=s.scoreThreshold,[4,a.data()];case 1:return u=p.sent(),[4,i.data()];case 2:return l=p.sent(),c=nonMaxSuppressionImpl(u,l,n,r,o),a!==e&&a.dispose(),i!==t&&i.dispose(),[2,c]}})})}function nonMaxSuppSanityCheck(e,t,n,r,o){null==r&&(r=.5),null==o&&(o=Number.NEGATIVE_INFINITY);var a=e.shape[0];return n=Math.min(n,a),assert(0<=r&&r<=1,"iouThreshold must be in [0, 1], but was '"+r+"'"),assert(2===e.rank,"boxes must be a 2D tensor, but was of rank '"+e.rank+"'"),assert(4===e.shape[1],"boxes must have 4 columns, but 2nd dimension was "+e.shape[1]),assert(1===t.rank,"scores must be a 1D tensor"),assert(t.shape[0]===a,"scores has incompatible shape with boxes. Expected "+a+", but was "+t.shape[0]),{maxOutputSize:n,iouThreshold:r,scoreThreshold:o}}function cropAndResize_(e,t,n,r,o,a){var i=convertToTensor(e,"image","cropAndResize","float32"),s=convertToTensor(t,"boxes","cropAndResize","float32"),u=convertToTensor(n,"boxInd","cropAndResize","int32");o=o||"bilinear",a=a||0;var l=s.shape[0];assert(4===i.rank,"Error in cropAndResize: image must be rank 4,but got rank "+i.rank+"."),assert(2===s.rank&&4===s.shape[1],"Error in cropAndResize: boxes must be have size ["+l+",4] but had shape "+s.shape+"."),assert(1===u.rank&&u.shape[0]===l,"Error in cropAndResize: boxInd must be have size ["+l+"] but had shape "+s.shape+"."),assert("int32"===u.dtype,"Error in cropAndResize: boxInd must be of dtype int32, but got dtype "+u.dtype+"."),assert(2===r.length,"Error in cropAndResize: cropSize must be of length 2, but got length "+r.length+"."),assert(r[0]>=1&&r[1]>=1,"cropSize must be atleast [1,1], but was "+r),assert("bilinear"===o||"nearest"===o,"method must be bilinear or nearest, but was "+o);return ENV.engine.runKernel(function(e,t){return e.cropAndResize(i,s,u,r,o,a)},{$image:i,$boxes:s})}var resizeBilinear=op({resizeBilinear_:resizeBilinear_}),resizeNearestNeighbor=op({resizeNearestNeighbor_:resizeNearestNeighbor_}),nonMaxSuppression=op({nonMaxSuppression_:nonMaxSuppression_}),nonMaxSuppressionAsync=nonMaxSuppressionAsync_,cropAndResize=cropAndResize_,image_ops=Object.freeze({resizeBilinear:resizeBilinear,resizeNearestNeighbor:resizeNearestNeighbor,nonMaxSuppression:nonMaxSuppression,nonMaxSuppressionAsync:nonMaxSuppressionAsync,cropAndResize:cropAndResize}),ops=Object.freeze({image:image_ops,linalg:linalg_ops,losses:loss_ops,spectral:spectral_ops,op:op,batchNormalization2d:batchNormalization2d,batchNormalization3d:batchNormalization3d,batchNormalization4d:batchNormalization4d,batchNormalization:batchNormalization,complex:complex,real:real,imag:imag,concat:concat,concat1d:concat1d,concat2d:concat2d,concat3d:concat3d,concat4d:concat4d,split:split$1,conv1d:conv1d,conv2d:conv2d,depthwiseConv2d:depthwiseConv2d,separableConv2d:separableConv2d,conv2dTranspose:conv2dTranspose,matMul:matMul,dot:dot,outerProduct:outerProduct,reverse:reverse,reverse1d:reverse1d,reverse2d:reverse2d,reverse3d:reverse3d,reverse4d:reverse4d,maxPool:maxPool,avgPool:avgPool,slice:slice,slice1d:slice1d,slice2d:slice2d,slice3d:slice3d,slice4d:slice4d,abs:abs,acos:acos,acosh:acosh,asin:asin,asinh:asinh,atan:atan,atanh:atanh,ceil:ceil,clipByValue:clipByValue,cos:cos,cosh:cosh,erf:erf,exp:exp,expm1:expm1,floor:floor,log:log$1,log1p:log1p,logSigmoid:logSigmoid,neg:neg,reciprocal:reciprocal,round:round,rsqrt:rsqrt,sigmoid:sigmoid,sign:sign,sin:sin,sinh:sinh,softplus:softplus,sqrt:sqrt,square:square,step:step,tan:tan,tanh:tanh$1,all:all,any:any,argMax:argMax,argMin:argMin,logSumExp:logSumExp,max:max,mean:mean,min:min,moments:moments,sum:sum,prod:prod,equal:equal,equalStrict:equalStrict,greater:greater,greaterEqual:greaterEqual,greaterEqualStrict:greaterEqualStrict,greaterStrict:greaterStrict,less:less,lessEqual:lessEqual,lessEqualStrict:lessEqualStrict,lessStrict:lessStrict,notEqual:notEqual,notEqualStrict:notEqualStrict,add:add,addN:addN,addStrict:addStrict,atan2:atan2,div:div,divStrict:divStrict,floorDiv:floorDiv,maximum:maximum,maximumStrict:maximumStrict,minimum:minimum,minimumStrict:minimumStrict,mod:mod,modStrict:modStrict,mul:mul,mulStrict:mulStrict,pow:pow,powStrict:powStrict,squaredDifference:squaredDifference,squaredDifferenceStrict:squaredDifferenceStrict,sub:sub,subStrict:subStrict,elu:elu,leakyRelu:leakyRelu,prelu:prelu,relu:relu,selu:selu,logicalAnd:logicalAnd,logicalNot:logicalNot,logicalOr:logicalOr,logicalXor:logicalXor,where:where,whereAsync:whereAsync,buffer:buffer,toPixels:toPixels,print:print,batchToSpaceND:batchToSpaceND,cast:cast,clone:clone,cumsum:cumsum,depthToSpace:depthToSpace,expandDims:expandDims,eye:eye,fromPixels:fromPixels,multinomial:multinomial,oneHot:oneHot,pad:pad,pad1d:pad1d,pad2d:pad2d,pad3d:pad3d,pad4d:pad4d,rand:rand,randomNormal:randomNormal,randomUniform:randomUniform,reshape:reshape,spaceToBatchND:spaceToBatchND,squeeze:squeeze,stack:stack,tile:tile,truncatedNormal:truncatedNormal,unstack:unstack,fill:fill,linspace:linspace,ones:ones$1,range:range,scalar:scalar,tensor:tensor,tensor1d:tensor1d,tensor2d:tensor2d,tensor3d:tensor3d,tensor4d:tensor4d,tensor5d:tensor5d,tensor6d:tensor6d,zeros:zeros,onesLike:onesLike,zerosLike:zerosLike,transpose:transpose,softmax:softmax,localResponseNormalization:localResponseNormalization,norm:norm,gather:gather,unsortedSegmentSum:unsortedSegmentSum,basicLSTMCell:basicLSTMCell,multiRNNCell:multiRNNCell,movingAverage:movingAverage,stridedSlice:stridedSlice,topk:topk,scatterND:scatterND,fft:fft,gatherND:gatherND}),MathBackendCPU=function(){function e(){this.blockSize=48,this.firstUse=!0,ENV.get("IS_BROWSER")&&(this.canvas=document.createElement("canvas"))}return e.prototype.setDataMover=function(e){this.data=new DataStorage(e)},e.prototype.register=function(e,t,n){if(this.firstUse&&(this.firstUse=!1,ENV.get("IS_NODE")&&warn("\n============================\nHi there 👋. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details.\n============================\n")),this.data.has(e))throw new Error("Data buffer is already registered");this.data.set(e,{dtype:n})},e.prototype.write=function(e,t){if(null==t)throw new Error("MathBackendCPU.write(): values can not be null");this.data.get(e).values=t},e.prototype.fromPixels=function(e,t){if(null==e)throw new Error("pixels passed to tf.fromPixels() can not be null");var n,r;if(ENV.get("IS_NODE")&&null==e.getContext)throw new Error("When running in node, pixels must be an HTMLCanvasElement like the one returned by the `canvas` npm package");if(null!=e.getContext)n=e.getContext("2d").getImageData(0,0,e.width,e.height).data;else if(e instanceof ImageData)n=e.data;else{if(!(e instanceof HTMLImageElement||e instanceof HTMLVideoElement))throw new Error("pixels passed to tf.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement or ImageData, but was "+e.constructor.name);if(null==this.canvas)throw new Error("Can't read pixels from HTMLImageElement outside the browser.");this.canvas.width=e.width,this.canvas.height=e.height,this.canvas.getContext("2d").drawImage(e,0,0,e.width,e.height),n=this.canvas.getContext("2d").getImageData(0,0,e.width,e.height).data}if(4===t)r=new Int32Array(n);else{var o=e.width*e.height;r=new Int32Array(o*t);for(var a=0;ad&&(d=m,h=f)}u[c]=h}return i},e.prototype.cumsum=function(e,t,n,r){if(this.assertNotComplex(e,"cumsum"),t!==e.rank-1)throw new Error("backend.cumsum in CPU expects an inner-most axis="+(e.rank-1)+" but got axis="+t);for(var o=upcastType(e.dtype,"int32"),a=zeros(e.shape,o),i=a.dataSync(),s=e.dataSync(),u=e.shape[e.rank-1],l=r?function(e,t){return e+u-t-1}:function(e,t){return e+t},c=0;ct?1:0})},e.prototype.greaterEqual=function(e,t){return this.assertNotComplex([e,t],"greaterEqual"),this.broadcastedBinaryOp(e,t,"bool",function(e,t){return e>=t?1:0})},e.prototype.logicalNot=function(e){this.assertNotComplex(e,"logicalNot");for(var t=e.dataSync(),n=new Int32Array(t.length),r=0;r1||1===t.rank?1:t.shape[1],c=0;c=0&&t>=0?n:(n+t)%t})},e.prototype.max=function(e,t){this.assertNotComplex(e,"max"),assertAxesAreInnerMostDims("max",t,e.rank);for(var n=computeOutAndReduceShapes(e.shape,t),r=n[0],o=n[1],a=zeros(r,e.dtype),i=sizeFromShape(o),s=a.dataSync(),u=e.dataSync(),l=0;lp&&(p=h)}s[l]=p}return a},e.prototype.maximum=function(e,t){return this.assertNotComplex([e,t],"maximum"),this.broadcastedBinaryOp(e,t,e.dtype,function(e,t){return Math.max(e,t)})},e.prototype.all=function(e,t){this.assertNotComplex(e,"all"),assertAxesAreInnerMostDims("all",t,e.rank);for(var n=computeOutAndReduceShapes(e.shape,t),r=n[0],o=n[1],a=zeros(r,e.dtype),i=sizeFromShape(o),s=a.dataSync(),u=e.dataSync(),l=0;l0?n[r]=1:n[r]=0;return Tensor.make(e.shape,{values:n})},e.prototype.round=function(e){this.assertNotComplex(e,"round");for(var t=e.dataSync(),n=new Float32Array(t.length),r=0;r.5?n[r]=Math.ceil(t[r]):n[r]=o%2==0?o:o+1}return Tensor.make(e.shape,{values:n})},e.prototype.exp=function(e){this.assertNotComplex(e,"exp");for(var t=e.dataSync(),n=new Float32Array(t.length),r=0;r=0?o:Math.exp(o)-1}return Tensor.make(e.shape,{values:t})},e.prototype.eluDer=function(e,t){this.assertNotComplex([e,t],"eluDer");for(var n=new Float32Array(t.size),r=t.dataSync(),o=e.dataSync(),a=0;a=1?o[a]:o[a]*(i+1)}return Tensor.make(t.shape,{values:n})},e.prototype.selu=function(e){this.assertNotComplex(e,"selu");for(var t=SELU_SCALEALPHA,n=SELU_SCALE,r=new Float32Array(e.size),o=e.dataSync(),a=0;a=0?n*i:t*(Math.exp(i)-1)}return Tensor.make(e.shape,{values:r})},e.prototype.clip=function(e,t,n){this.assertNotComplex(e,"clip");for(var r=new Float32Array(e.size),o=e.dataSync(),a=0;an?n:i-t,i=r[o]0?1:t}return Tensor.make(e.shape,{values:n})},e.prototype.conv2d=function(e,t,n){this.assertNotComplex([e,t],"conv2d");for(var r=n.filterHeight,o=n.filterWidth,a=n.dilationHeight,i=n.dilationWidth,s=n.padInfo.left,u=n.padInfo.top,l=buffer(n.outShape,e.dtype),c=e.dataSync(),p=t.dataSync(),d=l.values,h=0;h=n.inHeight))for(var S=y*t.strides[0],b=f+T*e.strides[1],E=0;E=n.inWidth))for(var R=S+C*t.strides[1],N=b+_*n.inChannels,k=R,I=0;I=n.inHeight))for(var b=T*t.strides[0],E=m+S*e.strides[1],w=0;w=n.inWidth))for(var N=b+_*t.strides[1],k=E+R*n.inChannels,I=A,D=N,M=0;MS?S=C:"avg"===n&&(b+=C,E++)}if(isNaN(S))break}s.set("avg"===n?b/E:S,p,h,v,d)}return s.toTensor()},e.prototype.maxPool=function(e,t){return this.pool(e,t,"max")},e.prototype.maxPoolPositions=function(e,t){for(var n=buffer(t.outShape,"int32"),r=t.strideHeight,o=t.strideWidth,a=t.filterHeight,i=t.filterWidth,s=t.padInfo.top,u=t.padInfo.left,l=0;ly&&(y=A,T=b*i+w)}n.set(T,l,p,m,c)}return n.toTensor()},e.prototype.maxPoolBackprop=function(e,t,n,r){this.assertNotComplex([t,n],"maxPoolBackprop");for(var o=this.maxPoolPositions(t,r),a=r.strideHeight,i=r.strideWidth,s=r.filterHeight,u=r.filterWidth,l=u-1-r.padInfo.left,c=s-1-r.padInfo.top,p=buffer(t.shape,"float32"),d=0;d=r.outHeight||Math.floor(T)!==T))for(var S=0;S=r.outWidth||Math.floor(b)!==b)){var E=s*u-1-o.get(d,T,b,h)===y*u+S?1:0;if(0!==E)x+=e.get(d,T,b,h)*E}}}p.set(x,d,f,m,h)}return p.toTensor()},e.prototype.avgPoolBackprop=function(e,t,n){this.assertNotComplex([e,t],"avgPoolBackprop");for(var r=n.strideHeight,o=n.strideWidth,a=n.filterHeight,i=n.filterWidth,s=i-1-n.padInfo.left,u=a-1-n.padInfo.top,l=buffer(t.shape,"float32"),c=1/(a*i),p=0;p=n.outHeight||Math.floor(y)!==y))for(var T=0;T=n.outWidth||Math.floor(S)!==S))v+=e.get(p,y,S,d)}}l.set(v*c,p,h,f,d)}return l.toTensor()},e.prototype.cast=function(e,t){return castTensor(e,t,this)},e.prototype.reshape=function(e,t){return reshapeTensor(e,t)},e.prototype.avgPool=function(e,t){return this.assertNotComplex(e,"avgPool"),this.pool(e,t,"avg").toFloat()},e.prototype.resizeBilinear=function(e,t,n,r){this.assertNotComplex(e,"resizeBilinear");for(var o=e.shape,a=o[0],i=o[1],s=o[2],u=o[3],l=e.dataSync(),c=new Float32Array(sizeFromShape([a,t,n,u])),p=[r&&t>1?i-1:i,r&&n>1?s-1:s],d=[r&&t>1?t-1:t,r&&n>1?n-1:n],h=0,f=p[0]/d[0],m=p[1]/d[1],g=0;g1?a-1:a,n&&c>1?i-1:i],h=[n&&l>1?l-1:l,n&&c>1?c-1:c],f=d[0]/h[0],m=d[1]/h[1],g=e.dataSync(),v=0,x=0;x1?i-1:i,r&&n>1?s-1:s],p=[r&&t>1?t-1:t,r&&n>1?n-1:n],d=0;d1?a-1:a,n&&c>1?i-1:i],h=[n&&l>1?l-1:l,n&&c>1?c-1:c],f=1/(d[0]/h[0]),m=1/(d[1]/h[1]),g=2*Math.ceil(f)+2,v=2*Math.ceil(m)+2,x=0;x=l))for(var N=0;N=c)){var I=d[0]*(R/h[0]),D=d[1]*(k/h[1]),M=Math.min(a-1,n?Math.round(I):Math.floor(I)),O=Math.min(i-1,n?Math.round(D):Math.floor(D));y===M&&T===O&&(C+=e.get(x,R,k,A))}}}p.set(C,x,y,T,A)}return p.toTensor()},e.prototype.batchNormalization=function(e,t,n,r,o,a){this.assertNotComplex([e,t,n,o,a],"batchNormalization");for(var i=e.dataSync(),s=t.dataSync(),u=n.dataSync(),l=o?o.dataSync():new Float32Array([1]),c=a?a.dataSync():new Float32Array([0]),p=new Float32Array(i.length),d=c.length,h=l.length,f=u.length,m=s.length,g=0,v=0,x=0,y=0,T=0;T=d&&(g=0),v>=m&&(v=0),x>=h&&(x=0),y>=f&&(y=0);return tensor4d(p,e.shape)},e.prototype.localResponseNormalization4D=function(e,t,n,r,o){this.assertNotComplex(e,"localResponseNormalization4D");var a=e.shape[3],i=a-1,s=e.dataSync(),u=sizeFromShape(e.shape),l=new Float32Array(u);function c(e){for(var n=e%a,r=e-n+Math.max(0,n-t),o=e-n+Math.min(n+t,i),u=0;r<=o;r++){var l=s[r];u+=l*l}return u}for(var p=0;p=0&&e.get(a)0,"input must have at least one rank.");var t=e.shape[0];if(this.is_exponent_of_2(t))return this.fftRadix2(e,t);var n=e.dataSync(),r=splitRealAndImagArrays(this.fourierTransformByMatmul(n,t));return complex(r.real,r.imag).as1D()},e.prototype.is_exponent_of_2=function(e){return 0==(e&e-1)},e.prototype.fftRadix2=function(e,t){if(1===t)return e;var n=e.dataSync(),r=t/2,o=complexWithEvenIndex(n),a=complex(o.real,o.imag).as1D(),i=complexWithOddIndex(n),s=complex(i.real,i.imag).as1D();a=this.fftRadix2(a,r),s=this.fftRadix2(s,r);var u=exponents(t),l=complex(u.real,u.imag).mul(s),c=a.add(l),p=a.sub(l),d=real(c).concat(real(p)),h=imag(c).concat(imag(p));return complex(d,h).as1D()},e.prototype.fourierTransformByMatmul=function(e,t){for(var n=new Float32Array(2*t),r=0;r1,"blockSize should be > 1 for depthToSpace, but was: "+t);for(var r=e.shape[0],o=e.shape[1],a=e.shape[2],i=e.shape[3],s=o*t,u=a*t,l=i/(t*t),c=e.dataSync(),p=new Float32Array(r*s*u*l),d=0,h=0;h=s))for(var _=d>1?(w-b)*(u-1)/(d-1):0,R=h>1?(A-E)*(l-1)/(h-1):0,N=0;N1?b*(u-1)+N*_:.5*(b+w)*(u-1);if(k<0||k>u-1)for(var I=0;I1?E*(l-1)+I*R:.5*(E+A)*(l-1))<0||q>l-1)for(D=0;D1?E*(l-1)+I*R:.5*(E+A)*(l-1))<0||q>l-1)for(D=0;D=e.size/s)throw new Error("Invalid indices: "+h+" does not index into "+e.shape);for(var v=0;v=u/i)throw new Error("Invalid indices: "+f+" does not index into "+n);for(var x=0;x0,"scheme must not be an empty string.");var r=e.getInstance();assert(null==r.managers[t],"A model store manager is already registered for scheme '"+t+"'."),r.managers[t]=n},e.getManager=function(e){var t=this.getInstance().managers[e];if(null==t)throw new Error("Cannot find model manager for scheme '"+e+"'");return t},e.getSchemes=function(){return Object.keys(this.getInstance().managers)},e}();function parseURL(e){if(-1===e.indexOf(URL_SCHEME_SUFFIX))throw new Error("The url string provided does not contain a scheme. Supported schemes are: "+ModelStoreManagerRegistry.getSchemes().join(","));return{scheme:e.split(URL_SCHEME_SUFFIX)[0],path:e.split(URL_SCHEME_SUFFIX)[1]}}function cloneModelInternal(e,t,n){return void 0===n&&(n=!1),__awaiter(this,void 0,void 0,function(){var r,o,a,i,s,u,l,c,p;return __generator(this,function(d){switch(d.label){case 0:return assert(e!==t,"Old path and new path are the same: '"+e+"'"),assert((r=IORouterRegistry.getLoadHandlers(e)).length>0,"Copying failed because no load handler is found for source URL "+e+"."),assert(r.length<2,"Copying failed because more than one ("+r.length+") load handlers for source URL "+e+"."),o=r[0],assert((a=IORouterRegistry.getSaveHandlers(t)).length>0,"Copying failed because no save handler is found for destination URL "+t+"."),assert(a.length<2,"Copying failed because more than one ("+r.length+") save handlers for destination URL "+t+"."),i=a[0],s=parseURL(e).scheme,u=parseURL(e).path,l=s===parseURL(e).scheme,[4,o.load()];case 1:return c=d.sent(),n&&l?[4,ModelStoreManagerRegistry.getManager(s).removeModel(u)]:[3,3];case 2:d.sent(),d.label=3;case 3:return[4,i.save(c)];case 4:return p=d.sent(),!n||l?[3,6]:[4,ModelStoreManagerRegistry.getManager(s).removeModel(u)];case 5:d.sent(),d.label=6;case 6:return[2,p.modelArtifactsInfo]}})})}function listModels(){return __awaiter(this,void 0,void 0,function(){var e,t,n,r,o,a,i;return __generator(this,function(s){switch(s.label){case 0:e=ModelStoreManagerRegistry.getSchemes(),t={},n=0,r=e,s.label=1;case 1:return n0,"URL path for browserHTTPRequest must not be null, undefined or empty."),Array.isArray(e)&&assert(2===e.length,"URL paths for browserHTTPRequest must have a length of 2, (actual length is "+e.length+")."),this.path=e,null!=t&&null!=t.body)throw new Error("requestInit is expected to have no pre-existing body, but has one.");this.requestInit=t||{}}return e.prototype.save=function(e){return __awaiter(this,void 0,void 0,function(){var t,n,r,o;return __generator(this,function(a){switch(a.label){case 0:if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet.");return(t=Object.assign({method:this.DEFAULT_METHOD},this.requestInit)).body=new FormData,n=[{paths:["./model.weights.bin"],weights:e.weightSpecs}],r={modelTopology:e.modelTopology,weightsManifest:n},t.body.append("model.json",new Blob([JSON.stringify(r)],{type:"application/json"}),"model.json"),null!=e.weightData&&t.body.append("model.weights.bin",new Blob([e.weightData],{type:"application/octet-stream"}),"model.weights.bin"),[4,fetch(this.path,t)];case 1:if(200===(o=a.sent()).status)return[2,{modelArtifactsInfo:getModelArtifactsInfoForJSON(e),responses:[o]}];throw new Error("BrowserHTTPRequest.save() failed due to HTTP response status "+o.status+".")}})})},e.prototype.load=function(){return __awaiter(this,void 0,void 0,function(){return __generator(this,function(e){return[2,Array.isArray(this.path)?this.loadBinaryModel():this.loadJSONModel()]})})},e.prototype.loadBinaryTopology=function(){return __awaiter(this,void 0,void 0,function(){var e;return __generator(this,function(t){switch(t.label){case 0:return t.trys.push([0,3,,4]),[4,fetch(this.path[0],this.requestInit)];case 1:return[4,t.sent().arrayBuffer()];case 2:return[2,t.sent()];case 3:throw e=t.sent(),new Error(this.path[0]+" not found. "+e);case 4:return[2]}})})},e.prototype.loadBinaryModel=function(){return __awaiter(this,void 0,void 0,function(){var e,t,n,r,o,a,i,s;return __generator(this,function(u){switch(u.label){case 0:return e=this.loadBinaryTopology(),[4,fetch(this.path[1],this.requestInit)];case 1:return t=u.sent(),[4,Promise.all([e,t])];case 2:return n=u.sent(),r=n[0],[4,n[1].json()];case 3:return null==(o=u.sent())?[3,5]:[4,this.loadWeights(o)];case 4:s=u.sent(),a=s[0],i=s[1],u.label=5;case 5:return[2,{modelTopology:r,weightSpecs:a,weightData:i}]}})})},e.prototype.loadJSONModel=function(){return __awaiter(this,void 0,void 0,function(){var e,t,n,r,o,a,i;return __generator(this,function(s){switch(s.label){case 0:return[4,fetch(this.path,this.requestInit)];case 1:return[4,s.sent().json()];case 2:if(e=s.sent(),t=e.modelTopology,n=e.weightsManifest,null==t&&null==n)throw new Error("The JSON from HTTP path "+this.path+" contains neither model topology or manifest for weights.");return null==n?[3,4]:(a=e.weightsManifest,[4,this.loadWeights(a)]);case 3:i=s.sent(),r=i[0],o=i[1],s.label=4;case 4:return[2,{modelTopology:t,weightSpecs:r,weightData:o}]}})})},e.prototype.loadWeights=function(e){return __awaiter(this,void 0,void 0,function(){var t,n,r,o,a,i,s,u,l;return __generator(this,function(c){switch(c.label){case 0:for(t=Array.isArray(this.path)?this.path[1]:this.path,n=[],r=0,o=e;r0&&(e=__assign({weightSpecs:this.weightSpecs},e)),null!=this.weightData&&this.weightData.byteLength>0&&(e=__assign({weightData:this.weightData},e)),[2,e]})})},e}(),PassthroughSaver=function(){function e(e){this.saveHandler=e}return e.prototype.save=function(e){return __awaiter(this,void 0,void 0,function(){return __generator(this,function(t){return[2,this.saveHandler(e)]})})},e}();function fromMemory(e,t,n){return new PassthroughLoader(e,t,n)}function withSaveHandler(e){return new PassthroughSaver(e)}var registerSaveRouter=IORouterRegistry.registerSaveRouter,registerLoadRouter=IORouterRegistry.registerLoadRouter,getSaveHandlers=IORouterRegistry.getSaveHandlers,getLoadHandlers=IORouterRegistry.getLoadHandlers,io=Object.freeze({browserFiles:browserFiles,browserHTTPRequest:browserHTTPRequest,concatenateArrayBuffers:concatenateArrayBuffers,decodeWeights:decodeWeights,encodeWeights:encodeWeights,fromMemory:fromMemory,getLoadHandlers:getLoadHandlers,getModelArtifactsInfoForJSON:getModelArtifactsInfoForJSON,getSaveHandlers:getSaveHandlers,loadWeights:loadWeights,registerLoadRouter:registerLoadRouter,registerSaveRouter:registerSaveRouter,withSaveHandler:withSaveHandler,copyModel:copyModel,listModels:listModels,moveModel:moveModel,removeModel:removeModel}),Serializable=function(){function e(){}return e.prototype.getClassName=function(){return this.constructor.className},e.fromConfig=function(e,t){return new e(t)},e}(),SerializationMap=function(){function e(){this.classNameMap={}}return e.getMap=function(){return null==e.instance&&(e.instance=new e),e.instance},e.register=function(t){e.getMap().classNameMap[t.className]=[t,t.fromConfig]},e}();function registerClass(e){assert(null!=e.className,"Class being registered does not have the static className property defined."),assert("string"==typeof e.className,"className is required to be a string, but got type "+typeof e.className),assert(e.className.length>0,"Class being registered has an empty-string as its className, which is disallowed."),SerializationMap.register(e)}var serialization=Object.freeze({Serializable:Serializable,SerializationMap:SerializationMap,registerClass:registerClass}),WEBGL_ENVS={HAS_WEBGL:!0},NODE_ENVS={IS_NODE:!0},CHROME_ENVS={IS_CHROME:!0},BROWSER_ENVS={IS_BROWSER:!0},CPU_ENVS={HAS_WEBGL:!1},ALL_ENVS={};function expectArraysClose(e,t,n){if(null==n&&(n=ENV.get("TEST_EPSILON")),e instanceof Tensor||t instanceof Tensor){if(e instanceof Tensor&&t instanceof Tensor){if(e.dtype!==t.dtype)throw new Error("Arrays are of different type actual: "+e.dtype+" vs expected: "+t.dtype+".");if(!arraysEqual(e.shape,t.shape))throw new Error("Arrays are of different shape actual: "+e.shape+" vs expected: "+t.shape+".")}}else{var r=e.constructor.name,o=t.constructor.name;if(r!==o)throw new Error("Arrays are of different type actual: "+r+" vs expected: "+o)}var a,i;if(a=e instanceof Tensor?e.dataSync():e,i=t instanceof Tensor?t.dataSync():t,a.length!==i.length)throw new Error("Arrays have different lengths actual: "+a.length+" vs expected: "+i.length+".\nActual: "+a+".\nExpected: "+i+".");for(var s=0;sn)}function expectValuesInRange(e,t,n){var r;r=e instanceof Tensor?e.dataSync():e;for(var o=0;on)throw new Error("Value out of range:"+r[o]+" low: "+t+", high: "+n)}function expectArrayBuffersEqual(e,t){expect(new Float32Array(e)).toEqual(new Float32Array(t))}var test_util=Object.freeze({WEBGL_ENVS:WEBGL_ENVS,NODE_ENVS:NODE_ENVS,CHROME_ENVS:CHROME_ENVS,BROWSER_ENVS:BROWSER_ENVS,CPU_ENVS:CPU_ENVS,ALL_ENVS:ALL_ENVS,expectArraysClose:expectArraysClose,expectPromiseToFail:expectPromiseToFail,expectArraysEqual:expectArraysEqual,expectNumbersClose:expectNumbersClose,expectValuesInRange:expectValuesInRange,expectArrayBuffersEqual:expectArrayBuffersEqual}),version="0.13.6",webgl=Object.freeze({gpgpu_util:gpgpu_util,webgl_util:webgl_util,MathBackendWebGL:MathBackendWebGL,GPGPUContext:GPGPUContext}),Optimizer=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return __extends(t,e),t.prototype.minimize=function(e,t,n){void 0===t&&(t=!1);var r=this.computeGradients(e,n),o=r.value,a=r.grads;return this.applyGradients(a),Object.keys(a).forEach(function(e){return a[e].dispose()}),t?o:(o.dispose(),null)},t.prototype.computeGradients=function(e,t){return variableGrads(e,t)},t}(Serializable),AdadeltaOptimizer=function(e){function t(t,n,r){void 0===r&&(r=null);var o=e.call(this)||this;return o.learningRate=t,o.rho=n,o.epsilon=r,o.accumulatedGrads={},o.accumulatedUpdates={},o.c=keep(scalar(-t)),o.rhoScalar=keep(scalar(n)),o.oneMinusRho=keep(scalar(1-n)),null===r&&(r=ENV.get("EPSILON")),o.epsilonScalar=keep(scalar(r)),o}return __extends(t,e),t.prototype.applyGradients=function(e){var t=this,n=function(n){var o=ENV.engine.registeredVariables[n];if(null==r.accumulatedGrads[n]){tidy(function(){t.accumulatedGrads[n]=zerosLike(o).variable(!1)})}if(null==r.accumulatedUpdates[n]){tidy(function(){t.accumulatedUpdates[n]=zerosLike(o).variable(!1)})}var a=e[n],i=r.accumulatedGrads[n],s=r.accumulatedUpdates[n];tidy(function(){var e=t.rhoScalar.mul(i).add(t.oneMinusRho.mul(a.square())),r=s.add(t.epsilonScalar).sqrt().div(i.add(t.epsilonScalar).sqrt()).mul(a),u=t.rhoScalar.mul(s).add(t.oneMinusRho.mul(r.square()));t.accumulatedGrads[n].assign(e),t.accumulatedUpdates[n].assign(u);var l=t.c.mul(r).add(o);o.assign(l)})},r=this;for(var o in e)n(o)},t.prototype.dispose=function(){var e=this;this.c.dispose(),this.epsilonScalar.dispose(),this.rhoScalar.dispose(),this.oneMinusRho.dispose(),null!=this.accumulatedUpdates&&(Object.keys(this.accumulatedUpdates).forEach(function(t){return e.accumulatedUpdates[t].dispose()}),Object.keys(this.accumulatedGrads).forEach(function(t){return e.accumulatedGrads[t].dispose()}))},t.prototype.getConfig=function(){return{learningRate:this.learningRate,rho:this.rho,epsilon:this.epsilon}},t.fromConfig=function(e,t){return new e(t.learningRate,t.rho,t.epsilon)},t.className="AdadeltaOptimizer",t}(Optimizer);registerClass(AdadeltaOptimizer);var AdagradOptimizer=function(e){function t(t,n){void 0===n&&(n=.1);var r=e.call(this)||this;return r.learningRate=t,r.initialAccumulatorValue=n,r.accumulatedGrads={},r.c=keep(scalar(-t)),r.epsilon=keep(scalar(ENV.get("EPSILON"))),r}return __extends(t,e),t.prototype.applyGradients=function(e){var t=this,n=function(n){var o=ENV.engine.registeredVariables[n];if(null==r.accumulatedGrads[n]){tidy(function(){t.accumulatedGrads[n]=fill(o.shape,t.initialAccumulatorValue).variable(!1)})}var a=e[n],i=r.accumulatedGrads[n];tidy(function(){var e=i.add(a.square());t.accumulatedGrads[n].assign(e);var r=t.c.mul(a.div(e.add(t.epsilon).sqrt())).add(o);o.assign(r)})},r=this;for(var o in e)n(o)},t.prototype.dispose=function(){var e=this;this.epsilon.dispose(),this.c.dispose(),null!=this.accumulatedGrads&&Object.keys(this.accumulatedGrads).forEach(function(t){return e.accumulatedGrads[t].dispose()})},t.prototype.getConfig=function(){return{learningRate:this.learningRate,initialAccumulatorValue:this.initialAccumulatorValue}},t.fromConfig=function(e,t){return new e(t.learningRate,t.initialAccumulatorValue)},t.className="AdagradOptimizer",t}(Optimizer);registerClass(AdagradOptimizer);var AdamOptimizer=function(e){function t(t,n,r,o){void 0===o&&(o=null);var a=e.call(this)||this;return a.learningRate=t,a.beta1=n,a.beta2=r,a.epsilon=o,a.accumulatedFirstMoment={},a.accumulatedSecondMoment={},a.c=keep(scalar(-t)),a.beta1Scalar=keep(scalar(n)),a.beta2Scalar=keep(scalar(r)),tidy(function(){a.accBeta1=scalar(n).variable(),a.accBeta2=scalar(r).variable()}),a.oneMinusBeta1=keep(scalar(1-n)),a.oneMinusBeta2=keep(scalar(1-r)),a.one=keep(scalar(1)),null===o&&(o=ENV.get("EPSILON")),a.epsScalar=keep(scalar(o)),a}return __extends(t,e),t.prototype.applyGradients=function(e){var t=this;tidy(function(){var n=t.one.sub(t.accBeta1),r=t.one.sub(t.accBeta2);for(var o in e){var a=ENV.engine.registeredVariables[o];if(null==t.accumulatedFirstMoment[o]){var i=!1;t.accumulatedFirstMoment[o]=zerosLike(a).variable(i)}if(null==t.accumulatedSecondMoment[o]){i=!1;t.accumulatedSecondMoment[o]=zerosLike(a).variable(i)}var s=e[o],u=t.accumulatedFirstMoment[o],l=t.accumulatedSecondMoment[o],c=t.beta1Scalar.mul(u).add(t.oneMinusBeta1.mul(s)),p=t.beta2Scalar.mul(l).add(t.oneMinusBeta2.mul(s.square())),d=c.div(n),h=p.div(r);t.accumulatedFirstMoment[o].assign(c),t.accumulatedSecondMoment[o].assign(p);var f=t.c.mul(d.div(t.epsScalar.add(h.sqrt()))).add(a);a.assign(f)}t.accBeta1.assign(t.accBeta1.mul(t.beta1Scalar)),t.accBeta2.assign(t.accBeta2.mul(t.beta2Scalar))})},t.prototype.dispose=function(){var e=this;this.c.dispose(),this.epsScalar.dispose(),this.beta1Scalar.dispose(),this.beta2Scalar.dispose(),this.accBeta1.dispose(),this.accBeta2.dispose(),this.oneMinusBeta1.dispose(),this.oneMinusBeta2.dispose(),this.one.dispose(),null!=this.accumulatedFirstMoment&&Object.keys(this.accumulatedFirstMoment).forEach(function(t){return e.accumulatedFirstMoment[t].dispose()}),null!=this.accumulatedSecondMoment&&Object.keys(this.accumulatedSecondMoment).forEach(function(t){return e.accumulatedSecondMoment[t].dispose()})},t.prototype.getConfig=function(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon}},t.fromConfig=function(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon)},t.className="AdamOptimizer",t}(Optimizer);registerClass(AdamOptimizer);var AdamaxOptimizer=function(e){function t(t,n,r,o,a){void 0===o&&(o=null),void 0===a&&(a=0);var i=e.call(this)||this;return i.learningRate=t,i.beta1=n,i.beta2=r,i.epsilon=o,i.decay=a,i.accumulatedFirstMoment={},i.accumulatedWeightedInfNorm={},i.c=keep(scalar(-t)),i.beta1Scalar=keep(scalar(n)),i.beta2Scalar=keep(scalar(r)),i.decayScalar=keep(scalar(a)),tidy(function(){i.iteration=scalar(0).variable(),i.accBeta1=scalar(n).variable()}),i.oneMinusBeta1=keep(scalar(1-n)),i.one=keep(scalar(1)),null===o&&(o=ENV.get("EPSILON")),i.epsScalar=keep(scalar(o)),i}return __extends(t,e),t.prototype.applyGradients=function(e){var t=this;tidy(function(){var n=t.one.sub(t.accBeta1),r=t.c.div(t.one.add(t.decayScalar.mul(t.iteration)));for(var o in e){var a=ENV.engine.registeredVariables[o];if(null==t.accumulatedFirstMoment[o]){var i=!1;t.accumulatedFirstMoment[o]=zerosLike(a).variable(i)}if(null==t.accumulatedWeightedInfNorm[o]){i=!1;t.accumulatedWeightedInfNorm[o]=zerosLike(a).variable(i)}var s=e[o],u=t.accumulatedFirstMoment[o],l=t.accumulatedWeightedInfNorm[o],c=t.beta1Scalar.mul(u).add(t.oneMinusBeta1.mul(s)),p=t.beta2Scalar.mul(l),d=s.abs(),h=p.maximum(d);t.accumulatedFirstMoment[o].assign(c),t.accumulatedWeightedInfNorm[o].assign(h);var f=r.div(n).mul(c.div(t.epsScalar.add(h))).add(a);a.assign(f)}t.iteration.assign(t.iteration.add(t.one)),t.accBeta1.assign(t.accBeta1.mul(t.beta1Scalar))})},t.prototype.dispose=function(){var e=this;this.c.dispose(),this.epsScalar.dispose(),this.accBeta1.dispose(),this.beta1Scalar.dispose(),this.beta2Scalar.dispose(),this.oneMinusBeta1.dispose(),this.decayScalar.dispose(),this.iteration.dispose(),this.one.dispose(),null!=this.accumulatedFirstMoment&&Object.keys(this.accumulatedFirstMoment).forEach(function(t){return e.accumulatedFirstMoment[t].dispose()}),null!=this.accumulatedWeightedInfNorm&&Object.keys(this.accumulatedWeightedInfNorm).forEach(function(t){return e.accumulatedWeightedInfNorm[t].dispose()})},t.prototype.getConfig=function(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon,decay:this.decay}},t.fromConfig=function(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon,t.decay)},t.className="AdamaxOptimizer",t}(Optimizer);registerClass(AdamaxOptimizer);var SGDOptimizer=function(e){function t(t){var n=e.call(this)||this;return n.learningRate=t,n.setLearningRate(t),n}return __extends(t,e),t.prototype.applyGradients=function(e){var t=this;Object.keys(e).forEach(function(n){var r=e[n],o=ENV.engine.registeredVariables[n];tidy(function(){var e=t.c.mul(r).add(o);o.assign(e)})})},t.prototype.setLearningRate=function(e){this.learningRate=e,null!=this.c&&this.c.dispose(),this.c=keep(scalar(-e))},t.prototype.dispose=function(){this.c.dispose()},t.prototype.getConfig=function(){return{learningRate:this.learningRate}},t.fromConfig=function(e,t){return new e(t.learningRate)},t.className="SGDOptimizer",t}(Optimizer);registerClass(SGDOptimizer);var MomentumOptimizer=function(e){function t(t,n,r){void 0===r&&(r=!1);var o=e.call(this,t)||this;return o.learningRate=t,o.momentum=n,o.useNesterov=r,o.m=scalar(o.momentum),o.accumulations={},o}return __extends(t,e),t.prototype.applyGradients=function(e){var t=this,n=function(n){var o=ENV.engine.registeredVariables[n];if(null==r.accumulations[n]){tidy(function(){t.accumulations[n]=zerosLike(o).variable(!1)})}var a=r.accumulations[n],i=e[n];tidy(function(){var e,r=t.m.mul(a).add(i);e=t.useNesterov?t.c.mul(i.add(r.mul(t.m))).add(o):t.c.mul(r).add(o),t.accumulations[n].assign(r),o.assign(e)})},r=this;for(var o in e)n(o)},t.prototype.dispose=function(){if(e.prototype.dispose.call(this),this.m.dispose(),null!=this.accumulations)for(var t in this.accumulations)this.accumulations[t].dispose()},t.prototype.setMomentum=function(e){this.momentum=e},t.prototype.getConfig=function(){return{learningRate:this.learningRate,momentum:this.momentum,useNesterov:this.useNesterov}},t.fromConfig=function(e,t){return new e(t.learningRate,t.momentum,t.useNesterov)},t.className="MomentumOptimizer",t}(SGDOptimizer);registerClass(MomentumOptimizer);var RMSPropOptimizer=function(e){function t(t,n,r,o,a){void 0===n&&(n=.9),void 0===r&&(r=0),void 0===o&&(o=null),void 0===a&&(a=!1);var i=e.call(this)||this;return i.learningRate=t,i.decay=n,i.momentum=r,i.epsilon=o,i.accumulatedMeanSquares={},i.accumulatedMeanGrads={},i.accumulatedMoments={},i.c=keep(scalar(t)),i.decayScalar=keep(scalar(n)),i.momentumScalar=keep(scalar(r)),i.oneMinusDecay=keep(scalar(1-n)),i.centered=a,null===o&&(o=ENV.get("EPSILON")),i.epsilonScalar=keep(scalar(o)),i}return __extends(t,e),t.prototype.applyGradients=function(e){var t=this,n=function(n){var o=ENV.engine.registeredVariables[n];if(null==r.accumulatedMeanSquares[n]){tidy(function(){t.accumulatedMeanSquares[n]=zerosLike(o).variable(!1)})}if(null==r.accumulatedMeanGrads[n]&&r.centered){tidy(function(){t.accumulatedMeanGrads[n]=zerosLike(o).variable(!1)})}if(null==r.accumulatedMoments[n]){tidy(function(){t.accumulatedMoments[n]=zerosLike(o).variable(!1)})}var a=r.accumulatedMeanSquares[n],i=r.accumulatedMeanGrads[n],s=r.accumulatedMoments[n],u=e[n];tidy(function(){var e=t.decayScalar.mul(a).add(t.oneMinusDecay.mul(u.square()));if(t.centered){var r=t.decayScalar.mul(i).add(t.oneMinusDecay.mul(u)),l=t.momentumScalar.mul(s).add(t.c.mul(u).div(e.sub(r.square().add(t.epsilonScalar)).sqrt()));t.accumulatedMeanSquares[n].assign(e),t.accumulatedMeanGrads[n].assign(r),t.accumulatedMoments[n].assign(l);var c=o.sub(l);o.assign(c)}else{var p=t.decayScalar.mul(a).add(t.oneMinusDecay.mul(u.square()));l=t.momentumScalar.mul(s).add(t.c.mul(u).div(p.add(t.epsilonScalar).sqrt()));t.accumulatedMeanSquares[n].assign(p),t.accumulatedMoments[n].assign(l);c=o.sub(l);o.assign(c)}})},r=this;for(var o in e)n(o)},t.prototype.dispose=function(){var e=this;this.c.dispose(),this.epsilonScalar.dispose(),this.decayScalar.dispose(),this.momentumScalar.dispose(),this.oneMinusDecay.dispose(),null!=this.accumulatedMeanSquares&&Object.keys(this.accumulatedMeanSquares).forEach(function(t){return e.accumulatedMeanSquares[t].dispose()}),null!=this.accumulatedMeanGrads&&this.centered&&Object.keys(this.accumulatedMeanGrads).forEach(function(t){return e.accumulatedMeanGrads[t].dispose()}),null!=this.accumulatedMoments&&Object.keys(this.accumulatedMoments).forEach(function(t){return e.accumulatedMoments[t].dispose()})},t.prototype.getConfig=function(){return{learningRate:this.learningRate,decay:this.decay,momentum:this.momentum,epsilon:this.epsilon,centered:this.centered}},t.fromConfig=function(e,t){return new e(t.learningRate,t.decay,t.momentum,t.epsilon,t.centered)},t.className="RMSPropOptimizer",t}(Optimizer);registerClass(RMSPropOptimizer);var OptimizerConstructors=function(){function e(){}return e.sgd=function(e){return new SGDOptimizer(e)},e.momentum=function(e,t,n){return void 0===n&&(n=!1),new MomentumOptimizer(e,t,n)},e.rmsprop=function(e,t,n,r,o){return void 0===t&&(t=.9),void 0===n&&(n=0),void 0===r&&(r=null),void 0===o&&(o=!1),new RMSPropOptimizer(e,t,n,r,o)},e.adam=function(e,t,n,r){return void 0===e&&(e=.001),void 0===t&&(t=.9),void 0===n&&(n=.999),void 0===r&&(r=null),new AdamOptimizer(e,t,n,r)},e.adadelta=function(e,t,n){return void 0===e&&(e=.001),void 0===t&&(t=.95),void 0===n&&(n=null),new AdadeltaOptimizer(e,t,n)},e.adamax=function(e,t,n,r,o){return void 0===e&&(e=.002),void 0===t&&(t=.9),void 0===n&&(n=.999),void 0===r&&(r=null),void 0===o&&(o=0),new AdamaxOptimizer(e,t,n,r,o)},e.adagrad=function(e,t){return void 0===t&&(t=.1),new AdagradOptimizer(e,t)},e}(),train={sgd:OptimizerConstructors.sgd,momentum:OptimizerConstructors.momentum,adadelta:OptimizerConstructors.adadelta,adagrad:OptimizerConstructors.adagrad,rmsprop:OptimizerConstructors.rmsprop,adamax:OptimizerConstructors.adamax,adam:OptimizerConstructors.adam},setBackend=Environment.setBackend,getBackend=Environment.getBackend,disposeVariables=Environment.disposeVariables,memory=Environment.memory;setOpHandler(ops); //# sourceMappingURL=tf-core.esm.js.map /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../process/browser.js */ "./node_modules/process/browser.js"), __webpack_require__(/*! ./../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../../../timers-browserify/main.js */ "./node_modules/timers-browserify/main.js").setImmediate, __webpack_require__(/*! ./../../../buffer/index.js */ "./node_modules/buffer/index.js").Buffer)) /***/ }), /***/ "./node_modules/@tensorflow/tfjs-layers/dist/tf-layers.esm.js": /*!********************************************************************!*\ !*** ./node_modules/@tensorflow/tfjs-layers/dist/tf-layers.esm.js ***! \********************************************************************/ /*! exports provided: constraints, initializers, layers, metrics, regularizers, CallbackList, CustomCallback, History, Callback, InputSpec, SymbolicTensor, Model, input, loadModel, model, registerCallbackConstructor, sequential, RNN, Sequential, LayerVariable, version_layers */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "constraints", function() { return exports_constraints; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initializers", function() { return exports_initializers; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "layers", function() { return exports_layers; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "metrics", function() { return exports_metrics; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "regularizers", function() { return exports_regularizers; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CallbackList", function() { return CallbackList; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CustomCallback", function() { return CustomCallback; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "History", function() { return History; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Callback", function() { return Callback; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InputSpec", function() { return InputSpec; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SymbolicTensor", function() { return SymbolicTensor; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Model", function() { return Model; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "input", function() { return input; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "loadModel", function() { return loadModel; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "model", function() { return model; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "registerCallbackConstructor", function() { return registerCallbackConstructor; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sequential", function() { return sequential; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RNN", function() { return RNN; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Sequential", function() { return Sequential; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LayerVariable", function() { return LayerVariable; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version_layers", function() { return version; }); /* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/tf-core.esm.js"); /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};function __extends(e,t){function n(){this.constructor=e}extendStatics(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var __assign=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]t?1:0}function reverseNumberCompare(e,t){return-1*numberCompare(e,t)}function stringToDType(e){switch(e){case"float32":return"float32";default:throw new ValueError("Invalid dtype: "+e)}}function unique(e){if(null==e)return e;for(var t=[],n=0,r=e;n=0),assert(r>=n),Array.isArray(e)&&e.length>=n&&e.length<=r&&e.every(function(e){return typeof e===t})}function calcL2Norms(e,t){return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["sqrt"])(Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["sum"])(Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["mulStrict"])(e,e),t,!0))})}var Constraint=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return __extends(t,e),t.prototype.getConfig=function(){return{}},t}(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].Serializable),MaxNorm=function(e){function t(t){var n=e.call(this)||this;return n.defaultMaxValue=2,n.defaultAxis=0,n.maxValue=null!=t.maxValue?t.maxValue:n.defaultMaxValue,n.axis=null!=t.axis?t.axis:n.defaultAxis,n}return __extends(t,e),t.prototype.apply=function(e){var t=this;return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){var n=calcL2Norms(e,t.axis),r=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["clipByValue"])(n,0,t.maxValue);return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["mul"])(e,Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["div"])(r,Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["add"])(getScalar(epsilon()),n)))})},t.prototype.getConfig=function(){return{maxValue:this.maxValue,axis:this.axis}},t.className="MaxNorm",t}(Constraint);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(MaxNorm);var UnitNorm=function(e){function t(t){var n=e.call(this)||this;return n.defaultAxis=0,n.axis=null!=t.axis?t.axis:n.defaultAxis,n}return __extends(t,e),t.prototype.apply=function(e){var t=this;return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["div"])(e,Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["add"])(getScalar(epsilon()),calcL2Norms(e,t.axis)))})},t.prototype.getConfig=function(){return{axis:this.axis}},t.className="UnitNorm",t}(Constraint);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(UnitNorm);var NonNeg=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return __extends(t,e),t.prototype.apply=function(e){return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["relu"])(e)},t.className="NonNeg",t}(Constraint);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(NonNeg);var MinMaxNorm=function(e){function t(t){var n=e.call(this)||this;return n.defaultMinValue=0,n.defaultMaxValue=1,n.defaultRate=1,n.defaultAxis=0,n.minValue=null!=t.minValue?t.minValue:n.defaultMinValue,n.maxValue=null!=t.maxValue?t.maxValue:n.defaultMaxValue,n.rate=null!=t.rate?t.rate:n.defaultRate,n.axis=null!=t.axis?t.axis:n.defaultAxis,n}return __extends(t,e),t.prototype.apply=function(e){var t=this;return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){var n=calcL2Norms(e,t.axis),r=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["add"])(Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["mul"])(getScalar(t.rate),Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["clipByValue"])(n,t.minValue,t.maxValue)),Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["mul"])(getScalar(1-t.rate),n));return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["mul"])(e,Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["div"])(r,Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["add"])(getScalar(epsilon()),n)))})},t.prototype.getConfig=function(){return{minValue:this.minValue,maxValue:this.maxValue,rate:this.rate,axis:this.axis}},t.className="MinMaxNorm",t}(Constraint);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(MinMaxNorm);var CONSTRAINT_IDENTIFIER_REGISTRY_SYMBOL_MAP={maxNorm:"MaxNorm",minMaxNorm:"MinMaxNorm",nonNeg:"NonNeg",unitNorm:"UnitNorm"};function serializeConstraint(e){return serializeKerasObject(e)}function deserializeConstraint(e,t){return void 0===t&&(t={}),deserializeKerasObject(e,_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].SerializationMap.getMap().classNameMap,t,"constraint")}function getConstraint(e){return null==e?null:"string"==typeof e?deserializeConstraint({className:e in CONSTRAINT_IDENTIFIER_REGISTRY_SYMBOL_MAP?CONSTRAINT_IDENTIFIER_REGISTRY_SYMBOL_MAP[e]:e,config:{}}):e instanceof Constraint?e:deserializeConstraint(e)}function maxNorm(e){return new MaxNorm(e)}function unitNorm(e){return new UnitNorm(e)}function nonNeg(){return new NonNeg}function minMaxNorm(e){return new MinMaxNorm(e)}var exports_constraints=Object.freeze({maxNorm:maxNorm,unitNorm:unitNorm,nonNeg:nonNeg,minMaxNorm:minMaxNorm}),nameMap=new Map,VALID_DATA_FORMAT_VALUES=["channelsFirst","channelsLast"];function checkDataFormat(e){checkStringTypeUnionValue(VALID_DATA_FORMAT_VALUES,"DataFormat",e)}var VALID_PADDING_MODE_VALUES=["valid","same","causal"];function checkPaddingMode(e){checkStringTypeUnionValue(VALID_PADDING_MODE_VALUES,"PaddingMode",e)}var VALID_POOL_MODE_VALUES=["max","avg"];function checkPoolMode(e){checkStringTypeUnionValue(VALID_POOL_MODE_VALUES,"PoolMode",e)}var _nameScopeStack=[],_nameScopeDivider="/";function nameScope(e,t){_nameScopeStack.push(e);try{var n=t();return _nameScopeStack.pop(),n}catch(e){throw _nameScopeStack.pop(),e}}function currentNameScopePrefix(){return 0===_nameScopeStack.length?"":_nameScopeStack.join(_nameScopeDivider)+_nameScopeDivider}function getScopedTensorName(e){if(!isValidTensorName(e))throw new Error("Not a valid tensor name: '"+e+"'");return currentNameScopePrefix()+e}function getUniqueTensorName(e){if(!isValidTensorName(e))throw new Error("Not a valid tensor name: '"+e+"'");nameMap.has(e)||nameMap.set(e,0);var t=nameMap.get(e);if(nameMap.set(e,nameMap.get(e)+1),t>0){var n=e+"_"+t;return nameMap.set(n,1),n}return e}var tensorNameRegex=new RegExp(/^[A-Za-z][A-Za-z0-9\._\/]*$/);function isValidTensorName(e){return!!e.match(tensorNameRegex)}function isInteger(e){return e===parseInt(e.toString(),10)}function arrayProd(e,t,n){null==t&&(t=0),null==n&&(n=e.length);for(var r=1,i=t;i= 2 but got x shape = "+e.shape+" and y shape = "+t.shape);if(t.rank>=3&&(r=e.shape.slice(-1)[0])!==(o=t.shape.slice(-2)[0]))throw new NotImplementedError("If rank y >= 3, then the second last dim of y must equal the last dim of x but got x shape = "+e.shape+" and y shape = "+t.shape);if(2===e.rank&&2===t.rank)return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["matMul"])(e,t);var n=e.shape.slice(),r=n.pop();e=e.reshape([-1,r]);var i=t.shape.slice(),a=i.pop(),o=i.pop(),s=i.concat([a]),l=Array.from({length:t.rank},function(e,n){return 0===n?t.rank-2:n<=t.rank-2?n-1:n});t=t.transpose(l).reshape([o,-1]);var u=n.concat(s);return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["matMul"])(e,t).reshape(u)}function gather$1(e,t,n){return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){return t=Array.isArray(t)?Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tensor1d"])(t,"int32"):t.toInt(),Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["gather"])(e,t,n)})}function square(e){return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["mulStrict"])(e,e)}function biasAdd(e,t,n){return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){if(null==n&&(n=imageDataFormat()),checkDataFormat(n),1!==t.rank&&t.rank!==e.rank)throw new ValueError("Unexpected bias dimensions: "+t.rank+"; expected it to be 1 or "+e.rank);var r,i=t.shape;if(5===e.rank)"channelsFirst"===n?r=1===i.length?e.add(t.reshape([1,i[0],1,1,1])):e.add(t.reshape([1,i[3],i[0],i[1],i[2]])):"channelsLast"===n&&(r=1===i.length?e.add(t.reshape([1,1,1,1,i[0]])):e.add(t.reshape([1].concat(i))));else if(4===e.rank)"channelsFirst"===n?r=1===i.length?e.add(t.reshape([1,i[0],1,1])):e.add(t.reshape([1,i[2],i[0],i[1]])):"channelsLast"===n&&(r=1===i.length?e.add(t.reshape([1,1,1,i[0]])):e.add(t.reshape([1].concat(i))));else if(3===e.rank)"channelsFirst"===n?r=1===i.length?e.add(t.reshape([1,i[0],1])):e.add(t.reshape([1,i[1],i[0]])):"channelsLast"===n&&(r=1===i.length?e.add(t.reshape([1,1,i[0]])):e.add(t.reshape([1].concat(i))));else{if(!(e.rank<3))throw new ValueError("Unsupported input rank by biasAdd: "+e.rank);r=e.add(t)}return r})}function elu$1(e,t){if(void 0===t&&(t=1),1!==t)throw new NotImplementedError("Support for alpha values other than 1 ("+t+") is not implemented yet.");return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["elu"])(e)}function softsign(e){return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["div"])(e,Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["add"])(getScalar(1),Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["abs"])(e)))})}function dropout(e,t,n,r){return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){if(null!=n&&!_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].arraysEqual(e.shape,n))throw new NotImplementedError("Non-default noise shape is not implemented yet: "+JSON.stringify(n));if(null!=r)throw new NotImplementedError("seed is not implemented for dropout yet.");var i=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["step"])(Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["add"])(Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["neg"])(t),Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["randomUniform"])(e.shape,0,1,"float32")));return i=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["mul"])(Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["div"])(getScalar(1),Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["sub"])(getScalar(1),t)),i),Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["mul"])(e,i)})}function hardSigmoid(e){return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){var t=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["add"])(getScalar(.5),Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["mul"])(getScalar(.2),e));return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["clipByValue"])(t,0,1)})}function inTrainPhase(e,t,n){return void 0===n&&(n=!1),n?e():t()}var VALID_FAN_MODE_VALUES=["fanIn","fanOut","fanAvg"];function checkFanMode(e){checkStringTypeUnionValue(VALID_FAN_MODE_VALUES,"FanMode",e)}var VALID_DISTRIBUTION_VALUES=["normal","uniform"];function checkDistribution(e){checkStringTypeUnionValue(VALID_DISTRIBUTION_VALUES,"Distribution",e)}var Initializer=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return __extends(t,e),t.prototype.fromConfigUsesCustomObjects=function(){return!1},t.prototype.getConfig=function(){return{}},t}(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].Serializable),Zeros=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return __extends(t,e),t.prototype.apply=function(e,t){return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["zeros"])(e,t)},t.className="Zeros",t}(Initializer);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(Zeros);var Ones=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return __extends(t,e),t.prototype.apply=function(e,t){return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["ones"])(e,t)},t.className="Ones",t}(Initializer);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(Ones);var Constant=function(e){function t(t){var n=e.call(this)||this;if("object"!=typeof t)throw new ValueError("Expected argument of type ConstantConfig but got "+t);if(void 0===t.value)throw new ValueError("config must have value set but got "+t);return n.value=t.value,n}return __extends(t,e),t.prototype.apply=function(e,t){var n=this;return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["mul"])(Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["scalar"])(n.value),Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["ones"])(e,t))})},t.prototype.getConfig=function(){return{value:this.value}},t.className="Constant",t}(Initializer);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(Constant);var RandomUniform=function(e){function t(t){var n=e.call(this)||this;return n.DEFAULT_MINVAL=-.05,n.DEFAULT_MAXVAL=.05,n.minval=t.minval||n.DEFAULT_MINVAL,n.maxval=t.maxval||n.DEFAULT_MAXVAL,n.seed=t.seed,n}return __extends(t,e),t.prototype.apply=function(e,t){return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["randomUniform"])(e,this.minval,this.maxval,t)},t.prototype.getConfig=function(){return{minval:this.minval,maxval:this.maxval,seed:this.seed}},t.className="RandomUniform",t}(Initializer);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(RandomUniform);var RandomNormal=function(e){function t(t){var n=e.call(this)||this;return n.DEFAULT_MEAN=0,n.DEFAULT_STDDEV=.05,n.mean=t.mean||n.DEFAULT_MEAN,n.stddev=t.stddev||n.DEFAULT_STDDEV,n.seed=t.seed,n}return __extends(t,e),t.prototype.apply=function(e,t){if("float32"!==(t=t||"float32")&&"int32"!==t)throw new NotImplementedError("randomNormal does not support dType "+t+".");return randomNormal$1(e,this.mean,this.stddev,t,this.seed)},t.prototype.getConfig=function(){return{mean:this.mean,stddev:this.stddev,seed:this.seed}},t.className="RandomNormal",t}(Initializer);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(RandomNormal);var TruncatedNormal=function(e){function t(t){var n=e.call(this)||this;return n.DEFAULT_MEAN=0,n.DEFAULT_STDDEV=.05,n.mean=t.mean||n.DEFAULT_MEAN,n.stddev=t.stddev||n.DEFAULT_STDDEV,n.seed=t.seed,n}return __extends(t,e),t.prototype.apply=function(e,t){if("float32"!==(t=t||"float32")&&"int32"!==t)throw new NotImplementedError("truncatedNormal does not support dType "+t+".");return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["truncatedNormal"])(e,this.mean,this.stddev,t,this.seed)},t.prototype.getConfig=function(){return{mean:this.mean,stddev:this.stddev,seed:this.seed}},t.className="TruncatedNormal",t}(Initializer);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(TruncatedNormal);var Identity=function(e){function t(t){var n=e.call(this)||this;return n.gain=null!=t.gain?Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["scalar"])(t.gain):getScalar(1),n}return __extends(t,e),t.prototype.apply=function(e,t){var n=this;return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){if(2!==e.length||e[0]!==e[1])throw new ValueError("Identity matrix initializer can only be used for 2D square matrices.");return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["mul"])(n.gain,Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["eye"])(e[0]))})},t.prototype.getConfig=function(){return{gain:this.gain.get()}},t.className="Identity",t}(Initializer);function computeFans(e,t){var n,r;if(void 0===t&&(t="channelsLast"),checkDataFormat(t),2===e.length)n=e[0],r=e[1];else if(-1!==[3,4,5].indexOf(e.length)){if("channelsFirst"===t){var i=arrayProd(e,2);n=e[1]*i,r=e[0]*i}else if("channelsLast"===t){i=arrayProd(e,0,e.length-2);n=e[e.length-2]*i,r=e[e.length-1]*i}}else{var a=arrayProd(e);n=Math.sqrt(a),r=Math.sqrt(a)}return[n,r]}_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(Identity);var VarianceScaling=function(e){function t(t){var n=e.call(this)||this;if(t.scale<0)throw new ValueError("scale must be a positive float. Got: "+t.scale);return n.scale=null==t.scale?1:t.scale,n.mode=t.mode,checkFanMode(n.mode),n.distribution=t.distribution,checkDistribution(n.distribution),n.seed=t.seed,n}return __extends(t,e),t.prototype.apply=function(e,t){var n=computeFans(e),r=n[0],i=n[1],a=this.scale;if("fanIn"===this.mode?a/=Math.max(1,r):"fanOut"===this.mode?a/=Math.max(1,i):a/=Math.max(1,(r+i)/2),"normal"===this.distribution){var o=Math.sqrt(a);if("float32"!==(t=t||"float32")&&"int32"!==t)throw new NotImplementedError(this.getClassName()+" does not support dType "+t+".");return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["truncatedNormal"])(e,0,o,t,this.seed)}var s=Math.sqrt(3*a);return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["randomUniform"])(e,-s,s,t)},t.prototype.getConfig=function(){return{scale:this.scale,mode:this.mode,distribution:this.distribution,seed:this.seed}},t.className="VarianceScaling",t}(Initializer);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(VarianceScaling);var GlorotUniform=function(e){function t(t){return e.call(this,{scale:1,mode:"fanAvg",distribution:"uniform",seed:null==t?null:t.seed})||this}return __extends(t,e),t.prototype.getClassName=function(){return VarianceScaling.className},t}(VarianceScaling),GlorotNormal=function(e){function t(t){return e.call(this,{scale:1,mode:"fanAvg",distribution:"normal",seed:null==t?null:t.seed})||this}return __extends(t,e),t.prototype.getClassName=function(){return VarianceScaling.className},t}(VarianceScaling),HeNormal=function(e){function t(t){return e.call(this,{scale:2,mode:"fanIn",distribution:"normal",seed:null==t?null:t.seed})||this}return __extends(t,e),t.prototype.getClassName=function(){return VarianceScaling.className},t}(VarianceScaling),LeCunNormal=function(e){function t(t){return e.call(this,{scale:1,mode:"fanIn",distribution:"normal",seed:null==t?null:t.seed})||this}return __extends(t,e),t.prototype.getClassName=function(){return VarianceScaling.className},t}(VarianceScaling),Orthogonal=function(e){function t(t){var n=e.call(this)||this;if(n.DEFAULT_GAIN=1,n.gain=null==t.gain?n.DEFAULT_GAIN:t.gain,n.seed=t.seed,null!=n.seed)throw new NotImplementedError("Random seed is not implemented for Orthogonal Initializer yet.");return n}return __extends(t,e),t.prototype.apply=function(e,t){var n=this;return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){if(2!==e.length)throw new NotImplementedError("The Orthogonal Initializer does not support non-2D shapes yet.");e[0]*e[1]>2e3&&console.warn("Orthogonal initializer is being called on a matrix with more than 2000 ("+e[0]*e[1]+") elements: Slowness may result.");var t=randomNormal$1(e[0]>e[1]?[e[1],e[0]]:e,0,1,"float32"),r=_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["linalg"].gramSchmidt(t);return e[0]>e[1]&&(r=r.transpose()),Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["mul"])(getScalar(n.gain),r)})},t.prototype.getConfig=function(){return{gain:this.gain,seed:this.seed}},t.className="Orthogonal",t}(Initializer);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(Orthogonal);var INITIALIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP={constant:"Constant",glorotNormal:"GlorotNormal",glorotUniform:"GlorotUniform",heNormal:"HeNormal",identity:"Identity",leCunNormal:"LeCunNormal",ones:"Ones",orthogonal:"Orthogonal",randomNormal:"RandomNormal",randomUniform:"RandomUniform",truncatedNormal:"TruncatedNormal",varianceScaling:"VarianceScaling",zeros:"Zeros"};function deserializeInitializer(e,t){return void 0===t&&(t={}),deserializeKerasObject(e,_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].SerializationMap.getMap().classNameMap,t,"initializer")}function serializeInitializer(e){return serializeKerasObject(e)}function getInitializer(e){if("string"==typeof e){var t=e in INITIALIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP?INITIALIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP[e]:e;return"GlorotUniform"===t?new GlorotUniform:"GlorotNormal"===t?new GlorotNormal:"HeNormal"===t?new HeNormal:"LeCunNormal"===t?new LeCunNormal:deserializeInitializer({className:t,config:{}})}return e instanceof Initializer?e:deserializeInitializer(e)}function zeros$1(){return new Zeros}function ones$1(){return new Ones}function constant(e){return new Constant(e)}function randomUniform$1(e){return new RandomUniform(e)}function randomNormal$2(e){return new RandomNormal(e)}function truncatedNormal$1(e){return new TruncatedNormal(e)}function identity(e){return new Identity(e)}function varianceScaling(e){return new VarianceScaling(e)}function glorotUniform(e){return new GlorotUniform(e)}function glorotNormal(e){return new GlorotNormal(e)}function heNormal(e){return new HeNormal(e)}function leCunNormal(e){return new LeCunNormal(e)}function orthogonal(e){return new Orthogonal(e)}var exports_initializers=Object.freeze({zeros:zeros$1,ones:ones$1,constant:constant,randomUniform:randomUniform$1,randomNormal:randomNormal$2,truncatedNormal:truncatedNormal$1,identity:identity,varianceScaling:varianceScaling,glorotUniform:glorotUniform,glorotNormal:glorotNormal,heNormal:heNormal,leCunNormal:leCunNormal,orthogonal:orthogonal});function isArrayOfShapes(e){return Array.isArray(e)&&Array.isArray(e[0])}function normalizeShapeList(e){return 0===e.length?[]:Array.isArray(e[0])?e:[e]}function getExactlyOneTensor(e){var t;if(Array.isArray(e)){if(1!==e.length)throw new ValueError("Expected Tensor length to be 1; got "+e.length);t=e[0]}else t=e;return t}function getExactlyOneShape(e){if(Array.isArray(e)&&Array.isArray(e[0])){if(1===e.length)return(e=e)[0];throw new ValueError("Expected exactly 1 Shape; got "+e.length)}return e}function countParamsInWeights(e){for(var t=0,n=0,r=e;n1)throw new AttributeError("Layer "+this.name+' has multiple inbound nodes, hence the notion of "layer input" is ill-defined. Use `getInputAt(nodeIndex)` instead.');if(0===this.inboundNodes.length)throw new AttributeError("Layer "+this.name+" is not connected, no input to return.");return singletonOrArray(this.getNodeAtIndex(0,"input").inputTensors)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"output",{get:function(){if(0===this.inboundNodes.length)throw new AttributeError("Layer "+this.name+" has no inbound nodes.");if(this.inboundNodes.length>1)throw new AttributeError("Layer "+this.name+' has multiple inbound nodes, hence the notion of "layer output" is ill-defined. Use `getOutputAt(nodeIndex)` instead.');return singletonOrArray(this.getNodeAtIndex(0,"output").outputTensors)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"losses",{get:function(){return this._losses},enumerable:!0,configurable:!0}),t.prototype.calculateLosses=function(){return this.losses.map(function(e){return e()})},Object.defineProperty(t.prototype,"updates",{get:function(){return this._updates},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"built",{get:function(){return this._built},set:function(e){this._built=e},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"trainableWeights",{get:function(){return this.trainable?this._trainableWeights:[]},set:function(e){this._trainableWeights=e},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"nonTrainableWeights",{get:function(){return this.trainable?this._nonTrainableWeights:this._trainableWeights.concat(this._nonTrainableWeights)},set:function(e){this._nonTrainableWeights=e},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"weights",{get:function(){return this.trainableWeights.concat(this.nonTrainableWeights)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"stateful",{get:function(){return this._stateful},enumerable:!0,configurable:!0}),t.prototype.resetStates=function(){if(!this.stateful)throw new Error("Cannot call the resetStates() method of a non-stateful Layer object.")},t.prototype.assertInputCompatibility=function(e){if(e=toList(e),null!=this.inputSpec&&0!==this.inputSpec.length){var t=toList(this.inputSpec);if(e.length!==t.length)throw new ValueError("Layer "+this.name+" expects "+t.length+" inputs, but it received "+e.length+" input tensors. Input received: "+e);for(var n=0;n=0?o[l]:o[o.length+l];if(null!=u&&-1===[u,null].indexOf(c))throw new ValueError("Input "+n+" is incompatible with layer "+this.name+": expected axis "+l+" of input shape to have value "+u+" but got shape "+o+".")}}if(null!=i.shape)for(var p=0;p0&&Array.isArray(g[0])?g.map(function(r,i){return new SymbolicTensor(m,r,n,toList(e),t,n.name,i)}):new SymbolicTensor(m,g,n,toList(e),t,n.name),n.addInboundNode(e,f,null,null,d,g,t),n._refCount++,null!=n.activityRegularizer)throw new NotImplementedError("Layer invocation in the presence of activity regularizer(s) is not supported yet.");return f})},t.prototype.warnOnIncompatibleInputShape=function(e){if(null!=this.batchInputShape)if(e.length!==this.batchInputShape.length)console.warn("The rank of the input tensor provided (shape: "+JSON.stringify(e)+") does not match that of the batchInputShape ("+JSON.stringify(this.batchInputShape)+") of the layer "+this.name);else{var t=!1;this.batchInputShape.forEach(function(n,r){null!=n&&null!=e[r]&&e[r]!==n&&(t=!0)}),t&&console.warn("The shape of the input tensor ("+JSON.stringify(e)+") does not match the expectation of layer "+this.name+": "+JSON.stringify(this.batchInputShape))}},Object.defineProperty(t.prototype,"outputShape",{get:function(){if(null==this.inboundNodes||0===this.inboundNodes.length)throw new AttributeError("The layer "+this.name+" has never been called and thus has no defined output shape.");for(var e=[],t=0,n=this.inboundNodes;t0)&&(t=e.sourceLayer,n=e.nodeIndex),0===t.inboundNodes.length)return[e];var r=t.inboundNodes[n];if(0===r.inboundLayers.length)return r.inputTensors;for(var i=[],a=0;a1||1===s.length&&s[0].inboundLayers.length>1){t=!1;break}r.push.apply(r,s)}if(t)for(var l=0,u=e.layers;l0&&(r=r.slice(0,r.length-1)+" "),r=(r+=e[i]).slice(0,t[i]),r+=" ".repeat(t[i]-r.length);n(r)}function printLayerSummary(e,t,n){var r;try{r=JSON.stringify(e.outputShape)}catch(e){r="multiple"}printRow([e.name+" ("+e.getClassName()+")",r,e.countParams().toString()],t,n)}function printLayerSummaryWithConnections(e,t,n,r){var i;try{i=JSON.stringify(e.outputShape)}catch(e){i="multiple"}for(var a=[],o=0,s=e.inboundNodes;o0&&-1===n.indexOf(l)))for(var u=0;u0)throw new ValueError(h.length+" of "+i+" weights are not set: "+h)}batchSetValue(c)}var Container=function(e){function t(n){var r=e.call(this,{})||this;if(r.containerNodes=new Set,r.name=n.name,null==r.name){var i=r.getClassName().toLowerCase();r.name=getUid(i)}if(r.supportsMasking=!1,r.trainable=!0,r.updatable=!0,Array.isArray(n.inputs)?r.inputs=n.inputs.slice():r.inputs=[n.inputs],Array.isArray(n.outputs)?r.outputs=n.outputs.slice():r.outputs=[n.outputs],unique(r.inputs).length!==r.inputs.length)throw new ValueError("The list of inputs passed to the model is redundant. All inputs should only appear once. Found: "+r.inputs.map(function(e){return e.name}));unique(r.outputs).length!==r.outputs.length&&console.warn("The list of outputs passed to the model is redundant. All outputs should only appear once. Found: "+r.outputs.map(function(e){return e.name})),r.inputLayers=[],r.inputLayersNodeIndices=[],r.inputLayersTensorIndices=[],r.outputLayers=[],r.outputLayersNodeIndices=[],r.outputLayersTensorIndices=[],r.layers=[];for(var a=0,o=r.outputs;a1 nodes"),assert(0===u,"input layer has >1 tensors"),r.inputLayers.push(s),r.inputLayersNodeIndices.push(l),r.inputLayersTensorIndices.push(u)}r.inputNames=[],r.outputNames=[],r.feedInputShapes=[],r.feedInputNames=[],r.feedOutputNames=[];for(var h=0;h=0;)i.splice(i.indexOf(l),1);w.push(l)}},S=[],A=[],I=0,C=r.outputs;Ir?1:0});for(var j=0,W=U;j0)throw new ValueError("Container instance unexpectedly contains _trainableWeights.The trainable weights of a Container are a union of the trainable weights of its consituent Layers. Its own _trainableWeights must remain an empty Array.");if(!this.trainable)return[];for(var e=[],t=0,n=this.layers;t1)for(var s=0,l=o;s0){for(var d=[],g=0;g0&&e.apply(singletonOrArray(a),r)}function o(e){var r=e.name,a=deserialize(e,null!=t.customObjects?t.customObjects:{});n[r]=a;for(var o=0,s=e.inboundNodes;oe.SKIP_FIRST_BATCHES&&(this.batchDurationsMillis.push(n-this.batchStartMillis),this.batchDurationsMillis.length>=e.DECISION_BATCH_COUNT&&(r=this.batchDurationsMillis.reduce(function(e,t){return e+t})/this.batchDurationsMillis.length,this.autoYieldEveryBatches=Math.round(e.THRESHOLD_MILLIS/r),this.autoYieldEveryBatches<1&&(this.autoYieldEveryBatches=1))),this.batchStartMillis=_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].now(),this.lastYieldBatchCount=this.batchCount,[3,6];case 3:return this.batchCount-this.lastYieldBatchCount>=this.autoYieldEveryBatches?[4,Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["nextFrame"])()]:[3,6];case 4:return i.sent(),[4,this.resolveOneTensorInLogs(t)];case 5:i.sent(),this.lastYieldBatchCount=this.batchCount,i.label=6;case 6:return[3,9];case 7:return"batch"!==this.yieldEvery?[3,9]:[4,Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["nextFrame"])()];case 8:i.sent(),i.label=9;case 9:return[2]}})})},e.prototype.maybeYieldOnEpoch=function(){return __awaiter(this,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return"epoch"!==this.yieldEvery?[3,2]:[4,Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["nextFrame"])()];case 1:e.sent(),e.label=2;case 2:return[2]}})})},e.SKIP_FIRST_BATCHES=1,e.DECISION_BATCH_COUNT=2,e.THRESHOLD_MILLIS=16,e}(),BaseLogger=function(e){function t(t){var n=e.call(this)||this;return n.yieldEvery=t||"auto",n}return __extends(t,e),t.prototype.onTrainBegin=function(e){return __awaiter(this,void 0,void 0,function(){return __generator(this,function(e){return this.autoYielder=new ModelTrainingYielder(this.yieldEvery),[2]})})},t.prototype.onEpochBegin=function(e){return __awaiter(this,void 0,void 0,function(){return __generator(this,function(e){return this.seen=0,this.totals={},[2]})})},t.prototype.onBatchEnd=function(e,t){return __awaiter(this,void 0,void 0,function(){var e,n,r,i,a=this;return __generator(this,function(o){switch(o.label){case 0:return[4,this.autoYielder.maybeYieldOnBatch(t)];case 1:for(i in o.sent(),null==t&&(t={}),e=null==t.size?0:t.size,this.seen+=e,n=function(n){var i=t[n];if("number"==typeof i)r.totals.hasOwnProperty(n)||(r.totals[n]=0),r.totals[n]=r.totals[n]+i*e;else{var o=void 0;n in r.totals?o=r.totals[n]:r.totals[n]=getScalar(0),r.totals[n]=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["add"])(a.totals[n],Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["mul"])(i,getScalar(e)))}),null!=o&&o.dispose()}},r=this,t)n(i);return[2]}})})},t.prototype.onEpochEnd=function(e,t){return __awaiter(this,void 0,void 0,function(){var e,n,r,i,a,o=this;return __generator(this,function(s){switch(s.label){case 0:return[4,this.autoYielder.maybeYieldOnEpoch()];case 1:if(s.sent(),null!=t)for(e=function(e){if(null==n.totals[e])return"continue";"number"==typeof n.totals[e]?t[e]=n.totals[e]/n.seen:Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){t[e]=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["mul"])(Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["div"])(getScalar(1),getScalar(o.seen)),o.totals[e]),o.totals[e].dispose(),Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["keep"])(t[e])})},n=this,r=0,i=this.params.metrics;r=0&&Number.isInteger(t),"Verbosity level is expected to be an integer >= 0, but got "+t),e.checkForDuplicate(n),null==e.constructors[t]&&(e.constructors[t]=[]),e.constructors[t].push(n)},e.checkForDuplicate=function(t){for(var n in e.constructors){e.constructors[+n].forEach(function(e){if(e===t)throw new ValueError("Duplicate callback constructor.")})}},e.clear=function(){e.constructors={}},e.createCallbacks=function(t){var n=[];for(var r in e.constructors){var i=+r;t>=i&&n.push.apply(n,e.constructors[i])}return n.map(function(e){return new e})},e.constructors={},e}();function configureCallbacks(e,t,n,r,i,a,o,s,l,u){var c=new History,p=[new BaseLogger(t)].concat(CallbackConstructorRegistry.createCallbacks(n));null!=e&&p.push.apply(p,e),p.push(c);var h=new CallbackList(p);return h.setParams({epochs:r,initialEpoch:i,samples:a,steps:o,batchSize:s,verbose:n,doValidation:l,metrics:u}),{callbackList:h,history:c}}var LazyIterator=function(){return function(){}}(),Dataset=function(){return function(){}}(),DEFAULT_VALIDATION_BATCH_SIZE=32;function standardizeDataIteratorOutput(e,t){if(e.outputs.length>1)throw new NotImplementedError("Support for training a model with multiple output tensors with a dataset object is not implemented yet.");_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(Array.isArray(t)&&2===t.length,"Dataset iterator for fitDataset() is expected to generate an Array of length 2: `[xs, ys]`, but instead generates "+t);var n=(t=t)[1],r=t[0];if(r instanceof _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Tensor"])return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(1===e.inputs.length,"Model has multiple "+e.inputs.length+" inputs, hence it expects the input dataset to generate a dictionary of tensors (with keys "+JSON.stringify(e.inputNames)+", but received a single tensor."),_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(r.shape[0]===n.shape[0],"Mismatch in batch size between x and y tensors ("+r.shape[0]+" vs. "+n.shape[0]+")"),[r,n];var i=void 0;r=r;for(var a=[],o=0,s=e.inputNames;o0&&Number.isInteger(n.epochs),"For fitDataset(), config.epochs is expected to be a positive integer, but got "+n.epochs),_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(null!=n.batchesPerEpoch&&n.batchesPerEpoch>0&&Number.isInteger(n.batchesPerEpoch),"For fitDataset(), config.batchesPerEpoch is expected to be a positive integer, but got "+n.batchesPerEpoch),e.isTraining)throw new Error("Cannot start training because another fit() call is ongoing.");e.isTraining=!0,k.label=1;case 1:return k.trys.push([1,,21,22]),r=null!=n.validationData,i=void 0,a=void 0,o=void 0,r?n.validationData instanceof Dataset?(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(n.validationBatches>0&&Number.isInteger(n.validationBatches),"For fitDataset() with dataset-based validation, config.validationBatches is expected to be a positive integer, but got "+n.validationBatches),[4,n.validationData.iterator()]):[3,3]:[3,4];case 2:return i=k.sent(),[3,4];case 3:s=standardizeTensorValidationData(n.validationData),a=s.xs,o=s.ys,k.label=4;case 4:return l=e.makeTrainFunction(),u=e.getDedupedMetricsNames(),c=void 0,c=r?u.slice().concat(u.map(function(e){return"val_"+e})):u.slice(),p=standardizeCallbacks(n.callbacks),h=configureCallbacks(p,n.yieldEvery,n.verbose,n.epochs,null,null,n.batchesPerEpoch,null,r,c),d=h.callbackList,g=h.history,e.history=g,[4,d.onTrainBegin()];case 5:return k.sent(),f=null==n.initialEpoch?0:n.initialEpoch,m={},[4,t.iterator()];case 6:y=k.sent(),k.label=7;case 7:return f=n.batchesPerEpoch&&r?(N=void 0,n.validationData instanceof Dataset?(E=toList,[4,e.evaluateDataset(i,{batches:n.validationBatches})]):[3,13]):[3,15];case 12:return N=E.apply(void 0,[k.sent()]),[3,14];case 13:N=toList(e.evaluate(a,o,{batchSize:null==n.validationBatchSize?DEFAULT_VALIDATION_BATCH_SIZE:n.validationBatchSize,verbose:0})),k.label=14;case 14:for(_=0;_0)throw new NotImplementedError("Verbose mode is not implemented yet.");return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(n.batches>0&&Number.isInteger(n.batches),"Test loop expects `batches` to be a positive integer, but received "+JSON.stringify(n.batches)),t instanceof LazyIterator?(o=t,[3,3]):[3,1];case 1:return[4,t.iterator()];case 2:o=h.sent(),h.label=3;case 3:a=o,s=0,l=function(t){var o,l,u,c,p,h;return __generator(this,function(d){switch(d.label){case 0:return[4,a.next()];case 1:if((o=d.sent()).done)return console.warn("Your dataset iterator ran out of data during evaluateDataset(). Interrupting evalution. Make sure that your dataset can generate at least `batches` batches (in this case, "+n.batches+" batches). You may need to use the repeat() function when building your dataset."),[2,"break"];if(l=standardizeDataIteratorOutput(e,o.value),u=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){return r(l)}),Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["dispose"])(l),0===t)for(h=0;h0&&Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["dispose"])(r)},h=0;h0&&Number.isInteger(e),"batchSize is required to be a positive integer, but got "+e)}function sliceArrays(e,t,n){return null==e?[null]:Array.isArray(e)?e.map(function(e){return sliceAlongFirstAxis(e,t,n-t)}):sliceAlongFirstAxis(e,t,n-t)}function sliceArraysByIndices(e,t){return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){return null==e?null:Array.isArray(e)?e.map(function(e){return sliceArraysByIndices(e,t)}):gather$1(e,"int32"===t.dtype?t:t.toInt())})}function makeBatches(e,t){for(var n=[],r=0,i=null;r=e&&(i=e),n.push([r,i]),r=i;return n}function fitLoop(e,t,n,r,i,a,o,s,l,u,c,p,h,d,g,f){return __awaiter(this,void 0,void 0,function(){var m,y,v,b,w,z,S,A;return __generator(this,function(I){switch(I.label){case 0:if(null==i&&(i=32),null==a&&(a=1),null==c&&(c=!0),null==h&&(h=0),m=!1,null!=l&&null!=u&&(m=!0),null!=g&&(m=!0,null==d))throw new ValueError("Can only use `validationSteps` when doing step-wise training, i.e., `stepsPerEpoch` must be set.");return null!=(y=e.checkNumSamples(n,i,d,"steps_per_epoch"))&&(v=range(0,y)),null==o&&(o=1),b=configureCallbacks(s,f,o,a,h,y,d,i,m,p),w=b.callbackList,z=b.history,w.setModel(e),e.history=z,[4,w.onTrainBegin()];case 1:I.sent(),e.stopTraining_=!1,S=function(a){var o,s,p,h,g;return __generator(this,function(f){switch(f.label){case 0:return[4,w.onEpochBegin(a)];case 1:if(f.sent(),o={},null==d)return[3,2];throw new NotImplementedError("stepsPerEpoch mode is not implemented yet.");case 2:if("batch"===c)throw new NotImplementedError("batch shuffling is not implemneted yet");c&&_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].shuffle(v),s=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tensor1d"])(v),p=makeBatches(y,i),h=function(a){var c;return __generator(this,function(h){switch(h.label){case 0:return c={},[4,w.onBatchBegin(a,c)];case 1:return h.sent(),Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){var h=p[a][0],d=p[a][1],g=sliceAlongFirstAxis(s,h,d-h);c.batch=a,c.size=d-h;for(var f=sliceArraysByIndices(n,g),y=t(f),v=0;v0){if(l=!0,2!==r.validationData.length)throw 3===r.validationData.length?new NotImplementedError("validationData including sample weights is not supported yet."):new ValueError("When passing validation data, it must contain 2 (valX, valY) or 3 (valX, valY, valSampleWeight) items; "+r.validationData+" is invalid.");u=r.validationData[0],c=r.validationData[1],d=e.standardizeUserData(u,c,!0,i),u=d[0],c=d[1],p=u.concat(c)}else null!=r.validationSplit&&r.validationSplit>0&&r.validationSplit<1?(l=!0,g=Math.floor(o[0].shape[0]*(1-r.validationSplit)),f=o[0].shape[0],u=sliceArrays(o,g,f),o=sliceArrays(o,0,g),c=sliceArrays(s,g,f),s=sliceArrays(s,0,g),h=!0,p=u.concat(c)):null!=r.validationSteps&&(l=!0);return m=o.concat(s),e.checkTrainableWeightsConsistency(),y=e.makeTrainFunction(),v=e.getDedupedMetricsNames(),b=void 0,w=void 0,l?(e.makeTestFunction(),b=e.testFunction,w=v.slice().concat(v.map(function(e){return"val_"+e}))):(b=null,p=[],w=v.slice()),z=standardizeCallbacks(r.callbacks),[4,fitLoop(e,y,m,v,i,r.epochs,r.verbose,z,b,p,r.shuffle,w,r.initialEpoch,null,null,r.yieldEvery)];case 2:return S=A.sent(),h&&(p.forEach(function(e){return e.dispose()}),o.forEach(function(e){return e.dispose()}),s.forEach(function(e){return e.dispose()})),e.isTraining=!1,[2,S];case 3:return e.isTraining=!1,[7];case 4:return[2]}})})}function isDataTensor(e){return e instanceof _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Tensor"]}function isDataArray(e){return Array.isArray(e)}function isDataDict(e){return!isDataTensor(e)&&!isDataArray(e)}function standardizeInputData(e,t,n,r,i){if(void 0===r&&(r=!0),void 0===i&&(i=""),null==t||0===t.length){if(null!=e){var a=!1;if(isDataArray(e)&&e.length>0)a=!0;else if(isDataDict(e)){for(var o in e)if(e.hasOwnProperty(o)){a=!0;break}}else a=!0;if(a)throw new ValueError("Error when checking model "+i+" expected no data, but got "+e)}return[]}if(null==e)return t.map(function(e){return null});var s;if(isDataDict(e)){e=e,s=[];for(var l=0,u=t;l1)throw new ValueError("The model "+i+" expects "+t.length+" Tensor(s), but only received one Tensor. Found: Tensor with shape "+e.shape);s=[e]}for(var p=0;p=0&&g!==f)throw new ValueError("Error when checking "+i+": expected "+t[p]+" to have shape ["+n[p]+"], but got array with shape ["+h.shape+"].")}}return s}function checkArrayLengths(e,t,n){var r=unique(e.map(function(e){return e.shape[0]}));r.sort();var i=unique(t.map(function(e){return e.shape[0]}));if(i.sort(),r.length>1)throw new ValueError("All input Tensors (x) should have the same number of samples. Got array shapes: "+JSON.stringify(e.map(function(e){return e.shape})));if(i.length>1)throw new ValueError("All target Tensors (y) should have the same number of samples. Got array shapes: "+JSON.stringify(t.map(function(e){return e.shape})));if(r.length>0&&i.length>0&&!_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].arraysEqual(r,i))throw new ValueError("Input Tensors should have the same number of samples as target Tensors. Found "+r[0]+" input sample(s) and "+i[0]+" target sample(s).")}function checkLossAndTargetCompatibility(e,t,n){for(var r=[meanSquaredError,binaryCrossentropy,categoricalCrossentropy],i=0;i1)throw new ValueError("The model expects "+t.length+" "+i+" Tensors, but only received one Tensor. Found: array with shape "+JSON.stringify(e.shape)+".");a=[e]}if(null!=n)for(var o=0;o1&&(t.metricsTensors.push([n,e]),t.metricsNames.push(t.outputNames[e]+"_loss"))}});var p=collectMetrics(e.metrics,this.outputNames);nameScope("metric",function(){for(var e=function(e){if(-1!==c.indexOf(e))return"continue";!function(n){for(var r,i,a,o=function(n){if(-1!==["accuracy","acc","crossentropy","ce"].indexOf(n)){var o=t.internalOutputShapes[e];1===o[o.length-1]||t.lossFunctions[e]===binaryCrossentropy?-1!==["accuracy","acc"].indexOf(n)?i=binaryAccuracy:-1!==["crossentropy","ce"].indexOf(n)&&(i=binaryCrossentropy$1):t.lossFunctions[e]===sparseCategoricalCrossentropy?-1!==["accuracy","acc"].indexOf(n)?i=sparseCategoricalAccuracy:-1!==["crossentropy","ce"].indexOf(n)&&(i=sparseCategoricalCrossentropy$1):-1!==["accuracy","acc"].indexOf(n)?i=categoricalAccuracy:-1!==["crossentropy","ce"].indexOf(n)&&(i=categoricalCrossentropy$1);var s=void 0;-1!==["accuracy","acc"].indexOf(n)?s="acc":-1!==["crossentropy","ce"].indexOf(n)&&(s="ce"),a=i,r=""+s}else{var l=get$1(n);a=l,r=""+n}var u;nameScope(r,function(){u=a}),function(e,n,r){t.outputNames.length>1&&(n=t.outputNames[e]+"_"+n),t.metricsNames.push(n),t.metricsTensors.push([r,e])}(e,r,u)},s=0,l=n;s0){var c=[];throw t.forEach(function(t,n){null==t&&c.push(e[n])}),new ValueError("Cannot find SymbolicTensors for output name(s): "+JSON.stringify(c))}return t},t.prototype.predictLoop=function(e,t,n){var r=this;return void 0===t&&(t=32),void 0===n&&(n=!1),Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){var i=r.checkNumSamples(e);if(n)throw new NotImplementedError("Verbose predictLoop() is not implemented yet.");for(var a=makeBatches(i,t),o=[],s=function(t){var n=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){var n=a[t][0],i=a[t][1],o=sliceArrays(e,n,i),s=[];if(Array.isArray(o))for(var l=0;l0&&e[0].shape[0]%r!=0)throw new ValueError("In a stateful network, you should only pass inputs with a number of samples that is divisible by the batch size "+r+". Found: "+e[0].shape[0]+" sample(s).");return[e,t,null]},t.prototype.testLoop=function(e,t,n,r,i){var a=this;return void 0===r&&(r=0),Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){var o=a.checkNumSamples(t,n,i,"steps"),s=[];if(r>0)throw new NotImplementedError("Verbose mode is not implemented yet.");if(null!=i)throw new NotImplementedError("steps mode in testLoop() is not implemented yet");for(var l=makeBatches(o,n),u=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tensor1d"])(range(0,o)),c=0;c1)i+="_"+count(e.slice(0,n),r);t.push(i)}return t},t.prototype.makeTrainFunction=function(){var e=this;return function(t){var n=t.slice(0,e.inputs.length),r=t.slice(e.inputs.length,e.inputs.length+e.outputs.length),i=[],a=e.collectedTrainableWeights.map(function(e){return e.read()});return[e.optimizer.minimize(function(){for(var t=[],a=0;a1)throw new ValueError("Found more than one ("+n.length+") save handlers for URL '"+e+"'");e=n[0]}if(null==e.save)throw new ValueError("Model.save() cannot proceed because the IOHandler provided does not have the `save` attribute defined.");return[4,_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["io"].encodeWeights(this.getNamedWeights(t))];case 1:return r=s.sent(),i=!1,a=null,o=this.toJSON(a,i),[2,e.save({modelTopology:o,weightData:r.data,weightSpecs:r.specs})]}})})},t.className="Model",t}(Container);function loadModelInternal(e,t){return void 0===t&&(t=!0),__awaiter(this,void 0,void 0,function(){var n;return __generator(this,function(r){if("string"==typeof e){if(0===(n=_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["io"].getLoadHandlers(e)).length)n.push(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["io"].browserHTTPRequest(e));else if(n.length>1)throw new ValueError("Found more than one ("+n.length+") load handlers for URL '"+e+"'");e=n[0]}return[2,loadModelFromIOHandler(e,void 0,t)]})})}function loadModelFromIOHandler(e,t,n){return void 0===n&&(n=!0),__awaiter(this,void 0,void 0,function(){var r,i,a,o,s;return __generator(this,function(l){switch(l.label){case 0:if(null==e.load)throw new ValueError("Cannot proceed with model loading because the IOHandler provided does not have the `load` method implemented.");return[4,e.load()];case 1:if(r=l.sent(),null!=(i=r.modelTopology).model_config&&(i=i.model_config),a=deserialize(convertPythonicToTs(i),t),null!=r.weightData){if(null==r.weightSpecs)throw new ValueError("Model artifacts contains weight data, but not weight specs. Therefore loading of weights cannot proceed.");o=!1,s=!0,a.loadWeights(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["io"].decodeWeights(r.weightData,r.weightSpecs),o,s,n)}return[2,a]}})})}_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(Model);var Sequential=function(e){function t(t){var n=e.call(this,{inputs:[],outputs:[]})||this;if(t=t||{},n.trainable=!0,n._updatable=!0,n.built=!1,n.name=null!=t.name?t.name:getUid("sequential_"),null!=t.layers)for(var r=0,i=t.layers;r 0 but got "+JSON.stringify(e.filters))},t}(BaseConv),Conv2D=function(e){function t(n){var r=e.call(this,2,n)||this;return t.verifyConfig(n),r}return __extends(t,e),t.prototype.getConfig=function(){var t=e.prototype.getConfig.call(this);return delete t.rank,t},t.verifyConfig=function(e){if("number"!=typeof e.kernelSize&&!checkArrayTypeAndLength(e.kernelSize,"number",1,2))throw new ValueError("Conv2D expects config.kernelSize to be number or number[] with length 1 or 2, but received "+JSON.stringify(e.kernelSize)+".")},t.className="Conv2D",t}(Conv);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(Conv2D);var Conv2DTranspose=function(e){function t(t){var n=e.call(this,t)||this;if(n.inputSpec=[new InputSpec({ndim:4})],"same"!==n.padding&&"valid"!==n.padding)throw new ValueError("Conv2DTranspose currently supports only padding modes 'same' and 'valid', but received padding mode "+n.padding);return n}return __extends(t,e),t.prototype.build=function(e){if(4!==(e=getExactlyOneShape(e)).length)throw new ValueError("Input should have rank 4; Received input shape: "+JSON.stringify(e));var t="channelsFirst"===this.dataFormat?1:e.length-1;if(null==e[t])throw new ValueError("The channel dimension of the inputs should be defined. Found `None`.");var n,r=e[t],i=this.kernelSize.concat([this.filters,r]);this.kernel=this.addWeight("kernel",i,"float32",this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.useBias&&(this.bias=this.addWeight("bias",[this.filters],"float32",this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint)),this.inputSpec=[new InputSpec({ndim:4,axes:(n={},n[t]=r,n)})],this.built=!0},t.prototype.call=function(e,t){var n=this;return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){var t=getExactlyOneTensor(e);if(4!==t.shape.length)throw new ValueError("Conv2DTranspose.call() expects input tensor to be rank-4, but received a tensor of rank-"+t.shape.length);var r,i,a=t.shape,o=a[0];"channelsFirst"===n.dataFormat?(r=2,i=3):(r=1,i=2);var s=a[r],l=a[i],u=n.kernelSize[0],c=n.kernelSize[1],p=n.strides[0],h=n.strides[1],d=[o,deconvLength(s,p,u,n.padding),deconvLength(l,h,c,n.padding),n.filters];"channelsLast"!==n.dataFormat&&(t=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["transpose"])(t,[0,2,3,1]));var g=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["conv2dTranspose"])(t,n.kernel.read(),d,n.strides,n.padding);return"channelsLast"!==n.dataFormat&&(g=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["transpose"])(g,[0,3,1,2])),null!=n.bias&&(g=biasAdd(g,n.bias.read(),n.dataFormat)),null!=n.activation&&(g=n.activation.apply(g)),g})},t.prototype.computeOutputShape=function(e){var t,n,r,i=(e=getExactlyOneShape(e)).slice();"channelsFirst"===this.dataFormat?(t=1,n=2,r=3):(t=3,n=1,r=2);var a=this.kernelSize[0],o=this.kernelSize[1],s=this.strides[0],l=this.strides[1];return i[t]=this.filters,i[n]=deconvLength(i[n],s,a,this.padding),i[r]=deconvLength(i[r],l,o,this.padding),i},t.prototype.getConfig=function(){var t=e.prototype.getConfig.call(this);return delete t.dilationRate,t},t.className="Conv2DTranspose",t}(Conv2D);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(Conv2DTranspose);var SeparableConv=function(e){function t(t,n){var r=e.call(this,t,n)||this;if(r.DEFAULT_DEPTHWISE_INITIALIZER="glorotUniform",r.DEFAULT_POINTWISE_INITIALIZER="glorotUniform",r.depthwiseKernel=null,r.pointwiseKernel=null,null==n.filters)throw new ValueError("The `filters` configuration field is required by SeparableConv, but is unspecified.");if(null!=n.kernelInitializer||null!=n.kernelRegularizer||null!=n.kernelConstraint)throw new ValueError("Fields kernelInitializer, kernelRegularizer and kernelConstraint are invalid for SeparableConv2D. Use depthwiseInitializer, depthwiseRegularizer, depthwiseConstraint, pointwiseInitializer, pointwiseRegularizer and pointwiseConstraint instead.");if(null!=n.padding&&"same"!==n.padding&&"valid"!==n.padding)throw new ValueError("SeparableConv"+r.rank+"D supports only padding modes: 'same' and 'valid', but received "+JSON.stringify(n.padding));return r.depthMultiplier=null==n.depthMultiplier?1:n.depthMultiplier,r.depthwiseInitializer=getInitializer(n.depthwiseInitializer||r.DEFAULT_DEPTHWISE_INITIALIZER),r.depthwiseRegularizer=getRegularizer(n.depthwiseRegularizer),r.depthwiseConstraint=getConstraint(n.depthwiseConstraint),r.pointwiseInitializer=getInitializer(n.depthwiseInitializer||r.DEFAULT_POINTWISE_INITIALIZER),r.pointwiseRegularizer=getRegularizer(n.pointwiseRegularizer),r.pointwiseConstraint=getConstraint(n.pointwiseConstraint),r}return __extends(t,e),t.prototype.build=function(e){if((e=getExactlyOneShape(e)).length1)throw new ValueError("Can not merge tensors with different batch sizes. Got tensors with shapes: "+JSON.stringify(e)+".");for(var i=null==e[0]?null:e[0].slice(1),a=1;a1){var y=range(1,s).concat([0]);t.push(Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["transpose"])(h,y)),u=!0}else t.push(h)}var v=n.mergeFunction(t),b=v.rank;if(u)if(null==b){var w=v.shape;f=[g=w[w.length-1]].concat(w.slice(0,w.length-1));v=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["transpose"])(v.reshape([-1,g]),[1,0]).reshape(f)}else if(b>1){y=[b-1].concat(range(0,b-1));v=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["transpose"])(v,y)}return v}return n.mergeFunction(e)})},t.prototype.computeOutputShape=function(e){var t;t=null==(e=e)[0]?null:e[0].slice(1);for(var n=1;n1)throw new ValueError("A `Concatenate` layer requires inputs with matching shapes except for the concat axis. Got input shapes: "+JSON.stringify(e))}},t.prototype.mergeFunction=function(e){var t=this;return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){return concatenate(e,t.axis)})},t.prototype.computeOutputShape=function(e){if(!Array.isArray(e)||!Array.isArray(e[0]))throw new ValueError("A `Concatenate` layer should be called on a list of inputs.");for(var t=e,n=t[0].slice(),r=this.axis<0?n.length+this.axis:this.axis,i=0,a=t.slice(1);i3||t.shape.length>3)throw new NotImplementedError("batchDot is not implemented for tensors of 4D or higher rank yet");if(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(e.shape.length>=2,"batchDot requires the rank of x to be >= 2, but got "+e.shape.length),_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(e.shape.length>=2,"batchDot requires the rank of y to be >= 2, but got "+t.shape.length),"number"==typeof n&&(n=[n,n]),"complex64"===e.dtype||"complex64"===t.dtype)throw new NotImplementedError("batchDot is not implemented for complex64-type Tensors yet.");var r=e.shape.length,i=t.shape.length;null==n&&(n=[r-1,i-2]);var a=n;return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){var n,o;if(r>i){n=r-i;for(var s=[],l=0;lr){n=i-r;for(s=[],l=0;l0){var p=void 0,h=[];for(l=p=r>i?r+i-3:r-1;l3||n.length>3)throw new NotImplementedError("Dot layer does not support tensors of 4D or higher rank yet.");var r=this.interpretAxes(t,n);if(t[r[0]]!==n[r[1]])throw new ValueError("Dimension incompatibility: "+t[r[0]]+" !== "+n[r[1]])},t.prototype.mergeFunction=function(e){if(2!==e.length)throw new ValueError("A `Dot` layer must be called on exactly 2 inputs, but received "+e.length+" input(s).");var t,n=e[0],r=e[1];return t=Array.isArray(this.axes)?this.axes.map(function(t,n){return interpretAxis(t,e[n].shape.length)}):[interpretAxis(this.axes,n.shape.length),interpretAxis(this.axes,r.shape.length)],this.normalize&&(n=l2Normalize(n,t[0]),r=l2Normalize(r,t[1])),batchDot(n,r,t)},t.prototype.interpretAxes=function(e,t){return Array.isArray(this.axes)?this.axes:[interpretAxis(this.axes,e.length),interpretAxis(this.axes,t.length)]},t.prototype.computeOutputShape=function(e){_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(Array.isArray(e)&&2===e.length&&Array.isArray(e[0])&&Array.isArray(e[1]),"A `Dot` layer should be called on a list of exactly 2 inputs.");var t=e[0],n=e[1];if(t.length>3||n.length>3)throw new NotImplementedError("Dot layer does not support tensors of 4D or higher rank yet.");var r=this.interpretAxes(t,n);t.splice(r[0],1),n.splice(r[1],1),n.splice(0,1);var i=t.concat(n);return 1===i.length&&i.push(1),i},t.prototype.computeMask=function(e,t){throw new NotImplementedError("computeMask has not been implemented for Dot yet")},t.prototype.getConfig=function(){var t={axes:this.axes,normalize:this.normalize},n=e.prototype.getConfig.call(this);return Object.assign(t,n),t},t.className="Dot",t}(Merge);function batchNormalization(e,t,n,r,i,a){var o;if(void 0===a&&(a=.001),2===e.rank)o=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["batchNormalization2d"])(e,t,n,a,i,r);else if(3===e.rank)o=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["batchNormalization3d"])(e,t,n,a,i,r);else{if(4!==e.rank)throw new NotImplementedError("batchNormalization is not implememnted for array of rank "+e.rank+" yet");o=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["batchNormalization4d"])(e,t,n,a,i,r)}return o}function regularNormalizeBatchInTraining(e,t,n,r,i){return void 0===i&&(i=.001),Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){var a=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["moments"])(e,r),o=a.mean,s=a.variance;return[batchNormalization(e,o,s,n,t,i),o,s]})}function broadcastNormalizeBatchInTraining(e,t,n,r,i){return void 0===i&&(i=.001),Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){for(var a=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["moments"])(e,r),o=a.mean,s=a.variance,l=[],u=0,c=range(0,e.rank);u=0?this.axis:this.axis+e.length,n=e[t];if(null==n)throw new ValueError("Axis "+t+" of input tensor should have a defined dimension but the layer received an input with shape "+JSON.stringify(e)+".");this.inputSpec=[new InputSpec({ndim:e.length,axes:(r={},r[t]=n,r)})];var r,i=[n];this.scale&&(this.gamma=this.addWeight("gamma",i,null,this.gammaInitializer,this.gammaRegularizer,!0,this.gammaConstraint)),this.center&&(this.beta=this.addWeight("beta",i,null,this.betaInitializer,this.betaRegularizer,!0,this.betaConstraint)),this.movingMean=this.addWeight("moving_mean",i,null,this.movingMeanInitializer,null,!1),this.movingVariance=this.addWeight("moving_variance",i,null,this.movingVarianceInitializer,null,!1),this.built=!0},t.prototype.call=function(e,t){var n=this;return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){var r=null!=t.training&&t.training,i=getExactlyOneTensor(e),a=i.shape,o=a.length,s=range(0,o),l=n.axis>=0?n.axis:n.axis+o;s.splice(l,1);var u=pyListRepeat(1,o);u[l]=a[l];var c=s.slice();c.sort();var p=!_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].arraysEqual(c,range(0,o).slice(0,o-1));if(!r)return function(){if(p){var e=n.movingMean.read().reshape(u),t=n.movingVariance.read().reshape(u),r=n.center?n.beta.read().reshape(u):null,a=n.scale?n.gamma.read().reshape(u):null;return batchNormalization(i,e,t,r,a,n.epsilon)}return batchNormalization(i,n.movingMean.read(),n.movingVariance.read(),null==n.beta?null:n.beta.read(),null==n.gamma?null:n.gamma.read(),n.epsilon)}();var h=normalizeBatchInTraining(i,n.gamma.read(),n.beta.read(),s,n.epsilon),d=h[0],g=h[1],f=h[2],m=arrayProd(s.map(function(e){return i.shape[e]})),y=f.mul(getScalar(m/(m-(1+n.epsilon))));return function(){n.stepCount++;var e=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["movingAverage"])(n.movingMean.read(),g,n.momentum,n.stepCount);n.movingMean.write(e);var t=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["movingAverage"])(n.movingVariance.read(),y,n.momentum,n.stepCount);n.movingVariance.write(t)}(),d})},t.prototype.getConfig=function(){var t={axis:this.axis,momentum:this.momentum,epsilon:this.epsilon,center:this.center,scale:this.scale,betaInitializer:serializeInitializer(this.betaInitializer),gammaInitializer:serializeInitializer(this.gammaInitializer),movingMeanInitializer:serializeInitializer(this.movingMeanInitializer),movingVarianceInitializer:serializeInitializer(this.movingVarianceInitializer),betaRegularizer:serializeRegularizer(this.betaRegularizer),gammaRegularizer:serializeRegularizer(this.gammaRegularizer),betaConstraint:serializeConstraint(this.betaConstraint),gammaConstraint:serializeConstraint(this.gammaConstraint)},n=e.prototype.getConfig.call(this);return Object.assign(t,n),t},t.className="BatchNormalization",t}(Layer);function spatial2dPadding(e,t,n){return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){if(4!==e.rank)throw new ValueError("temporalPadding expects input tensor to be 4-D, but received a "+e.rank+"-D tensor.");if(null==t&&(t=[[1,1],[1,1]]),2!==t.length||2!==t[0].length||2!==t[1].length)throw new ValueError("spatial2dPadding expects `padding` to be an Array of two Arrays, each of which is an Array of two integers.");if(null==n&&(n=imageDataFormat()),"channelsLast"!==n&&"channelsFirst"!==n)throw new ValueError("Unknown data format: "+n+". Supported data formats are 'channelsLast' and 'channelsFirst.");var r;return r="channelsFirst"===n?[[0,0],[0,0],t[0],t[1]]:[[0,0],t[0],t[1],[0,0]],Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["pad"])(e,r)})}_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(BatchNormalization);var ZeroPadding2D=function(e){function t(t){var n=this;if(null==t&&(t={}),(n=e.call(this,t)||this).dataFormat=null==t.dataFormat?imageDataFormat():t.dataFormat,null==t.padding)n.padding=[[1,1],[1,1]];else if("number"==typeof t.padding)n.padding=[[t.padding,t.padding],[t.padding,t.padding]];else{if(t.padding=t.padding,2!==t.padding.length)throw new ValueError("ZeroPadding2D expects padding to be a length-2 array, but received a length-"+t.padding.length+" array.");var r=void 0,i=void 0;if("number"==typeof t.padding[0])r=[t.padding[0],t.padding[0]],i=[t.padding[1],t.padding[1]];else{if(t.padding=t.padding,2!==t.padding[0].length)throw new ValueError("ZeroPadding2D expects height padding to be a length-2 array, but received a length-"+t.padding[0].length+" array.");if(r=t.padding[0],2!==t.padding[1].length)throw new ValueError("ZeroPadding2D expects width padding to be a length-2 array, but received a length-"+t.padding[1].length+" array.");i=t.padding[1]}n.padding=[r,i]}return n.inputSpec=[new InputSpec({ndim:4})],n}return __extends(t,e),t.prototype.computeOutputShape=function(e){var t,n;return e=getExactlyOneShape(e),"channelsFirst"===this.dataFormat?(t=null!=e[2]&&e[2]>=0?e[2]+this.padding[0][0]+this.padding[0][1]:null,n=null!=e[3]&&e[3]>=0?e[3]+this.padding[1][0]+this.padding[1][1]:null,[e[0],e[1],t,n]):(t=null!=e[1]&&e[1]>=0?e[1]+this.padding[0][0]+this.padding[0][1]:null,n=null!=e[2]&&e[2]>=0?e[2]+this.padding[1][0]+this.padding[1][1]:null,[e[0],t,n,e[3]])},t.prototype.call=function(e,t){var n=this;return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){return spatial2dPadding(getExactlyOneTensor(e),n.padding,n.dataFormat)})},t.prototype.getConfig=function(){var t={padding:this.padding,dataFormat:this.dataFormat},n=e.prototype.getConfig.call(this);return Object.assign(t,n),t},t.className="ZeroPadding2D",t}(Layer);function pool2d(e,t,n,r,i,a){return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){var o;checkDataFormat(i),checkPoolMode(a),checkPaddingMode(r),null==n&&(n=[1,1]),null==r&&(r="valid"),null==i&&(i=imageDataFormat()),null==a&&(a="max"),e=preprocessConv2DInput(e,i);var s="same"===r?"same":"valid";return o="max"===a?Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["maxPool"])(e,t,n,s):Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["avgPool"])(e,t,n,s),"channelsFirst"===i&&(o=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["transpose"])(o,[0,3,1,2])),o})}_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(ZeroPadding2D);var Pooling1D=function(e){function t(t){var n=this;if(null==t.poolSize&&(t.poolSize=2),n=e.call(this,t)||this,"number"==typeof t.poolSize)n.poolSize=[t.poolSize];else{if(!Array.isArray(t.poolSize)||1!==t.poolSize.length||"number"!=typeof t.poolSize[0])throw new ValueError("poolSize for 1D convolutional layer must be a number or an Array of a single number, but received "+JSON.stringify(t.poolSize));n.poolSize=t.poolSize}if(null==t.strides)n.strides=n.poolSize;else if("number"==typeof t.strides)n.strides=[t.strides];else{if(!Array.isArray(t.strides)||1!==t.strides.length||"number"!=typeof t.strides[0])throw new ValueError("strides for 1D convolutional layer must be a number or an Array of a single number, but received "+JSON.stringify(t.strides));n.strides=t.strides}return n.padding=null==t.padding?"valid":t.padding,checkPaddingMode(n.padding),n.inputSpec=[new InputSpec({ndim:3})],n}return __extends(t,e),t.prototype.computeOutputShape=function(e){var t=convOutputLength((e=getExactlyOneShape(e))[1],this.poolSize[0],this.padding,this.strides[0]);return[e[0],t,e[2]]},t.prototype.call=function(e,t){var n=this;return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){n.invokeCallHook(e,t),e=expandDims(getExactlyOneTensor(e),2);var r=n.poolingFunction(getExactlyOneTensor(e),[n.poolSize[0],1],[n.strides[0],1],n.padding,"channelsLast");return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["squeeze"])(r,[2])})},t.prototype.getConfig=function(){var t={poolSize:this.poolSize,padding:this.padding,strides:this.strides},n=e.prototype.getConfig.call(this);return Object.assign(t,n),t},t}(Layer),MaxPooling1D=function(e){function t(t){return e.call(this,t)||this}return __extends(t,e),t.prototype.poolingFunction=function(e,t,n,r,i){return checkDataFormat(i),checkPaddingMode(r),pool2d(e,t,n,r,i,"max")},t.className="MaxPooling1D",t}(Pooling1D);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(MaxPooling1D);var AveragePooling1D=function(e){function t(t){return e.call(this,t)||this}return __extends(t,e),t.prototype.poolingFunction=function(e,t,n,r,i){return checkDataFormat(i),checkPaddingMode(r),pool2d(e,t,n,r,i,"avg")},t.className="AveragePooling1D",t}(Pooling1D);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(AveragePooling1D);var Pooling2D=function(e){function t(t){var n=this;if(null==t.poolSize&&(t.poolSize=[2,2]),(n=e.call(this,t)||this).poolSize=Array.isArray(t.poolSize)?t.poolSize:[t.poolSize,t.poolSize],null==t.strides)n.strides=n.poolSize;else if(Array.isArray(t.strides)){if(2!==t.strides.length)throw new ValueError("If the strides property of a 2D pooling layer is an Array, it is expected to have a length of 2, but received length "+t.strides.length+".");n.strides=t.strides}else n.strides=[t.strides,t.strides];return n.padding=null==t.padding?"valid":t.padding,n.dataFormat=null==t.dataFormat?"channelsLast":t.dataFormat,checkDataFormat(n.dataFormat),checkPaddingMode(n.padding),n.inputSpec=[new InputSpec({ndim:4})],n}return __extends(t,e),t.prototype.computeOutputShape=function(e){e=getExactlyOneShape(e);var t="channelsFirst"===this.dataFormat?e[2]:e[1],n="channelsFirst"===this.dataFormat?e[3]:e[2];return t=convOutputLength(t,this.poolSize[0],this.padding,this.strides[0]),n=convOutputLength(n,this.poolSize[1],this.padding,this.strides[1]),"channelsFirst"===this.dataFormat?[e[0],e[1],t,n]:[e[0],t,n,e[3]]},t.prototype.call=function(e,t){var n=this;return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){return n.invokeCallHook(e,t),n.poolingFunction(getExactlyOneTensor(e),n.poolSize,n.strides,n.padding,n.dataFormat)})},t.prototype.getConfig=function(){var t={poolSize:this.poolSize,padding:this.padding,strides:this.strides,dataFormat:this.dataFormat},n=e.prototype.getConfig.call(this);return Object.assign(t,n),t},t}(Layer),MaxPooling2D=function(e){function t(t){return e.call(this,t)||this}return __extends(t,e),t.prototype.poolingFunction=function(e,t,n,r,i){return checkDataFormat(i),checkPaddingMode(r),pool2d(e,t,n,r,i,"max")},t.className="MaxPooling2D",t}(Pooling2D);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(MaxPooling2D);var AveragePooling2D=function(e){function t(t){return e.call(this,t)||this}return __extends(t,e),t.prototype.poolingFunction=function(e,t,n,r,i){return checkDataFormat(i),checkPaddingMode(r),pool2d(e,t,n,r,i,"avg")},t.className="AveragePooling2D",t}(Pooling2D);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(AveragePooling2D);var GlobalPooling1D=function(e){function t(t){var n=e.call(this,t)||this;return n.inputSpec=[new InputSpec({ndim:3})],n}return __extends(t,e),t.prototype.computeOutputShape=function(e){return[e[0],e[2]]},t.prototype.call=function(e,t){throw new NotImplementedError},t}(Layer),GlobalAveragePooling1D=function(e){function t(t){return e.call(this,t)||this}return __extends(t,e),t.prototype.call=function(e,t){return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){var t=getExactlyOneTensor(e);return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["mean"])(t,1)})},t.className="GlobalAveragePooling1D",t}(GlobalPooling1D);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(GlobalAveragePooling1D);var GlobalMaxPooling1D=function(e){function t(t){return e.call(this,t)||this}return __extends(t,e),t.prototype.call=function(e,t){return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){var t=getExactlyOneTensor(e);return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["max"])(t,1)})},t.className="GlobalMaxPooling1D",t}(GlobalPooling1D);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(GlobalMaxPooling1D);var GlobalPooling2D=function(e){function t(t){var n=e.call(this,t)||this;return n.dataFormat=null==t.dataFormat?"channelsLast":t.dataFormat,checkDataFormat(n.dataFormat),n.inputSpec=[new InputSpec({ndim:4})],n}return __extends(t,e),t.prototype.computeOutputShape=function(e){return e=e,"channelsLast"===this.dataFormat?[e[0],e[3]]:[e[0],e[1]]},t.prototype.call=function(e,t){throw new NotImplementedError},t.prototype.getConfig=function(){var t={dataFormat:this.dataFormat},n=e.prototype.getConfig.call(this);return Object.assign(t,n),t},t}(Layer),GlobalAveragePooling2D=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return __extends(t,e),t.prototype.call=function(e,t){var n=this;return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){var t=getExactlyOneTensor(e);return"channelsLast"===n.dataFormat?Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["mean"])(t,[1,2]):Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["mean"])(t,[2,3])})},t.className="GlobalAveragePooling2D",t}(GlobalPooling2D);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(GlobalAveragePooling2D);var GlobalMaxPooling2D=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return __extends(t,e),t.prototype.call=function(e,t){var n=this;return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){var t=getExactlyOneTensor(e);return"channelsLast"===n.dataFormat?Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["max"])(t,[1,2]):Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["max"])(t,[2,3])})},t.className="GlobalMaxPooling2D",t}(GlobalPooling2D);function standardizeArgs(e,t,n,r){if(Array.isArray(e)){if(null!=t||null!=n)throw new ValueError("When inputs is an array, neither initialState or constants should be provided");null!=r&&(n=e.slice(e.length-r,e.length),e=e.slice(0,e.length-r)),e.length>1&&(t=e.slice(1,e.length)),e=e[0]}function i(e){return null==e||Array.isArray(e)?e:[e]}return{inputs:e,initialState:t=i(t),constants:n=i(n)}}function rnn(e,t,n,r,i,a,o,s){void 0===r&&(r=!1),void 0===o&&(o=!1),void 0===s&&(s=!1);var l=t.shape.length;if(l<3)throw new ValueError("Input should be at least 3D, but is "+l+"D.");var u,c,p=[1,0].concat(range(2,l));if(t=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["transpose"])(t,p),null!=i)throw new NotImplementedError("The rnn() function of the deeplearn.js backend does not support masking yet.");if(null!=a)throw new NotImplementedError("The rnn() functoin of the deeplearn.js backend does not support constants yet.");o&&console.warn("Backend rnn(): the unroll = true option is not applicable to the imperative deeplearn.js backend."),r&&(t=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["reverse"])(t,0));for(var h=n,d=t.shape[0],g=function(n){var r=sliceAlongFirstAxis(t,n,1);r=r.reshape(r.shape.slice(1));var i=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){return e(r,h)});if(c=i[0],s)if(0===n)u=c.expandDims(1);else{var a=Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["concat"])([u,c.expandDims(1)],1);u.dispose(),u=a}h=i[1]},f=0;f1?tile$1(n,[1,e]):n}):t.cell.stateSize>1?[tile$1(n,[1,t.cell.stateSize])]:[n]})},Object.defineProperty(t.prototype,"trainableWeights",{get:function(){return this.trainable?this.cell.trainableWeights:[]},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"nonTrainableWeights",{get:function(){return this.trainable?this.cell.nonTrainableWeights:this.cell.weights},enumerable:!0,configurable:!0}),t.prototype.getConfig=function(){var t={returnSequences:this.returnSequences,returnState:this.returnState,goBackwards:this.goBackwards,stateful:this.stateful,unroll:this.unroll};null!=this.numConstants&&(t.numConstants=this.numConstants);var n=this.cell.getConfig();t.cell={className:this.cell.getClassName(),config:n};var r=e.prototype.getConfig.call(this);return Object.assign(t,r),t},t.className="RNN",t}(Layer);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(RNN);var RNNCell=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return __extends(t,e),t}(Layer),SimpleRNNCell=function(e){function t(t){var n=e.call(this,t)||this;return n.DEFAULT_ACTIVATION="tanh",n.DEFAULT_KERNEL_INITIALIZER="glorotNormal",n.DEFAULT_RECURRENT_INITIALIZER="orthogonal",n.DEFAULT_BIAS_INITIALIZER="zeros",n.units=t.units,n.activation=getActivation(null==t.activation?n.DEFAULT_ACTIVATION:t.activation),n.useBias=null==t.useBias||t.useBias,n.kernelInitializer=getInitializer(t.kernelInitializer||n.DEFAULT_KERNEL_INITIALIZER),n.recurrentInitializer=getInitializer(t.recurrentInitializer||n.DEFAULT_RECURRENT_INITIALIZER),n.biasInitializer=getInitializer(t.biasInitializer||n.DEFAULT_BIAS_INITIALIZER),n.kernelRegularizer=getRegularizer(t.kernelRegularizer),n.recurrentRegularizer=getRegularizer(t.recurrentRegularizer),n.biasRegularizer=getRegularizer(t.biasRegularizer),n.kernelConstraint=getConstraint(t.kernelConstraint),n.recurrentConstraint=getConstraint(t.recurrentConstraint),n.biasConstraint=getConstraint(t.biasConstraint),n.dropout=min$1([1,max$1([0,null==t.dropout?0:t.dropout])]),n.recurrentDropout=min$1([1,max$1([0,null==t.recurrentDropout?0:t.recurrentDropout])]),n.stateSize=n.units,n.dropoutMask=null,n.recurrentDropoutMask=null,n}return __extends(t,e),t.prototype.build=function(e){e=getExactlyOneShape(e),this.kernel=this.addWeight("kernel",[e[e.length-1],this.units],null,this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.recurrentKernel=this.addWeight("recurrent_kernel",[this.units,this.units],null,this.recurrentInitializer,this.recurrentRegularizer,!0,this.recurrentConstraint),this.useBias?this.bias=this.addWeight("bias",[this.units],null,this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint):this.bias=null,this.built=!0},t.prototype.call=function(e,t){var n=this;return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){if(2!==(e=e).length)throw new ValueError("SimpleRNNCell expects 2 input Tensors, got "+e.length+".");var r=e[1];e=e[0];var i,a=null!=t.training&&t.training;01){for(var a=[],o=0;o= 3D, but received input shape "+JSON.stringify(t));this.inputSpec=[{shape:t}];var n=[t[0]].concat(t.slice(2));this.layer.built||(this.layer.build(n),this.layer.built=!0),e.prototype.build.call(this,t)},t.prototype.computeOutputShape=function(e){var t=[(e=getExactlyOneShape(e))[0]].concat(e.slice(2)),n=this.layer.computeOutputShape(t),r=e[1];return[n[0],r].concat(n.slice(1))},t.prototype.call=function(e,t){var n=this;return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tidy"])(function(){return rnn(function(e,r){return[getExactlyOneTensor(n.layer.call(e,t)),[]]},e=getExactlyOneTensor(e),[],!1,null,null,!1,!0)[1]})},t.className="TimeDistributed",t}(Wrapper);_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["serialization"].registerClass(TimeDistributed);var VALID_BIDIRECTIONAL_MERGE_MODES=["sum","mul","concat","ave"];function checkBidirectionalMergeMode(e){checkStringTypeUnionValue(VALID_BIDIRECTIONAL_MERGE_MODES,"BidirectionalMergeMode",e)}var Bidirectional=function(e){function t(t){var n=e.call(this,t)||this,r=t.layer.getConfig();if(n.forwardLayer=deserialize({className:t.layer.getClassName(),config:r}),r.goBackwards=!0!==r.goBackwards,n.backwardLayer=deserialize({className:t.layer.getClassName(),config:r}),n.forwardLayer.name="forward_"+n.forwardLayer.name,n.backwardLayer.name="backward_"+n.backwardLayer.name,checkBidirectionalMergeMode(t.mergeMode),n.mergeMode=t.mergeMode,t.weights)throw new NotImplementedError("weights support is not implemented for Bidirectional layer yet.");return n._stateful=t.layer.stateful,n.returnSequences=t.layer.returnSequences,n.returnState=t.layer.returnState,n.supportsMasking=!0,n._trainable=!0,n.inputSpec=t.layer.inputSpec,n.numConstants=null,n}return __extends(t,e),Object.defineProperty(t.prototype,"trainable",{get:function(){return this._trainable},set:function(e){this._trainable=e,null!=this.forwardLayer&&(this.forwardLayer.trainable=e),null!=this.backwardLayer&&(this.backwardLayer.trainable=e)},enumerable:!0,configurable:!0}),t.prototype.getWeights=function(){return this.forwardLayer.getWeights().concat(this.backwardLayer.getWeights())},t.prototype.setWeights=function(e){var t=e.length,n=Math.floor(t/2);this.forwardLayer.setWeights(e.slice(0,n)),this.backwardLayer.setWeights(e.slice(n))},t.prototype.computeOutputShape=function(e){var t,n,r,i=this.forwardLayer.computeOutputShape(e);return Array.isArray(i)&&Array.isArray(i[0])||(i=[i]),i=i,this.returnState?(r=i.slice(1),t=i[0]):t=i[0],t=t,"concat"===this.mergeMode?(t[t.length-1]*=2,n=[t]):n=null==this.mergeMode?[t,t.slice()]:[t],this.returnState?null==this.mergeMode?n.concat(r).concat(r.slice()):[t].concat(r).concat(r.slice()):singletonOrArray(n)},t.prototype.apply=function(t,n){var r=null==n?null:n.initialState,i=null==n?null:n.constants;null==n&&(n={});var a=standardizeArgs(t,r,i,this.numConstants);if(t=a.inputs,r=a.initialState,i=a.constants,Array.isArray(t)&&(r=t.slice(1),t=t[0]),(null==r||0===r.length)&&null==i)return e.prototype.apply.call(this,t,n);var o=[],s=[];if(null!=r){var l=r.length;if(l%2>0)throw new ValueError("When passing `initialState` to a Bidrectional RNN, the state should be an Array containing the states of the underlying RNNs.");n.initialState=r,o.push.apply(o,r);var u=r.map(function(e){return new InputSpec({shape:e.shape})});this.forwardLayer.stateSpec=u.slice(0,l/2),this.backwardLayer.stateSpec=u.slice(l/2),s.push.apply(s,u)}if(null!=i)throw new NotImplementedError("Support for constants in Bidirectional layers is not implemented yet.");for(var c=o[0]instanceof SymbolicTensor,p=0,h=o;p 0 ? 1000 / this.deltaTime : 0; if(this.deltaTime){ return 1000 / this.deltaTime; } }, /** * get the explicit FPS limit set via `Animitter#setFPS(fps)` or * via the initial `options.fps` property * * @returns {Number} either as set or Infinity */ getFPSLimit: function(){ return this.__fps; }, /** * get the number of frames that have occurred * * @return {Number} */ getFrameCount: function(){ return this.frameCount; }, /** * get the object providing `requestAnimationFrame` * and `cancelAnimationFrame` methods * @return {Object} */ getRequestAnimationFrameObject: function(){ return this.requestAnimationFrameObject; }, /** * is the animation loop active * * @return {boolean} */ isRunning: function(){ return this.__running; }, /** * is the animation marked as completed * * @return {boolean} */ isCompleted: function(){ return this.__completed; }, /** * reset the animation loop, marks as incomplete, * leaves listeners intact * * @emit Animitter#reset * @return {Animitter} */ reset: function(){ this.stop(); this.__completed = false; this.__lastTime = 0; this.deltaTime = 0; this.elapsedTime = 0; this.frameCount = 0; this.emit('reset', 0, 0, this.frameCount); return this; }, /** * set the framerate for the animation loop * * @param {Number} fps * @return {Animitter} */ setFPS: function(fps){ this.__fps = fps; this.__isReadyForUpdate = makeThrottle(fps); return this; }, /** * set the object that will provide `requestAnimationFrame` * and `cancelAnimationFrame` methods to this instance * @param {Object} object * @return {Animitter} */ setRequestAnimationFrameObject: function(object){ if(typeof object.requestAnimationFrame !== 'function' || typeof object.cancelAnimationFrame !== 'function'){ throw new Error("Invalid object provide to `setRequestAnimationFrameObject`"); } this.requestAnimationFrameObject = object; return this; }, /** * start an animation loop * @emit Animitter#start * @return {Animitter} */ start: function(){ var self = this; if(this.__delay){ setTimeout(function(){ onStart(self); }, this.__delay); } else { onStart(this); } return this; }, /** * stops the animation loop, does not mark as completed * * @emit Animitter#stop * @return {Animitter} */ stop: function(){ if( this.__running ){ this.__running = false; exports.running -= 1; this.emit('stop', this.deltaTime, this.elapsedTime, this.frameCount); } return this; }, /** * update the animation loop once * * @emit Animitter#update * @return {Animitter} */ update: function(){ this.frameCount++; /** @private */ var now = Date.now(); this.__lastTime = this.__lastTime || now; this.deltaTime = (this.fixedDelta || exports.globalFixedDelta) ? 1000/Math.min(60, this.__fps) : now - this.__lastTime; this.elapsedTime += this.deltaTime; this.__lastTime = now; this.emit('update', this.deltaTime, this.elapsedTime, this.frameCount); return this; } }; for(var method in methods){ Animitter.prototype[method] = methods[method]; } /** * create an animitter instance, * @param {Object} [options] * @param {Function} fn( deltaTime:Number, elapsedTime:Number, frameCount:Number ) * @returns {Animitter} */ function createAnimitter(options, fn){ if( arguments.length === 1 && typeof options === 'function'){ fn = options; options = {}; } var _instance = new Animitter( options ); if( fn ){ _instance.on('update', fn); } return _instance; } module.exports = exports = createAnimitter; /** * create an animitter instance, * where the scope is bound in all functions * @param {Object} [options] * @param {Function} fn( deltaTime:Number, elapsedTime:Number, frameCount:Number ) * @returns {Animitter} */ exports.bound = function(options, fn){ var loop = createAnimitter(options, fn), functionKeys = functions(Animitter.prototype), hasBind = !!Function.prototype.bind, fnKey; for(var i=0; i> 6]; var primitive = (tag & 0x20) === 0; // Multi-octet tag - load if ((tag & 0x1f) === 0x1f) { var oct = tag; tag = 0; while ((oct & 0x80) === 0x80) { oct = buf.readUInt8(fail); if (buf.isError(oct)) return oct; tag <<= 7; tag |= oct & 0x7f; } } else { tag &= 0x1f; } var tagStr = der.tag[tag]; return { cls: cls, primitive: primitive, tag: tag, tagStr: tagStr }; } function derDecodeLen(buf, primitive, fail) { var len = buf.readUInt8(fail); if (buf.isError(len)) return len; // Indefinite form if (!primitive && len === 0x80) return null; // Definite form if ((len & 0x80) === 0) { // Short form return len; } // Long form var num = len & 0x7f; if (num > 4) return buf.error('length octect is too long'); len = 0; for (var i = 0; i < num; i++) { len <<= 8; var j = buf.readUInt8(fail); if (buf.isError(j)) return j; len |= j; } return len; } /***/ }), /***/ "./node_modules/asn1.js/lib/asn1/decoders/index.js": /*!*********************************************************!*\ !*** ./node_modules/asn1.js/lib/asn1/decoders/index.js ***! \*********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var decoders = exports; decoders.der = __webpack_require__(/*! ./der */ "./node_modules/asn1.js/lib/asn1/decoders/der.js"); decoders.pem = __webpack_require__(/*! ./pem */ "./node_modules/asn1.js/lib/asn1/decoders/pem.js"); /***/ }), /***/ "./node_modules/asn1.js/lib/asn1/decoders/pem.js": /*!*******************************************************!*\ !*** ./node_modules/asn1.js/lib/asn1/decoders/pem.js ***! \*******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js"); var Buffer = __webpack_require__(/*! buffer */ "./node_modules/buffer/index.js").Buffer; var DERDecoder = __webpack_require__(/*! ./der */ "./node_modules/asn1.js/lib/asn1/decoders/der.js"); function PEMDecoder(entity) { DERDecoder.call(this, entity); this.enc = 'pem'; }; inherits(PEMDecoder, DERDecoder); module.exports = PEMDecoder; PEMDecoder.prototype.decode = function decode(data, options) { var lines = data.toString().split(/[\r\n]+/g); var label = options.label.toUpperCase(); var re = /^-----(BEGIN|END) ([^-]+)-----$/; var start = -1; var end = -1; for (var i = 0; i < lines.length; i++) { var match = lines[i].match(re); if (match === null) continue; if (match[2] !== label) continue; if (start === -1) { if (match[1] !== 'BEGIN') break; start = i; } else { if (match[1] !== 'END') break; end = i; break; } } if (start === -1 || end === -1) throw new Error('PEM section not found for: ' + label); var base64 = lines.slice(start + 1, end).join(''); // Remove excessive symbols base64.replace(/[^a-z0-9\+\/=]+/gi, ''); var input = new Buffer(base64, 'base64'); return DERDecoder.prototype.decode.call(this, input, options); }; /***/ }), /***/ "./node_modules/asn1.js/lib/asn1/encoders/der.js": /*!*******************************************************!*\ !*** ./node_modules/asn1.js/lib/asn1/encoders/der.js ***! \*******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js"); var Buffer = __webpack_require__(/*! buffer */ "./node_modules/buffer/index.js").Buffer; var asn1 = __webpack_require__(/*! ../../asn1 */ "./node_modules/asn1.js/lib/asn1.js"); var base = asn1.base; // Import DER constants var der = asn1.constants.der; function DEREncoder(entity) { this.enc = 'der'; this.name = entity.name; this.entity = entity; // Construct base tree this.tree = new DERNode(); this.tree._init(entity.body); }; module.exports = DEREncoder; DEREncoder.prototype.encode = function encode(data, reporter) { return this.tree._encode(data, reporter).join(); }; // Tree methods function DERNode(parent) { base.Node.call(this, 'der', parent); } inherits(DERNode, base.Node); DERNode.prototype._encodeComposite = function encodeComposite(tag, primitive, cls, content) { var encodedTag = encodeTag(tag, primitive, cls, this.reporter); // Short form if (content.length < 0x80) { var header = new Buffer(2); header[0] = encodedTag; header[1] = content.length; return this._createEncoderBuffer([ header, content ]); } // Long form // Count octets required to store length var lenOctets = 1; for (var i = content.length; i >= 0x100; i >>= 8) lenOctets++; var header = new Buffer(1 + 1 + lenOctets); header[0] = encodedTag; header[1] = 0x80 | lenOctets; for (var i = 1 + lenOctets, j = content.length; j > 0; i--, j >>= 8) header[i] = j & 0xff; return this._createEncoderBuffer([ header, content ]); }; DERNode.prototype._encodeStr = function encodeStr(str, tag) { if (tag === 'bitstr') { return this._createEncoderBuffer([ str.unused | 0, str.data ]); } else if (tag === 'bmpstr') { var buf = new Buffer(str.length * 2); for (var i = 0; i < str.length; i++) { buf.writeUInt16BE(str.charCodeAt(i), i * 2); } return this._createEncoderBuffer(buf); } else if (tag === 'numstr') { if (!this._isNumstr(str)) { return this.reporter.error('Encoding of string type: numstr supports ' + 'only digits and space'); } return this._createEncoderBuffer(str); } else if (tag === 'printstr') { if (!this._isPrintstr(str)) { return this.reporter.error('Encoding of string type: printstr supports ' + 'only latin upper and lower case letters, ' + 'digits, space, apostrophe, left and rigth ' + 'parenthesis, plus sign, comma, hyphen, ' + 'dot, slash, colon, equal sign, ' + 'question mark'); } return this._createEncoderBuffer(str); } else if (/str$/.test(tag)) { return this._createEncoderBuffer(str); } else if (tag === 'objDesc') { return this._createEncoderBuffer(str); } else { return this.reporter.error('Encoding of string type: ' + tag + ' unsupported'); } }; DERNode.prototype._encodeObjid = function encodeObjid(id, values, relative) { if (typeof id === 'string') { if (!values) return this.reporter.error('string objid given, but no values map found'); if (!values.hasOwnProperty(id)) return this.reporter.error('objid not found in values map'); id = values[id].split(/[\s\.]+/g); for (var i = 0; i < id.length; i++) id[i] |= 0; } else if (Array.isArray(id)) { id = id.slice(); for (var i = 0; i < id.length; i++) id[i] |= 0; } if (!Array.isArray(id)) { return this.reporter.error('objid() should be either array or string, ' + 'got: ' + JSON.stringify(id)); } if (!relative) { if (id[1] >= 40) return this.reporter.error('Second objid identifier OOB'); id.splice(0, 2, id[0] * 40 + id[1]); } // Count number of octets var size = 0; for (var i = 0; i < id.length; i++) { var ident = id[i]; for (size++; ident >= 0x80; ident >>= 7) size++; } var objid = new Buffer(size); var offset = objid.length - 1; for (var i = id.length - 1; i >= 0; i--) { var ident = id[i]; objid[offset--] = ident & 0x7f; while ((ident >>= 7) > 0) objid[offset--] = 0x80 | (ident & 0x7f); } return this._createEncoderBuffer(objid); }; function two(num) { if (num < 10) return '0' + num; else return num; } DERNode.prototype._encodeTime = function encodeTime(time, tag) { var str; var date = new Date(time); if (tag === 'gentime') { str = [ two(date.getFullYear()), two(date.getUTCMonth() + 1), two(date.getUTCDate()), two(date.getUTCHours()), two(date.getUTCMinutes()), two(date.getUTCSeconds()), 'Z' ].join(''); } else if (tag === 'utctime') { str = [ two(date.getFullYear() % 100), two(date.getUTCMonth() + 1), two(date.getUTCDate()), two(date.getUTCHours()), two(date.getUTCMinutes()), two(date.getUTCSeconds()), 'Z' ].join(''); } else { this.reporter.error('Encoding ' + tag + ' time is not supported yet'); } return this._encodeStr(str, 'octstr'); }; DERNode.prototype._encodeNull = function encodeNull() { return this._createEncoderBuffer(''); }; DERNode.prototype._encodeInt = function encodeInt(num, values) { if (typeof num === 'string') { if (!values) return this.reporter.error('String int or enum given, but no values map'); if (!values.hasOwnProperty(num)) { return this.reporter.error('Values map doesn\'t contain: ' + JSON.stringify(num)); } num = values[num]; } // Bignum, assume big endian if (typeof num !== 'number' && !Buffer.isBuffer(num)) { var numArray = num.toArray(); if (!num.sign && numArray[0] & 0x80) { numArray.unshift(0); } num = new Buffer(numArray); } if (Buffer.isBuffer(num)) { var size = num.length; if (num.length === 0) size++; var out = new Buffer(size); num.copy(out); if (num.length === 0) out[0] = 0 return this._createEncoderBuffer(out); } if (num < 0x80) return this._createEncoderBuffer(num); if (num < 0x100) return this._createEncoderBuffer([0, num]); var size = 1; for (var i = num; i >= 0x100; i >>= 8) size++; var out = new Array(size); for (var i = out.length - 1; i >= 0; i--) { out[i] = num & 0xff; num >>= 8; } if(out[0] & 0x80) { out.unshift(0); } return this._createEncoderBuffer(new Buffer(out)); }; DERNode.prototype._encodeBool = function encodeBool(value) { return this._createEncoderBuffer(value ? 0xff : 0); }; DERNode.prototype._use = function use(entity, obj) { if (typeof entity === 'function') entity = entity(obj); return entity._getEncoder('der').tree; }; DERNode.prototype._skipDefault = function skipDefault(dataBuffer, reporter, parent) { var state = this._baseState; var i; if (state['default'] === null) return false; var data = dataBuffer.join(); if (state.defaultBuffer === undefined) state.defaultBuffer = this._encodeValue(state['default'], reporter, parent).join(); if (data.length !== state.defaultBuffer.length) return false; for (i=0; i < data.length; i++) if (data[i] !== state.defaultBuffer[i]) return false; return true; }; // Utility methods function encodeTag(tag, primitive, cls, reporter) { var res; if (tag === 'seqof') tag = 'seq'; else if (tag === 'setof') tag = 'set'; if (der.tagByName.hasOwnProperty(tag)) res = der.tagByName[tag]; else if (typeof tag === 'number' && (tag | 0) === tag) res = tag; else return reporter.error('Unknown tag: ' + tag); if (res >= 0x1f) return reporter.error('Multi-octet tag encoding unsupported'); if (!primitive) res |= 0x20; res |= (der.tagClassByName[cls || 'universal'] << 6); return res; } /***/ }), /***/ "./node_modules/asn1.js/lib/asn1/encoders/index.js": /*!*********************************************************!*\ !*** ./node_modules/asn1.js/lib/asn1/encoders/index.js ***! \*********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var encoders = exports; encoders.der = __webpack_require__(/*! ./der */ "./node_modules/asn1.js/lib/asn1/encoders/der.js"); encoders.pem = __webpack_require__(/*! ./pem */ "./node_modules/asn1.js/lib/asn1/encoders/pem.js"); /***/ }), /***/ "./node_modules/asn1.js/lib/asn1/encoders/pem.js": /*!*******************************************************!*\ !*** ./node_modules/asn1.js/lib/asn1/encoders/pem.js ***! \*******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js"); var DEREncoder = __webpack_require__(/*! ./der */ "./node_modules/asn1.js/lib/asn1/encoders/der.js"); function PEMEncoder(entity) { DEREncoder.call(this, entity); this.enc = 'pem'; }; inherits(PEMEncoder, DEREncoder); module.exports = PEMEncoder; PEMEncoder.prototype.encode = function encode(data, options) { var buf = DEREncoder.prototype.encode.call(this, data); var p = buf.toString('base64'); var out = [ '-----BEGIN ' + options.label + '-----' ]; for (var i = 0; i < p.length; i += 64) out.push(p.slice(i, i + 64)); out.push('-----END ' + options.label + '-----'); return out.join('\n'); }; /***/ }), /***/ "./node_modules/autobind-decorator/lib/index.js": /*!******************************************************!*\ !*** ./node_modules/autobind-decorator/lib/index.js ***! \******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; exports.default = autobind; /** * @copyright 2015, Andrey Popp <8mayday@gmail.com> * * The decorator may be used on classes or methods * ``` * @autobind * class FullBound {} * * class PartBound { * @autobind * method () {} * } * ``` */ function autobind() { if (arguments.length === 1) { return boundClass.apply(undefined, arguments); } else { return boundMethod.apply(undefined, arguments); } } /** * Use boundMethod to bind all methods on the target.prototype */ function boundClass(target) { // (Using reflect to get all keys including symbols) var keys = void 0; // Use Reflect if exists if (typeof Reflect !== 'undefined' && typeof Reflect.ownKeys === 'function') { keys = Reflect.ownKeys(target.prototype); } else { keys = Object.getOwnPropertyNames(target.prototype); // use symbols if support is provided if (typeof Object.getOwnPropertySymbols === 'function') { keys = keys.concat(Object.getOwnPropertySymbols(target.prototype)); } } keys.forEach(function (key) { // Ignore special case target method if (key === 'constructor') { return; } var descriptor = Object.getOwnPropertyDescriptor(target.prototype, key); // Only methods need binding if (typeof descriptor.value === 'function') { Object.defineProperty(target.prototype, key, boundMethod(target, key, descriptor)); } }); return target; } /** * Return a descriptor removing the value and returning a getter * The getter will return a .bind version of the function * and memoize the result against a symbol on the instance */ function boundMethod(target, key, descriptor) { var fn = descriptor.value; if (typeof fn !== 'function') { throw new Error('@autobind decorator can only be applied to methods not: ' + (typeof fn === 'undefined' ? 'undefined' : _typeof(fn))); } // In IE11 calling Object.defineProperty has a side-effect of evaluating the // getter for the property which is being replaced. This causes infinite // recursion and an "Out of stack space" error. var definingProperty = false; return { configurable: true, get: function get() { if (definingProperty || this === target.prototype || this.hasOwnProperty(key) || typeof fn !== 'function') { return fn; } var boundFn = fn.bind(this); definingProperty = true; Object.defineProperty(this, key, { configurable: true, get: function get() { return boundFn; }, set: function set(value) { fn = value; delete this[key]; } }); definingProperty = false; return boundFn; }, set: function set(value) { fn = value; } }; } /***/ }), /***/ "./node_modules/base64-js/index.js": /*!*****************************************!*\ !*** ./node_modules/base64-js/index.js ***! \*****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.byteLength = byteLength exports.toByteArray = toByteArray exports.fromByteArray = fromByteArray var lookup = [] var revLookup = [] var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' for (var i = 0, len = code.length; i < len; ++i) { lookup[i] = code[i] revLookup[code.charCodeAt(i)] = i } // Support decoding URL-safe base64 strings, as Node.js does. // See: https://en.wikipedia.org/wiki/Base64#URL_applications revLookup['-'.charCodeAt(0)] = 62 revLookup['_'.charCodeAt(0)] = 63 function getLens (b64) { var len = b64.length if (len % 4 > 0) { throw new Error('Invalid string. Length must be a multiple of 4') } // Trim off extra bytes after placeholder bytes are found // See: https://github.com/beatgammit/base64-js/issues/42 var validLen = b64.indexOf('=') if (validLen === -1) validLen = len var placeHoldersLen = validLen === len ? 0 : 4 - (validLen % 4) return [validLen, placeHoldersLen] } // base64 is 4/3 + up to two characters of the original data function byteLength (b64) { var lens = getLens(b64) var validLen = lens[0] var placeHoldersLen = lens[1] return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen } function _byteLength (b64, validLen, placeHoldersLen) { return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen } function toByteArray (b64) { var tmp var lens = getLens(b64) var validLen = lens[0] var placeHoldersLen = lens[1] var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)) var curByte = 0 // if there are placeholders, only get up to the last complete 4 chars var len = placeHoldersLen > 0 ? validLen - 4 : validLen for (var i = 0; i < len; i += 4) { tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] arr[curByte++] = (tmp >> 16) & 0xFF arr[curByte++] = (tmp >> 8) & 0xFF arr[curByte++] = tmp & 0xFF } if (placeHoldersLen === 2) { tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) arr[curByte++] = tmp & 0xFF } if (placeHoldersLen === 1) { tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) arr[curByte++] = (tmp >> 8) & 0xFF arr[curByte++] = tmp & 0xFF } return arr } function tripletToBase64 (num) { return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] } function encodeChunk (uint8, start, end) { var tmp var output = [] for (var i = start; i < end; i += 3) { tmp = ((uint8[i] << 16) & 0xFF0000) + ((uint8[i + 1] << 8) & 0xFF00) + (uint8[i + 2] & 0xFF) output.push(tripletToBase64(tmp)) } return output.join('') } function fromByteArray (uint8) { var tmp var len = uint8.length var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes var parts = [] var maxChunkLength = 16383 // must be multiple of 3 // go through the array every three bytes, we'll deal with trailing stuff later for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { parts.push(encodeChunk( uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength) )) } // pad the end with zeros, but make sure to not forget the extra bytes if (extraBytes === 1) { tmp = uint8[len - 1] parts.push( lookup[tmp >> 2] + lookup[(tmp << 4) & 0x3F] + '==' ) } else if (extraBytes === 2) { tmp = (uint8[len - 2] << 8) + uint8[len - 1] parts.push( lookup[tmp >> 10] + lookup[(tmp >> 4) & 0x3F] + lookup[(tmp << 2) & 0x3F] + '=' ) } return parts.join('') } /***/ }), /***/ "./node_modules/bn.js/lib/bn.js": /*!**************************************!*\ !*** ./node_modules/bn.js/lib/bn.js ***! \**************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(module) {(function (module, exports) { 'use strict'; // Utils function assert (val, msg) { if (!val) throw new Error(msg || 'Assertion failed'); } // Could use `inherits` module, but don't want to move from single file // architecture yet. function inherits (ctor, superCtor) { ctor.super_ = superCtor; var TempCtor = function () {}; TempCtor.prototype = superCtor.prototype; ctor.prototype = new TempCtor(); ctor.prototype.constructor = ctor; } // BN function BN (number, base, endian) { if (BN.isBN(number)) { return number; } this.negative = 0; this.words = null; this.length = 0; // Reduction context this.red = null; if (number !== null) { if (base === 'le' || base === 'be') { endian = base; base = 10; } this._init(number || 0, base || 10, endian || 'be'); } } if (typeof module === 'object') { module.exports = BN; } else { exports.BN = BN; } BN.BN = BN; BN.wordSize = 26; var Buffer; try { Buffer = __webpack_require__(/*! buffer */ 2).Buffer; } catch (e) { } BN.isBN = function isBN (num) { if (num instanceof BN) { return true; } return num !== null && typeof num === 'object' && num.constructor.wordSize === BN.wordSize && Array.isArray(num.words); }; BN.max = function max (left, right) { if (left.cmp(right) > 0) return left; return right; }; BN.min = function min (left, right) { if (left.cmp(right) < 0) return left; return right; }; BN.prototype._init = function init (number, base, endian) { if (typeof number === 'number') { return this._initNumber(number, base, endian); } if (typeof number === 'object') { return this._initArray(number, base, endian); } if (base === 'hex') { base = 16; } assert(base === (base | 0) && base >= 2 && base <= 36); number = number.toString().replace(/\s+/g, ''); var start = 0; if (number[0] === '-') { start++; } if (base === 16) { this._parseHex(number, start); } else { this._parseBase(number, base, start); } if (number[0] === '-') { this.negative = 1; } this.strip(); if (endian !== 'le') return; this._initArray(this.toArray(), base, endian); }; BN.prototype._initNumber = function _initNumber (number, base, endian) { if (number < 0) { this.negative = 1; number = -number; } if (number < 0x4000000) { this.words = [ number & 0x3ffffff ]; this.length = 1; } else if (number < 0x10000000000000) { this.words = [ number & 0x3ffffff, (number / 0x4000000) & 0x3ffffff ]; this.length = 2; } else { assert(number < 0x20000000000000); // 2 ^ 53 (unsafe) this.words = [ number & 0x3ffffff, (number / 0x4000000) & 0x3ffffff, 1 ]; this.length = 3; } if (endian !== 'le') return; // Reverse the bytes this._initArray(this.toArray(), base, endian); }; BN.prototype._initArray = function _initArray (number, base, endian) { // Perhaps a Uint8Array assert(typeof number.length === 'number'); if (number.length <= 0) { this.words = [ 0 ]; this.length = 1; return this; } this.length = Math.ceil(number.length / 3); this.words = new Array(this.length); for (var i = 0; i < this.length; i++) { this.words[i] = 0; } var j, w; var off = 0; if (endian === 'be') { for (i = number.length - 1, j = 0; i >= 0; i -= 3) { w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16); this.words[j] |= (w << off) & 0x3ffffff; this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff; off += 24; if (off >= 26) { off -= 26; j++; } } } else if (endian === 'le') { for (i = 0, j = 0; i < number.length; i += 3) { w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16); this.words[j] |= (w << off) & 0x3ffffff; this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff; off += 24; if (off >= 26) { off -= 26; j++; } } } return this.strip(); }; function parseHex (str, start, end) { var r = 0; var len = Math.min(str.length, end); for (var i = start; i < len; i++) { var c = str.charCodeAt(i) - 48; r <<= 4; // 'a' - 'f' if (c >= 49 && c <= 54) { r |= c - 49 + 0xa; // 'A' - 'F' } else if (c >= 17 && c <= 22) { r |= c - 17 + 0xa; // '0' - '9' } else { r |= c & 0xf; } } return r; } BN.prototype._parseHex = function _parseHex (number, start) { // Create possibly bigger array to ensure that it fits the number this.length = Math.ceil((number.length - start) / 6); this.words = new Array(this.length); for (var i = 0; i < this.length; i++) { this.words[i] = 0; } var j, w; // Scan 24-bit chunks and add them to the number var off = 0; for (i = number.length - 6, j = 0; i >= start; i -= 6) { w = parseHex(number, i, i + 6); this.words[j] |= (w << off) & 0x3ffffff; // NOTE: `0x3fffff` is intentional here, 26bits max shift + 24bit hex limb this.words[j + 1] |= w >>> (26 - off) & 0x3fffff; off += 24; if (off >= 26) { off -= 26; j++; } } if (i + 6 !== start) { w = parseHex(number, start, i + 6); this.words[j] |= (w << off) & 0x3ffffff; this.words[j + 1] |= w >>> (26 - off) & 0x3fffff; } this.strip(); }; function parseBase (str, start, end, mul) { var r = 0; var len = Math.min(str.length, end); for (var i = start; i < len; i++) { var c = str.charCodeAt(i) - 48; r *= mul; // 'a' if (c >= 49) { r += c - 49 + 0xa; // 'A' } else if (c >= 17) { r += c - 17 + 0xa; // '0' - '9' } else { r += c; } } return r; } BN.prototype._parseBase = function _parseBase (number, base, start) { // Initialize as zero this.words = [ 0 ]; this.length = 1; // Find length of limb in base for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) { limbLen++; } limbLen--; limbPow = (limbPow / base) | 0; var total = number.length - start; var mod = total % limbLen; var end = Math.min(total, total - mod) + start; var word = 0; for (var i = start; i < end; i += limbLen) { word = parseBase(number, i, i + limbLen, base); this.imuln(limbPow); if (this.words[0] + word < 0x4000000) { this.words[0] += word; } else { this._iaddn(word); } } if (mod !== 0) { var pow = 1; word = parseBase(number, i, number.length, base); for (i = 0; i < mod; i++) { pow *= base; } this.imuln(pow); if (this.words[0] + word < 0x4000000) { this.words[0] += word; } else { this._iaddn(word); } } }; BN.prototype.copy = function copy (dest) { dest.words = new Array(this.length); for (var i = 0; i < this.length; i++) { dest.words[i] = this.words[i]; } dest.length = this.length; dest.negative = this.negative; dest.red = this.red; }; BN.prototype.clone = function clone () { var r = new BN(null); this.copy(r); return r; }; BN.prototype._expand = function _expand (size) { while (this.length < size) { this.words[this.length++] = 0; } return this; }; // Remove leading `0` from `this` BN.prototype.strip = function strip () { while (this.length > 1 && this.words[this.length - 1] === 0) { this.length--; } return this._normSign(); }; BN.prototype._normSign = function _normSign () { // -0 = 0 if (this.length === 1 && this.words[0] === 0) { this.negative = 0; } return this; }; BN.prototype.inspect = function inspect () { return (this.red ? ''; }; /* var zeros = []; var groupSizes = []; var groupBases = []; var s = ''; var i = -1; while (++i < BN.wordSize) { zeros[i] = s; s += '0'; } groupSizes[0] = 0; groupSizes[1] = 0; groupBases[0] = 0; groupBases[1] = 0; var base = 2 - 1; while (++base < 36 + 1) { var groupSize = 0; var groupBase = 1; while (groupBase < (1 << BN.wordSize) / base) { groupBase *= base; groupSize += 1; } groupSizes[base] = groupSize; groupBases[base] = groupBase; } */ var zeros = [ '', '0', '00', '000', '0000', '00000', '000000', '0000000', '00000000', '000000000', '0000000000', '00000000000', '000000000000', '0000000000000', '00000000000000', '000000000000000', '0000000000000000', '00000000000000000', '000000000000000000', '0000000000000000000', '00000000000000000000', '000000000000000000000', '0000000000000000000000', '00000000000000000000000', '000000000000000000000000', '0000000000000000000000000' ]; var groupSizes = [ 0, 0, 25, 16, 12, 11, 10, 9, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 ]; var groupBases = [ 0, 0, 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216, 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625, 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632, 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149, 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176 ]; BN.prototype.toString = function toString (base, padding) { base = base || 10; padding = padding | 0 || 1; var out; if (base === 16 || base === 'hex') { out = ''; var off = 0; var carry = 0; for (var i = 0; i < this.length; i++) { var w = this.words[i]; var word = (((w << off) | carry) & 0xffffff).toString(16); carry = (w >>> (24 - off)) & 0xffffff; if (carry !== 0 || i !== this.length - 1) { out = zeros[6 - word.length] + word + out; } else { out = word + out; } off += 2; if (off >= 26) { off -= 26; i--; } } if (carry !== 0) { out = carry.toString(16) + out; } while (out.length % padding !== 0) { out = '0' + out; } if (this.negative !== 0) { out = '-' + out; } return out; } if (base === (base | 0) && base >= 2 && base <= 36) { // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base)); var groupSize = groupSizes[base]; // var groupBase = Math.pow(base, groupSize); var groupBase = groupBases[base]; out = ''; var c = this.clone(); c.negative = 0; while (!c.isZero()) { var r = c.modn(groupBase).toString(base); c = c.idivn(groupBase); if (!c.isZero()) { out = zeros[groupSize - r.length] + r + out; } else { out = r + out; } } if (this.isZero()) { out = '0' + out; } while (out.length % padding !== 0) { out = '0' + out; } if (this.negative !== 0) { out = '-' + out; } return out; } assert(false, 'Base should be between 2 and 36'); }; BN.prototype.toNumber = function toNumber () { var ret = this.words[0]; if (this.length === 2) { ret += this.words[1] * 0x4000000; } else if (this.length === 3 && this.words[2] === 0x01) { // NOTE: at this stage it is known that the top bit is set ret += 0x10000000000000 + (this.words[1] * 0x4000000); } else if (this.length > 2) { assert(false, 'Number can only safely store up to 53 bits'); } return (this.negative !== 0) ? -ret : ret; }; BN.prototype.toJSON = function toJSON () { return this.toString(16); }; BN.prototype.toBuffer = function toBuffer (endian, length) { assert(typeof Buffer !== 'undefined'); return this.toArrayLike(Buffer, endian, length); }; BN.prototype.toArray = function toArray (endian, length) { return this.toArrayLike(Array, endian, length); }; BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) { var byteLength = this.byteLength(); var reqLength = length || Math.max(1, byteLength); assert(byteLength <= reqLength, 'byte array longer than desired length'); assert(reqLength > 0, 'Requested array length <= 0'); this.strip(); var littleEndian = endian === 'le'; var res = new ArrayType(reqLength); var b, i; var q = this.clone(); if (!littleEndian) { // Assume big-endian for (i = 0; i < reqLength - byteLength; i++) { res[i] = 0; } for (i = 0; !q.isZero(); i++) { b = q.andln(0xff); q.iushrn(8); res[reqLength - i - 1] = b; } } else { for (i = 0; !q.isZero(); i++) { b = q.andln(0xff); q.iushrn(8); res[i] = b; } for (; i < reqLength; i++) { res[i] = 0; } } return res; }; if (Math.clz32) { BN.prototype._countBits = function _countBits (w) { return 32 - Math.clz32(w); }; } else { BN.prototype._countBits = function _countBits (w) { var t = w; var r = 0; if (t >= 0x1000) { r += 13; t >>>= 13; } if (t >= 0x40) { r += 7; t >>>= 7; } if (t >= 0x8) { r += 4; t >>>= 4; } if (t >= 0x02) { r += 2; t >>>= 2; } return r + t; }; } BN.prototype._zeroBits = function _zeroBits (w) { // Short-cut if (w === 0) return 26; var t = w; var r = 0; if ((t & 0x1fff) === 0) { r += 13; t >>>= 13; } if ((t & 0x7f) === 0) { r += 7; t >>>= 7; } if ((t & 0xf) === 0) { r += 4; t >>>= 4; } if ((t & 0x3) === 0) { r += 2; t >>>= 2; } if ((t & 0x1) === 0) { r++; } return r; }; // Return number of used bits in a BN BN.prototype.bitLength = function bitLength () { var w = this.words[this.length - 1]; var hi = this._countBits(w); return (this.length - 1) * 26 + hi; }; function toBitArray (num) { var w = new Array(num.bitLength()); for (var bit = 0; bit < w.length; bit++) { var off = (bit / 26) | 0; var wbit = bit % 26; w[bit] = (num.words[off] & (1 << wbit)) >>> wbit; } return w; } // Number of trailing zero bits BN.prototype.zeroBits = function zeroBits () { if (this.isZero()) return 0; var r = 0; for (var i = 0; i < this.length; i++) { var b = this._zeroBits(this.words[i]); r += b; if (b !== 26) break; } return r; }; BN.prototype.byteLength = function byteLength () { return Math.ceil(this.bitLength() / 8); }; BN.prototype.toTwos = function toTwos (width) { if (this.negative !== 0) { return this.abs().inotn(width).iaddn(1); } return this.clone(); }; BN.prototype.fromTwos = function fromTwos (width) { if (this.testn(width - 1)) { return this.notn(width).iaddn(1).ineg(); } return this.clone(); }; BN.prototype.isNeg = function isNeg () { return this.negative !== 0; }; // Return negative clone of `this` BN.prototype.neg = function neg () { return this.clone().ineg(); }; BN.prototype.ineg = function ineg () { if (!this.isZero()) { this.negative ^= 1; } return this; }; // Or `num` with `this` in-place BN.prototype.iuor = function iuor (num) { while (this.length < num.length) { this.words[this.length++] = 0; } for (var i = 0; i < num.length; i++) { this.words[i] = this.words[i] | num.words[i]; } return this.strip(); }; BN.prototype.ior = function ior (num) { assert((this.negative | num.negative) === 0); return this.iuor(num); }; // Or `num` with `this` BN.prototype.or = function or (num) { if (this.length > num.length) return this.clone().ior(num); return num.clone().ior(this); }; BN.prototype.uor = function uor (num) { if (this.length > num.length) return this.clone().iuor(num); return num.clone().iuor(this); }; // And `num` with `this` in-place BN.prototype.iuand = function iuand (num) { // b = min-length(num, this) var b; if (this.length > num.length) { b = num; } else { b = this; } for (var i = 0; i < b.length; i++) { this.words[i] = this.words[i] & num.words[i]; } this.length = b.length; return this.strip(); }; BN.prototype.iand = function iand (num) { assert((this.negative | num.negative) === 0); return this.iuand(num); }; // And `num` with `this` BN.prototype.and = function and (num) { if (this.length > num.length) return this.clone().iand(num); return num.clone().iand(this); }; BN.prototype.uand = function uand (num) { if (this.length > num.length) return this.clone().iuand(num); return num.clone().iuand(this); }; // Xor `num` with `this` in-place BN.prototype.iuxor = function iuxor (num) { // a.length > b.length var a; var b; if (this.length > num.length) { a = this; b = num; } else { a = num; b = this; } for (var i = 0; i < b.length; i++) { this.words[i] = a.words[i] ^ b.words[i]; } if (this !== a) { for (; i < a.length; i++) { this.words[i] = a.words[i]; } } this.length = a.length; return this.strip(); }; BN.prototype.ixor = function ixor (num) { assert((this.negative | num.negative) === 0); return this.iuxor(num); }; // Xor `num` with `this` BN.prototype.xor = function xor (num) { if (this.length > num.length) return this.clone().ixor(num); return num.clone().ixor(this); }; BN.prototype.uxor = function uxor (num) { if (this.length > num.length) return this.clone().iuxor(num); return num.clone().iuxor(this); }; // Not ``this`` with ``width`` bitwidth BN.prototype.inotn = function inotn (width) { assert(typeof width === 'number' && width >= 0); var bytesNeeded = Math.ceil(width / 26) | 0; var bitsLeft = width % 26; // Extend the buffer with leading zeroes this._expand(bytesNeeded); if (bitsLeft > 0) { bytesNeeded--; } // Handle complete words for (var i = 0; i < bytesNeeded; i++) { this.words[i] = ~this.words[i] & 0x3ffffff; } // Handle the residue if (bitsLeft > 0) { this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft)); } // And remove leading zeroes return this.strip(); }; BN.prototype.notn = function notn (width) { return this.clone().inotn(width); }; // Set `bit` of `this` BN.prototype.setn = function setn (bit, val) { assert(typeof bit === 'number' && bit >= 0); var off = (bit / 26) | 0; var wbit = bit % 26; this._expand(off + 1); if (val) { this.words[off] = this.words[off] | (1 << wbit); } else { this.words[off] = this.words[off] & ~(1 << wbit); } return this.strip(); }; // Add `num` to `this` in-place BN.prototype.iadd = function iadd (num) { var r; // negative + positive if (this.negative !== 0 && num.negative === 0) { this.negative = 0; r = this.isub(num); this.negative ^= 1; return this._normSign(); // positive + negative } else if (this.negative === 0 && num.negative !== 0) { num.negative = 0; r = this.isub(num); num.negative = 1; return r._normSign(); } // a.length > b.length var a, b; if (this.length > num.length) { a = this; b = num; } else { a = num; b = this; } var carry = 0; for (var i = 0; i < b.length; i++) { r = (a.words[i] | 0) + (b.words[i] | 0) + carry; this.words[i] = r & 0x3ffffff; carry = r >>> 26; } for (; carry !== 0 && i < a.length; i++) { r = (a.words[i] | 0) + carry; this.words[i] = r & 0x3ffffff; carry = r >>> 26; } this.length = a.length; if (carry !== 0) { this.words[this.length] = carry; this.length++; // Copy the rest of the words } else if (a !== this) { for (; i < a.length; i++) { this.words[i] = a.words[i]; } } return this; }; // Add `num` to `this` BN.prototype.add = function add (num) { var res; if (num.negative !== 0 && this.negative === 0) { num.negative = 0; res = this.sub(num); num.negative ^= 1; return res; } else if (num.negative === 0 && this.negative !== 0) { this.negative = 0; res = num.sub(this); this.negative = 1; return res; } if (this.length > num.length) return this.clone().iadd(num); return num.clone().iadd(this); }; // Subtract `num` from `this` in-place BN.prototype.isub = function isub (num) { // this - (-num) = this + num if (num.negative !== 0) { num.negative = 0; var r = this.iadd(num); num.negative = 1; return r._normSign(); // -this - num = -(this + num) } else if (this.negative !== 0) { this.negative = 0; this.iadd(num); this.negative = 1; return this._normSign(); } // At this point both numbers are positive var cmp = this.cmp(num); // Optimization - zeroify if (cmp === 0) { this.negative = 0; this.length = 1; this.words[0] = 0; return this; } // a > b var a, b; if (cmp > 0) { a = this; b = num; } else { a = num; b = this; } var carry = 0; for (var i = 0; i < b.length; i++) { r = (a.words[i] | 0) - (b.words[i] | 0) + carry; carry = r >> 26; this.words[i] = r & 0x3ffffff; } for (; carry !== 0 && i < a.length; i++) { r = (a.words[i] | 0) + carry; carry = r >> 26; this.words[i] = r & 0x3ffffff; } // Copy rest of the words if (carry === 0 && i < a.length && a !== this) { for (; i < a.length; i++) { this.words[i] = a.words[i]; } } this.length = Math.max(this.length, i); if (a !== this) { this.negative = 1; } return this.strip(); }; // Subtract `num` from `this` BN.prototype.sub = function sub (num) { return this.clone().isub(num); }; function smallMulTo (self, num, out) { out.negative = num.negative ^ self.negative; var len = (self.length + num.length) | 0; out.length = len; len = (len - 1) | 0; // Peel one iteration (compiler can't do it, because of code complexity) var a = self.words[0] | 0; var b = num.words[0] | 0; var r = a * b; var lo = r & 0x3ffffff; var carry = (r / 0x4000000) | 0; out.words[0] = lo; for (var k = 1; k < len; k++) { // Sum all words with the same `i + j = k` and accumulate `ncarry`, // note that ncarry could be >= 0x3ffffff var ncarry = carry >>> 26; var rword = carry & 0x3ffffff; var maxJ = Math.min(k, num.length - 1); for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) { var i = (k - j) | 0; a = self.words[i] | 0; b = num.words[j] | 0; r = a * b + rword; ncarry += (r / 0x4000000) | 0; rword = r & 0x3ffffff; } out.words[k] = rword | 0; carry = ncarry | 0; } if (carry !== 0) { out.words[k] = carry | 0; } else { out.length--; } return out.strip(); } // TODO(indutny): it may be reasonable to omit it for users who don't need // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit // multiplication (like elliptic secp256k1). var comb10MulTo = function comb10MulTo (self, num, out) { var a = self.words; var b = num.words; var o = out.words; var c = 0; var lo; var mid; var hi; var a0 = a[0] | 0; var al0 = a0 & 0x1fff; var ah0 = a0 >>> 13; var a1 = a[1] | 0; var al1 = a1 & 0x1fff; var ah1 = a1 >>> 13; var a2 = a[2] | 0; var al2 = a2 & 0x1fff; var ah2 = a2 >>> 13; var a3 = a[3] | 0; var al3 = a3 & 0x1fff; var ah3 = a3 >>> 13; var a4 = a[4] | 0; var al4 = a4 & 0x1fff; var ah4 = a4 >>> 13; var a5 = a[5] | 0; var al5 = a5 & 0x1fff; var ah5 = a5 >>> 13; var a6 = a[6] | 0; var al6 = a6 & 0x1fff; var ah6 = a6 >>> 13; var a7 = a[7] | 0; var al7 = a7 & 0x1fff; var ah7 = a7 >>> 13; var a8 = a[8] | 0; var al8 = a8 & 0x1fff; var ah8 = a8 >>> 13; var a9 = a[9] | 0; var al9 = a9 & 0x1fff; var ah9 = a9 >>> 13; var b0 = b[0] | 0; var bl0 = b0 & 0x1fff; var bh0 = b0 >>> 13; var b1 = b[1] | 0; var bl1 = b1 & 0x1fff; var bh1 = b1 >>> 13; var b2 = b[2] | 0; var bl2 = b2 & 0x1fff; var bh2 = b2 >>> 13; var b3 = b[3] | 0; var bl3 = b3 & 0x1fff; var bh3 = b3 >>> 13; var b4 = b[4] | 0; var bl4 = b4 & 0x1fff; var bh4 = b4 >>> 13; var b5 = b[5] | 0; var bl5 = b5 & 0x1fff; var bh5 = b5 >>> 13; var b6 = b[6] | 0; var bl6 = b6 & 0x1fff; var bh6 = b6 >>> 13; var b7 = b[7] | 0; var bl7 = b7 & 0x1fff; var bh7 = b7 >>> 13; var b8 = b[8] | 0; var bl8 = b8 & 0x1fff; var bh8 = b8 >>> 13; var b9 = b[9] | 0; var bl9 = b9 & 0x1fff; var bh9 = b9 >>> 13; out.negative = self.negative ^ num.negative; out.length = 19; /* k = 0 */ lo = Math.imul(al0, bl0); mid = Math.imul(al0, bh0); mid = (mid + Math.imul(ah0, bl0)) | 0; hi = Math.imul(ah0, bh0); var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0; w0 &= 0x3ffffff; /* k = 1 */ lo = Math.imul(al1, bl0); mid = Math.imul(al1, bh0); mid = (mid + Math.imul(ah1, bl0)) | 0; hi = Math.imul(ah1, bh0); lo = (lo + Math.imul(al0, bl1)) | 0; mid = (mid + Math.imul(al0, bh1)) | 0; mid = (mid + Math.imul(ah0, bl1)) | 0; hi = (hi + Math.imul(ah0, bh1)) | 0; var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0; w1 &= 0x3ffffff; /* k = 2 */ lo = Math.imul(al2, bl0); mid = Math.imul(al2, bh0); mid = (mid + Math.imul(ah2, bl0)) | 0; hi = Math.imul(ah2, bh0); lo = (lo + Math.imul(al1, bl1)) | 0; mid = (mid + Math.imul(al1, bh1)) | 0; mid = (mid + Math.imul(ah1, bl1)) | 0; hi = (hi + Math.imul(ah1, bh1)) | 0; lo = (lo + Math.imul(al0, bl2)) | 0; mid = (mid + Math.imul(al0, bh2)) | 0; mid = (mid + Math.imul(ah0, bl2)) | 0; hi = (hi + Math.imul(ah0, bh2)) | 0; var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0; w2 &= 0x3ffffff; /* k = 3 */ lo = Math.imul(al3, bl0); mid = Math.imul(al3, bh0); mid = (mid + Math.imul(ah3, bl0)) | 0; hi = Math.imul(ah3, bh0); lo = (lo + Math.imul(al2, bl1)) | 0; mid = (mid + Math.imul(al2, bh1)) | 0; mid = (mid + Math.imul(ah2, bl1)) | 0; hi = (hi + Math.imul(ah2, bh1)) | 0; lo = (lo + Math.imul(al1, bl2)) | 0; mid = (mid + Math.imul(al1, bh2)) | 0; mid = (mid + Math.imul(ah1, bl2)) | 0; hi = (hi + Math.imul(ah1, bh2)) | 0; lo = (lo + Math.imul(al0, bl3)) | 0; mid = (mid + Math.imul(al0, bh3)) | 0; mid = (mid + Math.imul(ah0, bl3)) | 0; hi = (hi + Math.imul(ah0, bh3)) | 0; var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0; w3 &= 0x3ffffff; /* k = 4 */ lo = Math.imul(al4, bl0); mid = Math.imul(al4, bh0); mid = (mid + Math.imul(ah4, bl0)) | 0; hi = Math.imul(ah4, bh0); lo = (lo + Math.imul(al3, bl1)) | 0; mid = (mid + Math.imul(al3, bh1)) | 0; mid = (mid + Math.imul(ah3, bl1)) | 0; hi = (hi + Math.imul(ah3, bh1)) | 0; lo = (lo + Math.imul(al2, bl2)) | 0; mid = (mid + Math.imul(al2, bh2)) | 0; mid = (mid + Math.imul(ah2, bl2)) | 0; hi = (hi + Math.imul(ah2, bh2)) | 0; lo = (lo + Math.imul(al1, bl3)) | 0; mid = (mid + Math.imul(al1, bh3)) | 0; mid = (mid + Math.imul(ah1, bl3)) | 0; hi = (hi + Math.imul(ah1, bh3)) | 0; lo = (lo + Math.imul(al0, bl4)) | 0; mid = (mid + Math.imul(al0, bh4)) | 0; mid = (mid + Math.imul(ah0, bl4)) | 0; hi = (hi + Math.imul(ah0, bh4)) | 0; var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0; w4 &= 0x3ffffff; /* k = 5 */ lo = Math.imul(al5, bl0); mid = Math.imul(al5, bh0); mid = (mid + Math.imul(ah5, bl0)) | 0; hi = Math.imul(ah5, bh0); lo = (lo + Math.imul(al4, bl1)) | 0; mid = (mid + Math.imul(al4, bh1)) | 0; mid = (mid + Math.imul(ah4, bl1)) | 0; hi = (hi + Math.imul(ah4, bh1)) | 0; lo = (lo + Math.imul(al3, bl2)) | 0; mid = (mid + Math.imul(al3, bh2)) | 0; mid = (mid + Math.imul(ah3, bl2)) | 0; hi = (hi + Math.imul(ah3, bh2)) | 0; lo = (lo + Math.imul(al2, bl3)) | 0; mid = (mid + Math.imul(al2, bh3)) | 0; mid = (mid + Math.imul(ah2, bl3)) | 0; hi = (hi + Math.imul(ah2, bh3)) | 0; lo = (lo + Math.imul(al1, bl4)) | 0; mid = (mid + Math.imul(al1, bh4)) | 0; mid = (mid + Math.imul(ah1, bl4)) | 0; hi = (hi + Math.imul(ah1, bh4)) | 0; lo = (lo + Math.imul(al0, bl5)) | 0; mid = (mid + Math.imul(al0, bh5)) | 0; mid = (mid + Math.imul(ah0, bl5)) | 0; hi = (hi + Math.imul(ah0, bh5)) | 0; var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0; w5 &= 0x3ffffff; /* k = 6 */ lo = Math.imul(al6, bl0); mid = Math.imul(al6, bh0); mid = (mid + Math.imul(ah6, bl0)) | 0; hi = Math.imul(ah6, bh0); lo = (lo + Math.imul(al5, bl1)) | 0; mid = (mid + Math.imul(al5, bh1)) | 0; mid = (mid + Math.imul(ah5, bl1)) | 0; hi = (hi + Math.imul(ah5, bh1)) | 0; lo = (lo + Math.imul(al4, bl2)) | 0; mid = (mid + Math.imul(al4, bh2)) | 0; mid = (mid + Math.imul(ah4, bl2)) | 0; hi = (hi + Math.imul(ah4, bh2)) | 0; lo = (lo + Math.imul(al3, bl3)) | 0; mid = (mid + Math.imul(al3, bh3)) | 0; mid = (mid + Math.imul(ah3, bl3)) | 0; hi = (hi + Math.imul(ah3, bh3)) | 0; lo = (lo + Math.imul(al2, bl4)) | 0; mid = (mid + Math.imul(al2, bh4)) | 0; mid = (mid + Math.imul(ah2, bl4)) | 0; hi = (hi + Math.imul(ah2, bh4)) | 0; lo = (lo + Math.imul(al1, bl5)) | 0; mid = (mid + Math.imul(al1, bh5)) | 0; mid = (mid + Math.imul(ah1, bl5)) | 0; hi = (hi + Math.imul(ah1, bh5)) | 0; lo = (lo + Math.imul(al0, bl6)) | 0; mid = (mid + Math.imul(al0, bh6)) | 0; mid = (mid + Math.imul(ah0, bl6)) | 0; hi = (hi + Math.imul(ah0, bh6)) | 0; var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0; w6 &= 0x3ffffff; /* k = 7 */ lo = Math.imul(al7, bl0); mid = Math.imul(al7, bh0); mid = (mid + Math.imul(ah7, bl0)) | 0; hi = Math.imul(ah7, bh0); lo = (lo + Math.imul(al6, bl1)) | 0; mid = (mid + Math.imul(al6, bh1)) | 0; mid = (mid + Math.imul(ah6, bl1)) | 0; hi = (hi + Math.imul(ah6, bh1)) | 0; lo = (lo + Math.imul(al5, bl2)) | 0; mid = (mid + Math.imul(al5, bh2)) | 0; mid = (mid + Math.imul(ah5, bl2)) | 0; hi = (hi + Math.imul(ah5, bh2)) | 0; lo = (lo + Math.imul(al4, bl3)) | 0; mid = (mid + Math.imul(al4, bh3)) | 0; mid = (mid + Math.imul(ah4, bl3)) | 0; hi = (hi + Math.imul(ah4, bh3)) | 0; lo = (lo + Math.imul(al3, bl4)) | 0; mid = (mid + Math.imul(al3, bh4)) | 0; mid = (mid + Math.imul(ah3, bl4)) | 0; hi = (hi + Math.imul(ah3, bh4)) | 0; lo = (lo + Math.imul(al2, bl5)) | 0; mid = (mid + Math.imul(al2, bh5)) | 0; mid = (mid + Math.imul(ah2, bl5)) | 0; hi = (hi + Math.imul(ah2, bh5)) | 0; lo = (lo + Math.imul(al1, bl6)) | 0; mid = (mid + Math.imul(al1, bh6)) | 0; mid = (mid + Math.imul(ah1, bl6)) | 0; hi = (hi + Math.imul(ah1, bh6)) | 0; lo = (lo + Math.imul(al0, bl7)) | 0; mid = (mid + Math.imul(al0, bh7)) | 0; mid = (mid + Math.imul(ah0, bl7)) | 0; hi = (hi + Math.imul(ah0, bh7)) | 0; var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0; w7 &= 0x3ffffff; /* k = 8 */ lo = Math.imul(al8, bl0); mid = Math.imul(al8, bh0); mid = (mid + Math.imul(ah8, bl0)) | 0; hi = Math.imul(ah8, bh0); lo = (lo + Math.imul(al7, bl1)) | 0; mid = (mid + Math.imul(al7, bh1)) | 0; mid = (mid + Math.imul(ah7, bl1)) | 0; hi = (hi + Math.imul(ah7, bh1)) | 0; lo = (lo + Math.imul(al6, bl2)) | 0; mid = (mid + Math.imul(al6, bh2)) | 0; mid = (mid + Math.imul(ah6, bl2)) | 0; hi = (hi + Math.imul(ah6, bh2)) | 0; lo = (lo + Math.imul(al5, bl3)) | 0; mid = (mid + Math.imul(al5, bh3)) | 0; mid = (mid + Math.imul(ah5, bl3)) | 0; hi = (hi + Math.imul(ah5, bh3)) | 0; lo = (lo + Math.imul(al4, bl4)) | 0; mid = (mid + Math.imul(al4, bh4)) | 0; mid = (mid + Math.imul(ah4, bl4)) | 0; hi = (hi + Math.imul(ah4, bh4)) | 0; lo = (lo + Math.imul(al3, bl5)) | 0; mid = (mid + Math.imul(al3, bh5)) | 0; mid = (mid + Math.imul(ah3, bl5)) | 0; hi = (hi + Math.imul(ah3, bh5)) | 0; lo = (lo + Math.imul(al2, bl6)) | 0; mid = (mid + Math.imul(al2, bh6)) | 0; mid = (mid + Math.imul(ah2, bl6)) | 0; hi = (hi + Math.imul(ah2, bh6)) | 0; lo = (lo + Math.imul(al1, bl7)) | 0; mid = (mid + Math.imul(al1, bh7)) | 0; mid = (mid + Math.imul(ah1, bl7)) | 0; hi = (hi + Math.imul(ah1, bh7)) | 0; lo = (lo + Math.imul(al0, bl8)) | 0; mid = (mid + Math.imul(al0, bh8)) | 0; mid = (mid + Math.imul(ah0, bl8)) | 0; hi = (hi + Math.imul(ah0, bh8)) | 0; var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0; w8 &= 0x3ffffff; /* k = 9 */ lo = Math.imul(al9, bl0); mid = Math.imul(al9, bh0); mid = (mid + Math.imul(ah9, bl0)) | 0; hi = Math.imul(ah9, bh0); lo = (lo + Math.imul(al8, bl1)) | 0; mid = (mid + Math.imul(al8, bh1)) | 0; mid = (mid + Math.imul(ah8, bl1)) | 0; hi = (hi + Math.imul(ah8, bh1)) | 0; lo = (lo + Math.imul(al7, bl2)) | 0; mid = (mid + Math.imul(al7, bh2)) | 0; mid = (mid + Math.imul(ah7, bl2)) | 0; hi = (hi + Math.imul(ah7, bh2)) | 0; lo = (lo + Math.imul(al6, bl3)) | 0; mid = (mid + Math.imul(al6, bh3)) | 0; mid = (mid + Math.imul(ah6, bl3)) | 0; hi = (hi + Math.imul(ah6, bh3)) | 0; lo = (lo + Math.imul(al5, bl4)) | 0; mid = (mid + Math.imul(al5, bh4)) | 0; mid = (mid + Math.imul(ah5, bl4)) | 0; hi = (hi + Math.imul(ah5, bh4)) | 0; lo = (lo + Math.imul(al4, bl5)) | 0; mid = (mid + Math.imul(al4, bh5)) | 0; mid = (mid + Math.imul(ah4, bl5)) | 0; hi = (hi + Math.imul(ah4, bh5)) | 0; lo = (lo + Math.imul(al3, bl6)) | 0; mid = (mid + Math.imul(al3, bh6)) | 0; mid = (mid + Math.imul(ah3, bl6)) | 0; hi = (hi + Math.imul(ah3, bh6)) | 0; lo = (lo + Math.imul(al2, bl7)) | 0; mid = (mid + Math.imul(al2, bh7)) | 0; mid = (mid + Math.imul(ah2, bl7)) | 0; hi = (hi + Math.imul(ah2, bh7)) | 0; lo = (lo + Math.imul(al1, bl8)) | 0; mid = (mid + Math.imul(al1, bh8)) | 0; mid = (mid + Math.imul(ah1, bl8)) | 0; hi = (hi + Math.imul(ah1, bh8)) | 0; lo = (lo + Math.imul(al0, bl9)) | 0; mid = (mid + Math.imul(al0, bh9)) | 0; mid = (mid + Math.imul(ah0, bl9)) | 0; hi = (hi + Math.imul(ah0, bh9)) | 0; var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0; w9 &= 0x3ffffff; /* k = 10 */ lo = Math.imul(al9, bl1); mid = Math.imul(al9, bh1); mid = (mid + Math.imul(ah9, bl1)) | 0; hi = Math.imul(ah9, bh1); lo = (lo + Math.imul(al8, bl2)) | 0; mid = (mid + Math.imul(al8, bh2)) | 0; mid = (mid + Math.imul(ah8, bl2)) | 0; hi = (hi + Math.imul(ah8, bh2)) | 0; lo = (lo + Math.imul(al7, bl3)) | 0; mid = (mid + Math.imul(al7, bh3)) | 0; mid = (mid + Math.imul(ah7, bl3)) | 0; hi = (hi + Math.imul(ah7, bh3)) | 0; lo = (lo + Math.imul(al6, bl4)) | 0; mid = (mid + Math.imul(al6, bh4)) | 0; mid = (mid + Math.imul(ah6, bl4)) | 0; hi = (hi + Math.imul(ah6, bh4)) | 0; lo = (lo + Math.imul(al5, bl5)) | 0; mid = (mid + Math.imul(al5, bh5)) | 0; mid = (mid + Math.imul(ah5, bl5)) | 0; hi = (hi + Math.imul(ah5, bh5)) | 0; lo = (lo + Math.imul(al4, bl6)) | 0; mid = (mid + Math.imul(al4, bh6)) | 0; mid = (mid + Math.imul(ah4, bl6)) | 0; hi = (hi + Math.imul(ah4, bh6)) | 0; lo = (lo + Math.imul(al3, bl7)) | 0; mid = (mid + Math.imul(al3, bh7)) | 0; mid = (mid + Math.imul(ah3, bl7)) | 0; hi = (hi + Math.imul(ah3, bh7)) | 0; lo = (lo + Math.imul(al2, bl8)) | 0; mid = (mid + Math.imul(al2, bh8)) | 0; mid = (mid + Math.imul(ah2, bl8)) | 0; hi = (hi + Math.imul(ah2, bh8)) | 0; lo = (lo + Math.imul(al1, bl9)) | 0; mid = (mid + Math.imul(al1, bh9)) | 0; mid = (mid + Math.imul(ah1, bl9)) | 0; hi = (hi + Math.imul(ah1, bh9)) | 0; var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0; w10 &= 0x3ffffff; /* k = 11 */ lo = Math.imul(al9, bl2); mid = Math.imul(al9, bh2); mid = (mid + Math.imul(ah9, bl2)) | 0; hi = Math.imul(ah9, bh2); lo = (lo + Math.imul(al8, bl3)) | 0; mid = (mid + Math.imul(al8, bh3)) | 0; mid = (mid + Math.imul(ah8, bl3)) | 0; hi = (hi + Math.imul(ah8, bh3)) | 0; lo = (lo + Math.imul(al7, bl4)) | 0; mid = (mid + Math.imul(al7, bh4)) | 0; mid = (mid + Math.imul(ah7, bl4)) | 0; hi = (hi + Math.imul(ah7, bh4)) | 0; lo = (lo + Math.imul(al6, bl5)) | 0; mid = (mid + Math.imul(al6, bh5)) | 0; mid = (mid + Math.imul(ah6, bl5)) | 0; hi = (hi + Math.imul(ah6, bh5)) | 0; lo = (lo + Math.imul(al5, bl6)) | 0; mid = (mid + Math.imul(al5, bh6)) | 0; mid = (mid + Math.imul(ah5, bl6)) | 0; hi = (hi + Math.imul(ah5, bh6)) | 0; lo = (lo + Math.imul(al4, bl7)) | 0; mid = (mid + Math.imul(al4, bh7)) | 0; mid = (mid + Math.imul(ah4, bl7)) | 0; hi = (hi + Math.imul(ah4, bh7)) | 0; lo = (lo + Math.imul(al3, bl8)) | 0; mid = (mid + Math.imul(al3, bh8)) | 0; mid = (mid + Math.imul(ah3, bl8)) | 0; hi = (hi + Math.imul(ah3, bh8)) | 0; lo = (lo + Math.imul(al2, bl9)) | 0; mid = (mid + Math.imul(al2, bh9)) | 0; mid = (mid + Math.imul(ah2, bl9)) | 0; hi = (hi + Math.imul(ah2, bh9)) | 0; var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0; w11 &= 0x3ffffff; /* k = 12 */ lo = Math.imul(al9, bl3); mid = Math.imul(al9, bh3); mid = (mid + Math.imul(ah9, bl3)) | 0; hi = Math.imul(ah9, bh3); lo = (lo + Math.imul(al8, bl4)) | 0; mid = (mid + Math.imul(al8, bh4)) | 0; mid = (mid + Math.imul(ah8, bl4)) | 0; hi = (hi + Math.imul(ah8, bh4)) | 0; lo = (lo + Math.imul(al7, bl5)) | 0; mid = (mid + Math.imul(al7, bh5)) | 0; mid = (mid + Math.imul(ah7, bl5)) | 0; hi = (hi + Math.imul(ah7, bh5)) | 0; lo = (lo + Math.imul(al6, bl6)) | 0; mid = (mid + Math.imul(al6, bh6)) | 0; mid = (mid + Math.imul(ah6, bl6)) | 0; hi = (hi + Math.imul(ah6, bh6)) | 0; lo = (lo + Math.imul(al5, bl7)) | 0; mid = (mid + Math.imul(al5, bh7)) | 0; mid = (mid + Math.imul(ah5, bl7)) | 0; hi = (hi + Math.imul(ah5, bh7)) | 0; lo = (lo + Math.imul(al4, bl8)) | 0; mid = (mid + Math.imul(al4, bh8)) | 0; mid = (mid + Math.imul(ah4, bl8)) | 0; hi = (hi + Math.imul(ah4, bh8)) | 0; lo = (lo + Math.imul(al3, bl9)) | 0; mid = (mid + Math.imul(al3, bh9)) | 0; mid = (mid + Math.imul(ah3, bl9)) | 0; hi = (hi + Math.imul(ah3, bh9)) | 0; var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0; w12 &= 0x3ffffff; /* k = 13 */ lo = Math.imul(al9, bl4); mid = Math.imul(al9, bh4); mid = (mid + Math.imul(ah9, bl4)) | 0; hi = Math.imul(ah9, bh4); lo = (lo + Math.imul(al8, bl5)) | 0; mid = (mid + Math.imul(al8, bh5)) | 0; mid = (mid + Math.imul(ah8, bl5)) | 0; hi = (hi + Math.imul(ah8, bh5)) | 0; lo = (lo + Math.imul(al7, bl6)) | 0; mid = (mid + Math.imul(al7, bh6)) | 0; mid = (mid + Math.imul(ah7, bl6)) | 0; hi = (hi + Math.imul(ah7, bh6)) | 0; lo = (lo + Math.imul(al6, bl7)) | 0; mid = (mid + Math.imul(al6, bh7)) | 0; mid = (mid + Math.imul(ah6, bl7)) | 0; hi = (hi + Math.imul(ah6, bh7)) | 0; lo = (lo + Math.imul(al5, bl8)) | 0; mid = (mid + Math.imul(al5, bh8)) | 0; mid = (mid + Math.imul(ah5, bl8)) | 0; hi = (hi + Math.imul(ah5, bh8)) | 0; lo = (lo + Math.imul(al4, bl9)) | 0; mid = (mid + Math.imul(al4, bh9)) | 0; mid = (mid + Math.imul(ah4, bl9)) | 0; hi = (hi + Math.imul(ah4, bh9)) | 0; var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0; w13 &= 0x3ffffff; /* k = 14 */ lo = Math.imul(al9, bl5); mid = Math.imul(al9, bh5); mid = (mid + Math.imul(ah9, bl5)) | 0; hi = Math.imul(ah9, bh5); lo = (lo + Math.imul(al8, bl6)) | 0; mid = (mid + Math.imul(al8, bh6)) | 0; mid = (mid + Math.imul(ah8, bl6)) | 0; hi = (hi + Math.imul(ah8, bh6)) | 0; lo = (lo + Math.imul(al7, bl7)) | 0; mid = (mid + Math.imul(al7, bh7)) | 0; mid = (mid + Math.imul(ah7, bl7)) | 0; hi = (hi + Math.imul(ah7, bh7)) | 0; lo = (lo + Math.imul(al6, bl8)) | 0; mid = (mid + Math.imul(al6, bh8)) | 0; mid = (mid + Math.imul(ah6, bl8)) | 0; hi = (hi + Math.imul(ah6, bh8)) | 0; lo = (lo + Math.imul(al5, bl9)) | 0; mid = (mid + Math.imul(al5, bh9)) | 0; mid = (mid + Math.imul(ah5, bl9)) | 0; hi = (hi + Math.imul(ah5, bh9)) | 0; var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0; w14 &= 0x3ffffff; /* k = 15 */ lo = Math.imul(al9, bl6); mid = Math.imul(al9, bh6); mid = (mid + Math.imul(ah9, bl6)) | 0; hi = Math.imul(ah9, bh6); lo = (lo + Math.imul(al8, bl7)) | 0; mid = (mid + Math.imul(al8, bh7)) | 0; mid = (mid + Math.imul(ah8, bl7)) | 0; hi = (hi + Math.imul(ah8, bh7)) | 0; lo = (lo + Math.imul(al7, bl8)) | 0; mid = (mid + Math.imul(al7, bh8)) | 0; mid = (mid + Math.imul(ah7, bl8)) | 0; hi = (hi + Math.imul(ah7, bh8)) | 0; lo = (lo + Math.imul(al6, bl9)) | 0; mid = (mid + Math.imul(al6, bh9)) | 0; mid = (mid + Math.imul(ah6, bl9)) | 0; hi = (hi + Math.imul(ah6, bh9)) | 0; var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0; w15 &= 0x3ffffff; /* k = 16 */ lo = Math.imul(al9, bl7); mid = Math.imul(al9, bh7); mid = (mid + Math.imul(ah9, bl7)) | 0; hi = Math.imul(ah9, bh7); lo = (lo + Math.imul(al8, bl8)) | 0; mid = (mid + Math.imul(al8, bh8)) | 0; mid = (mid + Math.imul(ah8, bl8)) | 0; hi = (hi + Math.imul(ah8, bh8)) | 0; lo = (lo + Math.imul(al7, bl9)) | 0; mid = (mid + Math.imul(al7, bh9)) | 0; mid = (mid + Math.imul(ah7, bl9)) | 0; hi = (hi + Math.imul(ah7, bh9)) | 0; var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0; w16 &= 0x3ffffff; /* k = 17 */ lo = Math.imul(al9, bl8); mid = Math.imul(al9, bh8); mid = (mid + Math.imul(ah9, bl8)) | 0; hi = Math.imul(ah9, bh8); lo = (lo + Math.imul(al8, bl9)) | 0; mid = (mid + Math.imul(al8, bh9)) | 0; mid = (mid + Math.imul(ah8, bl9)) | 0; hi = (hi + Math.imul(ah8, bh9)) | 0; var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0; w17 &= 0x3ffffff; /* k = 18 */ lo = Math.imul(al9, bl9); mid = Math.imul(al9, bh9); mid = (mid + Math.imul(ah9, bl9)) | 0; hi = Math.imul(ah9, bh9); var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0; w18 &= 0x3ffffff; o[0] = w0; o[1] = w1; o[2] = w2; o[3] = w3; o[4] = w4; o[5] = w5; o[6] = w6; o[7] = w7; o[8] = w8; o[9] = w9; o[10] = w10; o[11] = w11; o[12] = w12; o[13] = w13; o[14] = w14; o[15] = w15; o[16] = w16; o[17] = w17; o[18] = w18; if (c !== 0) { o[19] = c; out.length++; } return out; }; // Polyfill comb if (!Math.imul) { comb10MulTo = smallMulTo; } function bigMulTo (self, num, out) { out.negative = num.negative ^ self.negative; out.length = self.length + num.length; var carry = 0; var hncarry = 0; for (var k = 0; k < out.length - 1; k++) { // Sum all words with the same `i + j = k` and accumulate `ncarry`, // note that ncarry could be >= 0x3ffffff var ncarry = hncarry; hncarry = 0; var rword = carry & 0x3ffffff; var maxJ = Math.min(k, num.length - 1); for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) { var i = k - j; var a = self.words[i] | 0; var b = num.words[j] | 0; var r = a * b; var lo = r & 0x3ffffff; ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0; lo = (lo + rword) | 0; rword = lo & 0x3ffffff; ncarry = (ncarry + (lo >>> 26)) | 0; hncarry += ncarry >>> 26; ncarry &= 0x3ffffff; } out.words[k] = rword; carry = ncarry; ncarry = hncarry; } if (carry !== 0) { out.words[k] = carry; } else { out.length--; } return out.strip(); } function jumboMulTo (self, num, out) { var fftm = new FFTM(); return fftm.mulp(self, num, out); } BN.prototype.mulTo = function mulTo (num, out) { var res; var len = this.length + num.length; if (this.length === 10 && num.length === 10) { res = comb10MulTo(this, num, out); } else if (len < 63) { res = smallMulTo(this, num, out); } else if (len < 1024) { res = bigMulTo(this, num, out); } else { res = jumboMulTo(this, num, out); } return res; }; // Cooley-Tukey algorithm for FFT // slightly revisited to rely on looping instead of recursion function FFTM (x, y) { this.x = x; this.y = y; } FFTM.prototype.makeRBT = function makeRBT (N) { var t = new Array(N); var l = BN.prototype._countBits(N) - 1; for (var i = 0; i < N; i++) { t[i] = this.revBin(i, l, N); } return t; }; // Returns binary-reversed representation of `x` FFTM.prototype.revBin = function revBin (x, l, N) { if (x === 0 || x === N - 1) return x; var rb = 0; for (var i = 0; i < l; i++) { rb |= (x & 1) << (l - i - 1); x >>= 1; } return rb; }; // Performs "tweedling" phase, therefore 'emulating' // behaviour of the recursive algorithm FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) { for (var i = 0; i < N; i++) { rtws[i] = rws[rbt[i]]; itws[i] = iws[rbt[i]]; } }; FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) { this.permute(rbt, rws, iws, rtws, itws, N); for (var s = 1; s < N; s <<= 1) { var l = s << 1; var rtwdf = Math.cos(2 * Math.PI / l); var itwdf = Math.sin(2 * Math.PI / l); for (var p = 0; p < N; p += l) { var rtwdf_ = rtwdf; var itwdf_ = itwdf; for (var j = 0; j < s; j++) { var re = rtws[p + j]; var ie = itws[p + j]; var ro = rtws[p + j + s]; var io = itws[p + j + s]; var rx = rtwdf_ * ro - itwdf_ * io; io = rtwdf_ * io + itwdf_ * ro; ro = rx; rtws[p + j] = re + ro; itws[p + j] = ie + io; rtws[p + j + s] = re - ro; itws[p + j + s] = ie - io; /* jshint maxdepth : false */ if (j !== l) { rx = rtwdf * rtwdf_ - itwdf * itwdf_; itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_; rtwdf_ = rx; } } } } }; FFTM.prototype.guessLen13b = function guessLen13b (n, m) { var N = Math.max(m, n) | 1; var odd = N & 1; var i = 0; for (N = N / 2 | 0; N; N = N >>> 1) { i++; } return 1 << i + 1 + odd; }; FFTM.prototype.conjugate = function conjugate (rws, iws, N) { if (N <= 1) return; for (var i = 0; i < N / 2; i++) { var t = rws[i]; rws[i] = rws[N - i - 1]; rws[N - i - 1] = t; t = iws[i]; iws[i] = -iws[N - i - 1]; iws[N - i - 1] = -t; } }; FFTM.prototype.normalize13b = function normalize13b (ws, N) { var carry = 0; for (var i = 0; i < N / 2; i++) { var w = Math.round(ws[2 * i + 1] / N) * 0x2000 + Math.round(ws[2 * i] / N) + carry; ws[i] = w & 0x3ffffff; if (w < 0x4000000) { carry = 0; } else { carry = w / 0x4000000 | 0; } } return ws; }; FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) { var carry = 0; for (var i = 0; i < len; i++) { carry = carry + (ws[i] | 0); rws[2 * i] = carry & 0x1fff; carry = carry >>> 13; rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13; } // Pad with zeroes for (i = 2 * len; i < N; ++i) { rws[i] = 0; } assert(carry === 0); assert((carry & ~0x1fff) === 0); }; FFTM.prototype.stub = function stub (N) { var ph = new Array(N); for (var i = 0; i < N; i++) { ph[i] = 0; } return ph; }; FFTM.prototype.mulp = function mulp (x, y, out) { var N = 2 * this.guessLen13b(x.length, y.length); var rbt = this.makeRBT(N); var _ = this.stub(N); var rws = new Array(N); var rwst = new Array(N); var iwst = new Array(N); var nrws = new Array(N); var nrwst = new Array(N); var niwst = new Array(N); var rmws = out.words; rmws.length = N; this.convert13b(x.words, x.length, rws, N); this.convert13b(y.words, y.length, nrws, N); this.transform(rws, _, rwst, iwst, N, rbt); this.transform(nrws, _, nrwst, niwst, N, rbt); for (var i = 0; i < N; i++) { var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i]; iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i]; rwst[i] = rx; } this.conjugate(rwst, iwst, N); this.transform(rwst, iwst, rmws, _, N, rbt); this.conjugate(rmws, _, N); this.normalize13b(rmws, N); out.negative = x.negative ^ y.negative; out.length = x.length + y.length; return out.strip(); }; // Multiply `this` by `num` BN.prototype.mul = function mul (num) { var out = new BN(null); out.words = new Array(this.length + num.length); return this.mulTo(num, out); }; // Multiply employing FFT BN.prototype.mulf = function mulf (num) { var out = new BN(null); out.words = new Array(this.length + num.length); return jumboMulTo(this, num, out); }; // In-place Multiplication BN.prototype.imul = function imul (num) { return this.clone().mulTo(num, this); }; BN.prototype.imuln = function imuln (num) { assert(typeof num === 'number'); assert(num < 0x4000000); // Carry var carry = 0; for (var i = 0; i < this.length; i++) { var w = (this.words[i] | 0) * num; var lo = (w & 0x3ffffff) + (carry & 0x3ffffff); carry >>= 26; carry += (w / 0x4000000) | 0; // NOTE: lo is 27bit maximum carry += lo >>> 26; this.words[i] = lo & 0x3ffffff; } if (carry !== 0) { this.words[i] = carry; this.length++; } return this; }; BN.prototype.muln = function muln (num) { return this.clone().imuln(num); }; // `this` * `this` BN.prototype.sqr = function sqr () { return this.mul(this); }; // `this` * `this` in-place BN.prototype.isqr = function isqr () { return this.imul(this.clone()); }; // Math.pow(`this`, `num`) BN.prototype.pow = function pow (num) { var w = toBitArray(num); if (w.length === 0) return new BN(1); // Skip leading zeroes var res = this; for (var i = 0; i < w.length; i++, res = res.sqr()) { if (w[i] !== 0) break; } if (++i < w.length) { for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) { if (w[i] === 0) continue; res = res.mul(q); } } return res; }; // Shift-left in-place BN.prototype.iushln = function iushln (bits) { assert(typeof bits === 'number' && bits >= 0); var r = bits % 26; var s = (bits - r) / 26; var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r); var i; if (r !== 0) { var carry = 0; for (i = 0; i < this.length; i++) { var newCarry = this.words[i] & carryMask; var c = ((this.words[i] | 0) - newCarry) << r; this.words[i] = c | carry; carry = newCarry >>> (26 - r); } if (carry) { this.words[i] = carry; this.length++; } } if (s !== 0) { for (i = this.length - 1; i >= 0; i--) { this.words[i + s] = this.words[i]; } for (i = 0; i < s; i++) { this.words[i] = 0; } this.length += s; } return this.strip(); }; BN.prototype.ishln = function ishln (bits) { // TODO(indutny): implement me assert(this.negative === 0); return this.iushln(bits); }; // Shift-right in-place // NOTE: `hint` is a lowest bit before trailing zeroes // NOTE: if `extended` is present - it will be filled with destroyed bits BN.prototype.iushrn = function iushrn (bits, hint, extended) { assert(typeof bits === 'number' && bits >= 0); var h; if (hint) { h = (hint - (hint % 26)) / 26; } else { h = 0; } var r = bits % 26; var s = Math.min((bits - r) / 26, this.length); var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r); var maskedWords = extended; h -= s; h = Math.max(0, h); // Extended mode, copy masked part if (maskedWords) { for (var i = 0; i < s; i++) { maskedWords.words[i] = this.words[i]; } maskedWords.length = s; } if (s === 0) { // No-op, we should not move anything at all } else if (this.length > s) { this.length -= s; for (i = 0; i < this.length; i++) { this.words[i] = this.words[i + s]; } } else { this.words[0] = 0; this.length = 1; } var carry = 0; for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) { var word = this.words[i] | 0; this.words[i] = (carry << (26 - r)) | (word >>> r); carry = word & mask; } // Push carried bits as a mask if (maskedWords && carry !== 0) { maskedWords.words[maskedWords.length++] = carry; } if (this.length === 0) { this.words[0] = 0; this.length = 1; } return this.strip(); }; BN.prototype.ishrn = function ishrn (bits, hint, extended) { // TODO(indutny): implement me assert(this.negative === 0); return this.iushrn(bits, hint, extended); }; // Shift-left BN.prototype.shln = function shln (bits) { return this.clone().ishln(bits); }; BN.prototype.ushln = function ushln (bits) { return this.clone().iushln(bits); }; // Shift-right BN.prototype.shrn = function shrn (bits) { return this.clone().ishrn(bits); }; BN.prototype.ushrn = function ushrn (bits) { return this.clone().iushrn(bits); }; // Test if n bit is set BN.prototype.testn = function testn (bit) { assert(typeof bit === 'number' && bit >= 0); var r = bit % 26; var s = (bit - r) / 26; var q = 1 << r; // Fast case: bit is much higher than all existing words if (this.length <= s) return false; // Check bit and return var w = this.words[s]; return !!(w & q); }; // Return only lowers bits of number (in-place) BN.prototype.imaskn = function imaskn (bits) { assert(typeof bits === 'number' && bits >= 0); var r = bits % 26; var s = (bits - r) / 26; assert(this.negative === 0, 'imaskn works only with positive numbers'); if (this.length <= s) { return this; } if (r !== 0) { s++; } this.length = Math.min(s, this.length); if (r !== 0) { var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r); this.words[this.length - 1] &= mask; } return this.strip(); }; // Return only lowers bits of number BN.prototype.maskn = function maskn (bits) { return this.clone().imaskn(bits); }; // Add plain number `num` to `this` BN.prototype.iaddn = function iaddn (num) { assert(typeof num === 'number'); assert(num < 0x4000000); if (num < 0) return this.isubn(-num); // Possible sign change if (this.negative !== 0) { if (this.length === 1 && (this.words[0] | 0) < num) { this.words[0] = num - (this.words[0] | 0); this.negative = 0; return this; } this.negative = 0; this.isubn(num); this.negative = 1; return this; } // Add without checks return this._iaddn(num); }; BN.prototype._iaddn = function _iaddn (num) { this.words[0] += num; // Carry for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) { this.words[i] -= 0x4000000; if (i === this.length - 1) { this.words[i + 1] = 1; } else { this.words[i + 1]++; } } this.length = Math.max(this.length, i + 1); return this; }; // Subtract plain number `num` from `this` BN.prototype.isubn = function isubn (num) { assert(typeof num === 'number'); assert(num < 0x4000000); if (num < 0) return this.iaddn(-num); if (this.negative !== 0) { this.negative = 0; this.iaddn(num); this.negative = 1; return this; } this.words[0] -= num; if (this.length === 1 && this.words[0] < 0) { this.words[0] = -this.words[0]; this.negative = 1; } else { // Carry for (var i = 0; i < this.length && this.words[i] < 0; i++) { this.words[i] += 0x4000000; this.words[i + 1] -= 1; } } return this.strip(); }; BN.prototype.addn = function addn (num) { return this.clone().iaddn(num); }; BN.prototype.subn = function subn (num) { return this.clone().isubn(num); }; BN.prototype.iabs = function iabs () { this.negative = 0; return this; }; BN.prototype.abs = function abs () { return this.clone().iabs(); }; BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) { var len = num.length + shift; var i; this._expand(len); var w; var carry = 0; for (i = 0; i < num.length; i++) { w = (this.words[i + shift] | 0) + carry; var right = (num.words[i] | 0) * mul; w -= right & 0x3ffffff; carry = (w >> 26) - ((right / 0x4000000) | 0); this.words[i + shift] = w & 0x3ffffff; } for (; i < this.length - shift; i++) { w = (this.words[i + shift] | 0) + carry; carry = w >> 26; this.words[i + shift] = w & 0x3ffffff; } if (carry === 0) return this.strip(); // Subtraction overflow assert(carry === -1); carry = 0; for (i = 0; i < this.length; i++) { w = -(this.words[i] | 0) + carry; carry = w >> 26; this.words[i] = w & 0x3ffffff; } this.negative = 1; return this.strip(); }; BN.prototype._wordDiv = function _wordDiv (num, mode) { var shift = this.length - num.length; var a = this.clone(); var b = num; // Normalize var bhi = b.words[b.length - 1] | 0; var bhiBits = this._countBits(bhi); shift = 26 - bhiBits; if (shift !== 0) { b = b.ushln(shift); a.iushln(shift); bhi = b.words[b.length - 1] | 0; } // Initialize quotient var m = a.length - b.length; var q; if (mode !== 'mod') { q = new BN(null); q.length = m + 1; q.words = new Array(q.length); for (var i = 0; i < q.length; i++) { q.words[i] = 0; } } var diff = a.clone()._ishlnsubmul(b, 1, m); if (diff.negative === 0) { a = diff; if (q) { q.words[m] = 1; } } for (var j = m - 1; j >= 0; j--) { var qj = (a.words[b.length + j] | 0) * 0x4000000 + (a.words[b.length + j - 1] | 0); // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max // (0x7ffffff) qj = Math.min((qj / bhi) | 0, 0x3ffffff); a._ishlnsubmul(b, qj, j); while (a.negative !== 0) { qj--; a.negative = 0; a._ishlnsubmul(b, 1, j); if (!a.isZero()) { a.negative ^= 1; } } if (q) { q.words[j] = qj; } } if (q) { q.strip(); } a.strip(); // Denormalize if (mode !== 'div' && shift !== 0) { a.iushrn(shift); } return { div: q || null, mod: a }; }; // NOTE: 1) `mode` can be set to `mod` to request mod only, // to `div` to request div only, or be absent to // request both div & mod // 2) `positive` is true if unsigned mod is requested BN.prototype.divmod = function divmod (num, mode, positive) { assert(!num.isZero()); if (this.isZero()) { return { div: new BN(0), mod: new BN(0) }; } var div, mod, res; if (this.negative !== 0 && num.negative === 0) { res = this.neg().divmod(num, mode); if (mode !== 'mod') { div = res.div.neg(); } if (mode !== 'div') { mod = res.mod.neg(); if (positive && mod.negative !== 0) { mod.iadd(num); } } return { div: div, mod: mod }; } if (this.negative === 0 && num.negative !== 0) { res = this.divmod(num.neg(), mode); if (mode !== 'mod') { div = res.div.neg(); } return { div: div, mod: res.mod }; } if ((this.negative & num.negative) !== 0) { res = this.neg().divmod(num.neg(), mode); if (mode !== 'div') { mod = res.mod.neg(); if (positive && mod.negative !== 0) { mod.isub(num); } } return { div: res.div, mod: mod }; } // Both numbers are positive at this point // Strip both numbers to approximate shift value if (num.length > this.length || this.cmp(num) < 0) { return { div: new BN(0), mod: this }; } // Very short reduction if (num.length === 1) { if (mode === 'div') { return { div: this.divn(num.words[0]), mod: null }; } if (mode === 'mod') { return { div: null, mod: new BN(this.modn(num.words[0])) }; } return { div: this.divn(num.words[0]), mod: new BN(this.modn(num.words[0])) }; } return this._wordDiv(num, mode); }; // Find `this` / `num` BN.prototype.div = function div (num) { return this.divmod(num, 'div', false).div; }; // Find `this` % `num` BN.prototype.mod = function mod (num) { return this.divmod(num, 'mod', false).mod; }; BN.prototype.umod = function umod (num) { return this.divmod(num, 'mod', true).mod; }; // Find Round(`this` / `num`) BN.prototype.divRound = function divRound (num) { var dm = this.divmod(num); // Fast case - exact division if (dm.mod.isZero()) return dm.div; var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod; var half = num.ushrn(1); var r2 = num.andln(1); var cmp = mod.cmp(half); // Round down if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div; // Round up return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1); }; BN.prototype.modn = function modn (num) { assert(num <= 0x3ffffff); var p = (1 << 26) % num; var acc = 0; for (var i = this.length - 1; i >= 0; i--) { acc = (p * acc + (this.words[i] | 0)) % num; } return acc; }; // In-place division by number BN.prototype.idivn = function idivn (num) { assert(num <= 0x3ffffff); var carry = 0; for (var i = this.length - 1; i >= 0; i--) { var w = (this.words[i] | 0) + carry * 0x4000000; this.words[i] = (w / num) | 0; carry = w % num; } return this.strip(); }; BN.prototype.divn = function divn (num) { return this.clone().idivn(num); }; BN.prototype.egcd = function egcd (p) { assert(p.negative === 0); assert(!p.isZero()); var x = this; var y = p.clone(); if (x.negative !== 0) { x = x.umod(p); } else { x = x.clone(); } // A * x + B * y = x var A = new BN(1); var B = new BN(0); // C * x + D * y = y var C = new BN(0); var D = new BN(1); var g = 0; while (x.isEven() && y.isEven()) { x.iushrn(1); y.iushrn(1); ++g; } var yp = y.clone(); var xp = x.clone(); while (!x.isZero()) { for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1); if (i > 0) { x.iushrn(i); while (i-- > 0) { if (A.isOdd() || B.isOdd()) { A.iadd(yp); B.isub(xp); } A.iushrn(1); B.iushrn(1); } } for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1); if (j > 0) { y.iushrn(j); while (j-- > 0) { if (C.isOdd() || D.isOdd()) { C.iadd(yp); D.isub(xp); } C.iushrn(1); D.iushrn(1); } } if (x.cmp(y) >= 0) { x.isub(y); A.isub(C); B.isub(D); } else { y.isub(x); C.isub(A); D.isub(B); } } return { a: C, b: D, gcd: y.iushln(g) }; }; // This is reduced incarnation of the binary EEA // above, designated to invert members of the // _prime_ fields F(p) at a maximal speed BN.prototype._invmp = function _invmp (p) { assert(p.negative === 0); assert(!p.isZero()); var a = this; var b = p.clone(); if (a.negative !== 0) { a = a.umod(p); } else { a = a.clone(); } var x1 = new BN(1); var x2 = new BN(0); var delta = b.clone(); while (a.cmpn(1) > 0 && b.cmpn(1) > 0) { for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1); if (i > 0) { a.iushrn(i); while (i-- > 0) { if (x1.isOdd()) { x1.iadd(delta); } x1.iushrn(1); } } for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1); if (j > 0) { b.iushrn(j); while (j-- > 0) { if (x2.isOdd()) { x2.iadd(delta); } x2.iushrn(1); } } if (a.cmp(b) >= 0) { a.isub(b); x1.isub(x2); } else { b.isub(a); x2.isub(x1); } } var res; if (a.cmpn(1) === 0) { res = x1; } else { res = x2; } if (res.cmpn(0) < 0) { res.iadd(p); } return res; }; BN.prototype.gcd = function gcd (num) { if (this.isZero()) return num.abs(); if (num.isZero()) return this.abs(); var a = this.clone(); var b = num.clone(); a.negative = 0; b.negative = 0; // Remove common factor of two for (var shift = 0; a.isEven() && b.isEven(); shift++) { a.iushrn(1); b.iushrn(1); } do { while (a.isEven()) { a.iushrn(1); } while (b.isEven()) { b.iushrn(1); } var r = a.cmp(b); if (r < 0) { // Swap `a` and `b` to make `a` always bigger than `b` var t = a; a = b; b = t; } else if (r === 0 || b.cmpn(1) === 0) { break; } a.isub(b); } while (true); return b.iushln(shift); }; // Invert number in the field F(num) BN.prototype.invm = function invm (num) { return this.egcd(num).a.umod(num); }; BN.prototype.isEven = function isEven () { return (this.words[0] & 1) === 0; }; BN.prototype.isOdd = function isOdd () { return (this.words[0] & 1) === 1; }; // And first word and num BN.prototype.andln = function andln (num) { return this.words[0] & num; }; // Increment at the bit position in-line BN.prototype.bincn = function bincn (bit) { assert(typeof bit === 'number'); var r = bit % 26; var s = (bit - r) / 26; var q = 1 << r; // Fast case: bit is much higher than all existing words if (this.length <= s) { this._expand(s + 1); this.words[s] |= q; return this; } // Add bit and propagate, if needed var carry = q; for (var i = s; carry !== 0 && i < this.length; i++) { var w = this.words[i] | 0; w += carry; carry = w >>> 26; w &= 0x3ffffff; this.words[i] = w; } if (carry !== 0) { this.words[i] = carry; this.length++; } return this; }; BN.prototype.isZero = function isZero () { return this.length === 1 && this.words[0] === 0; }; BN.prototype.cmpn = function cmpn (num) { var negative = num < 0; if (this.negative !== 0 && !negative) return -1; if (this.negative === 0 && negative) return 1; this.strip(); var res; if (this.length > 1) { res = 1; } else { if (negative) { num = -num; } assert(num <= 0x3ffffff, 'Number is too big'); var w = this.words[0] | 0; res = w === num ? 0 : w < num ? -1 : 1; } if (this.negative !== 0) return -res | 0; return res; }; // Compare two numbers and return: // 1 - if `this` > `num` // 0 - if `this` == `num` // -1 - if `this` < `num` BN.prototype.cmp = function cmp (num) { if (this.negative !== 0 && num.negative === 0) return -1; if (this.negative === 0 && num.negative !== 0) return 1; var res = this.ucmp(num); if (this.negative !== 0) return -res | 0; return res; }; // Unsigned comparison BN.prototype.ucmp = function ucmp (num) { // At this point both numbers have the same sign if (this.length > num.length) return 1; if (this.length < num.length) return -1; var res = 0; for (var i = this.length - 1; i >= 0; i--) { var a = this.words[i] | 0; var b = num.words[i] | 0; if (a === b) continue; if (a < b) { res = -1; } else if (a > b) { res = 1; } break; } return res; }; BN.prototype.gtn = function gtn (num) { return this.cmpn(num) === 1; }; BN.prototype.gt = function gt (num) { return this.cmp(num) === 1; }; BN.prototype.gten = function gten (num) { return this.cmpn(num) >= 0; }; BN.prototype.gte = function gte (num) { return this.cmp(num) >= 0; }; BN.prototype.ltn = function ltn (num) { return this.cmpn(num) === -1; }; BN.prototype.lt = function lt (num) { return this.cmp(num) === -1; }; BN.prototype.lten = function lten (num) { return this.cmpn(num) <= 0; }; BN.prototype.lte = function lte (num) { return this.cmp(num) <= 0; }; BN.prototype.eqn = function eqn (num) { return this.cmpn(num) === 0; }; BN.prototype.eq = function eq (num) { return this.cmp(num) === 0; }; // // A reduce context, could be using montgomery or something better, depending // on the `m` itself. // BN.red = function red (num) { return new Red(num); }; BN.prototype.toRed = function toRed (ctx) { assert(!this.red, 'Already a number in reduction context'); assert(this.negative === 0, 'red works only with positives'); return ctx.convertTo(this)._forceRed(ctx); }; BN.prototype.fromRed = function fromRed () { assert(this.red, 'fromRed works only with numbers in reduction context'); return this.red.convertFrom(this); }; BN.prototype._forceRed = function _forceRed (ctx) { this.red = ctx; return this; }; BN.prototype.forceRed = function forceRed (ctx) { assert(!this.red, 'Already a number in reduction context'); return this._forceRed(ctx); }; BN.prototype.redAdd = function redAdd (num) { assert(this.red, 'redAdd works only with red numbers'); return this.red.add(this, num); }; BN.prototype.redIAdd = function redIAdd (num) { assert(this.red, 'redIAdd works only with red numbers'); return this.red.iadd(this, num); }; BN.prototype.redSub = function redSub (num) { assert(this.red, 'redSub works only with red numbers'); return this.red.sub(this, num); }; BN.prototype.redISub = function redISub (num) { assert(this.red, 'redISub works only with red numbers'); return this.red.isub(this, num); }; BN.prototype.redShl = function redShl (num) { assert(this.red, 'redShl works only with red numbers'); return this.red.shl(this, num); }; BN.prototype.redMul = function redMul (num) { assert(this.red, 'redMul works only with red numbers'); this.red._verify2(this, num); return this.red.mul(this, num); }; BN.prototype.redIMul = function redIMul (num) { assert(this.red, 'redMul works only with red numbers'); this.red._verify2(this, num); return this.red.imul(this, num); }; BN.prototype.redSqr = function redSqr () { assert(this.red, 'redSqr works only with red numbers'); this.red._verify1(this); return this.red.sqr(this); }; BN.prototype.redISqr = function redISqr () { assert(this.red, 'redISqr works only with red numbers'); this.red._verify1(this); return this.red.isqr(this); }; // Square root over p BN.prototype.redSqrt = function redSqrt () { assert(this.red, 'redSqrt works only with red numbers'); this.red._verify1(this); return this.red.sqrt(this); }; BN.prototype.redInvm = function redInvm () { assert(this.red, 'redInvm works only with red numbers'); this.red._verify1(this); return this.red.invm(this); }; // Return negative clone of `this` % `red modulo` BN.prototype.redNeg = function redNeg () { assert(this.red, 'redNeg works only with red numbers'); this.red._verify1(this); return this.red.neg(this); }; BN.prototype.redPow = function redPow (num) { assert(this.red && !num.red, 'redPow(normalNum)'); this.red._verify1(this); return this.red.pow(this, num); }; // Prime numbers with efficient reduction var primes = { k256: null, p224: null, p192: null, p25519: null }; // Pseudo-Mersenne prime function MPrime (name, p) { // P = 2 ^ N - K this.name = name; this.p = new BN(p, 16); this.n = this.p.bitLength(); this.k = new BN(1).iushln(this.n).isub(this.p); this.tmp = this._tmp(); } MPrime.prototype._tmp = function _tmp () { var tmp = new BN(null); tmp.words = new Array(Math.ceil(this.n / 13)); return tmp; }; MPrime.prototype.ireduce = function ireduce (num) { // Assumes that `num` is less than `P^2` // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P) var r = num; var rlen; do { this.split(r, this.tmp); r = this.imulK(r); r = r.iadd(this.tmp); rlen = r.bitLength(); } while (rlen > this.n); var cmp = rlen < this.n ? -1 : r.ucmp(this.p); if (cmp === 0) { r.words[0] = 0; r.length = 1; } else if (cmp > 0) { r.isub(this.p); } else { r.strip(); } return r; }; MPrime.prototype.split = function split (input, out) { input.iushrn(this.n, 0, out); }; MPrime.prototype.imulK = function imulK (num) { return num.imul(this.k); }; function K256 () { MPrime.call( this, 'k256', 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f'); } inherits(K256, MPrime); K256.prototype.split = function split (input, output) { // 256 = 9 * 26 + 22 var mask = 0x3fffff; var outLen = Math.min(input.length, 9); for (var i = 0; i < outLen; i++) { output.words[i] = input.words[i]; } output.length = outLen; if (input.length <= 9) { input.words[0] = 0; input.length = 1; return; } // Shift by 9 limbs var prev = input.words[9]; output.words[output.length++] = prev & mask; for (i = 10; i < input.length; i++) { var next = input.words[i] | 0; input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22); prev = next; } prev >>>= 22; input.words[i - 10] = prev; if (prev === 0 && input.length > 10) { input.length -= 10; } else { input.length -= 9; } }; K256.prototype.imulK = function imulK (num) { // K = 0x1000003d1 = [ 0x40, 0x3d1 ] num.words[num.length] = 0; num.words[num.length + 1] = 0; num.length += 2; // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390 var lo = 0; for (var i = 0; i < num.length; i++) { var w = num.words[i] | 0; lo += w * 0x3d1; num.words[i] = lo & 0x3ffffff; lo = w * 0x40 + ((lo / 0x4000000) | 0); } // Fast length reduction if (num.words[num.length - 1] === 0) { num.length--; if (num.words[num.length - 1] === 0) { num.length--; } } return num; }; function P224 () { MPrime.call( this, 'p224', 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001'); } inherits(P224, MPrime); function P192 () { MPrime.call( this, 'p192', 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff'); } inherits(P192, MPrime); function P25519 () { // 2 ^ 255 - 19 MPrime.call( this, '25519', '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed'); } inherits(P25519, MPrime); P25519.prototype.imulK = function imulK (num) { // K = 0x13 var carry = 0; for (var i = 0; i < num.length; i++) { var hi = (num.words[i] | 0) * 0x13 + carry; var lo = hi & 0x3ffffff; hi >>>= 26; num.words[i] = lo; carry = hi; } if (carry !== 0) { num.words[num.length++] = carry; } return num; }; // Exported mostly for testing purposes, use plain name instead BN._prime = function prime (name) { // Cached version of prime if (primes[name]) return primes[name]; var prime; if (name === 'k256') { prime = new K256(); } else if (name === 'p224') { prime = new P224(); } else if (name === 'p192') { prime = new P192(); } else if (name === 'p25519') { prime = new P25519(); } else { throw new Error('Unknown prime ' + name); } primes[name] = prime; return prime; }; // // Base reduction engine // function Red (m) { if (typeof m === 'string') { var prime = BN._prime(m); this.m = prime.p; this.prime = prime; } else { assert(m.gtn(1), 'modulus must be greater than 1'); this.m = m; this.prime = null; } } Red.prototype._verify1 = function _verify1 (a) { assert(a.negative === 0, 'red works only with positives'); assert(a.red, 'red works only with red numbers'); }; Red.prototype._verify2 = function _verify2 (a, b) { assert((a.negative | b.negative) === 0, 'red works only with positives'); assert(a.red && a.red === b.red, 'red works only with red numbers'); }; Red.prototype.imod = function imod (a) { if (this.prime) return this.prime.ireduce(a)._forceRed(this); return a.umod(this.m)._forceRed(this); }; Red.prototype.neg = function neg (a) { if (a.isZero()) { return a.clone(); } return this.m.sub(a)._forceRed(this); }; Red.prototype.add = function add (a, b) { this._verify2(a, b); var res = a.add(b); if (res.cmp(this.m) >= 0) { res.isub(this.m); } return res._forceRed(this); }; Red.prototype.iadd = function iadd (a, b) { this._verify2(a, b); var res = a.iadd(b); if (res.cmp(this.m) >= 0) { res.isub(this.m); } return res; }; Red.prototype.sub = function sub (a, b) { this._verify2(a, b); var res = a.sub(b); if (res.cmpn(0) < 0) { res.iadd(this.m); } return res._forceRed(this); }; Red.prototype.isub = function isub (a, b) { this._verify2(a, b); var res = a.isub(b); if (res.cmpn(0) < 0) { res.iadd(this.m); } return res; }; Red.prototype.shl = function shl (a, num) { this._verify1(a); return this.imod(a.ushln(num)); }; Red.prototype.imul = function imul (a, b) { this._verify2(a, b); return this.imod(a.imul(b)); }; Red.prototype.mul = function mul (a, b) { this._verify2(a, b); return this.imod(a.mul(b)); }; Red.prototype.isqr = function isqr (a) { return this.imul(a, a.clone()); }; Red.prototype.sqr = function sqr (a) { return this.mul(a, a); }; Red.prototype.sqrt = function sqrt (a) { if (a.isZero()) return a.clone(); var mod3 = this.m.andln(3); assert(mod3 % 2 === 1); // Fast case if (mod3 === 3) { var pow = this.m.add(new BN(1)).iushrn(2); return this.pow(a, pow); } // Tonelli-Shanks algorithm (Totally unoptimized and slow) // // Find Q and S, that Q * 2 ^ S = (P - 1) var q = this.m.subn(1); var s = 0; while (!q.isZero() && q.andln(1) === 0) { s++; q.iushrn(1); } assert(!q.isZero()); var one = new BN(1).toRed(this); var nOne = one.redNeg(); // Find quadratic non-residue // NOTE: Max is such because of generalized Riemann hypothesis. var lpow = this.m.subn(1).iushrn(1); var z = this.m.bitLength(); z = new BN(2 * z * z).toRed(this); while (this.pow(z, lpow).cmp(nOne) !== 0) { z.redIAdd(nOne); } var c = this.pow(z, q); var r = this.pow(a, q.addn(1).iushrn(1)); var t = this.pow(a, q); var m = s; while (t.cmp(one) !== 0) { var tmp = t; for (var i = 0; tmp.cmp(one) !== 0; i++) { tmp = tmp.redSqr(); } assert(i < m); var b = this.pow(c, new BN(1).iushln(m - i - 1)); r = r.redMul(b); c = b.redSqr(); t = t.redMul(c); m = i; } return r; }; Red.prototype.invm = function invm (a) { var inv = a._invmp(this.m); if (inv.negative !== 0) { inv.negative = 0; return this.imod(inv).redNeg(); } else { return this.imod(inv); } }; Red.prototype.pow = function pow (a, num) { if (num.isZero()) return new BN(1).toRed(this); if (num.cmpn(1) === 0) return a.clone(); var windowSize = 4; var wnd = new Array(1 << windowSize); wnd[0] = new BN(1).toRed(this); wnd[1] = a; for (var i = 2; i < wnd.length; i++) { wnd[i] = this.mul(wnd[i - 1], a); } var res = wnd[0]; var current = 0; var currentLen = 0; var start = num.bitLength() % 26; if (start === 0) { start = 26; } for (i = num.length - 1; i >= 0; i--) { var word = num.words[i]; for (var j = start - 1; j >= 0; j--) { var bit = (word >> j) & 1; if (res !== wnd[0]) { res = this.sqr(res); } if (bit === 0 && current === 0) { currentLen = 0; continue; } current <<= 1; current |= bit; currentLen++; if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue; res = this.mul(res, wnd[current]); currentLen = 0; current = 0; } start = 26; } return res; }; Red.prototype.convertTo = function convertTo (num) { var r = num.umod(this.m); return r === num ? r.clone() : r; }; Red.prototype.convertFrom = function convertFrom (num) { var res = num.clone(); res.red = null; return res; }; // // Montgomery method engine // BN.mont = function mont (num) { return new Mont(num); }; function Mont (m) { Red.call(this, m); this.shift = this.m.bitLength(); if (this.shift % 26 !== 0) { this.shift += 26 - (this.shift % 26); } this.r = new BN(1).iushln(this.shift); this.r2 = this.imod(this.r.sqr()); this.rinv = this.r._invmp(this.m); this.minv = this.rinv.mul(this.r).isubn(1).div(this.m); this.minv = this.minv.umod(this.r); this.minv = this.r.sub(this.minv); } inherits(Mont, Red); Mont.prototype.convertTo = function convertTo (num) { return this.imod(num.ushln(this.shift)); }; Mont.prototype.convertFrom = function convertFrom (num) { var r = this.imod(num.mul(this.rinv)); r.red = null; return r; }; Mont.prototype.imul = function imul (a, b) { if (a.isZero() || b.isZero()) { a.words[0] = 0; a.length = 1; return a; } var t = a.imul(b); var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); var u = t.isub(c).iushrn(this.shift); var res = u; if (u.cmp(this.m) >= 0) { res = u.isub(this.m); } else if (u.cmpn(0) < 0) { res = u.iadd(this.m); } return res._forceRed(this); }; Mont.prototype.mul = function mul (a, b) { if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this); var t = a.mul(b); var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); var u = t.isub(c).iushrn(this.shift); var res = u; if (u.cmp(this.m) >= 0) { res = u.isub(this.m); } else if (u.cmpn(0) < 0) { res = u.iadd(this.m); } return res._forceRed(this); }; Mont.prototype.invm = function invm (a) { // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R var res = this.imod(a._invmp(this.m).mul(this.r2)); return res._forceRed(this); }; })(typeof module === 'undefined' || module, this); /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module))) /***/ }), /***/ "./node_modules/brorand/index.js": /*!***************************************!*\ !*** ./node_modules/brorand/index.js ***! \***************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var r; module.exports = function rand(len) { if (!r) r = new Rand(null); return r.generate(len); }; function Rand(rand) { this.rand = rand; } module.exports.Rand = Rand; Rand.prototype.generate = function generate(len) { return this._rand(len); }; // Emulate crypto API using randy Rand.prototype._rand = function _rand(n) { if (this.rand.getBytes) return this.rand.getBytes(n); var res = new Uint8Array(n); for (var i = 0; i < res.length; i++) res[i] = this.rand.getByte(); return res; }; if (typeof self === 'object') { if (self.crypto && self.crypto.getRandomValues) { // Modern browsers Rand.prototype._rand = function _rand(n) { var arr = new Uint8Array(n); self.crypto.getRandomValues(arr); return arr; }; } else if (self.msCrypto && self.msCrypto.getRandomValues) { // IE Rand.prototype._rand = function _rand(n) { var arr = new Uint8Array(n); self.msCrypto.getRandomValues(arr); return arr; }; // Safari's WebWorkers do not have `crypto` } else if (typeof window === 'object') { // Old junk Rand.prototype._rand = function() { throw new Error('Not implemented yet'); }; } } else { // Node.js or Web worker with no crypto support try { var crypto = __webpack_require__(/*! crypto */ 3); if (typeof crypto.randomBytes !== 'function') throw new Error('Not supported'); Rand.prototype._rand = function _rand(n) { return crypto.randomBytes(n); }; } catch (e) { } } /***/ }), /***/ "./node_modules/browserify-aes/aes.js": /*!********************************************!*\ !*** ./node_modules/browserify-aes/aes.js ***! \********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { // based on the aes implimentation in triple sec // https://github.com/keybase/triplesec // which is in turn based on the one from crypto-js // https://code.google.com/p/crypto-js/ var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer function asUInt32Array (buf) { if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf) var len = (buf.length / 4) | 0 var out = new Array(len) for (var i = 0; i < len; i++) { out[i] = buf.readUInt32BE(i * 4) } return out } function scrubVec (v) { for (var i = 0; i < v.length; v++) { v[i] = 0 } } function cryptBlock (M, keySchedule, SUB_MIX, SBOX, nRounds) { var SUB_MIX0 = SUB_MIX[0] var SUB_MIX1 = SUB_MIX[1] var SUB_MIX2 = SUB_MIX[2] var SUB_MIX3 = SUB_MIX[3] var s0 = M[0] ^ keySchedule[0] var s1 = M[1] ^ keySchedule[1] var s2 = M[2] ^ keySchedule[2] var s3 = M[3] ^ keySchedule[3] var t0, t1, t2, t3 var ksRow = 4 for (var round = 1; round < nRounds; round++) { t0 = SUB_MIX0[s0 >>> 24] ^ SUB_MIX1[(s1 >>> 16) & 0xff] ^ SUB_MIX2[(s2 >>> 8) & 0xff] ^ SUB_MIX3[s3 & 0xff] ^ keySchedule[ksRow++] t1 = SUB_MIX0[s1 >>> 24] ^ SUB_MIX1[(s2 >>> 16) & 0xff] ^ SUB_MIX2[(s3 >>> 8) & 0xff] ^ SUB_MIX3[s0 & 0xff] ^ keySchedule[ksRow++] t2 = SUB_MIX0[s2 >>> 24] ^ SUB_MIX1[(s3 >>> 16) & 0xff] ^ SUB_MIX2[(s0 >>> 8) & 0xff] ^ SUB_MIX3[s1 & 0xff] ^ keySchedule[ksRow++] t3 = SUB_MIX0[s3 >>> 24] ^ SUB_MIX1[(s0 >>> 16) & 0xff] ^ SUB_MIX2[(s1 >>> 8) & 0xff] ^ SUB_MIX3[s2 & 0xff] ^ keySchedule[ksRow++] s0 = t0 s1 = t1 s2 = t2 s3 = t3 } t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++] t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++] t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++] t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++] t0 = t0 >>> 0 t1 = t1 >>> 0 t2 = t2 >>> 0 t3 = t3 >>> 0 return [t0, t1, t2, t3] } // AES constants var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36] var G = (function () { // Compute double table var d = new Array(256) for (var j = 0; j < 256; j++) { if (j < 128) { d[j] = j << 1 } else { d[j] = (j << 1) ^ 0x11b } } var SBOX = [] var INV_SBOX = [] var SUB_MIX = [[], [], [], []] var INV_SUB_MIX = [[], [], [], []] // Walk GF(2^8) var x = 0 var xi = 0 for (var i = 0; i < 256; ++i) { // Compute sbox var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4) sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63 SBOX[x] = sx INV_SBOX[sx] = x // Compute multiplication var x2 = d[x] var x4 = d[x2] var x8 = d[x4] // Compute sub bytes, mix columns tables var t = (d[sx] * 0x101) ^ (sx * 0x1010100) SUB_MIX[0][x] = (t << 24) | (t >>> 8) SUB_MIX[1][x] = (t << 16) | (t >>> 16) SUB_MIX[2][x] = (t << 8) | (t >>> 24) SUB_MIX[3][x] = t // Compute inv sub bytes, inv mix columns tables t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100) INV_SUB_MIX[0][sx] = (t << 24) | (t >>> 8) INV_SUB_MIX[1][sx] = (t << 16) | (t >>> 16) INV_SUB_MIX[2][sx] = (t << 8) | (t >>> 24) INV_SUB_MIX[3][sx] = t if (x === 0) { x = xi = 1 } else { x = x2 ^ d[d[d[x8 ^ x2]]] xi ^= d[d[xi]] } } return { SBOX: SBOX, INV_SBOX: INV_SBOX, SUB_MIX: SUB_MIX, INV_SUB_MIX: INV_SUB_MIX } })() function AES (key) { this._key = asUInt32Array(key) this._reset() } AES.blockSize = 4 * 4 AES.keySize = 256 / 8 AES.prototype.blockSize = AES.blockSize AES.prototype.keySize = AES.keySize AES.prototype._reset = function () { var keyWords = this._key var keySize = keyWords.length var nRounds = keySize + 6 var ksRows = (nRounds + 1) * 4 var keySchedule = [] for (var k = 0; k < keySize; k++) { keySchedule[k] = keyWords[k] } for (k = keySize; k < ksRows; k++) { var t = keySchedule[k - 1] if (k % keySize === 0) { t = (t << 8) | (t >>> 24) t = (G.SBOX[t >>> 24] << 24) | (G.SBOX[(t >>> 16) & 0xff] << 16) | (G.SBOX[(t >>> 8) & 0xff] << 8) | (G.SBOX[t & 0xff]) t ^= RCON[(k / keySize) | 0] << 24 } else if (keySize > 6 && k % keySize === 4) { t = (G.SBOX[t >>> 24] << 24) | (G.SBOX[(t >>> 16) & 0xff] << 16) | (G.SBOX[(t >>> 8) & 0xff] << 8) | (G.SBOX[t & 0xff]) } keySchedule[k] = keySchedule[k - keySize] ^ t } var invKeySchedule = [] for (var ik = 0; ik < ksRows; ik++) { var ksR = ksRows - ik var tt = keySchedule[ksR - (ik % 4 ? 0 : 4)] if (ik < 4 || ksR <= 4) { invKeySchedule[ik] = tt } else { invKeySchedule[ik] = G.INV_SUB_MIX[0][G.SBOX[tt >>> 24]] ^ G.INV_SUB_MIX[1][G.SBOX[(tt >>> 16) & 0xff]] ^ G.INV_SUB_MIX[2][G.SBOX[(tt >>> 8) & 0xff]] ^ G.INV_SUB_MIX[3][G.SBOX[tt & 0xff]] } } this._nRounds = nRounds this._keySchedule = keySchedule this._invKeySchedule = invKeySchedule } AES.prototype.encryptBlockRaw = function (M) { M = asUInt32Array(M) return cryptBlock(M, this._keySchedule, G.SUB_MIX, G.SBOX, this._nRounds) } AES.prototype.encryptBlock = function (M) { var out = this.encryptBlockRaw(M) var buf = Buffer.allocUnsafe(16) buf.writeUInt32BE(out[0], 0) buf.writeUInt32BE(out[1], 4) buf.writeUInt32BE(out[2], 8) buf.writeUInt32BE(out[3], 12) return buf } AES.prototype.decryptBlock = function (M) { M = asUInt32Array(M) // swap var m1 = M[1] M[1] = M[3] M[3] = m1 var out = cryptBlock(M, this._invKeySchedule, G.INV_SUB_MIX, G.INV_SBOX, this._nRounds) var buf = Buffer.allocUnsafe(16) buf.writeUInt32BE(out[0], 0) buf.writeUInt32BE(out[3], 4) buf.writeUInt32BE(out[2], 8) buf.writeUInt32BE(out[1], 12) return buf } AES.prototype.scrub = function () { scrubVec(this._keySchedule) scrubVec(this._invKeySchedule) scrubVec(this._key) } module.exports.AES = AES /***/ }), /***/ "./node_modules/browserify-aes/authCipher.js": /*!***************************************************!*\ !*** ./node_modules/browserify-aes/authCipher.js ***! \***************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var aes = __webpack_require__(/*! ./aes */ "./node_modules/browserify-aes/aes.js") var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer var Transform = __webpack_require__(/*! cipher-base */ "./node_modules/cipher-base/index.js") var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js") var GHASH = __webpack_require__(/*! ./ghash */ "./node_modules/browserify-aes/ghash.js") var xor = __webpack_require__(/*! buffer-xor */ "./node_modules/buffer-xor/index.js") var incr32 = __webpack_require__(/*! ./incr32 */ "./node_modules/browserify-aes/incr32.js") function xorTest (a, b) { var out = 0 if (a.length !== b.length) out++ var len = Math.min(a.length, b.length) for (var i = 0; i < len; ++i) { out += (a[i] ^ b[i]) } return out } function calcIv (self, iv, ck) { if (iv.length === 12) { self._finID = Buffer.concat([iv, Buffer.from([0, 0, 0, 1])]) return Buffer.concat([iv, Buffer.from([0, 0, 0, 2])]) } var ghash = new GHASH(ck) var len = iv.length var toPad = len % 16 ghash.update(iv) if (toPad) { toPad = 16 - toPad ghash.update(Buffer.alloc(toPad, 0)) } ghash.update(Buffer.alloc(8, 0)) var ivBits = len * 8 var tail = Buffer.alloc(8) tail.writeUIntBE(ivBits, 0, 8) ghash.update(tail) self._finID = ghash.state var out = Buffer.from(self._finID) incr32(out) return out } function StreamCipher (mode, key, iv, decrypt) { Transform.call(this) var h = Buffer.alloc(4, 0) this._cipher = new aes.AES(key) var ck = this._cipher.encryptBlock(h) this._ghash = new GHASH(ck) iv = calcIv(this, iv, ck) this._prev = Buffer.from(iv) this._cache = Buffer.allocUnsafe(0) this._secCache = Buffer.allocUnsafe(0) this._decrypt = decrypt this._alen = 0 this._len = 0 this._mode = mode this._authTag = null this._called = false } inherits(StreamCipher, Transform) StreamCipher.prototype._update = function (chunk) { if (!this._called && this._alen) { var rump = 16 - (this._alen % 16) if (rump < 16) { rump = Buffer.alloc(rump, 0) this._ghash.update(rump) } } this._called = true var out = this._mode.encrypt(this, chunk) if (this._decrypt) { this._ghash.update(chunk) } else { this._ghash.update(out) } this._len += chunk.length return out } StreamCipher.prototype._final = function () { if (this._decrypt && !this._authTag) throw new Error('Unsupported state or unable to authenticate data') var tag = xor(this._ghash.final(this._alen * 8, this._len * 8), this._cipher.encryptBlock(this._finID)) if (this._decrypt && xorTest(tag, this._authTag)) throw new Error('Unsupported state or unable to authenticate data') this._authTag = tag this._cipher.scrub() } StreamCipher.prototype.getAuthTag = function getAuthTag () { if (this._decrypt || !Buffer.isBuffer(this._authTag)) throw new Error('Attempting to get auth tag in unsupported state') return this._authTag } StreamCipher.prototype.setAuthTag = function setAuthTag (tag) { if (!this._decrypt) throw new Error('Attempting to set auth tag in unsupported state') this._authTag = tag } StreamCipher.prototype.setAAD = function setAAD (buf) { if (this._called) throw new Error('Attempting to set AAD in unsupported state') this._ghash.update(buf) this._alen += buf.length } module.exports = StreamCipher /***/ }), /***/ "./node_modules/browserify-aes/browser.js": /*!************************************************!*\ !*** ./node_modules/browserify-aes/browser.js ***! \************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var ciphers = __webpack_require__(/*! ./encrypter */ "./node_modules/browserify-aes/encrypter.js") var deciphers = __webpack_require__(/*! ./decrypter */ "./node_modules/browserify-aes/decrypter.js") var modes = __webpack_require__(/*! ./modes/list.json */ "./node_modules/browserify-aes/modes/list.json") function getCiphers () { return Object.keys(modes) } exports.createCipher = exports.Cipher = ciphers.createCipher exports.createCipheriv = exports.Cipheriv = ciphers.createCipheriv exports.createDecipher = exports.Decipher = deciphers.createDecipher exports.createDecipheriv = exports.Decipheriv = deciphers.createDecipheriv exports.listCiphers = exports.getCiphers = getCiphers /***/ }), /***/ "./node_modules/browserify-aes/decrypter.js": /*!**************************************************!*\ !*** ./node_modules/browserify-aes/decrypter.js ***! \**************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var AuthCipher = __webpack_require__(/*! ./authCipher */ "./node_modules/browserify-aes/authCipher.js") var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer var MODES = __webpack_require__(/*! ./modes */ "./node_modules/browserify-aes/modes/index.js") var StreamCipher = __webpack_require__(/*! ./streamCipher */ "./node_modules/browserify-aes/streamCipher.js") var Transform = __webpack_require__(/*! cipher-base */ "./node_modules/cipher-base/index.js") var aes = __webpack_require__(/*! ./aes */ "./node_modules/browserify-aes/aes.js") var ebtk = __webpack_require__(/*! evp_bytestokey */ "./node_modules/evp_bytestokey/index.js") var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js") function Decipher (mode, key, iv) { Transform.call(this) this._cache = new Splitter() this._last = void 0 this._cipher = new aes.AES(key) this._prev = Buffer.from(iv) this._mode = mode this._autopadding = true } inherits(Decipher, Transform) Decipher.prototype._update = function (data) { this._cache.add(data) var chunk var thing var out = [] while ((chunk = this._cache.get(this._autopadding))) { thing = this._mode.decrypt(this, chunk) out.push(thing) } return Buffer.concat(out) } Decipher.prototype._final = function () { var chunk = this._cache.flush() if (this._autopadding) { return unpad(this._mode.decrypt(this, chunk)) } else if (chunk) { throw new Error('data not multiple of block length') } } Decipher.prototype.setAutoPadding = function (setTo) { this._autopadding = !!setTo return this } function Splitter () { this.cache = Buffer.allocUnsafe(0) } Splitter.prototype.add = function (data) { this.cache = Buffer.concat([this.cache, data]) } Splitter.prototype.get = function (autoPadding) { var out if (autoPadding) { if (this.cache.length > 16) { out = this.cache.slice(0, 16) this.cache = this.cache.slice(16) return out } } else { if (this.cache.length >= 16) { out = this.cache.slice(0, 16) this.cache = this.cache.slice(16) return out } } return null } Splitter.prototype.flush = function () { if (this.cache.length) return this.cache } function unpad (last) { var padded = last[15] if (padded < 1 || padded > 16) { throw new Error('unable to decrypt data') } var i = -1 while (++i < padded) { if (last[(i + (16 - padded))] !== padded) { throw new Error('unable to decrypt data') } } if (padded === 16) return return last.slice(0, 16 - padded) } function createDecipheriv (suite, password, iv) { var config = MODES[suite.toLowerCase()] if (!config) throw new TypeError('invalid suite type') if (typeof iv === 'string') iv = Buffer.from(iv) if (config.mode !== 'GCM' && iv.length !== config.iv) throw new TypeError('invalid iv length ' + iv.length) if (typeof password === 'string') password = Buffer.from(password) if (password.length !== config.key / 8) throw new TypeError('invalid key length ' + password.length) if (config.type === 'stream') { return new StreamCipher(config.module, password, iv, true) } else if (config.type === 'auth') { return new AuthCipher(config.module, password, iv, true) } return new Decipher(config.module, password, iv) } function createDecipher (suite, password) { var config = MODES[suite.toLowerCase()] if (!config) throw new TypeError('invalid suite type') var keys = ebtk(password, false, config.key, config.iv) return createDecipheriv(suite, keys.key, keys.iv) } exports.createDecipher = createDecipher exports.createDecipheriv = createDecipheriv /***/ }), /***/ "./node_modules/browserify-aes/encrypter.js": /*!**************************************************!*\ !*** ./node_modules/browserify-aes/encrypter.js ***! \**************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var MODES = __webpack_require__(/*! ./modes */ "./node_modules/browserify-aes/modes/index.js") var AuthCipher = __webpack_require__(/*! ./authCipher */ "./node_modules/browserify-aes/authCipher.js") var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer var StreamCipher = __webpack_require__(/*! ./streamCipher */ "./node_modules/browserify-aes/streamCipher.js") var Transform = __webpack_require__(/*! cipher-base */ "./node_modules/cipher-base/index.js") var aes = __webpack_require__(/*! ./aes */ "./node_modules/browserify-aes/aes.js") var ebtk = __webpack_require__(/*! evp_bytestokey */ "./node_modules/evp_bytestokey/index.js") var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js") function Cipher (mode, key, iv) { Transform.call(this) this._cache = new Splitter() this._cipher = new aes.AES(key) this._prev = Buffer.from(iv) this._mode = mode this._autopadding = true } inherits(Cipher, Transform) Cipher.prototype._update = function (data) { this._cache.add(data) var chunk var thing var out = [] while ((chunk = this._cache.get())) { thing = this._mode.encrypt(this, chunk) out.push(thing) } return Buffer.concat(out) } var PADDING = Buffer.alloc(16, 0x10) Cipher.prototype._final = function () { var chunk = this._cache.flush() if (this._autopadding) { chunk = this._mode.encrypt(this, chunk) this._cipher.scrub() return chunk } if (!chunk.equals(PADDING)) { this._cipher.scrub() throw new Error('data not multiple of block length') } } Cipher.prototype.setAutoPadding = function (setTo) { this._autopadding = !!setTo return this } function Splitter () { this.cache = Buffer.allocUnsafe(0) } Splitter.prototype.add = function (data) { this.cache = Buffer.concat([this.cache, data]) } Splitter.prototype.get = function () { if (this.cache.length > 15) { var out = this.cache.slice(0, 16) this.cache = this.cache.slice(16) return out } return null } Splitter.prototype.flush = function () { var len = 16 - this.cache.length var padBuff = Buffer.allocUnsafe(len) var i = -1 while (++i < len) { padBuff.writeUInt8(len, i) } return Buffer.concat([this.cache, padBuff]) } function createCipheriv (suite, password, iv) { var config = MODES[suite.toLowerCase()] if (!config) throw new TypeError('invalid suite type') if (typeof password === 'string') password = Buffer.from(password) if (password.length !== config.key / 8) throw new TypeError('invalid key length ' + password.length) if (typeof iv === 'string') iv = Buffer.from(iv) if (config.mode !== 'GCM' && iv.length !== config.iv) throw new TypeError('invalid iv length ' + iv.length) if (config.type === 'stream') { return new StreamCipher(config.module, password, iv) } else if (config.type === 'auth') { return new AuthCipher(config.module, password, iv) } return new Cipher(config.module, password, iv) } function createCipher (suite, password) { var config = MODES[suite.toLowerCase()] if (!config) throw new TypeError('invalid suite type') var keys = ebtk(password, false, config.key, config.iv) return createCipheriv(suite, keys.key, keys.iv) } exports.createCipheriv = createCipheriv exports.createCipher = createCipher /***/ }), /***/ "./node_modules/browserify-aes/ghash.js": /*!**********************************************!*\ !*** ./node_modules/browserify-aes/ghash.js ***! \**********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer var ZEROES = Buffer.alloc(16, 0) function toArray (buf) { return [ buf.readUInt32BE(0), buf.readUInt32BE(4), buf.readUInt32BE(8), buf.readUInt32BE(12) ] } function fromArray (out) { var buf = Buffer.allocUnsafe(16) buf.writeUInt32BE(out[0] >>> 0, 0) buf.writeUInt32BE(out[1] >>> 0, 4) buf.writeUInt32BE(out[2] >>> 0, 8) buf.writeUInt32BE(out[3] >>> 0, 12) return buf } function GHASH (key) { this.h = key this.state = Buffer.alloc(16, 0) this.cache = Buffer.allocUnsafe(0) } // from http://bitwiseshiftleft.github.io/sjcl/doc/symbols/src/core_gcm.js.html // by Juho Vähä-Herttua GHASH.prototype.ghash = function (block) { var i = -1 while (++i < block.length) { this.state[i] ^= block[i] } this._multiply() } GHASH.prototype._multiply = function () { var Vi = toArray(this.h) var Zi = [0, 0, 0, 0] var j, xi, lsbVi var i = -1 while (++i < 128) { xi = (this.state[~~(i / 8)] & (1 << (7 - (i % 8)))) !== 0 if (xi) { // Z_i+1 = Z_i ^ V_i Zi[0] ^= Vi[0] Zi[1] ^= Vi[1] Zi[2] ^= Vi[2] Zi[3] ^= Vi[3] } // Store the value of LSB(V_i) lsbVi = (Vi[3] & 1) !== 0 // V_i+1 = V_i >> 1 for (j = 3; j > 0; j--) { Vi[j] = (Vi[j] >>> 1) | ((Vi[j - 1] & 1) << 31) } Vi[0] = Vi[0] >>> 1 // If LSB(V_i) is 1, V_i+1 = (V_i >> 1) ^ R if (lsbVi) { Vi[0] = Vi[0] ^ (0xe1 << 24) } } this.state = fromArray(Zi) } GHASH.prototype.update = function (buf) { this.cache = Buffer.concat([this.cache, buf]) var chunk while (this.cache.length >= 16) { chunk = this.cache.slice(0, 16) this.cache = this.cache.slice(16) this.ghash(chunk) } } GHASH.prototype.final = function (abl, bl) { if (this.cache.length) { this.ghash(Buffer.concat([this.cache, ZEROES], 16)) } this.ghash(fromArray([0, abl, 0, bl])) return this.state } module.exports = GHASH /***/ }), /***/ "./node_modules/browserify-aes/incr32.js": /*!***********************************************!*\ !*** ./node_modules/browserify-aes/incr32.js ***! \***********************************************/ /*! no static exports found */ /***/ (function(module, exports) { function incr32 (iv) { var len = iv.length var item while (len--) { item = iv.readUInt8(len) if (item === 255) { iv.writeUInt8(0, len) } else { item++ iv.writeUInt8(item, len) break } } } module.exports = incr32 /***/ }), /***/ "./node_modules/browserify-aes/modes/cbc.js": /*!**************************************************!*\ !*** ./node_modules/browserify-aes/modes/cbc.js ***! \**************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var xor = __webpack_require__(/*! buffer-xor */ "./node_modules/buffer-xor/index.js") exports.encrypt = function (self, block) { var data = xor(block, self._prev) self._prev = self._cipher.encryptBlock(data) return self._prev } exports.decrypt = function (self, block) { var pad = self._prev self._prev = block var out = self._cipher.decryptBlock(block) return xor(out, pad) } /***/ }), /***/ "./node_modules/browserify-aes/modes/cfb.js": /*!**************************************************!*\ !*** ./node_modules/browserify-aes/modes/cfb.js ***! \**************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer var xor = __webpack_require__(/*! buffer-xor */ "./node_modules/buffer-xor/index.js") function encryptStart (self, data, decrypt) { var len = data.length var out = xor(data, self._cache) self._cache = self._cache.slice(len) self._prev = Buffer.concat([self._prev, decrypt ? data : out]) return out } exports.encrypt = function (self, data, decrypt) { var out = Buffer.allocUnsafe(0) var len while (data.length) { if (self._cache.length === 0) { self._cache = self._cipher.encryptBlock(self._prev) self._prev = Buffer.allocUnsafe(0) } if (self._cache.length <= data.length) { len = self._cache.length out = Buffer.concat([out, encryptStart(self, data.slice(0, len), decrypt)]) data = data.slice(len) } else { out = Buffer.concat([out, encryptStart(self, data, decrypt)]) break } } return out } /***/ }), /***/ "./node_modules/browserify-aes/modes/cfb1.js": /*!***************************************************!*\ !*** ./node_modules/browserify-aes/modes/cfb1.js ***! \***************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer function encryptByte (self, byteParam, decrypt) { var pad var i = -1 var len = 8 var out = 0 var bit, value while (++i < len) { pad = self._cipher.encryptBlock(self._prev) bit = (byteParam & (1 << (7 - i))) ? 0x80 : 0 value = pad[0] ^ bit out += ((value & 0x80) >> (i % 8)) self._prev = shiftIn(self._prev, decrypt ? bit : value) } return out } function shiftIn (buffer, value) { var len = buffer.length var i = -1 var out = Buffer.allocUnsafe(buffer.length) buffer = Buffer.concat([buffer, Buffer.from([value])]) while (++i < len) { out[i] = buffer[i] << 1 | buffer[i + 1] >> (7) } return out } exports.encrypt = function (self, chunk, decrypt) { var len = chunk.length var out = Buffer.allocUnsafe(len) var i = -1 while (++i < len) { out[i] = encryptByte(self, chunk[i], decrypt) } return out } /***/ }), /***/ "./node_modules/browserify-aes/modes/cfb8.js": /*!***************************************************!*\ !*** ./node_modules/browserify-aes/modes/cfb8.js ***! \***************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer function encryptByte (self, byteParam, decrypt) { var pad = self._cipher.encryptBlock(self._prev) var out = pad[0] ^ byteParam self._prev = Buffer.concat([ self._prev.slice(1), Buffer.from([decrypt ? byteParam : out]) ]) return out } exports.encrypt = function (self, chunk, decrypt) { var len = chunk.length var out = Buffer.allocUnsafe(len) var i = -1 while (++i < len) { out[i] = encryptByte(self, chunk[i], decrypt) } return out } /***/ }), /***/ "./node_modules/browserify-aes/modes/ctr.js": /*!**************************************************!*\ !*** ./node_modules/browserify-aes/modes/ctr.js ***! \**************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var xor = __webpack_require__(/*! buffer-xor */ "./node_modules/buffer-xor/index.js") var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer var incr32 = __webpack_require__(/*! ../incr32 */ "./node_modules/browserify-aes/incr32.js") function getBlock (self) { var out = self._cipher.encryptBlockRaw(self._prev) incr32(self._prev) return out } var blockSize = 16 exports.encrypt = function (self, chunk) { var chunkNum = Math.ceil(chunk.length / blockSize) var start = self._cache.length self._cache = Buffer.concat([ self._cache, Buffer.allocUnsafe(chunkNum * blockSize) ]) for (var i = 0; i < chunkNum; i++) { var out = getBlock(self) var offset = start + i * blockSize self._cache.writeUInt32BE(out[0], offset + 0) self._cache.writeUInt32BE(out[1], offset + 4) self._cache.writeUInt32BE(out[2], offset + 8) self._cache.writeUInt32BE(out[3], offset + 12) } var pad = self._cache.slice(0, chunk.length) self._cache = self._cache.slice(chunk.length) return xor(chunk, pad) } /***/ }), /***/ "./node_modules/browserify-aes/modes/ecb.js": /*!**************************************************!*\ !*** ./node_modules/browserify-aes/modes/ecb.js ***! \**************************************************/ /*! no static exports found */ /***/ (function(module, exports) { exports.encrypt = function (self, block) { return self._cipher.encryptBlock(block) } exports.decrypt = function (self, block) { return self._cipher.decryptBlock(block) } /***/ }), /***/ "./node_modules/browserify-aes/modes/index.js": /*!****************************************************!*\ !*** ./node_modules/browserify-aes/modes/index.js ***! \****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var modeModules = { ECB: __webpack_require__(/*! ./ecb */ "./node_modules/browserify-aes/modes/ecb.js"), CBC: __webpack_require__(/*! ./cbc */ "./node_modules/browserify-aes/modes/cbc.js"), CFB: __webpack_require__(/*! ./cfb */ "./node_modules/browserify-aes/modes/cfb.js"), CFB8: __webpack_require__(/*! ./cfb8 */ "./node_modules/browserify-aes/modes/cfb8.js"), CFB1: __webpack_require__(/*! ./cfb1 */ "./node_modules/browserify-aes/modes/cfb1.js"), OFB: __webpack_require__(/*! ./ofb */ "./node_modules/browserify-aes/modes/ofb.js"), CTR: __webpack_require__(/*! ./ctr */ "./node_modules/browserify-aes/modes/ctr.js"), GCM: __webpack_require__(/*! ./ctr */ "./node_modules/browserify-aes/modes/ctr.js") } var modes = __webpack_require__(/*! ./list.json */ "./node_modules/browserify-aes/modes/list.json") for (var key in modes) { modes[key].module = modeModules[modes[key].mode] } module.exports = modes /***/ }), /***/ "./node_modules/browserify-aes/modes/list.json": /*!*****************************************************!*\ !*** ./node_modules/browserify-aes/modes/list.json ***! \*****************************************************/ /*! exports provided: aes-128-ecb, aes-192-ecb, aes-256-ecb, aes-128-cbc, aes-192-cbc, aes-256-cbc, aes128, aes192, aes256, aes-128-cfb, aes-192-cfb, aes-256-cfb, aes-128-cfb8, aes-192-cfb8, aes-256-cfb8, aes-128-cfb1, aes-192-cfb1, aes-256-cfb1, aes-128-ofb, aes-192-ofb, aes-256-ofb, aes-128-ctr, aes-192-ctr, aes-256-ctr, aes-128-gcm, aes-192-gcm, aes-256-gcm, default */ /***/ (function(module) { module.exports = {"aes-128-ecb":{"cipher":"AES","key":128,"iv":0,"mode":"ECB","type":"block"},"aes-192-ecb":{"cipher":"AES","key":192,"iv":0,"mode":"ECB","type":"block"},"aes-256-ecb":{"cipher":"AES","key":256,"iv":0,"mode":"ECB","type":"block"},"aes-128-cbc":{"cipher":"AES","key":128,"iv":16,"mode":"CBC","type":"block"},"aes-192-cbc":{"cipher":"AES","key":192,"iv":16,"mode":"CBC","type":"block"},"aes-256-cbc":{"cipher":"AES","key":256,"iv":16,"mode":"CBC","type":"block"},"aes128":{"cipher":"AES","key":128,"iv":16,"mode":"CBC","type":"block"},"aes192":{"cipher":"AES","key":192,"iv":16,"mode":"CBC","type":"block"},"aes256":{"cipher":"AES","key":256,"iv":16,"mode":"CBC","type":"block"},"aes-128-cfb":{"cipher":"AES","key":128,"iv":16,"mode":"CFB","type":"stream"},"aes-192-cfb":{"cipher":"AES","key":192,"iv":16,"mode":"CFB","type":"stream"},"aes-256-cfb":{"cipher":"AES","key":256,"iv":16,"mode":"CFB","type":"stream"},"aes-128-cfb8":{"cipher":"AES","key":128,"iv":16,"mode":"CFB8","type":"stream"},"aes-192-cfb8":{"cipher":"AES","key":192,"iv":16,"mode":"CFB8","type":"stream"},"aes-256-cfb8":{"cipher":"AES","key":256,"iv":16,"mode":"CFB8","type":"stream"},"aes-128-cfb1":{"cipher":"AES","key":128,"iv":16,"mode":"CFB1","type":"stream"},"aes-192-cfb1":{"cipher":"AES","key":192,"iv":16,"mode":"CFB1","type":"stream"},"aes-256-cfb1":{"cipher":"AES","key":256,"iv":16,"mode":"CFB1","type":"stream"},"aes-128-ofb":{"cipher":"AES","key":128,"iv":16,"mode":"OFB","type":"stream"},"aes-192-ofb":{"cipher":"AES","key":192,"iv":16,"mode":"OFB","type":"stream"},"aes-256-ofb":{"cipher":"AES","key":256,"iv":16,"mode":"OFB","type":"stream"},"aes-128-ctr":{"cipher":"AES","key":128,"iv":16,"mode":"CTR","type":"stream"},"aes-192-ctr":{"cipher":"AES","key":192,"iv":16,"mode":"CTR","type":"stream"},"aes-256-ctr":{"cipher":"AES","key":256,"iv":16,"mode":"CTR","type":"stream"},"aes-128-gcm":{"cipher":"AES","key":128,"iv":12,"mode":"GCM","type":"auth"},"aes-192-gcm":{"cipher":"AES","key":192,"iv":12,"mode":"GCM","type":"auth"},"aes-256-gcm":{"cipher":"AES","key":256,"iv":12,"mode":"GCM","type":"auth"}}; /***/ }), /***/ "./node_modules/browserify-aes/modes/ofb.js": /*!**************************************************!*\ !*** ./node_modules/browserify-aes/modes/ofb.js ***! \**************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(Buffer) {var xor = __webpack_require__(/*! buffer-xor */ "./node_modules/buffer-xor/index.js") function getBlock (self) { self._prev = self._cipher.encryptBlock(self._prev) return self._prev } exports.encrypt = function (self, chunk) { while (self._cache.length < chunk.length) { self._cache = Buffer.concat([self._cache, getBlock(self)]) } var pad = self._cache.slice(0, chunk.length) self._cache = self._cache.slice(chunk.length) return xor(chunk, pad) } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../buffer/index.js */ "./node_modules/buffer/index.js").Buffer)) /***/ }), /***/ "./node_modules/browserify-aes/streamCipher.js": /*!*****************************************************!*\ !*** ./node_modules/browserify-aes/streamCipher.js ***! \*****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var aes = __webpack_require__(/*! ./aes */ "./node_modules/browserify-aes/aes.js") var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer var Transform = __webpack_require__(/*! cipher-base */ "./node_modules/cipher-base/index.js") var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js") function StreamCipher (mode, key, iv, decrypt) { Transform.call(this) this._cipher = new aes.AES(key) this._prev = Buffer.from(iv) this._cache = Buffer.allocUnsafe(0) this._secCache = Buffer.allocUnsafe(0) this._decrypt = decrypt this._mode = mode } inherits(StreamCipher, Transform) StreamCipher.prototype._update = function (chunk) { return this._mode.encrypt(this, chunk, this._decrypt) } StreamCipher.prototype._final = function () { this._cipher.scrub() } module.exports = StreamCipher /***/ }), /***/ "./node_modules/browserify-cipher/browser.js": /*!***************************************************!*\ !*** ./node_modules/browserify-cipher/browser.js ***! \***************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var DES = __webpack_require__(/*! browserify-des */ "./node_modules/browserify-des/index.js") var aes = __webpack_require__(/*! browserify-aes/browser */ "./node_modules/browserify-aes/browser.js") var aesModes = __webpack_require__(/*! browserify-aes/modes */ "./node_modules/browserify-aes/modes/index.js") var desModes = __webpack_require__(/*! browserify-des/modes */ "./node_modules/browserify-des/modes.js") var ebtk = __webpack_require__(/*! evp_bytestokey */ "./node_modules/evp_bytestokey/index.js") function createCipher (suite, password) { suite = suite.toLowerCase() var keyLen, ivLen if (aesModes[suite]) { keyLen = aesModes[suite].key ivLen = aesModes[suite].iv } else if (desModes[suite]) { keyLen = desModes[suite].key * 8 ivLen = desModes[suite].iv } else { throw new TypeError('invalid suite type') } var keys = ebtk(password, false, keyLen, ivLen) return createCipheriv(suite, keys.key, keys.iv) } function createDecipher (suite, password) { suite = suite.toLowerCase() var keyLen, ivLen if (aesModes[suite]) { keyLen = aesModes[suite].key ivLen = aesModes[suite].iv } else if (desModes[suite]) { keyLen = desModes[suite].key * 8 ivLen = desModes[suite].iv } else { throw new TypeError('invalid suite type') } var keys = ebtk(password, false, keyLen, ivLen) return createDecipheriv(suite, keys.key, keys.iv) } function createCipheriv (suite, key, iv) { suite = suite.toLowerCase() if (aesModes[suite]) return aes.createCipheriv(suite, key, iv) if (desModes[suite]) return new DES({ key: key, iv: iv, mode: suite }) throw new TypeError('invalid suite type') } function createDecipheriv (suite, key, iv) { suite = suite.toLowerCase() if (aesModes[suite]) return aes.createDecipheriv(suite, key, iv) if (desModes[suite]) return new DES({ key: key, iv: iv, mode: suite, decrypt: true }) throw new TypeError('invalid suite type') } function getCiphers () { return Object.keys(desModes).concat(aes.getCiphers()) } exports.createCipher = exports.Cipher = createCipher exports.createCipheriv = exports.Cipheriv = createCipheriv exports.createDecipher = exports.Decipher = createDecipher exports.createDecipheriv = exports.Decipheriv = createDecipheriv exports.listCiphers = exports.getCiphers = getCiphers /***/ }), /***/ "./node_modules/browserify-des/index.js": /*!**********************************************!*\ !*** ./node_modules/browserify-des/index.js ***! \**********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var CipherBase = __webpack_require__(/*! cipher-base */ "./node_modules/cipher-base/index.js") var des = __webpack_require__(/*! des.js */ "./node_modules/des.js/lib/des.js") var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js") var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer var modes = { 'des-ede3-cbc': des.CBC.instantiate(des.EDE), 'des-ede3': des.EDE, 'des-ede-cbc': des.CBC.instantiate(des.EDE), 'des-ede': des.EDE, 'des-cbc': des.CBC.instantiate(des.DES), 'des-ecb': des.DES } modes.des = modes['des-cbc'] modes.des3 = modes['des-ede3-cbc'] module.exports = DES inherits(DES, CipherBase) function DES (opts) { CipherBase.call(this) var modeName = opts.mode.toLowerCase() var mode = modes[modeName] var type if (opts.decrypt) { type = 'decrypt' } else { type = 'encrypt' } var key = opts.key if (!Buffer.isBuffer(key)) { key = Buffer.from(key) } if (modeName === 'des-ede' || modeName === 'des-ede-cbc') { key = Buffer.concat([key, key.slice(0, 8)]) } var iv = opts.iv if (!Buffer.isBuffer(iv)) { iv = Buffer.from(iv) } this._des = mode.create({ key: key, iv: iv, type: type }) } DES.prototype._update = function (data) { return Buffer.from(this._des.update(data)) } DES.prototype._final = function () { return Buffer.from(this._des.final()) } /***/ }), /***/ "./node_modules/browserify-des/modes.js": /*!**********************************************!*\ !*** ./node_modules/browserify-des/modes.js ***! \**********************************************/ /*! no static exports found */ /***/ (function(module, exports) { exports['des-ecb'] = { key: 8, iv: 0 } exports['des-cbc'] = exports.des = { key: 8, iv: 8 } exports['des-ede3-cbc'] = exports.des3 = { key: 24, iv: 8 } exports['des-ede3'] = { key: 24, iv: 0 } exports['des-ede-cbc'] = { key: 16, iv: 8 } exports['des-ede'] = { key: 16, iv: 0 } /***/ }), /***/ "./node_modules/browserify-rsa/index.js": /*!**********************************************!*\ !*** ./node_modules/browserify-rsa/index.js ***! \**********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(Buffer) {var bn = __webpack_require__(/*! bn.js */ "./node_modules/bn.js/lib/bn.js"); var randomBytes = __webpack_require__(/*! randombytes */ "./node_modules/randombytes/browser.js"); module.exports = crt; function blind(priv) { var r = getr(priv); var blinder = r.toRed(bn.mont(priv.modulus)) .redPow(new bn(priv.publicExponent)).fromRed(); return { blinder: blinder, unblinder:r.invm(priv.modulus) }; } function crt(msg, priv) { var blinds = blind(priv); var len = priv.modulus.byteLength(); var mod = bn.mont(priv.modulus); var blinded = new bn(msg).mul(blinds.blinder).umod(priv.modulus); var c1 = blinded.toRed(bn.mont(priv.prime1)); var c2 = blinded.toRed(bn.mont(priv.prime2)); var qinv = priv.coefficient; var p = priv.prime1; var q = priv.prime2; var m1 = c1.redPow(priv.exponent1); var m2 = c2.redPow(priv.exponent2); m1 = m1.fromRed(); m2 = m2.fromRed(); var h = m1.isub(m2).imul(qinv).umod(p); h.imul(q); m2.iadd(h); return new Buffer(m2.imul(blinds.unblinder).umod(priv.modulus).toArray(false, len)); } crt.getr = getr; function getr(priv) { var len = priv.modulus.byteLength(); var r = new bn(randomBytes(len)); while (r.cmp(priv.modulus) >= 0 || !r.umod(priv.prime1) || !r.umod(priv.prime2)) { r = new bn(randomBytes(len)); } return r; } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../buffer/index.js */ "./node_modules/buffer/index.js").Buffer)) /***/ }), /***/ "./node_modules/browserify-sign/algos.js": /*!***********************************************!*\ !*** ./node_modules/browserify-sign/algos.js ***! \***********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { module.exports = __webpack_require__(/*! ./browser/algorithms.json */ "./node_modules/browserify-sign/browser/algorithms.json") /***/ }), /***/ "./node_modules/browserify-sign/browser/algorithms.json": /*!**************************************************************!*\ !*** ./node_modules/browserify-sign/browser/algorithms.json ***! \**************************************************************/ /*! exports provided: sha224WithRSAEncryption, RSA-SHA224, sha256WithRSAEncryption, RSA-SHA256, sha384WithRSAEncryption, RSA-SHA384, sha512WithRSAEncryption, RSA-SHA512, RSA-SHA1, ecdsa-with-SHA1, sha256, sha224, sha384, sha512, DSA-SHA, DSA-SHA1, DSA, DSA-WITH-SHA224, DSA-SHA224, DSA-WITH-SHA256, DSA-SHA256, DSA-WITH-SHA384, DSA-SHA384, DSA-WITH-SHA512, DSA-SHA512, DSA-RIPEMD160, ripemd160WithRSA, RSA-RIPEMD160, md5WithRSAEncryption, RSA-MD5, default */ /***/ (function(module) { module.exports = {"sha224WithRSAEncryption":{"sign":"rsa","hash":"sha224","id":"302d300d06096086480165030402040500041c"},"RSA-SHA224":{"sign":"ecdsa/rsa","hash":"sha224","id":"302d300d06096086480165030402040500041c"},"sha256WithRSAEncryption":{"sign":"rsa","hash":"sha256","id":"3031300d060960864801650304020105000420"},"RSA-SHA256":{"sign":"ecdsa/rsa","hash":"sha256","id":"3031300d060960864801650304020105000420"},"sha384WithRSAEncryption":{"sign":"rsa","hash":"sha384","id":"3041300d060960864801650304020205000430"},"RSA-SHA384":{"sign":"ecdsa/rsa","hash":"sha384","id":"3041300d060960864801650304020205000430"},"sha512WithRSAEncryption":{"sign":"rsa","hash":"sha512","id":"3051300d060960864801650304020305000440"},"RSA-SHA512":{"sign":"ecdsa/rsa","hash":"sha512","id":"3051300d060960864801650304020305000440"},"RSA-SHA1":{"sign":"rsa","hash":"sha1","id":"3021300906052b0e03021a05000414"},"ecdsa-with-SHA1":{"sign":"ecdsa","hash":"sha1","id":""},"sha256":{"sign":"ecdsa","hash":"sha256","id":""},"sha224":{"sign":"ecdsa","hash":"sha224","id":""},"sha384":{"sign":"ecdsa","hash":"sha384","id":""},"sha512":{"sign":"ecdsa","hash":"sha512","id":""},"DSA-SHA":{"sign":"dsa","hash":"sha1","id":""},"DSA-SHA1":{"sign":"dsa","hash":"sha1","id":""},"DSA":{"sign":"dsa","hash":"sha1","id":""},"DSA-WITH-SHA224":{"sign":"dsa","hash":"sha224","id":""},"DSA-SHA224":{"sign":"dsa","hash":"sha224","id":""},"DSA-WITH-SHA256":{"sign":"dsa","hash":"sha256","id":""},"DSA-SHA256":{"sign":"dsa","hash":"sha256","id":""},"DSA-WITH-SHA384":{"sign":"dsa","hash":"sha384","id":""},"DSA-SHA384":{"sign":"dsa","hash":"sha384","id":""},"DSA-WITH-SHA512":{"sign":"dsa","hash":"sha512","id":""},"DSA-SHA512":{"sign":"dsa","hash":"sha512","id":""},"DSA-RIPEMD160":{"sign":"dsa","hash":"rmd160","id":""},"ripemd160WithRSA":{"sign":"rsa","hash":"rmd160","id":"3021300906052b2403020105000414"},"RSA-RIPEMD160":{"sign":"rsa","hash":"rmd160","id":"3021300906052b2403020105000414"},"md5WithRSAEncryption":{"sign":"rsa","hash":"md5","id":"3020300c06082a864886f70d020505000410"},"RSA-MD5":{"sign":"rsa","hash":"md5","id":"3020300c06082a864886f70d020505000410"}}; /***/ }), /***/ "./node_modules/browserify-sign/browser/curves.json": /*!**********************************************************!*\ !*** ./node_modules/browserify-sign/browser/curves.json ***! \**********************************************************/ /*! exports provided: 1.3.132.0.10, 1.3.132.0.33, 1.2.840.10045.3.1.1, 1.2.840.10045.3.1.7, 1.3.132.0.34, 1.3.132.0.35, default */ /***/ (function(module) { module.exports = {"1.3.132.0.10":"secp256k1","1.3.132.0.33":"p224","1.2.840.10045.3.1.1":"p192","1.2.840.10045.3.1.7":"p256","1.3.132.0.34":"p384","1.3.132.0.35":"p521"}; /***/ }), /***/ "./node_modules/browserify-sign/browser/index.js": /*!*******************************************************!*\ !*** ./node_modules/browserify-sign/browser/index.js ***! \*******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(Buffer) {var createHash = __webpack_require__(/*! create-hash */ "./node_modules/create-hash/browser.js") var stream = __webpack_require__(/*! stream */ "./node_modules/stream-browserify/index.js") var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js") var sign = __webpack_require__(/*! ./sign */ "./node_modules/browserify-sign/browser/sign.js") var verify = __webpack_require__(/*! ./verify */ "./node_modules/browserify-sign/browser/verify.js") var algorithms = __webpack_require__(/*! ./algorithms.json */ "./node_modules/browserify-sign/browser/algorithms.json") Object.keys(algorithms).forEach(function (key) { algorithms[key].id = new Buffer(algorithms[key].id, 'hex') algorithms[key.toLowerCase()] = algorithms[key] }) function Sign (algorithm) { stream.Writable.call(this) var data = algorithms[algorithm] if (!data) throw new Error('Unknown message digest') this._hashType = data.hash this._hash = createHash(data.hash) this._tag = data.id this._signType = data.sign } inherits(Sign, stream.Writable) Sign.prototype._write = function _write (data, _, done) { this._hash.update(data) done() } Sign.prototype.update = function update (data, enc) { if (typeof data === 'string') data = new Buffer(data, enc) this._hash.update(data) return this } Sign.prototype.sign = function signMethod (key, enc) { this.end() var hash = this._hash.digest() var sig = sign(hash, key, this._hashType, this._signType, this._tag) return enc ? sig.toString(enc) : sig } function Verify (algorithm) { stream.Writable.call(this) var data = algorithms[algorithm] if (!data) throw new Error('Unknown message digest') this._hash = createHash(data.hash) this._tag = data.id this._signType = data.sign } inherits(Verify, stream.Writable) Verify.prototype._write = function _write (data, _, done) { this._hash.update(data) done() } Verify.prototype.update = function update (data, enc) { if (typeof data === 'string') data = new Buffer(data, enc) this._hash.update(data) return this } Verify.prototype.verify = function verifyMethod (key, sig, enc) { if (typeof sig === 'string') sig = new Buffer(sig, enc) this.end() var hash = this._hash.digest() return verify(sig, hash, key, this._signType, this._tag) } function createSign (algorithm) { return new Sign(algorithm) } function createVerify (algorithm) { return new Verify(algorithm) } module.exports = { Sign: createSign, Verify: createVerify, createSign: createSign, createVerify: createVerify } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../buffer/index.js */ "./node_modules/buffer/index.js").Buffer)) /***/ }), /***/ "./node_modules/browserify-sign/browser/sign.js": /*!******************************************************!*\ !*** ./node_modules/browserify-sign/browser/sign.js ***! \******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(Buffer) {// much of this based on https://github.com/indutny/self-signed/blob/gh-pages/lib/rsa.js var createHmac = __webpack_require__(/*! create-hmac */ "./node_modules/create-hmac/browser.js") var crt = __webpack_require__(/*! browserify-rsa */ "./node_modules/browserify-rsa/index.js") var EC = __webpack_require__(/*! elliptic */ "./node_modules/elliptic/lib/elliptic.js").ec var BN = __webpack_require__(/*! bn.js */ "./node_modules/bn.js/lib/bn.js") var parseKeys = __webpack_require__(/*! parse-asn1 */ "./node_modules/parse-asn1/index.js") var curves = __webpack_require__(/*! ./curves.json */ "./node_modules/browserify-sign/browser/curves.json") function sign (hash, key, hashType, signType, tag) { var priv = parseKeys(key) if (priv.curve) { // rsa keys can be interpreted as ecdsa ones in openssl if (signType !== 'ecdsa' && signType !== 'ecdsa/rsa') throw new Error('wrong private key type') return ecSign(hash, priv) } else if (priv.type === 'dsa') { if (signType !== 'dsa') throw new Error('wrong private key type') return dsaSign(hash, priv, hashType) } else { if (signType !== 'rsa' && signType !== 'ecdsa/rsa') throw new Error('wrong private key type') } hash = Buffer.concat([tag, hash]) var len = priv.modulus.byteLength() var pad = [ 0, 1 ] while (hash.length + pad.length + 1 < len) pad.push(0xff) pad.push(0x00) var i = -1 while (++i < hash.length) pad.push(hash[i]) var out = crt(pad, priv) return out } function ecSign (hash, priv) { var curveId = curves[priv.curve.join('.')] if (!curveId) throw new Error('unknown curve ' + priv.curve.join('.')) var curve = new EC(curveId) var key = curve.keyFromPrivate(priv.privateKey) var out = key.sign(hash) return new Buffer(out.toDER()) } function dsaSign (hash, priv, algo) { var x = priv.params.priv_key var p = priv.params.p var q = priv.params.q var g = priv.params.g var r = new BN(0) var k var H = bits2int(hash, q).mod(q) var s = false var kv = getKey(x, q, hash, algo) while (s === false) { k = makeKey(q, kv, algo) r = makeR(g, k, p, q) s = k.invm(q).imul(H.add(x.mul(r))).mod(q) if (s.cmpn(0) === 0) { s = false r = new BN(0) } } return toDER(r, s) } function toDER (r, s) { r = r.toArray() s = s.toArray() // Pad values if (r[0] & 0x80) r = [ 0 ].concat(r) if (s[0] & 0x80) s = [ 0 ].concat(s) var total = r.length + s.length + 4 var res = [ 0x30, total, 0x02, r.length ] res = res.concat(r, [ 0x02, s.length ], s) return new Buffer(res) } function getKey (x, q, hash, algo) { x = new Buffer(x.toArray()) if (x.length < q.byteLength()) { var zeros = new Buffer(q.byteLength() - x.length) zeros.fill(0) x = Buffer.concat([ zeros, x ]) } var hlen = hash.length var hbits = bits2octets(hash, q) var v = new Buffer(hlen) v.fill(1) var k = new Buffer(hlen) k.fill(0) k = createHmac(algo, k).update(v).update(new Buffer([ 0 ])).update(x).update(hbits).digest() v = createHmac(algo, k).update(v).digest() k = createHmac(algo, k).update(v).update(new Buffer([ 1 ])).update(x).update(hbits).digest() v = createHmac(algo, k).update(v).digest() return { k: k, v: v } } function bits2int (obits, q) { var bits = new BN(obits) var shift = (obits.length << 3) - q.bitLength() if (shift > 0) bits.ishrn(shift) return bits } function bits2octets (bits, q) { bits = bits2int(bits, q) bits = bits.mod(q) var out = new Buffer(bits.toArray()) if (out.length < q.byteLength()) { var zeros = new Buffer(q.byteLength() - out.length) zeros.fill(0) out = Buffer.concat([ zeros, out ]) } return out } function makeKey (q, kv, algo) { var t var k do { t = new Buffer(0) while (t.length * 8 < q.bitLength()) { kv.v = createHmac(algo, kv.k).update(kv.v).digest() t = Buffer.concat([ t, kv.v ]) } k = bits2int(t, q) kv.k = createHmac(algo, kv.k).update(kv.v).update(new Buffer([ 0 ])).digest() kv.v = createHmac(algo, kv.k).update(kv.v).digest() } while (k.cmp(q) !== -1) return k } function makeR (g, k, p, q) { return g.toRed(BN.mont(p)).redPow(k).fromRed().mod(q) } module.exports = sign module.exports.getKey = getKey module.exports.makeKey = makeKey /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../buffer/index.js */ "./node_modules/buffer/index.js").Buffer)) /***/ }), /***/ "./node_modules/browserify-sign/browser/verify.js": /*!********************************************************!*\ !*** ./node_modules/browserify-sign/browser/verify.js ***! \********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(Buffer) {// much of this based on https://github.com/indutny/self-signed/blob/gh-pages/lib/rsa.js var BN = __webpack_require__(/*! bn.js */ "./node_modules/bn.js/lib/bn.js") var EC = __webpack_require__(/*! elliptic */ "./node_modules/elliptic/lib/elliptic.js").ec var parseKeys = __webpack_require__(/*! parse-asn1 */ "./node_modules/parse-asn1/index.js") var curves = __webpack_require__(/*! ./curves.json */ "./node_modules/browserify-sign/browser/curves.json") function verify (sig, hash, key, signType, tag) { var pub = parseKeys(key) if (pub.type === 'ec') { // rsa keys can be interpreted as ecdsa ones in openssl if (signType !== 'ecdsa' && signType !== 'ecdsa/rsa') throw new Error('wrong public key type') return ecVerify(sig, hash, pub) } else if (pub.type === 'dsa') { if (signType !== 'dsa') throw new Error('wrong public key type') return dsaVerify(sig, hash, pub) } else { if (signType !== 'rsa' && signType !== 'ecdsa/rsa') throw new Error('wrong public key type') } hash = Buffer.concat([tag, hash]) var len = pub.modulus.byteLength() var pad = [ 1 ] var padNum = 0 while (hash.length + pad.length + 2 < len) { pad.push(0xff) padNum++ } pad.push(0x00) var i = -1 while (++i < hash.length) { pad.push(hash[i]) } pad = new Buffer(pad) var red = BN.mont(pub.modulus) sig = new BN(sig).toRed(red) sig = sig.redPow(new BN(pub.publicExponent)) sig = new Buffer(sig.fromRed().toArray()) var out = padNum < 8 ? 1 : 0 len = Math.min(sig.length, pad.length) if (sig.length !== pad.length) out = 1 i = -1 while (++i < len) out |= sig[i] ^ pad[i] return out === 0 } function ecVerify (sig, hash, pub) { var curveId = curves[pub.data.algorithm.curve.join('.')] if (!curveId) throw new Error('unknown curve ' + pub.data.algorithm.curve.join('.')) var curve = new EC(curveId) var pubkey = pub.data.subjectPrivateKey.data return curve.verify(hash, sig, pubkey) } function dsaVerify (sig, hash, pub) { var p = pub.data.p var q = pub.data.q var g = pub.data.g var y = pub.data.pub_key var unpacked = parseKeys.signature.decode(sig, 'der') var s = unpacked.s var r = unpacked.r checkValue(s, q) checkValue(r, q) var montp = BN.mont(p) var w = s.invm(q) var v = g.toRed(montp) .redPow(new BN(hash).mul(w).mod(q)) .fromRed() .mul(y.toRed(montp).redPow(r.mul(w).mod(q)).fromRed()) .mod(p) .mod(q) return v.cmp(r) === 0 } function checkValue (b, q) { if (b.cmpn(0) <= 0) throw new Error('invalid sig') if (b.cmp(q) >= q) throw new Error('invalid sig') } module.exports = verify /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../buffer/index.js */ "./node_modules/buffer/index.js").Buffer)) /***/ }), /***/ "./node_modules/buffer-xor/index.js": /*!******************************************!*\ !*** ./node_modules/buffer-xor/index.js ***! \******************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(Buffer) {module.exports = function xor (a, b) { var length = Math.min(a.length, b.length) var buffer = new Buffer(length) for (var i = 0; i < length; ++i) { buffer[i] = a[i] ^ b[i] } return buffer } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../buffer/index.js */ "./node_modules/buffer/index.js").Buffer)) /***/ }), /***/ "./node_modules/buffer/index.js": /*!**************************************!*\ !*** ./node_modules/buffer/index.js ***! \**************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global) {/*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh * @license MIT */ /* eslint-disable no-proto */ var base64 = __webpack_require__(/*! base64-js */ "./node_modules/base64-js/index.js") var ieee754 = __webpack_require__(/*! ieee754 */ "./node_modules/ieee754/index.js") var isArray = __webpack_require__(/*! isarray */ "./node_modules/isarray/index.js") exports.Buffer = Buffer exports.SlowBuffer = SlowBuffer exports.INSPECT_MAX_BYTES = 50 /** * If `Buffer.TYPED_ARRAY_SUPPORT`: * === true Use Uint8Array implementation (fastest) * === false Use Object implementation (most compatible, even IE6) * * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, * Opera 11.6+, iOS 4.2+. * * Due to various browser bugs, sometimes the Object implementation will be used even * when the browser supports typed arrays. * * Note: * * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. * * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. * * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of * incorrect length in some situations. * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they * get the Object implementation, which is slower but behaves correctly. */ Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined ? global.TYPED_ARRAY_SUPPORT : typedArraySupport() /* * Export kMaxLength after typed array support is determined. */ exports.kMaxLength = kMaxLength() function typedArraySupport () { try { var arr = new Uint8Array(1) arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }} return arr.foo() === 42 && // typed array instances can be augmented typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` } catch (e) { return false } } function kMaxLength () { return Buffer.TYPED_ARRAY_SUPPORT ? 0x7fffffff : 0x3fffffff } function createBuffer (that, length) { if (kMaxLength() < length) { throw new RangeError('Invalid typed array length') } if (Buffer.TYPED_ARRAY_SUPPORT) { // Return an augmented `Uint8Array` instance, for best performance that = new Uint8Array(length) that.__proto__ = Buffer.prototype } else { // Fallback: Return an object instance of the Buffer class if (that === null) { that = new Buffer(length) } that.length = length } return that } /** * The Buffer constructor returns instances of `Uint8Array` that have their * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of * `Uint8Array`, so the returned instances will have all the node `Buffer` methods * and the `Uint8Array` methods. Square bracket notation works as expected -- it * returns a single octet. * * The `Uint8Array` prototype remains unmodified. */ function Buffer (arg, encodingOrOffset, length) { if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) { return new Buffer(arg, encodingOrOffset, length) } // Common case. if (typeof arg === 'number') { if (typeof encodingOrOffset === 'string') { throw new Error( 'If encoding is specified then the first argument must be a string' ) } return allocUnsafe(this, arg) } return from(this, arg, encodingOrOffset, length) } Buffer.poolSize = 8192 // not used by this implementation // TODO: Legacy, not needed anymore. Remove in next major version. Buffer._augment = function (arr) { arr.__proto__ = Buffer.prototype return arr } function from (that, value, encodingOrOffset, length) { if (typeof value === 'number') { throw new TypeError('"value" argument must not be a number') } if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { return fromArrayBuffer(that, value, encodingOrOffset, length) } if (typeof value === 'string') { return fromString(that, value, encodingOrOffset) } return fromObject(that, value) } /** * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError * if value is a number. * Buffer.from(str[, encoding]) * Buffer.from(array) * Buffer.from(buffer) * Buffer.from(arrayBuffer[, byteOffset[, length]]) **/ Buffer.from = function (value, encodingOrOffset, length) { return from(null, value, encodingOrOffset, length) } if (Buffer.TYPED_ARRAY_SUPPORT) { Buffer.prototype.__proto__ = Uint8Array.prototype Buffer.__proto__ = Uint8Array if (typeof Symbol !== 'undefined' && Symbol.species && Buffer[Symbol.species] === Buffer) { // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 Object.defineProperty(Buffer, Symbol.species, { value: null, configurable: true }) } } function assertSize (size) { if (typeof size !== 'number') { throw new TypeError('"size" argument must be a number') } else if (size < 0) { throw new RangeError('"size" argument must not be negative') } } function alloc (that, size, fill, encoding) { assertSize(size) if (size <= 0) { return createBuffer(that, size) } if (fill !== undefined) { // Only pay attention to encoding if it's a string. This // prevents accidentally sending in a number that would // be interpretted as a start offset. return typeof encoding === 'string' ? createBuffer(that, size).fill(fill, encoding) : createBuffer(that, size).fill(fill) } return createBuffer(that, size) } /** * Creates a new filled Buffer instance. * alloc(size[, fill[, encoding]]) **/ Buffer.alloc = function (size, fill, encoding) { return alloc(null, size, fill, encoding) } function allocUnsafe (that, size) { assertSize(size) that = createBuffer(that, size < 0 ? 0 : checked(size) | 0) if (!Buffer.TYPED_ARRAY_SUPPORT) { for (var i = 0; i < size; ++i) { that[i] = 0 } } return that } /** * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. * */ Buffer.allocUnsafe = function (size) { return allocUnsafe(null, size) } /** * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. */ Buffer.allocUnsafeSlow = function (size) { return allocUnsafe(null, size) } function fromString (that, string, encoding) { if (typeof encoding !== 'string' || encoding === '') { encoding = 'utf8' } if (!Buffer.isEncoding(encoding)) { throw new TypeError('"encoding" must be a valid string encoding') } var length = byteLength(string, encoding) | 0 that = createBuffer(that, length) var actual = that.write(string, encoding) if (actual !== length) { // Writing a hex string, for example, that contains invalid characters will // cause everything after the first invalid character to be ignored. (e.g. // 'abxxcd' will be treated as 'ab') that = that.slice(0, actual) } return that } function fromArrayLike (that, array) { var length = array.length < 0 ? 0 : checked(array.length) | 0 that = createBuffer(that, length) for (var i = 0; i < length; i += 1) { that[i] = array[i] & 255 } return that } function fromArrayBuffer (that, array, byteOffset, length) { array.byteLength // this throws if `array` is not a valid ArrayBuffer if (byteOffset < 0 || array.byteLength < byteOffset) { throw new RangeError('\'offset\' is out of bounds') } if (array.byteLength < byteOffset + (length || 0)) { throw new RangeError('\'length\' is out of bounds') } if (byteOffset === undefined && length === undefined) { array = new Uint8Array(array) } else if (length === undefined) { array = new Uint8Array(array, byteOffset) } else { array = new Uint8Array(array, byteOffset, length) } if (Buffer.TYPED_ARRAY_SUPPORT) { // Return an augmented `Uint8Array` instance, for best performance that = array that.__proto__ = Buffer.prototype } else { // Fallback: Return an object instance of the Buffer class that = fromArrayLike(that, array) } return that } function fromObject (that, obj) { if (Buffer.isBuffer(obj)) { var len = checked(obj.length) | 0 that = createBuffer(that, len) if (that.length === 0) { return that } obj.copy(that, 0, 0, len) return that } if (obj) { if ((typeof ArrayBuffer !== 'undefined' && obj.buffer instanceof ArrayBuffer) || 'length' in obj) { if (typeof obj.length !== 'number' || isnan(obj.length)) { return createBuffer(that, 0) } return fromArrayLike(that, obj) } if (obj.type === 'Buffer' && isArray(obj.data)) { return fromArrayLike(that, obj.data) } } throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') } function checked (length) { // Note: cannot use `length < kMaxLength()` here because that fails when // length is NaN (which is otherwise coerced to zero.) if (length >= kMaxLength()) { throw new RangeError('Attempt to allocate Buffer larger than maximum ' + 'size: 0x' + kMaxLength().toString(16) + ' bytes') } return length | 0 } function SlowBuffer (length) { if (+length != length) { // eslint-disable-line eqeqeq length = 0 } return Buffer.alloc(+length) } Buffer.isBuffer = function isBuffer (b) { return !!(b != null && b._isBuffer) } Buffer.compare = function compare (a, b) { if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { throw new TypeError('Arguments must be Buffers') } if (a === b) return 0 var x = a.length var y = b.length for (var i = 0, len = Math.min(x, y); i < len; ++i) { if (a[i] !== b[i]) { x = a[i] y = b[i] break } } if (x < y) return -1 if (y < x) return 1 return 0 } Buffer.isEncoding = function isEncoding (encoding) { switch (String(encoding).toLowerCase()) { case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'latin1': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return true default: return false } } Buffer.concat = function concat (list, length) { if (!isArray(list)) { throw new TypeError('"list" argument must be an Array of Buffers') } if (list.length === 0) { return Buffer.alloc(0) } var i if (length === undefined) { length = 0 for (i = 0; i < list.length; ++i) { length += list[i].length } } var buffer = Buffer.allocUnsafe(length) var pos = 0 for (i = 0; i < list.length; ++i) { var buf = list[i] if (!Buffer.isBuffer(buf)) { throw new TypeError('"list" argument must be an Array of Buffers') } buf.copy(buffer, pos) pos += buf.length } return buffer } function byteLength (string, encoding) { if (Buffer.isBuffer(string)) { return string.length } if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { return string.byteLength } if (typeof string !== 'string') { string = '' + string } var len = string.length if (len === 0) return 0 // Use a for loop to avoid recursion var loweredCase = false for (;;) { switch (encoding) { case 'ascii': case 'latin1': case 'binary': return len case 'utf8': case 'utf-8': case undefined: return utf8ToBytes(string).length case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return len * 2 case 'hex': return len >>> 1 case 'base64': return base64ToBytes(string).length default: if (loweredCase) return utf8ToBytes(string).length // assume utf8 encoding = ('' + encoding).toLowerCase() loweredCase = true } } } Buffer.byteLength = byteLength function slowToString (encoding, start, end) { var loweredCase = false // No need to verify that "this.length <= MAX_UINT32" since it's a read-only // property of a typed array. // This behaves neither like String nor Uint8Array in that we set start/end // to their upper/lower bounds if the value passed is out of range. // undefined is handled specially as per ECMA-262 6th Edition, // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. if (start === undefined || start < 0) { start = 0 } // Return early if start > this.length. Done here to prevent potential uint32 // coercion fail below. if (start > this.length) { return '' } if (end === undefined || end > this.length) { end = this.length } if (end <= 0) { return '' } // Force coersion to uint32. This will also coerce falsey/NaN values to 0. end >>>= 0 start >>>= 0 if (end <= start) { return '' } if (!encoding) encoding = 'utf8' while (true) { switch (encoding) { case 'hex': return hexSlice(this, start, end) case 'utf8': case 'utf-8': return utf8Slice(this, start, end) case 'ascii': return asciiSlice(this, start, end) case 'latin1': case 'binary': return latin1Slice(this, start, end) case 'base64': return base64Slice(this, start, end) case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return utf16leSlice(this, start, end) default: if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) encoding = (encoding + '').toLowerCase() loweredCase = true } } } // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect // Buffer instances. Buffer.prototype._isBuffer = true function swap (b, n, m) { var i = b[n] b[n] = b[m] b[m] = i } Buffer.prototype.swap16 = function swap16 () { var len = this.length if (len % 2 !== 0) { throw new RangeError('Buffer size must be a multiple of 16-bits') } for (var i = 0; i < len; i += 2) { swap(this, i, i + 1) } return this } Buffer.prototype.swap32 = function swap32 () { var len = this.length if (len % 4 !== 0) { throw new RangeError('Buffer size must be a multiple of 32-bits') } for (var i = 0; i < len; i += 4) { swap(this, i, i + 3) swap(this, i + 1, i + 2) } return this } Buffer.prototype.swap64 = function swap64 () { var len = this.length if (len % 8 !== 0) { throw new RangeError('Buffer size must be a multiple of 64-bits') } for (var i = 0; i < len; i += 8) { swap(this, i, i + 7) swap(this, i + 1, i + 6) swap(this, i + 2, i + 5) swap(this, i + 3, i + 4) } return this } Buffer.prototype.toString = function toString () { var length = this.length | 0 if (length === 0) return '' if (arguments.length === 0) return utf8Slice(this, 0, length) return slowToString.apply(this, arguments) } Buffer.prototype.equals = function equals (b) { if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') if (this === b) return true return Buffer.compare(this, b) === 0 } Buffer.prototype.inspect = function inspect () { var str = '' var max = exports.INSPECT_MAX_BYTES if (this.length > 0) { str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') if (this.length > max) str += ' ... ' } return '' } Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { if (!Buffer.isBuffer(target)) { throw new TypeError('Argument must be a Buffer') } if (start === undefined) { start = 0 } if (end === undefined) { end = target ? target.length : 0 } if (thisStart === undefined) { thisStart = 0 } if (thisEnd === undefined) { thisEnd = this.length } if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { throw new RangeError('out of range index') } if (thisStart >= thisEnd && start >= end) { return 0 } if (thisStart >= thisEnd) { return -1 } if (start >= end) { return 1 } start >>>= 0 end >>>= 0 thisStart >>>= 0 thisEnd >>>= 0 if (this === target) return 0 var x = thisEnd - thisStart var y = end - start var len = Math.min(x, y) var thisCopy = this.slice(thisStart, thisEnd) var targetCopy = target.slice(start, end) for (var i = 0; i < len; ++i) { if (thisCopy[i] !== targetCopy[i]) { x = thisCopy[i] y = targetCopy[i] break } } if (x < y) return -1 if (y < x) return 1 return 0 } // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, // OR the last index of `val` in `buffer` at offset <= `byteOffset`. // // Arguments: // - buffer - a Buffer to search // - val - a string, Buffer, or number // - byteOffset - an index into `buffer`; will be clamped to an int32 // - encoding - an optional encoding, relevant is val is a string // - dir - true for indexOf, false for lastIndexOf function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { // Empty buffer means no match if (buffer.length === 0) return -1 // Normalize byteOffset if (typeof byteOffset === 'string') { encoding = byteOffset byteOffset = 0 } else if (byteOffset > 0x7fffffff) { byteOffset = 0x7fffffff } else if (byteOffset < -0x80000000) { byteOffset = -0x80000000 } byteOffset = +byteOffset // Coerce to Number. if (isNaN(byteOffset)) { // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer byteOffset = dir ? 0 : (buffer.length - 1) } // Normalize byteOffset: negative offsets start from the end of the buffer if (byteOffset < 0) byteOffset = buffer.length + byteOffset if (byteOffset >= buffer.length) { if (dir) return -1 else byteOffset = buffer.length - 1 } else if (byteOffset < 0) { if (dir) byteOffset = 0 else return -1 } // Normalize val if (typeof val === 'string') { val = Buffer.from(val, encoding) } // Finally, search either indexOf (if dir is true) or lastIndexOf if (Buffer.isBuffer(val)) { // Special case: looking for empty string/buffer always fails if (val.length === 0) { return -1 } return arrayIndexOf(buffer, val, byteOffset, encoding, dir) } else if (typeof val === 'number') { val = val & 0xFF // Search for a byte value [0-255] if (Buffer.TYPED_ARRAY_SUPPORT && typeof Uint8Array.prototype.indexOf === 'function') { if (dir) { return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) } else { return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) } } return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) } throw new TypeError('val must be string, number or Buffer') } function arrayIndexOf (arr, val, byteOffset, encoding, dir) { var indexSize = 1 var arrLength = arr.length var valLength = val.length if (encoding !== undefined) { encoding = String(encoding).toLowerCase() if (encoding === 'ucs2' || encoding === 'ucs-2' || encoding === 'utf16le' || encoding === 'utf-16le') { if (arr.length < 2 || val.length < 2) { return -1 } indexSize = 2 arrLength /= 2 valLength /= 2 byteOffset /= 2 } } function read (buf, i) { if (indexSize === 1) { return buf[i] } else { return buf.readUInt16BE(i * indexSize) } } var i if (dir) { var foundIndex = -1 for (i = byteOffset; i < arrLength; i++) { if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { if (foundIndex === -1) foundIndex = i if (i - foundIndex + 1 === valLength) return foundIndex * indexSize } else { if (foundIndex !== -1) i -= i - foundIndex foundIndex = -1 } } } else { if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength for (i = byteOffset; i >= 0; i--) { var found = true for (var j = 0; j < valLength; j++) { if (read(arr, i + j) !== read(val, j)) { found = false break } } if (found) return i } } return -1 } Buffer.prototype.includes = function includes (val, byteOffset, encoding) { return this.indexOf(val, byteOffset, encoding) !== -1 } Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { return bidirectionalIndexOf(this, val, byteOffset, encoding, true) } Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { return bidirectionalIndexOf(this, val, byteOffset, encoding, false) } function hexWrite (buf, string, offset, length) { offset = Number(offset) || 0 var remaining = buf.length - offset if (!length) { length = remaining } else { length = Number(length) if (length > remaining) { length = remaining } } // must be an even number of digits var strLen = string.length if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') if (length > strLen / 2) { length = strLen / 2 } for (var i = 0; i < length; ++i) { var parsed = parseInt(string.substr(i * 2, 2), 16) if (isNaN(parsed)) return i buf[offset + i] = parsed } return i } function utf8Write (buf, string, offset, length) { return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) } function asciiWrite (buf, string, offset, length) { return blitBuffer(asciiToBytes(string), buf, offset, length) } function latin1Write (buf, string, offset, length) { return asciiWrite(buf, string, offset, length) } function base64Write (buf, string, offset, length) { return blitBuffer(base64ToBytes(string), buf, offset, length) } function ucs2Write (buf, string, offset, length) { return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) } Buffer.prototype.write = function write (string, offset, length, encoding) { // Buffer#write(string) if (offset === undefined) { encoding = 'utf8' length = this.length offset = 0 // Buffer#write(string, encoding) } else if (length === undefined && typeof offset === 'string') { encoding = offset length = this.length offset = 0 // Buffer#write(string, offset[, length][, encoding]) } else if (isFinite(offset)) { offset = offset | 0 if (isFinite(length)) { length = length | 0 if (encoding === undefined) encoding = 'utf8' } else { encoding = length length = undefined } // legacy write(string, encoding, offset, length) - remove in v0.13 } else { throw new Error( 'Buffer.write(string, encoding, offset[, length]) is no longer supported' ) } var remaining = this.length - offset if (length === undefined || length > remaining) length = remaining if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { throw new RangeError('Attempt to write outside buffer bounds') } if (!encoding) encoding = 'utf8' var loweredCase = false for (;;) { switch (encoding) { case 'hex': return hexWrite(this, string, offset, length) case 'utf8': case 'utf-8': return utf8Write(this, string, offset, length) case 'ascii': return asciiWrite(this, string, offset, length) case 'latin1': case 'binary': return latin1Write(this, string, offset, length) case 'base64': // Warning: maxLength not taken into account in base64Write return base64Write(this, string, offset, length) case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return ucs2Write(this, string, offset, length) default: if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) encoding = ('' + encoding).toLowerCase() loweredCase = true } } } Buffer.prototype.toJSON = function toJSON () { return { type: 'Buffer', data: Array.prototype.slice.call(this._arr || this, 0) } } function base64Slice (buf, start, end) { if (start === 0 && end === buf.length) { return base64.fromByteArray(buf) } else { return base64.fromByteArray(buf.slice(start, end)) } } function utf8Slice (buf, start, end) { end = Math.min(buf.length, end) var res = [] var i = start while (i < end) { var firstByte = buf[i] var codePoint = null var bytesPerSequence = (firstByte > 0xEF) ? 4 : (firstByte > 0xDF) ? 3 : (firstByte > 0xBF) ? 2 : 1 if (i + bytesPerSequence <= end) { var secondByte, thirdByte, fourthByte, tempCodePoint switch (bytesPerSequence) { case 1: if (firstByte < 0x80) { codePoint = firstByte } break case 2: secondByte = buf[i + 1] if ((secondByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) if (tempCodePoint > 0x7F) { codePoint = tempCodePoint } } break case 3: secondByte = buf[i + 1] thirdByte = buf[i + 2] if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { codePoint = tempCodePoint } } break case 4: secondByte = buf[i + 1] thirdByte = buf[i + 2] fourthByte = buf[i + 3] if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { codePoint = tempCodePoint } } } } if (codePoint === null) { // we did not generate a valid codePoint so insert a // replacement char (U+FFFD) and advance only 1 byte codePoint = 0xFFFD bytesPerSequence = 1 } else if (codePoint > 0xFFFF) { // encode to utf16 (surrogate pair dance) codePoint -= 0x10000 res.push(codePoint >>> 10 & 0x3FF | 0xD800) codePoint = 0xDC00 | codePoint & 0x3FF } res.push(codePoint) i += bytesPerSequence } return decodeCodePointsArray(res) } // Based on http://stackoverflow.com/a/22747272/680742, the browser with // the lowest limit is Chrome, with 0x10000 args. // We go 1 magnitude less, for safety var MAX_ARGUMENTS_LENGTH = 0x1000 function decodeCodePointsArray (codePoints) { var len = codePoints.length if (len <= MAX_ARGUMENTS_LENGTH) { return String.fromCharCode.apply(String, codePoints) // avoid extra slice() } // Decode in chunks to avoid "call stack size exceeded". var res = '' var i = 0 while (i < len) { res += String.fromCharCode.apply( String, codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) ) } return res } function asciiSlice (buf, start, end) { var ret = '' end = Math.min(buf.length, end) for (var i = start; i < end; ++i) { ret += String.fromCharCode(buf[i] & 0x7F) } return ret } function latin1Slice (buf, start, end) { var ret = '' end = Math.min(buf.length, end) for (var i = start; i < end; ++i) { ret += String.fromCharCode(buf[i]) } return ret } function hexSlice (buf, start, end) { var len = buf.length if (!start || start < 0) start = 0 if (!end || end < 0 || end > len) end = len var out = '' for (var i = start; i < end; ++i) { out += toHex(buf[i]) } return out } function utf16leSlice (buf, start, end) { var bytes = buf.slice(start, end) var res = '' for (var i = 0; i < bytes.length; i += 2) { res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) } return res } Buffer.prototype.slice = function slice (start, end) { var len = this.length start = ~~start end = end === undefined ? len : ~~end if (start < 0) { start += len if (start < 0) start = 0 } else if (start > len) { start = len } if (end < 0) { end += len if (end < 0) end = 0 } else if (end > len) { end = len } if (end < start) end = start var newBuf if (Buffer.TYPED_ARRAY_SUPPORT) { newBuf = this.subarray(start, end) newBuf.__proto__ = Buffer.prototype } else { var sliceLen = end - start newBuf = new Buffer(sliceLen, undefined) for (var i = 0; i < sliceLen; ++i) { newBuf[i] = this[i + start] } } return newBuf } /* * Need to make sure that buffer isn't trying to write out of bounds. */ function checkOffset (offset, ext, length) { if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') } Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var val = this[offset] var mul = 1 var i = 0 while (++i < byteLength && (mul *= 0x100)) { val += this[offset + i] * mul } return val } Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) { checkOffset(offset, byteLength, this.length) } var val = this[offset + --byteLength] var mul = 1 while (byteLength > 0 && (mul *= 0x100)) { val += this[offset + --byteLength] * mul } return val } Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { if (!noAssert) checkOffset(offset, 1, this.length) return this[offset] } Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) return this[offset] | (this[offset + 1] << 8) } Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) return (this[offset] << 8) | this[offset + 1] } Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return ((this[offset]) | (this[offset + 1] << 8) | (this[offset + 2] << 16)) + (this[offset + 3] * 0x1000000) } Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset] * 0x1000000) + ((this[offset + 1] << 16) | (this[offset + 2] << 8) | this[offset + 3]) } Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var val = this[offset] var mul = 1 var i = 0 while (++i < byteLength && (mul *= 0x100)) { val += this[offset + i] * mul } mul *= 0x80 if (val >= mul) val -= Math.pow(2, 8 * byteLength) return val } Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var i = byteLength var mul = 1 var val = this[offset + --i] while (i > 0 && (mul *= 0x100)) { val += this[offset + --i] * mul } mul *= 0x80 if (val >= mul) val -= Math.pow(2, 8 * byteLength) return val } Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { if (!noAssert) checkOffset(offset, 1, this.length) if (!(this[offset] & 0x80)) return (this[offset]) return ((0xff - this[offset] + 1) * -1) } Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) var val = this[offset] | (this[offset + 1] << 8) return (val & 0x8000) ? val | 0xFFFF0000 : val } Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) var val = this[offset + 1] | (this[offset] << 8) return (val & 0x8000) ? val | 0xFFFF0000 : val } Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset]) | (this[offset + 1] << 8) | (this[offset + 2] << 16) | (this[offset + 3] << 24) } Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset] << 24) | (this[offset + 1] << 16) | (this[offset + 2] << 8) | (this[offset + 3]) } Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return ieee754.read(this, offset, true, 23, 4) } Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return ieee754.read(this, offset, false, 23, 4) } Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { if (!noAssert) checkOffset(offset, 8, this.length) return ieee754.read(this, offset, true, 52, 8) } Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { if (!noAssert) checkOffset(offset, 8, this.length) return ieee754.read(this, offset, false, 52, 8) } function checkInt (buf, value, offset, ext, max, min) { if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') if (offset + ext > buf.length) throw new RangeError('Index out of range') } Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) { var maxBytes = Math.pow(2, 8 * byteLength) - 1 checkInt(this, value, offset, byteLength, maxBytes, 0) } var mul = 1 var i = 0 this[offset] = value & 0xFF while (++i < byteLength && (mul *= 0x100)) { this[offset + i] = (value / mul) & 0xFF } return offset + byteLength } Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) { var maxBytes = Math.pow(2, 8 * byteLength) - 1 checkInt(this, value, offset, byteLength, maxBytes, 0) } var i = byteLength - 1 var mul = 1 this[offset + i] = value & 0xFF while (--i >= 0 && (mul *= 0x100)) { this[offset + i] = (value / mul) & 0xFF } return offset + byteLength } Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) this[offset] = (value & 0xff) return offset + 1 } function objectWriteUInt16 (buf, value, offset, littleEndian) { if (value < 0) value = 0xffff + value + 1 for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> (littleEndian ? i : 1 - i) * 8 } } Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) } else { objectWriteUInt16(this, value, offset, true) } return offset + 2 } Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 8) this[offset + 1] = (value & 0xff) } else { objectWriteUInt16(this, value, offset, false) } return offset + 2 } function objectWriteUInt32 (buf, value, offset, littleEndian) { if (value < 0) value = 0xffffffff + value + 1 for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff } } Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset + 3] = (value >>> 24) this[offset + 2] = (value >>> 16) this[offset + 1] = (value >>> 8) this[offset] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, true) } return offset + 4 } Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) this[offset + 3] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, false) } return offset + 4 } Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 if (!noAssert) { var limit = Math.pow(2, 8 * byteLength - 1) checkInt(this, value, offset, byteLength, limit - 1, -limit) } var i = 0 var mul = 1 var sub = 0 this[offset] = value & 0xFF while (++i < byteLength && (mul *= 0x100)) { if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { sub = 1 } this[offset + i] = ((value / mul) >> 0) - sub & 0xFF } return offset + byteLength } Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 if (!noAssert) { var limit = Math.pow(2, 8 * byteLength - 1) checkInt(this, value, offset, byteLength, limit - 1, -limit) } var i = byteLength - 1 var mul = 1 var sub = 0 this[offset + i] = value & 0xFF while (--i >= 0 && (mul *= 0x100)) { if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { sub = 1 } this[offset + i] = ((value / mul) >> 0) - sub & 0xFF } return offset + byteLength } Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) if (value < 0) value = 0xff + value + 1 this[offset] = (value & 0xff) return offset + 1 } Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) } else { objectWriteUInt16(this, value, offset, true) } return offset + 2 } Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 8) this[offset + 1] = (value & 0xff) } else { objectWriteUInt16(this, value, offset, false) } return offset + 2 } Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) this[offset + 2] = (value >>> 16) this[offset + 3] = (value >>> 24) } else { objectWriteUInt32(this, value, offset, true) } return offset + 4 } Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) if (value < 0) value = 0xffffffff + value + 1 if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) this[offset + 3] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, false) } return offset + 4 } function checkIEEE754 (buf, value, offset, ext, max, min) { if (offset + ext > buf.length) throw new RangeError('Index out of range') if (offset < 0) throw new RangeError('Index out of range') } function writeFloat (buf, value, offset, littleEndian, noAssert) { if (!noAssert) { checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) } ieee754.write(buf, value, offset, littleEndian, 23, 4) return offset + 4 } Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { return writeFloat(this, value, offset, true, noAssert) } Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { return writeFloat(this, value, offset, false, noAssert) } function writeDouble (buf, value, offset, littleEndian, noAssert) { if (!noAssert) { checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) } ieee754.write(buf, value, offset, littleEndian, 52, 8) return offset + 8 } Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { return writeDouble(this, value, offset, true, noAssert) } Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { return writeDouble(this, value, offset, false, noAssert) } // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) Buffer.prototype.copy = function copy (target, targetStart, start, end) { if (!start) start = 0 if (!end && end !== 0) end = this.length if (targetStart >= target.length) targetStart = target.length if (!targetStart) targetStart = 0 if (end > 0 && end < start) end = start // Copy 0 bytes; we're done if (end === start) return 0 if (target.length === 0 || this.length === 0) return 0 // Fatal error conditions if (targetStart < 0) { throw new RangeError('targetStart out of bounds') } if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') if (end < 0) throw new RangeError('sourceEnd out of bounds') // Are we oob? if (end > this.length) end = this.length if (target.length - targetStart < end - start) { end = target.length - targetStart + start } var len = end - start var i if (this === target && start < targetStart && targetStart < end) { // descending copy from end for (i = len - 1; i >= 0; --i) { target[i + targetStart] = this[i + start] } } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { // ascending copy from start for (i = 0; i < len; ++i) { target[i + targetStart] = this[i + start] } } else { Uint8Array.prototype.set.call( target, this.subarray(start, start + len), targetStart ) } return len } // Usage: // buffer.fill(number[, offset[, end]]) // buffer.fill(buffer[, offset[, end]]) // buffer.fill(string[, offset[, end]][, encoding]) Buffer.prototype.fill = function fill (val, start, end, encoding) { // Handle string cases: if (typeof val === 'string') { if (typeof start === 'string') { encoding = start start = 0 end = this.length } else if (typeof end === 'string') { encoding = end end = this.length } if (val.length === 1) { var code = val.charCodeAt(0) if (code < 256) { val = code } } if (encoding !== undefined && typeof encoding !== 'string') { throw new TypeError('encoding must be a string') } if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { throw new TypeError('Unknown encoding: ' + encoding) } } else if (typeof val === 'number') { val = val & 255 } // Invalid ranges are not set to a default, so can range check early. if (start < 0 || this.length < start || this.length < end) { throw new RangeError('Out of range index') } if (end <= start) { return this } start = start >>> 0 end = end === undefined ? this.length : end >>> 0 if (!val) val = 0 var i if (typeof val === 'number') { for (i = start; i < end; ++i) { this[i] = val } } else { var bytes = Buffer.isBuffer(val) ? val : utf8ToBytes(new Buffer(val, encoding).toString()) var len = bytes.length for (i = 0; i < end - start; ++i) { this[i + start] = bytes[i % len] } } return this } // HELPER FUNCTIONS // ================ var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g function base64clean (str) { // Node strips out invalid characters like \n and \t from the string, base64-js does not str = stringtrim(str).replace(INVALID_BASE64_RE, '') // Node converts strings with length < 2 to '' if (str.length < 2) return '' // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not while (str.length % 4 !== 0) { str = str + '=' } return str } function stringtrim (str) { if (str.trim) return str.trim() return str.replace(/^\s+|\s+$/g, '') } function toHex (n) { if (n < 16) return '0' + n.toString(16) return n.toString(16) } function utf8ToBytes (string, units) { units = units || Infinity var codePoint var length = string.length var leadSurrogate = null var bytes = [] for (var i = 0; i < length; ++i) { codePoint = string.charCodeAt(i) // is surrogate component if (codePoint > 0xD7FF && codePoint < 0xE000) { // last char was a lead if (!leadSurrogate) { // no lead yet if (codePoint > 0xDBFF) { // unexpected trail if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) continue } else if (i + 1 === length) { // unpaired lead if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) continue } // valid lead leadSurrogate = codePoint continue } // 2 leads in a row if (codePoint < 0xDC00) { if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) leadSurrogate = codePoint continue } // valid surrogate pair codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 } else if (leadSurrogate) { // valid bmp char, but last char was a lead if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) } leadSurrogate = null // encode utf8 if (codePoint < 0x80) { if ((units -= 1) < 0) break bytes.push(codePoint) } else if (codePoint < 0x800) { if ((units -= 2) < 0) break bytes.push( codePoint >> 0x6 | 0xC0, codePoint & 0x3F | 0x80 ) } else if (codePoint < 0x10000) { if ((units -= 3) < 0) break bytes.push( codePoint >> 0xC | 0xE0, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80 ) } else if (codePoint < 0x110000) { if ((units -= 4) < 0) break bytes.push( codePoint >> 0x12 | 0xF0, codePoint >> 0xC & 0x3F | 0x80, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80 ) } else { throw new Error('Invalid code point') } } return bytes } function asciiToBytes (str) { var byteArray = [] for (var i = 0; i < str.length; ++i) { // Node's code seems to be doing this and not & 0x7F.. byteArray.push(str.charCodeAt(i) & 0xFF) } return byteArray } function utf16leToBytes (str, units) { var c, hi, lo var byteArray = [] for (var i = 0; i < str.length; ++i) { if ((units -= 2) < 0) break c = str.charCodeAt(i) hi = c >> 8 lo = c % 256 byteArray.push(lo) byteArray.push(hi) } return byteArray } function base64ToBytes (str) { return base64.toByteArray(base64clean(str)) } function blitBuffer (src, dst, offset, length) { for (var i = 0; i < length; ++i) { if ((i + offset >= dst.length) || (i >= src.length)) break dst[i + offset] = src[i] } return i } function isnan (val) { return val !== val // eslint-disable-line no-self-compare } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) /***/ }), /***/ "./node_modules/cipher-base/index.js": /*!*******************************************!*\ !*** ./node_modules/cipher-base/index.js ***! \*******************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer var Transform = __webpack_require__(/*! stream */ "./node_modules/stream-browserify/index.js").Transform var StringDecoder = __webpack_require__(/*! string_decoder */ "./node_modules/string_decoder/lib/string_decoder.js").StringDecoder var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js") function CipherBase (hashMode) { Transform.call(this) this.hashMode = typeof hashMode === 'string' if (this.hashMode) { this[hashMode] = this._finalOrDigest } else { this.final = this._finalOrDigest } if (this._final) { this.__final = this._final this._final = null } this._decoder = null this._encoding = null } inherits(CipherBase, Transform) CipherBase.prototype.update = function (data, inputEnc, outputEnc) { if (typeof data === 'string') { data = Buffer.from(data, inputEnc) } var outData = this._update(data) if (this.hashMode) return this if (outputEnc) { outData = this._toString(outData, outputEnc) } return outData } CipherBase.prototype.setAutoPadding = function () {} CipherBase.prototype.getAuthTag = function () { throw new Error('trying to get auth tag in unsupported state') } CipherBase.prototype.setAuthTag = function () { throw new Error('trying to set auth tag in unsupported state') } CipherBase.prototype.setAAD = function () { throw new Error('trying to set aad in unsupported state') } CipherBase.prototype._transform = function (data, _, next) { var err try { if (this.hashMode) { this._update(data) } else { this.push(this._update(data)) } } catch (e) { err = e } finally { next(err) } } CipherBase.prototype._flush = function (done) { var err try { this.push(this.__final()) } catch (e) { err = e } done(err) } CipherBase.prototype._finalOrDigest = function (outputEnc) { var outData = this.__final() || Buffer.alloc(0) if (outputEnc) { outData = this._toString(outData, outputEnc, true) } return outData } CipherBase.prototype._toString = function (value, enc, fin) { if (!this._decoder) { this._decoder = new StringDecoder(enc) this._encoding = enc } if (this._encoding !== enc) throw new Error('can\'t switch encodings') var out = this._decoder.write(value) if (fin) { out += this._decoder.end() } return out } module.exports = CipherBase /***/ }), /***/ "./node_modules/core-util-is/lib/util.js": /*!***********************************************!*\ !*** ./node_modules/core-util-is/lib/util.js ***! \***********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(Buffer) {// Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // NOTE: These type checking functions intentionally don't use `instanceof` // because it is fragile and can be easily faked with `Object.create()`. function isArray(arg) { if (Array.isArray) { return Array.isArray(arg); } return objectToString(arg) === '[object Array]'; } exports.isArray = isArray; function isBoolean(arg) { return typeof arg === 'boolean'; } exports.isBoolean = isBoolean; function isNull(arg) { return arg === null; } exports.isNull = isNull; function isNullOrUndefined(arg) { return arg == null; } exports.isNullOrUndefined = isNullOrUndefined; function isNumber(arg) { return typeof arg === 'number'; } exports.isNumber = isNumber; function isString(arg) { return typeof arg === 'string'; } exports.isString = isString; function isSymbol(arg) { return typeof arg === 'symbol'; } exports.isSymbol = isSymbol; function isUndefined(arg) { return arg === void 0; } exports.isUndefined = isUndefined; function isRegExp(re) { return objectToString(re) === '[object RegExp]'; } exports.isRegExp = isRegExp; function isObject(arg) { return typeof arg === 'object' && arg !== null; } exports.isObject = isObject; function isDate(d) { return objectToString(d) === '[object Date]'; } exports.isDate = isDate; function isError(e) { return (objectToString(e) === '[object Error]' || e instanceof Error); } exports.isError = isError; function isFunction(arg) { return typeof arg === 'function'; } exports.isFunction = isFunction; function isPrimitive(arg) { return arg === null || typeof arg === 'boolean' || typeof arg === 'number' || typeof arg === 'string' || typeof arg === 'symbol' || // ES6 symbol typeof arg === 'undefined'; } exports.isPrimitive = isPrimitive; exports.isBuffer = Buffer.isBuffer; function objectToString(o) { return Object.prototype.toString.call(o); } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../buffer/index.js */ "./node_modules/buffer/index.js").Buffer)) /***/ }), /***/ "./node_modules/create-ecdh/browser.js": /*!*********************************************!*\ !*** ./node_modules/create-ecdh/browser.js ***! \*********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(Buffer) {var elliptic = __webpack_require__(/*! elliptic */ "./node_modules/elliptic/lib/elliptic.js") var BN = __webpack_require__(/*! bn.js */ "./node_modules/bn.js/lib/bn.js") module.exports = function createECDH (curve) { return new ECDH(curve) } var aliases = { secp256k1: { name: 'secp256k1', byteLength: 32 }, secp224r1: { name: 'p224', byteLength: 28 }, prime256v1: { name: 'p256', byteLength: 32 }, prime192v1: { name: 'p192', byteLength: 24 }, ed25519: { name: 'ed25519', byteLength: 32 }, secp384r1: { name: 'p384', byteLength: 48 }, secp521r1: { name: 'p521', byteLength: 66 } } aliases.p224 = aliases.secp224r1 aliases.p256 = aliases.secp256r1 = aliases.prime256v1 aliases.p192 = aliases.secp192r1 = aliases.prime192v1 aliases.p384 = aliases.secp384r1 aliases.p521 = aliases.secp521r1 function ECDH (curve) { this.curveType = aliases[curve] if (!this.curveType) { this.curveType = { name: curve } } this.curve = new elliptic.ec(this.curveType.name) // eslint-disable-line new-cap this.keys = void 0 } ECDH.prototype.generateKeys = function (enc, format) { this.keys = this.curve.genKeyPair() return this.getPublicKey(enc, format) } ECDH.prototype.computeSecret = function (other, inenc, enc) { inenc = inenc || 'utf8' if (!Buffer.isBuffer(other)) { other = new Buffer(other, inenc) } var otherPub = this.curve.keyFromPublic(other).getPublic() var out = otherPub.mul(this.keys.getPrivate()).getX() return formatReturnValue(out, enc, this.curveType.byteLength) } ECDH.prototype.getPublicKey = function (enc, format) { var key = this.keys.getPublic(format === 'compressed', true) if (format === 'hybrid') { if (key[key.length - 1] % 2) { key[0] = 7 } else { key[0] = 6 } } return formatReturnValue(key, enc) } ECDH.prototype.getPrivateKey = function (enc) { return formatReturnValue(this.keys.getPrivate(), enc) } ECDH.prototype.setPublicKey = function (pub, enc) { enc = enc || 'utf8' if (!Buffer.isBuffer(pub)) { pub = new Buffer(pub, enc) } this.keys._importPublic(pub) return this } ECDH.prototype.setPrivateKey = function (priv, enc) { enc = enc || 'utf8' if (!Buffer.isBuffer(priv)) { priv = new Buffer(priv, enc) } var _priv = new BN(priv) _priv = _priv.toString(16) this.keys = this.curve.genKeyPair() this.keys._importPrivate(_priv) return this } function formatReturnValue (bn, enc, len) { if (!Array.isArray(bn)) { bn = bn.toArray() } var buf = new Buffer(bn) if (len && buf.length < len) { var zeros = new Buffer(len - buf.length) zeros.fill(0) buf = Buffer.concat([zeros, buf]) } if (!enc) { return buf } else { return buf.toString(enc) } } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../buffer/index.js */ "./node_modules/buffer/index.js").Buffer)) /***/ }), /***/ "./node_modules/create-hash/browser.js": /*!*********************************************!*\ !*** ./node_modules/create-hash/browser.js ***! \*********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js") var MD5 = __webpack_require__(/*! md5.js */ "./node_modules/md5.js/index.js") var RIPEMD160 = __webpack_require__(/*! ripemd160 */ "./node_modules/ripemd160/index.js") var sha = __webpack_require__(/*! sha.js */ "./node_modules/sha.js/index.js") var Base = __webpack_require__(/*! cipher-base */ "./node_modules/cipher-base/index.js") function Hash (hash) { Base.call(this, 'digest') this._hash = hash } inherits(Hash, Base) Hash.prototype._update = function (data) { this._hash.update(data) } Hash.prototype._final = function () { return this._hash.digest() } module.exports = function createHash (alg) { alg = alg.toLowerCase() if (alg === 'md5') return new MD5() if (alg === 'rmd160' || alg === 'ripemd160') return new RIPEMD160() return new Hash(sha(alg)) } /***/ }), /***/ "./node_modules/create-hash/md5.js": /*!*****************************************!*\ !*** ./node_modules/create-hash/md5.js ***! \*****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var MD5 = __webpack_require__(/*! md5.js */ "./node_modules/md5.js/index.js") module.exports = function (buffer) { return new MD5().update(buffer).digest() } /***/ }), /***/ "./node_modules/create-hmac/browser.js": /*!*********************************************!*\ !*** ./node_modules/create-hmac/browser.js ***! \*********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js") var Legacy = __webpack_require__(/*! ./legacy */ "./node_modules/create-hmac/legacy.js") var Base = __webpack_require__(/*! cipher-base */ "./node_modules/cipher-base/index.js") var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer var md5 = __webpack_require__(/*! create-hash/md5 */ "./node_modules/create-hash/md5.js") var RIPEMD160 = __webpack_require__(/*! ripemd160 */ "./node_modules/ripemd160/index.js") var sha = __webpack_require__(/*! sha.js */ "./node_modules/sha.js/index.js") var ZEROS = Buffer.alloc(128) function Hmac (alg, key) { Base.call(this, 'digest') if (typeof key === 'string') { key = Buffer.from(key) } var blocksize = (alg === 'sha512' || alg === 'sha384') ? 128 : 64 this._alg = alg this._key = key if (key.length > blocksize) { var hash = alg === 'rmd160' ? new RIPEMD160() : sha(alg) key = hash.update(key).digest() } else if (key.length < blocksize) { key = Buffer.concat([key, ZEROS], blocksize) } var ipad = this._ipad = Buffer.allocUnsafe(blocksize) var opad = this._opad = Buffer.allocUnsafe(blocksize) for (var i = 0; i < blocksize; i++) { ipad[i] = key[i] ^ 0x36 opad[i] = key[i] ^ 0x5C } this._hash = alg === 'rmd160' ? new RIPEMD160() : sha(alg) this._hash.update(ipad) } inherits(Hmac, Base) Hmac.prototype._update = function (data) { this._hash.update(data) } Hmac.prototype._final = function () { var h = this._hash.digest() var hash = this._alg === 'rmd160' ? new RIPEMD160() : sha(this._alg) return hash.update(this._opad).update(h).digest() } module.exports = function createHmac (alg, key) { alg = alg.toLowerCase() if (alg === 'rmd160' || alg === 'ripemd160') { return new Hmac('rmd160', key) } if (alg === 'md5') { return new Legacy(md5, key) } return new Hmac(alg, key) } /***/ }), /***/ "./node_modules/create-hmac/legacy.js": /*!********************************************!*\ !*** ./node_modules/create-hmac/legacy.js ***! \********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js") var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer var Base = __webpack_require__(/*! cipher-base */ "./node_modules/cipher-base/index.js") var ZEROS = Buffer.alloc(128) var blocksize = 64 function Hmac (alg, key) { Base.call(this, 'digest') if (typeof key === 'string') { key = Buffer.from(key) } this._alg = alg this._key = key if (key.length > blocksize) { key = alg(key) } else if (key.length < blocksize) { key = Buffer.concat([key, ZEROS], blocksize) } var ipad = this._ipad = Buffer.allocUnsafe(blocksize) var opad = this._opad = Buffer.allocUnsafe(blocksize) for (var i = 0; i < blocksize; i++) { ipad[i] = key[i] ^ 0x36 opad[i] = key[i] ^ 0x5C } this._hash = [ipad] } inherits(Hmac, Base) Hmac.prototype._update = function (data) { this._hash.push(data) } Hmac.prototype._final = function () { var h = this._alg(Buffer.concat(this._hash)) return this._alg(Buffer.concat([this._opad, h])) } module.exports = Hmac /***/ }), /***/ "./node_modules/crypto-browserify/index.js": /*!*************************************************!*\ !*** ./node_modules/crypto-browserify/index.js ***! \*************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.randomBytes = exports.rng = exports.pseudoRandomBytes = exports.prng = __webpack_require__(/*! randombytes */ "./node_modules/randombytes/browser.js") exports.createHash = exports.Hash = __webpack_require__(/*! create-hash */ "./node_modules/create-hash/browser.js") exports.createHmac = exports.Hmac = __webpack_require__(/*! create-hmac */ "./node_modules/create-hmac/browser.js") var algos = __webpack_require__(/*! browserify-sign/algos */ "./node_modules/browserify-sign/algos.js") var algoKeys = Object.keys(algos) var hashes = ['sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'md5', 'rmd160'].concat(algoKeys) exports.getHashes = function () { return hashes } var p = __webpack_require__(/*! pbkdf2 */ "./node_modules/pbkdf2/browser.js") exports.pbkdf2 = p.pbkdf2 exports.pbkdf2Sync = p.pbkdf2Sync var aes = __webpack_require__(/*! browserify-cipher */ "./node_modules/browserify-cipher/browser.js") exports.Cipher = aes.Cipher exports.createCipher = aes.createCipher exports.Cipheriv = aes.Cipheriv exports.createCipheriv = aes.createCipheriv exports.Decipher = aes.Decipher exports.createDecipher = aes.createDecipher exports.Decipheriv = aes.Decipheriv exports.createDecipheriv = aes.createDecipheriv exports.getCiphers = aes.getCiphers exports.listCiphers = aes.listCiphers var dh = __webpack_require__(/*! diffie-hellman */ "./node_modules/diffie-hellman/browser.js") exports.DiffieHellmanGroup = dh.DiffieHellmanGroup exports.createDiffieHellmanGroup = dh.createDiffieHellmanGroup exports.getDiffieHellman = dh.getDiffieHellman exports.createDiffieHellman = dh.createDiffieHellman exports.DiffieHellman = dh.DiffieHellman var sign = __webpack_require__(/*! browserify-sign */ "./node_modules/browserify-sign/browser/index.js") exports.createSign = sign.createSign exports.Sign = sign.Sign exports.createVerify = sign.createVerify exports.Verify = sign.Verify exports.createECDH = __webpack_require__(/*! create-ecdh */ "./node_modules/create-ecdh/browser.js") var publicEncrypt = __webpack_require__(/*! public-encrypt */ "./node_modules/public-encrypt/browser.js") exports.publicEncrypt = publicEncrypt.publicEncrypt exports.privateEncrypt = publicEncrypt.privateEncrypt exports.publicDecrypt = publicEncrypt.publicDecrypt exports.privateDecrypt = publicEncrypt.privateDecrypt // the least I can do is make error messages for the rest of the node.js/crypto api. // ;[ // 'createCredentials' // ].forEach(function (name) { // exports[name] = function () { // throw new Error([ // 'sorry, ' + name + ' is not implemented yet', // 'we accept pull requests', // 'https://github.com/crypto-browserify/crypto-browserify' // ].join('\n')) // } // }) var rf = __webpack_require__(/*! randomfill */ "./node_modules/randomfill/browser.js") exports.randomFill = rf.randomFill exports.randomFillSync = rf.randomFillSync exports.createCredentials = function () { throw new Error([ 'sorry, createCredentials is not implemented yet', 'we accept pull requests', 'https://github.com/crypto-browserify/crypto-browserify' ].join('\n')) } exports.constants = { 'DH_CHECK_P_NOT_SAFE_PRIME': 2, 'DH_CHECK_P_NOT_PRIME': 1, 'DH_UNABLE_TO_CHECK_GENERATOR': 4, 'DH_NOT_SUITABLE_GENERATOR': 8, 'NPN_ENABLED': 1, 'ALPN_ENABLED': 1, 'RSA_PKCS1_PADDING': 1, 'RSA_SSLV23_PADDING': 2, 'RSA_NO_PADDING': 3, 'RSA_PKCS1_OAEP_PADDING': 4, 'RSA_X931_PADDING': 5, 'RSA_PKCS1_PSS_PADDING': 6, 'POINT_CONVERSION_COMPRESSED': 2, 'POINT_CONVERSION_UNCOMPRESSED': 4, 'POINT_CONVERSION_HYBRID': 6 } /***/ }), /***/ "./node_modules/des.js/lib/des.js": /*!****************************************!*\ !*** ./node_modules/des.js/lib/des.js ***! \****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.utils = __webpack_require__(/*! ./des/utils */ "./node_modules/des.js/lib/des/utils.js"); exports.Cipher = __webpack_require__(/*! ./des/cipher */ "./node_modules/des.js/lib/des/cipher.js"); exports.DES = __webpack_require__(/*! ./des/des */ "./node_modules/des.js/lib/des/des.js"); exports.CBC = __webpack_require__(/*! ./des/cbc */ "./node_modules/des.js/lib/des/cbc.js"); exports.EDE = __webpack_require__(/*! ./des/ede */ "./node_modules/des.js/lib/des/ede.js"); /***/ }), /***/ "./node_modules/des.js/lib/des/cbc.js": /*!********************************************!*\ !*** ./node_modules/des.js/lib/des/cbc.js ***! \********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var assert = __webpack_require__(/*! minimalistic-assert */ "./node_modules/minimalistic-assert/index.js"); var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js"); var proto = {}; function CBCState(iv) { assert.equal(iv.length, 8, 'Invalid IV length'); this.iv = new Array(8); for (var i = 0; i < this.iv.length; i++) this.iv[i] = iv[i]; } function instantiate(Base) { function CBC(options) { Base.call(this, options); this._cbcInit(); } inherits(CBC, Base); var keys = Object.keys(proto); for (var i = 0; i < keys.length; i++) { var key = keys[i]; CBC.prototype[key] = proto[key]; } CBC.create = function create(options) { return new CBC(options); }; return CBC; } exports.instantiate = instantiate; proto._cbcInit = function _cbcInit() { var state = new CBCState(this.options.iv); this._cbcState = state; }; proto._update = function _update(inp, inOff, out, outOff) { var state = this._cbcState; var superProto = this.constructor.super_.prototype; var iv = state.iv; if (this.type === 'encrypt') { for (var i = 0; i < this.blockSize; i++) iv[i] ^= inp[inOff + i]; superProto._update.call(this, iv, 0, out, outOff); for (var i = 0; i < this.blockSize; i++) iv[i] = out[outOff + i]; } else { superProto._update.call(this, inp, inOff, out, outOff); for (var i = 0; i < this.blockSize; i++) out[outOff + i] ^= iv[i]; for (var i = 0; i < this.blockSize; i++) iv[i] = inp[inOff + i]; } }; /***/ }), /***/ "./node_modules/des.js/lib/des/cipher.js": /*!***********************************************!*\ !*** ./node_modules/des.js/lib/des/cipher.js ***! \***********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var assert = __webpack_require__(/*! minimalistic-assert */ "./node_modules/minimalistic-assert/index.js"); function Cipher(options) { this.options = options; this.type = this.options.type; this.blockSize = 8; this._init(); this.buffer = new Array(this.blockSize); this.bufferOff = 0; } module.exports = Cipher; Cipher.prototype._init = function _init() { // Might be overrided }; Cipher.prototype.update = function update(data) { if (data.length === 0) return []; if (this.type === 'decrypt') return this._updateDecrypt(data); else return this._updateEncrypt(data); }; Cipher.prototype._buffer = function _buffer(data, off) { // Append data to buffer var min = Math.min(this.buffer.length - this.bufferOff, data.length - off); for (var i = 0; i < min; i++) this.buffer[this.bufferOff + i] = data[off + i]; this.bufferOff += min; // Shift next return min; }; Cipher.prototype._flushBuffer = function _flushBuffer(out, off) { this._update(this.buffer, 0, out, off); this.bufferOff = 0; return this.blockSize; }; Cipher.prototype._updateEncrypt = function _updateEncrypt(data) { var inputOff = 0; var outputOff = 0; var count = ((this.bufferOff + data.length) / this.blockSize) | 0; var out = new Array(count * this.blockSize); if (this.bufferOff !== 0) { inputOff += this._buffer(data, inputOff); if (this.bufferOff === this.buffer.length) outputOff += this._flushBuffer(out, outputOff); } // Write blocks var max = data.length - ((data.length - inputOff) % this.blockSize); for (; inputOff < max; inputOff += this.blockSize) { this._update(data, inputOff, out, outputOff); outputOff += this.blockSize; } // Queue rest for (; inputOff < data.length; inputOff++, this.bufferOff++) this.buffer[this.bufferOff] = data[inputOff]; return out; }; Cipher.prototype._updateDecrypt = function _updateDecrypt(data) { var inputOff = 0; var outputOff = 0; var count = Math.ceil((this.bufferOff + data.length) / this.blockSize) - 1; var out = new Array(count * this.blockSize); // TODO(indutny): optimize it, this is far from optimal for (; count > 0; count--) { inputOff += this._buffer(data, inputOff); outputOff += this._flushBuffer(out, outputOff); } // Buffer rest of the input inputOff += this._buffer(data, inputOff); return out; }; Cipher.prototype.final = function final(buffer) { var first; if (buffer) first = this.update(buffer); var last; if (this.type === 'encrypt') last = this._finalEncrypt(); else last = this._finalDecrypt(); if (first) return first.concat(last); else return last; }; Cipher.prototype._pad = function _pad(buffer, off) { if (off === 0) return false; while (off < buffer.length) buffer[off++] = 0; return true; }; Cipher.prototype._finalEncrypt = function _finalEncrypt() { if (!this._pad(this.buffer, this.bufferOff)) return []; var out = new Array(this.blockSize); this._update(this.buffer, 0, out, 0); return out; }; Cipher.prototype._unpad = function _unpad(buffer) { return buffer; }; Cipher.prototype._finalDecrypt = function _finalDecrypt() { assert.equal(this.bufferOff, this.blockSize, 'Not enough data to decrypt'); var out = new Array(this.blockSize); this._flushBuffer(out, 0); return this._unpad(out); }; /***/ }), /***/ "./node_modules/des.js/lib/des/des.js": /*!********************************************!*\ !*** ./node_modules/des.js/lib/des/des.js ***! \********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var assert = __webpack_require__(/*! minimalistic-assert */ "./node_modules/minimalistic-assert/index.js"); var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js"); var des = __webpack_require__(/*! ../des */ "./node_modules/des.js/lib/des.js"); var utils = des.utils; var Cipher = des.Cipher; function DESState() { this.tmp = new Array(2); this.keys = null; } function DES(options) { Cipher.call(this, options); var state = new DESState(); this._desState = state; this.deriveKeys(state, options.key); } inherits(DES, Cipher); module.exports = DES; DES.create = function create(options) { return new DES(options); }; var shiftTable = [ 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 ]; DES.prototype.deriveKeys = function deriveKeys(state, key) { state.keys = new Array(16 * 2); assert.equal(key.length, this.blockSize, 'Invalid key length'); var kL = utils.readUInt32BE(key, 0); var kR = utils.readUInt32BE(key, 4); utils.pc1(kL, kR, state.tmp, 0); kL = state.tmp[0]; kR = state.tmp[1]; for (var i = 0; i < state.keys.length; i += 2) { var shift = shiftTable[i >>> 1]; kL = utils.r28shl(kL, shift); kR = utils.r28shl(kR, shift); utils.pc2(kL, kR, state.keys, i); } }; DES.prototype._update = function _update(inp, inOff, out, outOff) { var state = this._desState; var l = utils.readUInt32BE(inp, inOff); var r = utils.readUInt32BE(inp, inOff + 4); // Initial Permutation utils.ip(l, r, state.tmp, 0); l = state.tmp[0]; r = state.tmp[1]; if (this.type === 'encrypt') this._encrypt(state, l, r, state.tmp, 0); else this._decrypt(state, l, r, state.tmp, 0); l = state.tmp[0]; r = state.tmp[1]; utils.writeUInt32BE(out, l, outOff); utils.writeUInt32BE(out, r, outOff + 4); }; DES.prototype._pad = function _pad(buffer, off) { var value = buffer.length - off; for (var i = off; i < buffer.length; i++) buffer[i] = value; return true; }; DES.prototype._unpad = function _unpad(buffer) { var pad = buffer[buffer.length - 1]; for (var i = buffer.length - pad; i < buffer.length; i++) assert.equal(buffer[i], pad); return buffer.slice(0, buffer.length - pad); }; DES.prototype._encrypt = function _encrypt(state, lStart, rStart, out, off) { var l = lStart; var r = rStart; // Apply f() x16 times for (var i = 0; i < state.keys.length; i += 2) { var keyL = state.keys[i]; var keyR = state.keys[i + 1]; // f(r, k) utils.expand(r, state.tmp, 0); keyL ^= state.tmp[0]; keyR ^= state.tmp[1]; var s = utils.substitute(keyL, keyR); var f = utils.permute(s); var t = r; r = (l ^ f) >>> 0; l = t; } // Reverse Initial Permutation utils.rip(r, l, out, off); }; DES.prototype._decrypt = function _decrypt(state, lStart, rStart, out, off) { var l = rStart; var r = lStart; // Apply f() x16 times for (var i = state.keys.length - 2; i >= 0; i -= 2) { var keyL = state.keys[i]; var keyR = state.keys[i + 1]; // f(r, k) utils.expand(l, state.tmp, 0); keyL ^= state.tmp[0]; keyR ^= state.tmp[1]; var s = utils.substitute(keyL, keyR); var f = utils.permute(s); var t = l; l = (r ^ f) >>> 0; r = t; } // Reverse Initial Permutation utils.rip(l, r, out, off); }; /***/ }), /***/ "./node_modules/des.js/lib/des/ede.js": /*!********************************************!*\ !*** ./node_modules/des.js/lib/des/ede.js ***! \********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var assert = __webpack_require__(/*! minimalistic-assert */ "./node_modules/minimalistic-assert/index.js"); var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js"); var des = __webpack_require__(/*! ../des */ "./node_modules/des.js/lib/des.js"); var Cipher = des.Cipher; var DES = des.DES; function EDEState(type, key) { assert.equal(key.length, 24, 'Invalid key length'); var k1 = key.slice(0, 8); var k2 = key.slice(8, 16); var k3 = key.slice(16, 24); if (type === 'encrypt') { this.ciphers = [ DES.create({ type: 'encrypt', key: k1 }), DES.create({ type: 'decrypt', key: k2 }), DES.create({ type: 'encrypt', key: k3 }) ]; } else { this.ciphers = [ DES.create({ type: 'decrypt', key: k3 }), DES.create({ type: 'encrypt', key: k2 }), DES.create({ type: 'decrypt', key: k1 }) ]; } } function EDE(options) { Cipher.call(this, options); var state = new EDEState(this.type, this.options.key); this._edeState = state; } inherits(EDE, Cipher); module.exports = EDE; EDE.create = function create(options) { return new EDE(options); }; EDE.prototype._update = function _update(inp, inOff, out, outOff) { var state = this._edeState; state.ciphers[0]._update(inp, inOff, out, outOff); state.ciphers[1]._update(out, outOff, out, outOff); state.ciphers[2]._update(out, outOff, out, outOff); }; EDE.prototype._pad = DES.prototype._pad; EDE.prototype._unpad = DES.prototype._unpad; /***/ }), /***/ "./node_modules/des.js/lib/des/utils.js": /*!**********************************************!*\ !*** ./node_modules/des.js/lib/des/utils.js ***! \**********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.readUInt32BE = function readUInt32BE(bytes, off) { var res = (bytes[0 + off] << 24) | (bytes[1 + off] << 16) | (bytes[2 + off] << 8) | bytes[3 + off]; return res >>> 0; }; exports.writeUInt32BE = function writeUInt32BE(bytes, value, off) { bytes[0 + off] = value >>> 24; bytes[1 + off] = (value >>> 16) & 0xff; bytes[2 + off] = (value >>> 8) & 0xff; bytes[3 + off] = value & 0xff; }; exports.ip = function ip(inL, inR, out, off) { var outL = 0; var outR = 0; for (var i = 6; i >= 0; i -= 2) { for (var j = 0; j <= 24; j += 8) { outL <<= 1; outL |= (inR >>> (j + i)) & 1; } for (var j = 0; j <= 24; j += 8) { outL <<= 1; outL |= (inL >>> (j + i)) & 1; } } for (var i = 6; i >= 0; i -= 2) { for (var j = 1; j <= 25; j += 8) { outR <<= 1; outR |= (inR >>> (j + i)) & 1; } for (var j = 1; j <= 25; j += 8) { outR <<= 1; outR |= (inL >>> (j + i)) & 1; } } out[off + 0] = outL >>> 0; out[off + 1] = outR >>> 0; }; exports.rip = function rip(inL, inR, out, off) { var outL = 0; var outR = 0; for (var i = 0; i < 4; i++) { for (var j = 24; j >= 0; j -= 8) { outL <<= 1; outL |= (inR >>> (j + i)) & 1; outL <<= 1; outL |= (inL >>> (j + i)) & 1; } } for (var i = 4; i < 8; i++) { for (var j = 24; j >= 0; j -= 8) { outR <<= 1; outR |= (inR >>> (j + i)) & 1; outR <<= 1; outR |= (inL >>> (j + i)) & 1; } } out[off + 0] = outL >>> 0; out[off + 1] = outR >>> 0; }; exports.pc1 = function pc1(inL, inR, out, off) { var outL = 0; var outR = 0; // 7, 15, 23, 31, 39, 47, 55, 63 // 6, 14, 22, 30, 39, 47, 55, 63 // 5, 13, 21, 29, 39, 47, 55, 63 // 4, 12, 20, 28 for (var i = 7; i >= 5; i--) { for (var j = 0; j <= 24; j += 8) { outL <<= 1; outL |= (inR >> (j + i)) & 1; } for (var j = 0; j <= 24; j += 8) { outL <<= 1; outL |= (inL >> (j + i)) & 1; } } for (var j = 0; j <= 24; j += 8) { outL <<= 1; outL |= (inR >> (j + i)) & 1; } // 1, 9, 17, 25, 33, 41, 49, 57 // 2, 10, 18, 26, 34, 42, 50, 58 // 3, 11, 19, 27, 35, 43, 51, 59 // 36, 44, 52, 60 for (var i = 1; i <= 3; i++) { for (var j = 0; j <= 24; j += 8) { outR <<= 1; outR |= (inR >> (j + i)) & 1; } for (var j = 0; j <= 24; j += 8) { outR <<= 1; outR |= (inL >> (j + i)) & 1; } } for (var j = 0; j <= 24; j += 8) { outR <<= 1; outR |= (inL >> (j + i)) & 1; } out[off + 0] = outL >>> 0; out[off + 1] = outR >>> 0; }; exports.r28shl = function r28shl(num, shift) { return ((num << shift) & 0xfffffff) | (num >>> (28 - shift)); }; var pc2table = [ // inL => outL 14, 11, 17, 4, 27, 23, 25, 0, 13, 22, 7, 18, 5, 9, 16, 24, 2, 20, 12, 21, 1, 8, 15, 26, // inR => outR 15, 4, 25, 19, 9, 1, 26, 16, 5, 11, 23, 8, 12, 7, 17, 0, 22, 3, 10, 14, 6, 20, 27, 24 ]; exports.pc2 = function pc2(inL, inR, out, off) { var outL = 0; var outR = 0; var len = pc2table.length >>> 1; for (var i = 0; i < len; i++) { outL <<= 1; outL |= (inL >>> pc2table[i]) & 0x1; } for (var i = len; i < pc2table.length; i++) { outR <<= 1; outR |= (inR >>> pc2table[i]) & 0x1; } out[off + 0] = outL >>> 0; out[off + 1] = outR >>> 0; }; exports.expand = function expand(r, out, off) { var outL = 0; var outR = 0; outL = ((r & 1) << 5) | (r >>> 27); for (var i = 23; i >= 15; i -= 4) { outL <<= 6; outL |= (r >>> i) & 0x3f; } for (var i = 11; i >= 3; i -= 4) { outR |= (r >>> i) & 0x3f; outR <<= 6; } outR |= ((r & 0x1f) << 1) | (r >>> 31); out[off + 0] = outL >>> 0; out[off + 1] = outR >>> 0; }; var sTable = [ 14, 0, 4, 15, 13, 7, 1, 4, 2, 14, 15, 2, 11, 13, 8, 1, 3, 10, 10, 6, 6, 12, 12, 11, 5, 9, 9, 5, 0, 3, 7, 8, 4, 15, 1, 12, 14, 8, 8, 2, 13, 4, 6, 9, 2, 1, 11, 7, 15, 5, 12, 11, 9, 3, 7, 14, 3, 10, 10, 0, 5, 6, 0, 13, 15, 3, 1, 13, 8, 4, 14, 7, 6, 15, 11, 2, 3, 8, 4, 14, 9, 12, 7, 0, 2, 1, 13, 10, 12, 6, 0, 9, 5, 11, 10, 5, 0, 13, 14, 8, 7, 10, 11, 1, 10, 3, 4, 15, 13, 4, 1, 2, 5, 11, 8, 6, 12, 7, 6, 12, 9, 0, 3, 5, 2, 14, 15, 9, 10, 13, 0, 7, 9, 0, 14, 9, 6, 3, 3, 4, 15, 6, 5, 10, 1, 2, 13, 8, 12, 5, 7, 14, 11, 12, 4, 11, 2, 15, 8, 1, 13, 1, 6, 10, 4, 13, 9, 0, 8, 6, 15, 9, 3, 8, 0, 7, 11, 4, 1, 15, 2, 14, 12, 3, 5, 11, 10, 5, 14, 2, 7, 12, 7, 13, 13, 8, 14, 11, 3, 5, 0, 6, 6, 15, 9, 0, 10, 3, 1, 4, 2, 7, 8, 2, 5, 12, 11, 1, 12, 10, 4, 14, 15, 9, 10, 3, 6, 15, 9, 0, 0, 6, 12, 10, 11, 1, 7, 13, 13, 8, 15, 9, 1, 4, 3, 5, 14, 11, 5, 12, 2, 7, 8, 2, 4, 14, 2, 14, 12, 11, 4, 2, 1, 12, 7, 4, 10, 7, 11, 13, 6, 1, 8, 5, 5, 0, 3, 15, 15, 10, 13, 3, 0, 9, 14, 8, 9, 6, 4, 11, 2, 8, 1, 12, 11, 7, 10, 1, 13, 14, 7, 2, 8, 13, 15, 6, 9, 15, 12, 0, 5, 9, 6, 10, 3, 4, 0, 5, 14, 3, 12, 10, 1, 15, 10, 4, 15, 2, 9, 7, 2, 12, 6, 9, 8, 5, 0, 6, 13, 1, 3, 13, 4, 14, 14, 0, 7, 11, 5, 3, 11, 8, 9, 4, 14, 3, 15, 2, 5, 12, 2, 9, 8, 5, 12, 15, 3, 10, 7, 11, 0, 14, 4, 1, 10, 7, 1, 6, 13, 0, 11, 8, 6, 13, 4, 13, 11, 0, 2, 11, 14, 7, 15, 4, 0, 9, 8, 1, 13, 10, 3, 14, 12, 3, 9, 5, 7, 12, 5, 2, 10, 15, 6, 8, 1, 6, 1, 6, 4, 11, 11, 13, 13, 8, 12, 1, 3, 4, 7, 10, 14, 7, 10, 9, 15, 5, 6, 0, 8, 15, 0, 14, 5, 2, 9, 3, 2, 12, 13, 1, 2, 15, 8, 13, 4, 8, 6, 10, 15, 3, 11, 7, 1, 4, 10, 12, 9, 5, 3, 6, 14, 11, 5, 0, 0, 14, 12, 9, 7, 2, 7, 2, 11, 1, 4, 14, 1, 7, 9, 4, 12, 10, 14, 8, 2, 13, 0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11 ]; exports.substitute = function substitute(inL, inR) { var out = 0; for (var i = 0; i < 4; i++) { var b = (inL >>> (18 - i * 6)) & 0x3f; var sb = sTable[i * 0x40 + b]; out <<= 4; out |= sb; } for (var i = 0; i < 4; i++) { var b = (inR >>> (18 - i * 6)) & 0x3f; var sb = sTable[4 * 0x40 + i * 0x40 + b]; out <<= 4; out |= sb; } return out >>> 0; }; var permuteTable = [ 16, 25, 12, 11, 3, 20, 4, 15, 31, 17, 9, 6, 27, 14, 1, 22, 30, 24, 8, 18, 0, 5, 29, 23, 13, 19, 2, 26, 10, 21, 28, 7 ]; exports.permute = function permute(num) { var out = 0; for (var i = 0; i < permuteTable.length; i++) { out <<= 1; out |= (num >>> permuteTable[i]) & 0x1; } return out >>> 0; }; exports.padSplit = function padSplit(num, size, group) { var str = num.toString(2); while (str.length < size) str = '0' + str; var out = []; for (var i = 0; i < size; i += group) out.push(str.slice(i, i + group)); return out.join(' '); }; /***/ }), /***/ "./node_modules/diffie-hellman/browser.js": /*!************************************************!*\ !*** ./node_modules/diffie-hellman/browser.js ***! \************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(Buffer) {var generatePrime = __webpack_require__(/*! ./lib/generatePrime */ "./node_modules/diffie-hellman/lib/generatePrime.js") var primes = __webpack_require__(/*! ./lib/primes.json */ "./node_modules/diffie-hellman/lib/primes.json") var DH = __webpack_require__(/*! ./lib/dh */ "./node_modules/diffie-hellman/lib/dh.js") function getDiffieHellman (mod) { var prime = new Buffer(primes[mod].prime, 'hex') var gen = new Buffer(primes[mod].gen, 'hex') return new DH(prime, gen) } var ENCODINGS = { 'binary': true, 'hex': true, 'base64': true } function createDiffieHellman (prime, enc, generator, genc) { if (Buffer.isBuffer(enc) || ENCODINGS[enc] === undefined) { return createDiffieHellman(prime, 'binary', enc, generator) } enc = enc || 'binary' genc = genc || 'binary' generator = generator || new Buffer([2]) if (!Buffer.isBuffer(generator)) { generator = new Buffer(generator, genc) } if (typeof prime === 'number') { return new DH(generatePrime(prime, generator), generator, true) } if (!Buffer.isBuffer(prime)) { prime = new Buffer(prime, enc) } return new DH(prime, generator, true) } exports.DiffieHellmanGroup = exports.createDiffieHellmanGroup = exports.getDiffieHellman = getDiffieHellman exports.createDiffieHellman = exports.DiffieHellman = createDiffieHellman /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../buffer/index.js */ "./node_modules/buffer/index.js").Buffer)) /***/ }), /***/ "./node_modules/diffie-hellman/lib/dh.js": /*!***********************************************!*\ !*** ./node_modules/diffie-hellman/lib/dh.js ***! \***********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(Buffer) {var BN = __webpack_require__(/*! bn.js */ "./node_modules/bn.js/lib/bn.js"); var MillerRabin = __webpack_require__(/*! miller-rabin */ "./node_modules/miller-rabin/lib/mr.js"); var millerRabin = new MillerRabin(); var TWENTYFOUR = new BN(24); var ELEVEN = new BN(11); var TEN = new BN(10); var THREE = new BN(3); var SEVEN = new BN(7); var primes = __webpack_require__(/*! ./generatePrime */ "./node_modules/diffie-hellman/lib/generatePrime.js"); var randomBytes = __webpack_require__(/*! randombytes */ "./node_modules/randombytes/browser.js"); module.exports = DH; function setPublicKey(pub, enc) { enc = enc || 'utf8'; if (!Buffer.isBuffer(pub)) { pub = new Buffer(pub, enc); } this._pub = new BN(pub); return this; } function setPrivateKey(priv, enc) { enc = enc || 'utf8'; if (!Buffer.isBuffer(priv)) { priv = new Buffer(priv, enc); } this._priv = new BN(priv); return this; } var primeCache = {}; function checkPrime(prime, generator) { var gen = generator.toString('hex'); var hex = [gen, prime.toString(16)].join('_'); if (hex in primeCache) { return primeCache[hex]; } var error = 0; if (prime.isEven() || !primes.simpleSieve || !primes.fermatTest(prime) || !millerRabin.test(prime)) { //not a prime so +1 error += 1; if (gen === '02' || gen === '05') { // we'd be able to check the generator // it would fail so +8 error += 8; } else { //we wouldn't be able to test the generator // so +4 error += 4; } primeCache[hex] = error; return error; } if (!millerRabin.test(prime.shrn(1))) { //not a safe prime error += 2; } var rem; switch (gen) { case '02': if (prime.mod(TWENTYFOUR).cmp(ELEVEN)) { // unsuidable generator error += 8; } break; case '05': rem = prime.mod(TEN); if (rem.cmp(THREE) && rem.cmp(SEVEN)) { // prime mod 10 needs to equal 3 or 7 error += 8; } break; default: error += 4; } primeCache[hex] = error; return error; } function DH(prime, generator, malleable) { this.setGenerator(generator); this.__prime = new BN(prime); this._prime = BN.mont(this.__prime); this._primeLen = prime.length; this._pub = undefined; this._priv = undefined; this._primeCode = undefined; if (malleable) { this.setPublicKey = setPublicKey; this.setPrivateKey = setPrivateKey; } else { this._primeCode = 8; } } Object.defineProperty(DH.prototype, 'verifyError', { enumerable: true, get: function () { if (typeof this._primeCode !== 'number') { this._primeCode = checkPrime(this.__prime, this.__gen); } return this._primeCode; } }); DH.prototype.generateKeys = function () { if (!this._priv) { this._priv = new BN(randomBytes(this._primeLen)); } this._pub = this._gen.toRed(this._prime).redPow(this._priv).fromRed(); return this.getPublicKey(); }; DH.prototype.computeSecret = function (other) { other = new BN(other); other = other.toRed(this._prime); var secret = other.redPow(this._priv).fromRed(); var out = new Buffer(secret.toArray()); var prime = this.getPrime(); if (out.length < prime.length) { var front = new Buffer(prime.length - out.length); front.fill(0); out = Buffer.concat([front, out]); } return out; }; DH.prototype.getPublicKey = function getPublicKey(enc) { return formatReturnValue(this._pub, enc); }; DH.prototype.getPrivateKey = function getPrivateKey(enc) { return formatReturnValue(this._priv, enc); }; DH.prototype.getPrime = function (enc) { return formatReturnValue(this.__prime, enc); }; DH.prototype.getGenerator = function (enc) { return formatReturnValue(this._gen, enc); }; DH.prototype.setGenerator = function (gen, enc) { enc = enc || 'utf8'; if (!Buffer.isBuffer(gen)) { gen = new Buffer(gen, enc); } this.__gen = gen; this._gen = new BN(gen); return this; }; function formatReturnValue(bn, enc) { var buf = new Buffer(bn.toArray()); if (!enc) { return buf; } else { return buf.toString(enc); } } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../buffer/index.js */ "./node_modules/buffer/index.js").Buffer)) /***/ }), /***/ "./node_modules/diffie-hellman/lib/generatePrime.js": /*!**********************************************************!*\ !*** ./node_modules/diffie-hellman/lib/generatePrime.js ***! \**********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var randomBytes = __webpack_require__(/*! randombytes */ "./node_modules/randombytes/browser.js"); module.exports = findPrime; findPrime.simpleSieve = simpleSieve; findPrime.fermatTest = fermatTest; var BN = __webpack_require__(/*! bn.js */ "./node_modules/bn.js/lib/bn.js"); var TWENTYFOUR = new BN(24); var MillerRabin = __webpack_require__(/*! miller-rabin */ "./node_modules/miller-rabin/lib/mr.js"); var millerRabin = new MillerRabin(); var ONE = new BN(1); var TWO = new BN(2); var FIVE = new BN(5); var SIXTEEN = new BN(16); var EIGHT = new BN(8); var TEN = new BN(10); var THREE = new BN(3); var SEVEN = new BN(7); var ELEVEN = new BN(11); var FOUR = new BN(4); var TWELVE = new BN(12); var primes = null; function _getPrimes() { if (primes !== null) return primes; var limit = 0x100000; var res = []; res[0] = 2; for (var i = 1, k = 3; k < limit; k += 2) { var sqrt = Math.ceil(Math.sqrt(k)); for (var j = 0; j < i && res[j] <= sqrt; j++) if (k % res[j] === 0) break; if (i !== j && res[j] <= sqrt) continue; res[i++] = k; } primes = res; return res; } function simpleSieve(p) { var primes = _getPrimes(); for (var i = 0; i < primes.length; i++) if (p.modn(primes[i]) === 0) { if (p.cmpn(primes[i]) === 0) { return true; } else { return false; } } return true; } function fermatTest(p) { var red = BN.mont(p); return TWO.toRed(red).redPow(p.subn(1)).fromRed().cmpn(1) === 0; } function findPrime(bits, gen) { if (bits < 16) { // this is what openssl does if (gen === 2 || gen === 5) { return new BN([0x8c, 0x7b]); } else { return new BN([0x8c, 0x27]); } } gen = new BN(gen); var num, n2; while (true) { num = new BN(randomBytes(Math.ceil(bits / 8))); while (num.bitLength() > bits) { num.ishrn(1); } if (num.isEven()) { num.iadd(ONE); } if (!num.testn(1)) { num.iadd(TWO); } if (!gen.cmp(TWO)) { while (num.mod(TWENTYFOUR).cmp(ELEVEN)) { num.iadd(FOUR); } } else if (!gen.cmp(FIVE)) { while (num.mod(TEN).cmp(THREE)) { num.iadd(FOUR); } } n2 = num.shrn(1); if (simpleSieve(n2) && simpleSieve(num) && fermatTest(n2) && fermatTest(num) && millerRabin.test(n2) && millerRabin.test(num)) { return num; } } } /***/ }), /***/ "./node_modules/diffie-hellman/lib/primes.json": /*!*****************************************************!*\ !*** ./node_modules/diffie-hellman/lib/primes.json ***! \*****************************************************/ /*! exports provided: modp1, modp2, modp5, modp14, modp15, modp16, modp17, modp18, default */ /***/ (function(module) { module.exports = {"modp1":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a63a3620ffffffffffffffff"},"modp2":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece65381ffffffffffffffff"},"modp5":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff"},"modp14":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff"},"modp15":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffff"},"modp16":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199ffffffffffffffff"},"modp17":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff"},"modp18":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dbe115974a3926f12fee5e438777cb6a932df8cd8bec4d073b931ba3bc832b68d9dd300741fa7bf8afc47ed2576f6936ba424663aab639c5ae4f5683423b4742bf1c978238f16cbe39d652de3fdb8befc848ad922222e04a4037c0713eb57a81a23f0c73473fc646cea306b4bcbc8862f8385ddfa9d4b7fa2c087e879683303ed5bdd3a062b3cf5b3a278a66d2a13f83f44f82ddf310ee074ab6a364597e899a0255dc164f31cc50846851df9ab48195ded7ea1b1d510bd7ee74d73faf36bc31ecfa268359046f4eb879f924009438b481c6cd7889a002ed5ee382bc9190da6fc026e479558e4475677e9aa9e3050e2765694dfc81f56e880b96e7160c980dd98edd3dfffffffffffffffff"}}; /***/ }), /***/ "./node_modules/elliptic/lib/elliptic.js": /*!***********************************************!*\ !*** ./node_modules/elliptic/lib/elliptic.js ***! \***********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var elliptic = exports; elliptic.version = __webpack_require__(/*! ../package.json */ "./node_modules/elliptic/package.json").version; elliptic.utils = __webpack_require__(/*! ./elliptic/utils */ "./node_modules/elliptic/lib/elliptic/utils.js"); elliptic.rand = __webpack_require__(/*! brorand */ "./node_modules/brorand/index.js"); elliptic.curve = __webpack_require__(/*! ./elliptic/curve */ "./node_modules/elliptic/lib/elliptic/curve/index.js"); elliptic.curves = __webpack_require__(/*! ./elliptic/curves */ "./node_modules/elliptic/lib/elliptic/curves.js"); // Protocols elliptic.ec = __webpack_require__(/*! ./elliptic/ec */ "./node_modules/elliptic/lib/elliptic/ec/index.js"); elliptic.eddsa = __webpack_require__(/*! ./elliptic/eddsa */ "./node_modules/elliptic/lib/elliptic/eddsa/index.js"); /***/ }), /***/ "./node_modules/elliptic/lib/elliptic/curve/base.js": /*!**********************************************************!*\ !*** ./node_modules/elliptic/lib/elliptic/curve/base.js ***! \**********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var BN = __webpack_require__(/*! bn.js */ "./node_modules/bn.js/lib/bn.js"); var elliptic = __webpack_require__(/*! ../../elliptic */ "./node_modules/elliptic/lib/elliptic.js"); var utils = elliptic.utils; var getNAF = utils.getNAF; var getJSF = utils.getJSF; var assert = utils.assert; function BaseCurve(type, conf) { this.type = type; this.p = new BN(conf.p, 16); // Use Montgomery, when there is no fast reduction for the prime this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p); // Useful for many curves this.zero = new BN(0).toRed(this.red); this.one = new BN(1).toRed(this.red); this.two = new BN(2).toRed(this.red); // Curve configuration, optional this.n = conf.n && new BN(conf.n, 16); this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed); // Temporary arrays this._wnafT1 = new Array(4); this._wnafT2 = new Array(4); this._wnafT3 = new Array(4); this._wnafT4 = new Array(4); // Generalized Greg Maxwell's trick var adjustCount = this.n && this.p.div(this.n); if (!adjustCount || adjustCount.cmpn(100) > 0) { this.redN = null; } else { this._maxwellTrick = true; this.redN = this.n.toRed(this.red); } } module.exports = BaseCurve; BaseCurve.prototype.point = function point() { throw new Error('Not implemented'); }; BaseCurve.prototype.validate = function validate() { throw new Error('Not implemented'); }; BaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) { assert(p.precomputed); var doubles = p._getDoubles(); var naf = getNAF(k, 1); var I = (1 << (doubles.step + 1)) - (doubles.step % 2 === 0 ? 2 : 1); I /= 3; // Translate into more windowed form var repr = []; for (var j = 0; j < naf.length; j += doubles.step) { var nafW = 0; for (var k = j + doubles.step - 1; k >= j; k--) nafW = (nafW << 1) + naf[k]; repr.push(nafW); } var a = this.jpoint(null, null, null); var b = this.jpoint(null, null, null); for (var i = I; i > 0; i--) { for (var j = 0; j < repr.length; j++) { var nafW = repr[j]; if (nafW === i) b = b.mixedAdd(doubles.points[j]); else if (nafW === -i) b = b.mixedAdd(doubles.points[j].neg()); } a = a.add(b); } return a.toP(); }; BaseCurve.prototype._wnafMul = function _wnafMul(p, k) { var w = 4; // Precompute window var nafPoints = p._getNAFPoints(w); w = nafPoints.wnd; var wnd = nafPoints.points; // Get NAF form var naf = getNAF(k, w); // Add `this`*(N+1) for every w-NAF index var acc = this.jpoint(null, null, null); for (var i = naf.length - 1; i >= 0; i--) { // Count zeroes for (var k = 0; i >= 0 && naf[i] === 0; i--) k++; if (i >= 0) k++; acc = acc.dblp(k); if (i < 0) break; var z = naf[i]; assert(z !== 0); if (p.type === 'affine') { // J +- P if (z > 0) acc = acc.mixedAdd(wnd[(z - 1) >> 1]); else acc = acc.mixedAdd(wnd[(-z - 1) >> 1].neg()); } else { // J +- J if (z > 0) acc = acc.add(wnd[(z - 1) >> 1]); else acc = acc.add(wnd[(-z - 1) >> 1].neg()); } } return p.type === 'affine' ? acc.toP() : acc; }; BaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW, points, coeffs, len, jacobianResult) { var wndWidth = this._wnafT1; var wnd = this._wnafT2; var naf = this._wnafT3; // Fill all arrays var max = 0; for (var i = 0; i < len; i++) { var p = points[i]; var nafPoints = p._getNAFPoints(defW); wndWidth[i] = nafPoints.wnd; wnd[i] = nafPoints.points; } // Comb small window NAFs for (var i = len - 1; i >= 1; i -= 2) { var a = i - 1; var b = i; if (wndWidth[a] !== 1 || wndWidth[b] !== 1) { naf[a] = getNAF(coeffs[a], wndWidth[a]); naf[b] = getNAF(coeffs[b], wndWidth[b]); max = Math.max(naf[a].length, max); max = Math.max(naf[b].length, max); continue; } var comb = [ points[a], /* 1 */ null, /* 3 */ null, /* 5 */ points[b] /* 7 */ ]; // Try to avoid Projective points, if possible if (points[a].y.cmp(points[b].y) === 0) { comb[1] = points[a].add(points[b]); comb[2] = points[a].toJ().mixedAdd(points[b].neg()); } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) { comb[1] = points[a].toJ().mixedAdd(points[b]); comb[2] = points[a].add(points[b].neg()); } else { comb[1] = points[a].toJ().mixedAdd(points[b]); comb[2] = points[a].toJ().mixedAdd(points[b].neg()); } var index = [ -3, /* -1 -1 */ -1, /* -1 0 */ -5, /* -1 1 */ -7, /* 0 -1 */ 0, /* 0 0 */ 7, /* 0 1 */ 5, /* 1 -1 */ 1, /* 1 0 */ 3 /* 1 1 */ ]; var jsf = getJSF(coeffs[a], coeffs[b]); max = Math.max(jsf[0].length, max); naf[a] = new Array(max); naf[b] = new Array(max); for (var j = 0; j < max; j++) { var ja = jsf[0][j] | 0; var jb = jsf[1][j] | 0; naf[a][j] = index[(ja + 1) * 3 + (jb + 1)]; naf[b][j] = 0; wnd[a] = comb; } } var acc = this.jpoint(null, null, null); var tmp = this._wnafT4; for (var i = max; i >= 0; i--) { var k = 0; while (i >= 0) { var zero = true; for (var j = 0; j < len; j++) { tmp[j] = naf[j][i] | 0; if (tmp[j] !== 0) zero = false; } if (!zero) break; k++; i--; } if (i >= 0) k++; acc = acc.dblp(k); if (i < 0) break; for (var j = 0; j < len; j++) { var z = tmp[j]; var p; if (z === 0) continue; else if (z > 0) p = wnd[j][(z - 1) >> 1]; else if (z < 0) p = wnd[j][(-z - 1) >> 1].neg(); if (p.type === 'affine') acc = acc.mixedAdd(p); else acc = acc.add(p); } } // Zeroify references for (var i = 0; i < len; i++) wnd[i] = null; if (jacobianResult) return acc; else return acc.toP(); }; function BasePoint(curve, type) { this.curve = curve; this.type = type; this.precomputed = null; } BaseCurve.BasePoint = BasePoint; BasePoint.prototype.eq = function eq(/*other*/) { throw new Error('Not implemented'); }; BasePoint.prototype.validate = function validate() { return this.curve.validate(this); }; BaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) { bytes = utils.toArray(bytes, enc); var len = this.p.byteLength(); // uncompressed, hybrid-odd, hybrid-even if ((bytes[0] === 0x04 || bytes[0] === 0x06 || bytes[0] === 0x07) && bytes.length - 1 === 2 * len) { if (bytes[0] === 0x06) assert(bytes[bytes.length - 1] % 2 === 0); else if (bytes[0] === 0x07) assert(bytes[bytes.length - 1] % 2 === 1); var res = this.point(bytes.slice(1, 1 + len), bytes.slice(1 + len, 1 + 2 * len)); return res; } else if ((bytes[0] === 0x02 || bytes[0] === 0x03) && bytes.length - 1 === len) { return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 0x03); } throw new Error('Unknown point format'); }; BasePoint.prototype.encodeCompressed = function encodeCompressed(enc) { return this.encode(enc, true); }; BasePoint.prototype._encode = function _encode(compact) { var len = this.curve.p.byteLength(); var x = this.getX().toArray('be', len); if (compact) return [ this.getY().isEven() ? 0x02 : 0x03 ].concat(x); return [ 0x04 ].concat(x, this.getY().toArray('be', len)) ; }; BasePoint.prototype.encode = function encode(enc, compact) { return utils.encode(this._encode(compact), enc); }; BasePoint.prototype.precompute = function precompute(power) { if (this.precomputed) return this; var precomputed = { doubles: null, naf: null, beta: null }; precomputed.naf = this._getNAFPoints(8); precomputed.doubles = this._getDoubles(4, power); precomputed.beta = this._getBeta(); this.precomputed = precomputed; return this; }; BasePoint.prototype._hasDoubles = function _hasDoubles(k) { if (!this.precomputed) return false; var doubles = this.precomputed.doubles; if (!doubles) return false; return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step); }; BasePoint.prototype._getDoubles = function _getDoubles(step, power) { if (this.precomputed && this.precomputed.doubles) return this.precomputed.doubles; var doubles = [ this ]; var acc = this; for (var i = 0; i < power; i += step) { for (var j = 0; j < step; j++) acc = acc.dbl(); doubles.push(acc); } return { step: step, points: doubles }; }; BasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) { if (this.precomputed && this.precomputed.naf) return this.precomputed.naf; var res = [ this ]; var max = (1 << wnd) - 1; var dbl = max === 1 ? null : this.dbl(); for (var i = 1; i < max; i++) res[i] = res[i - 1].add(dbl); return { wnd: wnd, points: res }; }; BasePoint.prototype._getBeta = function _getBeta() { return null; }; BasePoint.prototype.dblp = function dblp(k) { var r = this; for (var i = 0; i < k; i++) r = r.dbl(); return r; }; /***/ }), /***/ "./node_modules/elliptic/lib/elliptic/curve/edwards.js": /*!*************************************************************!*\ !*** ./node_modules/elliptic/lib/elliptic/curve/edwards.js ***! \*************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var curve = __webpack_require__(/*! ../curve */ "./node_modules/elliptic/lib/elliptic/curve/index.js"); var elliptic = __webpack_require__(/*! ../../elliptic */ "./node_modules/elliptic/lib/elliptic.js"); var BN = __webpack_require__(/*! bn.js */ "./node_modules/bn.js/lib/bn.js"); var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js"); var Base = curve.base; var assert = elliptic.utils.assert; function EdwardsCurve(conf) { // NOTE: Important as we are creating point in Base.call() this.twisted = (conf.a | 0) !== 1; this.mOneA = this.twisted && (conf.a | 0) === -1; this.extended = this.mOneA; Base.call(this, 'edwards', conf); this.a = new BN(conf.a, 16).umod(this.red.m); this.a = this.a.toRed(this.red); this.c = new BN(conf.c, 16).toRed(this.red); this.c2 = this.c.redSqr(); this.d = new BN(conf.d, 16).toRed(this.red); this.dd = this.d.redAdd(this.d); assert(!this.twisted || this.c.fromRed().cmpn(1) === 0); this.oneC = (conf.c | 0) === 1; } inherits(EdwardsCurve, Base); module.exports = EdwardsCurve; EdwardsCurve.prototype._mulA = function _mulA(num) { if (this.mOneA) return num.redNeg(); else return this.a.redMul(num); }; EdwardsCurve.prototype._mulC = function _mulC(num) { if (this.oneC) return num; else return this.c.redMul(num); }; // Just for compatibility with Short curve EdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) { return this.point(x, y, z, t); }; EdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) { x = new BN(x, 16); if (!x.red) x = x.toRed(this.red); var x2 = x.redSqr(); var rhs = this.c2.redSub(this.a.redMul(x2)); var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2)); var y2 = rhs.redMul(lhs.redInvm()); var y = y2.redSqrt(); if (y.redSqr().redSub(y2).cmp(this.zero) !== 0) throw new Error('invalid point'); var isOdd = y.fromRed().isOdd(); if (odd && !isOdd || !odd && isOdd) y = y.redNeg(); return this.point(x, y); }; EdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) { y = new BN(y, 16); if (!y.red) y = y.toRed(this.red); // x^2 = (y^2 - c^2) / (c^2 d y^2 - a) var y2 = y.redSqr(); var lhs = y2.redSub(this.c2); var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a); var x2 = lhs.redMul(rhs.redInvm()); if (x2.cmp(this.zero) === 0) { if (odd) throw new Error('invalid point'); else return this.point(this.zero, y); } var x = x2.redSqrt(); if (x.redSqr().redSub(x2).cmp(this.zero) !== 0) throw new Error('invalid point'); if (x.fromRed().isOdd() !== odd) x = x.redNeg(); return this.point(x, y); }; EdwardsCurve.prototype.validate = function validate(point) { if (point.isInfinity()) return true; // Curve: A * X^2 + Y^2 = C^2 * (1 + D * X^2 * Y^2) point.normalize(); var x2 = point.x.redSqr(); var y2 = point.y.redSqr(); var lhs = x2.redMul(this.a).redAdd(y2); var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2))); return lhs.cmp(rhs) === 0; }; function Point(curve, x, y, z, t) { Base.BasePoint.call(this, curve, 'projective'); if (x === null && y === null && z === null) { this.x = this.curve.zero; this.y = this.curve.one; this.z = this.curve.one; this.t = this.curve.zero; this.zOne = true; } else { this.x = new BN(x, 16); this.y = new BN(y, 16); this.z = z ? new BN(z, 16) : this.curve.one; this.t = t && new BN(t, 16); if (!this.x.red) this.x = this.x.toRed(this.curve.red); if (!this.y.red) this.y = this.y.toRed(this.curve.red); if (!this.z.red) this.z = this.z.toRed(this.curve.red); if (this.t && !this.t.red) this.t = this.t.toRed(this.curve.red); this.zOne = this.z === this.curve.one; // Use extended coordinates if (this.curve.extended && !this.t) { this.t = this.x.redMul(this.y); if (!this.zOne) this.t = this.t.redMul(this.z.redInvm()); } } } inherits(Point, Base.BasePoint); EdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) { return Point.fromJSON(this, obj); }; EdwardsCurve.prototype.point = function point(x, y, z, t) { return new Point(this, x, y, z, t); }; Point.fromJSON = function fromJSON(curve, obj) { return new Point(curve, obj[0], obj[1], obj[2]); }; Point.prototype.inspect = function inspect() { if (this.isInfinity()) return ''; return ''; }; Point.prototype.isInfinity = function isInfinity() { // XXX This code assumes that zero is always zero in red return this.x.cmpn(0) === 0 && (this.y.cmp(this.z) === 0 || (this.zOne && this.y.cmp(this.curve.c) === 0)); }; Point.prototype._extDbl = function _extDbl() { // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html // #doubling-dbl-2008-hwcd // 4M + 4S // A = X1^2 var a = this.x.redSqr(); // B = Y1^2 var b = this.y.redSqr(); // C = 2 * Z1^2 var c = this.z.redSqr(); c = c.redIAdd(c); // D = a * A var d = this.curve._mulA(a); // E = (X1 + Y1)^2 - A - B var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b); // G = D + B var g = d.redAdd(b); // F = G - C var f = g.redSub(c); // H = D - B var h = d.redSub(b); // X3 = E * F var nx = e.redMul(f); // Y3 = G * H var ny = g.redMul(h); // T3 = E * H var nt = e.redMul(h); // Z3 = F * G var nz = f.redMul(g); return this.curve.point(nx, ny, nz, nt); }; Point.prototype._projDbl = function _projDbl() { // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html // #doubling-dbl-2008-bbjlp // #doubling-dbl-2007-bl // and others // Generally 3M + 4S or 2M + 4S // B = (X1 + Y1)^2 var b = this.x.redAdd(this.y).redSqr(); // C = X1^2 var c = this.x.redSqr(); // D = Y1^2 var d = this.y.redSqr(); var nx; var ny; var nz; if (this.curve.twisted) { // E = a * C var e = this.curve._mulA(c); // F = E + D var f = e.redAdd(d); if (this.zOne) { // X3 = (B - C - D) * (F - 2) nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two)); // Y3 = F * (E - D) ny = f.redMul(e.redSub(d)); // Z3 = F^2 - 2 * F nz = f.redSqr().redSub(f).redSub(f); } else { // H = Z1^2 var h = this.z.redSqr(); // J = F - 2 * H var j = f.redSub(h).redISub(h); // X3 = (B-C-D)*J nx = b.redSub(c).redISub(d).redMul(j); // Y3 = F * (E - D) ny = f.redMul(e.redSub(d)); // Z3 = F * J nz = f.redMul(j); } } else { // E = C + D var e = c.redAdd(d); // H = (c * Z1)^2 var h = this.curve._mulC(this.z).redSqr(); // J = E - 2 * H var j = e.redSub(h).redSub(h); // X3 = c * (B - E) * J nx = this.curve._mulC(b.redISub(e)).redMul(j); // Y3 = c * E * (C - D) ny = this.curve._mulC(e).redMul(c.redISub(d)); // Z3 = E * J nz = e.redMul(j); } return this.curve.point(nx, ny, nz); }; Point.prototype.dbl = function dbl() { if (this.isInfinity()) return this; // Double in extended coordinates if (this.curve.extended) return this._extDbl(); else return this._projDbl(); }; Point.prototype._extAdd = function _extAdd(p) { // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html // #addition-add-2008-hwcd-3 // 8M // A = (Y1 - X1) * (Y2 - X2) var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x)); // B = (Y1 + X1) * (Y2 + X2) var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x)); // C = T1 * k * T2 var c = this.t.redMul(this.curve.dd).redMul(p.t); // D = Z1 * 2 * Z2 var d = this.z.redMul(p.z.redAdd(p.z)); // E = B - A var e = b.redSub(a); // F = D - C var f = d.redSub(c); // G = D + C var g = d.redAdd(c); // H = B + A var h = b.redAdd(a); // X3 = E * F var nx = e.redMul(f); // Y3 = G * H var ny = g.redMul(h); // T3 = E * H var nt = e.redMul(h); // Z3 = F * G var nz = f.redMul(g); return this.curve.point(nx, ny, nz, nt); }; Point.prototype._projAdd = function _projAdd(p) { // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html // #addition-add-2008-bbjlp // #addition-add-2007-bl // 10M + 1S // A = Z1 * Z2 var a = this.z.redMul(p.z); // B = A^2 var b = a.redSqr(); // C = X1 * X2 var c = this.x.redMul(p.x); // D = Y1 * Y2 var d = this.y.redMul(p.y); // E = d * C * D var e = this.curve.d.redMul(c).redMul(d); // F = B - E var f = b.redSub(e); // G = B + E var g = b.redAdd(e); // X3 = A * F * ((X1 + Y1) * (X2 + Y2) - C - D) var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d); var nx = a.redMul(f).redMul(tmp); var ny; var nz; if (this.curve.twisted) { // Y3 = A * G * (D - a * C) ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c))); // Z3 = F * G nz = f.redMul(g); } else { // Y3 = A * G * (D - C) ny = a.redMul(g).redMul(d.redSub(c)); // Z3 = c * F * G nz = this.curve._mulC(f).redMul(g); } return this.curve.point(nx, ny, nz); }; Point.prototype.add = function add(p) { if (this.isInfinity()) return p; if (p.isInfinity()) return this; if (this.curve.extended) return this._extAdd(p); else return this._projAdd(p); }; Point.prototype.mul = function mul(k) { if (this._hasDoubles(k)) return this.curve._fixedNafMul(this, k); else return this.curve._wnafMul(this, k); }; Point.prototype.mulAdd = function mulAdd(k1, p, k2) { return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2, false); }; Point.prototype.jmulAdd = function jmulAdd(k1, p, k2) { return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2, true); }; Point.prototype.normalize = function normalize() { if (this.zOne) return this; // Normalize coordinates var zi = this.z.redInvm(); this.x = this.x.redMul(zi); this.y = this.y.redMul(zi); if (this.t) this.t = this.t.redMul(zi); this.z = this.curve.one; this.zOne = true; return this; }; Point.prototype.neg = function neg() { return this.curve.point(this.x.redNeg(), this.y, this.z, this.t && this.t.redNeg()); }; Point.prototype.getX = function getX() { this.normalize(); return this.x.fromRed(); }; Point.prototype.getY = function getY() { this.normalize(); return this.y.fromRed(); }; Point.prototype.eq = function eq(other) { return this === other || this.getX().cmp(other.getX()) === 0 && this.getY().cmp(other.getY()) === 0; }; Point.prototype.eqXToP = function eqXToP(x) { var rx = x.toRed(this.curve.red).redMul(this.z); if (this.x.cmp(rx) === 0) return true; var xc = x.clone(); var t = this.curve.redN.redMul(this.z); for (;;) { xc.iadd(this.curve.n); if (xc.cmp(this.curve.p) >= 0) return false; rx.redIAdd(t); if (this.x.cmp(rx) === 0) return true; } }; // Compatibility with BaseCurve Point.prototype.toP = Point.prototype.normalize; Point.prototype.mixedAdd = Point.prototype.add; /***/ }), /***/ "./node_modules/elliptic/lib/elliptic/curve/index.js": /*!***********************************************************!*\ !*** ./node_modules/elliptic/lib/elliptic/curve/index.js ***! \***********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var curve = exports; curve.base = __webpack_require__(/*! ./base */ "./node_modules/elliptic/lib/elliptic/curve/base.js"); curve.short = __webpack_require__(/*! ./short */ "./node_modules/elliptic/lib/elliptic/curve/short.js"); curve.mont = __webpack_require__(/*! ./mont */ "./node_modules/elliptic/lib/elliptic/curve/mont.js"); curve.edwards = __webpack_require__(/*! ./edwards */ "./node_modules/elliptic/lib/elliptic/curve/edwards.js"); /***/ }), /***/ "./node_modules/elliptic/lib/elliptic/curve/mont.js": /*!**********************************************************!*\ !*** ./node_modules/elliptic/lib/elliptic/curve/mont.js ***! \**********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var curve = __webpack_require__(/*! ../curve */ "./node_modules/elliptic/lib/elliptic/curve/index.js"); var BN = __webpack_require__(/*! bn.js */ "./node_modules/bn.js/lib/bn.js"); var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js"); var Base = curve.base; var elliptic = __webpack_require__(/*! ../../elliptic */ "./node_modules/elliptic/lib/elliptic.js"); var utils = elliptic.utils; function MontCurve(conf) { Base.call(this, 'mont', conf); this.a = new BN(conf.a, 16).toRed(this.red); this.b = new BN(conf.b, 16).toRed(this.red); this.i4 = new BN(4).toRed(this.red).redInvm(); this.two = new BN(2).toRed(this.red); this.a24 = this.i4.redMul(this.a.redAdd(this.two)); } inherits(MontCurve, Base); module.exports = MontCurve; MontCurve.prototype.validate = function validate(point) { var x = point.normalize().x; var x2 = x.redSqr(); var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x); var y = rhs.redSqrt(); return y.redSqr().cmp(rhs) === 0; }; function Point(curve, x, z) { Base.BasePoint.call(this, curve, 'projective'); if (x === null && z === null) { this.x = this.curve.one; this.z = this.curve.zero; } else { this.x = new BN(x, 16); this.z = new BN(z, 16); if (!this.x.red) this.x = this.x.toRed(this.curve.red); if (!this.z.red) this.z = this.z.toRed(this.curve.red); } } inherits(Point, Base.BasePoint); MontCurve.prototype.decodePoint = function decodePoint(bytes, enc) { return this.point(utils.toArray(bytes, enc), 1); }; MontCurve.prototype.point = function point(x, z) { return new Point(this, x, z); }; MontCurve.prototype.pointFromJSON = function pointFromJSON(obj) { return Point.fromJSON(this, obj); }; Point.prototype.precompute = function precompute() { // No-op }; Point.prototype._encode = function _encode() { return this.getX().toArray('be', this.curve.p.byteLength()); }; Point.fromJSON = function fromJSON(curve, obj) { return new Point(curve, obj[0], obj[1] || curve.one); }; Point.prototype.inspect = function inspect() { if (this.isInfinity()) return ''; return ''; }; Point.prototype.isInfinity = function isInfinity() { // XXX This code assumes that zero is always zero in red return this.z.cmpn(0) === 0; }; Point.prototype.dbl = function dbl() { // http://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html#doubling-dbl-1987-m-3 // 2M + 2S + 4A // A = X1 + Z1 var a = this.x.redAdd(this.z); // AA = A^2 var aa = a.redSqr(); // B = X1 - Z1 var b = this.x.redSub(this.z); // BB = B^2 var bb = b.redSqr(); // C = AA - BB var c = aa.redSub(bb); // X3 = AA * BB var nx = aa.redMul(bb); // Z3 = C * (BB + A24 * C) var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c))); return this.curve.point(nx, nz); }; Point.prototype.add = function add() { throw new Error('Not supported on Montgomery curve'); }; Point.prototype.diffAdd = function diffAdd(p, diff) { // http://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html#diffadd-dadd-1987-m-3 // 4M + 2S + 6A // A = X2 + Z2 var a = this.x.redAdd(this.z); // B = X2 - Z2 var b = this.x.redSub(this.z); // C = X3 + Z3 var c = p.x.redAdd(p.z); // D = X3 - Z3 var d = p.x.redSub(p.z); // DA = D * A var da = d.redMul(a); // CB = C * B var cb = c.redMul(b); // X5 = Z1 * (DA + CB)^2 var nx = diff.z.redMul(da.redAdd(cb).redSqr()); // Z5 = X1 * (DA - CB)^2 var nz = diff.x.redMul(da.redISub(cb).redSqr()); return this.curve.point(nx, nz); }; Point.prototype.mul = function mul(k) { var t = k.clone(); var a = this; // (N / 2) * Q + Q var b = this.curve.point(null, null); // (N / 2) * Q var c = this; // Q for (var bits = []; t.cmpn(0) !== 0; t.iushrn(1)) bits.push(t.andln(1)); for (var i = bits.length - 1; i >= 0; i--) { if (bits[i] === 0) { // N * Q + Q = ((N / 2) * Q + Q)) + (N / 2) * Q a = a.diffAdd(b, c); // N * Q = 2 * ((N / 2) * Q + Q)) b = b.dbl(); } else { // N * Q = ((N / 2) * Q + Q) + ((N / 2) * Q) b = a.diffAdd(b, c); // N * Q + Q = 2 * ((N / 2) * Q + Q) a = a.dbl(); } } return b; }; Point.prototype.mulAdd = function mulAdd() { throw new Error('Not supported on Montgomery curve'); }; Point.prototype.jumlAdd = function jumlAdd() { throw new Error('Not supported on Montgomery curve'); }; Point.prototype.eq = function eq(other) { return this.getX().cmp(other.getX()) === 0; }; Point.prototype.normalize = function normalize() { this.x = this.x.redMul(this.z.redInvm()); this.z = this.curve.one; return this; }; Point.prototype.getX = function getX() { // Normalize coordinates this.normalize(); return this.x.fromRed(); }; /***/ }), /***/ "./node_modules/elliptic/lib/elliptic/curve/short.js": /*!***********************************************************!*\ !*** ./node_modules/elliptic/lib/elliptic/curve/short.js ***! \***********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var curve = __webpack_require__(/*! ../curve */ "./node_modules/elliptic/lib/elliptic/curve/index.js"); var elliptic = __webpack_require__(/*! ../../elliptic */ "./node_modules/elliptic/lib/elliptic.js"); var BN = __webpack_require__(/*! bn.js */ "./node_modules/bn.js/lib/bn.js"); var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js"); var Base = curve.base; var assert = elliptic.utils.assert; function ShortCurve(conf) { Base.call(this, 'short', conf); this.a = new BN(conf.a, 16).toRed(this.red); this.b = new BN(conf.b, 16).toRed(this.red); this.tinv = this.two.redInvm(); this.zeroA = this.a.fromRed().cmpn(0) === 0; this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0; // If the curve is endomorphic, precalculate beta and lambda this.endo = this._getEndomorphism(conf); this._endoWnafT1 = new Array(4); this._endoWnafT2 = new Array(4); } inherits(ShortCurve, Base); module.exports = ShortCurve; ShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) { // No efficient endomorphism if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1) return; // Compute beta and lambda, that lambda * P = (beta * Px; Py) var beta; var lambda; if (conf.beta) { beta = new BN(conf.beta, 16).toRed(this.red); } else { var betas = this._getEndoRoots(this.p); // Choose the smallest beta beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1]; beta = beta.toRed(this.red); } if (conf.lambda) { lambda = new BN(conf.lambda, 16); } else { // Choose the lambda that is matching selected beta var lambdas = this._getEndoRoots(this.n); if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) { lambda = lambdas[0]; } else { lambda = lambdas[1]; assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0); } } // Get basis vectors, used for balanced length-two representation var basis; if (conf.basis) { basis = conf.basis.map(function(vec) { return { a: new BN(vec.a, 16), b: new BN(vec.b, 16) }; }); } else { basis = this._getEndoBasis(lambda); } return { beta: beta, lambda: lambda, basis: basis }; }; ShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) { // Find roots of for x^2 + x + 1 in F // Root = (-1 +- Sqrt(-3)) / 2 // var red = num === this.p ? this.red : BN.mont(num); var tinv = new BN(2).toRed(red).redInvm(); var ntinv = tinv.redNeg(); var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv); var l1 = ntinv.redAdd(s).fromRed(); var l2 = ntinv.redSub(s).fromRed(); return [ l1, l2 ]; }; ShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) { // aprxSqrt >= sqrt(this.n) var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2)); // 3.74 // Run EGCD, until r(L + 1) < aprxSqrt var u = lambda; var v = this.n.clone(); var x1 = new BN(1); var y1 = new BN(0); var x2 = new BN(0); var y2 = new BN(1); // NOTE: all vectors are roots of: a + b * lambda = 0 (mod n) var a0; var b0; // First vector var a1; var b1; // Second vector var a2; var b2; var prevR; var i = 0; var r; var x; while (u.cmpn(0) !== 0) { var q = v.div(u); r = v.sub(q.mul(u)); x = x2.sub(q.mul(x1)); var y = y2.sub(q.mul(y1)); if (!a1 && r.cmp(aprxSqrt) < 0) { a0 = prevR.neg(); b0 = x1; a1 = r.neg(); b1 = x; } else if (a1 && ++i === 2) { break; } prevR = r; v = u; u = r; x2 = x1; x1 = x; y2 = y1; y1 = y; } a2 = r.neg(); b2 = x; var len1 = a1.sqr().add(b1.sqr()); var len2 = a2.sqr().add(b2.sqr()); if (len2.cmp(len1) >= 0) { a2 = a0; b2 = b0; } // Normalize signs if (a1.negative) { a1 = a1.neg(); b1 = b1.neg(); } if (a2.negative) { a2 = a2.neg(); b2 = b2.neg(); } return [ { a: a1, b: b1 }, { a: a2, b: b2 } ]; }; ShortCurve.prototype._endoSplit = function _endoSplit(k) { var basis = this.endo.basis; var v1 = basis[0]; var v2 = basis[1]; var c1 = v2.b.mul(k).divRound(this.n); var c2 = v1.b.neg().mul(k).divRound(this.n); var p1 = c1.mul(v1.a); var p2 = c2.mul(v2.a); var q1 = c1.mul(v1.b); var q2 = c2.mul(v2.b); // Calculate answer var k1 = k.sub(p1).sub(p2); var k2 = q1.add(q2).neg(); return { k1: k1, k2: k2 }; }; ShortCurve.prototype.pointFromX = function pointFromX(x, odd) { x = new BN(x, 16); if (!x.red) x = x.toRed(this.red); var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b); var y = y2.redSqrt(); if (y.redSqr().redSub(y2).cmp(this.zero) !== 0) throw new Error('invalid point'); // XXX Is there any way to tell if the number is odd without converting it // to non-red form? var isOdd = y.fromRed().isOdd(); if (odd && !isOdd || !odd && isOdd) y = y.redNeg(); return this.point(x, y); }; ShortCurve.prototype.validate = function validate(point) { if (point.inf) return true; var x = point.x; var y = point.y; var ax = this.a.redMul(x); var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b); return y.redSqr().redISub(rhs).cmpn(0) === 0; }; ShortCurve.prototype._endoWnafMulAdd = function _endoWnafMulAdd(points, coeffs, jacobianResult) { var npoints = this._endoWnafT1; var ncoeffs = this._endoWnafT2; for (var i = 0; i < points.length; i++) { var split = this._endoSplit(coeffs[i]); var p = points[i]; var beta = p._getBeta(); if (split.k1.negative) { split.k1.ineg(); p = p.neg(true); } if (split.k2.negative) { split.k2.ineg(); beta = beta.neg(true); } npoints[i * 2] = p; npoints[i * 2 + 1] = beta; ncoeffs[i * 2] = split.k1; ncoeffs[i * 2 + 1] = split.k2; } var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult); // Clean-up references to points and coefficients for (var j = 0; j < i * 2; j++) { npoints[j] = null; ncoeffs[j] = null; } return res; }; function Point(curve, x, y, isRed) { Base.BasePoint.call(this, curve, 'affine'); if (x === null && y === null) { this.x = null; this.y = null; this.inf = true; } else { this.x = new BN(x, 16); this.y = new BN(y, 16); // Force redgomery representation when loading from JSON if (isRed) { this.x.forceRed(this.curve.red); this.y.forceRed(this.curve.red); } if (!this.x.red) this.x = this.x.toRed(this.curve.red); if (!this.y.red) this.y = this.y.toRed(this.curve.red); this.inf = false; } } inherits(Point, Base.BasePoint); ShortCurve.prototype.point = function point(x, y, isRed) { return new Point(this, x, y, isRed); }; ShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) { return Point.fromJSON(this, obj, red); }; Point.prototype._getBeta = function _getBeta() { if (!this.curve.endo) return; var pre = this.precomputed; if (pre && pre.beta) return pre.beta; var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y); if (pre) { var curve = this.curve; var endoMul = function(p) { return curve.point(p.x.redMul(curve.endo.beta), p.y); }; pre.beta = beta; beta.precomputed = { beta: null, naf: pre.naf && { wnd: pre.naf.wnd, points: pre.naf.points.map(endoMul) }, doubles: pre.doubles && { step: pre.doubles.step, points: pre.doubles.points.map(endoMul) } }; } return beta; }; Point.prototype.toJSON = function toJSON() { if (!this.precomputed) return [ this.x, this.y ]; return [ this.x, this.y, this.precomputed && { doubles: this.precomputed.doubles && { step: this.precomputed.doubles.step, points: this.precomputed.doubles.points.slice(1) }, naf: this.precomputed.naf && { wnd: this.precomputed.naf.wnd, points: this.precomputed.naf.points.slice(1) } } ]; }; Point.fromJSON = function fromJSON(curve, obj, red) { if (typeof obj === 'string') obj = JSON.parse(obj); var res = curve.point(obj[0], obj[1], red); if (!obj[2]) return res; function obj2point(obj) { return curve.point(obj[0], obj[1], red); } var pre = obj[2]; res.precomputed = { beta: null, doubles: pre.doubles && { step: pre.doubles.step, points: [ res ].concat(pre.doubles.points.map(obj2point)) }, naf: pre.naf && { wnd: pre.naf.wnd, points: [ res ].concat(pre.naf.points.map(obj2point)) } }; return res; }; Point.prototype.inspect = function inspect() { if (this.isInfinity()) return ''; return ''; }; Point.prototype.isInfinity = function isInfinity() { return this.inf; }; Point.prototype.add = function add(p) { // O + P = P if (this.inf) return p; // P + O = P if (p.inf) return this; // P + P = 2P if (this.eq(p)) return this.dbl(); // P + (-P) = O if (this.neg().eq(p)) return this.curve.point(null, null); // P + Q = O if (this.x.cmp(p.x) === 0) return this.curve.point(null, null); var c = this.y.redSub(p.y); if (c.cmpn(0) !== 0) c = c.redMul(this.x.redSub(p.x).redInvm()); var nx = c.redSqr().redISub(this.x).redISub(p.x); var ny = c.redMul(this.x.redSub(nx)).redISub(this.y); return this.curve.point(nx, ny); }; Point.prototype.dbl = function dbl() { if (this.inf) return this; // 2P = O var ys1 = this.y.redAdd(this.y); if (ys1.cmpn(0) === 0) return this.curve.point(null, null); var a = this.curve.a; var x2 = this.x.redSqr(); var dyinv = ys1.redInvm(); var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv); var nx = c.redSqr().redISub(this.x.redAdd(this.x)); var ny = c.redMul(this.x.redSub(nx)).redISub(this.y); return this.curve.point(nx, ny); }; Point.prototype.getX = function getX() { return this.x.fromRed(); }; Point.prototype.getY = function getY() { return this.y.fromRed(); }; Point.prototype.mul = function mul(k) { k = new BN(k, 16); if (this._hasDoubles(k)) return this.curve._fixedNafMul(this, k); else if (this.curve.endo) return this.curve._endoWnafMulAdd([ this ], [ k ]); else return this.curve._wnafMul(this, k); }; Point.prototype.mulAdd = function mulAdd(k1, p2, k2) { var points = [ this, p2 ]; var coeffs = [ k1, k2 ]; if (this.curve.endo) return this.curve._endoWnafMulAdd(points, coeffs); else return this.curve._wnafMulAdd(1, points, coeffs, 2); }; Point.prototype.jmulAdd = function jmulAdd(k1, p2, k2) { var points = [ this, p2 ]; var coeffs = [ k1, k2 ]; if (this.curve.endo) return this.curve._endoWnafMulAdd(points, coeffs, true); else return this.curve._wnafMulAdd(1, points, coeffs, 2, true); }; Point.prototype.eq = function eq(p) { return this === p || this.inf === p.inf && (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0); }; Point.prototype.neg = function neg(_precompute) { if (this.inf) return this; var res = this.curve.point(this.x, this.y.redNeg()); if (_precompute && this.precomputed) { var pre = this.precomputed; var negate = function(p) { return p.neg(); }; res.precomputed = { naf: pre.naf && { wnd: pre.naf.wnd, points: pre.naf.points.map(negate) }, doubles: pre.doubles && { step: pre.doubles.step, points: pre.doubles.points.map(negate) } }; } return res; }; Point.prototype.toJ = function toJ() { if (this.inf) return this.curve.jpoint(null, null, null); var res = this.curve.jpoint(this.x, this.y, this.curve.one); return res; }; function JPoint(curve, x, y, z) { Base.BasePoint.call(this, curve, 'jacobian'); if (x === null && y === null && z === null) { this.x = this.curve.one; this.y = this.curve.one; this.z = new BN(0); } else { this.x = new BN(x, 16); this.y = new BN(y, 16); this.z = new BN(z, 16); } if (!this.x.red) this.x = this.x.toRed(this.curve.red); if (!this.y.red) this.y = this.y.toRed(this.curve.red); if (!this.z.red) this.z = this.z.toRed(this.curve.red); this.zOne = this.z === this.curve.one; } inherits(JPoint, Base.BasePoint); ShortCurve.prototype.jpoint = function jpoint(x, y, z) { return new JPoint(this, x, y, z); }; JPoint.prototype.toP = function toP() { if (this.isInfinity()) return this.curve.point(null, null); var zinv = this.z.redInvm(); var zinv2 = zinv.redSqr(); var ax = this.x.redMul(zinv2); var ay = this.y.redMul(zinv2).redMul(zinv); return this.curve.point(ax, ay); }; JPoint.prototype.neg = function neg() { return this.curve.jpoint(this.x, this.y.redNeg(), this.z); }; JPoint.prototype.add = function add(p) { // O + P = P if (this.isInfinity()) return p; // P + O = P if (p.isInfinity()) return this; // 12M + 4S + 7A var pz2 = p.z.redSqr(); var z2 = this.z.redSqr(); var u1 = this.x.redMul(pz2); var u2 = p.x.redMul(z2); var s1 = this.y.redMul(pz2.redMul(p.z)); var s2 = p.y.redMul(z2.redMul(this.z)); var h = u1.redSub(u2); var r = s1.redSub(s2); if (h.cmpn(0) === 0) { if (r.cmpn(0) !== 0) return this.curve.jpoint(null, null, null); else return this.dbl(); } var h2 = h.redSqr(); var h3 = h2.redMul(h); var v = u1.redMul(h2); var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v); var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3)); var nz = this.z.redMul(p.z).redMul(h); return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype.mixedAdd = function mixedAdd(p) { // O + P = P if (this.isInfinity()) return p.toJ(); // P + O = P if (p.isInfinity()) return this; // 8M + 3S + 7A var z2 = this.z.redSqr(); var u1 = this.x; var u2 = p.x.redMul(z2); var s1 = this.y; var s2 = p.y.redMul(z2).redMul(this.z); var h = u1.redSub(u2); var r = s1.redSub(s2); if (h.cmpn(0) === 0) { if (r.cmpn(0) !== 0) return this.curve.jpoint(null, null, null); else return this.dbl(); } var h2 = h.redSqr(); var h3 = h2.redMul(h); var v = u1.redMul(h2); var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v); var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3)); var nz = this.z.redMul(h); return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype.dblp = function dblp(pow) { if (pow === 0) return this; if (this.isInfinity()) return this; if (!pow) return this.dbl(); if (this.curve.zeroA || this.curve.threeA) { var r = this; for (var i = 0; i < pow; i++) r = r.dbl(); return r; } // 1M + 2S + 1A + N * (4S + 5M + 8A) // N = 1 => 6M + 6S + 9A var a = this.curve.a; var tinv = this.curve.tinv; var jx = this.x; var jy = this.y; var jz = this.z; var jz4 = jz.redSqr().redSqr(); // Reuse results var jyd = jy.redAdd(jy); for (var i = 0; i < pow; i++) { var jx2 = jx.redSqr(); var jyd2 = jyd.redSqr(); var jyd4 = jyd2.redSqr(); var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4)); var t1 = jx.redMul(jyd2); var nx = c.redSqr().redISub(t1.redAdd(t1)); var t2 = t1.redISub(nx); var dny = c.redMul(t2); dny = dny.redIAdd(dny).redISub(jyd4); var nz = jyd.redMul(jz); if (i + 1 < pow) jz4 = jz4.redMul(jyd4); jx = nx; jz = nz; jyd = dny; } return this.curve.jpoint(jx, jyd.redMul(tinv), jz); }; JPoint.prototype.dbl = function dbl() { if (this.isInfinity()) return this; if (this.curve.zeroA) return this._zeroDbl(); else if (this.curve.threeA) return this._threeDbl(); else return this._dbl(); }; JPoint.prototype._zeroDbl = function _zeroDbl() { var nx; var ny; var nz; // Z = 1 if (this.zOne) { // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html // #doubling-mdbl-2007-bl // 1M + 5S + 14A // XX = X1^2 var xx = this.x.redSqr(); // YY = Y1^2 var yy = this.y.redSqr(); // YYYY = YY^2 var yyyy = yy.redSqr(); // S = 2 * ((X1 + YY)^2 - XX - YYYY) var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); s = s.redIAdd(s); // M = 3 * XX + a; a = 0 var m = xx.redAdd(xx).redIAdd(xx); // T = M ^ 2 - 2*S var t = m.redSqr().redISub(s).redISub(s); // 8 * YYYY var yyyy8 = yyyy.redIAdd(yyyy); yyyy8 = yyyy8.redIAdd(yyyy8); yyyy8 = yyyy8.redIAdd(yyyy8); // X3 = T nx = t; // Y3 = M * (S - T) - 8 * YYYY ny = m.redMul(s.redISub(t)).redISub(yyyy8); // Z3 = 2*Y1 nz = this.y.redAdd(this.y); } else { // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html // #doubling-dbl-2009-l // 2M + 5S + 13A // A = X1^2 var a = this.x.redSqr(); // B = Y1^2 var b = this.y.redSqr(); // C = B^2 var c = b.redSqr(); // D = 2 * ((X1 + B)^2 - A - C) var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c); d = d.redIAdd(d); // E = 3 * A var e = a.redAdd(a).redIAdd(a); // F = E^2 var f = e.redSqr(); // 8 * C var c8 = c.redIAdd(c); c8 = c8.redIAdd(c8); c8 = c8.redIAdd(c8); // X3 = F - 2 * D nx = f.redISub(d).redISub(d); // Y3 = E * (D - X3) - 8 * C ny = e.redMul(d.redISub(nx)).redISub(c8); // Z3 = 2 * Y1 * Z1 nz = this.y.redMul(this.z); nz = nz.redIAdd(nz); } return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype._threeDbl = function _threeDbl() { var nx; var ny; var nz; // Z = 1 if (this.zOne) { // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html // #doubling-mdbl-2007-bl // 1M + 5S + 15A // XX = X1^2 var xx = this.x.redSqr(); // YY = Y1^2 var yy = this.y.redSqr(); // YYYY = YY^2 var yyyy = yy.redSqr(); // S = 2 * ((X1 + YY)^2 - XX - YYYY) var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); s = s.redIAdd(s); // M = 3 * XX + a var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a); // T = M^2 - 2 * S var t = m.redSqr().redISub(s).redISub(s); // X3 = T nx = t; // Y3 = M * (S - T) - 8 * YYYY var yyyy8 = yyyy.redIAdd(yyyy); yyyy8 = yyyy8.redIAdd(yyyy8); yyyy8 = yyyy8.redIAdd(yyyy8); ny = m.redMul(s.redISub(t)).redISub(yyyy8); // Z3 = 2 * Y1 nz = this.y.redAdd(this.y); } else { // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b // 3M + 5S // delta = Z1^2 var delta = this.z.redSqr(); // gamma = Y1^2 var gamma = this.y.redSqr(); // beta = X1 * gamma var beta = this.x.redMul(gamma); // alpha = 3 * (X1 - delta) * (X1 + delta) var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta)); alpha = alpha.redAdd(alpha).redIAdd(alpha); // X3 = alpha^2 - 8 * beta var beta4 = beta.redIAdd(beta); beta4 = beta4.redIAdd(beta4); var beta8 = beta4.redAdd(beta4); nx = alpha.redSqr().redISub(beta8); // Z3 = (Y1 + Z1)^2 - gamma - delta nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta); // Y3 = alpha * (4 * beta - X3) - 8 * gamma^2 var ggamma8 = gamma.redSqr(); ggamma8 = ggamma8.redIAdd(ggamma8); ggamma8 = ggamma8.redIAdd(ggamma8); ggamma8 = ggamma8.redIAdd(ggamma8); ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8); } return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype._dbl = function _dbl() { var a = this.curve.a; // 4M + 6S + 10A var jx = this.x; var jy = this.y; var jz = this.z; var jz4 = jz.redSqr().redSqr(); var jx2 = jx.redSqr(); var jy2 = jy.redSqr(); var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4)); var jxd4 = jx.redAdd(jx); jxd4 = jxd4.redIAdd(jxd4); var t1 = jxd4.redMul(jy2); var nx = c.redSqr().redISub(t1.redAdd(t1)); var t2 = t1.redISub(nx); var jyd8 = jy2.redSqr(); jyd8 = jyd8.redIAdd(jyd8); jyd8 = jyd8.redIAdd(jyd8); jyd8 = jyd8.redIAdd(jyd8); var ny = c.redMul(t2).redISub(jyd8); var nz = jy.redAdd(jy).redMul(jz); return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype.trpl = function trpl() { if (!this.curve.zeroA) return this.dbl().add(this); // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#tripling-tpl-2007-bl // 5M + 10S + ... // XX = X1^2 var xx = this.x.redSqr(); // YY = Y1^2 var yy = this.y.redSqr(); // ZZ = Z1^2 var zz = this.z.redSqr(); // YYYY = YY^2 var yyyy = yy.redSqr(); // M = 3 * XX + a * ZZ2; a = 0 var m = xx.redAdd(xx).redIAdd(xx); // MM = M^2 var mm = m.redSqr(); // E = 6 * ((X1 + YY)^2 - XX - YYYY) - MM var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); e = e.redIAdd(e); e = e.redAdd(e).redIAdd(e); e = e.redISub(mm); // EE = E^2 var ee = e.redSqr(); // T = 16*YYYY var t = yyyy.redIAdd(yyyy); t = t.redIAdd(t); t = t.redIAdd(t); t = t.redIAdd(t); // U = (M + E)^2 - MM - EE - T var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t); // X3 = 4 * (X1 * EE - 4 * YY * U) var yyu4 = yy.redMul(u); yyu4 = yyu4.redIAdd(yyu4); yyu4 = yyu4.redIAdd(yyu4); var nx = this.x.redMul(ee).redISub(yyu4); nx = nx.redIAdd(nx); nx = nx.redIAdd(nx); // Y3 = 8 * Y1 * (U * (T - U) - E * EE) var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee))); ny = ny.redIAdd(ny); ny = ny.redIAdd(ny); ny = ny.redIAdd(ny); // Z3 = (Z1 + E)^2 - ZZ - EE var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee); return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype.mul = function mul(k, kbase) { k = new BN(k, kbase); return this.curve._wnafMul(this, k); }; JPoint.prototype.eq = function eq(p) { if (p.type === 'affine') return this.eq(p.toJ()); if (this === p) return true; // x1 * z2^2 == x2 * z1^2 var z2 = this.z.redSqr(); var pz2 = p.z.redSqr(); if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0) return false; // y1 * z2^3 == y2 * z1^3 var z3 = z2.redMul(this.z); var pz3 = pz2.redMul(p.z); return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0; }; JPoint.prototype.eqXToP = function eqXToP(x) { var zs = this.z.redSqr(); var rx = x.toRed(this.curve.red).redMul(zs); if (this.x.cmp(rx) === 0) return true; var xc = x.clone(); var t = this.curve.redN.redMul(zs); for (;;) { xc.iadd(this.curve.n); if (xc.cmp(this.curve.p) >= 0) return false; rx.redIAdd(t); if (this.x.cmp(rx) === 0) return true; } }; JPoint.prototype.inspect = function inspect() { if (this.isInfinity()) return ''; return ''; }; JPoint.prototype.isInfinity = function isInfinity() { // XXX This code assumes that zero is always zero in red return this.z.cmpn(0) === 0; }; /***/ }), /***/ "./node_modules/elliptic/lib/elliptic/curves.js": /*!******************************************************!*\ !*** ./node_modules/elliptic/lib/elliptic/curves.js ***! \******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var curves = exports; var hash = __webpack_require__(/*! hash.js */ "./node_modules/hash.js/lib/hash.js"); var elliptic = __webpack_require__(/*! ../elliptic */ "./node_modules/elliptic/lib/elliptic.js"); var assert = elliptic.utils.assert; function PresetCurve(options) { if (options.type === 'short') this.curve = new elliptic.curve.short(options); else if (options.type === 'edwards') this.curve = new elliptic.curve.edwards(options); else this.curve = new elliptic.curve.mont(options); this.g = this.curve.g; this.n = this.curve.n; this.hash = options.hash; assert(this.g.validate(), 'Invalid curve'); assert(this.g.mul(this.n).isInfinity(), 'Invalid curve, G*N != O'); } curves.PresetCurve = PresetCurve; function defineCurve(name, options) { Object.defineProperty(curves, name, { configurable: true, enumerable: true, get: function() { var curve = new PresetCurve(options); Object.defineProperty(curves, name, { configurable: true, enumerable: true, value: curve }); return curve; } }); } defineCurve('p192', { type: 'short', prime: 'p192', p: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff', a: 'ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc', b: '64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1', n: 'ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831', hash: hash.sha256, gRed: false, g: [ '188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012', '07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811' ] }); defineCurve('p224', { type: 'short', prime: 'p224', p: 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001', a: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe', b: 'b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4', n: 'ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d', hash: hash.sha256, gRed: false, g: [ 'b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21', 'bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34' ] }); defineCurve('p256', { type: 'short', prime: null, p: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff', a: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc', b: '5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b', n: 'ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551', hash: hash.sha256, gRed: false, g: [ '6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296', '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5' ] }); defineCurve('p384', { type: 'short', prime: null, p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + 'fffffffe ffffffff 00000000 00000000 ffffffff', a: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + 'fffffffe ffffffff 00000000 00000000 fffffffc', b: 'b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f ' + '5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef', n: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 ' + 'f4372ddf 581a0db2 48b0a77a ecec196a ccc52973', hash: hash.sha384, gRed: false, g: [ 'aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 ' + '5502f25d bf55296c 3a545e38 72760ab7', '3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 ' + '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f' ] }); defineCurve('p521', { type: 'short', prime: null, p: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + 'ffffffff ffffffff ffffffff ffffffff ffffffff', a: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + 'ffffffff ffffffff ffffffff ffffffff fffffffc', b: '00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b ' + '99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd ' + '3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00', n: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + 'ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 ' + 'f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409', hash: hash.sha512, gRed: false, g: [ '000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 ' + '053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 ' + 'a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66', '00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 ' + '579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 ' + '3fad0761 353c7086 a272c240 88be9476 9fd16650' ] }); defineCurve('curve25519', { type: 'mont', prime: 'p25519', p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed', a: '76d06', b: '1', n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed', hash: hash.sha256, gRed: false, g: [ '9' ] }); defineCurve('ed25519', { type: 'edwards', prime: 'p25519', p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed', a: '-1', c: '1', // -121665 * (121666^(-1)) (mod P) d: '52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3', n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed', hash: hash.sha256, gRed: false, g: [ '216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a', // 4/5 '6666666666666666666666666666666666666666666666666666666666666658' ] }); var pre; try { pre = __webpack_require__(/*! ./precomputed/secp256k1 */ "./node_modules/elliptic/lib/elliptic/precomputed/secp256k1.js"); } catch (e) { pre = undefined; } defineCurve('secp256k1', { type: 'short', prime: 'k256', p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f', a: '0', b: '7', n: 'ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141', h: '1', hash: hash.sha256, // Precomputed endomorphism beta: '7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee', lambda: '5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72', basis: [ { a: '3086d221a7d46bcde86c90e49284eb15', b: '-e4437ed6010e88286f547fa90abfe4c3' }, { a: '114ca50f7a8e2f3f657c1108d9d44cfd8', b: '3086d221a7d46bcde86c90e49284eb15' } ], gRed: false, g: [ '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798', '483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8', pre ] }); /***/ }), /***/ "./node_modules/elliptic/lib/elliptic/ec/index.js": /*!********************************************************!*\ !*** ./node_modules/elliptic/lib/elliptic/ec/index.js ***! \********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var BN = __webpack_require__(/*! bn.js */ "./node_modules/bn.js/lib/bn.js"); var HmacDRBG = __webpack_require__(/*! hmac-drbg */ "./node_modules/hmac-drbg/lib/hmac-drbg.js"); var elliptic = __webpack_require__(/*! ../../elliptic */ "./node_modules/elliptic/lib/elliptic.js"); var utils = elliptic.utils; var assert = utils.assert; var KeyPair = __webpack_require__(/*! ./key */ "./node_modules/elliptic/lib/elliptic/ec/key.js"); var Signature = __webpack_require__(/*! ./signature */ "./node_modules/elliptic/lib/elliptic/ec/signature.js"); function EC(options) { if (!(this instanceof EC)) return new EC(options); // Shortcut `elliptic.ec(curve-name)` if (typeof options === 'string') { assert(elliptic.curves.hasOwnProperty(options), 'Unknown curve ' + options); options = elliptic.curves[options]; } // Shortcut for `elliptic.ec(elliptic.curves.curveName)` if (options instanceof elliptic.curves.PresetCurve) options = { curve: options }; this.curve = options.curve.curve; this.n = this.curve.n; this.nh = this.n.ushrn(1); this.g = this.curve.g; // Point on curve this.g = options.curve.g; this.g.precompute(options.curve.n.bitLength() + 1); // Hash for function for DRBG this.hash = options.hash || options.curve.hash; } module.exports = EC; EC.prototype.keyPair = function keyPair(options) { return new KeyPair(this, options); }; EC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) { return KeyPair.fromPrivate(this, priv, enc); }; EC.prototype.keyFromPublic = function keyFromPublic(pub, enc) { return KeyPair.fromPublic(this, pub, enc); }; EC.prototype.genKeyPair = function genKeyPair(options) { if (!options) options = {}; // Instantiate Hmac_DRBG var drbg = new HmacDRBG({ hash: this.hash, pers: options.pers, persEnc: options.persEnc || 'utf8', entropy: options.entropy || elliptic.rand(this.hash.hmacStrength), entropyEnc: options.entropy && options.entropyEnc || 'utf8', nonce: this.n.toArray() }); var bytes = this.n.byteLength(); var ns2 = this.n.sub(new BN(2)); do { var priv = new BN(drbg.generate(bytes)); if (priv.cmp(ns2) > 0) continue; priv.iaddn(1); return this.keyFromPrivate(priv); } while (true); }; EC.prototype._truncateToN = function truncateToN(msg, truncOnly) { var delta = msg.byteLength() * 8 - this.n.bitLength(); if (delta > 0) msg = msg.ushrn(delta); if (!truncOnly && msg.cmp(this.n) >= 0) return msg.sub(this.n); else return msg; }; EC.prototype.sign = function sign(msg, key, enc, options) { if (typeof enc === 'object') { options = enc; enc = null; } if (!options) options = {}; key = this.keyFromPrivate(key, enc); msg = this._truncateToN(new BN(msg, 16)); // Zero-extend key to provide enough entropy var bytes = this.n.byteLength(); var bkey = key.getPrivate().toArray('be', bytes); // Zero-extend nonce to have the same byte size as N var nonce = msg.toArray('be', bytes); // Instantiate Hmac_DRBG var drbg = new HmacDRBG({ hash: this.hash, entropy: bkey, nonce: nonce, pers: options.pers, persEnc: options.persEnc || 'utf8' }); // Number of bytes to generate var ns1 = this.n.sub(new BN(1)); for (var iter = 0; true; iter++) { var k = options.k ? options.k(iter) : new BN(drbg.generate(this.n.byteLength())); k = this._truncateToN(k, true); if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0) continue; var kp = this.g.mul(k); if (kp.isInfinity()) continue; var kpX = kp.getX(); var r = kpX.umod(this.n); if (r.cmpn(0) === 0) continue; var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg)); s = s.umod(this.n); if (s.cmpn(0) === 0) continue; var recoveryParam = (kp.getY().isOdd() ? 1 : 0) | (kpX.cmp(r) !== 0 ? 2 : 0); // Use complement of `s`, if it is > `n / 2` if (options.canonical && s.cmp(this.nh) > 0) { s = this.n.sub(s); recoveryParam ^= 1; } return new Signature({ r: r, s: s, recoveryParam: recoveryParam }); } }; EC.prototype.verify = function verify(msg, signature, key, enc) { msg = this._truncateToN(new BN(msg, 16)); key = this.keyFromPublic(key, enc); signature = new Signature(signature, 'hex'); // Perform primitive values validation var r = signature.r; var s = signature.s; if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0) return false; if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0) return false; // Validate signature var sinv = s.invm(this.n); var u1 = sinv.mul(msg).umod(this.n); var u2 = sinv.mul(r).umod(this.n); if (!this.curve._maxwellTrick) { var p = this.g.mulAdd(u1, key.getPublic(), u2); if (p.isInfinity()) return false; return p.getX().umod(this.n).cmp(r) === 0; } // NOTE: Greg Maxwell's trick, inspired by: // https://git.io/vad3K var p = this.g.jmulAdd(u1, key.getPublic(), u2); if (p.isInfinity()) return false; // Compare `p.x` of Jacobian point with `r`, // this will do `p.x == r * p.z^2` instead of multiplying `p.x` by the // inverse of `p.z^2` return p.eqXToP(r); }; EC.prototype.recoverPubKey = function(msg, signature, j, enc) { assert((3 & j) === j, 'The recovery param is more than two bits'); signature = new Signature(signature, enc); var n = this.n; var e = new BN(msg); var r = signature.r; var s = signature.s; // A set LSB signifies that the y-coordinate is odd var isYOdd = j & 1; var isSecondKey = j >> 1; if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey) throw new Error('Unable to find sencond key candinate'); // 1.1. Let x = r + jn. if (isSecondKey) r = this.curve.pointFromX(r.add(this.curve.n), isYOdd); else r = this.curve.pointFromX(r, isYOdd); var rInv = signature.r.invm(n); var s1 = n.sub(e).mul(rInv).umod(n); var s2 = s.mul(rInv).umod(n); // 1.6.1 Compute Q = r^-1 (sR - eG) // Q = r^-1 (sR + -eG) return this.g.mulAdd(s1, r, s2); }; EC.prototype.getKeyRecoveryParam = function(e, signature, Q, enc) { signature = new Signature(signature, enc); if (signature.recoveryParam !== null) return signature.recoveryParam; for (var i = 0; i < 4; i++) { var Qprime; try { Qprime = this.recoverPubKey(e, signature, i); } catch (e) { continue; } if (Qprime.eq(Q)) return i; } throw new Error('Unable to find valid recovery factor'); }; /***/ }), /***/ "./node_modules/elliptic/lib/elliptic/ec/key.js": /*!******************************************************!*\ !*** ./node_modules/elliptic/lib/elliptic/ec/key.js ***! \******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var BN = __webpack_require__(/*! bn.js */ "./node_modules/bn.js/lib/bn.js"); var elliptic = __webpack_require__(/*! ../../elliptic */ "./node_modules/elliptic/lib/elliptic.js"); var utils = elliptic.utils; var assert = utils.assert; function KeyPair(ec, options) { this.ec = ec; this.priv = null; this.pub = null; // KeyPair(ec, { priv: ..., pub: ... }) if (options.priv) this._importPrivate(options.priv, options.privEnc); if (options.pub) this._importPublic(options.pub, options.pubEnc); } module.exports = KeyPair; KeyPair.fromPublic = function fromPublic(ec, pub, enc) { if (pub instanceof KeyPair) return pub; return new KeyPair(ec, { pub: pub, pubEnc: enc }); }; KeyPair.fromPrivate = function fromPrivate(ec, priv, enc) { if (priv instanceof KeyPair) return priv; return new KeyPair(ec, { priv: priv, privEnc: enc }); }; KeyPair.prototype.validate = function validate() { var pub = this.getPublic(); if (pub.isInfinity()) return { result: false, reason: 'Invalid public key' }; if (!pub.validate()) return { result: false, reason: 'Public key is not a point' }; if (!pub.mul(this.ec.curve.n).isInfinity()) return { result: false, reason: 'Public key * N != O' }; return { result: true, reason: null }; }; KeyPair.prototype.getPublic = function getPublic(compact, enc) { // compact is optional argument if (typeof compact === 'string') { enc = compact; compact = null; } if (!this.pub) this.pub = this.ec.g.mul(this.priv); if (!enc) return this.pub; return this.pub.encode(enc, compact); }; KeyPair.prototype.getPrivate = function getPrivate(enc) { if (enc === 'hex') return this.priv.toString(16, 2); else return this.priv; }; KeyPair.prototype._importPrivate = function _importPrivate(key, enc) { this.priv = new BN(key, enc || 16); // Ensure that the priv won't be bigger than n, otherwise we may fail // in fixed multiplication method this.priv = this.priv.umod(this.ec.curve.n); }; KeyPair.prototype._importPublic = function _importPublic(key, enc) { if (key.x || key.y) { // Montgomery points only have an `x` coordinate. // Weierstrass/Edwards points on the other hand have both `x` and // `y` coordinates. if (this.ec.curve.type === 'mont') { assert(key.x, 'Need x coordinate'); } else if (this.ec.curve.type === 'short' || this.ec.curve.type === 'edwards') { assert(key.x && key.y, 'Need both x and y coordinate'); } this.pub = this.ec.curve.point(key.x, key.y); return; } this.pub = this.ec.curve.decodePoint(key, enc); }; // ECDH KeyPair.prototype.derive = function derive(pub) { return pub.mul(this.priv).getX(); }; // ECDSA KeyPair.prototype.sign = function sign(msg, enc, options) { return this.ec.sign(msg, this, enc, options); }; KeyPair.prototype.verify = function verify(msg, signature) { return this.ec.verify(msg, signature, this); }; KeyPair.prototype.inspect = function inspect() { return ''; }; /***/ }), /***/ "./node_modules/elliptic/lib/elliptic/ec/signature.js": /*!************************************************************!*\ !*** ./node_modules/elliptic/lib/elliptic/ec/signature.js ***! \************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var BN = __webpack_require__(/*! bn.js */ "./node_modules/bn.js/lib/bn.js"); var elliptic = __webpack_require__(/*! ../../elliptic */ "./node_modules/elliptic/lib/elliptic.js"); var utils = elliptic.utils; var assert = utils.assert; function Signature(options, enc) { if (options instanceof Signature) return options; if (this._importDER(options, enc)) return; assert(options.r && options.s, 'Signature without r or s'); this.r = new BN(options.r, 16); this.s = new BN(options.s, 16); if (options.recoveryParam === undefined) this.recoveryParam = null; else this.recoveryParam = options.recoveryParam; } module.exports = Signature; function Position() { this.place = 0; } function getLength(buf, p) { var initial = buf[p.place++]; if (!(initial & 0x80)) { return initial; } var octetLen = initial & 0xf; var val = 0; for (var i = 0, off = p.place; i < octetLen; i++, off++) { val <<= 8; val |= buf[off]; } p.place = off; return val; } function rmPadding(buf) { var i = 0; var len = buf.length - 1; while (!buf[i] && !(buf[i + 1] & 0x80) && i < len) { i++; } if (i === 0) { return buf; } return buf.slice(i); } Signature.prototype._importDER = function _importDER(data, enc) { data = utils.toArray(data, enc); var p = new Position(); if (data[p.place++] !== 0x30) { return false; } var len = getLength(data, p); if ((len + p.place) !== data.length) { return false; } if (data[p.place++] !== 0x02) { return false; } var rlen = getLength(data, p); var r = data.slice(p.place, rlen + p.place); p.place += rlen; if (data[p.place++] !== 0x02) { return false; } var slen = getLength(data, p); if (data.length !== slen + p.place) { return false; } var s = data.slice(p.place, slen + p.place); if (r[0] === 0 && (r[1] & 0x80)) { r = r.slice(1); } if (s[0] === 0 && (s[1] & 0x80)) { s = s.slice(1); } this.r = new BN(r); this.s = new BN(s); this.recoveryParam = null; return true; }; function constructLength(arr, len) { if (len < 0x80) { arr.push(len); return; } var octets = 1 + (Math.log(len) / Math.LN2 >>> 3); arr.push(octets | 0x80); while (--octets) { arr.push((len >>> (octets << 3)) & 0xff); } arr.push(len); } Signature.prototype.toDER = function toDER(enc) { var r = this.r.toArray(); var s = this.s.toArray(); // Pad values if (r[0] & 0x80) r = [ 0 ].concat(r); // Pad values if (s[0] & 0x80) s = [ 0 ].concat(s); r = rmPadding(r); s = rmPadding(s); while (!s[0] && !(s[1] & 0x80)) { s = s.slice(1); } var arr = [ 0x02 ]; constructLength(arr, r.length); arr = arr.concat(r); arr.push(0x02); constructLength(arr, s.length); var backHalf = arr.concat(s); var res = [ 0x30 ]; constructLength(res, backHalf.length); res = res.concat(backHalf); return utils.encode(res, enc); }; /***/ }), /***/ "./node_modules/elliptic/lib/elliptic/eddsa/index.js": /*!***********************************************************!*\ !*** ./node_modules/elliptic/lib/elliptic/eddsa/index.js ***! \***********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var hash = __webpack_require__(/*! hash.js */ "./node_modules/hash.js/lib/hash.js"); var elliptic = __webpack_require__(/*! ../../elliptic */ "./node_modules/elliptic/lib/elliptic.js"); var utils = elliptic.utils; var assert = utils.assert; var parseBytes = utils.parseBytes; var KeyPair = __webpack_require__(/*! ./key */ "./node_modules/elliptic/lib/elliptic/eddsa/key.js"); var Signature = __webpack_require__(/*! ./signature */ "./node_modules/elliptic/lib/elliptic/eddsa/signature.js"); function EDDSA(curve) { assert(curve === 'ed25519', 'only tested with ed25519 so far'); if (!(this instanceof EDDSA)) return new EDDSA(curve); var curve = elliptic.curves[curve].curve; this.curve = curve; this.g = curve.g; this.g.precompute(curve.n.bitLength() + 1); this.pointClass = curve.point().constructor; this.encodingLength = Math.ceil(curve.n.bitLength() / 8); this.hash = hash.sha512; } module.exports = EDDSA; /** * @param {Array|String} message - message bytes * @param {Array|String|KeyPair} secret - secret bytes or a keypair * @returns {Signature} - signature */ EDDSA.prototype.sign = function sign(message, secret) { message = parseBytes(message); var key = this.keyFromSecret(secret); var r = this.hashInt(key.messagePrefix(), message); var R = this.g.mul(r); var Rencoded = this.encodePoint(R); var s_ = this.hashInt(Rencoded, key.pubBytes(), message) .mul(key.priv()); var S = r.add(s_).umod(this.curve.n); return this.makeSignature({ R: R, S: S, Rencoded: Rencoded }); }; /** * @param {Array} message - message bytes * @param {Array|String|Signature} sig - sig bytes * @param {Array|String|Point|KeyPair} pub - public key * @returns {Boolean} - true if public key matches sig of message */ EDDSA.prototype.verify = function verify(message, sig, pub) { message = parseBytes(message); sig = this.makeSignature(sig); var key = this.keyFromPublic(pub); var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message); var SG = this.g.mul(sig.S()); var RplusAh = sig.R().add(key.pub().mul(h)); return RplusAh.eq(SG); }; EDDSA.prototype.hashInt = function hashInt() { var hash = this.hash(); for (var i = 0; i < arguments.length; i++) hash.update(arguments[i]); return utils.intFromLE(hash.digest()).umod(this.curve.n); }; EDDSA.prototype.keyFromPublic = function keyFromPublic(pub) { return KeyPair.fromPublic(this, pub); }; EDDSA.prototype.keyFromSecret = function keyFromSecret(secret) { return KeyPair.fromSecret(this, secret); }; EDDSA.prototype.makeSignature = function makeSignature(sig) { if (sig instanceof Signature) return sig; return new Signature(this, sig); }; /** * * https://tools.ietf.org/html/draft-josefsson-eddsa-ed25519-03#section-5.2 * * EDDSA defines methods for encoding and decoding points and integers. These are * helper convenience methods, that pass along to utility functions implied * parameters. * */ EDDSA.prototype.encodePoint = function encodePoint(point) { var enc = point.getY().toArray('le', this.encodingLength); enc[this.encodingLength - 1] |= point.getX().isOdd() ? 0x80 : 0; return enc; }; EDDSA.prototype.decodePoint = function decodePoint(bytes) { bytes = utils.parseBytes(bytes); var lastIx = bytes.length - 1; var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~0x80); var xIsOdd = (bytes[lastIx] & 0x80) !== 0; var y = utils.intFromLE(normed); return this.curve.pointFromY(y, xIsOdd); }; EDDSA.prototype.encodeInt = function encodeInt(num) { return num.toArray('le', this.encodingLength); }; EDDSA.prototype.decodeInt = function decodeInt(bytes) { return utils.intFromLE(bytes); }; EDDSA.prototype.isPoint = function isPoint(val) { return val instanceof this.pointClass; }; /***/ }), /***/ "./node_modules/elliptic/lib/elliptic/eddsa/key.js": /*!*********************************************************!*\ !*** ./node_modules/elliptic/lib/elliptic/eddsa/key.js ***! \*********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var elliptic = __webpack_require__(/*! ../../elliptic */ "./node_modules/elliptic/lib/elliptic.js"); var utils = elliptic.utils; var assert = utils.assert; var parseBytes = utils.parseBytes; var cachedProperty = utils.cachedProperty; /** * @param {EDDSA} eddsa - instance * @param {Object} params - public/private key parameters * * @param {Array} [params.secret] - secret seed bytes * @param {Point} [params.pub] - public key point (aka `A` in eddsa terms) * @param {Array} [params.pub] - public key point encoded as bytes * */ function KeyPair(eddsa, params) { this.eddsa = eddsa; this._secret = parseBytes(params.secret); if (eddsa.isPoint(params.pub)) this._pub = params.pub; else this._pubBytes = parseBytes(params.pub); } KeyPair.fromPublic = function fromPublic(eddsa, pub) { if (pub instanceof KeyPair) return pub; return new KeyPair(eddsa, { pub: pub }); }; KeyPair.fromSecret = function fromSecret(eddsa, secret) { if (secret instanceof KeyPair) return secret; return new KeyPair(eddsa, { secret: secret }); }; KeyPair.prototype.secret = function secret() { return this._secret; }; cachedProperty(KeyPair, 'pubBytes', function pubBytes() { return this.eddsa.encodePoint(this.pub()); }); cachedProperty(KeyPair, 'pub', function pub() { if (this._pubBytes) return this.eddsa.decodePoint(this._pubBytes); return this.eddsa.g.mul(this.priv()); }); cachedProperty(KeyPair, 'privBytes', function privBytes() { var eddsa = this.eddsa; var hash = this.hash(); var lastIx = eddsa.encodingLength - 1; var a = hash.slice(0, eddsa.encodingLength); a[0] &= 248; a[lastIx] &= 127; a[lastIx] |= 64; return a; }); cachedProperty(KeyPair, 'priv', function priv() { return this.eddsa.decodeInt(this.privBytes()); }); cachedProperty(KeyPair, 'hash', function hash() { return this.eddsa.hash().update(this.secret()).digest(); }); cachedProperty(KeyPair, 'messagePrefix', function messagePrefix() { return this.hash().slice(this.eddsa.encodingLength); }); KeyPair.prototype.sign = function sign(message) { assert(this._secret, 'KeyPair can only verify'); return this.eddsa.sign(message, this); }; KeyPair.prototype.verify = function verify(message, sig) { return this.eddsa.verify(message, sig, this); }; KeyPair.prototype.getSecret = function getSecret(enc) { assert(this._secret, 'KeyPair is public only'); return utils.encode(this.secret(), enc); }; KeyPair.prototype.getPublic = function getPublic(enc) { return utils.encode(this.pubBytes(), enc); }; module.exports = KeyPair; /***/ }), /***/ "./node_modules/elliptic/lib/elliptic/eddsa/signature.js": /*!***************************************************************!*\ !*** ./node_modules/elliptic/lib/elliptic/eddsa/signature.js ***! \***************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var BN = __webpack_require__(/*! bn.js */ "./node_modules/bn.js/lib/bn.js"); var elliptic = __webpack_require__(/*! ../../elliptic */ "./node_modules/elliptic/lib/elliptic.js"); var utils = elliptic.utils; var assert = utils.assert; var cachedProperty = utils.cachedProperty; var parseBytes = utils.parseBytes; /** * @param {EDDSA} eddsa - eddsa instance * @param {Array|Object} sig - * @param {Array|Point} [sig.R] - R point as Point or bytes * @param {Array|bn} [sig.S] - S scalar as bn or bytes * @param {Array} [sig.Rencoded] - R point encoded * @param {Array} [sig.Sencoded] - S scalar encoded */ function Signature(eddsa, sig) { this.eddsa = eddsa; if (typeof sig !== 'object') sig = parseBytes(sig); if (Array.isArray(sig)) { sig = { R: sig.slice(0, eddsa.encodingLength), S: sig.slice(eddsa.encodingLength) }; } assert(sig.R && sig.S, 'Signature without R or S'); if (eddsa.isPoint(sig.R)) this._R = sig.R; if (sig.S instanceof BN) this._S = sig.S; this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded; this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded; } cachedProperty(Signature, 'S', function S() { return this.eddsa.decodeInt(this.Sencoded()); }); cachedProperty(Signature, 'R', function R() { return this.eddsa.decodePoint(this.Rencoded()); }); cachedProperty(Signature, 'Rencoded', function Rencoded() { return this.eddsa.encodePoint(this.R()); }); cachedProperty(Signature, 'Sencoded', function Sencoded() { return this.eddsa.encodeInt(this.S()); }); Signature.prototype.toBytes = function toBytes() { return this.Rencoded().concat(this.Sencoded()); }; Signature.prototype.toHex = function toHex() { return utils.encode(this.toBytes(), 'hex').toUpperCase(); }; module.exports = Signature; /***/ }), /***/ "./node_modules/elliptic/lib/elliptic/precomputed/secp256k1.js": /*!*********************************************************************!*\ !*** ./node_modules/elliptic/lib/elliptic/precomputed/secp256k1.js ***! \*********************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = { doubles: { step: 4, points: [ [ 'e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a', 'f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821' ], [ '8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508', '11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf' ], [ '175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739', 'd3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695' ], [ '363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640', '4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9' ], [ '8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c', '4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36' ], [ '723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda', '96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f' ], [ 'eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa', '5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999' ], [ '100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0', 'cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09' ], [ 'e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d', '9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d' ], [ 'feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d', 'e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088' ], [ 'da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1', '9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d' ], [ '53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0', '5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8' ], [ '8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047', '10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a' ], [ '385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862', '283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453' ], [ '6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7', '7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160' ], [ '3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd', '56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0' ], [ '85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83', '7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6' ], [ '948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a', '53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589' ], [ '6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8', 'bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17' ], [ 'e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d', '4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda' ], [ 'e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725', '7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd' ], [ '213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754', '4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2' ], [ '4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c', '17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6' ], [ 'fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6', '6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f' ], [ '76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39', 'c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01' ], [ 'c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891', '893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3' ], [ 'd895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b', 'febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f' ], [ 'b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03', '2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7' ], [ 'e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d', 'eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78' ], [ 'a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070', '7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1' ], [ '90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4', 'e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150' ], [ '8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da', '662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82' ], [ 'e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11', '1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc' ], [ '8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e', 'efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b' ], [ 'e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41', '2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51' ], [ 'b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef', '67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45' ], [ 'd68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8', 'db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120' ], [ '324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d', '648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84' ], [ '4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96', '35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d' ], [ '9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd', 'ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d' ], [ '6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5', '9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8' ], [ 'a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266', '40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8' ], [ '7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71', '34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac' ], [ '928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac', 'c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f' ], [ '85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751', '1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962' ], [ 'ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e', '493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907' ], [ '827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241', 'c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec' ], [ 'eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3', 'be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d' ], [ 'e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f', '4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414' ], [ '1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19', 'aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd' ], [ '146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be', 'b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0' ], [ 'fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9', '6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811' ], [ 'da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2', '8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1' ], [ 'a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13', '7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c' ], [ '174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c', 'ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73' ], [ '959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba', '2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd' ], [ 'd2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151', 'e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405' ], [ '64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073', 'd99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589' ], [ '8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458', '38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e' ], [ '13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b', '69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27' ], [ 'bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366', 'd3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1' ], [ '8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa', '40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482' ], [ '8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0', '620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945' ], [ 'dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787', '7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573' ], [ 'f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e', 'ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82' ] ] }, naf: { wnd: 7, points: [ [ 'f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9', '388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672' ], [ '2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4', 'd8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6' ], [ '5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc', '6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da' ], [ 'acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe', 'cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37' ], [ '774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb', 'd984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b' ], [ 'f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8', 'ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81' ], [ 'd7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e', '581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58' ], [ 'defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34', '4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77' ], [ '2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c', '85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a' ], [ '352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5', '321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c' ], [ '2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f', '2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67' ], [ '9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714', '73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402' ], [ 'daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729', 'a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55' ], [ 'c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db', '2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482' ], [ '6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4', 'e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82' ], [ '1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5', 'b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396' ], [ '605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479', '2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49' ], [ '62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d', '80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf' ], [ '80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f', '1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a' ], [ '7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb', 'd0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7' ], [ 'd528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9', 'eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933' ], [ '49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963', '758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a' ], [ '77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74', '958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6' ], [ 'f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530', 'e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37' ], [ '463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b', '5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e' ], [ 'f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247', 'cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6' ], [ 'caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1', 'cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476' ], [ '2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120', '4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40' ], [ '7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435', '91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61' ], [ '754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18', '673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683' ], [ 'e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8', '59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5' ], [ '186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb', '3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b' ], [ 'df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f', '55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417' ], [ '5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143', 'efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868' ], [ '290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba', 'e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a' ], [ 'af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45', 'f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6' ], [ '766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a', '744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996' ], [ '59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e', 'c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e' ], [ 'f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8', 'e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d' ], [ '7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c', '30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2' ], [ '948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519', 'e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e' ], [ '7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab', '100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437' ], [ '3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca', 'ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311' ], [ 'd3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf', '8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4' ], [ '1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610', '68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575' ], [ '733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4', 'f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d' ], [ '15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c', 'd56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d' ], [ 'a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940', 'edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629' ], [ 'e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980', 'a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06' ], [ '311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3', '66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374' ], [ '34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf', '9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee' ], [ 'f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63', '4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1' ], [ 'd7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448', 'fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b' ], [ '32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf', '5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661' ], [ '7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5', '8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6' ], [ 'ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6', '8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e' ], [ '16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5', '5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d' ], [ 'eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99', 'f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc' ], [ '78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51', 'f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4' ], [ '494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5', '42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c' ], [ 'a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5', '204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b' ], [ 'c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997', '4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913' ], [ '841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881', '73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154' ], [ '5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5', '39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865' ], [ '36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66', 'd2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc' ], [ '336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726', 'ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224' ], [ '8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede', '6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e' ], [ '1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94', '60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6' ], [ '85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31', '3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511' ], [ '29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51', 'b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b' ], [ 'a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252', 'ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2' ], [ '4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5', 'cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c' ], [ 'd24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b', '6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3' ], [ 'ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4', '322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d' ], [ 'af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f', '6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700' ], [ 'e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889', '2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4' ], [ '591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246', 'b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196' ], [ '11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984', '998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4' ], [ '3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a', 'b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257' ], [ 'cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030', 'bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13' ], [ 'c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197', '6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096' ], [ 'c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593', 'c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38' ], [ 'a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef', '21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f' ], [ '347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38', '60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448' ], [ 'da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a', '49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a' ], [ 'c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111', '5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4' ], [ '4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502', '7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437' ], [ '3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea', 'be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7' ], [ 'cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26', '8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d' ], [ 'b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986', '39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a' ], [ 'd4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e', '62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54' ], [ '48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4', '25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77' ], [ 'dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda', 'ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517' ], [ '6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859', 'cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10' ], [ 'e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f', 'f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125' ], [ 'eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c', '6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e' ], [ '13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942', 'fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1' ], [ 'ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a', '1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2' ], [ 'b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80', '5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423' ], [ 'ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d', '438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8' ], [ '8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1', 'cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758' ], [ '52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63', 'c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375' ], [ 'e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352', '6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d' ], [ '7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193', 'ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec' ], [ '5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00', '9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0' ], [ '32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58', 'ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c' ], [ 'e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7', 'd3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4' ], [ '8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8', 'c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f' ], [ '4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e', '67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649' ], [ '3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d', 'cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826' ], [ '674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b', '299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5' ], [ 'd32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f', 'f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87' ], [ '30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6', '462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b' ], [ 'be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297', '62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc' ], [ '93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a', '7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c' ], [ 'b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c', 'ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f' ], [ 'd5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52', '4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a' ], [ 'd3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb', 'bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46' ], [ '463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065', 'bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f' ], [ '7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917', '603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03' ], [ '74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9', 'cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08' ], [ '30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3', '553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8' ], [ '9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57', '712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373' ], [ '176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66', 'ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3' ], [ '75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8', '9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8' ], [ '809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721', '9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1' ], [ '1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180', '4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9' ] ] } }; /***/ }), /***/ "./node_modules/elliptic/lib/elliptic/utils.js": /*!*****************************************************!*\ !*** ./node_modules/elliptic/lib/elliptic/utils.js ***! \*****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var utils = exports; var BN = __webpack_require__(/*! bn.js */ "./node_modules/bn.js/lib/bn.js"); var minAssert = __webpack_require__(/*! minimalistic-assert */ "./node_modules/minimalistic-assert/index.js"); var minUtils = __webpack_require__(/*! minimalistic-crypto-utils */ "./node_modules/minimalistic-crypto-utils/lib/utils.js"); utils.assert = minAssert; utils.toArray = minUtils.toArray; utils.zero2 = minUtils.zero2; utils.toHex = minUtils.toHex; utils.encode = minUtils.encode; // Represent num in a w-NAF form function getNAF(num, w) { var naf = []; var ws = 1 << (w + 1); var k = num.clone(); while (k.cmpn(1) >= 0) { var z; if (k.isOdd()) { var mod = k.andln(ws - 1); if (mod > (ws >> 1) - 1) z = (ws >> 1) - mod; else z = mod; k.isubn(z); } else { z = 0; } naf.push(z); // Optimization, shift by word if possible var shift = (k.cmpn(0) !== 0 && k.andln(ws - 1) === 0) ? (w + 1) : 1; for (var i = 1; i < shift; i++) naf.push(0); k.iushrn(shift); } return naf; } utils.getNAF = getNAF; // Represent k1, k2 in a Joint Sparse Form function getJSF(k1, k2) { var jsf = [ [], [] ]; k1 = k1.clone(); k2 = k2.clone(); var d1 = 0; var d2 = 0; while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) { // First phase var m14 = (k1.andln(3) + d1) & 3; var m24 = (k2.andln(3) + d2) & 3; if (m14 === 3) m14 = -1; if (m24 === 3) m24 = -1; var u1; if ((m14 & 1) === 0) { u1 = 0; } else { var m8 = (k1.andln(7) + d1) & 7; if ((m8 === 3 || m8 === 5) && m24 === 2) u1 = -m14; else u1 = m14; } jsf[0].push(u1); var u2; if ((m24 & 1) === 0) { u2 = 0; } else { var m8 = (k2.andln(7) + d2) & 7; if ((m8 === 3 || m8 === 5) && m14 === 2) u2 = -m24; else u2 = m24; } jsf[1].push(u2); // Second phase if (2 * d1 === u1 + 1) d1 = 1 - d1; if (2 * d2 === u2 + 1) d2 = 1 - d2; k1.iushrn(1); k2.iushrn(1); } return jsf; } utils.getJSF = getJSF; function cachedProperty(obj, name, computer) { var key = '_' + name; obj.prototype[name] = function cachedProperty() { return this[key] !== undefined ? this[key] : this[key] = computer.call(this); }; } utils.cachedProperty = cachedProperty; function parseBytes(bytes) { return typeof bytes === 'string' ? utils.toArray(bytes, 'hex') : bytes; } utils.parseBytes = parseBytes; function intFromLE(bytes) { return new BN(bytes, 'hex', 'le'); } utils.intFromLE = intFromLE; /***/ }), /***/ "./node_modules/elliptic/package.json": /*!********************************************!*\ !*** ./node_modules/elliptic/package.json ***! \********************************************/ /*! exports provided: name, version, description, main, files, scripts, repository, keywords, author, license, bugs, homepage, devDependencies, dependencies, default */ /***/ (function(module) { module.exports = {"name":"elliptic","version":"6.4.1","description":"EC cryptography","main":"lib/elliptic.js","files":["lib"],"scripts":{"jscs":"jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js","jshint":"jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js","lint":"npm run jscs && npm run jshint","unit":"istanbul test _mocha --reporter=spec test/index.js","test":"npm run lint && npm run unit","version":"grunt dist && git add dist/"},"repository":{"type":"git","url":"git@github.com:indutny/elliptic"},"keywords":["EC","Elliptic","curve","Cryptography"],"author":"Fedor Indutny ","license":"MIT","bugs":{"url":"https://github.com/indutny/elliptic/issues"},"homepage":"https://github.com/indutny/elliptic","devDependencies":{"brfs":"^1.4.3","coveralls":"^2.11.3","grunt":"^0.4.5","grunt-browserify":"^5.0.0","grunt-cli":"^1.2.0","grunt-contrib-connect":"^1.0.0","grunt-contrib-copy":"^1.0.0","grunt-contrib-uglify":"^1.0.1","grunt-mocha-istanbul":"^3.0.1","grunt-saucelabs":"^8.6.2","istanbul":"^0.4.2","jscs":"^2.9.0","jshint":"^2.6.0","mocha":"^2.1.0"},"dependencies":{"bn.js":"^4.4.0","brorand":"^1.0.1","hash.js":"^1.0.0","hmac-drbg":"^1.0.0","inherits":"^2.0.1","minimalistic-assert":"^1.0.0","minimalistic-crypto-utils":"^1.0.0"}}; /***/ }), /***/ "./node_modules/events/events.js": /*!***************************************!*\ !*** ./node_modules/events/events.js ***! \***************************************/ /*! no static exports found */ /***/ (function(module, exports) { // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. function EventEmitter() { this._events = this._events || {}; this._maxListeners = this._maxListeners || undefined; } module.exports = EventEmitter; // Backwards-compat with node 0.10.x EventEmitter.EventEmitter = EventEmitter; EventEmitter.prototype._events = undefined; EventEmitter.prototype._maxListeners = undefined; // By default EventEmitters will print a warning if more than 10 listeners are // added to it. This is a useful default which helps finding memory leaks. EventEmitter.defaultMaxListeners = 10; // Obviously not all Emitters should be limited to 10. This function allows // that to be increased. Set to zero for unlimited. EventEmitter.prototype.setMaxListeners = function(n) { if (!isNumber(n) || n < 0 || isNaN(n)) throw TypeError('n must be a positive number'); this._maxListeners = n; return this; }; EventEmitter.prototype.emit = function(type) { var er, handler, len, args, i, listeners; if (!this._events) this._events = {}; // If there is no 'error' event listener then throw. if (type === 'error') { if (!this._events.error || (isObject(this._events.error) && !this._events.error.length)) { er = arguments[1]; if (er instanceof Error) { throw er; // Unhandled 'error' event } else { // At least give some kind of context to the user var err = new Error('Uncaught, unspecified "error" event. (' + er + ')'); err.context = er; throw err; } } } handler = this._events[type]; if (isUndefined(handler)) return false; if (isFunction(handler)) { switch (arguments.length) { // fast cases case 1: handler.call(this); break; case 2: handler.call(this, arguments[1]); break; case 3: handler.call(this, arguments[1], arguments[2]); break; // slower default: args = Array.prototype.slice.call(arguments, 1); handler.apply(this, args); } } else if (isObject(handler)) { args = Array.prototype.slice.call(arguments, 1); listeners = handler.slice(); len = listeners.length; for (i = 0; i < len; i++) listeners[i].apply(this, args); } return true; }; EventEmitter.prototype.addListener = function(type, listener) { var m; if (!isFunction(listener)) throw TypeError('listener must be a function'); if (!this._events) this._events = {}; // To avoid recursion in the case that type === "newListener"! Before // adding it to the listeners, first emit "newListener". if (this._events.newListener) this.emit('newListener', type, isFunction(listener.listener) ? listener.listener : listener); if (!this._events[type]) // Optimize the case of one listener. Don't need the extra array object. this._events[type] = listener; else if (isObject(this._events[type])) // If we've already got an array, just append. this._events[type].push(listener); else // Adding the second element, need to change to array. this._events[type] = [this._events[type], listener]; // Check for listener leak if (isObject(this._events[type]) && !this._events[type].warned) { if (!isUndefined(this._maxListeners)) { m = this._maxListeners; } else { m = EventEmitter.defaultMaxListeners; } if (m && m > 0 && this._events[type].length > m) { this._events[type].warned = true; console.error('(node) warning: possible EventEmitter memory ' + 'leak detected. %d listeners added. ' + 'Use emitter.setMaxListeners() to increase limit.', this._events[type].length); if (typeof console.trace === 'function') { // not supported in IE 10 console.trace(); } } } return this; }; EventEmitter.prototype.on = EventEmitter.prototype.addListener; EventEmitter.prototype.once = function(type, listener) { if (!isFunction(listener)) throw TypeError('listener must be a function'); var fired = false; function g() { this.removeListener(type, g); if (!fired) { fired = true; listener.apply(this, arguments); } } g.listener = listener; this.on(type, g); return this; }; // emits a 'removeListener' event iff the listener was removed EventEmitter.prototype.removeListener = function(type, listener) { var list, position, length, i; if (!isFunction(listener)) throw TypeError('listener must be a function'); if (!this._events || !this._events[type]) return this; list = this._events[type]; length = list.length; position = -1; if (list === listener || (isFunction(list.listener) && list.listener === listener)) { delete this._events[type]; if (this._events.removeListener) this.emit('removeListener', type, listener); } else if (isObject(list)) { for (i = length; i-- > 0;) { if (list[i] === listener || (list[i].listener && list[i].listener === listener)) { position = i; break; } } if (position < 0) return this; if (list.length === 1) { list.length = 0; delete this._events[type]; } else { list.splice(position, 1); } if (this._events.removeListener) this.emit('removeListener', type, listener); } return this; }; EventEmitter.prototype.removeAllListeners = function(type) { var key, listeners; if (!this._events) return this; // not listening for removeListener, no need to emit if (!this._events.removeListener) { if (arguments.length === 0) this._events = {}; else if (this._events[type]) delete this._events[type]; return this; } // emit removeListener for all listeners on all events if (arguments.length === 0) { for (key in this._events) { if (key === 'removeListener') continue; this.removeAllListeners(key); } this.removeAllListeners('removeListener'); this._events = {}; return this; } listeners = this._events[type]; if (isFunction(listeners)) { this.removeListener(type, listeners); } else if (listeners) { // LIFO order while (listeners.length) this.removeListener(type, listeners[listeners.length - 1]); } delete this._events[type]; return this; }; EventEmitter.prototype.listeners = function(type) { var ret; if (!this._events || !this._events[type]) ret = []; else if (isFunction(this._events[type])) ret = [this._events[type]]; else ret = this._events[type].slice(); return ret; }; EventEmitter.prototype.listenerCount = function(type) { if (this._events) { var evlistener = this._events[type]; if (isFunction(evlistener)) return 1; else if (evlistener) return evlistener.length; } return 0; }; EventEmitter.listenerCount = function(emitter, type) { return emitter.listenerCount(type); }; function isFunction(arg) { return typeof arg === 'function'; } function isNumber(arg) { return typeof arg === 'number'; } function isObject(arg) { return typeof arg === 'object' && arg !== null; } function isUndefined(arg) { return arg === void 0; } /***/ }), /***/ "./node_modules/evp_bytestokey/index.js": /*!**********************************************!*\ !*** ./node_modules/evp_bytestokey/index.js ***! \**********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer var MD5 = __webpack_require__(/*! md5.js */ "./node_modules/md5.js/index.js") /* eslint-disable camelcase */ function EVP_BytesToKey (password, salt, keyBits, ivLen) { if (!Buffer.isBuffer(password)) password = Buffer.from(password, 'binary') if (salt) { if (!Buffer.isBuffer(salt)) salt = Buffer.from(salt, 'binary') if (salt.length !== 8) throw new RangeError('salt should be Buffer with 8 byte length') } var keyLen = keyBits / 8 var key = Buffer.alloc(keyLen) var iv = Buffer.alloc(ivLen || 0) var tmp = Buffer.alloc(0) while (keyLen > 0 || ivLen > 0) { var hash = new MD5() hash.update(tmp) hash.update(password) if (salt) hash.update(salt) tmp = hash.digest() var used = 0 if (keyLen > 0) { var keyStart = key.length - keyLen used = Math.min(keyLen, tmp.length) tmp.copy(key, keyStart, 0, used) keyLen -= used } if (used < tmp.length && ivLen > 0) { var ivStart = iv.length - ivLen var length = Math.min(ivLen, tmp.length - used) tmp.copy(iv, ivStart, used, used + length) ivLen -= length } } tmp.fill(0) return { key: key, iv: iv } } module.exports = EVP_BytesToKey /***/ }), /***/ "./node_modules/hash-base/index.js": /*!*****************************************!*\ !*** ./node_modules/hash-base/index.js ***! \*****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer var Transform = __webpack_require__(/*! stream */ "./node_modules/stream-browserify/index.js").Transform var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js") function throwIfNotStringOrBuffer (val, prefix) { if (!Buffer.isBuffer(val) && typeof val !== 'string') { throw new TypeError(prefix + ' must be a string or a buffer') } } function HashBase (blockSize) { Transform.call(this) this._block = Buffer.allocUnsafe(blockSize) this._blockSize = blockSize this._blockOffset = 0 this._length = [0, 0, 0, 0] this._finalized = false } inherits(HashBase, Transform) HashBase.prototype._transform = function (chunk, encoding, callback) { var error = null try { this.update(chunk, encoding) } catch (err) { error = err } callback(error) } HashBase.prototype._flush = function (callback) { var error = null try { this.push(this.digest()) } catch (err) { error = err } callback(error) } HashBase.prototype.update = function (data, encoding) { throwIfNotStringOrBuffer(data, 'Data') if (this._finalized) throw new Error('Digest already called') if (!Buffer.isBuffer(data)) data = Buffer.from(data, encoding) // consume data var block = this._block var offset = 0 while (this._blockOffset + data.length - offset >= this._blockSize) { for (var i = this._blockOffset; i < this._blockSize;) block[i++] = data[offset++] this._update() this._blockOffset = 0 } while (offset < data.length) block[this._blockOffset++] = data[offset++] // update length for (var j = 0, carry = data.length * 8; carry > 0; ++j) { this._length[j] += carry carry = (this._length[j] / 0x0100000000) | 0 if (carry > 0) this._length[j] -= 0x0100000000 * carry } return this } HashBase.prototype._update = function () { throw new Error('_update is not implemented') } HashBase.prototype.digest = function (encoding) { if (this._finalized) throw new Error('Digest already called') this._finalized = true var digest = this._digest() if (encoding !== undefined) digest = digest.toString(encoding) // reset state this._block.fill(0) this._blockOffset = 0 for (var i = 0; i < 4; ++i) this._length[i] = 0 return digest } HashBase.prototype._digest = function () { throw new Error('_digest is not implemented') } module.exports = HashBase /***/ }), /***/ "./node_modules/hash.js/lib/hash.js": /*!******************************************!*\ !*** ./node_modules/hash.js/lib/hash.js ***! \******************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var hash = exports; hash.utils = __webpack_require__(/*! ./hash/utils */ "./node_modules/hash.js/lib/hash/utils.js"); hash.common = __webpack_require__(/*! ./hash/common */ "./node_modules/hash.js/lib/hash/common.js"); hash.sha = __webpack_require__(/*! ./hash/sha */ "./node_modules/hash.js/lib/hash/sha.js"); hash.ripemd = __webpack_require__(/*! ./hash/ripemd */ "./node_modules/hash.js/lib/hash/ripemd.js"); hash.hmac = __webpack_require__(/*! ./hash/hmac */ "./node_modules/hash.js/lib/hash/hmac.js"); // Proxy hash functions to the main object hash.sha1 = hash.sha.sha1; hash.sha256 = hash.sha.sha256; hash.sha224 = hash.sha.sha224; hash.sha384 = hash.sha.sha384; hash.sha512 = hash.sha.sha512; hash.ripemd160 = hash.ripemd.ripemd160; /***/ }), /***/ "./node_modules/hash.js/lib/hash/common.js": /*!*************************************************!*\ !*** ./node_modules/hash.js/lib/hash/common.js ***! \*************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var utils = __webpack_require__(/*! ./utils */ "./node_modules/hash.js/lib/hash/utils.js"); var assert = __webpack_require__(/*! minimalistic-assert */ "./node_modules/minimalistic-assert/index.js"); function BlockHash() { this.pending = null; this.pendingTotal = 0; this.blockSize = this.constructor.blockSize; this.outSize = this.constructor.outSize; this.hmacStrength = this.constructor.hmacStrength; this.padLength = this.constructor.padLength / 8; this.endian = 'big'; this._delta8 = this.blockSize / 8; this._delta32 = this.blockSize / 32; } exports.BlockHash = BlockHash; BlockHash.prototype.update = function update(msg, enc) { // Convert message to array, pad it, and join into 32bit blocks msg = utils.toArray(msg, enc); if (!this.pending) this.pending = msg; else this.pending = this.pending.concat(msg); this.pendingTotal += msg.length; // Enough data, try updating if (this.pending.length >= this._delta8) { msg = this.pending; // Process pending data in blocks var r = msg.length % this._delta8; this.pending = msg.slice(msg.length - r, msg.length); if (this.pending.length === 0) this.pending = null; msg = utils.join32(msg, 0, msg.length - r, this.endian); for (var i = 0; i < msg.length; i += this._delta32) this._update(msg, i, i + this._delta32); } return this; }; BlockHash.prototype.digest = function digest(enc) { this.update(this._pad()); assert(this.pending === null); return this._digest(enc); }; BlockHash.prototype._pad = function pad() { var len = this.pendingTotal; var bytes = this._delta8; var k = bytes - ((len + this.padLength) % bytes); var res = new Array(k + this.padLength); res[0] = 0x80; for (var i = 1; i < k; i++) res[i] = 0; // Append length len <<= 3; if (this.endian === 'big') { for (var t = 8; t < this.padLength; t++) res[i++] = 0; res[i++] = 0; res[i++] = 0; res[i++] = 0; res[i++] = 0; res[i++] = (len >>> 24) & 0xff; res[i++] = (len >>> 16) & 0xff; res[i++] = (len >>> 8) & 0xff; res[i++] = len & 0xff; } else { res[i++] = len & 0xff; res[i++] = (len >>> 8) & 0xff; res[i++] = (len >>> 16) & 0xff; res[i++] = (len >>> 24) & 0xff; res[i++] = 0; res[i++] = 0; res[i++] = 0; res[i++] = 0; for (t = 8; t < this.padLength; t++) res[i++] = 0; } return res; }; /***/ }), /***/ "./node_modules/hash.js/lib/hash/hmac.js": /*!***********************************************!*\ !*** ./node_modules/hash.js/lib/hash/hmac.js ***! \***********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var utils = __webpack_require__(/*! ./utils */ "./node_modules/hash.js/lib/hash/utils.js"); var assert = __webpack_require__(/*! minimalistic-assert */ "./node_modules/minimalistic-assert/index.js"); function Hmac(hash, key, enc) { if (!(this instanceof Hmac)) return new Hmac(hash, key, enc); this.Hash = hash; this.blockSize = hash.blockSize / 8; this.outSize = hash.outSize / 8; this.inner = null; this.outer = null; this._init(utils.toArray(key, enc)); } module.exports = Hmac; Hmac.prototype._init = function init(key) { // Shorten key, if needed if (key.length > this.blockSize) key = new this.Hash().update(key).digest(); assert(key.length <= this.blockSize); // Add padding to key for (var i = key.length; i < this.blockSize; i++) key.push(0); for (i = 0; i < key.length; i++) key[i] ^= 0x36; this.inner = new this.Hash().update(key); // 0x36 ^ 0x5c = 0x6a for (i = 0; i < key.length; i++) key[i] ^= 0x6a; this.outer = new this.Hash().update(key); }; Hmac.prototype.update = function update(msg, enc) { this.inner.update(msg, enc); return this; }; Hmac.prototype.digest = function digest(enc) { this.outer.update(this.inner.digest()); return this.outer.digest(enc); }; /***/ }), /***/ "./node_modules/hash.js/lib/hash/ripemd.js": /*!*************************************************!*\ !*** ./node_modules/hash.js/lib/hash/ripemd.js ***! \*************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var utils = __webpack_require__(/*! ./utils */ "./node_modules/hash.js/lib/hash/utils.js"); var common = __webpack_require__(/*! ./common */ "./node_modules/hash.js/lib/hash/common.js"); var rotl32 = utils.rotl32; var sum32 = utils.sum32; var sum32_3 = utils.sum32_3; var sum32_4 = utils.sum32_4; var BlockHash = common.BlockHash; function RIPEMD160() { if (!(this instanceof RIPEMD160)) return new RIPEMD160(); BlockHash.call(this); this.h = [ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 ]; this.endian = 'little'; } utils.inherits(RIPEMD160, BlockHash); exports.ripemd160 = RIPEMD160; RIPEMD160.blockSize = 512; RIPEMD160.outSize = 160; RIPEMD160.hmacStrength = 192; RIPEMD160.padLength = 64; RIPEMD160.prototype._update = function update(msg, start) { var A = this.h[0]; var B = this.h[1]; var C = this.h[2]; var D = this.h[3]; var E = this.h[4]; var Ah = A; var Bh = B; var Ch = C; var Dh = D; var Eh = E; for (var j = 0; j < 80; j++) { var T = sum32( rotl32( sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)), s[j]), E); A = E; E = D; D = rotl32(C, 10); C = B; B = T; T = sum32( rotl32( sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)), sh[j]), Eh); Ah = Eh; Eh = Dh; Dh = rotl32(Ch, 10); Ch = Bh; Bh = T; } T = sum32_3(this.h[1], C, Dh); this.h[1] = sum32_3(this.h[2], D, Eh); this.h[2] = sum32_3(this.h[3], E, Ah); this.h[3] = sum32_3(this.h[4], A, Bh); this.h[4] = sum32_3(this.h[0], B, Ch); this.h[0] = T; }; RIPEMD160.prototype._digest = function digest(enc) { if (enc === 'hex') return utils.toHex32(this.h, 'little'); else return utils.split32(this.h, 'little'); }; function f(j, x, y, z) { if (j <= 15) return x ^ y ^ z; else if (j <= 31) return (x & y) | ((~x) & z); else if (j <= 47) return (x | (~y)) ^ z; else if (j <= 63) return (x & z) | (y & (~z)); else return x ^ (y | (~z)); } function K(j) { if (j <= 15) return 0x00000000; else if (j <= 31) return 0x5a827999; else if (j <= 47) return 0x6ed9eba1; else if (j <= 63) return 0x8f1bbcdc; else return 0xa953fd4e; } function Kh(j) { if (j <= 15) return 0x50a28be6; else if (j <= 31) return 0x5c4dd124; else if (j <= 47) return 0x6d703ef3; else if (j <= 63) return 0x7a6d76e9; else return 0x00000000; } var r = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 ]; var rh = [ 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 ]; var s = [ 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]; var sh = [ 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]; /***/ }), /***/ "./node_modules/hash.js/lib/hash/sha.js": /*!**********************************************!*\ !*** ./node_modules/hash.js/lib/hash/sha.js ***! \**********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.sha1 = __webpack_require__(/*! ./sha/1 */ "./node_modules/hash.js/lib/hash/sha/1.js"); exports.sha224 = __webpack_require__(/*! ./sha/224 */ "./node_modules/hash.js/lib/hash/sha/224.js"); exports.sha256 = __webpack_require__(/*! ./sha/256 */ "./node_modules/hash.js/lib/hash/sha/256.js"); exports.sha384 = __webpack_require__(/*! ./sha/384 */ "./node_modules/hash.js/lib/hash/sha/384.js"); exports.sha512 = __webpack_require__(/*! ./sha/512 */ "./node_modules/hash.js/lib/hash/sha/512.js"); /***/ }), /***/ "./node_modules/hash.js/lib/hash/sha/1.js": /*!************************************************!*\ !*** ./node_modules/hash.js/lib/hash/sha/1.js ***! \************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var utils = __webpack_require__(/*! ../utils */ "./node_modules/hash.js/lib/hash/utils.js"); var common = __webpack_require__(/*! ../common */ "./node_modules/hash.js/lib/hash/common.js"); var shaCommon = __webpack_require__(/*! ./common */ "./node_modules/hash.js/lib/hash/sha/common.js"); var rotl32 = utils.rotl32; var sum32 = utils.sum32; var sum32_5 = utils.sum32_5; var ft_1 = shaCommon.ft_1; var BlockHash = common.BlockHash; var sha1_K = [ 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6 ]; function SHA1() { if (!(this instanceof SHA1)) return new SHA1(); BlockHash.call(this); this.h = [ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 ]; this.W = new Array(80); } utils.inherits(SHA1, BlockHash); module.exports = SHA1; SHA1.blockSize = 512; SHA1.outSize = 160; SHA1.hmacStrength = 80; SHA1.padLength = 64; SHA1.prototype._update = function _update(msg, start) { var W = this.W; for (var i = 0; i < 16; i++) W[i] = msg[start + i]; for(; i < W.length; i++) W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1); var a = this.h[0]; var b = this.h[1]; var c = this.h[2]; var d = this.h[3]; var e = this.h[4]; for (i = 0; i < W.length; i++) { var s = ~~(i / 20); var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]); e = d; d = c; c = rotl32(b, 30); b = a; a = t; } this.h[0] = sum32(this.h[0], a); this.h[1] = sum32(this.h[1], b); this.h[2] = sum32(this.h[2], c); this.h[3] = sum32(this.h[3], d); this.h[4] = sum32(this.h[4], e); }; SHA1.prototype._digest = function digest(enc) { if (enc === 'hex') return utils.toHex32(this.h, 'big'); else return utils.split32(this.h, 'big'); }; /***/ }), /***/ "./node_modules/hash.js/lib/hash/sha/224.js": /*!**************************************************!*\ !*** ./node_modules/hash.js/lib/hash/sha/224.js ***! \**************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var utils = __webpack_require__(/*! ../utils */ "./node_modules/hash.js/lib/hash/utils.js"); var SHA256 = __webpack_require__(/*! ./256 */ "./node_modules/hash.js/lib/hash/sha/256.js"); function SHA224() { if (!(this instanceof SHA224)) return new SHA224(); SHA256.call(this); this.h = [ 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 ]; } utils.inherits(SHA224, SHA256); module.exports = SHA224; SHA224.blockSize = 512; SHA224.outSize = 224; SHA224.hmacStrength = 192; SHA224.padLength = 64; SHA224.prototype._digest = function digest(enc) { // Just truncate output if (enc === 'hex') return utils.toHex32(this.h.slice(0, 7), 'big'); else return utils.split32(this.h.slice(0, 7), 'big'); }; /***/ }), /***/ "./node_modules/hash.js/lib/hash/sha/256.js": /*!**************************************************!*\ !*** ./node_modules/hash.js/lib/hash/sha/256.js ***! \**************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var utils = __webpack_require__(/*! ../utils */ "./node_modules/hash.js/lib/hash/utils.js"); var common = __webpack_require__(/*! ../common */ "./node_modules/hash.js/lib/hash/common.js"); var shaCommon = __webpack_require__(/*! ./common */ "./node_modules/hash.js/lib/hash/sha/common.js"); var assert = __webpack_require__(/*! minimalistic-assert */ "./node_modules/minimalistic-assert/index.js"); var sum32 = utils.sum32; var sum32_4 = utils.sum32_4; var sum32_5 = utils.sum32_5; var ch32 = shaCommon.ch32; var maj32 = shaCommon.maj32; var s0_256 = shaCommon.s0_256; var s1_256 = shaCommon.s1_256; var g0_256 = shaCommon.g0_256; var g1_256 = shaCommon.g1_256; var BlockHash = common.BlockHash; var sha256_K = [ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 ]; function SHA256() { if (!(this instanceof SHA256)) return new SHA256(); BlockHash.call(this); this.h = [ 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 ]; this.k = sha256_K; this.W = new Array(64); } utils.inherits(SHA256, BlockHash); module.exports = SHA256; SHA256.blockSize = 512; SHA256.outSize = 256; SHA256.hmacStrength = 192; SHA256.padLength = 64; SHA256.prototype._update = function _update(msg, start) { var W = this.W; for (var i = 0; i < 16; i++) W[i] = msg[start + i]; for (; i < W.length; i++) W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]); var a = this.h[0]; var b = this.h[1]; var c = this.h[2]; var d = this.h[3]; var e = this.h[4]; var f = this.h[5]; var g = this.h[6]; var h = this.h[7]; assert(this.k.length === W.length); for (i = 0; i < W.length; i++) { var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]); var T2 = sum32(s0_256(a), maj32(a, b, c)); h = g; g = f; f = e; e = sum32(d, T1); d = c; c = b; b = a; a = sum32(T1, T2); } this.h[0] = sum32(this.h[0], a); this.h[1] = sum32(this.h[1], b); this.h[2] = sum32(this.h[2], c); this.h[3] = sum32(this.h[3], d); this.h[4] = sum32(this.h[4], e); this.h[5] = sum32(this.h[5], f); this.h[6] = sum32(this.h[6], g); this.h[7] = sum32(this.h[7], h); }; SHA256.prototype._digest = function digest(enc) { if (enc === 'hex') return utils.toHex32(this.h, 'big'); else return utils.split32(this.h, 'big'); }; /***/ }), /***/ "./node_modules/hash.js/lib/hash/sha/384.js": /*!**************************************************!*\ !*** ./node_modules/hash.js/lib/hash/sha/384.js ***! \**************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var utils = __webpack_require__(/*! ../utils */ "./node_modules/hash.js/lib/hash/utils.js"); var SHA512 = __webpack_require__(/*! ./512 */ "./node_modules/hash.js/lib/hash/sha/512.js"); function SHA384() { if (!(this instanceof SHA384)) return new SHA384(); SHA512.call(this); this.h = [ 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939, 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4 ]; } utils.inherits(SHA384, SHA512); module.exports = SHA384; SHA384.blockSize = 1024; SHA384.outSize = 384; SHA384.hmacStrength = 192; SHA384.padLength = 128; SHA384.prototype._digest = function digest(enc) { if (enc === 'hex') return utils.toHex32(this.h.slice(0, 12), 'big'); else return utils.split32(this.h.slice(0, 12), 'big'); }; /***/ }), /***/ "./node_modules/hash.js/lib/hash/sha/512.js": /*!**************************************************!*\ !*** ./node_modules/hash.js/lib/hash/sha/512.js ***! \**************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var utils = __webpack_require__(/*! ../utils */ "./node_modules/hash.js/lib/hash/utils.js"); var common = __webpack_require__(/*! ../common */ "./node_modules/hash.js/lib/hash/common.js"); var assert = __webpack_require__(/*! minimalistic-assert */ "./node_modules/minimalistic-assert/index.js"); var rotr64_hi = utils.rotr64_hi; var rotr64_lo = utils.rotr64_lo; var shr64_hi = utils.shr64_hi; var shr64_lo = utils.shr64_lo; var sum64 = utils.sum64; var sum64_hi = utils.sum64_hi; var sum64_lo = utils.sum64_lo; var sum64_4_hi = utils.sum64_4_hi; var sum64_4_lo = utils.sum64_4_lo; var sum64_5_hi = utils.sum64_5_hi; var sum64_5_lo = utils.sum64_5_lo; var BlockHash = common.BlockHash; var sha512_K = [ 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 ]; function SHA512() { if (!(this instanceof SHA512)) return new SHA512(); BlockHash.call(this); this.h = [ 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1, 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179 ]; this.k = sha512_K; this.W = new Array(160); } utils.inherits(SHA512, BlockHash); module.exports = SHA512; SHA512.blockSize = 1024; SHA512.outSize = 512; SHA512.hmacStrength = 192; SHA512.padLength = 128; SHA512.prototype._prepareBlock = function _prepareBlock(msg, start) { var W = this.W; // 32 x 32bit words for (var i = 0; i < 32; i++) W[i] = msg[start + i]; for (; i < W.length; i += 2) { var c0_hi = g1_512_hi(W[i - 4], W[i - 3]); // i - 2 var c0_lo = g1_512_lo(W[i - 4], W[i - 3]); var c1_hi = W[i - 14]; // i - 7 var c1_lo = W[i - 13]; var c2_hi = g0_512_hi(W[i - 30], W[i - 29]); // i - 15 var c2_lo = g0_512_lo(W[i - 30], W[i - 29]); var c3_hi = W[i - 32]; // i - 16 var c3_lo = W[i - 31]; W[i] = sum64_4_hi( c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo); W[i + 1] = sum64_4_lo( c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo); } }; SHA512.prototype._update = function _update(msg, start) { this._prepareBlock(msg, start); var W = this.W; var ah = this.h[0]; var al = this.h[1]; var bh = this.h[2]; var bl = this.h[3]; var ch = this.h[4]; var cl = this.h[5]; var dh = this.h[6]; var dl = this.h[7]; var eh = this.h[8]; var el = this.h[9]; var fh = this.h[10]; var fl = this.h[11]; var gh = this.h[12]; var gl = this.h[13]; var hh = this.h[14]; var hl = this.h[15]; assert(this.k.length === W.length); for (var i = 0; i < W.length; i += 2) { var c0_hi = hh; var c0_lo = hl; var c1_hi = s1_512_hi(eh, el); var c1_lo = s1_512_lo(eh, el); var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl); var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl); var c3_hi = this.k[i]; var c3_lo = this.k[i + 1]; var c4_hi = W[i]; var c4_lo = W[i + 1]; var T1_hi = sum64_5_hi( c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo, c4_hi, c4_lo); var T1_lo = sum64_5_lo( c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo, c4_hi, c4_lo); c0_hi = s0_512_hi(ah, al); c0_lo = s0_512_lo(ah, al); c1_hi = maj64_hi(ah, al, bh, bl, ch, cl); c1_lo = maj64_lo(ah, al, bh, bl, ch, cl); var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo); var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo); hh = gh; hl = gl; gh = fh; gl = fl; fh = eh; fl = el; eh = sum64_hi(dh, dl, T1_hi, T1_lo); el = sum64_lo(dl, dl, T1_hi, T1_lo); dh = ch; dl = cl; ch = bh; cl = bl; bh = ah; bl = al; ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo); al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo); } sum64(this.h, 0, ah, al); sum64(this.h, 2, bh, bl); sum64(this.h, 4, ch, cl); sum64(this.h, 6, dh, dl); sum64(this.h, 8, eh, el); sum64(this.h, 10, fh, fl); sum64(this.h, 12, gh, gl); sum64(this.h, 14, hh, hl); }; SHA512.prototype._digest = function digest(enc) { if (enc === 'hex') return utils.toHex32(this.h, 'big'); else return utils.split32(this.h, 'big'); }; function ch64_hi(xh, xl, yh, yl, zh) { var r = (xh & yh) ^ ((~xh) & zh); if (r < 0) r += 0x100000000; return r; } function ch64_lo(xh, xl, yh, yl, zh, zl) { var r = (xl & yl) ^ ((~xl) & zl); if (r < 0) r += 0x100000000; return r; } function maj64_hi(xh, xl, yh, yl, zh) { var r = (xh & yh) ^ (xh & zh) ^ (yh & zh); if (r < 0) r += 0x100000000; return r; } function maj64_lo(xh, xl, yh, yl, zh, zl) { var r = (xl & yl) ^ (xl & zl) ^ (yl & zl); if (r < 0) r += 0x100000000; return r; } function s0_512_hi(xh, xl) { var c0_hi = rotr64_hi(xh, xl, 28); var c1_hi = rotr64_hi(xl, xh, 2); // 34 var c2_hi = rotr64_hi(xl, xh, 7); // 39 var r = c0_hi ^ c1_hi ^ c2_hi; if (r < 0) r += 0x100000000; return r; } function s0_512_lo(xh, xl) { var c0_lo = rotr64_lo(xh, xl, 28); var c1_lo = rotr64_lo(xl, xh, 2); // 34 var c2_lo = rotr64_lo(xl, xh, 7); // 39 var r = c0_lo ^ c1_lo ^ c2_lo; if (r < 0) r += 0x100000000; return r; } function s1_512_hi(xh, xl) { var c0_hi = rotr64_hi(xh, xl, 14); var c1_hi = rotr64_hi(xh, xl, 18); var c2_hi = rotr64_hi(xl, xh, 9); // 41 var r = c0_hi ^ c1_hi ^ c2_hi; if (r < 0) r += 0x100000000; return r; } function s1_512_lo(xh, xl) { var c0_lo = rotr64_lo(xh, xl, 14); var c1_lo = rotr64_lo(xh, xl, 18); var c2_lo = rotr64_lo(xl, xh, 9); // 41 var r = c0_lo ^ c1_lo ^ c2_lo; if (r < 0) r += 0x100000000; return r; } function g0_512_hi(xh, xl) { var c0_hi = rotr64_hi(xh, xl, 1); var c1_hi = rotr64_hi(xh, xl, 8); var c2_hi = shr64_hi(xh, xl, 7); var r = c0_hi ^ c1_hi ^ c2_hi; if (r < 0) r += 0x100000000; return r; } function g0_512_lo(xh, xl) { var c0_lo = rotr64_lo(xh, xl, 1); var c1_lo = rotr64_lo(xh, xl, 8); var c2_lo = shr64_lo(xh, xl, 7); var r = c0_lo ^ c1_lo ^ c2_lo; if (r < 0) r += 0x100000000; return r; } function g1_512_hi(xh, xl) { var c0_hi = rotr64_hi(xh, xl, 19); var c1_hi = rotr64_hi(xl, xh, 29); // 61 var c2_hi = shr64_hi(xh, xl, 6); var r = c0_hi ^ c1_hi ^ c2_hi; if (r < 0) r += 0x100000000; return r; } function g1_512_lo(xh, xl) { var c0_lo = rotr64_lo(xh, xl, 19); var c1_lo = rotr64_lo(xl, xh, 29); // 61 var c2_lo = shr64_lo(xh, xl, 6); var r = c0_lo ^ c1_lo ^ c2_lo; if (r < 0) r += 0x100000000; return r; } /***/ }), /***/ "./node_modules/hash.js/lib/hash/sha/common.js": /*!*****************************************************!*\ !*** ./node_modules/hash.js/lib/hash/sha/common.js ***! \*****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var utils = __webpack_require__(/*! ../utils */ "./node_modules/hash.js/lib/hash/utils.js"); var rotr32 = utils.rotr32; function ft_1(s, x, y, z) { if (s === 0) return ch32(x, y, z); if (s === 1 || s === 3) return p32(x, y, z); if (s === 2) return maj32(x, y, z); } exports.ft_1 = ft_1; function ch32(x, y, z) { return (x & y) ^ ((~x) & z); } exports.ch32 = ch32; function maj32(x, y, z) { return (x & y) ^ (x & z) ^ (y & z); } exports.maj32 = maj32; function p32(x, y, z) { return x ^ y ^ z; } exports.p32 = p32; function s0_256(x) { return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22); } exports.s0_256 = s0_256; function s1_256(x) { return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25); } exports.s1_256 = s1_256; function g0_256(x) { return rotr32(x, 7) ^ rotr32(x, 18) ^ (x >>> 3); } exports.g0_256 = g0_256; function g1_256(x) { return rotr32(x, 17) ^ rotr32(x, 19) ^ (x >>> 10); } exports.g1_256 = g1_256; /***/ }), /***/ "./node_modules/hash.js/lib/hash/utils.js": /*!************************************************!*\ !*** ./node_modules/hash.js/lib/hash/utils.js ***! \************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var assert = __webpack_require__(/*! minimalistic-assert */ "./node_modules/minimalistic-assert/index.js"); var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js"); exports.inherits = inherits; function toArray(msg, enc) { if (Array.isArray(msg)) return msg.slice(); if (!msg) return []; var res = []; if (typeof msg === 'string') { if (!enc) { for (var i = 0; i < msg.length; i++) { var c = msg.charCodeAt(i); var hi = c >> 8; var lo = c & 0xff; if (hi) res.push(hi, lo); else res.push(lo); } } else if (enc === 'hex') { msg = msg.replace(/[^a-z0-9]+/ig, ''); if (msg.length % 2 !== 0) msg = '0' + msg; for (i = 0; i < msg.length; i += 2) res.push(parseInt(msg[i] + msg[i + 1], 16)); } } else { for (i = 0; i < msg.length; i++) res[i] = msg[i] | 0; } return res; } exports.toArray = toArray; function toHex(msg) { var res = ''; for (var i = 0; i < msg.length; i++) res += zero2(msg[i].toString(16)); return res; } exports.toHex = toHex; function htonl(w) { var res = (w >>> 24) | ((w >>> 8) & 0xff00) | ((w << 8) & 0xff0000) | ((w & 0xff) << 24); return res >>> 0; } exports.htonl = htonl; function toHex32(msg, endian) { var res = ''; for (var i = 0; i < msg.length; i++) { var w = msg[i]; if (endian === 'little') w = htonl(w); res += zero8(w.toString(16)); } return res; } exports.toHex32 = toHex32; function zero2(word) { if (word.length === 1) return '0' + word; else return word; } exports.zero2 = zero2; function zero8(word) { if (word.length === 7) return '0' + word; else if (word.length === 6) return '00' + word; else if (word.length === 5) return '000' + word; else if (word.length === 4) return '0000' + word; else if (word.length === 3) return '00000' + word; else if (word.length === 2) return '000000' + word; else if (word.length === 1) return '0000000' + word; else return word; } exports.zero8 = zero8; function join32(msg, start, end, endian) { var len = end - start; assert(len % 4 === 0); var res = new Array(len / 4); for (var i = 0, k = start; i < res.length; i++, k += 4) { var w; if (endian === 'big') w = (msg[k] << 24) | (msg[k + 1] << 16) | (msg[k + 2] << 8) | msg[k + 3]; else w = (msg[k + 3] << 24) | (msg[k + 2] << 16) | (msg[k + 1] << 8) | msg[k]; res[i] = w >>> 0; } return res; } exports.join32 = join32; function split32(msg, endian) { var res = new Array(msg.length * 4); for (var i = 0, k = 0; i < msg.length; i++, k += 4) { var m = msg[i]; if (endian === 'big') { res[k] = m >>> 24; res[k + 1] = (m >>> 16) & 0xff; res[k + 2] = (m >>> 8) & 0xff; res[k + 3] = m & 0xff; } else { res[k + 3] = m >>> 24; res[k + 2] = (m >>> 16) & 0xff; res[k + 1] = (m >>> 8) & 0xff; res[k] = m & 0xff; } } return res; } exports.split32 = split32; function rotr32(w, b) { return (w >>> b) | (w << (32 - b)); } exports.rotr32 = rotr32; function rotl32(w, b) { return (w << b) | (w >>> (32 - b)); } exports.rotl32 = rotl32; function sum32(a, b) { return (a + b) >>> 0; } exports.sum32 = sum32; function sum32_3(a, b, c) { return (a + b + c) >>> 0; } exports.sum32_3 = sum32_3; function sum32_4(a, b, c, d) { return (a + b + c + d) >>> 0; } exports.sum32_4 = sum32_4; function sum32_5(a, b, c, d, e) { return (a + b + c + d + e) >>> 0; } exports.sum32_5 = sum32_5; function sum64(buf, pos, ah, al) { var bh = buf[pos]; var bl = buf[pos + 1]; var lo = (al + bl) >>> 0; var hi = (lo < al ? 1 : 0) + ah + bh; buf[pos] = hi >>> 0; buf[pos + 1] = lo; } exports.sum64 = sum64; function sum64_hi(ah, al, bh, bl) { var lo = (al + bl) >>> 0; var hi = (lo < al ? 1 : 0) + ah + bh; return hi >>> 0; } exports.sum64_hi = sum64_hi; function sum64_lo(ah, al, bh, bl) { var lo = al + bl; return lo >>> 0; } exports.sum64_lo = sum64_lo; function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) { var carry = 0; var lo = al; lo = (lo + bl) >>> 0; carry += lo < al ? 1 : 0; lo = (lo + cl) >>> 0; carry += lo < cl ? 1 : 0; lo = (lo + dl) >>> 0; carry += lo < dl ? 1 : 0; var hi = ah + bh + ch + dh + carry; return hi >>> 0; } exports.sum64_4_hi = sum64_4_hi; function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) { var lo = al + bl + cl + dl; return lo >>> 0; } exports.sum64_4_lo = sum64_4_lo; function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) { var carry = 0; var lo = al; lo = (lo + bl) >>> 0; carry += lo < al ? 1 : 0; lo = (lo + cl) >>> 0; carry += lo < cl ? 1 : 0; lo = (lo + dl) >>> 0; carry += lo < dl ? 1 : 0; lo = (lo + el) >>> 0; carry += lo < el ? 1 : 0; var hi = ah + bh + ch + dh + eh + carry; return hi >>> 0; } exports.sum64_5_hi = sum64_5_hi; function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) { var lo = al + bl + cl + dl + el; return lo >>> 0; } exports.sum64_5_lo = sum64_5_lo; function rotr64_hi(ah, al, num) { var r = (al << (32 - num)) | (ah >>> num); return r >>> 0; } exports.rotr64_hi = rotr64_hi; function rotr64_lo(ah, al, num) { var r = (ah << (32 - num)) | (al >>> num); return r >>> 0; } exports.rotr64_lo = rotr64_lo; function shr64_hi(ah, al, num) { return ah >>> num; } exports.shr64_hi = shr64_hi; function shr64_lo(ah, al, num) { var r = (ah << (32 - num)) | (al >>> num); return r >>> 0; } exports.shr64_lo = shr64_lo; /***/ }), /***/ "./node_modules/hmac-drbg/lib/hmac-drbg.js": /*!*************************************************!*\ !*** ./node_modules/hmac-drbg/lib/hmac-drbg.js ***! \*************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var hash = __webpack_require__(/*! hash.js */ "./node_modules/hash.js/lib/hash.js"); var utils = __webpack_require__(/*! minimalistic-crypto-utils */ "./node_modules/minimalistic-crypto-utils/lib/utils.js"); var assert = __webpack_require__(/*! minimalistic-assert */ "./node_modules/minimalistic-assert/index.js"); function HmacDRBG(options) { if (!(this instanceof HmacDRBG)) return new HmacDRBG(options); this.hash = options.hash; this.predResist = !!options.predResist; this.outLen = this.hash.outSize; this.minEntropy = options.minEntropy || this.hash.hmacStrength; this._reseed = null; this.reseedInterval = null; this.K = null; this.V = null; var entropy = utils.toArray(options.entropy, options.entropyEnc || 'hex'); var nonce = utils.toArray(options.nonce, options.nonceEnc || 'hex'); var pers = utils.toArray(options.pers, options.persEnc || 'hex'); assert(entropy.length >= (this.minEntropy / 8), 'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits'); this._init(entropy, nonce, pers); } module.exports = HmacDRBG; HmacDRBG.prototype._init = function init(entropy, nonce, pers) { var seed = entropy.concat(nonce).concat(pers); this.K = new Array(this.outLen / 8); this.V = new Array(this.outLen / 8); for (var i = 0; i < this.V.length; i++) { this.K[i] = 0x00; this.V[i] = 0x01; } this._update(seed); this._reseed = 1; this.reseedInterval = 0x1000000000000; // 2^48 }; HmacDRBG.prototype._hmac = function hmac() { return new hash.hmac(this.hash, this.K); }; HmacDRBG.prototype._update = function update(seed) { var kmac = this._hmac() .update(this.V) .update([ 0x00 ]); if (seed) kmac = kmac.update(seed); this.K = kmac.digest(); this.V = this._hmac().update(this.V).digest(); if (!seed) return; this.K = this._hmac() .update(this.V) .update([ 0x01 ]) .update(seed) .digest(); this.V = this._hmac().update(this.V).digest(); }; HmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) { // Optional entropy enc if (typeof entropyEnc !== 'string') { addEnc = add; add = entropyEnc; entropyEnc = null; } entropy = utils.toArray(entropy, entropyEnc); add = utils.toArray(add, addEnc); assert(entropy.length >= (this.minEntropy / 8), 'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits'); this._update(entropy.concat(add || [])); this._reseed = 1; }; HmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) { if (this._reseed > this.reseedInterval) throw new Error('Reseed is required'); // Optional encoding if (typeof enc !== 'string') { addEnc = add; add = enc; enc = null; } // Optional additional data if (add) { add = utils.toArray(add, addEnc || 'hex'); this._update(add); } var temp = []; while (temp.length < len) { this.V = this._hmac().update(this.V).digest(); temp = temp.concat(this.V); } var res = temp.slice(0, len); this._update(add); this._reseed++; return utils.encode(res, enc); }; /***/ }), /***/ "./node_modules/ieee754/index.js": /*!***************************************!*\ !*** ./node_modules/ieee754/index.js ***! \***************************************/ /*! no static exports found */ /***/ (function(module, exports) { exports.read = function (buffer, offset, isLE, mLen, nBytes) { var e, m var eLen = (nBytes * 8) - mLen - 1 var eMax = (1 << eLen) - 1 var eBias = eMax >> 1 var nBits = -7 var i = isLE ? (nBytes - 1) : 0 var d = isLE ? -1 : 1 var s = buffer[offset + i] i += d e = s & ((1 << (-nBits)) - 1) s >>= (-nBits) nBits += eLen for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {} m = e & ((1 << (-nBits)) - 1) e >>= (-nBits) nBits += mLen for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {} if (e === 0) { e = 1 - eBias } else if (e === eMax) { return m ? NaN : ((s ? -1 : 1) * Infinity) } else { m = m + Math.pow(2, mLen) e = e - eBias } return (s ? -1 : 1) * m * Math.pow(2, e - mLen) } exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { var e, m, c var eLen = (nBytes * 8) - mLen - 1 var eMax = (1 << eLen) - 1 var eBias = eMax >> 1 var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) var i = isLE ? 0 : (nBytes - 1) var d = isLE ? 1 : -1 var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 value = Math.abs(value) if (isNaN(value) || value === Infinity) { m = isNaN(value) ? 1 : 0 e = eMax } else { e = Math.floor(Math.log(value) / Math.LN2) if (value * (c = Math.pow(2, -e)) < 1) { e-- c *= 2 } if (e + eBias >= 1) { value += rt / c } else { value += rt * Math.pow(2, 1 - eBias) } if (value * c >= 2) { e++ c /= 2 } if (e + eBias >= eMax) { m = 0 e = eMax } else if (e + eBias >= 1) { m = ((value * c) - 1) * Math.pow(2, mLen) e = e + eBias } else { m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) e = 0 } } for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} e = (e << mLen) | m eLen += mLen for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} buffer[offset + i - d] |= s * 128 } /***/ }), /***/ "./node_modules/indexof/index.js": /*!***************************************!*\ !*** ./node_modules/indexof/index.js ***! \***************************************/ /*! no static exports found */ /***/ (function(module, exports) { var indexOf = [].indexOf; module.exports = function(arr, obj){ if (indexOf) return arr.indexOf(obj); for (var i = 0; i < arr.length; ++i) { if (arr[i] === obj) return i; } return -1; }; /***/ }), /***/ "./node_modules/inherits/inherits_browser.js": /*!***************************************************!*\ !*** ./node_modules/inherits/inherits_browser.js ***! \***************************************************/ /*! no static exports found */ /***/ (function(module, exports) { if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true } }); }; } else { // old school shim for old browsers module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor var TempCtor = function () {} TempCtor.prototype = superCtor.prototype ctor.prototype = new TempCtor() ctor.prototype.constructor = ctor } } /***/ }), /***/ "./node_modules/isarray/index.js": /*!***************************************!*\ !*** ./node_modules/isarray/index.js ***! \***************************************/ /*! no static exports found */ /***/ (function(module, exports) { var toString = {}.toString; module.exports = Array.isArray || function (arr) { return toString.call(arr) == '[object Array]'; }; /***/ }), /***/ "./node_modules/lit-html/lib/lit-extended.js": /*!***************************************************!*\ !*** ./node_modules/lit-html/lib/lit-extended.js ***! \***************************************************/ /*! exports provided: render, html, svg, extendedPartCallback, BooleanAttributePart, PropertyPart, EventPart */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "html", function() { return html; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "svg", function() { return svg; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "extendedPartCallback", function() { return extendedPartCallback; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BooleanAttributePart", function() { return BooleanAttributePart; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PropertyPart", function() { return PropertyPart; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EventPart", function() { return EventPart; }); /* harmony import */ var _lit_html_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lit-html.js */ "./node_modules/lit-html/lit-html.js"); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _lit_html_js__WEBPACK_IMPORTED_MODULE_0__["render"]; }); /** * @license * Copyright (c) 2017 The Polymer Project Authors. All rights reserved. * This code may only be used under the BSD style license found at * http://polymer.github.io/LICENSE.txt * The complete set of authors may be found at * http://polymer.github.io/AUTHORS.txt * The complete set of contributors may be found at * http://polymer.github.io/CONTRIBUTORS.txt * Code distributed by Google as part of the polymer project is also * subject to an additional IP rights grant found at * http://polymer.github.io/PATENTS.txt */ /** * Interprets a template literal as a lit-extended HTML template. */ const html = (strings, ...values) => new _lit_html_js__WEBPACK_IMPORTED_MODULE_0__["TemplateResult"](strings, values, 'html', extendedPartCallback); /** * Interprets a template literal as a lit-extended SVG template. */ const svg = (strings, ...values) => new _lit_html_js__WEBPACK_IMPORTED_MODULE_0__["SVGTemplateResult"](strings, values, 'svg', extendedPartCallback); /** * A PartCallback which allows templates to set properties and declarative * event handlers. * * Properties are set by default, instead of attributes. Attribute names in * lit-html templates preserve case, so properties are case sensitive. If an * expression takes up an entire attribute value, then the property is set to * that value. If an expression is interpolated with a string or other * expressions then the property is set to the string result of the * interpolation. * * To set an attribute instead of a property, append a `$` suffix to the * attribute name. * * Example: * * html`` * * To set an event handler, prefix the attribute name with `on-`: * * Example: * * html`` * */ const extendedPartCallback = (instance, templatePart, node) => { if (templatePart.type === 'attribute') { if (templatePart.rawName.substr(0, 3) === 'on-') { const eventName = templatePart.rawName.slice(3); return new EventPart(instance, node, eventName); } const lastChar = templatePart.name.substr(templatePart.name.length - 1); if (lastChar === '$') { const name = templatePart.name.slice(0, -1); return new _lit_html_js__WEBPACK_IMPORTED_MODULE_0__["AttributePart"](instance, node, name, templatePart.strings); } if (lastChar === '?') { const name = templatePart.name.slice(0, -1); return new BooleanAttributePart(instance, node, name, templatePart.strings); } return new PropertyPart(instance, node, templatePart.rawName, templatePart.strings); } return Object(_lit_html_js__WEBPACK_IMPORTED_MODULE_0__["defaultPartCallback"])(instance, templatePart, node); }; /** * Implements a boolean attribute, roughly as defined in the HTML * specification. * * If the value is truthy, then the attribute is present with a value of * ''. If the value is falsey, the attribute is removed. */ class BooleanAttributePart extends _lit_html_js__WEBPACK_IMPORTED_MODULE_0__["AttributePart"] { setValue(values, startIndex) { const s = this.strings; if (s.length === 2 && s[0] === '' && s[1] === '') { const value = Object(_lit_html_js__WEBPACK_IMPORTED_MODULE_0__["getValue"])(this, values[startIndex]); if (value === _lit_html_js__WEBPACK_IMPORTED_MODULE_0__["noChange"]) { return; } if (value) { this.element.setAttribute(this.name, ''); } else { this.element.removeAttribute(this.name); } } else { throw new Error('boolean attributes can only contain a single expression'); } } } class PropertyPart extends _lit_html_js__WEBPACK_IMPORTED_MODULE_0__["AttributePart"] { setValue(values, startIndex) { const s = this.strings; let value; if (this._equalToPreviousValues(values, startIndex)) { return; } if (s.length === 2 && s[0] === '' && s[1] === '') { // An expression that occupies the whole attribute value will leave // leading and trailing empty strings. value = Object(_lit_html_js__WEBPACK_IMPORTED_MODULE_0__["getValue"])(this, values[startIndex]); } else { // Interpolation, so interpolate value = this._interpolate(values, startIndex); } if (value !== _lit_html_js__WEBPACK_IMPORTED_MODULE_0__["noChange"]) { this.element[this.name] = value; } this._previousValues = values; } } class EventPart { constructor(instance, element, eventName) { this.instance = instance; this.element = element; this.eventName = eventName; } setValue(value) { const listener = Object(_lit_html_js__WEBPACK_IMPORTED_MODULE_0__["getValue"])(this, value); if (listener === this._listener) { return; } if (listener == null) { this.element.removeEventListener(this.eventName, this); } else if (this._listener == null) { this.element.addEventListener(this.eventName, this); } this._listener = listener; } handleEvent(event) { if (typeof this._listener === 'function') { this._listener.call(this.element, event); } else if (typeof this._listener.handleEvent === 'function') { this._listener.handleEvent(event); } } } //# sourceMappingURL=lit-extended.js.map /***/ }), /***/ "./node_modules/lit-html/lib/modify-template.js": /*!******************************************************!*\ !*** ./node_modules/lit-html/lib/modify-template.js ***! \******************************************************/ /*! exports provided: removeNodesFromTemplate, insertNodeIntoTemplate */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeNodesFromTemplate", function() { return removeNodesFromTemplate; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "insertNodeIntoTemplate", function() { return insertNodeIntoTemplate; }); /* harmony import */ var _lit_html_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lit-html.js */ "./node_modules/lit-html/lit-html.js"); /** * @license * Copyright (c) 2017 The Polymer Project Authors. All rights reserved. * This code may only be used under the BSD style license found at * http://polymer.github.io/LICENSE.txt * The complete set of authors may be found at * http://polymer.github.io/AUTHORS.txt * The complete set of contributors may be found at * http://polymer.github.io/CONTRIBUTORS.txt * Code distributed by Google as part of the polymer project is also * subject to an additional IP rights grant found at * http://polymer.github.io/PATENTS.txt */ const walkerNodeFilter = NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT; /** * Removes the list of nodes from a Template safely. In addition to removing * nodes from the Template, the Template part indices are updated to match * the mutated Template DOM. * * As the template is walked the removal state is tracked and * part indices are adjusted as needed. * * div * div#1 (remove) <-- start removing (removing node is div#1) * div * div#2 (remove) <-- continue removing (removing node is still div#1) * div * div <-- stop removing since previous sibling is the removing node (div#1, removed 4 nodes) */ function removeNodesFromTemplate(template, nodesToRemove) { const { element: { content }, parts } = template; const walker = document.createTreeWalker(content, walkerNodeFilter, null, false); let partIndex = 0; let part = parts[0]; let nodeIndex = -1; let removeCount = 0; const nodesToRemoveInTemplate = []; let currentRemovingNode = null; while (walker.nextNode()) { nodeIndex++; const node = walker.currentNode; // End removal if stepped past the removing node if (node.previousSibling === currentRemovingNode) { currentRemovingNode = null; } // A node to remove was found in the template if (nodesToRemove.has(node)) { nodesToRemoveInTemplate.push(node); // Track node we're removing if (currentRemovingNode === null) { currentRemovingNode = node; } } // When removing, increment count by which to adjust subsequent part indices if (currentRemovingNode !== null) { removeCount++; } while (part !== undefined && part.index === nodeIndex) { // If part is in a removed node deactivate it by setting index to -1 or // adjust the index as needed. part.index = currentRemovingNode !== null ? -1 : part.index - removeCount; part = parts[++partIndex]; } } nodesToRemoveInTemplate.forEach((n) => n.parentNode.removeChild(n)); } const countNodes = (node) => { let count = 1; const walker = document.createTreeWalker(node, walkerNodeFilter, null, false); while (walker.nextNode()) { count++; } return count; }; const nextActiveIndexInTemplateParts = (parts, startIndex = -1) => { for (let i = startIndex + 1; i < parts.length; i++) { const part = parts[i]; if (Object(_lit_html_js__WEBPACK_IMPORTED_MODULE_0__["isTemplatePartActive"])(part)) { return i; } } return -1; }; /** * Inserts the given node into the Template, optionally before the given * refNode. In addition to inserting the node into the Template, the Template * part indices are updated to match the mutated Template DOM. */ function insertNodeIntoTemplate(template, node, refNode = null) { const { element: { content }, parts } = template; // If there's no refNode, then put node at end of template. // No part indices need to be shifted in this case. if (refNode === null || refNode === undefined) { content.appendChild(node); return; } const walker = document.createTreeWalker(content, walkerNodeFilter, null, false); let partIndex = nextActiveIndexInTemplateParts(parts); let insertCount = 0; let walkerIndex = -1; while (walker.nextNode()) { walkerIndex++; const walkerNode = walker.currentNode; if (walkerNode === refNode) { refNode.parentNode.insertBefore(node, refNode); insertCount = countNodes(node); } while (partIndex !== -1 && parts[partIndex].index === walkerIndex) { // If we've inserted the node, simply adjust all subsequent parts if (insertCount > 0) { while (partIndex !== -1) { parts[partIndex].index += insertCount; partIndex = nextActiveIndexInTemplateParts(parts, partIndex); } return; } partIndex = nextActiveIndexInTemplateParts(parts, partIndex); } } } //# sourceMappingURL=modify-template.js.map /***/ }), /***/ "./node_modules/lit-html/lib/shady-render.js": /*!***************************************************!*\ !*** ./node_modules/lit-html/lib/shady-render.js ***! \***************************************************/ /*! exports provided: html, svg, TemplateResult, render */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; }); /* harmony import */ var _lit_html_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lit-html.js */ "./node_modules/lit-html/lit-html.js"); /* harmony import */ var _modify_template_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modify-template.js */ "./node_modules/lit-html/lib/modify-template.js"); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "html", function() { return _lit_html_js__WEBPACK_IMPORTED_MODULE_0__["html"]; }); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "svg", function() { return _lit_html_js__WEBPACK_IMPORTED_MODULE_0__["svg"]; }); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TemplateResult", function() { return _lit_html_js__WEBPACK_IMPORTED_MODULE_0__["TemplateResult"]; }); /** * @license * Copyright (c) 2017 The Polymer Project Authors. All rights reserved. * This code may only be used under the BSD style license found at * http://polymer.github.io/LICENSE.txt * The complete set of authors may be found at * http://polymer.github.io/AUTHORS.txt * The complete set of contributors may be found at * http://polymer.github.io/CONTRIBUTORS.txt * Code distributed by Google as part of the polymer project is also * subject to an additional IP rights grant found at * http://polymer.github.io/PATENTS.txt */ // Get a key to lookup in `templateCaches`. const getTemplateCacheKey = (type, scopeName) => `${type}--${scopeName}`; /** * Template factory which scopes template DOM using ShadyCSS. * @param scopeName {string} */ const shadyTemplateFactory = (scopeName) => (result) => { const cacheKey = getTemplateCacheKey(result.type, scopeName); let templateCache = _lit_html_js__WEBPACK_IMPORTED_MODULE_0__["templateCaches"].get(cacheKey); if (templateCache === undefined) { templateCache = new Map(); _lit_html_js__WEBPACK_IMPORTED_MODULE_0__["templateCaches"].set(cacheKey, templateCache); } let template = templateCache.get(result.strings); if (template === undefined) { const element = result.getTemplateElement(); if (typeof window.ShadyCSS === 'object') { window.ShadyCSS.prepareTemplateDom(element, scopeName); } template = new _lit_html_js__WEBPACK_IMPORTED_MODULE_0__["Template"](result, element); templateCache.set(result.strings, template); } return template; }; const TEMPLATE_TYPES = ['html', 'svg']; /** * Removes all style elements from Templates for the given scopeName. */ function removeStylesFromLitTemplates(scopeName) { TEMPLATE_TYPES.forEach((type) => { const templates = _lit_html_js__WEBPACK_IMPORTED_MODULE_0__["templateCaches"].get(getTemplateCacheKey(type, scopeName)); if (templates !== undefined) { templates.forEach((template) => { const { element: { content } } = template; const styles = content.querySelectorAll('style'); Object(_modify_template_js__WEBPACK_IMPORTED_MODULE_1__["removeNodesFromTemplate"])(template, new Set(Array.from(styles))); }); } }); } const shadyRenderSet = new Set(); /** * For the given scope name, ensures that ShadyCSS style scoping is performed. * This is done just once per scope name so the fragment and template cannot * be modified. * (1) extracts styles from the rendered fragment and hands them to ShadyCSS * to be scoped and appended to the document * (2) removes style elements from all lit-html Templates for this scope name. * * Note, ${this.open ? lit_element_1.html `
${this._renderModalBody(props)}
` : lit_element_1.html ``} `; } _handleCloseClick() { this.removeAttribute('open'); this.dispatchEvent(new CustomEvent('close')); } } AbstractModalElement._openModals = []; AbstractModalElement._hiddenElements = new Map(); __decorate([ decorators_1.property({ type: Boolean }) ], AbstractModalElement.prototype, "open", void 0); __decorate([ decorators_1.property({ type: Boolean }) ], AbstractModalElement.prototype, "closable", void 0); __decorate([ decorators_1.property({ type: Boolean }) ], AbstractModalElement.prototype, "exclusive", void 0); __decorate([ decorators_1.property({ type: Number }) ], AbstractModalElement.prototype, "priority", void 0); exports.AbstractModalElement = AbstractModalElement; /***/ }), /***/ "./src/components/abstract-select.ts": /*!*******************************************!*\ !*** ./src/components/abstract-select.ts ***! \*******************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. const autobind_decorator_1 = __webpack_require__(/*! autobind-decorator */ "./node_modules/autobind-decorator/lib/index.js"); const abstract_ui_1 = __webpack_require__(/*! ./abstract-ui */ "./src/components/abstract-ui.ts"); const utils_1 = __webpack_require__(/*! ../utils */ "./src/utils.ts"); const decorators_1 = __webpack_require__(/*! ./decorators */ "./src/components/decorators.ts"); //@ts-ignore const { FlattenedNodesObserver } = __webpack_require__(/*! @polymer/polymer/lib/utils/flattened-nodes-observer.js */ "./node_modules/@polymer/polymer/lib/utils/flattened-nodes-observer.js"); exports.isOptgroupElement = (el) => el && el.tagName === 'ACC-OPTGROUP'; exports.isSelectableElement = (el) => typeof el.selected === 'boolean'; /** * @abstract * AbstractSelectLitElement is an Abstract class and therefore should always be extended * This class manages the [selected] attribute state of all children added into its slot */ class AbstractSelectElement extends abstract_ui_1.AbstractUIElement { constructor() { super(...arguments); /** * hide the label visually, only provide to aria */ this.hideLabel = false; this._nodeChildSelector = 'acc-item'; /** * a map of all nodes */ this._groups = []; /** * a map of observers for optgroup child nodes */ this._groupObservers = []; /** * a map of all nodes, * this map is flattened to include all items nested in a group */ this._nodes = []; } connectedCallback() { super.connectedCallback(); this.__nodesObserver = new FlattenedNodesObserver(this, this._handleNodesObserverUpdate); } disconnectedCallback() { this.__nodesObserver.disconnect(); super.disconnectedCallback(); } /** * Select an element to change the active item. * @param node the node that is to be the selected element */ select(node) { this.__deselectAllNodes(node); if (!node.selected) { const customEvent = { detail: { target: node }, bubbles: true, composed: true }; if (utils_1.isElement(node)) { node.selected = true; //node.setAttribute('selected', 'true'); } this.dispatchEvent(new CustomEvent('select', customEvent)); this.requestRender(); } } get selected() { return this._nodes[this.selectedIndex]; } get selectedIndex() { for (let i = 0; i < this._nodes.length; i++) { const attrValue = this._nodes[i].selected; if (attrValue) { return i; } } return -1; } set selectedIndex(index) { if (this._nodes[index]) { this.select(this._nodes[index]); } } /** * Deselect all nodes, allows for an exemption * @param except optionally provide a single element not to deselect */ __deselectAllNodes(except) { const exceptElement = typeof except === 'number' ? this._nodes[except] : except; for (let i = 0; i < this._nodes.length; i++) { if (this._nodes[i] !== exceptElement) { this._nodes[i].selected = false; } } } _handleSlotNodeChanged(event) { if (exports.isSelectableElement(event.target)) { if (event.target.selected) { this.select(event.target); } } this.requestRender(); } /** * The handler for when nodes are added or removed from the * @param info the description of added and removed nodes in the last change */ _handleNodesObserverUpdate(info) { //remove selectable elements info.removedNodes.forEach(node => exports.isSelectableElement(node) && this._removeNode(node)); //remove optgroups info.removedNodes.forEach(node => exports.isOptgroupElement(node) && this._removeGroup(node)); //add optgroups info.addedNodes.forEach(node => exports.isOptgroupElement(node) && this._addGroup(node)); //add selectable elements info.addedNodes.forEach(node => exports.isSelectableElement(node) && this._addNode(node)); //warn if invalid element found info.addedNodes.filter(node => utils_1.isElement(node) && (!exports.isOptgroupElement(node) && !exports.isSelectableElement(node))).forEach(node => { console.warn(`ignoring element ${node.tagName}, it is not a selectable element`); }); if (this.selectedIndex === -1 && this._nodes.length) { //none are selected //select the first item, that isnt a child of a disabled optgroup for (let i = 0; i < this._nodes.length; i++) { const node = this._nodes[i]; const isDisabledGroup = exports.isOptgroupElement(node.parentElement) && node.parentElement.disabled; if (!isDisabledGroup) { this.select(node); break; } } } this.requestRender(); } /** * Add an element to the select * @param node */ _addGroup(node) { const add = (itemNode) => { if (exports.isSelectableElement(itemNode)) { this._addNode(itemNode); } }; const remove = (itemNode) => { if (exports.isSelectableElement(itemNode)) { this._removeNode(itemNode); } }; const childObserver = new FlattenedNodesObserver(node, (info) => { info.removedNodes.forEach(remove); info.addedNodes.forEach(add); this.requestRender(); }); this._groups.push(node); this._groupObservers.push(childObserver); //we must go through all children nodes and add them to the flat-map //TODO: this doesn't support adding/removing nodes from a group :( for (let itemNode of node.children) { add(itemNode); } } _removeGroup(group) { const index = this._groups.indexOf(group); if (index === -1) { return; } const groupObserver = this._groupObservers[index]; if (!groupObserver) { throw new Error('Has group but does not have observer!'); } for (let itemNode of group.children) { if (exports.isSelectableElement(itemNode)) { this._removeNode(itemNode); } } groupObserver.disconnect(); this._groups.splice(index, 1); this._groupObservers.splice(index, 1); } /** * Add a selectable node * @param node an HTMLElement that has a 'selected' property */ _addNode(node) { if (this._nodes.indexOf(node) > -1) { //already in the map return; } node.addEventListener('change', this._handleSlotNodeChanged); //this._nodes.push(node); this._nodes = Array.from(this.querySelectorAll(this._nodeChildSelector) || []); } _removeNode(node) { const index = this._nodes.indexOf(node); if (index < 0) { return; } this._nodes[index].removeEventListener('change', this._handleSlotNodeChanged); this._nodes.splice(index, 1); } } __decorate([ decorators_1.property({ type: Boolean }) ], AbstractSelectElement.prototype, "hideLabel", void 0); __decorate([ autobind_decorator_1.default ], AbstractSelectElement.prototype, "_handleSlotNodeChanged", null); exports.AbstractSelectElement = AbstractSelectElement; /***/ }), /***/ "./src/components/abstract-ui.ts": /*!***************************************!*\ !*** ./src/components/abstract-ui.ts ***! \***************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); const autobind_decorator_1 = __webpack_require__(/*! autobind-decorator */ "./node_modules/autobind-decorator/lib/index.js"); const utils_1 = __webpack_require__(/*! ./../utils */ "./src/utils.ts"); const keyboard_shortcut_observer_1 = __webpack_require__(/*! ./../keyboard-shortcut-observer */ "./src/keyboard-shortcut-observer.ts"); const lit_element_1 = __webpack_require__(/*! @polymer/lit-element */ "./node_modules/@polymer/lit-element/lit-element.js"); const decorators_1 = __webpack_require__(/*! ./decorators */ "./src/components/decorators.ts"); class AbstractUIElement extends lit_element_1.LitElement { constructor() { super(...arguments); /** * the label for the element, useful for display as well as screen readers */ this.label = ''; /** * disable the element, make it inaccessible */ this.disabled = false; /** * a keyboard shortcut to access the element */ this.shortcut = ''; } connectedCallback() { super.connectedCallback(); this._shortcutObserver = new keyboard_shortcut_observer_1.KeyboardShortcutObserver(this.shortcut, this._handleShortcut); } disconnectedCallback() { this._shortcutObserver.disconnect(); super.disconnectedCallback(); } /** * The function called whenever the keyboard shortcut is performed */ _handleShortcut() { this.dispatchEvent(new CustomEvent('shortcut', { bubbles: true, composed: true })); } _propertiesChanged(props, changed, prev) { if (!changed) { return super._propertiesChanged(props, changed, prev); } //set or update the keyboard shortcut pattern if (typeof changed.shortcut !== 'undefined' && this._shortcutObserver) { this._shortcutObserver.pattern = props.shortcut; } //update whether this UI element is disabled or not if (typeof changed.disabled !== 'undefined') { utils_1.setBooleanAttribute(this, 'disabled', props.disabled); this.setAttribute('aria-hidden', props.disabled); } super._propertiesChanged(props, changed, prev); } } __decorate([ decorators_1.property({ type: String }) ], AbstractUIElement.prototype, "label", void 0); __decorate([ decorators_1.property({ type: Boolean }) ], AbstractUIElement.prototype, "disabled", void 0); __decorate([ decorators_1.property({ type: String }) ], AbstractUIElement.prototype, "shortcut", void 0); __decorate([ autobind_decorator_1.default ], AbstractUIElement.prototype, "_handleShortcut", null); exports.AbstractUIElement = AbstractUIElement; ; /***/ }), /***/ "./src/components/button.ts": /*!**********************************!*\ !*** ./src/components/button.ts ***! \**********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); const abstract_ui_1 = __webpack_require__(/*! ./abstract-ui */ "./src/components/abstract-ui.ts"); const styles_1 = __webpack_require__(/*! ./styles */ "./src/components/styles.ts"); const lit_element_1 = __webpack_require__(/*! @polymer/lit-element */ "./node_modules/@polymer/lit-element/lit-element.js"); const autobind_decorator_1 = __webpack_require__(/*! autobind-decorator */ "./node_modules/autobind-decorator/lib/index.js"); const decorators_1 = __webpack_require__(/*! ./decorators */ "./src/components/decorators.ts"); __webpack_require__(/*! ./icon */ "./src/components/icon.ts"); /** * A `` element. * @example * ```html * * * * ``` */ class ButtonElement extends abstract_ui_1.AbstractUIElement { constructor() { super(...arguments); /** * a src URL for an icon to be shown inside the button */ this.icon = ''; } _handleShortcut() { this._dispatchClick(); super._handleShortcut(); } _dispatchClick() { this.dispatchEvent(new MouseEvent('click')); } focus() { super.focus(); const button = this.shadowRoot.querySelector('button'); if (button) { button.focus(); } } _render({ label, icon }) { return lit_element_1.html ` `; } } __decorate([ decorators_1.property({ type: String }) ], ButtonElement.prototype, "icon", void 0); __decorate([ autobind_decorator_1.default ], ButtonElement.prototype, "_handleShortcut", null); exports.ButtonElement = ButtonElement; customElements.define('acc-button', ButtonElement); /***/ }), /***/ "./src/components/content.ts": /*!***********************************!*\ !*** ./src/components/content.ts ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); const autobind_decorator_1 = __webpack_require__(/*! autobind-decorator */ "./node_modules/autobind-decorator/lib/index.js"); const abstract_ui_1 = __webpack_require__(/*! ./abstract-ui */ "./src/components/abstract-ui.ts"); const utils_1 = __webpack_require__(/*! ./../utils */ "./src/utils.ts"); const lit_element_1 = __webpack_require__(/*! @polymer/lit-element */ "./node_modules/@polymer/lit-element/lit-element.js"); const flattened_nodes_observer_1 = __webpack_require__(/*! @polymer/polymer/lib/utils/flattened-nodes-observer */ "./node_modules/@polymer/polymer/lib/utils/flattened-nodes-observer.js"); const decorators_1 = __webpack_require__(/*! ./decorators */ "./src/components/decorators.ts"); const isFocusable = (el) => el && typeof el.focus === 'function'; const isInputWithCanvas = (c) => typeof c.canvas === 'object' && typeof c.canvas.getContext === 'function'; /** * An `` element is intended as a container for the main content area. * If using an AbstractInput such as `` or `` * the coordinate space will be mapped to this element and can optionally * simplify display of the camera image. * * @example ```html * * * ``` * */ class ContentElement extends abstract_ui_1.AbstractUIElement { constructor() { super(); this.inputSelector = 'acc-input-mode-select'; this.grayscale = false; this.webcamOpacity = 1; this.mounted = false; this.label = this.label || 'content'; } set inputElement(element) { if (this.__inputElement) { this.__inputElement.removeEventListener('tick', this._onTick); } this.__inputElement = element; if (!this.disabled && this.__inputElement) { this.__inputElement.addEventListener('tick', this._onTick); } } get inputElement() { if (!this.__inputElement) { this.inputElement = document.querySelector(this.inputSelector); } return this.__inputElement; } connectedCallback() { super.connectedCallback(); //this calls the getter attempting to find the element const poll = () => { if (!this.inputElement) { setTimeout(poll, 10); } }; poll(); window.addEventListener('resize', this._onResize); this.__nodesObserver = new flattened_nodes_observer_1.FlattenedNodesObserver(this, (items) => { items.addedNodes.forEach((node) => this._onAddNode(node)); }); } disconnectedCallback() { this.__nodesObserver.disconnect(); window.removeEventListener('resize', this._onResize); super.disconnectedCallback(); } _handleShortcut() { for (let child of this.children) { if (isFocusable(child)) { child.focus(); super._handleShortcut(); return; } } //found none, so focus itself this.focus(); super._handleShortcut(); } _propertiesChanged(props, changedProps, prevProps) { if (!changedProps) { return; } super._propertiesChanged(props, changedProps, prevProps); utils_1.setBooleanAttribute(this, 'grayscale', props.grayscale); utils_1.setBooleanAttribute(this, 'webcam', props.webcam); utils_1.setBooleanAttribute(this, 'mounted', props.mounted); if (props.disabled !== prevProps.disabled) { if (props.disabled && this.__inputElement) { this.__inputElement.removeEventListener('tick', this._onTick); } else if (this.__inputElement) { this.__inputElement.addEventListener('tick', this._onTick); } } } _onResize() { const wrapper = this.shadowRoot.querySelector('.wrapper'); wrapper.style.height = `${window.innerHeight}px`; wrapper.style.width = this.__calcWidth(); this._updateWebcamCanvas(); //send a non-bubbling (contained) event that it did resize this.dispatchEvent(new CustomEvent('resize', { bubbles: false })); } _onTick(event) { const input = event.target; const { __bgCtx } = this; if (isInputWithCanvas(input) && this.webcamOpacity > 0) { if (__bgCtx.canvas.width === 0) { const cw = this.clientWidth; const ch = this.clientHeight; if (cw === 0 || ch === 0) { return; } __bgCtx.canvas.width = cw; __bgCtx.canvas.height = ch; } //RENDER THE WEBCAM TO CANVAS IF IT EXISTS //const camScale = scaleToFill(1240, 930, __bgCtx.canvas.width, __bgCtx.canvas.height); const camScale = utils_1.scaleToFill(input.canvas.width, input.canvas.height, __bgCtx.canvas.width, __bgCtx.canvas.height); __bgCtx.drawImage(input.canvas, camScale.left, camScale.top, camScale.width, camScale.height); } else { //if theres no webcam then clear it, keep it empty __bgCtx.clearRect(0, 0, __bgCtx.canvas.width, __bgCtx.canvas.height); } } _onAddNode(node) { if (utils_1.isElement(node) && node.tagName === 'CANVAS') { const canvas = node; canvas.contentEditable = 'true'; canvas.tabIndex = 0; } } __calcWidth() { let width = ''; if (this.mounted) { const panel = document.querySelector('acc-side-panel'); if (panel) { width = `${window.innerWidth - panel.clientWidth}px`; } else { width = '100%'; } } else { width = 'inherit'; } return width; } _updateWebcamCanvas() { const canvas = this.shadowRoot.querySelector('.webcam-canvas'); canvas.width = this.clientWidth; canvas.height = this.clientHeight; this.__bgCtx = canvas.getContext('2d'); } _didRender(props, changedProps, prevProps) { this.childNodes.forEach((node) => this._onAddNode(node)); this._updateWebcamCanvas(); return super._didRender(props, changedProps, prevProps); } _render({ label, webcamOpacity }) { return lit_element_1.html `
`; } } __decorate([ decorators_1.property({ type: String }) ], ContentElement.prototype, "inputSelector", void 0); __decorate([ decorators_1.property({ type: Boolean }) ], ContentElement.prototype, "grayscale", void 0); __decorate([ decorators_1.property({ type: Number }) ], ContentElement.prototype, "webcamOpacity", void 0); __decorate([ decorators_1.property({ type: Boolean }) ], ContentElement.prototype, "mounted", void 0); __decorate([ autobind_decorator_1.default ], ContentElement.prototype, "_handleShortcut", null); __decorate([ autobind_decorator_1.default ], ContentElement.prototype, "_onResize", null); __decorate([ autobind_decorator_1.default ], ContentElement.prototype, "_onTick", null); exports.ContentElement = ContentElement; customElements.define('acc-content', ContentElement); /***/ }), /***/ "./src/components/decorators.ts": /*!**************************************!*\ !*** ./src/components/decorators.ts ***! \**************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. Object.defineProperty(exports, "__esModule", { value: true }); /** * A TypeScript class decorator factory that registers the class as a custom * element. * * If `tagname` is provided, it will be used as the custom element name, and * will be assigned to the class static `is` property. If `tagname` is omitted, * the static `is` property of the class will be used instead. If neither exist, * or if both exist but have different values (except in the case that the `is` * property is not an own-property of the class), an exception is thrown. */ function customElement(tagname) { return (class_) => { if (tagname) { // Only check that tag names match when `is` is our own property. It might // be inherited from a superclass, in which case it's ok if they're // different, and we'll override it with our own property below. if (class_.hasOwnProperty('is')) { if (tagname !== class_.is) { throw new Error(`custom element tag names do not match: ` + `(${tagname} !== ${class_.is})`); } } else { Object.defineProperty(class_, 'is', { value: tagname }); } } // Throws if tag name is missing or invalid. window.customElements.define(class_.is, class_); }; } exports.customElement = customElement; function createProperty(proto, name, options) { if (!proto.constructor.hasOwnProperty('properties')) { Object.defineProperty(proto.constructor, 'properties', { value: {} }); } const finalOpts = Object.assign({}, proto.constructor.properties[name], options); if (!finalOpts.type) { console.error(`A type could not be found for ${name}. ` + 'Set a type or configure Metadata Reflection API support.'); } proto.constructor.properties[name] = finalOpts; } /** * A TypeScript property decorator factory that defines this as a Polymer * property. * * This function must be invoked to return a decorator. */ function property(options) { return (proto, propName) => { createProperty(proto, propName, options); }; } exports.property = property; /** * A TypeScript property decorator factory that converts a class property into * a getter that executes a querySelector on the element's shadow root. * * By annotating the property with the correct type, elements can have * type-checked access to internal elements. * * This function must be invoked to return a decorator. */ exports.query = _query((target, selector) => target.querySelector(selector)); /** * A TypeScript property decorator factory that converts a class property into * a getter that executes a querySelectorAll on the element's shadow root. * * By annotating the property with the correct type, elements can have * type-checked access to internal elements. The type should be NodeList * with the correct type argument. * * This function must be invoked to return a decorator. */ exports.queryAll = _query((target, selector) => target.querySelectorAll(selector)); /** * Creates a decorator function that accepts a selector, and replaces a * property with a getter than executes the selector with the given queryFn * * @param queryFn A function that executes a query with a selector */ function _query(queryFn) { return (selector) => (proto, propName) => { Object.defineProperty(proto, propName, { get() { return queryFn(this.shadowRoot, selector); }, enumerable: true, configurable: true, }); }; } /***/ }), /***/ "./src/components/group.ts": /*!*********************************!*\ !*** ./src/components/group.ts ***! \*********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); const abstract_ui_1 = __webpack_require__(/*! ./abstract-ui */ "./src/components/abstract-ui.ts"); const lit_element_1 = __webpack_require__(/*! @polymer/lit-element */ "./node_modules/@polymer/lit-element/lit-element.js"); const styles_1 = __webpack_require__(/*! ./styles */ "./src/components/styles.ts"); const decorators_1 = __webpack_require__(/*! ./decorators */ "./src/components/decorators.ts"); const autobind_decorator_1 = __webpack_require__(/*! autobind-decorator */ "./node_modules/autobind-decorator/lib/index.js"); const queries = [ (v) => v, (v) => `acc-${v}`, (v) => `[name="${v}" i]`, (v) => `[label="${v}" i]`, (v) => `[value="${v}" i]`, (v) => `.${v}`, (v) => `#${v}` ]; const extractValue = (el) => { if (el.value) { if (typeof el.value === 'string') { if (el.value.toLowerCase() === 'true') { return true; } else if (el.value.toLowerCase() === 'false') { return false; } else if (isFinite(parseInt(el.value, 10))) { return parseInt(el.value, 10); } } return el.value; } if (el.selected) { if (el.selected.value) { return el.selected.value; } return el.selected; } return null; }; /** * A `` element. Make a group (typically within side-panel) of related * controls. Provides proper headings and aria-labels and consistent focusing. * * @example ```html * * * * ``` */ class GroupElement extends abstract_ui_1.AbstractUIElement { constructor() { super(...arguments); /** * hide the label of the group, only provide for aria */ this.hideLabel = false; } _handleShortcut() { this.focus(); super._handleShortcut(); } focus() { super.focus(); if (this.disabled) { return; } const h2 = this.shadowRoot.querySelector('h2'); if (h2) { h2.focus(); } } getValue(name) { const el = this.query(name); if (!el) { return null; } return extractValue(el); } query(name, eventType, eventHandler) { const _query = () => { let i = 0; while (i < queries.length) { const el = this.querySelector(queries[i](name)); if (el !== null) { return el; } i++; } const find = (baseElement, query) => { const asAny = baseElement; if (asAny.value && asAny.value.toLowerCase && asAny.value.toLowerCase() === query.toLowerCase()) { return baseElement; } else if (asAny.label && asAny.label.toLowerCase && asAny.label.toLowerCase() === query.toLowerCase()) { return baseElement; } let found = null; for (let child of baseElement.children) { found = find(child, query); if (found) { return found; } } }; return find(this, name); }; const element = _query(); if (element && typeof eventType === 'string' && typeof eventHandler === 'function') { element.addEventListener(eventType, eventHandler); } return element; } _render({ label, disabled }) { return lit_element_1.html `
${(!this.hideLabel && this.label && this.label != '') ? lit_element_1.html `

${label}

` : ''}
`; } } __decorate([ decorators_1.property({ type: Boolean }) ], GroupElement.prototype, "hideLabel", void 0); __decorate([ autobind_decorator_1.default ], GroupElement.prototype, "_handleShortcut", null); exports.GroupElement = GroupElement; customElements.define('acc-group', GroupElement); /***/ }), /***/ "./src/components/icon.ts": /*!********************************!*\ !*** ./src/components/icon.ts ***! \********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. Object.defineProperty(exports, "__esModule", { value: true }); const styles_1 = __webpack_require__(/*! ./styles */ "./src/components/styles.ts"); const lit_element_1 = __webpack_require__(/*! @polymer/lit-element */ "./node_modules/@polymer/lit-element/lit-element.js"); const icons = { // Hamburger menu: ` `, // X icon close: ` `, // Downward arrow, like for select down: ` `, // External Link Icon - square with an arrow link: ` `, // Next Arrow, like for a tutorial next: ``, // Previous Arrow, like for a tutorial previous: `` }; class IconElement extends lit_element_1.LitElement { constructor() { super(); this.icon = ''; this._iconElement = document.createElement('i'); } static get properties() { return { icon: String }; } // _propertiesChanged(props:any){ /*console.log(props.icon) if (icons[props.icon]){ this._iconElement.innerHTML = icons[props.icon] this.setAttribute('aria-label', props.icon) // this.requestRender() }*/ // } _render() { if (icons[this.icon]) { this._iconElement.innerHTML = icons[this.icon]; this.setAttribute('aria-label', this.icon); } return lit_element_1.html ` ${this._iconElement} `; } } customElements.define('acc-icon', IconElement); /***/ }), /***/ "./src/components/input-mode-select.ts": /*!*********************************************!*\ !*** ./src/components/input-mode-select.ts ***! \*********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); const styles_1 = __webpack_require__(/*! ./styles */ "./src/components/styles.ts"); const lit_element_1 = __webpack_require__(/*! @polymer/lit-element */ "./node_modules/@polymer/lit-element/lit-element.js"); const abstract_select_1 = __webpack_require__(/*! ./abstract-select */ "./src/components/abstract-select.ts"); const decorators_1 = __webpack_require__(/*! ./decorators */ "./src/components/decorators.ts"); /** * An `` element creates a UI element for selecting an input * method. It bundles proper initialization, event bubbling, access to calibration * and messaging. * * @example ```html * * * * * * ``` */ class InputModeSelectElement extends abstract_select_1.AbstractSelectElement { constructor() { super(); /** * provide a selector for the content element the input is applied to */ this.contentSelector = 'body'; //'acc-content'; this._nodeChildSelector = '*'; this.label = this.label || 'Tracking'; } set contentElement(element) { this.items.forEach(item => { item.contentElement = element; }); } get contentElement() { return this.selected && this.selected.contentElement; } get items() { return this._nodes; } get selected() { return super.selected; } get value() { return this.selected ? this.selected.inputType : undefined; } select(node) { super.select(node); } showCameraSettings() { this._handleOptionsClicked(true); } _propertiesChanged(props, changedProps, prevProps) { super._propertiesChanged(props, changedProps, prevProps); if (changedProps && changedProps.contentSelector) { this.items.forEach((item => { item.contentSelector = props.target; })); } } _handleOptionsClicked(showExternally = false) { this.selected.controls = !this.selected.controls; if (this.selected.controls) { const onControlsClose = () => { this.selected.removeEventListener('controlsclose', onControlsClose); //set focus back to settings button const settingsButton = this.shadowRoot.querySelector('.settings'); if (settingsButton && !showExternally) { settingsButton.focus(); } }; this.selected.addEventListener('controlsclose', onControlsClose); } } _addNode(node) { if (this.contentElement) { node.contentElement = this.contentElement; } else { node.contentSelector = this.contentSelector; } super._addNode(node); } _render({ label, hideLabel }) { const sI = this.selectedIndex; const hasControls = this.selected && this.selected.hasControls; const self = this; function onSelectInput(e) { //'this' scope is the select box self.select(self.items[this.selectedIndex]); } return lit_element_1.html ` ${hideLabel ? '' : lit_element_1.html ``}
`; } } __decorate([ decorators_1.property({ type: String }) ], InputModeSelectElement.prototype, "contentSelector", void 0); exports.InputModeSelectElement = InputModeSelectElement; customElements.define('acc-input-mode-select', InputModeSelectElement); /***/ }), /***/ "./src/components/item.ts": /*!********************************!*\ !*** ./src/components/item.ts ***! \********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); const lit_element_1 = __webpack_require__(/*! @polymer/lit-element */ "./node_modules/@polymer/lit-element/lit-element.js"); const decorators_1 = __webpack_require__(/*! ./decorators */ "./src/components/decorators.ts"); /** * * An HTML tag to reprsent a selectable item, * The parent element renders this item into its shadow-dom */ class ItemElement extends lit_element_1.LitElement { constructor() { super(...arguments); this.icon = ''; this.name = ''; this.label = ''; this.value = ''; this.selected = false; this.disabled = false; } _propertiesChanged(props, changed, previous) { if (changed) { this.dispatchEvent(new CustomEvent('change', { detail: { changed, previous } })); } return super._propertiesChanged(props, changed, previous); } _render(_props) { return lit_element_1.html ``; } } __decorate([ decorators_1.property({ type: String }) ], ItemElement.prototype, "icon", void 0); __decorate([ decorators_1.property({ type: String }) ], ItemElement.prototype, "name", void 0); __decorate([ decorators_1.property({ type: String }) ], ItemElement.prototype, "label", void 0); __decorate([ decorators_1.property({ type: String }) ], ItemElement.prototype, "value", void 0); __decorate([ decorators_1.property({ type: Boolean }) ], ItemElement.prototype, "selected", void 0); __decorate([ decorators_1.property({ type: Boolean }) ], ItemElement.prototype, "disabled", void 0); exports.ItemElement = ItemElement; customElements.define('acc-item', ItemElement); /***/ }), /***/ "./src/components/mouse-input-calibration.ts": /*!***************************************************!*\ !*** ./src/components/mouse-input-calibration.ts ***! \***************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. Object.defineProperty(exports, "__esModule", { value: true }); const lit_element_1 = __webpack_require__(/*! @polymer/lit-element */ "./node_modules/@polymer/lit-element/lit-element.js"); const abstract_modal_1 = __webpack_require__(/*! ./abstract-modal */ "./src/components/abstract-modal.ts"); class MouseInputCalibrationElement extends abstract_modal_1.AbstractModalElement { _renderModalBody(props) { return lit_element_1.html `

Mouse Input

placeholder

`; } } customElements.define('acc-mouse-input-calibration', MouseInputCalibrationElement); /***/ }), /***/ "./src/components/mouse-input.ts": /*!***************************************!*\ !*** ./src/components/mouse-input.ts ***! \***************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const autobind_decorator_1 = __webpack_require__(/*! autobind-decorator */ "./node_modules/autobind-decorator/lib/index.js"); const utils_1 = __webpack_require__(/*! ./../utils */ "./src/utils.ts"); const lit_element_1 = __webpack_require__(/*! @polymer/lit-element */ "./node_modules/@polymer/lit-element/lit-element.js"); const utils_2 = __webpack_require__(/*! ../utils */ "./src/utils.ts"); const decorators_1 = __webpack_require__(/*! ./decorators */ "./src/components/decorators.ts"); const abstract_input_1 = __webpack_require__(/*! ./abstract-input */ "./src/components/abstract-input.ts"); const mouse_position_1 = __webpack_require__(/*! ../mouse-position */ "./src/mouse-position.ts"); const animitter = __webpack_require__(/*! animitter */ "./node_modules/animitter/index.js"); var MouseKeyboardInputMode; (function (MouseKeyboardInputMode) { MouseKeyboardInputMode[MouseKeyboardInputMode["MOUSE"] = 0] = "MOUSE"; MouseKeyboardInputMode[MouseKeyboardInputMode["KEYBOARD"] = 1] = "KEYBOARD"; MouseKeyboardInputMode[MouseKeyboardInputMode["TOUCH"] = 2] = "TOUCH"; })(MouseKeyboardInputMode || (MouseKeyboardInputMode = {})); /** * A Mouse Input element binds mouse, keyboard and touch as a single method * of translating a cursor position. * * @see InputModeSelectElement */ class MouseInputElement extends abstract_input_1.AbstractInputElement { constructor() { super(); this.label = 'Keyboard / Mouse'; this.inputType = 'mouse'; this.pressed = false; this.amplification = 1; this.enableKeyboard = false; this.disableTouchPreventsDefault = false; this._loop = animitter(); //used to determine if pressed is dirty and should be announced this.__lastDispatchedPressed = false; this._loop.on('update', this._dispatchTick); this._loop.on('start', () => console.log('loop started')); } get mode() { switch (this.__mode) { case MouseKeyboardInputMode.KEYBOARD: return 'keyboard'; case MouseKeyboardInputMode.TOUCH: return 'touch'; default: return 'mouse'; } } __handleKeyDown(event) { if (!this.contentElement || !this.enableKeyboard) { return; } let contWidth = this.contentElement.clientWidth; let contHeight = this.contentElement.clientHeight; if (!contWidth || !contHeight) { const bcr = this.contentElement.getBoundingClientRect(); contWidth = bcr.width; contHeight = bcr.height; } if (!contWidth || !contHeight) { return; } //times 2 because its from -1 to 1 const mag = this.amplification / Math.min(contWidth, contHeight) * 2; this.pressed = false; if (!isFinite(this._lastFoundPosition[0] + this._lastFoundPosition[1])) { this._lastFoundPosition[0] = 0; this._lastFoundPosition[1] = 0; } let changed = false; switch (event.keyCode) { case 37: //left this._lastFoundTargetPosition[0] -= this.amplification; this._lastFoundPosition[0] -= mag; changed = true; break; case 38: //up this._lastFoundTargetPosition[1] -= this.amplification; this._lastFoundPosition[1] -= mag; changed = true; break; case 39: //right this._lastFoundTargetPosition[0] += this.amplification; this._lastFoundPosition[0] += mag; changed = true; break; case 40: //down this._lastFoundTargetPosition[1] += this.amplification; this._lastFoundPosition[1] += mag; changed = true; break; } if (changed) { this.__mode = MouseKeyboardInputMode.KEYBOARD; } if (!this.disableClamp) { this._lastFoundTargetPosition[0] = utils_1.clamp(this._lastFoundTargetPosition[0], 0, contWidth); this._lastFoundTargetPosition[1] = utils_1.clamp(this._lastFoundTargetPosition[1], 0, contHeight); } // this._lastFoundPosition[0] = clamp(this._lastFoundPosition[0], -1, 1); // this._lastFoundPosition[1] = clamp(this._lastFoundPosition[1], -1, 1); } _handleMouseMove(event) { const point = mouse_position_1.mousePositionFromEvent(event, this.contentElement); if (!this.disableTouchPreventsDefault && event.type.indexOf('mouse') === -1) { event.preventDefault(); } //mouse this.pressed = event.buttons > 0; this.__mode = MouseKeyboardInputMode.MOUSE; //touch if (event.type.indexOf('touch') === 0) { this.__mode = MouseKeyboardInputMode.TOUCH; if (event.type === 'touchend') { this.pressed = false; } else { this.pressed = true; } } if (isFinite(point.x) && isFinite(point.y)) { const bcr = this.contentElement.getBoundingClientRect(); const x = utils_2.scalemap(point.x, 0, bcr.width, -1, 1); const y = utils_2.scalemap(point.y, 0, bcr.height, -1, 1); this._lastFoundTargetPosition[0] = point.x; this._lastFoundTargetPosition[1] = point.y; this._lastFoundPosition[0] = x; this._lastFoundPosition[1] = y; } } initialize() { return __awaiter(this, void 0, void 0, function* () { if (this.isReady) { return; } this._dispatchInitializing(); return Promise.resolve() .then(() => { this.__start(); return this; }); }); } _render({ controls }) { return lit_element_1.html ` this.removeAttribute('controls')} open?=${controls}> `; } _shouldDispatchInput() { const should = this.pressed !== this.__lastDispatchedPressed || super._shouldDispatchInput(); this.__lastDispatchedPressed = this.pressed; return should; } __start() { this.__addEvents(); this._dispatchReady(); this._loop.start(); } _handleContentElementChanged(contentElement, previous) { this.__removeEvents(previous); this.__addEvents(); } __addEvents() { if (this.contentElement) { [ 'mousedown', 'mousemove', 'mouseup', 'touchstart', 'touchmove', 'touchend' ].forEach((eventType) => this.contentElement.addEventListener(eventType, this._handleMouseMove)); this.contentElement.addEventListener('keydown', this.__handleKeyDown); } } __removeEvents(element = this.contentElement) { if (element) { [ 'mousedown', 'mousemove', 'mouseup', 'touchstart', 'touchmove', 'touchend' ].forEach((eventType) => element.removeEventListener(eventType, this._handleMouseMove)); element.removeEventListener('keydown', this.__handleKeyDown); } } stop() { this.__removeEvents(); this._loop.stop(); this._dispatchStop(); } } __decorate([ decorators_1.property({ type: String }) ], MouseInputElement.prototype, "label", void 0); __decorate([ decorators_1.property({ type: Number }) ], MouseInputElement.prototype, "amplification", void 0); __decorate([ decorators_1.property({ type: Boolean }) ], MouseInputElement.prototype, "enableKeyboard", void 0); __decorate([ decorators_1.property({ type: Boolean }) ], MouseInputElement.prototype, "disableTouchPreventsDefault", void 0); __decorate([ autobind_decorator_1.default ], MouseInputElement.prototype, "__handleKeyDown", null); __decorate([ autobind_decorator_1.default ], MouseInputElement.prototype, "_handleMouseMove", null); customElements.define('acc-mouse-input', MouseInputElement); /***/ }), /***/ "./src/components/optgroup.ts": /*!************************************!*\ !*** ./src/components/optgroup.ts ***! \************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); const lit_element_1 = __webpack_require__(/*! @polymer/lit-element */ "./node_modules/@polymer/lit-element/lit-element.js"); const decorators_1 = __webpack_require__(/*! ./decorators */ "./src/components/decorators.ts"); /** * `` is an element to designate a group within an * @example ```html * * * * * * * * * * * * ``` */ class OptgroupElement extends lit_element_1.LitElement { constructor() { super(...arguments); this.label = ''; this.disabled = false; } _render({ label }) { return lit_element_1.html ` ${label} `; } } __decorate([ decorators_1.property({ type: String }) ], OptgroupElement.prototype, "label", void 0); __decorate([ decorators_1.property({ type: Boolean }) ], OptgroupElement.prototype, "disabled", void 0); exports.OptgroupElement = OptgroupElement; customElements.define('acc-optgroup', OptgroupElement); /***/ }), /***/ "./src/components/pose-input-calibration.ts": /*!**************************************************!*\ !*** ./src/components/pose-input-calibration.ts ***! \**************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); const styles_1 = __webpack_require__(/*! ./styles */ "./src/components/styles.ts"); const lit_element_1 = __webpack_require__(/*! @polymer/lit-element */ "./node_modules/@polymer/lit-element/lit-element.js"); const abstract_modal_1 = __webpack_require__(/*! ./abstract-modal */ "./src/components/abstract-modal.ts"); const decorators_1 = __webpack_require__(/*! ./decorators */ "./src/components/decorators.ts"); __webpack_require__(/*! ./range */ "./src/components/range.ts"); const computeStyleResults = (parent, map) => { const result = {}; //compute our accent color by applying it to a temp element const _tmpEl = document.createElement('div'); _tmpEl.style.display = 'none'; Object.assign(_tmpEl.style, map); parent.appendChild(_tmpEl); const computedStyle = window.getComputedStyle(_tmpEl); for (let key in map) { result[key] = computedStyle[key]; } _tmpEl.parentElement && _tmpEl.parentElement.removeChild(_tmpEl); return result; }; const options = (parts, selectedPart) => parts.map((part, i) => lit_element_1.html ``); const hasHost = (v) => v && typeof v.host !== 'undefined'; class PoseInputCalibrationElement extends abstract_modal_1.AbstractModalElement { constructor() { super(); this.amplification = 1; this.smoothing = 0; this.parts = []; this.imageScaleFactor = 0.5; this.inputSelector = 'acc-pose-input'; //we will retrieve this using window.getComputedStyle(element) this.__accentColor = 'white'; this.__centerColor = 'white'; this._onTick = this._onTick.bind(this); } focusHeader() { const header = this.shadowRoot.querySelector('#header'); if (header) { header.focus(); } } _onTick(event) { if (!this.__ctx || !this.__content) { return; } const { __ctx } = this; const input = event.target; __ctx.canvas.width = this.__content.clientWidth; __ctx.canvas.height = this.__content.clientHeight; //__ctx.clearRect(0, 0, __ctx.canvas.width, __ctx.canvas.height); __ctx.lineWidth = 1; input.renderInputData(__ctx); input.renderCenter(__ctx, this.__centerColor); input.renderCursor(__ctx, this.__accentColor); } _propertiesChanged(props, changed, prev) { if (changed && typeof changed.open === 'boolean') { // let inputElement: PoseInputElement; // if (hasHost(this.parentNode)) { // inputElement = this.parentNode.host as PoseInputElement; // } if (changed.open && this.inputElement) { // the pose input element this.inputElement.addEventListener('tick', this._onTick); } else if (this.inputElement) { this.inputElement.removeEventListener('tick', this._onTick); } } return super._propertiesChanged(props, changed, prev); } _firstRendered() { setTimeout(() => { //compute our accent color by applying it to a temp element const { backgroundColor, color } = computeStyleResults(this.shadowRoot, { backgroundColor: styles_1.accentColor, color: styles_1.labelColor }); this.__accentColor = backgroundColor; this.__centerColor = color; this.inputElement = document.querySelector(this.inputSelector); if (this.inputElement && this.open) { this.inputElement.addEventListener('tick', this._onTick); } }, 16); super._firstRendered(); } _didRender(props, changed, prev) { const content = this.shadowRoot.querySelector('acc-content'); if (content && hasHost(this.parentNode)) { this.__content = content; content.inputElement = this.parentNode.host; } const canvas = this.shadowRoot.querySelector('#input-visualization'); if (changed && changed.amplification) { const range = this.shadowRoot.querySelector('acc-range'); if (range) { range.focus(); } } if (!canvas) { return; } this.__ctx = canvas.getContext('2d'); return super._didRender(props, changed, prev); } _renderModalBody(props) { const self = this; const dispatch = (eventType = 'change', composed = false) => { self.dispatchEvent(new CustomEvent(eventType, { detail: { target: self, part: self.part, amplification: self.amplification, imageScaleFactor: self.imageScaleFactor, smoothing: self.smoothing }, composed, bubbles: composed })); }; function onSelectInput(e) { //const selectedPart = self.parts[this.selectedIndex]; const selectedPart = e.detail.value; //'this' scope is the select box if (this.id === 'part') { self.part = selectedPart; } console.log('self.part: ' + self.part); dispatch(); //dispatch('center'); } function onScaleInput(e) { self.imageScaleFactor = Number(this.value); dispatch(); } function onSmoothing(e) { self.smoothing = Number(this.value); dispatch(); } function onAmplification(e) { self.amplification = parseFloat(this.value); dispatch(); const ampEl = self.shadowRoot.querySelector('.amp-value'); if (ampEl) { ampEl.innerHTML = `${self.amplification.toFixed(1)}x`; } } return lit_element_1.html `
Visualization of body tracking data.
${options(this.parts, this.part)}
${this.amplification.toFixed(1)}x
dispatch('center', true)}> | dispatch('resetcenter', true)}>
this._handleCloseClick()}>
`; } _shouldRender(props, changed, prev) { if (!changed) { return super._shouldRender(props, changed, prev); } const keys = Object.keys(changed); const justAmp = (keys.length === 1 && changed.amplification); if (justAmp || (keys.length < 3 && changed.part && changed.amplification)) { return false; } return super._shouldRender(props, changed, prev); } } __decorate([ decorators_1.property({ type: Number }) ], PoseInputCalibrationElement.prototype, "amplification", void 0); __decorate([ decorators_1.property({ type: Number }) ], PoseInputCalibrationElement.prototype, "smoothing", void 0); __decorate([ decorators_1.property({ type: String }) ], PoseInputCalibrationElement.prototype, "part", void 0); __decorate([ decorators_1.property({ type: Array }) ], PoseInputCalibrationElement.prototype, "parts", void 0); __decorate([ decorators_1.property({ type: Number }) ], PoseInputCalibrationElement.prototype, "imageScaleFactor", void 0); __decorate([ decorators_1.property({ type: String }) ], PoseInputCalibrationElement.prototype, "inputSelector", void 0); // { dispatch('center'); return false; }}>Use current position | // { dispatch('center'); return false;}}>Reset centerpoint customElements.define('acc-pose-input-calibration', PoseInputCalibrationElement); /***/ }), /***/ "./src/components/pose-input.ts": /*!**************************************!*\ !*** ./src/components/pose-input.ts ***! \**************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const autobind_decorator_1 = __webpack_require__(/*! autobind-decorator */ "./node_modules/autobind-decorator/lib/index.js"); const posenet = __webpack_require__(/*! @tensorflow-models/posenet */ "./node_modules/@tensorflow-models/posenet/dist/posenet.esm.js"); const styles_1 = __webpack_require__(/*! ./styles */ "./src/components/styles.ts"); const utils_1 = __webpack_require__(/*! ./../utils */ "./src/utils.ts"); const vec2_1 = __webpack_require__(/*! ./../vec2 */ "./src/vec2.ts"); const utils_2 = __webpack_require__(/*! ./../utils */ "./src/utils.ts"); const lit_element_1 = __webpack_require__(/*! @polymer/lit-element */ "./node_modules/@polymer/lit-element/lit-element.js"); const input_event_1 = __webpack_require__(/*! ../events/input-event */ "./src/events/input-event.ts"); const abstract_input_1 = __webpack_require__(/*! ./abstract-input */ "./src/components/abstract-input.ts"); const webcam_1 = __webpack_require__(/*! ../webcam */ "./src/webcam.ts"); const utils_3 = __webpack_require__(/*! ../utils */ "./src/utils.ts"); const decorators_1 = __webpack_require__(/*! ./decorators */ "./src/components/decorators.ts"); __webpack_require__(/*! ./tutorial */ "./src/components/tutorial.ts"); const animitter = __webpack_require__(/*! animitter */ "./node_modules/animitter/index.js"); /** * used in order to focus on calibration panel header without strict casting * @param c */ const canFocusHeader = (c) => typeof c.focusHeader === 'function'; /** * is an element that has width and height attributes like canvas or image * @param v */ const isPixelResolutionElement = (v) => typeof v.width === 'number' && v.height === 'number'; /** * Get the dimensions of the provided element * @param element an Element to get the dimensions of * @param result optionally provide an array to fill as a vector to reduce garbage */ const getElementDimensions = (element, result = [0, 0]) => { if (isPixelResolutionElement(element)) { result[0] = element.width; result[1] = element.height; return result; } if (Math.min(element.clientWidth, element.clientHeight) > 0) { result[0] = element.clientWidth; result[1] = element.clientHeight; return result; } const bcr = element.getBoundingClientRect(); if (Math.min(bcr.width, bcr.height) > 0) { result[0] = bcr.width; result[1] = bcr.height; return result; } return result; }; const _tmpVec2 = [NaN, NaN]; const _tmpScaleBounds = {}; /** * mutate the provided points to be scaled and offset to the destination canvas * @param {*} canvas * @param {Array<[number,number]>} nestedPoints * @param {*} result */ exports.transformCameraPoints = (inWidth, inHeight, outWidth, outHeight, nestedPoints) => { const { scale, left, top } = utils_2.scaleToFill(inWidth, inHeight, outWidth, outHeight, 0, _tmpScaleBounds); for (let i = 0; i < nestedPoints.length; i++) { const point = nestedPoints[i]; let [x, y] = point; x *= scale; y *= scale; x += left; y += top; point[0] = x; point[1] = y; } return nestedPoints; }; const keypointPartsMap = { 'nose': 'Nose', 'leftEye': 'Right Eye', 'rightEye': 'Left Eye', 'leftEar': 'Right Ear', 'rightEar': 'Left Ear', 'leftShoulder': 'Right Shoulder', 'rightShoulder': 'Left Shoulder', 'leftElbow': 'Right Elbow', 'rightElbow': 'Left Elbow', 'leftWrist': 'Right Wrist', 'rightWrist': 'Left Wrist', 'leftHip': 'Right Hip', 'rightHip': 'Left Hip', 'leftKnee': 'Right Knee', 'rightKnee': 'Left Knee', 'leftAnkle': 'Right Ankle', 'rightAnkle': 'Left Ankle' }; //pre-defined parts that come with posenet exports.keypointParts = [ 'nose', 'leftEye', 'rightEye', 'leftEar', 'rightEar', 'leftShoulder', 'rightShoulder', 'leftElbow', 'rightElbow', 'leftWrist', 'rightWrist', 'leftHip', 'rightHip', 'leftKnee', 'rightKnee', 'leftAnkle', 'rightAnkle' ]; const selectableParts = [ 'nose', 'leftWrist', 'rightWrist', 'leftElbow', 'rightElbow', 'leftKnee', 'rightKnee', 'leftAnkle', 'rightAnkle' ]; const selectablePartsDisplay = selectableParts.map(key => keypointPartsMap[key]); //all parts exports.parts = exports.keypointParts; class ACCPoseInputEvent extends input_event_1.ACCInputEvent { constructor(type, eventInit) { super(type, eventInit); } } exports.ACCPoseInputEvent = ACCPoseInputEvent; // let constraints = { // audio: false, // video: { // advanced: [ // { width: { exact: 400 } }, // { height: { exact: 400 } }, // ] // } // } const _tmpContentDims = [NaN, NaN]; /** * `` element easily adds PoseNet based tracking for controlling * the cursor position on a webpage with a chosen body part of the user. * For example with a couple lines of code, a user's nose can be used to control * a webpage. * * @example ```html * * * ``` */ class PoseInputElement extends abstract_input_1.AbstractInputElement { constructor() { super(); this.label = 'Body'; this.inputType = 'pose'; this.preamplifiedTargetPosition = [0, 0]; this.amplification = 1; this.bodyPart = 'nose'; this.target = ''; this.multiplier = 1.01; //0.75; this.imageScaleFactor = 0.33; /** * show the help modal, has priority over controls */ this.help = false; this.keypointEase = 0.5; this._webcamCanvas = new webcam_1.WebcamCanvas(); this._loop = animitter(); /** * holds a dictionary of all tracked keypoints, in source (webcam) coordinates * points are all eased by keypointEase */ this.__easedKeypointMap = {}; this.__lastSourcePosition = [0, 0]; this._loop.on('update', this._handleNewFrame); this._loop.on('start', this._dispatchReady); this._loop.on('stop', this._handleStop); } /** * this input has a cointrols panel */ get hasControls() { return true; } /** * overriding AbstractInputElement#_createEvent to provide extra details * @param type * @param bubbles * @param composed */ _createEvent(type, bubbles = true, composed = true) { const eventInit = { detail: { inputType: this.inputType, position: this.position, bodyPart: this.bodyPart, pose: this.pose, }, bubbles, //send outside of shadow to parent element composed }; return new input_event_1.ACCInputEvent(type, eventInit); } computePartPosition(part, result = [NaN, NaN]) { if (!this.pose || !this.pose.keypoints) { result[0] = result[1] = NaN; return result; } let x; let y; if (part === 'sternum') { const leftSh = this.pose.keypoints[5].position; const rightSh = this.pose.keypoints[6].position; x = (leftSh.x - rightSh.x) * 0.5 + rightSh.x; y = (leftSh.y - rightSh.y) * 0.5 + rightSh.y; } else { const p = this.pose.keypoints[exports.keypointParts.indexOf(part)].position; x = p.x; y = p.y; } result[0] = x; result[1] = y; return result; } getPartPosition(part, result = [NaN, NaN]) { //return this.computePartPosition(part, result); const src = this.__easedKeypointMap[part]; if (src) { result[0] = src[0]; result[1] = src[1]; } return result; } getPartPositionNormalized(part, result = [NaN, NaN]) { const pos = this.getPartPosition(part, result); const x = utils_3.scalemap(pos[0], 0, this.canvas.width, -1, 1); // * this.amplification; const y = utils_3.scalemap(pos[1], 0, this.canvas.height, -1, 1); // * this.amplification; result[0] = x; result[1] = y; return result; } /** * Get the position of the body part projected into the coordinate space of the target element * @param part the body part key to receive the position of * @param targetElement optionally provide an Element if you wish to use one other than the target */ getPartPositionProjected(part, targetElement = this.contentElement) { return this.projectPosition(this.getPartPosition(part), targetElement); } /** * Project (mutate) a position from source (webcam) coordinates to an elements coordinates * @param position a vector in source (webcam) coordinates * @param targetElement optionally provide an Element to project to other than target element */ projectPosition(position, targetElement = this.contentElement) { const [width, height] = getElementDimensions(targetElement); return exports.transformCameraPoints(this.canvas.width, this.canvas.height, width, height, [position])[0]; } get canvas() { return this._webcamCanvas.domElement; } initialize() { return __awaiter(this, void 0, void 0, function* () { this._dispatchInitializing(); if (/(iPad|iPhone|Crios)/g.test(navigator.userAgent)) { const err = new Error('Body tracking is not supported on iOS.'); this._dispatchError(err); throw err; } if (!this._input) { this._input = yield posenet.load(this.multiplier); } try { yield this._webcamCanvas.initialize(); } catch (e) { this._dispatchError(new Error(e)); //'Error initializing camera. Please ensure you have one and haven\'t denied access.'); throw e; } if (!this.sourceCenter) { this.resetCenter(); } this._loop.setFPS(this._webcamCanvas.getFrameRate()); this._loop.start(); }); } _handleStop() { //when the input stops, shut down the camera and undo all initialization this._dispatchStop(); this._webcamCanvas.stop(); } _handleNewFrame() { //if a new frame occurs while still estimating the last pose //skip this frame if (this.__estimating) { return; } this._updatePose(); } _propertiesChanged(props, changed, prev) { super._propertiesChanged(props, changed, prev); if (changed && changed.hasOwnProperty('help')) { utils_2.setBooleanAttribute(this, 'help', props.help); this._dispatchChange(); } } _updatePose() { return __awaiter(this, void 0, void 0, function* () { const outputStride = 16; const flipHorizontal = false; const maxPoseDetections = 1; this._estimating = true; this._webcamCanvas.update(); const poses = yield this._input.estimateMultiplePoses(this._webcamCanvas.domElement, this.imageScaleFactor, flipHorizontal, outputStride, maxPoseDetections); const pose = poses[0]; this._estimating = false; this.pose = pose; if (this.pose) { const _tmp = [NaN, NaN]; //update all keypoints positions, and ease them by parameter for (let i = 0; i < exports.keypointParts.length; i++) { const key = exports.keypointParts[i]; const position = this.computePartPosition(key); const lastPosition = this.__easedKeypointMap[key]; if (lastPosition && !isNaN(lastPosition[0]) && !isNaN(lastPosition[1])) { const easedDifference = vec2_1.scale(vec2_1.sub(position, lastPosition, _tmp), this.keypointEase, _tmp); vec2_1.add(lastPosition, easedDifference, lastPosition); } else { this.__easedKeypointMap[key] = position; } } if (this.contentElement) { //the source coordinate from webcam (likely 640x480) const partPosition = this.getPartPosition(this.bodyPart); //calculate the position projected to the target, //but before any amplification has been computed vec2_1.copy(partPosition, this.preamplifiedTargetPosition); this.projectPosition(this.preamplifiedTargetPosition); const distanceFromCenter = vec2_1.sub(partPosition, this.sourceCenter); const amplifiedDistance = vec2_1.scale(distanceFromCenter, this.amplification); //update partPosition to being the amplified position still in source coordinates vec2_1.add(this.sourceCenter, amplifiedDistance, this.__lastSourcePosition); vec2_1.add(this.sourceCenter, amplifiedDistance, this._lastFoundTargetPosition); //set the projected position this.projectPosition(this._lastFoundTargetPosition); if (!this.disableClamp) { const dims = getElementDimensions(this.contentElement, _tmpContentDims); this._lastFoundTargetPosition[0] = utils_2.clamp(this._lastFoundTargetPosition[0], 0, dims[0]); this._lastFoundTargetPosition[1] = utils_2.clamp(this._lastFoundTargetPosition[1], 0, dims[1]); } } this._lastFoundPosition = this.getPartPositionNormalized(this.bodyPart); } this._dispatchTick(); }); } /** * Returns an object of the project positions for every part * @param keypoints optionally provide a list of bodyPart keys to project, defaults to all * @param targetElement optionally project an Element to project coordinates too, defaults to target */ getAllPositionsProjected(keypoints = exports.keypointParts, targetElement = this.contentElement) { const [width, height] = getElementDimensions(targetElement); return keypoints.reduce((mem, part) => { if (!mem[part]) { mem[part] = exports.transformCameraPoints(640, 480, width, height, [this.getPartPosition(part)])[0]; } return mem; }, {}); } /** * render a crosshair of the input's center calibration point * @param ctx * @param style * @param lineWidth * @param radius * @param crossLength */ renderCenter(ctx, style = 'black', lineWidth = 3, radius = 16, crossLength = 8) { if (!this.isReady) { return; } vec2_1.copy(this.sourceCenter, _tmpVec2); const center = this.projectPosition(_tmpVec2, ctx.canvas); let x = 0; let y = 0; ctx.strokeStyle = style; ctx.lineWidth = lineWidth; // cross-hair scope design // ctx.beginPath(); // ctx.arc(center[0], center[1], radius, 0, Math.PI * 2); // x = center[0] + radius; // y = center[1]; // ctx.moveTo(x, y); // ctx.lineTo(x + crossLength, y); // x = center[0] - radius; // ctx.moveTo(x - crossLength, y); // ctx.lineTo(x, y); // x = center[0]; // y = center[1] - radius; // ctx.moveTo(x, y); // ctx.lineTo(x, y - crossLength); // y = center[1] + radius; // ctx.moveTo(x, y); // ctx.lineTo(x, y + crossLength); ctx.beginPath(); ctx.moveTo(center[0] - radius, center[1]); ctx.lineTo(center[0] + radius, center[1]); ctx.moveTo(center[0], center[1] - radius); ctx.lineTo(center[0], center[1] + radius); ctx.stroke(); } renderCursor(ctx, style = 'blue') { if (!this.isReady) { return; } const { __lastSourcePosition: source } = this; const [x1, y1] = this.projectPosition(this.getPartPosition(this.bodyPart), ctx.canvas); const [x2, y2] = this.projectPosition(source, ctx.canvas); ctx.strokeStyle = ctx.fillStyle = style; //line connecting source dot to amplified dot ctx.beginPath(); ctx.moveTo(x1, y1); ctx.lineTo(x2, y2); ctx.stroke(); //circle representing cursor ctx.beginPath(); ctx.arc(x2, y2, 16, 0, Math.PI * 2); ctx.fill(); } /** * render the pose data to a canvas to show current tracked skeleton * @param ctx * @param style * @param radius */ renderInputData(ctx, style = 'rgba(96,96,96, 0.85)', radius = 4) { if (!this.isReady) { return; } const segments = [ ['nose'], ['leftShoulder', 'rightShoulder', 'rightHip', 'leftHip', 'leftShoulder'], ['leftShoulder', 'leftElbow', 'leftWrist'], ['rightShoulder', 'rightElbow', 'rightWrist'] ]; ctx.strokeStyle = ctx.fillStyle = style; const currentPosition = [NaN, NaN]; const partsRendered = []; segments.forEach((segment) => { if (segment.length > 1) { ctx.beginPath(); segment.forEach((bodyPart, i) => { this.getPartPosition(bodyPart, currentPosition); this.projectPosition(currentPosition, ctx.canvas); if (i === 0) { ctx.moveTo(currentPosition[0], currentPosition[1]); } else { ctx.lineTo(currentPosition[0], currentPosition[1]); } }); ctx.stroke(); } segment.forEach((bodyPart) => { if (partsRendered.indexOf(bodyPart) !== -1) { return; } this.getPartPosition(bodyPart, currentPosition); this.projectPosition(currentPosition, ctx.canvas); ctx.beginPath(); ctx.arc(currentPosition[0], currentPosition[1], radius, 0, Math.PI * 2); ctx.fill(); partsRendered.push(bodyPart); }); }); } resetCenter() { this.sourceCenter = [ this.canvas.width / 2, this.canvas.height / 2 ]; } setCenterToCurrentPosition() { this.sourceCenter = this.getPartPosition(this.bodyPart); } stop() { this._loop.stop(); } _didRender(props, changed, prev) { if (changed && changed.hasOwnProperty('controls') && changed.controls) { setTimeout(() => { const controls = this.shadowRoot.querySelector('acc-pose-input-calibration'); if (controls && canFocusHeader(controls)) { controls.focusHeader(); } }, 16); } return super._didRender(props, changed, prev); } _render({ amplification, controls, help, imageScaleFactor, part, smoothing }) { let isDark = false; //calculate if a dark background is set by computing the color and seeing if its average color is more than half way const computed = utils_1.computeStyleResult(this.shadowRoot, 'color', styles_1.backgroundColor); if (computed) { const color = utils_1.cssColorToArray(computed); if (color) { isDark = ((color[0] + color[1] + color[2]) / 3) < 128; } } const postFix = isDark ? '-dark' : ''; return lit_element_1.html ` this.setCenterToCurrentPosition()} on-resetcenter=${() => this.resetCenter()} amplification="${amplification}" imageScaleFactor="${imageScaleFactor}" smoothing="${smoothing}" parts="${selectablePartsDisplay}" part="${keypointPartsMap[part]}" open?=${controls} fullscreen on-change=${(evt) => { const findPartId = () => { for (let prop in keypointPartsMap) { if (keypointPartsMap[prop] === evt.detail.part) { return prop; } } }; this.amplification = evt.detail.amplification; this.bodyPart = findPartId(); //evt.detail.part; this.imageScaleFactor = evt.detail.imageScaleFactor; this.smoothing = evt.detail.smoothing; this._dispatchChange(); }} on-help=${() => this.help = true} on-close=${() => { console.log("POSE INPUT CONTROLS ON CLOSE"); this.controls = false; }} on-close-click=${() => this.controls = false}> this.help = false} open?=${help}> `; } } __decorate([ decorators_1.property({ type: String }) ], PoseInputElement.prototype, "label", void 0); __decorate([ decorators_1.property({ type: Number }) ], PoseInputElement.prototype, "amplification", void 0); __decorate([ decorators_1.property({ type: String }) ], PoseInputElement.prototype, "bodyPart", void 0); __decorate([ decorators_1.property({ type: String }) ], PoseInputElement.prototype, "target", void 0); __decorate([ decorators_1.property({ type: Number }) ], PoseInputElement.prototype, "multiplier", void 0); __decorate([ decorators_1.property({ type: Number }) ], PoseInputElement.prototype, "imageScaleFactor", void 0); __decorate([ decorators_1.property({ type: Boolean }) ], PoseInputElement.prototype, "help", void 0); __decorate([ decorators_1.property({ type: Number }) ], PoseInputElement.prototype, "keypointEase", void 0); __decorate([ autobind_decorator_1.default ], PoseInputElement.prototype, "_handleStop", null); __decorate([ autobind_decorator_1.default ], PoseInputElement.prototype, "_handleNewFrame", null); exports.PoseInputElement = PoseInputElement; customElements.define('acc-pose-input', PoseInputElement); /***/ }), /***/ "./src/components/range.ts": /*!*********************************!*\ !*** ./src/components/range.ts ***! \*********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); const styles_1 = __webpack_require__(/*! ./styles */ "./src/components/styles.ts"); // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. const autobind_decorator_1 = __webpack_require__(/*! autobind-decorator */ "./node_modules/autobind-decorator/lib/index.js"); const styles_2 = __webpack_require__(/*! ./styles */ "./src/components/styles.ts"); const abstract_ui_1 = __webpack_require__(/*! ./abstract-ui */ "./src/components/abstract-ui.ts"); const lit_element_1 = __webpack_require__(/*! @polymer/lit-element */ "./node_modules/@polymer/lit-element/lit-element.js"); const decorators_1 = __webpack_require__(/*! ./decorators */ "./src/components/decorators.ts"); const normalizeValue = (min, max, value) => { // console.log('calling normalize values for', name); let newMin = 0; let newMax = max - min; let newValue = value - min; newValue = (newValue * 1.0 / newMax); newMin = newMin / newMax; newMax = 1; return newValue; }; /** * `` element is a custom range / slider component that simplifies * labelling. * * @example ```html * * * ``` */ class RangeElement extends abstract_ui_1.AbstractUIElement { constructor() { super(...arguments); this.name = ''; this.min = '0'; this.max = '100'; this.step = '1'; this.value = ''; this.inlineLabel = false; } changeGradient(e) { this.value = e.currentTarget.value; this.dispatchEvent(new CustomEvent(e.type, { bubbles: true, detail: { inputEvent: e } })); // Normalize Values let sliderValue = parseFloat(e.currentTarget.value); let val = normalizeValue(parseFloat(this.min), parseFloat(this.max), sliderValue); const rangeEl = this.shadowRoot.querySelector('.range-slider__range'); rangeEl.style.backgroundImage = '-webkit-gradient(linear, left top, right top, ' + `color-stop(${val}, ${styles_2.accentColor}), ` + 'color-stop(' + val + ', #D8D8D8)' + ')'; } _handleShortcut() { const inputEl = this.shadowRoot.querySelector('.range-slider__range'); if (inputEl) { inputEl.focus(); } super._handleShortcut(); } _render({ label, name, min, max, step, value }) { const [minf, maxf, valuef] = [min, max, value].map(parseFloat); const inputHtml = lit_element_1.html ` this.changeGradient(e)} name="${name}" type="range" min="${min}" max="${max}" step="${step}" disabled?="${this.disabled}" aria-label="${name}" value="${value}"> `; return lit_element_1.html `
${this.inlineLabel ? lit_element_1.html `${inputHtml}` : inputHtml}
`; } } __decorate([ decorators_1.property({ type: String }) ], RangeElement.prototype, "name", void 0); __decorate([ decorators_1.property({ type: String }) ], RangeElement.prototype, "min", void 0); __decorate([ decorators_1.property({ type: String }) ], RangeElement.prototype, "max", void 0); __decorate([ decorators_1.property({ type: String }) ], RangeElement.prototype, "step", void 0); __decorate([ decorators_1.property({ type: String }) ], RangeElement.prototype, "value", void 0); __decorate([ decorators_1.property({ type: Boolean }) ], RangeElement.prototype, "inlineLabel", void 0); __decorate([ autobind_decorator_1.default ], RangeElement.prototype, "_handleShortcut", null); customElements.define('acc-range', RangeElement); /***/ }), /***/ "./src/components/select.ts": /*!**********************************!*\ !*** ./src/components/select.ts ***! \**********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); const autobind_decorator_1 = __webpack_require__(/*! autobind-decorator */ "./node_modules/autobind-decorator/lib/index.js"); const styles_1 = __webpack_require__(/*! ./styles */ "./src/components/styles.ts"); const abstract_select_1 = __webpack_require__(/*! ./abstract-select */ "./src/components/abstract-select.ts"); const lit_element_1 = __webpack_require__(/*! @polymer/lit-element */ "./node_modules/@polymer/lit-element/lit-element.js"); __webpack_require__(/*! ./optgroup */ "./src/components/optgroup.ts"); const isItem = (n) => n && typeof n.label === 'string' && typeof n.value !== 'undefined'; const toOptgroupTemplate = (group) => lit_element_1.html ` ${Array.from(group.children).map(node => isItem(node) ? toOptionTemplate(node) : '')} `; const toOptionTemplate = (node) => lit_element_1.html ``; /** * `` element is similar to a ` ${Array.from(this.children).map(node => { if (abstract_select_1.isOptgroupElement(node)) { return toOptgroupTemplate(node); } else if (isItem(node)) { return toOptionTemplate(node); } return ''; })}
`; } } __decorate([ autobind_decorator_1.default ], SelectElement.prototype, "_handleShortcut", null); exports.SelectElement = SelectElement; customElements.define('acc-select', SelectElement); /***/ }), /***/ "./src/components/side-panel.ts": /*!**************************************!*\ !*** ./src/components/side-panel.ts ***! \**************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); const styles_1 = __webpack_require__(/*! ./styles */ "./src/components/styles.ts"); const group_1 = __webpack_require__(/*! ./group */ "./src/components/group.ts"); const lit_element_1 = __webpack_require__(/*! @polymer/lit-element */ "./node_modules/@polymer/lit-element/lit-element.js"); const decorators_1 = __webpack_require__(/*! ./decorators */ "./src/components/decorators.ts"); const utils_1 = __webpack_require__(/*! ../utils */ "./src/utils.ts"); __webpack_require__(/*! ./icon */ "./src/components/icon.ts"); /** * `` * The side panel element is a collapsable menu that houses UI elements. It * simplifies tab management, heading structure and provides a "skip to content" * link when navigated with keyboard. * * @example ```html * * * * * * * * ``` */ class SidePanel extends group_1.GroupElement { constructor() { super(...arguments); /** * skip to content shows up in the tab order of the side panel * and emits the 'skiptocontent' event. Setting this to true, hides it */ this.disableSkipToContent = false; /** * is the side panel in its collapsed state */ this.closed = false; } focus() { //when focused, move focus to the main header super.focus(); const h1 = this.shadowRoot.querySelector('h1'); if (h1) { h1.focus(); } } _didRender(props, changed, prev) { if (changed && changed.hasOwnProperty('closed')) { //if it was just closed focus the open button //if it was just opened focus the close button const button = this.shadowRoot.querySelector(props.closed ? '.open-button' : '.close-button'); if (button) { button.focus(); } } return super._didRender(props, changed, prev); } _propertiesChanged(props, changed, prev) { if (!changed || !prev) { return; } utils_1.setBooleanAttribute(this, 'closed', props.closed); if (props.closed !== prev.closed) { setTimeout(() => { this.dispatchEvent(new CustomEvent(props.closed ? 'close' : 'open', { bubbles: true })); this.dispatchEvent(new CustomEvent('resize', { bubbles: true })); }, 0); } super._propertiesChanged(props, changed, prev); } _render({ label, disableSkipToContent }) { return lit_element_1.html ` `; } skipToContent() { this.dispatchEvent(new CustomEvent('skiptocontent', { bubbles: true })); } } __decorate([ decorators_1.property({ type: Boolean }) ], SidePanel.prototype, "disableSkipToContent", void 0); __decorate([ decorators_1.property({ type: Boolean }) ], SidePanel.prototype, "closed", void 0); exports.SidePanel = SidePanel; customElements.define('acc-side-panel', SidePanel); /***/ }), /***/ "./src/components/slide.ts": /*!*********************************!*\ !*** ./src/components/slide.ts ***! \*********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); const lit_element_1 = __webpack_require__(/*! @polymer/lit-element */ "./node_modules/@polymer/lit-element/lit-element.js"); const decorators_1 = __webpack_require__(/*! ./decorators */ "./src/components/decorators.ts"); /** * A `` element represents the data of a slide within a slideshow, * The parent element renders this item into its shadow-dom. * * @example ```html * * * ``` */ class SlideElement extends lit_element_1.LitElement { constructor() { super(...arguments); this.video = ''; this.image = ''; this.caption = ''; this.alt = ''; } _propertiesChanged(props, changed, prev) { if (props.alt === '') { console.warn('slide image needs alt text'); } super._propertiesChanged(props, changed, prev); } _render(_props) { return lit_element_1.html ``; } } __decorate([ decorators_1.property({ type: String }) ], SlideElement.prototype, "video", void 0); __decorate([ decorators_1.property({ type: String }) ], SlideElement.prototype, "image", void 0); __decorate([ decorators_1.property({ type: String }) ], SlideElement.prototype, "caption", void 0); __decorate([ decorators_1.property({ type: String }) ], SlideElement.prototype, "alt", void 0); exports.SlideElement = SlideElement; customElements.define('acc-slide', SlideElement); /***/ }), /***/ "./src/components/slideshow.ts": /*!*************************************!*\ !*** ./src/components/slideshow.ts ***! \*************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); const lit_element_1 = __webpack_require__(/*! @polymer/lit-element */ "./node_modules/@polymer/lit-element/lit-element.js"); const styles_1 = __webpack_require__(/*! ./styles */ "./src/components/styles.ts"); const { FlattenedNodesObserver } = __webpack_require__(/*! @polymer/polymer/lib/utils/flattened-nodes-observer.js */ "./node_modules/@polymer/polymer/lib/utils/flattened-nodes-observer.js"); const decorators_1 = __webpack_require__(/*! ./decorators */ "./src/components/decorators.ts"); /** * A `` element represents a view comprised of `` * elements with linear next / previous navigation. */ class SlideshowElement extends lit_element_1.LitElement { constructor() { super(...arguments); this.slides = []; this.closeButton = 'Start Playing'; this.caption = ''; this.video = ''; this.alt = ''; this.transition = false; } get nextSlide() { let currentIndex = this.slides.indexOf(this.currentSlide); currentIndex++; return currentIndex; // currentIndex = (currentIndex > this.slides.length - 1) ? 0 : currentIndex; // return currentIndex; } get prevSlide() { let currentIndex = this.slides.indexOf(this.currentSlide); currentIndex--; return currentIndex; // currentIndex = (currentIndex < 0) ? this.slides.length - 1 : currentIndex; // return currentIndex; } set currentSlideId(id) { const slide = this.slides[id]; this.transition = true; this.currentSlide = slide; this.caption = ''; this.alt = ''; setTimeout(() => { this.transition = false; this.alt = slide.alt; this.caption = slide.caption; this.video = slide.video; }, 250); } get currentSlideId() { return this.slides.indexOf(this.currentSlide); } _clickHandler(event) { event.preventDefault(); } ; _navigate(event) { const link = event.target; this.currentSlideId = link.getAttribute('data-slide'); event.preventDefault(); } ; connectedCallback() { super.connectedCallback(); this.__nodesObserver = new FlattenedNodesObserver(this, this._handleNodesObserverUpdate); } /*focus(){ super.focus() const slideContainer = this.shadowRoot.querySelector('.slideshow-container') as HTMLElement if (slideContainer){ slideContainer.focus() } }*/ _handleNodesObserverUpdate(info) { info.addedNodes.forEach((node) => { if (node.tagName === 'ACC-SLIDE') { this.slides.push({ image: node.image, video: node.video, caption: node.caption, alt: node.alt, }); } }); this.currentSlide = this.slides[0]; //look at initial slide: this.currentSlideId = 0; this.requestRender(); } _nextSlide() { this.dispatchEvent(new CustomEvent('next-slide', { bubbles: true, composed: true })); this.currentSlideId = this.nextSlide; } _previousSlide() { this.dispatchEvent(new CustomEvent('previous-slide', { bubbles: true, composed: true })); this.currentSlideId = this.prevSlide; } /*_didRender(props:any, changed:any, prev:any){ const caption = this.currentSlide ? this.currentSlide.caption : '' const alt = this.currentSlide ? this.currentSlide.alt : '' super._didRender(props, changed, prev); }*/ _render() { return lit_element_1.html `

${this.caption}

    ${this.slides && this.slides.map((s, index) => { return lit_element_1.html `
  • `; })}
`; } } __decorate([ decorators_1.property({ type: String }) ], SlideshowElement.prototype, "closeButton", void 0); __decorate([ decorators_1.property({ type: String }) ], SlideshowElement.prototype, "caption", void 0); __decorate([ decorators_1.property({ type: String }) ], SlideshowElement.prototype, "video", void 0); __decorate([ decorators_1.property({ type: String }) ], SlideshowElement.prototype, "alt", void 0); __decorate([ decorators_1.property({ type: Boolean }) ], SlideshowElement.prototype, "transition", void 0); exports.SlideshowElement = SlideshowElement; customElements.define('acc-slideshow', SlideshowElement); /***/ }), /***/ "./src/components/snackbar.ts": /*!************************************!*\ !*** ./src/components/snackbar.ts ***! \************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); const autobind_decorator_1 = __webpack_require__(/*! autobind-decorator */ "./node_modules/autobind-decorator/lib/index.js"); const styles_1 = __webpack_require__(/*! ./styles */ "./src/components/styles.ts"); const lit_element_1 = __webpack_require__(/*! @polymer/lit-element */ "./node_modules/@polymer/lit-element/lit-element.js"); const decorators_1 = __webpack_require__(/*! ./decorators */ "./src/components/decorators.ts"); const abstract_modal_1 = __webpack_require__(/*! ./abstract-modal */ "./src/components/abstract-modal.ts"); const utils_1 = __webpack_require__(/*! ../utils */ "./src/utils.ts"); /** * An `` element is floating element intended for temporary UI * notifications. Generally there is one instance per application. If you add * aria-live="polite" to the element in your HTML it will work as a * Live Region for Accessibility tools. * * @example ```html * * This will get read * out loud by screen readers whenever it changes * ``` */ class SnackBarElement extends lit_element_1.LitElement { constructor() { super(...arguments); /** * duration (in seconds) to stay visible after message changes, * if 0, stays visible indefinitely or until dismissed */ this.duration = 4; /** * if true, shows a "DISMISS" button to close */ this.dismissable = false; /** * if true, snackbar will be styled as an alert */ this.error = false; } get open() { return this.hasAttribute('open'); } _handleSlotChange() { this.show(); } _propertiesChanged(props, changed = {}, prev = {}) { super._propertiesChanged(props, changed, prev); utils_1.setBooleanAttribute(this, 'error', props.error); if (changed.message) { this.show(); } } show() { const now = this.__lastMessageChange = Date.now(); this.setAttribute('open', 'true'); if (this.duration > 0 && !this.error) { setTimeout(() => { //in case another message has been sent while it was open //dont close it until the last message has its duration if (this.__lastMessageChange === now) { this.hide(); } }, this.duration * 1000); } if (this.error) { const textElement = this.shadowRoot.querySelector('p'); setTimeout(() => { textElement.focus(); }, 16); } this.dispatchEvent(new CustomEvent('show')); } hide() { this.removeAttribute('open'); this.dispatchEvent(new CustomEvent('hide')); if (this.__previousFocus && this.error) { this.__previousFocus.focus(); } this.__previousFocus = null; } _didRender() { const currentFocus = document.activeElement; if (currentFocus !== this && currentFocus !== document.body && currentFocus && !(currentFocus instanceof abstract_modal_1.AbstractModalElement)) { this.__previousFocus = currentFocus; } if (this.__slot) { this.__slot.removeEventListener('slotchange', this._handleSlotChange); } const slot = this.shadowRoot.querySelector('slot'); if (slot) { slot.addEventListener('slotchange', this._handleSlotChange); this.__slot = slot; } } _render({ duration, message }) { return lit_element_1.html `
${(this.dismissable) ? lit_element_1.html `

` : lit_element_1.html `

`}
`; } } __decorate([ decorators_1.property({ type: Number }) ], SnackBarElement.prototype, "duration", void 0); __decorate([ decorators_1.property({ type: Boolean }) ], SnackBarElement.prototype, "dismissable", void 0); __decorate([ decorators_1.property({ type: Boolean }) ], SnackBarElement.prototype, "error", void 0); __decorate([ autobind_decorator_1.default ], SnackBarElement.prototype, "_handleSlotChange", null); exports.SnackBarElement = SnackBarElement; customElements.define('acc-snackbar', SnackBarElement); /***/ }), /***/ "./src/components/styles.ts": /*!**********************************!*\ !*** ./src/components/styles.ts ***! \**********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. Object.defineProperty(exports, "__esModule", { value: true }); const utils_1 = __webpack_require__(/*! ./../utils */ "./src/utils.ts"); /** * Individually declared styles * * any variable intended to be exposes as a theming css variable should * be the same as variable name but hyphenated with two leading dashes * i.e. accentColor in css is --accent-color */ /** * outline the styles here */ const styles = { labelColor: 'black', backgroundColor: 'white', buttonBorderColor: '#AEB0B5', buttonBorderWidth: '2px', buttonFontSize: '18px', buttonFontWeight: 'normal', buttonJustifyContent: 'center', accentColor: '#235BEC', accentOffColor: '#aaaaaa', accentBorderRadius: '0%', bodyFontFamily: 'Karla', titleFontFamily: 'Poppins', iconSize: '25px', fillColor: 'black', outlineBorderColor: '#AEB0B5', }; /** * make a value from styles a css variable available for themes * @param styleVariable the variable from styles you to make a CSS variable */ const applyVariable = (styleVariable) => `var(--${utils_1.camelCaseToHyphenated(styleVariable)}, ${styles[styleVariable]})`; exports.labelColor = applyVariable('labelColor'); exports.backgroundColor = applyVariable('backgroundColor'); exports.titleFontFamily = applyVariable('titleFontFamily'); exports.bodyFontFamily = applyVariable('bodyFontFamily'); // this is one is nested with priority to --button-background-color // otherwise defaults to --background-color or its default value above exports.buttonBackgroundColor = `var(--button-background-color, ${exports.backgroundColor})`; exports.buttonBorderColor = applyVariable('buttonBorderColor'); exports.buttonBorderWidth = applyVariable('buttonBorderWidth'); exports.buttonFontSize = applyVariable('buttonFontSize'); exports.buttonFontWeight = applyVariable('buttonFontWeight'); exports.buttonJustifyContent = applyVariable('buttonJustifyContent'); exports.buttonLabelColor = `var(--button-label-color, ${exports.labelColor})`; exports.accentColor = applyVariable('accentColor'); exports.accentOffColor = applyVariable('accentOffColor'); exports.accentBorderRadius = applyVariable('accentBorderRadius'); exports.iconSize = applyVariable('iconSize'); exports.fillColor = applyVariable('fillColor'); exports.outlineBorderColor = applyVariable('outlineBorderColor'); exports.labelStyleChunk = (selector = 'label') => ` ${selector} { font-family: ${exports.bodyFontFamily}; font-size: 18px; padding: 0px 0px 20px 0px; font-weight: 700; text-transform: capitalize; display: block; cursor: pointer; color: ${exports.labelColor}; }`; /***/ }), /***/ "./src/components/toggle.ts": /*!**********************************!*\ !*** ./src/components/toggle.ts ***! \**********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); const abstract_ui_1 = __webpack_require__(/*! ./abstract-ui */ "./src/components/abstract-ui.ts"); const styles_1 = __webpack_require__(/*! ./styles */ "./src/components/styles.ts"); const lit_element_1 = __webpack_require__(/*! @polymer/lit-element */ "./node_modules/@polymer/lit-element/lit-element.js"); const decorators_1 = __webpack_require__(/*! ./decorators */ "./src/components/decorators.ts"); const utils_1 = __webpack_require__(/*! ../utils */ "./src/utils.ts"); const autobind_decorator_1 = __webpack_require__(/*! autobind-decorator */ "./node_modules/autobind-decorator/lib/index.js"); /** * An `` element is similar to a checkbox. It is a button where its * `checked` value toggles each time clicked. This element handles labeling * (including checked state information) as well as additional ARIA attributes. * * @example ```html * * * ``` */ class ToggleElement extends abstract_ui_1.AbstractUIElement { constructor() { super(...arguments); this.checked = false; } get value() { return String(this.checked); } focus() { super.focus(); this.shadowRoot.querySelector('button').focus(); } _handleShortcut() { this.checked = !this.checked; super._handleShortcut(); } _render({ label, shortcut, checked }) { const value = this.value; let title = `${label}, toggled ${checked ? 'on' : 'off'} `; if (!!shortcut) { title += ` (${shortcut})`; } return lit_element_1.html ` `; } _propertiesChanged(props, changedProps, prevProps) { if (!changedProps || !prevProps) { return; } let changed = false; if (changedProps.checked !== prevProps.checked) { utils_1.setBooleanAttribute(this, 'checked', props.checked); changed = true; } if (changedProps.disabled !== prevProps.disabled) { changed = true; } if (changed) { const customEvent = { detail: { target: this, checked: this.checked } }; this.dispatchEvent(new CustomEvent('change', customEvent)); } super._propertiesChanged(props, changedProps, prevProps); } _shouldPropertyChange(property, value, old) { //prevent checked value from changing if its disabled if (property === 'checked' && this.disabled) { return false; } return super._shouldPropertyChange(property, value, old); } } __decorate([ decorators_1.property({ type: Boolean }) ], ToggleElement.prototype, "checked", void 0); __decorate([ autobind_decorator_1.default ], ToggleElement.prototype, "_handleShortcut", null); exports.ToggleElement = ToggleElement; customElements.define('acc-toggle', ToggleElement); /***/ }), /***/ "./src/components/tutorial.ts": /*!************************************!*\ !*** ./src/components/tutorial.ts ***! \************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); const lit_element_1 = __webpack_require__(/*! @polymer/lit-element */ "./node_modules/@polymer/lit-element/lit-element.js"); const decorators_1 = __webpack_require__(/*! ./decorators */ "./src/components/decorators.ts"); __webpack_require__(/*! ./slideshow */ "./src/components/slideshow.ts"); const abstract_modal_1 = __webpack_require__(/*! ./abstract-modal */ "./src/components/abstract-modal.ts"); /** * A `` element places a `` into a fullscreen * modal container. */ class Tutorial extends abstract_modal_1.AbstractModalElement { constructor() { super(); this.closeButton = 'Start Playing'; this.priority = 2; this.exclusive = true; } _handleCloseClick() { this.removeAttribute('open'); this.dispatchEvent(new CustomEvent('close-clicked', { bubbles: true })); } focus() { super.focus(); const header = this.shadowRoot.querySelector('h2'); if (header) { header.focus(); } } _renderModalBody({ closeButton }) { return lit_element_1.html `

Tutorial

`; } } __decorate([ decorators_1.property({ type: String }) ], Tutorial.prototype, "closeButton", void 0); exports.Tutorial = Tutorial; customElements.define('acc-tutorial', Tutorial); /***/ }), /***/ "./src/events/error-event.ts": /*!***********************************!*\ !*** ./src/events/error-event.ts ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. Object.defineProperty(exports, "__esModule", { value: true }); /** * An Event describing an encountered error. * Dispatching Errors is important to accessibility, it allows the developer * to notify the user (such as with aria-live) to assist avoiding confusion. */ class ACCErrorEvent extends CustomEvent { constructor(error) { super(ACCErrorEvent.ERROR, { detail: { name: error.name, message: error.message, stack: error.stack }, bubbles: true, composed: true }); } } /** * Dispatched whenever there is an error * @event */ ACCErrorEvent.ERROR = 'error'; exports.ACCErrorEvent = ACCErrorEvent; /***/ }), /***/ "./src/events/input-event.ts": /*!***********************************!*\ !*** ./src/events/input-event.ts ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. Object.defineProperty(exports, "__esModule", { value: true }); /** * Every event coming from an AbstractInputElement */ class ACCInputEvent extends CustomEvent { constructor(type, eventInitDict) { super(type, eventInitDict); } } /** * Dispatched when an inputs properties have changed * @event */ ACCInputEvent.CHANGE = 'change'; /** * Dispatched when an input's controls modal closes * @event */ ACCInputEvent.CONTROLS_CLOSE = 'controlsclose'; /** * Dispatched when an input's controls modal opens * @event */ ACCInputEvent.CONTROLS_OPEN = 'controlsopen'; /** * Dispatched when the input is beginning to initialize and load itself * @event */ ACCInputEvent.INITIALIZING = 'initializing'; /** * Dispatched when the input has completed initializing itself * @event */ ACCInputEvent.READY = 'ready'; /** * Dispatched every time theres an update, this is 60fps for webcams * @event */ ACCInputEvent.TICK = 'tick'; /** * Dispatches every time there is a new value from the input * @event */ ACCInputEvent.INPUT = 'input'; /** * Dispatched when the input has been stopped * @event */ ACCInputEvent.STOP = 'stop'; exports.ACCInputEvent = ACCInputEvent; /***/ }), /***/ "./src/index.ts": /*!**********************!*\ !*** ./src/index.ts ***! \**********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. Object.defineProperty(exports, "__esModule", { value: true }); /** * each one of these modules represents a corresponding HTML tag * i.e. */ __webpack_require__(/*! ./components/button */ "./src/components/button.ts"); __webpack_require__(/*! ./components/content */ "./src/components/content.ts"); __webpack_require__(/*! ./components/group */ "./src/components/group.ts"); __webpack_require__(/*! ./components/input-mode-select */ "./src/components/input-mode-select.ts"); __webpack_require__(/*! ./components/item */ "./src/components/item.ts"); __webpack_require__(/*! ./components/mouse-input */ "./src/components/mouse-input.ts"); __webpack_require__(/*! ./components/mouse-input-calibration */ "./src/components/mouse-input-calibration.ts"); __webpack_require__(/*! ./components/optgroup */ "./src/components/optgroup.ts"); __webpack_require__(/*! ./components/pose-input */ "./src/components/pose-input.ts"); __webpack_require__(/*! ./components/pose-input-calibration */ "./src/components/pose-input-calibration.ts"); __webpack_require__(/*! ./components/range */ "./src/components/range.ts"); __webpack_require__(/*! ./components/side-panel */ "./src/components/side-panel.ts"); __webpack_require__(/*! ./components/select */ "./src/components/select.ts"); __webpack_require__(/*! ./components/snackbar */ "./src/components/snackbar.ts"); __webpack_require__(/*! ./components/toggle */ "./src/components/toggle.ts"); __webpack_require__(/*! ./components/slide */ "./src/components/slide.ts"); __webpack_require__(/*! ./components/tutorial */ "./src/components/tutorial.ts"); /***/ }), /***/ "./src/keyboard-shortcut-observer.ts": /*!*******************************************!*\ !*** ./src/keyboard-shortcut-observer.ts ***! \*******************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); const autobind_decorator_1 = __webpack_require__(/*! autobind-decorator */ "./node_modules/autobind-decorator/lib/index.js"); /** * Keyboard Shortcut Observer * Observe keyboard events on the document, if the event.key combination matches * the pattern provided invoke the provided handler. */ class KeyboardShortcutObserver { /** * Construct a new observer to listen to the keyboard * @param pattern the keyboard pattern to look for, examples are "Shift P", "Control m", "Meta s" * @param __onTriggerHandler the handler to invoke when a match is found * @param name a name to identify the shortcut */ constructor(pattern, __onTriggerHandler, name = 'unnamed') { this.__onTriggerHandler = __onTriggerHandler; this.name = name; this.allowPropagation = false; this.__keysDown = []; this.pattern = pattern; this.connect(); } set pattern(s) { this.__directShortcut = s; if (typeof s === 'string') { //format let short = s .replace('.', '\\.') .replace('(', '\\(') .replace(')', '\\)') .replace('[', '\\[') .replace(']', '\\]') .replace(/(Space|Spacebar)/i, ' ') .replace(/(Ctr|Ctrl)/i, 'Control'); this.__shortcutRegExp = new RegExp(short, 'gi'); } else { this.__shortcutRegExp = s; } } get pattern() { return this.__directShortcut; } connect() { if (this.__isConnected) { return; } document.addEventListener('keydown', this.__onKeyDown, true); document.addEventListener('keyup', this.__onKeyUp, true); this.__isConnected = true; } disconnect() { if (!this.__isConnected) { return; } document.removeEventListener('keydown', this.__onKeyDown, true); document.removeEventListener('keyup', this.__onKeyUp, true); this.__isConnected = false; } isConnected() { return this.__isConnected; } matches() { const keys = this.__keysDown.join(' '); if (this.__shortcutRegExp.test(keys)) { return true; } return false; } __onKeyDown(event) { if (!this.pattern) { return; } this.__keysDown.push(event.key); } __onKeyUp(event) { //console.log(this.name, this.pattern, ' == ', this.__keysDown); if (!this.pattern) { return; } if (this.matches()) { this.__onTriggerHandler(this); if (this.allowPropagation) { event.stopPropagation(); } } this.__keysDown = []; } } __decorate([ autobind_decorator_1.default ], KeyboardShortcutObserver.prototype, "__onKeyDown", null); __decorate([ autobind_decorator_1.default ], KeyboardShortcutObserver.prototype, "__onKeyUp", null); exports.KeyboardShortcutObserver = KeyboardShortcutObserver; /***/ }), /***/ "./src/mouse-position.ts": /*!*******************************!*\ !*** ./src/mouse-position.ts ***! \*******************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. Object.defineProperty(exports, "__esModule", { value: true }); const isTouchEvent = (c) => c.type.indexOf('touch') === 0 && !!c.touches; //window has a circular window.window reference const isWindow = (elem) => elem !== null && elem === elem.window; const getWindow = (elem) => isWindow(elem) ? elem : elem.nodeType === 9 ? elem.defaultView || elem.parentWindow : false; const isHTMLElement = (elem) => typeof elem.appendChild === 'function'; /** * Calculate the offset of element * @param elem element or getBoundingClientRect() result to calculate offset of * @param ignoreWindowOffset should the windows scroll position be included in the offset? (false if object is fixed position) * @param targetBox optionally provide an object to mutate with the results (to reduce garbage collection) */ function elementOffset(elem, ignoreWindowOffset = true, targetBox = { x: 0, y: 0 }) { //support elements that may have a different window or document (in iframe) let win; let doc; if (isHTMLElement(elem)) { doc = elem.ownerDocument; if (!doc) { return targetBox; } // Make sure it's not a disconnected DOM node if (!doc.body.contains(elem)) { return targetBox; } // If we don't have gBCR, just use 0,0 rather than error // BlackBerry 5, iOS 3 (original iPhone) if (typeof elem.getBoundingClientRect !== 'undefined') { const clientRect = elem.getBoundingClientRect(); targetBox.x = clientRect.left; targetBox.y = clientRect.top; } //this win = getWindow(doc); } else { targetBox.x = elem.left; targetBox.y = elem.top; win = window; doc = document; } const page = { x: 0, y: 0 }; const docElem = document.documentElement; if (!ignoreWindowOffset) { page.y = win.pageYOffset || docElem.scrollTop; page.x = win.pageXOffset || docElem.scrollLeft; } targetBox.y = targetBox.y + page.y - (docElem.clientTop || 0); targetBox.x = targetBox.x + page.x - (docElem.clientLeft || 0); return targetBox; } exports.elementOffset = elementOffset; ; //used in mousePosition to reduce unneccessary garbage collection const __tmpVec2 = { x: 0, y: 0 }; /** * Calculate the provided x, y values to be relative to the provided elements offset * @param clientX the x position to transform (event.clientX) from a MouseEvent * @param clientY the y position to transform (event.clientY) from a MouseEvent * @param element the element to make the coordinate relative to (provide either this or offset) * @param offset optionally provide the elements offset (reduce work if already calculated) * @param target optionally provide an object to be mutated with result (reduce garbage collection) */ function mousePosition(clientX, clientY, element, offset, target) { if (!element && !offset) { throw new Error('mousePosition requires either element or offset be provided'); } //calculate offset for element if (element && !offset) { offset = elementOffset(element, false, __tmpVec2); } //otherwise if we do have an offset (even if we have an element), just use that offset //use ! to promise TS its not null offset = offset; target = target || { x: -1, y: -1 }; target.x = clientX - offset.x; target.y = clientY - offset.y; return target; } exports.mousePosition = mousePosition; ; /** * Calculate the position of the provided MouseEvent or TouchEvent relative to the provided element * @param event the MouseEvent or TouchEvent to get coordinate from * @param element the element to make the coordinate relative to * @param offset optionally provide the elements offset (to reduce work) * @param target optionally provide an object to be mutated with result (to reduce garbage collection) */ function mousePositionFromEvent(event, element, offset, target) { let x, y; if (isTouchEvent(event)) { if (event.touches && event.touches[0]) { x = event.touches[0].clientX; y = event.touches[0].clientY; } else { x = NaN; y = NaN; } } else { x = event.clientX; y = event.clientY; } if (!element && isHTMLElement(event.target)) { element = event.target; } if (!element) { throw new Error('mousePositionFromEvent requires an element parameter'); } return mousePosition(x, y, element, offset, target); } exports.mousePositionFromEvent = mousePositionFromEvent; ; /***/ }), /***/ "./src/utils.ts": /*!**********************!*\ !*** ./src/utils.ts ***! \**********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. Object.defineProperty(exports, "__esModule", { value: true }); /** * Is the node an Element Node? i.e. not a text item * @param node */ exports.isElement = (node) => node.nodeType === Node.ELEMENT_NODE; // faster `map` that optionally can be provided a target `out` array exports.fastMap = (arr, fn, out) => { out = (out || []); for (let i = 0; i < arr.length; i++) { out[i] = fn(arr[i], i, arr); } return out; }; /** * Empty the contents of an array */ exports.empty = (array) => { while (array.length) { array.pop(); } return array; }; const ua = navigator.userAgent; exports.isIOS11 = () => (ua.indexOf('iPad') > 0 || ua.indexOf('iPhone') > 0) && ua.indexOf('OS 11_') > 0; // export const scaleToFill = (element:HTMLElement)=>{ // const ww = window.innerWidth; // const wh = window.innerHeight; // let s = wh / element.height; // if (element.width * s < ww) { // s = ww / element.width; // } // const iw = element.width * s; // const ih = element.height * s; // const ix = (ww - iw) * 0.5; // const iy = (wh - ih) * 0.5; // element.style.transformOrigin = "0% 0%"; // element.style.transform = "matrix("+s+", 0, 0, "+s+", "+ix+", "+iy+")"; // }; exports.bind = (context, fnStr) => context[fnStr] = context[fnStr].bind(context); exports.bindAll = (context, fnArray) => fnArray.forEach(fnStr => exports.bind(context, fnStr)); exports.clamp = (n, min = 0, max = 1) => Math.min(max, Math.max(min, n)); /** * map a value from one range of numbers to another, * i.e. scalemap(0.5, 0, 2, 10, 20) = 15 * @param value * @param start1 * @param stop1 * @param start2 * @param stop2 * @returns {*} */ exports.scalemap = (value, start1, stop1, start2, stop2) => start2 + (stop2 - start2) * ((value - start1) / (stop1 - start1)); exports.scaleToFill = (srcWidth, srcHeight, containerWidth, containerHeight, bleed = 0, result = {}) => { //subtract 'bleed' px to each side to scale larger and hide a border const w = srcWidth - (bleed * 2); const h = srcHeight - (bleed * 2); let s = containerHeight / h; if (w * s < containerWidth) { s = containerWidth / w; } const iw = srcWidth * s; const ih = srcHeight * s; const ix = (containerWidth - iw) * 0.5; const iy = (containerHeight - ih) * 0.5; result.left = ix; result.top = iy; result.width = srcWidth * s; result.height = srcHeight * s; result.scale = s; return result; }; exports.distance = (arrA, arrB) => { const d = arrA.map((v, i) => arrB[i] - v); return Math.sqrt(d[0] * d[0] + d[1] * d[1]); }; /** * toggle an attribute on an element */ exports.setBooleanAttribute = (el, attr, isTrue) => isTrue ? el.setAttribute(attr, 'true') : el.removeAttribute(attr); /** * Convert a camelCase string to a lowercase hyphenated string * i.e. myFunVariable becomes my-fun-variable * @param camelString the camel-case string to convert to a hyphenated string */ exports.camelCaseToHyphenated = (camelString) => camelString.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase(); exports.computeStyleResult = (parent, styleKey, value) => { const tmp = document.createElement('div'); tmp.style.display = 'none'; tmp.style[styleKey] = value; parent.appendChild(tmp); const computed = window.getComputedStyle(tmp); const computedValue = computed[styleKey]; tmp.parentElement && tmp.parentElement.removeChild(tmp); return computedValue; }; exports.cssColorToArray = (css) => { function digits() { //hack off the trailing ) var str = css.substr(0, css.length - 1); //hack off rgb(, rgba(, hsl(, hsla( const fnStartIndex = str.indexOf('('); return str.substr(fnStartIndex + 1, str.length).split(','); } function makeNumbers(digitStrings) { let i = 0, l = digitStrings.length; const digits = []; for (i = 0; i < l; i++) { //cast to numbers from Strings digits[i] = parseFloat(digitStrings[i]); } return digits; } return makeNumbers(digits()); }; /***/ }), /***/ "./src/vec2.ts": /*!*********************!*\ !*** ./src/vec2.ts ***! \*********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. Object.defineProperty(exports, "__esModule", { value: true }); const utils_1 = __webpack_require__(/*! ./utils */ "./src/utils.ts"); const isVec2 = (v) => Array.isArray(v) && v.length === 2 && typeof v[0] === 'number'; const identity = (v) => v; const sq = (v) => v * v; exports.add = (a, b, result) => utils_1.fastMap(a, (val, i) => val + b[i], result); exports.angleBetween = (a, b) => Math.atan2(b[1] - a[1], b[0] - a[0]); exports.copy = (a, result = [NaN, NaN]) => utils_1.fastMap(a, identity, result); exports.distance = (a, b) => Math.sqrt(sq(b[0] - a[0]) + sq(b[1] - a[1])); exports.equal = (a, b) => a[0] === b[0] && a[1] === b[1]; function lerp(a, b, t, result = [NaN, NaN]) { result[0] = (b[0] - a[0]) * t + a[0]; result[1] = (b[1] - a[1]) * t + a[1]; return result; } exports.lerp = lerp; exports.magnitude = ([x, y]) => x * x + y * y; exports.normalize = (a, result = [NaN, NaN]) => { let mag = exports.magnitude(a); const [x, y] = a; if (mag > 0) { mag = 1.0 / Math.sqrt(mag); result[0] = x * mag; result[1] = y * mag; } return result; }; exports.scale = (a, b, result) => utils_1.fastMap(a, (val, i) => val * (isVec2(b) ? b[i] : b), result); exports.sub = (a, b, result) => utils_1.fastMap(a, (val, i) => val - b[i], result); function toCartesian([x, y], result = [NaN, NaN]) { result[0] = x * Math.cos(y); result[1] = x * Math.sin(y); return result; } exports.toCartesian = toCartesian; function toPolar([x, y], result = [NaN, NaN]) { result[0] = Math.sqrt(x * x + y * y); result[1] = Math.atan2(y, x); return result; } exports.toPolar = toPolar; /***/ }), /***/ "./src/webcam.ts": /*!***********************!*\ !*** ./src/webcam.ts ***! \***********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. Object.defineProperty(exports, "__esModule", { value: true }); const defaultVideoOptions = { facingMode: 'user', width: 640, height: 480, frameRate: 30 }; /** * utility to get a webcam feed in a video element * @returns Promise */ function getWebcam(video = document.createElement('video'), options = defaultVideoOptions) { if (!window.navigator.mediaDevices || !window.navigator.mediaDevices.getUserMedia) { return Promise.reject('Your browser does not support WebRTC. Please try another one.'); } return window.navigator.mediaDevices.getUserMedia({ video: options }) .then((mediaStream) => { video.srcObject = mediaStream; return video; }, () => { return Promise.reject('Could not open your camera. You may have denied access.'); }); } exports.getWebcam = getWebcam; ; const hasMediaStream = (video) => video.srcObject && video.srcObject instanceof MediaStream; const getMediaStream = (video) => hasMediaStream(video) ? video.srcObject : null; /** * stop all tracks on a video and its srcObject */ exports.stopAllTracks = (video) => { video.pause(); getMediaStream(video).getTracks().forEach(track => track.stop()); }; /** * WebcamCanvas simplifies initializing a WebRTC feed and rendering it to a canvas * it includes its own requestAnimationFrame loop using Animitter, providing * start(), stop() and events for 'update', 'start', 'stop' etc */ class WebcamCanvas { constructor() { this.domElement = document.createElement('canvas'); this.domElement.classList.add('webcam'); this.ctx = this.domElement.getContext('2d'); this.video = document.createElement('video'); this.resize = this.resize.bind(this); } initialize(videoOptions) { //if its already initialized return the older promise for immediate resolution if (!this.__promiseGetWebcam || !this.__promiseHasResized) { //the canvas has finished initializing when it has //a camera feed AND has resized to the cameras size //@ts-ignore this.__promiseHasResized = new Promise((resolve) => { const onTimeUpdate = () => { if (this.video.videoWidth * this.video.videoHeight < 4) { console.log('video not sized yet'); return; } this.resize(); this.video.removeEventListener('timeupdate', onTimeUpdate); resolve(); }; this.video.addEventListener('timeupdate', onTimeUpdate); }); this.__promiseGetWebcam = getWebcam(this.video, videoOptions) .then((video) => { //play returns a promise without any return return video.play().then(() => video); }); } //get the webcam and resize it, return the WebcamCanvas //@ts-ignore return Promise.all([this.__promiseGetWebcam, this.__promiseHasResized]) .then(() => this); } getFrameRate() { const stream = getMediaStream(this.video); if (stream) { const videoTracks = stream.getVideoTracks(); if (videoTracks && videoTracks[0]) { return videoTracks[0].getSettings().frameRate; } } return 30; } /** * get the image data from the canvas * @returns ImageData */ getImageData(x = 0, y = 0, w = this.domElement.width, h = this.domElement.height) { return this.ctx.getImageData(0, 0, w, h); } /** * update the rendering to the canvas * @param {Number} deltaTime, milliseconds since last update * @param {Number} elapsedTime, total milliseconds running * @param {Number} frameCount, number of updates that have occurred */ update() { this.ctx.setTransform(-1.0, 0, 0, 1, this.domElement.width, 0); // mirrored for draw of video this.ctx.drawImage(this.video, 0, 0, this.domElement.width, this.domElement.height); this.ctx.setTransform(1.0, 0, 0, 1, 0, 0); // unmirrored for draw of results } resize() { const changed = this.domElement.width !== this.video.videoWidth || this.domElement.height !== this.video.videoHeight; this.domElement.width = this.video.videoWidth; this.domElement.height = this.video.videoHeight; return this; } stop() { if (!this.__promiseGetWebcam) { return Promise.resolve(); } //prevent this https://developers.google.com/web/updates/2017/06/play-request-was-interrupted return this.__promiseGetWebcam .then(() => { exports.stopAllTracks(this.video); this.__promiseGetWebcam = this.__promiseHasResized = null; }); } } exports.WebcamCanvas = WebcamCanvas; /***/ }), /***/ 0: /*!**********************!*\ !*** util (ignored) ***! \**********************/ /*! no static exports found */ /***/ (function(module, exports) { /* (ignored) */ /***/ }), /***/ 1: /*!**********************!*\ !*** util (ignored) ***! \**********************/ /*! no static exports found */ /***/ (function(module, exports) { /* (ignored) */ /***/ }), /***/ 2: /*!************************!*\ !*** buffer (ignored) ***! \************************/ /*! no static exports found */ /***/ (function(module, exports) { /* (ignored) */ /***/ }), /***/ 3: /*!************************!*\ !*** crypto (ignored) ***! \************************/ /*! no static exports found */ /***/ (function(module, exports) { /* (ignored) */ /***/ }) /******/ }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb2x5bWVyL2xpdC1lbGVtZW50L2xpdC1lbGVtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9seW1lci9wb2x5bWVyL2xpYi9taXhpbnMvcHJvcGVydGllcy1jaGFuZ2VkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9seW1lci9wb2x5bWVyL2xpYi9taXhpbnMvcHJvcGVydGllcy1taXhpbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvbHltZXIvcG9seW1lci9saWIvdXRpbHMvYXJyYXktc3BsaWNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9seW1lci9wb2x5bWVyL2xpYi91dGlscy9hc3luYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvbHltZXIvcG9seW1lci9saWIvdXRpbHMvYm9vdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvbHltZXIvcG9seW1lci9saWIvdXRpbHMvY2FzZS1tYXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb2x5bWVyL3BvbHltZXIvbGliL3V0aWxzL2ZsYXR0ZW5lZC1ub2Rlcy1vYnNlcnZlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvbHltZXIvcG9seW1lci9saWIvdXRpbHMvbWl4aW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93LW1vZGVscy9wb3NlbmV0L2Rpc3QvcG9zZW5ldC5lc20uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29udmVydGVyL2Rpc3QvdGYtY29udmVydGVyLmVzbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvdGYtY29yZS5lc20uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtbGF5ZXJzL2Rpc3QvdGYtbGF5ZXJzLmVzbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy9kaXN0L3RmLmVzbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYW5pbWl0dGVyL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2FwaS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9iYXNlL2J1ZmZlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9iYXNlL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2Jhc2Uvbm9kZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9iYXNlL3JlcG9ydGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2NvbnN0YW50cy9kZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvY29uc3RhbnRzL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2RlY29kZXJzL2Rlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9kZWNvZGVycy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9kZWNvZGVycy9wZW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvZW5jb2RlcnMvZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2VuY29kZXJzL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2VuY29kZXJzL3BlbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXV0b2JpbmQtZGVjb3JhdG9yL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYmFzZTY0LWpzL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ibi5qcy9saWIvYm4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jyb3JhbmQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL2Flcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvYXV0aENpcGhlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvZGVjcnlwdGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9lbmNyeXB0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL2doYXNoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9pbmNyMzIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL21vZGVzL2NiYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvbW9kZXMvY2ZiLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9tb2Rlcy9jZmIxLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9tb2Rlcy9jZmI4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9tb2Rlcy9jdHIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL21vZGVzL2VjYi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvbW9kZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL21vZGVzL29mYi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvc3RyZWFtQ2lwaGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWNpcGhlci9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWRlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1kZXMvbW9kZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktcnNhL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LXNpZ24vYWxnb3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktc2lnbi9icm93c2VyL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LXNpZ24vYnJvd3Nlci9zaWduLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LXNpZ24vYnJvd3Nlci92ZXJpZnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2J1ZmZlci14b3IvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY2lwaGVyLWJhc2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtdXRpbC1pcy9saWIvdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY3JlYXRlLWVjZGgvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY3JlYXRlLWhhc2gvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY3JlYXRlLWhhc2gvbWQ1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jcmVhdGUtaG1hYy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jcmVhdGUtaG1hYy9sZWdhY3kuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1icm93c2VyaWZ5L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kZXMuanMvbGliL2Rlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGVzLmpzL2xpYi9kZXMvY2JjLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kZXMuanMvbGliL2Rlcy9jaXBoZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Rlcy5qcy9saWIvZGVzL2Rlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGVzLmpzL2xpYi9kZXMvZWRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kZXMuanMvbGliL2Rlcy91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGlmZmllLWhlbGxtYW4vYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGlmZmllLWhlbGxtYW4vbGliL2RoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kaWZmaWUtaGVsbG1hbi9saWIvZ2VuZXJhdGVQcmltZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvY3VydmUvYmFzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2N1cnZlL2Vkd2FyZHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9jdXJ2ZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2N1cnZlL21vbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9jdXJ2ZS9zaG9ydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2N1cnZlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2VjL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvZWMva2V5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvZWMvc2lnbmF0dXJlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvZWRkc2EvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9lZGRzYS9rZXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9lZGRzYS9zaWduYXR1cmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9wcmVjb21wdXRlZC9zZWNwMjU2azEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZXZwX2J5dGVzdG9rZXkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2hhc2gtYmFzZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC9jb21tb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2hhc2guanMvbGliL2hhc2gvaG1hYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC9yaXBlbWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2hhc2guanMvbGliL2hhc2gvc2hhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS8xLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS8yMjQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2hhc2guanMvbGliL2hhc2gvc2hhLzI1Ni5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC9zaGEvMzg0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS81MTIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2hhc2guanMvbGliL2hhc2gvc2hhL2NvbW1vbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaG1hYy1kcmJnL2xpYi9obWFjLWRyYmcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2luZGV4b2YvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2lzYXJyYXkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL2xpYi9saXQtZXh0ZW5kZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL2xpYi9tb2RpZnktdGVtcGxhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL2xpYi9zaGFkeS1yZW5kZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL2xpdC1odG1sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9tZDUuanMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL21pbGxlci1yYWJpbi9saWIvbXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL21pbmltYWxpc3RpYy1hc3NlcnQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL21pbmltYWxpc3RpYy1jcnlwdG8tdXRpbHMvbGliL3V0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wYXJzZS1hc24xL2FzbjEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3BhcnNlLWFzbjEvY2VydGlmaWNhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3BhcnNlLWFzbjEvZml4UHJvYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGFyc2UtYXNuMS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGJrZGYyL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Bia2RmMi9saWIvYXN5bmMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Bia2RmMi9saWIvZGVmYXVsdC1lbmNvZGluZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGJrZGYyL2xpYi9wcmVjb25kaXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Bia2RmMi9saWIvc3luYy1icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wZXJmb3JtYW5jZS1ub3cvbGliL3BlcmZvcm1hbmNlLW5vdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy1uZXh0aWNrLWFyZ3MvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHVibGljLWVuY3J5cHQvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHVibGljLWVuY3J5cHQvbWdmLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wdWJsaWMtZW5jcnlwdC9wcml2YXRlRGVjcnlwdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHVibGljLWVuY3J5cHQvcHVibGljRW5jcnlwdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHVibGljLWVuY3J5cHQvd2l0aFB1YmxpYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHVibGljLWVuY3J5cHQveG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yYWYvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JhbmRvbWJ5dGVzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JhbmRvbWZpbGwvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2R1cGxleC1icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvQnVmZmVyTGlzdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3kuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9zdHJlYW0tYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL3Bhc3N0aHJvdWdoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUtYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL3RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL3dyaXRhYmxlLWJyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JpcGVtZDE2MC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NldGltbWVkaWF0ZS9zZXRJbW1lZGlhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NoYS5qcy9oYXNoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zaGEuanMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NoYS5qcy9zaGEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NoYS5qcy9zaGExLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zaGEuanMvc2hhMjI0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zaGEuanMvc2hhMjU2LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zaGEuanMvc2hhMzg0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zaGEuanMvc2hhNTEyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvbGliL3N0cmluZ19kZWNvZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90aW1lcnMtYnJvd3NlcmlmeS9tYWluLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dGlsLWRlcHJlY2F0ZS9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy92bS1icm93c2VyaWZ5L2luZGV4LmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9hYnN0cmFjdC1pbnB1dC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9hYnN0cmFjdC1tb2RhbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9hYnN0cmFjdC1zZWxlY3QudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvYWJzdHJhY3QtdWkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvYnV0dG9uLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2NvbnRlbnQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvZGVjb3JhdG9ycy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9ncm91cC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9pY29uLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2lucHV0LW1vZGUtc2VsZWN0LnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2l0ZW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvbW91c2UtaW5wdXQtY2FsaWJyYXRpb24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvbW91c2UtaW5wdXQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvb3B0Z3JvdXAudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvcG9zZS1pbnB1dC1jYWxpYnJhdGlvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9wb3NlLWlucHV0LnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL3JhbmdlLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL3NlbGVjdC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9zaWRlLXBhbmVsLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL3NsaWRlLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL3NsaWRlc2hvdy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9zbmFja2Jhci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9zdHlsZXMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvdG9nZ2xlLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL3R1dG9yaWFsLnRzIiwid2VicGFjazovLy8uL3NyYy9ldmVudHMvZXJyb3ItZXZlbnQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2V2ZW50cy9pbnB1dC1ldmVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tleWJvYXJkLXNob3J0Y3V0LW9ic2VydmVyLnRzIiwid2VicGFjazovLy8uL3NyYy9tb3VzZS1wb3NpdGlvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3ZlYzIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3dlYmNhbS50cyIsIndlYnBhY2s6Ly8vdXRpbCAoaWdub3JlZCkiLCJ3ZWJwYWNrOi8vL3V0aWwgKGlnbm9yZWQpPzU0NmQiLCJ3ZWJwYWNrOi8vL2J1ZmZlciAoaWdub3JlZCkiLCJ3ZWJwYWNrOi8vL2NyeXB0byAoaWdub3JlZCkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0RBQTBDLGdDQUFnQztBQUMxRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdFQUF3RCxrQkFBa0I7QUFDMUU7QUFDQSx5REFBaUQsY0FBYztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQXlDLGlDQUFpQztBQUMxRSx3SEFBZ0gsbUJBQW1CLEVBQUU7QUFDckk7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNE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NkMsRUFBRSw2Q0FBNkMsRUFBRSxpRUFBaUUsRUFBRSxFQUFFLHlGQUF5Riw2Q0FBNkMsRUFBRSw2Q0FBNkMsRUFBRSxpRUFBaUUsRUFBRSxFQUFFLDZEQUE2RCw2Q0FBNkMsRUFBRSw2Q0FBNkMsRUFBRSxpRUFBaUUsRUFBRSxFQUFFLGtFQUFrRSw2Q0FBNkMsRUFBRSw2Q0FBNkMsRUFBRSxpRUFBaUUsRUFBRSw0QkFBNEIsVUFBVSxXQUFXLDZEQUE2RCw2Q0FBNkMsRUFBRSxpRUFBaUUsRUFBRSxFQUFFLCtEQUErRCw2Q0FBNkMsRUFBRSxpRUFBaUUsRUFBRSxFQUFFLCtEQUErRCw2Q0FBNkMsRUFBRSxpRUFBaUUsRUFBRSxFQUFFLCtEQUErRCw2Q0FBNkMsRUFBRSxpRUFBaUUsRUFBRSxFQUFFLCtEQUErRCw2Q0FBNkMsRUFBRSxpRUFBaUUsRUFBRSxFQUFFLDZFQUE2RSw2Q0FBNkMsRUFBRSxzRUFBc0UsRUFBRSxzRUFBc0UsRUFBRSxFQUFFLDZEQUE2RCw2Q0FBNkMsRUFBRSxpRUFBaUUsRUFBRSxFQUFFLCtEQUErRCw2Q0FBNkMsRUFBRSxpRUFBaUUsRUFBRSxFQUFFLDZEQUE2RCw2Q0FBNkMsRUFBRSxpRUFBaUUsRUFBRSxFQUFFLDZEQUE2RCw2Q0FBNkMsRUFBRSxpRUFBaUUsRUFBRSxFQUFFLGlFQUFpRSw2Q0FBNkMsRUFBRSxpRUFBaUUsRUFBRSxFQUFFLDZEQUE2RCw2Q0FBNkMsRUFBRSxpRUFBaUUsRUFBRSxFQUFFLDZEQUE2RCw2Q0FBNkMsRUFBRSxpRUFBaUUsRUFBRSxFQUFFLCtEQUErRCw2Q0FBNkMsRUFBRSxpRUFBaUUsRUFBRSxFQUFFLHVFQUF1RSw2Q0FBNkMsRUFBRSxpRUFBaUUsRUFBRSx3REFBd0QsRUFBRSx3REFBd0QsRUFBRSxFQUFFLCtEQUErRCw2Q0FBNkMsRUFBRSxpRUFBaUUsRUFBRSxFQUFFLHFFQUFxRSw2Q0FBNkMsRUFBRSxpRUFBaUUsRUFBRSxFQUFFLDZEQUE2RCw2Q0FBNkMsRUFBRSxpRUFBaUUsRUFBRSxFQUFFLCtEQUErRCw2Q0FBNkMsRUFBRSxpRUFB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QTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0JBQWdCO0FBQ2hCO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN6bkJBLGVBQWUsbUJBQU8sQ0FBQyw2REFBVTs7QUFFakM7QUFDQTtB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QTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsU0FBUztBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBDQUEwQyxVQUFVO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN0SkE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYSxtQkFBTyxDQUFDLGVBQVE7QUFDN0IsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLDRCQUE0QjtBQUM3QztBQUNBOztBQUVBLGlCQUFpQixhQUFhO0FBQzlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTCxpQkFBaUIsYUFBYTtBQUM5QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsWUFBWSxlQUFlO0FBQzNCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixTQUFTO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0QsV0FBVztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQixvQkFBb0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELFdBQVc7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLE9BQU87QUFDMUI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixPQUFPO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FB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Q0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLCtDQUErQztBQUNsRTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxxQkFBcUIsc0NBQXNDO0FBQzNEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxnQkFBZ0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSx5QkFBeUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpQkFBaUI7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGNBQWM7QUFDbkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHVCQUF1QixRQUFRO0FBQy9CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQyxRQUFRO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQ0FBaUMsUUFBUTtBQUN6QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkIsbUNBQW1DO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDZCQUE2QixtQ0FBbUM7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSw2QkFBNkIsbUNBQW1DO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQTZCLG1DQUFtQztBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1QkFBdUIsMEJBQTBCO0FBQ2pEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQixnQ0FBZ0M7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQyxRQUFRO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixZQUFZO0FBQy9CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxnQkFBZ0Isa0JBQWtCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQixnQkFBZ0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsZ0JBQWdCO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsb0JBQW9CO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsZ0JBQWdCO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNEJBQTRCLFFBQVE7QUFDcEM7QUFDQSw2QkFBNkIsUUFBUTtBQUNyQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ2wyR0Q7O0FBRUE7QUFD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O0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixVQUFVO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsdUNBQXVDLFNBQVM7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpQkFBaUI7QUFDaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLGlCQUFpQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsRUFBRTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsZUFBZTtBQUN2QztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBLHFCQUFxQixlQUFlO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsU0FBUztBQUM5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsbUJBQW1CLGNBQWM7QUFDakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVEQUF1RCxPQUFPO0FBQzlEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1REFBdUQsT0FBTztBQUM5RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7O0FDbEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDMUdBLDZEQUFlLG1CQUFPLENBQUMseURBQVU7QUFDakMsU0FBUyxtQkFBTyxDQUFDLDZDQUFPOztBQUV4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBOztBQUVBO0FBQ0EsdUJBQXVCLFFBQVE7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsU0FBUztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQixXQUFXO0FBQzVCLG1CQUFtQixVQUFVO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQixPQUFPO0FBQ3hCO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ3RYYTs7QUFFYixZQUFZLG1CQUFPLENBQUMscUVBQVU7QUFDOUIsZUFBZSxtQkFBTyxDQUFDLCtEQUFnQjtBQUN2QyxTQUFTLG1CQUFPLENBQUMsNkNBQU87QUFDeEIsZUFBZSxtQkFBTyxDQUFDLDZEQUFVO0FBQ2pDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwyREFBMkQ7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUssZUFBZTtBQUNwQixLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsbUJBQW1CO0FBQ3BDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixXQUFXO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUIsU0FBUztBQUM1QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDeDZCYTs7QUFFYjs7QUFFQSxXQUFXLG1CQUFPLENBQUMsbURBQVM7QUFDNUIsZUFBZSxtQkFBTyxDQUFDLDREQUFhOztBQUVwQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQSxRQUFRLG1CQUFPLENBQUMsOEZBQXlCO0FBQ3pDLENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7Ozs7Ozs7Ozs7Ozs7QUM1TVk7O0FBRWIsU0FBUyxtQkFBTyxDQUFDLDZDQUFPO0FBQ3hC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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDM3dCYTs7QUFFYjtBQUNBLFNBQVMsbUJBQU8sQ0FBQyw2Q0FBTztBQUN4QixnQkFBZ0IsbUJBQU8sQ0FBQyx3RUFBcUI7QUFDN0MsZUFBZSxtQkFBTyxDQUFDLHdGQUEyQjs7QUFFbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CLFdBQVc7QUFDOUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0gsb0JBQW9CLFNBQVM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsUUFBUTtBQUN6QjtBQUNBLFFBQVEsY0FBYztBQUN0Qiw4Q0FBOEM7QUFDOUM7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQSwwQkFBMEI7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsY0FBYztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsdUJBQXVCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGVBQWU7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ3NDO0FBQ3RDO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLDRCQUE0QjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxFQUFFO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7Ozs7Ozs7Ozs7O0FDekhEO0FBQ0E7O0FBRVk7O0FBRVosVUFBVSxtQkFBTyxDQUFDLG1EQUFTOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7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Q3BCLENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOzs7Ozs7Ozs7Ozs7OztBQzFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNB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c0NBQXNDLG1CQUFPLENBQUMsNEVBQWlCO0FBQy9EO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEVBQTRFO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSw0Q0FBNEM7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQjs7QUFFcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsU0FBUztBQUM1QjtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEVBQTRFOztBQUU1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIseUJBQXlCO0FBQzFDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBLG1EQUFtRCxpRUFBaUU7QUFDcEg7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdDQUFnQyxPQUFPO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLEM7Ozs7Ozs7Ozs7Ozs7QUMxL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixtQkFBTyxDQUFDLDhFQUFrQjs7QUFFL0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlDQUFpQzs7QUFFakM7O0FBRUEsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsb0RBQW9EO0FBQ3BEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7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QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7QUFDQSxRQUFRLFNBQVM7QUFDakI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7O0FDblFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsU0FBUyxtQkFBTyxDQUFDLCtDQUFRO0FBQ3pCLGVBQWUsbUJBQU8sQ0FBQyw2REFBVTs7QUFFakM7QUFDQSxrQkFBa0IsbUJBQU8sQ0FBQyx1RkFBNkI7QUFDdkQsa0JBQWtCLG1CQUFPLENBQUMsdUZBQTZCO0FBQ3ZELGdCQUFnQixtQkFBTyxDQUFDLG1GQUEyQjtBQUNuRCxtQkFBbUIsbUJBQU8sQ0FBQyxpRkFBOEI7QUFDekQscUJBQXFCLG1CQUFPLENBQUMscUZBQWdDOztBQUU3RDtBQUNBOzs7O0FBSUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQzlIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViOztBQUVBLGFBQWEsbUJBQU8sQ0FBQyx3REFBYTtBQUNsQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLHNDQUFzQyxzQ0FBc0M7QUFDekc7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEM7Ozs7Ozs7Ozs7O0FDdlNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQSxtQkFBTyxDQUFDLGlFQUFjO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUM3REE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixXQUFXLE9BQU87QUFDbEIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtB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R0FBRyxDQUFDLFlBQVksQ0FBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsaUNBQWlDO0lBQ2pGLENBQUM7SUFFRCxNQUFNO1FBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDckgsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFDOUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDaEQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQUk7UUFDQSxJQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFDO1lBQ3hCLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQzVCO1FBQ0QsNkZBQTZGO1FBQzdGLE9BQU8sSUFBSSxDQUFDLGtCQUFrQjthQUN6QixJQUFJLENBQUMsR0FBRSxFQUFFO1lBQ04scUJBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztDQUNKO0FBekdELG9DQXlHQzs7Ozs7Ozs7Ozs7O0FDbktELGU7Ozs7Ozs7Ozs7O0FDQUEsZTs7Ozs7Ozs7Ozs7QUNBQSxlOzs7Ozs7Ozs7OztBQ0FBLGUiLCJmaWxlIjoiYWNjLWNvbXBvbmVudHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9pbmRleC50c1wiKTtcbiIsImltcG9ydCB7IFByb3BlcnRpZXNNaXhpbiB9IGZyb20gJ0Bwb2x5bWVyL3BvbHltZXIvbGliL21peGlucy9wcm9wZXJ0aWVzLW1peGluLmpzJztcbmltcG9ydCB7IGNhbWVsVG9EYXNoQ2FzZSB9IGZyb20gJ0Bwb2x5bWVyL3BvbHltZXIvbGliL3V0aWxzL2Nhc2UtbWFwLmpzJztcbmltcG9ydCB7IHJlbmRlciB9IGZyb20gJ2xpdC1odG1sL2xpYi9zaGFkeS1yZW5kZXIuanMnO1xuZXhwb3J0IHsgaHRtbCwgc3ZnIH0gZnJvbSAnbGl0LWh0bWwvbGliL2xpdC1leHRlbmRlZC5qcyc7XG4vKipcbiAqIFJlbmRlcnMgYXR0cmlidXRlcyB0byB0aGUgZ2l2ZW4gZWxlbWVudCBiYXNlZCBvbiB0aGUgYGF0dHJJbmZvYCBvYmplY3Qgd2hlcmVcbiAqIGJvb2xlYW4gdmFsdWVzIGFyZSBhZGRlZC9yZW1vdmVkIGFzIGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0gZWxlbWVudCBFbGVtZW50IG9uIHdoaWNoIHRvIHNldCBhdHRyaWJ1dGVzLlxuICogQHBhcmFtIGF0dHJJbmZvIE9iamVjdCBkZXNjcmliaW5nIGF0dHJpYnV0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJBdHRyaWJ1dGVzKGVsZW1lbnQsIGF0dHJJbmZvKSB7XG4gICAgZm9yIChjb25zdCBhIGluIGF0dHJJbmZvKSB7XG4gICAgICAgIGNvbnN0IHYgPSBhdHRySW5mb1thXSA9PT0gdHJ1ZSA/ICcnIDogYXR0ckluZm9bYV07XG4gICAgICAgIGlmICh2IHx8IHYgPT09ICcnIHx8IHYgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZShhKSAhPT0gdikge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGEsIFN0cmluZyh2KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoYSkpIHtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGEpO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIG9mIGNzcyBjbGFzcyBuYW1lcyBmb3JtZWQgYnkgdGFraW5nIHRoZSBwcm9wZXJ0aWVzXG4gKiBpbiB0aGUgYGNsYXNzSW5mb2Agb2JqZWN0IGFuZCBhcHBlbmRpbmcgdGhlIHByb3BlcnR5IG5hbWUgdG8gdGhlIHN0cmluZyBvZlxuICogY2xhc3MgbmFtZXMgaWYgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRydXRoeS5cbiAqIEBwYXJhbSBjbGFzc0luZm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzU3RyaW5nKGNsYXNzSW5mbykge1xuICAgIGNvbnN0IG8gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gY2xhc3NJbmZvKSB7XG4gICAgICAgIGNvbnN0IHYgPSBjbGFzc0luZm9bbmFtZV07XG4gICAgICAgIGlmICh2KSB7XG4gICAgICAgICAgICBvLnB1c2gobmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG8uam9pbignICcpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgY3NzIHN0eWxlIHN0cmluZyBmb3JtZWQgYnkgdGFraW5nIHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBgc3R5bGVJbmZvYFxuICogb2JqZWN0IGFuZCBhcHBlbmRpbmcgdGhlIHByb3BlcnR5IG5hbWUgKGRhc2gtY2FzZWQpIGNvbG9uIHRoZVxuICogcHJvcGVydHkgdmFsdWUuIFByb3BlcnRpZXMgYXJlIHNlcGFyYXRlZCBieSBhIHNlbWktY29sb24uXG4gKiBAcGFyYW0gc3R5bGVJbmZvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHlsZVN0cmluZyhzdHlsZUluZm8pIHtcbiAgICBjb25zdCBvID0gW107XG4gICAgZm9yIChjb25zdCBuYW1lIGluIHN0eWxlSW5mbykge1xuICAgICAgICBjb25zdCB2ID0gc3R5bGVJbmZvW25hbWVdO1xuICAgICAgICBpZiAodiB8fCB2ID09PSAwKSB7XG4gICAgICAgICAgICBvLnB1c2goYCR7Y2FtZWxUb0Rhc2hDYXNlKG5hbWUpfTogJHt2fWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvLmpvaW4oJzsgJyk7XG59XG5leHBvcnQgY2xhc3MgTGl0RWxlbWVudCBleHRlbmRzIFByb3BlcnRpZXNNaXhpbihIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl9fcmVuZGVyQ29tcGxldGUgPSBudWxsO1xuICAgICAgICB0aGlzLl9fcmVzb2x2ZVJlbmRlckNvbXBsZXRlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fX2lzSW52YWxpZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9faXNDaGFuZ2luZyA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB3aGljaCBzZXRzIHVwIGVsZW1lbnQgcmVuZGVyaW5nIGJ5IGNhbGxpbmcqIGBfY3JlYXRlUm9vdGBcbiAgICAgKiBhbmQgYF9maXJzdFJlbmRlcmVkYC5cbiAgICAgKi9cbiAgICByZWFkeSgpIHtcbiAgICAgICAgdGhpcy5fcm9vdCA9IHRoaXMuX2NyZWF0ZVJvb3QoKTtcbiAgICAgICAgc3VwZXIucmVhZHkoKTtcbiAgICAgICAgdGhpcy5fZmlyc3RSZW5kZXJlZCgpO1xuICAgIH1cbiAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUyAmJiB0aGlzLl9yb290KSB7XG4gICAgICAgICAgICB3aW5kb3cuU2hhZHlDU1Muc3R5bGVFbGVtZW50KHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCBhZnRlciB0aGUgZWxlbWVudCBET00gaXMgcmVuZGVyZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAqIEltcGxlbWVudCB0byBwZXJmb3JtIHRhc2tzIGFmdGVyIGZpcnN0IHJlbmRlcmluZyBsaWtlIGNhcHR1cmluZyBhXG4gICAgICogcmVmZXJlbmNlIHRvIGEgc3RhdGljIG5vZGUgd2hpY2ggbXVzdCBiZSBkaXJlY3RseSBtYW5pcHVsYXRlZC5cbiAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgY29tbW9ubHkgbmVlZGVkLiBGb3IgdGFza3Mgd2hpY2ggc2hvdWxkIGJlIHBlcmZvcm1lZFxuICAgICAqIGJlZm9yZSBmaXJzdCByZW5kZXIsIHVzZSB0aGUgZWxlbWVudCBjb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBfZmlyc3RSZW5kZXJlZCgpIHsgfVxuICAgIC8qKlxuICAgICAqIEltcGxlbWVudCB0byBjdXN0b21pemUgd2hlcmUgdGhlIGVsZW1lbnQncyB0ZW1wbGF0ZSBpcyByZW5kZXJlZCBieVxuICAgICAqIHJldHVybmluZyBhbiBlbGVtZW50IGludG8gd2hpY2ggdG8gcmVuZGVyLiBCeSBkZWZhdWx0IHRoaXMgY3JlYXRlc1xuICAgICAqIGEgc2hhZG93Um9vdCBmb3IgdGhlIGVsZW1lbnQuIFRvIHJlbmRlciBpbnRvIHRoZSBlbGVtZW50J3MgY2hpbGROb2RlcyxcbiAgICAgKiByZXR1cm4gYHRoaXNgLlxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fERvY3VtZW50RnJhZ21lbnR9IFJldHVybnMgYSBub2RlIGludG8gd2hpY2ggdG8gcmVuZGVyLlxuICAgICAqL1xuICAgIF9jcmVhdGVSb290KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHdoaWNoIHJldHVybnMgdGhlIHZhbHVlIG9mIGBfc2hvdWxkUmVuZGVyYCB3aGljaCB1c2Vyc1xuICAgICAqIHNob3VsZCBpbXBsZW1lbnQgdG8gY29udHJvbCByZW5kZXJpbmcuIElmIHRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UsXG4gICAgICogX3Byb3BlcnRpZXNDaGFuZ2VkIHdpbGwgbm90IGJlIGNhbGxlZCBhbmQgbm8gcmVuZGVyaW5nIHdpbGwgb2NjdXIgZXZlblxuICAgICAqIGlmIHByb3BlcnR5IHZhbHVlcyBjaGFuZ2Ugb3IgYHJlcXVlc3RSZW5kZXJgIGlzIGNhbGxlZC5cbiAgICAgKiBAcGFyYW0gX3Byb3BzIEN1cnJlbnQgZWxlbWVudCBwcm9wZXJ0aWVzXG4gICAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcHMgQ2hhbmdpbmcgZWxlbWVudCBwcm9wZXJ0aWVzXG4gICAgICogQHBhcmFtIF9wcmV2UHJvcHMgUHJldmlvdXMgZWxlbWVudCBwcm9wZXJ0aWVzXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IERlZmF1bHQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHJldHVybnMgdHJ1ZS5cbiAgICAgKi9cbiAgICBfc2hvdWxkUHJvcGVydGllc0NoYW5nZShfcHJvcHMsIF9jaGFuZ2VkUHJvcHMsIF9wcmV2UHJvcHMpIHtcbiAgICAgICAgY29uc3Qgc2hvdWxkUmVuZGVyID0gdGhpcy5fc2hvdWxkUmVuZGVyKF9wcm9wcywgX2NoYW5nZWRQcm9wcywgX3ByZXZQcm9wcyk7XG4gICAgICAgIGlmICghc2hvdWxkUmVuZGVyICYmIHRoaXMuX19yZXNvbHZlUmVuZGVyQ29tcGxldGUpIHtcbiAgICAgICAgICAgIHRoaXMuX19yZXNvbHZlUmVuZGVyQ29tcGxldGUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaG91bGRSZW5kZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEltcGxlbWVudCB0byBjb250cm9sIGlmIHJlbmRlcmluZyBzaG91bGQgb2NjdXIgd2hlbiBwcm9wZXJ0eSB2YWx1ZXNcbiAgICAgKiBjaGFuZ2Ugb3IgYHJlcXVlc3RSZW5kZXJgIGlzIGNhbGxlZC4gQnkgZGVmYXVsdCwgdGhpcyBtZXRob2QgYWx3YXlzXG4gICAgICogcmV0dXJucyB0cnVlLCBidXQgdGhpcyBjYW4gYmUgY3VzdG9taXplZCBhcyBhbiBvcHRpbWl6YXRpb24gdG8gYXZvaWRcbiAgICAgKiByZW5kZXJpbmcgd29yayB3aGVuIGNoYW5nZXMgb2NjdXIgd2hpY2ggc2hvdWxkIG5vdCBiZSByZW5kZXJlZC5cbiAgICAgKiBAcGFyYW0gX3Byb3BzIEN1cnJlbnQgZWxlbWVudCBwcm9wZXJ0aWVzXG4gICAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcHMgQ2hhbmdpbmcgZWxlbWVudCBwcm9wZXJ0aWVzXG4gICAgICogQHBhcmFtIF9wcmV2UHJvcHMgUHJldmlvdXMgZWxlbWVudCBwcm9wZXJ0aWVzXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IERlZmF1bHQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHJldHVybnMgdHJ1ZS5cbiAgICAgKi9cbiAgICBfc2hvdWxkUmVuZGVyKF9wcm9wcywgX2NoYW5nZWRQcm9wcywgX3ByZXZQcm9wcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgd2hpY2ggcGVyZm9ybXMgZWxlbWVudCByZW5kZXJpbmcgYnkgY2FsbGluZ1xuICAgICAqIGBfcmVuZGVyYCwgYF9hcHBseVJlbmRlcmAsIGFuZCBmaW5hbGx5IGBfZGlkUmVuZGVyYC5cbiAgICAgKiBAcGFyYW0gcHJvcHMgQ3VycmVudCBlbGVtZW50IHByb3BlcnRpZXNcbiAgICAgKiBAcGFyYW0gY2hhbmdlZFByb3BzIENoYW5naW5nIGVsZW1lbnQgcHJvcGVydGllc1xuICAgICAqIEBwYXJhbSBwcmV2UHJvcHMgUHJldmlvdXMgZWxlbWVudCBwcm9wZXJ0aWVzXG4gICAgICovXG4gICAgX3Byb3BlcnRpZXNDaGFuZ2VkKHByb3BzLCBjaGFuZ2VkUHJvcHMsIHByZXZQcm9wcykge1xuICAgICAgICBzdXBlci5fcHJvcGVydGllc0NoYW5nZWQocHJvcHMsIGNoYW5nZWRQcm9wcywgcHJldlByb3BzKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcmVuZGVyKHByb3BzKTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiB0aGlzLl9yb290ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2FwcGx5UmVuZGVyKHJlc3VsdCwgdGhpcy5fcm9vdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGlkUmVuZGVyKHByb3BzLCBjaGFuZ2VkUHJvcHMsIHByZXZQcm9wcyk7XG4gICAgICAgIGlmICh0aGlzLl9fcmVzb2x2ZVJlbmRlckNvbXBsZXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9fcmVzb2x2ZVJlbmRlckNvbXBsZXRlKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9mbHVzaFByb3BlcnRpZXMoKSB7XG4gICAgICAgIHRoaXMuX19pc0NoYW5naW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fX2lzSW52YWxpZCA9IGZhbHNlO1xuICAgICAgICBzdXBlci5fZmx1c2hQcm9wZXJ0aWVzKCk7XG4gICAgICAgIHRoaXMuX19pc0NoYW5naW5nID0gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHdoaWNoIHdhcm5zIHdoZW4gYSB1c2VyIGF0dGVtcHRzIHRvIGNoYW5nZSBhIHByb3BlcnR5IGR1cmluZ1xuICAgICAqIHRoZSByZW5kZXJpbmcgbGlmZWN5Y2xlLiBUaGlzIGlzIGFuIGFudGktcGF0dGVybiBhbmQgc2hvdWxkIGJlIGF2b2lkZWQuXG4gICAgICogQHBhcmFtIHByb3BlcnR5IHtzdHJpbmd9XG4gICAgICogQHBhcmFtIHZhbHVlIHthbnl9XG4gICAgICogQHBhcmFtIG9sZCB7YW55fVxuICAgICAqL1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnlcbiAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHtcbiAgICAgICAgY29uc3QgY2hhbmdlID0gc3VwZXIuX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHByb3BlcnR5LCB2YWx1ZSwgb2xkKTtcbiAgICAgICAgaWYgKGNoYW5nZSAmJiB0aGlzLl9faXNDaGFuZ2luZykge1xuICAgICAgICAgICAgY29uc29sZS50cmFjZShgU2V0dGluZyBwcm9wZXJ0aWVzIGluIHJlc3BvbnNlIHRvIG90aGVyIHByb3BlcnRpZXMgY2hhbmdpbmcgYCArXG4gICAgICAgICAgICAgICAgYGNvbnNpZGVyZWQgaGFybWZ1bC4gU2V0dGluZyAnJHtwcm9wZXJ0eX0nIGZyb20gYCArXG4gICAgICAgICAgICAgICAgYCcke3RoaXMuX2dldFByb3BlcnR5KHByb3BlcnR5KX0nIHRvICcke3ZhbHVlfScuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYW5nZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW1wbGVtZW50IHRvIGRlc2NyaWJlIHRoZSBET00gd2hpY2ggc2hvdWxkIGJlIHJlbmRlcmVkIGluIHRoZSBlbGVtZW50LlxuICAgICAqIElkZWFsbHksIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBhIHB1cmUgZnVuY3Rpb24gdXNpbmcgb25seSBwcm9wcyB0byBkZXNjcmliZVxuICAgICAqIHRoZSBlbGVtZW50IHRlbXBsYXRlLiBUaGUgaW1wbGVtZW50YXRpb24gbXVzdCByZXR1cm4gYSBgbGl0LWh0bWxgXG4gICAgICogVGVtcGxhdGVSZXN1bHQuIEJ5IGRlZmF1bHQgdGhpcyB0ZW1wbGF0ZSBpcyByZW5kZXJlZCBpbnRvIHRoZSBlbGVtZW50J3NcbiAgICAgKiBzaGFkb3dSb290LiBUaGlzIGNhbiBiZSBjdXN0b21pemVkIGJ5IGltcGxlbWVudGluZyBgX2NyZWF0ZVJvb3RgLiBUaGlzXG4gICAgICogbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQuXG4gICAgICogQHBhcmFtIHsqfSBfcHJvcHMgQ3VycmVudCBlbGVtZW50IHByb3BlcnRpZXNcbiAgICAgKiBAcmV0dXJucyB7VGVtcGxhdGVSZXN1bHR9IE11c3QgcmV0dXJuIGEgbGl0LWh0bWwgVGVtcGxhdGVSZXN1bHQuXG4gICAgICovXG4gICAgX3JlbmRlcihfcHJvcHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdfcmVuZGVyKCkgbm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgdGhlIGdpdmVuIGxpdC1odG1sIHRlbXBsYXRlIGByZXN1bHRgIGludG8gdGhlIGdpdmVuIGBub2RlYC5cbiAgICAgKiBJbXBsZW1lbnQgdG8gY3VzdG9taXplIHRoZSB3YXkgcmVuZGVyaW5nIGlzIGFwcGxpZWQuIFRoaXMgaXMgc2hvdWxkIG5vdFxuICAgICAqIHR5cGljYWxseSBiZSBuZWVkZWQgYW5kIGlzIHByb3ZpZGVkIGZvciBhZHZhbmNlZCB1c2UgY2FzZXMuXG4gICAgICogQHBhcmFtIHJlc3VsdCB7VGVtcGxhdGVSZXN1bHR9IGBsaXQtaHRtbGAgdGVtcGxhdGUgcmVzdWx0IHRvIHJlbmRlclxuICAgICAqIEBwYXJhbSBub2RlIHtFbGVtZW50fERvY3VtZW50RnJhZ21lbnR9IG5vZGUgaW50byB3aGljaCB0byByZW5kZXJcbiAgICAgKi9cbiAgICBfYXBwbHlSZW5kZXIocmVzdWx0LCBub2RlKSB7XG4gICAgICAgIHJlbmRlcihyZXN1bHQsIG5vZGUsIHRoaXMubG9jYWxOYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGFmdGVyIGVsZW1lbnQgRE9NIGhhcyBiZWVuIHJlbmRlcmVkLiBJbXBsZW1lbnQgdG9cbiAgICAgKiBkaXJlY3RseSBjb250cm9sIHJlbmRlcmVkIERPTS4gVHlwaWNhbGx5IHRoaXMgaXMgbm90IG5lZWRlZCBhcyBgbGl0LWh0bWxgXG4gICAgICogY2FuIGJlIHVzZWQgaW4gdGhlIGBfcmVuZGVyYCBtZXRob2QgdG8gc2V0IHByb3BlcnRpZXMsIGF0dHJpYnV0ZXMsIGFuZFxuICAgICAqIGV2ZW50IGxpc3RlbmVycy4gSG93ZXZlciwgaXQgaXMgc29tZXRpbWVzIHVzZWZ1bCBmb3IgY2FsbGluZyBtZXRob2RzIG9uXG4gICAgICogcmVuZGVyZWQgZWxlbWVudHMsIGxpa2UgY2FsbGluZyBgZm9jdXMoKWAgb24gYW4gZWxlbWVudCB0byBmb2N1cyBpdC5cbiAgICAgKiBAcGFyYW0gX3Byb3BzIEN1cnJlbnQgZWxlbWVudCBwcm9wZXJ0aWVzXG4gICAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcHMgQ2hhbmdpbmcgZWxlbWVudCBwcm9wZXJ0aWVzXG4gICAgICogQHBhcmFtIF9wcmV2UHJvcHMgUHJldmlvdXMgZWxlbWVudCBwcm9wZXJ0aWVzXG4gICAgICovXG4gICAgX2RpZFJlbmRlcihfcHJvcHMsIF9jaGFuZ2VkUHJvcHMsIF9wcmV2UHJvcHMpIHsgfVxuICAgIC8qKlxuICAgICAqIENhbGwgdG8gcmVxdWVzdCB0aGUgZWxlbWVudCB0byBhc3luY2hyb25vdXNseSByZS1yZW5kZXIgcmVnYXJkbGVzc1xuICAgICAqIG9mIHdoZXRoZXIgb3Igbm90IGFueSBwcm9wZXJ0eSBjaGFuZ2VzIGFyZSBwZW5kaW5nLlxuICAgICAqL1xuICAgIHJlcXVlc3RSZW5kZXIoKSB7IHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7IH1cbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB3aGljaCBwcm92aWRlcyB0cmFja2luZyBvZiBpbnZhbGlkYXRlZCBzdGF0ZS5cbiAgICAgKi9cbiAgICBfaW52YWxpZGF0ZVByb3BlcnRpZXMoKSB7XG4gICAgICAgIHRoaXMuX19pc0ludmFsaWQgPSB0cnVlO1xuICAgICAgICBzdXBlci5faW52YWxpZGF0ZVByb3BlcnRpZXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgYWZ0ZXIgdGhlIGVsZW1lbnQgbmV4dCByZW5kZXJzLlxuICAgICAqIFRoZSBwcm9taXNlIHJlc29sdmVzIHRvIGB0cnVlYCBpZiB0aGUgZWxlbWVudCByZW5kZXJlZCBhbmQgYGZhbHNlYCBpZiB0aGVcbiAgICAgKiBlbGVtZW50IGRpZCBub3QgcmVuZGVyLlxuICAgICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gdXNlcnMgKGUuZy4gdGVzdHMpIG5lZWQgdG8gcmVhY3QgdG8gdGhlIHJlbmRlcmVkIHN0YXRlXG4gICAgICogb2YgdGhlIGVsZW1lbnQgYWZ0ZXIgYSBjaGFuZ2UgaXMgbWFkZS5cbiAgICAgKiBUaGlzIGNhbiBhbHNvIGJlIHVzZWZ1bCBpbiBldmVudCBoYW5kbGVycyBpZiBpdCBpcyBkZXNpcmVhYmxlIHRvIHdhaXRcbiAgICAgKiB0byBzZW5kIGFuIGV2ZW50IHVudGlsIGFmdGVyIHJlbmRlcmluZy4gSWYgcG9zc2libGUgaW1wbGVtZW50IHRoZVxuICAgICAqIGBfZGlkUmVuZGVyYCBtZXRob2QgdG8gZGlyZWN0bHkgcmVzcG9uZCB0byByZW5kZXJpbmcgd2l0aGluIHRoZVxuICAgICAqIHJlbmRlcmluZyBsaWZlY3ljbGUuXG4gICAgICovXG4gICAgZ2V0IHJlbmRlckNvbXBsZXRlKCkge1xuICAgICAgICBpZiAoIXRoaXMuX19yZW5kZXJDb21wbGV0ZSkge1xuICAgICAgICAgICAgdGhpcy5fX3JlbmRlckNvbXBsZXRlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9fcmVzb2x2ZVJlbmRlckNvbXBsZXRlID0gKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX19yZXNvbHZlUmVuZGVyQ29tcGxldGUgPSB0aGlzLl9fcmVuZGVyQ29tcGxldGUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX19pc0ludmFsaWQgJiYgdGhpcy5fX3Jlc29sdmVSZW5kZXJDb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy5fX3Jlc29sdmVSZW5kZXJDb21wbGV0ZShmYWxzZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9fcmVuZGVyQ29tcGxldGU7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGl0LWVsZW1lbnQuanMubWFwIiwiLyoqXG5AbGljZW5zZVxuQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHRcblRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0XG5UaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHRcbkNvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvXG5zdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dFxuKi9cbmltcG9ydCAnLi4vdXRpbHMvYm9vdC5qcyc7XG5cbmltcG9ydCB7IGRlZHVwaW5nTWl4aW4gfSBmcm9tICcuLi91dGlscy9taXhpbi5qcyc7XG5pbXBvcnQgeyBtaWNyb1Rhc2sgfSBmcm9tICcuLi91dGlscy9hc3luYy5qcyc7XG5cbi8qKiBAY29uc3QgeyFBc3luY0ludGVyZmFjZX0gKi9cbmNvbnN0IG1pY3JvdGFzayA9IG1pY3JvVGFzaztcblxuLyoqXG4gKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgYmFzaWMgbWV0YS1wcm9ncmFtbWluZyBmb3IgY3JlYXRpbmcgb25lXG4gKiBvciBtb3JlIHByb3BlcnR5IGFjY2Vzc29ycyAoZ2V0dGVyL3NldHRlciBwYWlyKSB0aGF0IGVucXVldWUgYW4gYXN5bmNcbiAqIChiYXRjaGVkKSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay5cbiAqXG4gKiBGb3IgYmFzaWMgdXNhZ2Ugb2YgdGhpcyBtaXhpbiwgY2FsbCBgTXlDbGFzcy5jcmVhdGVQcm9wZXJ0aWVzKHByb3BzKWBcbiAqIG9uY2UgYXQgY2xhc3MgZGVmaW5pdGlvbiB0aW1lIHRvIGNyZWF0ZSBwcm9wZXJ0eSBhY2Nlc3NvcnMgZm9yIHByb3BlcnRpZXNcbiAqIG5hbWVkIGluIHByb3BzLCBpbXBsZW1lbnQgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgdG8gcmVhY3QgYXMgZGVzaXJlZCB0b1xuICogcHJvcGVydHkgY2hhbmdlcywgYW5kIGltcGxlbWVudCBgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKWAgYW5kXG4gKiBpbmNsdWRlIGxvd2VyY2FzZSB2ZXJzaW9ucyBvZiBhbnkgcHJvcGVydHkgbmFtZXMgdGhhdCBzaG91bGQgYmUgc2V0IGZyb21cbiAqIGF0dHJpYnV0ZXMuIExhc3QsIGNhbGwgYHRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKWAgaW4gdGhlIGVsZW1lbnQnc1xuICogYGNvbm5lY3RlZENhbGxiYWNrYCB0byBlbmFibGUgdGhlIGFjY2Vzc29ycy5cbiAqXG4gKiBAbWl4aW5GdW5jdGlvblxuICogQHBvbHltZXJcbiAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gZm9yIHJlYWN0aW5nIHRvIHByb3BlcnR5IGNoYW5nZXMgZnJvbVxuICogICBnZW5lcmF0ZWQgcHJvcGVydHkgYWNjZXNzb3JzLlxuICovXG5leHBvcnQgY29uc3QgUHJvcGVydGllc0NoYW5nZWQgPSBkZWR1cGluZ01peGluKFxuICAgIC8qKlxuICAgICAqIEB0ZW1wbGF0ZSBUXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6VCl9IHN1cGVyQ2xhc3MgQ2xhc3MgdG8gYXBwbHkgbWl4aW4gdG8uXG4gICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OlQpfSBzdXBlckNsYXNzIHdpdGggbWl4aW4gYXBwbGllZC5cbiAgICAgKi9cbiAgICAoc3VwZXJDbGFzcykgPT4ge1xuXG4gIC8qKlxuICAgKiBAcG9seW1lclxuICAgKiBAbWl4aW5DbGFzc1xuICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzQ2hhbmdlZH1cbiAgICogQHVucmVzdHJpY3RlZFxuICAgKi9cbiAgY2xhc3MgUHJvcGVydGllc0NoYW5nZWQgZXh0ZW5kcyBzdXBlckNsYXNzIHtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgcHJvcGVydHkgYWNjZXNzb3JzIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZXMuXG4gICAgICogQHBhcmFtIHshT2JqZWN0fSBwcm9wcyBPYmplY3Qgd2hvc2Uga2V5cyBhcmUgbmFtZXMgb2YgYWNjZXNzb3JzLlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzKHByb3BzKSB7XG4gICAgICBjb25zdCBwcm90byA9IHRoaXMucHJvdG90eXBlO1xuICAgICAgZm9yIChsZXQgcHJvcCBpbiBwcm9wcykge1xuICAgICAgICAvLyBkb24ndCBzdG9tcCBhbiBleGlzdGluZyBhY2Nlc3NvclxuICAgICAgICBpZiAoIShwcm9wIGluIHByb3RvKSkge1xuICAgICAgICAgIHByb3RvLl9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKHByb3ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhdHRyaWJ1dGUgbmFtZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKiBUaGUgYXR0cmlidXRlIG5hbWUgaXMgdGhlIGxvd2VyY2FzZWQgcHJvcGVydHkgbmFtZS4gT3ZlcnJpZGUgdG9cbiAgICAgKiBjdXN0b21pemUgdGhpcyBtYXBwaW5nLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSB0byBjb252ZXJ0XG4gICAgICogQHJldHVybiB7c3RyaW5nfSBBdHRyaWJ1dGUgbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBzdGF0aWMgYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHByb3BlcnR5KSB7XG4gICAgICByZXR1cm4gcHJvcGVydHkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSBwb2ludCB0byBwcm92aWRlIGEgdHlwZSB0byB3aGljaCB0byBkZXNlcmlhbGl6ZSBhIHZhbHVlIHRvXG4gICAgICogYSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHByb3BlcnR5XG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgc3RhdGljIHR5cGVGb3JQcm9wZXJ0eShuYW1lKSB7IH0gLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2V0dGVyL2dldHRlciBwYWlyIGZvciB0aGUgbmFtZWQgcHJvcGVydHkgd2l0aCBpdHMgb3duXG4gICAgICogbG9jYWwgc3RvcmFnZS4gIFRoZSBnZXR0ZXIgcmV0dXJucyB0aGUgdmFsdWUgaW4gdGhlIGxvY2FsIHN0b3JhZ2UsXG4gICAgICogYW5kIHRoZSBzZXR0ZXIgY2FsbHMgYF9zZXRQcm9wZXJ0eWAsIHdoaWNoIHVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2VcbiAgICAgKiBmb3IgdGhlIHByb3BlcnR5IGFuZCBlbnF1ZXVlcyBhIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBvbiBhIHByb3RvdHlwZSBvciBhbiBpbnN0YW5jZS4gIENhbGxpbmdcbiAgICAgKiB0aGlzIG1ldGhvZCBtYXkgb3ZlcndyaXRlIGEgcHJvcGVydHkgdmFsdWUgdGhhdCBhbHJlYWR5IGV4aXN0cyBvblxuICAgICAqIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgYnkgY3JlYXRpbmcgdGhlIGFjY2Vzc29yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5XG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gcmVhZE9ubHkgV2hlbiB0cnVlLCBubyBzZXR0ZXIgaXMgY3JlYXRlZDsgdGhlXG4gICAgICogICBwcm90ZWN0ZWQgYF9zZXRQcm9wZXJ0eWAgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIHRvIHNldCB0aGUgcHJvcGVydHlcbiAgICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBfY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpIHtcbiAgICAgIHRoaXMuX2FkZFByb3BlcnR5VG9BdHRyaWJ1dGVNYXAocHJvcGVydHkpO1xuICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KCdfX2RhdGFIYXNBY2Nlc3NvcicpKSB7XG4gICAgICAgIHRoaXMuX19kYXRhSGFzQWNjZXNzb3IgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wZXJ0eV0pIHtcbiAgICAgICAgdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wZXJ0eV0gPSB0cnVlO1xuICAgICAgICB0aGlzLl9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHByb3BlcnR5LCByZWFkT25seSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgZ2l2ZW4gYHByb3BlcnR5YCB0byBhIG1hcCBtYXRjaGluZyBhdHRyaWJ1dGUgbmFtZXNcbiAgICAgKiB0byBwcm9wZXJ0eSBuYW1lcywgdXNpbmcgYGF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eWAuIFRoaXMgbWFwIGlzXG4gICAgICogdXNlZCB3aGVuIGRlc2VyaWFsaXppbmcgYXR0cmlidXRlIHZhbHVlcyB0byBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5XG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgX2FkZFByb3BlcnR5VG9BdHRyaWJ1dGVNYXAocHJvcGVydHkpIHtcbiAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eSgnX19kYXRhQXR0cmlidXRlcycpKSB7XG4gICAgICAgIHRoaXMuX19kYXRhQXR0cmlidXRlcyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX19kYXRhQXR0cmlidXRlcyk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuX19kYXRhQXR0cmlidXRlc1twcm9wZXJ0eV0pIHtcbiAgICAgICAgY29uc3QgYXR0ciA9IHRoaXMuY29uc3RydWN0b3IuYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5fX2RhdGFBdHRyaWJ1dGVzW2F0dHJdID0gcHJvcGVydHk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBhIHByb3BlcnR5IGFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5XG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gcmVhZE9ubHkgV2hlbiB0cnVlLCBubyBzZXR0ZXIgaXMgY3JlYXRlZFxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgIF9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHByb3BlcnR5LCByZWFkT25seSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BlcnR5LCB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovXG4gICAgICAgIC8qKiBAdGhpcyB7UHJvcGVydGllc0NoYW5nZWR9ICovXG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0UHJvcGVydHkocHJvcGVydHkpO1xuICAgICAgICB9LFxuICAgICAgICAvKiogQHRoaXMge1Byb3BlcnRpZXNDaGFuZ2VkfSAqL1xuICAgICAgICBzZXQ6IHJlYWRPbmx5ID8gZnVuY3Rpb24gKCkge30gOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICB0aGlzLl9zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgKi9cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgc3VwZXIoKTtcbiAgICAgIHRoaXMuX19kYXRhRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5fX2RhdGFSZWFkeSA9IGZhbHNlO1xuICAgICAgdGhpcy5fX2RhdGFJbnZhbGlkID0gZmFsc2U7XG4gICAgICB0aGlzLl9fZGF0YSA9IHt9O1xuICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0gbnVsbDtcbiAgICAgIHRoaXMuX19kYXRhT2xkID0gbnVsbDtcbiAgICAgIHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcyA9IG51bGw7XG4gICAgICB0aGlzLl9fc2VyaWFsaXppbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlmZWN5Y2xlIGNhbGxiYWNrIGNhbGxlZCB3aGVuIHByb3BlcnRpZXMgYXJlIGVuYWJsZWQgdmlhXG4gICAgICogYF9lbmFibGVQcm9wZXJ0aWVzYC5cbiAgICAgKlxuICAgICAqIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIHRvIGltcGxlbWVudCBiZWhhdmlvciB0aGF0IGlzXG4gICAgICogZGVwZW5kZW50IG9uIHRoZSBlbGVtZW50IGhhdmluZyBpdHMgcHJvcGVydHkgZGF0YSBpbml0aWFsaXplZCwgZS5nLlxuICAgICAqIGZyb20gZGVmYXVsdHMgKGluaXRpYWxpemVkIGZyb20gYGNvbnN0cnVjdG9yYCwgYF9pbml0aWFsaXplUHJvcGVydGllc2ApLFxuICAgICAqIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgLCBvciB2YWx1ZXMgcHJvcGFnYXRlZCBmcm9tIGhvc3QgZS5nLiB2aWFcbiAgICAgKiBiaW5kaW5ncy4gIGBzdXBlci5yZWFkeSgpYCBtdXN0IGJlIGNhbGxlZCB0byBlbnN1cmUgdGhlIGRhdGEgc3lzdGVtXG4gICAgICogYmVjb21lcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7dm9pZH1cbiAgICAgKiBAcHVibGljXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgcmVhZHkoKSB7XG4gICAgICB0aGlzLl9fZGF0YVJlYWR5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2ZsdXNoUHJvcGVydGllcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIHRoZSBsb2NhbCBzdG9yYWdlIGZvciBwcm9wZXJ0eSBhY2Nlc3NvcnMuXG4gICAgICpcbiAgICAgKiBQcm92aWRlZCBhcyBhbiBvdmVycmlkZSBwb2ludCBmb3IgcGVyZm9ybWluZyBhbnkgc2V0dXAgd29yayBwcmlvclxuICAgICAqIHRvIGluaXRpYWxpemluZyB0aGUgcHJvcGVydHkgYWNjZXNzb3Igc3lzdGVtLlxuICAgICAqXG4gICAgICogQHJldHVybiB7dm9pZH1cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkge1xuICAgICAgLy8gQ2FwdHVyZSBpbnN0YW5jZSBwcm9wZXJ0aWVzOyB0aGVzZSB3aWxsIGJlIHNldCBpbnRvIGFjY2Vzc29yc1xuICAgICAgLy8gZHVyaW5nIGZpcnN0IGZsdXNoLiBEb24ndCBzZXQgdGhlbSBoZXJlLCBzaW5jZSB3ZSB3YW50XG4gICAgICAvLyB0aGVzZSB0byBvdmVyd3JpdGUgZGVmYXVsdHMvY29uc3RydWN0b3IgYXNzaWdubWVudHNcbiAgICAgIGZvciAobGV0IHAgaW4gdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcikge1xuICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShwKSkge1xuICAgICAgICAgIHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcyA9IHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcyB8fCB7fTtcbiAgICAgICAgICB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHNbcF0gPSB0aGlzW3BdO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzW3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGF0IHJlYWR5IHRpbWUgd2l0aCBiYWcgb2YgaW5zdGFuY2UgcHJvcGVydGllcyB0aGF0IG92ZXJ3cm90ZVxuICAgICAqIGFjY2Vzc29ycyB3aGVuIHRoZSBlbGVtZW50IHVwZ3JhZGVkLlxuICAgICAqXG4gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGVzZSBwcm9wZXJ0aWVzIGJhY2sgaW50byB0aGVcbiAgICAgKiBzZXR0ZXIgYXQgcmVhZHkgdGltZS4gIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGFuIG92ZXJyaWRlXG4gICAgICogcG9pbnQgZm9yIGN1c3RvbWl6aW5nIG9yIHByb3ZpZGluZyBtb3JlIGVmZmljaWVudCBpbml0aWFsaXphdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgcHJvcGVydHkgdmFsdWVzIHRoYXQgd2VyZSBvdmVyd3JpdHRlblxuICAgICAqICAgd2hlbiBjcmVhdGluZyBwcm9wZXJ0eSBhY2Nlc3NvcnMuXG4gICAgICogQHJldHVybiB7dm9pZH1cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgX2luaXRpYWxpemVJbnN0YW5jZVByb3BlcnRpZXMocHJvcHMpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgcHJvcHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2UgZm9yIGEgcHJvcGVydHkgKHZpYSBgX3NldFBlbmRpbmdQcm9wZXJ0eWApXG4gICAgICogYW5kIGVucXVldWVzIGEgYF9wcm9lcHJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHlcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldFxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIF9zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkocHJvcGVydHksIHZhbHVlKSkge1xuICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUHJvcGVydGllcygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHlcbiAgICAgKiBAcmV0dXJuIHsqfSBWYWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5XG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIF9nZXRQcm9wZXJ0eShwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19kYXRhW3Byb3BlcnR5XTtcbiAgICB9XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2UgZm9yIGEgcHJvcGVydHksIHJlY29yZHMgdGhlIHByZXZpb3VzIHZhbHVlLFxuICAgICAqIGFuZCBhZGRzIGl0IHRvIHRoZSBzZXQgb2YgXCJwZW5kaW5nIGNoYW5nZXNcIiB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZVxuICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLiAgVGhpcyBtZXRob2QgZG9lcyBub3QgZW5xdWV1ZSB0aGVcbiAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0XG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gZXh0IE5vdCB1c2VkIGhlcmU7IGFmZm9yZGFuY2UgZm9yIGNsb3N1cmVcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGNoYW5nZWRcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUsIGV4dCkge1xuICAgICAgbGV0IG9sZCA9IHRoaXMuX19kYXRhW3Byb3BlcnR5XTtcbiAgICAgIGxldCBjaGFuZ2VkID0gdGhpcy5fc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpO1xuICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9fZGF0YVBlbmRpbmcpIHtcbiAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmcgPSB7fTtcbiAgICAgICAgICB0aGlzLl9fZGF0YU9sZCA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIC8vIEVuc3VyZSBvbGQgaXMgY2FwdHVyZWQgZnJvbSB0aGUgbGFzdCB0dXJuXG4gICAgICAgIGlmICh0aGlzLl9fZGF0YU9sZCAmJiAhKHByb3BlcnR5IGluIHRoaXMuX19kYXRhT2xkKSkge1xuICAgICAgICAgIHRoaXMuX19kYXRhT2xkW3Byb3BlcnR5XSA9IG9sZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9fZGF0YVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nW3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNoYW5nZWQ7XG4gICAgfVxuICAgIC8qIGVzbGludC1lbmFibGUgKi9cblxuICAgIC8qKlxuICAgICAqIE1hcmtzIHRoZSBwcm9wZXJ0aWVzIGFzIGludmFsaWQsIGFuZCBlbnF1ZXVlcyBhbiBhc3luY1xuICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogQHJldHVybiB7dm9pZH1cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCkge1xuICAgICAgaWYgKCF0aGlzLl9fZGF0YUludmFsaWQgJiYgdGhpcy5fX2RhdGFSZWFkeSkge1xuICAgICAgICB0aGlzLl9fZGF0YUludmFsaWQgPSB0cnVlO1xuICAgICAgICBtaWNyb3Rhc2sucnVuKCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5fX2RhdGFJbnZhbGlkKSB7XG4gICAgICAgICAgICB0aGlzLl9fZGF0YUludmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX2ZsdXNoUHJvcGVydGllcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbCB0byBlbmFibGUgcHJvcGVydHkgYWNjZXNzb3IgcHJvY2Vzc2luZy4gQmVmb3JlIHRoaXMgbWV0aG9kIGlzXG4gICAgICogY2FsbGVkIGFjY2Vzc29yIHZhbHVlcyB3aWxsIGJlIHNldCBidXQgc2lkZSBlZmZlY3RzIGFyZVxuICAgICAqIHF1ZXVlZC4gV2hlbiBjYWxsZWQsIGFueSBwZW5kaW5nIHNpZGUgZWZmZWN0cyBvY2N1ciBpbW1lZGlhdGVseS5cbiAgICAgKiBGb3IgZWxlbWVudHMsIGdlbmVyYWxseSBgY29ubmVjdGVkQ2FsbGJhY2tgIGlzIGEgbm9ybWFsIHNwb3QgdG8gZG8gc28uXG4gICAgICogSXQgaXMgc2FmZSB0byBjYWxsIHRoaXMgbWV0aG9kIG11bHRpcGxlIHRpbWVzIGFzIGl0IG9ubHkgdHVybnMgb25cbiAgICAgKiBwcm9wZXJ0eSBhY2Nlc3NvcnMgb25jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIF9lbmFibGVQcm9wZXJ0aWVzKCkge1xuICAgICAgaWYgKCF0aGlzLl9fZGF0YUVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5fX2RhdGFFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcykge1xuICAgICAgICAgIHRoaXMuX2luaXRpYWxpemVJbnN0YW5jZVByb3BlcnRpZXModGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzKTtcbiAgICAgICAgICB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVhZHkoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyB0aGUgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2sgd2l0aCB0aGUgY3VycmVudCBzZXQgb2ZcbiAgICAgKiBwZW5kaW5nIGNoYW5nZXMgKGFuZCBvbGQgdmFsdWVzIHJlY29yZGVkIHdoZW4gcGVuZGluZyBjaGFuZ2VzIHdlcmVcbiAgICAgKiBzZXQpLCBhbmQgcmVzZXRzIHRoZSBwZW5kaW5nIHNldCBvZiBjaGFuZ2VzLiBHZW5lcmFsbHksIHRoaXMgbWV0aG9kXG4gICAgICogc2hvdWxkIG5vdCBiZSBjYWxsZWQgaW4gdXNlciBjb2RlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7dm9pZH1cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgX2ZsdXNoUHJvcGVydGllcygpIHtcbiAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5fX2RhdGE7XG4gICAgICBjb25zdCBjaGFuZ2VkUHJvcHMgPSB0aGlzLl9fZGF0YVBlbmRpbmc7XG4gICAgICBjb25zdCBvbGQgPSB0aGlzLl9fZGF0YU9sZDtcbiAgICAgIGlmICh0aGlzLl9zaG91bGRQcm9wZXJ0aWVzQ2hhbmdlKHByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZCkpIHtcbiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0gbnVsbDtcbiAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSBudWxsO1xuICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzQ2hhbmdlZChwcm9wcywgY2hhbmdlZFByb3BzLCBvbGQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxlZCBpbiBgX2ZsdXNoUHJvcGVydGllc2AgdG8gZGV0ZXJtaW5lIGlmIGBfcHJvcGVydGllc0NoYW5nZWRgXG4gICAgICogc2hvdWxkIGJlIGNhbGxlZC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGlmXG4gICAgICogcHJvcGVydGllcyBhcmUgcGVuZGluZy4gT3ZlcnJpZGUgdG8gY3VzdG9taXplIHdoZW5cbiAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBpcyBjYWxsZWQuXG4gICAgICogQHBhcmFtIHshT2JqZWN0fSBjdXJyZW50UHJvcHMgQmFnIG9mIGFsbCBjdXJyZW50IGFjY2Vzc29yIHZhbHVlc1xuICAgICAqIEBwYXJhbSB7P09iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBwcm9wZXJ0aWVzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3RcbiAgICAgKiAgIGNhbGwgdG8gYF9wcm9wZXJ0aWVzQ2hhbmdlZGBcbiAgICAgKiBAcGFyYW0gez9PYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGVhY2ggcHJvcGVydHlcbiAgICAgKiAgIGluIGBjaGFuZ2VkUHJvcHNgXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBjaGFuZ2VkUHJvcHMgaXMgdHJ1dGh5XG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgX3Nob3VsZFByb3BlcnRpZXNDaGFuZ2UoY3VycmVudFByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBCb29sZWFuKGNoYW5nZWRQcm9wcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgY2FsbGVkIHdoZW4gYW55IHByb3BlcnRpZXMgd2l0aCBhY2Nlc3NvcnMgY3JlYXRlZCB2aWFcbiAgICAgKiBgX2NyZWF0ZVByb3BlcnR5QWNjZXNzb3JgIGhhdmUgYmVlbiBzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyFPYmplY3R9IGN1cnJlbnRQcm9wcyBCYWcgb2YgYWxsIGN1cnJlbnQgYWNjZXNzb3IgdmFsdWVzXG4gICAgICogQHBhcmFtIHs/T2JqZWN0fSBjaGFuZ2VkUHJvcHMgQmFnIG9mIHByb3BlcnRpZXMgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdFxuICAgICAqICAgY2FsbCB0byBgX3Byb3BlcnRpZXNDaGFuZ2VkYFxuICAgICAqIEBwYXJhbSB7P09iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgZWFjaCBwcm9wZXJ0eVxuICAgICAqICAgaW4gYGNoYW5nZWRQcm9wc2BcbiAgICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBfcHJvcGVydGllc0NoYW5nZWQoY3VycmVudFByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXRob2QgY2FsbGVkIHRvIGRldGVybWluZSB3aGV0aGVyIGEgcHJvcGVydHkgdmFsdWUgc2hvdWxkIGJlXG4gICAgICogY29uc2lkZXJlZCBhcyBhIGNoYW5nZSBhbmQgY2F1c2UgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrXG4gICAgICogdG8gYmUgZW5xdWV1ZWQuXG4gICAgICpcbiAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGB0cnVlYCBpZiBhIHN0cmljdCBlcXVhbGl0eVxuICAgICAqIGNoZWNrIGZhaWxzLiBUaGUgbWV0aG9kIGFsd2F5cyByZXR1cm5zIGZhbHNlIGZvciBgTmFOYC5cbiAgICAgKlxuICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGUuZy4gcHJvdmlkZSBzdHJpY3RlciBjaGVja2luZyBmb3JcbiAgICAgKiBPYmplY3RzL0FycmF5cyB3aGVuIHVzaW5nIGltbXV0YWJsZSBwYXR0ZXJucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWVcbiAgICAgKiBAcGFyYW0geyp9IG9sZCBQcmV2aW91cyBwcm9wZXJ0eSB2YWx1ZVxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBjb25zaWRlcmVkIGEgY2hhbmdlXG4gICAgICogICBhbmQgZW5xdWV1ZSBhIGBfcHJvZXBydGllc0NoYW5nZWRgIGNhbGxiYWNrXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgLy8gU3RyaWN0IGVxdWFsaXR5IGNoZWNrXG4gICAgICAgIChvbGQgIT09IHZhbHVlICYmXG4gICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIChvbGQ9PU5hTiwgdmFsdWU9PU5hTikgYWx3YXlzIHJldHVybnMgZmFsc2VcbiAgICAgICAgICAob2xkID09PSBvbGQgfHwgdmFsdWUgPT09IHZhbHVlKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW1wbGVtZW50cyBuYXRpdmUgQ3VzdG9tIEVsZW1lbnRzIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvXG4gICAgICogc2V0IGFuIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIHByb3BlcnR5IHZpYSBgX2F0dHJpYnV0ZVRvUHJvcGVydHlgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUgdGhhdCBjaGFuZ2VkXG4gICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgT2xkIGF0dHJpYnV0ZSB2YWx1ZVxuICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgTmV3IGF0dHJpYnV0ZSB2YWx1ZVxuICAgICAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZXNwYWNlIEF0dHJpYnV0ZSBuYW1lc3BhY2UuXG4gICAgICogQHJldHVybiB7dm9pZH1cbiAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBTdXBlciBtYXkgb3IgbWF5IG5vdCBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUsIG5hbWVzcGFjZSkge1xuICAgICAgaWYgKG9sZCAhPT0gdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fYXR0cmlidXRlVG9Qcm9wZXJ0eShuYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKSB7XG4gICAgICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplcyBhbiBhdHRyaWJ1dGUgdG8gaXRzIGFzc29jaWF0ZWQgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYWxscyB0aGUgYF9kZXNlcmlhbGl6ZVZhbHVlYCBtZXRob2QgdG8gY29udmVydCB0aGUgc3RyaW5nIHRvXG4gICAgICogYSB0eXBlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgTmFtZSBvZiBhdHRyaWJ1dGUgdG8gZGVzZXJpYWxpemUuXG4gICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLlxuICAgICAqIEBwYXJhbSB7Kj19IHR5cGUgdHlwZSB0byBkZXNlcmlhbGl6ZSB0bywgZGVmYXVsdHMgdG8gdGhlIHZhbHVlXG4gICAgICogcmV0dXJuZWQgZnJvbSBgdHlwZUZvclByb3BlcnR5YFxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgX2F0dHJpYnV0ZVRvUHJvcGVydHkoYXR0cmlidXRlLCB2YWx1ZSwgdHlwZSkge1xuICAgICAgaWYgKCF0aGlzLl9fc2VyaWFsaXppbmcpIHtcbiAgICAgICAgY29uc3QgbWFwID0gdGhpcy5fX2RhdGFBdHRyaWJ1dGVzO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IG1hcCAmJiBtYXBbYXR0cmlidXRlXSB8fCBhdHRyaWJ1dGU7XG4gICAgICAgIHRoaXNbcHJvcGVydHldID0gdGhpcy5fZGVzZXJpYWxpemVWYWx1ZSh2YWx1ZSwgdHlwZSB8fFxuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IudHlwZUZvclByb3BlcnR5KHByb3BlcnR5KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplcyBhIHByb3BlcnR5IHRvIGl0cyBhc3NvY2lhdGVkIGF0dHJpYnV0ZS5cbiAgICAgKlxuICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBDbG9zdXJlIGNhbid0IGZpZ3VyZSBvdXQgYHRoaXNgIGlzIGFuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZSB0byByZWZsZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gYXR0cmlidXRlIEF0dHJpYnV0ZSBuYW1lIHRvIHJlZmxlY3QgdG8uXG4gICAgICogQHBhcmFtIHsqPX0gdmFsdWUgUHJvcGVydHkgdmFsdWUgdG8gcmVmZWN0LlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgX3Byb3BlcnR5VG9BdHRyaWJ1dGUocHJvcGVydHksIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICAgIHRoaXMuX19zZXJpYWxpemluZyA9IHRydWU7XG4gICAgICB2YWx1ZSA9IChhcmd1bWVudHMubGVuZ3RoIDwgMykgPyB0aGlzW3Byb3BlcnR5XSA6IHZhbHVlO1xuICAgICAgdGhpcy5fdmFsdWVUb05vZGVBdHRyaWJ1dGUoLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKHRoaXMpLCB2YWx1ZSxcbiAgICAgICAgYXR0cmlidXRlIHx8IHRoaXMuY29uc3RydWN0b3IuYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHByb3BlcnR5KSk7XG4gICAgICB0aGlzLl9fc2VyaWFsaXppbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgdHlwZWQgdmFsdWUgdG8gYW4gSFRNTCBhdHRyaWJ1dGUgb24gYSBub2RlLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FsbHMgdGhlIGBfc2VyaWFsaXplVmFsdWVgIG1ldGhvZCB0byBjb252ZXJ0IHRoZSB0eXBlZFxuICAgICAqIHZhbHVlIHRvIGEgc3RyaW5nLiAgSWYgdGhlIGBfc2VyaWFsaXplVmFsdWVgIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgLFxuICAgICAqIHRoZSBhdHRyaWJ1dGUgd2lsbCBiZSByZW1vdmVkICh0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciBib29sZWFuXG4gICAgICogdHlwZSBgZmFsc2VgKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIHNldCBhdHRyaWJ1dGUgdG8uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXJpYWxpemUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byBzZXJpYWxpemUgdG8uXG4gICAgICogQHJldHVybiB7dm9pZH1cbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBfdmFsdWVUb05vZGVBdHRyaWJ1dGUobm9kZSwgdmFsdWUsIGF0dHJpYnV0ZSkge1xuICAgICAgY29uc3Qgc3RyID0gdGhpcy5fc2VyaWFsaXplVmFsdWUodmFsdWUpO1xuICAgICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHN0cik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYSB0eXBlZCBKYXZhU2NyaXB0IHZhbHVlIHRvIGEgc3RyaW5nLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gc2V0dGluZyBKUyBwcm9wZXJ0eSB2YWx1ZXMgdG9cbiAgICAgKiBIVE1MIGF0dHJpYnV0ZXMuICBVc2VycyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZVxuICAgICAqIHNlcmlhbGl6YXRpb24gZm9yIGN1c3RvbSB0eXBlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgUHJvcGVydHkgdmFsdWUgdG8gc2VyaWFsaXplLlxuICAgICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gU3RyaW5nIHNlcmlhbGl6ZWQgZnJvbSB0aGUgcHJvdmlkZWRcbiAgICAgKiBwcm9wZXJ0eSAgdmFsdWUuXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgX3NlcmlhbGl6ZVZhbHVlKHZhbHVlKSB7XG4gICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICByZXR1cm4gdmFsdWUgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLnRvU3RyaW5nKCkgOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYSBzdHJpbmcgdG8gYSB0eXBlZCBKYXZhU2NyaXB0IHZhbHVlLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gcmVhZGluZyBIVE1MIGF0dHJpYnV0ZSB2YWx1ZXMgdG9cbiAgICAgKiBKUyBwcm9wZXJ0aWVzLiAgVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGVcbiAgICAgKiBkZXNlcmlhbGl6YXRpb24gZm9yIGN1c3RvbSBgdHlwZWBzLiBUeXBlcyBmb3IgYEJvb2xlYW5gLCBgU3RyaW5nYCxcbiAgICAgKiBhbmQgYE51bWJlcmAgY29udmVydCBhdHRyaWJ1dGVzIHRvIHRoZSBleHBlY3RlZCB0eXBlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgVmFsdWUgdG8gZGVzZXJpYWxpemUuXG4gICAgICogQHBhcmFtIHsqPX0gdHlwZSBUeXBlIHRvIGRlc2VyaWFsaXplIHRoZSBzdHJpbmcgdG8uXG4gICAgICogQHJldHVybiB7Kn0gVHlwZWQgdmFsdWUgZGVzZXJpYWxpemVkIGZyb20gdGhlIHByb3ZpZGVkIHN0cmluZy5cbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBfZGVzZXJpYWxpemVWYWx1ZSh2YWx1ZSwgdHlwZSkge1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgQm9vbGVhbjpcbiAgICAgICAgICByZXR1cm4gKHZhbHVlICE9PSBudWxsKTtcbiAgICAgICAgY2FzZSBOdW1iZXI6XG4gICAgICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICB9XG5cbiAgcmV0dXJuIFByb3BlcnRpZXNDaGFuZ2VkO1xufSk7XG4iLCIvKipcbkBsaWNlbnNlXG5Db3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHRcblRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dFxuQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc29cbnN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4qL1xuaW1wb3J0ICcuLi91dGlscy9ib290LmpzJztcblxuaW1wb3J0IHsgZGVkdXBpbmdNaXhpbiB9IGZyb20gJy4uL3V0aWxzL21peGluLmpzJztcbmltcG9ydCB7IFByb3BlcnRpZXNDaGFuZ2VkIH0gZnJvbSAnLi9wcm9wZXJ0aWVzLWNoYW5nZWQuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjb3B5IG9mIGBwcm9wc2Agd2l0aCBlYWNoIHByb3BlcnR5IG5vcm1hbGl6ZWQgc3VjaCB0aGF0XG4gKiB1cGdyYWRlZCBpdCBpcyBhbiBvYmplY3Qgd2l0aCBhdCBsZWFzdCBhIHR5cGUgcHJvcGVydHkgeyB0eXBlOiBUeXBlfS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgUHJvcGVydGllcyB0byBub3JtYWxpemVcbiAqIEByZXR1cm4ge09iamVjdH0gQ29weSBvZiBpbnB1dCBgcHJvcHNgIHdpdGggbm9ybWFsaXplZCBwcm9wZXJ0aWVzIHRoYXRcbiAqIGFyZSBpbiB0aGUgZm9ybSB7dHlwZTogVHlwZX1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BlcnRpZXMocHJvcHMpIHtcbiAgY29uc3Qgb3V0cHV0ID0ge307XG4gIGZvciAobGV0IHAgaW4gcHJvcHMpIHtcbiAgICBjb25zdCBvID0gcHJvcHNbcF07XG4gICAgb3V0cHV0W3BdID0gKHR5cGVvZiBvID09PSAnZnVuY3Rpb24nKSA/IHt0eXBlOiBvfSA6IG87XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBNaXhpbiB0aGF0IHByb3ZpZGVzIGEgbWluaW1hbCBzdGFydGluZyBwb2ludCB0byB1c2luZyB0aGUgUHJvcGVydGllc0NoYW5nZWRcbiAqIG1peGluIGJ5IHByb3ZpZGluZyBhIG1lY2hhbmlzbSB0byBkZWNsYXJlIHByb3BlcnRpZXMgaW4gYSBzdGF0aWNcbiAqIGdldHRlciAoZS5nLiBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7IHJldHVybiB7IGZvbzogU3RyaW5nIH0gfSkuIENoYW5nZXNcbiAqIGFyZSByZXBvcnRlZCB2aWEgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIG1ldGhvZC5cbiAqXG4gKiBUaGlzIG1peGluIHByb3ZpZGVzIG5vIHNwZWNpZmljIHN1cHBvcnQgZm9yIHJlbmRlcmluZy4gVXNlcnMgYXJlIGV4cGVjdGVkXG4gKiB0byBjcmVhdGUgYSBTaGFkb3dSb290IGFuZCBwdXQgY29udGVudCBpbnRvIGl0IGFuZCB1cGRhdGUgaXQgaW4gd2hhdGV2ZXJcbiAqIHdheSBtYWtlcyBzZW5zZS4gVGhpcyBjYW4gYmUgZG9uZSBpbiByZWFjdGlvbiB0byBwcm9wZXJ0aWVzIGNoYW5naW5nIGJ5XG4gKiBpbXBsZW1lbnRpbmcgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAuXG4gKlxuICogQG1peGluRnVuY3Rpb25cbiAqIEBwb2x5bWVyXG4gKiBAYXBwbGllc01peGluIFByb3BlcnRpZXNDaGFuZ2VkXG4gKiBAc3VtbWFyeSBNaXhpbiB0aGF0IHByb3ZpZGVzIGEgbWluaW1hbCBzdGFydGluZyBwb2ludCBmb3IgdXNpbmdcbiAqIHRoZSBQcm9wZXJ0aWVzQ2hhbmdlZCBtaXhpbiBieSBwcm92aWRpbmcgYSBkZWNsYXJhdGl2ZSBgcHJvcGVydGllc2Agb2JqZWN0LlxuICovXG5leHBvcnQgY29uc3QgUHJvcGVydGllc01peGluID0gZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHtcblxuIC8qKlxuICAqIEBjb25zdHJ1Y3RvclxuICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnRpZXNDaGFuZ2VkfVxuICAqIEBwcml2YXRlXG4gICovXG4gY29uc3QgYmFzZSA9IFByb3BlcnRpZXNDaGFuZ2VkKHN1cGVyQ2xhc3MpO1xuXG4gLyoqXG4gICogUmV0dXJucyB0aGUgc3VwZXIgY2xhc3MgY29uc3RydWN0b3IgZm9yIHRoZSBnaXZlbiBjbGFzcywgaWYgaXQgaXMgYW5cbiAgKiBpbnN0YW5jZSBvZiB0aGUgUHJvcGVydGllc01peGluLlxuICAqXG4gICogQHBhcmFtIHshUHJvcGVydGllc01peGluQ29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIFByb3BlcnRpZXNNaXhpbiBjb25zdHJ1Y3RvclxuICAqIEByZXR1cm4gez9Qcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gU3VwZXIgY2xhc3MgY29uc3RydWN0b3JcbiAgKi9cbiBmdW5jdGlvbiBzdXBlclByb3BlcnRpZXNDbGFzcyhjb25zdHJ1Y3Rvcikge1xuICAgY29uc3Qgc3VwZXJDdG9yID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNvbnN0cnVjdG9yKTtcblxuICAgLy8gTm90ZSwgdGhlIGBQcm9wZXJ0aWVzTWl4aW5gIGNsYXNzIGJlbG93IG9ubHkgcmVmZXJzIHRvIHRoZSBjbGFzc1xuICAgLy8gZ2VuZXJhdGVkIGJ5IHRoaXMgY2FsbCB0byB0aGUgbWl4aW47IHRoZSBpbnN0YW5jZW9mIHRlc3Qgb25seSB3b3Jrc1xuICAgLy8gYmVjYXVzZSB0aGUgbWl4aW4gaXMgZGVkdXBlZCBhbmQgZ3VhcmFudGVlZCBvbmx5IHRvIGFwcGx5IG9uY2UsIGhlbmNlXG4gICAvLyBhbGwgY29uc3RydWN0b3JzIGluIGEgcHJvdG8gY2hhaW4gd2lsbCBzZWUgdGhlIHNhbWUgYFByb3BlcnRpZXNNaXhpbmBcbiAgIHJldHVybiAoc3VwZXJDdG9yLnByb3RvdHlwZSBpbnN0YW5jZW9mIFByb3BlcnRpZXNNaXhpbikgP1xuICAgICAvKiogQHR5cGUgeyFQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gKi8gKHN1cGVyQ3RvcikgOiBudWxsO1xuIH1cblxuIC8qKlxuICAqIFJldHVybnMgYSBtZW1vaXplZCB2ZXJzaW9uIG9mIHRoZSBgcHJvcGVydGllc2Agb2JqZWN0IGZvciB0aGVcbiAgKiBnaXZlbiBjbGFzcy4gUHJvcGVydGllcyBub3QgaW4gb2JqZWN0IGZvcm1hdCBhcmUgY29udmVydGVkIHRvIGF0XG4gICogbGVhc3Qge3R5cGV9LlxuICAqXG4gICogQHBhcmFtIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gY29uc3RydWN0b3IgUHJvcGVydGllc01peGluIGNvbnN0cnVjdG9yXG4gICogQHJldHVybiB7T2JqZWN0fSBNZW1vaXplZCBwcm9wZXJ0aWVzIG9iamVjdFxuICAqL1xuIGZ1bmN0aW9uIG93blByb3BlcnRpZXMoY29uc3RydWN0b3IpIHtcbiAgIGlmICghY29uc3RydWN0b3IuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX19vd25Qcm9wZXJ0aWVzJywgY29uc3RydWN0b3IpKSkge1xuICAgICBsZXQgcHJvcHMgPSBudWxsO1xuXG4gICAgIGlmIChjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdwcm9wZXJ0aWVzJywgY29uc3RydWN0b3IpKSAmJiBjb25zdHJ1Y3Rvci5wcm9wZXJ0aWVzKSB7XG4gICAgICAgcHJvcHMgPSBub3JtYWxpemVQcm9wZXJ0aWVzKGNvbnN0cnVjdG9yLnByb3BlcnRpZXMpO1xuICAgICB9XG5cbiAgICAgY29uc3RydWN0b3IuX19vd25Qcm9wZXJ0aWVzID0gcHJvcHM7XG4gICB9XG4gICByZXR1cm4gY29uc3RydWN0b3IuX19vd25Qcm9wZXJ0aWVzO1xuIH1cblxuIC8qKlxuICAqIEBwb2x5bWVyXG4gICogQG1peGluQ2xhc3NcbiAgKiBAZXh0ZW5kcyB7YmFzZX1cbiAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzTWl4aW59XG4gICogQHVucmVzdHJpY3RlZFxuICAqL1xuIGNsYXNzIFByb3BlcnRpZXNNaXhpbiBleHRlbmRzIGJhc2Uge1xuXG4gICAvKipcbiAgICAqIEltcGxlbWVudHMgc3RhbmRhcmQgY3VzdG9tIGVsZW1lbnRzIGdldHRlciB0byBvYnNlcnZlcyB0aGUgYXR0cmlidXRlc1xuICAgICogbGlzdGVkIGluIGBwcm9wZXJ0aWVzYC5cbiAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IEludGVyZmFjZXMgaW4gY2xvc3VyZSBkbyBub3QgaW5oZXJpdCBzdGF0aWNzLCBidXQgY2xhc3NlcyBkb1xuICAgICovXG4gICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICAgY29uc3QgcHJvcHMgPSB0aGlzLl9wcm9wZXJ0aWVzO1xuICAgICByZXR1cm4gcHJvcHMgPyBPYmplY3Qua2V5cyhwcm9wcykubWFwKHAgPT4gdGhpcy5hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocCkpIDogW107XG4gICB9XG5cbiAgIC8qKlxuICAgICogRmluYWxpemVzIGFuIGVsZW1lbnQgZGVmaW5pdGlvbiwgaW5jbHVkaW5nIGVuc3VyaW5nIGFueSBzdXBlciBjbGFzc2VzXG4gICAgKiBhcmUgYWxzbyBmaW5hbGl6ZWQuIFRoaXMgaW5jbHVkZXMgZW5zdXJpbmcgcHJvcGVydHlcbiAgICAqIGFjY2Vzc29ycyBleGlzdCBvbiB0aGUgZWxlbWVudCBwcm90b3R5cGUuIFRoaXMgbWV0aG9kIGNhbGxzXG4gICAgKiBgX2ZpbmFsaXplQ2xhc3NgIHRvIGZpbmFsaXplIGVhY2ggY29uc3RydWN0b3IgaW4gdGhlIHByb3RvdHlwZSBjaGFpbi5cbiAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgKi9cbiAgIHN0YXRpYyBmaW5hbGl6ZSgpIHtcbiAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19fZmluYWxpemVkJywgdGhpcykpKSB7XG4gICAgICAgY29uc3Qgc3VwZXJDdG9yID0gc3VwZXJQcm9wZXJ0aWVzQ2xhc3MoLyoqIEB0eXBlIHshUHJvcGVydGllc01peGluQ29uc3RydWN0b3J9ICovKHRoaXMpKTtcbiAgICAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICAgICBzdXBlckN0b3IuZmluYWxpemUoKTtcbiAgICAgICB9XG4gICAgICAgdGhpcy5fX2ZpbmFsaXplZCA9IHRydWU7XG4gICAgICAgdGhpcy5fZmluYWxpemVDbGFzcygpO1xuICAgICB9XG4gICB9XG5cbiAgIC8qKlxuICAgICogRmluYWxpemUgYW4gZWxlbWVudCBjbGFzcy4gVGhpcyBpbmNsdWRlcyBlbnN1cmluZyBwcm9wZXJ0eVxuICAgICogYWNjZXNzb3JzIGV4aXN0IG9uIHRoZSBlbGVtZW50IHByb3RvdHlwZS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5XG4gICAgKiBgZmluYWxpemVgIGFuZCBmaW5hbGl6ZXMgdGhlIGNsYXNzIGNvbnN0cnVjdG9yLlxuICAgICpcbiAgICAqIEBwcm90ZWN0ZWRcbiAgICAqL1xuICAgc3RhdGljIF9maW5hbGl6ZUNsYXNzKCkge1xuICAgICBjb25zdCBwcm9wcyA9IG93blByb3BlcnRpZXMoLyoqIEB0eXBlIHshUHJvcGVydGllc01peGluQ29uc3RydWN0b3J9ICovKHRoaXMpKTtcbiAgICAgaWYgKHByb3BzKSB7XG4gICAgICAgdGhpcy5jcmVhdGVQcm9wZXJ0aWVzKHByb3BzKTtcbiAgICAgfVxuICAgfVxuXG4gICAvKipcbiAgICAqIFJldHVybnMgYSBtZW1vaXplZCB2ZXJzaW9uIG9mIGFsbCBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcgdGhvc2UgaW5oZXJpdGVkXG4gICAgKiBmcm9tIHN1cGVyIGNsYXNzZXMuIFByb3BlcnRpZXMgbm90IGluIG9iamVjdCBmb3JtYXQgYXJlIGNvbnZlcnRlZCB0b1xuICAgICogYXQgbGVhc3Qge3R5cGV9LlxuICAgICpcbiAgICAqIEByZXR1cm4ge09iamVjdH0gT2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydGllcyBmb3IgdGhpcyBjbGFzc1xuICAgICogQHByb3RlY3RlZFxuICAgICovXG4gICBzdGF0aWMgZ2V0IF9wcm9wZXJ0aWVzKCkge1xuICAgICBpZiAoIXRoaXMuaGFzT3duUHJvcGVydHkoXG4gICAgICAgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX19wcm9wZXJ0aWVzJywgdGhpcykpKSB7XG4gICAgICAgY29uc3Qgc3VwZXJDdG9yID0gc3VwZXJQcm9wZXJ0aWVzQ2xhc3MoLyoqIEB0eXBlIHshUHJvcGVydGllc01peGluQ29uc3RydWN0b3J9ICovKHRoaXMpKTtcbiAgICAgICB0aGlzLl9fcHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sXG4gICAgICAgICBzdXBlckN0b3IgJiYgc3VwZXJDdG9yLl9wcm9wZXJ0aWVzLFxuICAgICAgICAgb3duUHJvcGVydGllcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSkpO1xuICAgICB9XG4gICAgIHJldHVybiB0aGlzLl9fcHJvcGVydGllcztcbiAgIH1cblxuICAgLyoqXG4gICAgKiBPdmVycmlkZXMgYFByb3BlcnRpZXNDaGFuZ2VkYCBtZXRob2QgdG8gcmV0dXJuIHR5cGUgc3BlY2lmaWVkIGluIHRoZVxuICAgICogc3RhdGljIGBwcm9wZXJ0aWVzYCBvYmplY3QgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgcHJvcGVydHlcbiAgICAqIEByZXR1cm4geyp9IFR5cGUgdG8gd2hpY2ggdG8gZGVzZXJpYWxpemUgYXR0cmlidXRlXG4gICAgKlxuICAgICogQHByb3RlY3RlZFxuICAgICovXG4gICBzdGF0aWMgdHlwZUZvclByb3BlcnR5KG5hbWUpIHtcbiAgICAgY29uc3QgaW5mbyA9IHRoaXMuX3Byb3BlcnRpZXNbbmFtZV07XG4gICAgIHJldHVybiBpbmZvICYmIGluZm8udHlwZTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBPdmVycmlkZXMgYFByb3BlcnRpZXNDaGFuZ2VkYCBtZXRob2QgYW5kIGFkZHMgYSBjYWxsIHRvXG4gICAgKiBgZmluYWxpemVgIHdoaWNoIGxhemlseSBjb25maWd1cmVzIHRoZSBlbGVtZW50J3MgcHJvcGVydHkgYWNjZXNzb3JzLlxuICAgICogQG92ZXJyaWRlXG4gICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgICovXG4gICBfaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7XG4gICAgIHRoaXMuY29uc3RydWN0b3IuZmluYWxpemUoKTtcbiAgICAgc3VwZXIuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgaXMgYWRkZWQgdG8gYSBkb2N1bWVudC5cbiAgICAqIENhbGxzIGBfZW5hYmxlUHJvcGVydGllc2AgdG8gdHVybiBvbiBwcm9wZXJ0eSBzeXN0ZW0gZnJvbVxuICAgICogYFByb3BlcnRpZXNDaGFuZ2VkYC5cbiAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IFN1cGVyIG1heSBvciBtYXkgbm90IGltcGxlbWVudCB0aGUgY2FsbGJhY2tcbiAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgKiBAb3ZlcnJpZGVcbiAgICAqL1xuICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgIGlmIChzdXBlci5jb25uZWN0ZWRDYWxsYmFjaykge1xuICAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgIH1cbiAgICAgdGhpcy5fZW5hYmxlUHJvcGVydGllcygpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIHJlbW92ZWQgZnJvbSBhIGRvY3VtZW50XG4gICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBTdXBlciBtYXkgb3IgbWF5IG5vdCBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrXG4gICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgICogQG92ZXJyaWRlXG4gICAgKi9cbiAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICBpZiAoc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2spIHtcbiAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICB9XG4gICB9XG5cbiB9XG5cbiByZXR1cm4gUHJvcGVydGllc01peGluO1xuXG59KTtcbiIsIi8qKlxuQGxpY2Vuc2VcbkNvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5UaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0XG5UaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dFxuVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0XG5Db2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzb1xuc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHRcbiovXG5pbXBvcnQgJy4vYm9vdC5qcyc7XG5cbmZ1bmN0aW9uIG5ld1NwbGljZShpbmRleCwgcmVtb3ZlZCwgYWRkZWRDb3VudCkge1xuICByZXR1cm4ge1xuICAgIGluZGV4OiBpbmRleCxcbiAgICByZW1vdmVkOiByZW1vdmVkLFxuICAgIGFkZGVkQ291bnQ6IGFkZGVkQ291bnRcbiAgfTtcbn1cblxuY29uc3QgRURJVF9MRUFWRSA9IDA7XG5jb25zdCBFRElUX1VQREFURSA9IDE7XG5jb25zdCBFRElUX0FERCA9IDI7XG5jb25zdCBFRElUX0RFTEVURSA9IDM7XG5cbi8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gaXMgKmJhc2VkKiBvbiB0aGUgY29tcHV0YXRpb24gb2YgdGhlIExldmVuc2h0ZWluXG4vLyBcImVkaXRcIiBkaXN0YW5jZS4gVGhlIG9uZSBjaGFuZ2UgaXMgdGhhdCBcInVwZGF0ZXNcIiBhcmUgdHJlYXRlZCBhcyB0d29cbi8vIGVkaXRzIC0gbm90IG9uZS4gV2l0aCBBcnJheSBzcGxpY2VzLCBhbiB1cGRhdGUgaXMgcmVhbGx5IGEgZGVsZXRlXG4vLyBmb2xsb3dlZCBieSBhbiBhZGQuIEJ5IHJldGFpbmluZyB0aGlzLCB3ZSBvcHRpbWl6ZSBmb3IgXCJrZWVwaW5nXCIgdGhlXG4vLyBtYXhpbXVtIGFycmF5IGl0ZW1zIGluIHRoZSBvcmlnaW5hbCBhcnJheS4gRm9yIGV4YW1wbGU6XG4vL1xuLy8gICAneHh4eDEyMycgLT4gJzEyM3l5eXknXG4vL1xuLy8gV2l0aCAxLWVkaXQgdXBkYXRlcywgdGhlIHNob3J0ZXN0IHBhdGggd291bGQgYmUganVzdCB0byB1cGRhdGUgYWxsIHNldmVuXG4vLyBjaGFyYWN0ZXJzLiBXaXRoIDItZWRpdCB1cGRhdGVzLCB3ZSBkZWxldGUgNCwgbGVhdmUgMywgYW5kIGFkZCA0LiBUaGlzXG4vLyBsZWF2ZXMgdGhlIHN1YnN0cmluZyAnMTIzJyBpbnRhY3QuXG5mdW5jdGlvbiBjYWxjRWRpdERpc3RhbmNlcyhjdXJyZW50LCBjdXJyZW50U3RhcnQsIGN1cnJlbnRFbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkLCBvbGRTdGFydCwgb2xkRW5kKSB7XG4gIC8vIFwiRGVsZXRpb25cIiBjb2x1bW5zXG4gIGxldCByb3dDb3VudCA9IG9sZEVuZCAtIG9sZFN0YXJ0ICsgMTtcbiAgbGV0IGNvbHVtbkNvdW50ID0gY3VycmVudEVuZCAtIGN1cnJlbnRTdGFydCArIDE7XG4gIGxldCBkaXN0YW5jZXMgPSBuZXcgQXJyYXkocm93Q291bnQpO1xuXG4gIC8vIFwiQWRkaXRpb25cIiByb3dzLiBJbml0aWFsaXplIG51bGwgY29sdW1uLlxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd0NvdW50OyBpKyspIHtcbiAgICBkaXN0YW5jZXNbaV0gPSBuZXcgQXJyYXkoY29sdW1uQ291bnQpO1xuICAgIGRpc3RhbmNlc1tpXVswXSA9IGk7XG4gIH1cblxuICAvLyBJbml0aWFsaXplIG51bGwgcm93XG4gIGZvciAobGV0IGogPSAwOyBqIDwgY29sdW1uQ291bnQ7IGorKylcbiAgICBkaXN0YW5jZXNbMF1bal0gPSBqO1xuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgcm93Q291bnQ7IGkrKykge1xuICAgIGZvciAobGV0IGogPSAxOyBqIDwgY29sdW1uQ291bnQ7IGorKykge1xuICAgICAgaWYgKGVxdWFscyhjdXJyZW50W2N1cnJlbnRTdGFydCArIGogLSAxXSwgb2xkW29sZFN0YXJ0ICsgaSAtIDFdKSlcbiAgICAgICAgZGlzdGFuY2VzW2ldW2pdID0gZGlzdGFuY2VzW2kgLSAxXVtqIC0gMV07XG4gICAgICBlbHNlIHtcbiAgICAgICAgbGV0IG5vcnRoID0gZGlzdGFuY2VzW2kgLSAxXVtqXSArIDE7XG4gICAgICAgIGxldCB3ZXN0ID0gZGlzdGFuY2VzW2ldW2ogLSAxXSArIDE7XG4gICAgICAgIGRpc3RhbmNlc1tpXVtqXSA9IG5vcnRoIDwgd2VzdCA/IG5vcnRoIDogd2VzdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlzdGFuY2VzO1xufVxuXG4vLyBUaGlzIHN0YXJ0cyBhdCB0aGUgZmluYWwgd2VpZ2h0LCBhbmQgd2Fsa3MgXCJiYWNrd2FyZFwiIGJ5IGZpbmRpbmdcbi8vIHRoZSBtaW5pbXVtIHByZXZpb3VzIHdlaWdodCByZWN1cnNpdmVseSB1bnRpbCB0aGUgb3JpZ2luIG9mIHRoZSB3ZWlnaHRcbi8vIG1hdHJpeC5cbmZ1bmN0aW9uIHNwbGljZU9wZXJhdGlvbnNGcm9tRWRpdERpc3RhbmNlcyhkaXN0YW5jZXMpIHtcbiAgbGV0IGkgPSBkaXN0YW5jZXMubGVuZ3RoIC0gMTtcbiAgbGV0IGogPSBkaXN0YW5jZXNbMF0ubGVuZ3RoIC0gMTtcbiAgbGV0IGN1cnJlbnQgPSBkaXN0YW5jZXNbaV1bal07XG4gIGxldCBlZGl0cyA9IFtdO1xuICB3aGlsZSAoaSA+IDAgfHwgaiA+IDApIHtcbiAgICBpZiAoaSA9PSAwKSB7XG4gICAgICBlZGl0cy5wdXNoKEVESVRfQUREKTtcbiAgICAgIGotLTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoaiA9PSAwKSB7XG4gICAgICBlZGl0cy5wdXNoKEVESVRfREVMRVRFKTtcbiAgICAgIGktLTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBsZXQgbm9ydGhXZXN0ID0gZGlzdGFuY2VzW2kgLSAxXVtqIC0gMV07XG4gICAgbGV0IHdlc3QgPSBkaXN0YW5jZXNbaSAtIDFdW2pdO1xuICAgIGxldCBub3J0aCA9IGRpc3RhbmNlc1tpXVtqIC0gMV07XG5cbiAgICBsZXQgbWluO1xuICAgIGlmICh3ZXN0IDwgbm9ydGgpXG4gICAgICBtaW4gPSB3ZXN0IDwgbm9ydGhXZXN0ID8gd2VzdCA6IG5vcnRoV2VzdDtcbiAgICBlbHNlXG4gICAgICBtaW4gPSBub3J0aCA8IG5vcnRoV2VzdCA/IG5vcnRoIDogbm9ydGhXZXN0O1xuXG4gICAgaWYgKG1pbiA9PSBub3J0aFdlc3QpIHtcbiAgICAgIGlmIChub3J0aFdlc3QgPT0gY3VycmVudCkge1xuICAgICAgICBlZGl0cy5wdXNoKEVESVRfTEVBVkUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWRpdHMucHVzaChFRElUX1VQREFURSk7XG4gICAgICAgIGN1cnJlbnQgPSBub3J0aFdlc3Q7XG4gICAgICB9XG4gICAgICBpLS07XG4gICAgICBqLS07XG4gICAgfSBlbHNlIGlmIChtaW4gPT0gd2VzdCkge1xuICAgICAgZWRpdHMucHVzaChFRElUX0RFTEVURSk7XG4gICAgICBpLS07XG4gICAgICBjdXJyZW50ID0gd2VzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgZWRpdHMucHVzaChFRElUX0FERCk7XG4gICAgICBqLS07XG4gICAgICBjdXJyZW50ID0gbm9ydGg7XG4gICAgfVxuICB9XG5cbiAgZWRpdHMucmV2ZXJzZSgpO1xuICByZXR1cm4gZWRpdHM7XG59XG5cbi8qKlxuICogU3BsaWNlIFByb2plY3Rpb24gZnVuY3Rpb25zOlxuICpcbiAqIEEgc3BsaWNlIG1hcCBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIGhvdyBhIHByZXZpb3VzIGFycmF5IG9mIGl0ZW1zXG4gKiB3YXMgdHJhbnNmb3JtZWQgaW50byBhIG5ldyBhcnJheSBvZiBpdGVtcy4gQ29uY2VwdHVhbGx5IGl0IGlzIGEgbGlzdCBvZlxuICogdHVwbGVzIG9mXG4gKlxuICogICA8aW5kZXgsIHJlbW92ZWQsIGFkZGVkQ291bnQ+XG4gKlxuICogd2hpY2ggYXJlIGtlcHQgaW4gYXNjZW5kaW5nIGluZGV4IG9yZGVyIG9mLiBUaGUgdHVwbGUgcmVwcmVzZW50cyB0aGF0IGF0XG4gKiB0aGUgfGluZGV4fCwgfHJlbW92ZWR8IHNlcXVlbmNlIG9mIGl0ZW1zIHdlcmUgcmVtb3ZlZCwgYW5kIGNvdW50aW5nIGZvcndhcmRcbiAqIGZyb20gfGluZGV4fCwgfGFkZGVkQ291bnR8IGl0ZW1zIHdlcmUgYWRkZWQuXG4gKi9cblxuLyoqXG4gKiBMYWNraW5nIGluZGl2aWR1YWwgc3BsaWNlIG11dGF0aW9uIGluZm9ybWF0aW9uLCB0aGUgbWluaW1hbCBzZXQgb2ZcbiAqIHNwbGljZXMgY2FuIGJlIHN5bnRoZXNpemVkIGdpdmVuIHRoZSBwcmV2aW91cyBzdGF0ZSBhbmQgZmluYWwgc3RhdGUgb2YgYW5cbiAqIGFycmF5LiBUaGUgYmFzaWMgYXBwcm9hY2ggaXMgdG8gY2FsY3VsYXRlIHRoZSBlZGl0IGRpc3RhbmNlIG1hdHJpeCBhbmRcbiAqIGNob29zZSB0aGUgc2hvcnRlc3QgcGF0aCB0aHJvdWdoIGl0LlxuICpcbiAqIENvbXBsZXhpdHk6IE8obCAqIHApXG4gKiAgIGw6IFRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgYXJyYXlcbiAqICAgcDogVGhlIGxlbmd0aCBvZiB0aGUgb2xkIGFycmF5XG4gKlxuICogQHBhcmFtIHshQXJyYXl9IGN1cnJlbnQgVGhlIGN1cnJlbnQgXCJjaGFuZ2VkXCIgYXJyYXkgZm9yIHdoaWNoIHRvXG4gKiBjYWxjdWxhdGUgc3BsaWNlcy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50U3RhcnQgU3RhcnRpbmcgaW5kZXggaW4gdGhlIGBjdXJyZW50YCBhcnJheSBmb3JcbiAqIHdoaWNoIHNwbGljZXMgYXJlIGNhbGN1bGF0ZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gY3VycmVudEVuZCBFbmRpbmcgaW5kZXggaW4gdGhlIGBjdXJyZW50YCBhcnJheSBmb3JcbiAqIHdoaWNoIHNwbGljZXMgYXJlIGNhbGN1bGF0ZWQuXG4gKiBAcGFyYW0geyFBcnJheX0gb2xkIFRoZSBvcmlnaW5hbCBcInVuY2hhbmdlZFwiIGFycmF5IHRvIGNvbXBhcmUgYGN1cnJlbnRgXG4gKiBhZ2FpbnN0IHRvIGRldGVybWluZSBzcGxpY2VzLlxuICogQHBhcmFtIHtudW1iZXJ9IG9sZFN0YXJ0IFN0YXJ0aW5nIGluZGV4IGluIHRoZSBgb2xkYCBhcnJheSBmb3JcbiAqIHdoaWNoIHNwbGljZXMgYXJlIGNhbGN1bGF0ZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gb2xkRW5kIEVuZGluZyBpbmRleCBpbiB0aGUgYG9sZGAgYXJyYXkgZm9yXG4gKiB3aGljaCBzcGxpY2VzIGFyZSBjYWxjdWxhdGVkLlxuICogQHJldHVybiB7IUFycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIHNwbGljZSByZWNvcmQgb2JqZWN0cy4gRWFjaCBvZiB0aGVzZVxuICogY29udGFpbnM6IGBpbmRleGAgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBzcGxpY2Ugb2NjdXJyZWQ7IGByZW1vdmVkYFxuICogdGhlIGFycmF5IG9mIHJlbW92ZWQgaXRlbXMgZnJvbSB0aGlzIGxvY2F0aW9uOyBgYWRkZWRDb3VudGAgdGhlIG51bWJlclxuICogb2YgaXRlbXMgYWRkZWQgYXQgdGhpcyBsb2NhdGlvbi5cbiAqL1xuZnVuY3Rpb24gY2FsY1NwbGljZXMoY3VycmVudCwgY3VycmVudFN0YXJ0LCBjdXJyZW50RW5kLFxuICAgICAgICAgICAgICAgICAgICAgIG9sZCwgb2xkU3RhcnQsIG9sZEVuZCkge1xuICBsZXQgcHJlZml4Q291bnQgPSAwO1xuICBsZXQgc3VmZml4Q291bnQgPSAwO1xuICBsZXQgc3BsaWNlO1xuXG4gIGxldCBtaW5MZW5ndGggPSBNYXRoLm1pbihjdXJyZW50RW5kIC0gY3VycmVudFN0YXJ0LCBvbGRFbmQgLSBvbGRTdGFydCk7XG4gIGlmIChjdXJyZW50U3RhcnQgPT0gMCAmJiBvbGRTdGFydCA9PSAwKVxuICAgIHByZWZpeENvdW50ID0gc2hhcmVkUHJlZml4KGN1cnJlbnQsIG9sZCwgbWluTGVuZ3RoKTtcblxuICBpZiAoY3VycmVudEVuZCA9PSBjdXJyZW50Lmxlbmd0aCAmJiBvbGRFbmQgPT0gb2xkLmxlbmd0aClcbiAgICBzdWZmaXhDb3VudCA9IHNoYXJlZFN1ZmZpeChjdXJyZW50LCBvbGQsIG1pbkxlbmd0aCAtIHByZWZpeENvdW50KTtcblxuICBjdXJyZW50U3RhcnQgKz0gcHJlZml4Q291bnQ7XG4gIG9sZFN0YXJ0ICs9IHByZWZpeENvdW50O1xuICBjdXJyZW50RW5kIC09IHN1ZmZpeENvdW50O1xuICBvbGRFbmQgLT0gc3VmZml4Q291bnQ7XG5cbiAgaWYgKGN1cnJlbnRFbmQgLSBjdXJyZW50U3RhcnQgPT0gMCAmJiBvbGRFbmQgLSBvbGRTdGFydCA9PSAwKVxuICAgIHJldHVybiBbXTtcblxuICBpZiAoY3VycmVudFN0YXJ0ID09IGN1cnJlbnRFbmQpIHtcbiAgICBzcGxpY2UgPSBuZXdTcGxpY2UoY3VycmVudFN0YXJ0LCBbXSwgMCk7XG4gICAgd2hpbGUgKG9sZFN0YXJ0IDwgb2xkRW5kKVxuICAgICAgc3BsaWNlLnJlbW92ZWQucHVzaChvbGRbb2xkU3RhcnQrK10pO1xuXG4gICAgcmV0dXJuIFsgc3BsaWNlIF07XG4gIH0gZWxzZSBpZiAob2xkU3RhcnQgPT0gb2xkRW5kKVxuICAgIHJldHVybiBbIG5ld1NwbGljZShjdXJyZW50U3RhcnQsIFtdLCBjdXJyZW50RW5kIC0gY3VycmVudFN0YXJ0KSBdO1xuXG4gIGxldCBvcHMgPSBzcGxpY2VPcGVyYXRpb25zRnJvbUVkaXREaXN0YW5jZXMoXG4gICAgICBjYWxjRWRpdERpc3RhbmNlcyhjdXJyZW50LCBjdXJyZW50U3RhcnQsIGN1cnJlbnRFbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZCwgb2xkU3RhcnQsIG9sZEVuZCkpO1xuXG4gIHNwbGljZSA9IHVuZGVmaW5lZDtcbiAgbGV0IHNwbGljZXMgPSBbXTtcbiAgbGV0IGluZGV4ID0gY3VycmVudFN0YXJ0O1xuICBsZXQgb2xkSW5kZXggPSBvbGRTdGFydDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHMubGVuZ3RoOyBpKyspIHtcbiAgICBzd2l0Y2gob3BzW2ldKSB7XG4gICAgICBjYXNlIEVESVRfTEVBVkU6XG4gICAgICAgIGlmIChzcGxpY2UpIHtcbiAgICAgICAgICBzcGxpY2VzLnB1c2goc3BsaWNlKTtcbiAgICAgICAgICBzcGxpY2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCsrO1xuICAgICAgICBvbGRJbmRleCsrO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRURJVF9VUERBVEU6XG4gICAgICAgIGlmICghc3BsaWNlKVxuICAgICAgICAgIHNwbGljZSA9IG5ld1NwbGljZShpbmRleCwgW10sIDApO1xuXG4gICAgICAgIHNwbGljZS5hZGRlZENvdW50Kys7XG4gICAgICAgIGluZGV4Kys7XG5cbiAgICAgICAgc3BsaWNlLnJlbW92ZWQucHVzaChvbGRbb2xkSW5kZXhdKTtcbiAgICAgICAgb2xkSW5kZXgrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVESVRfQUREOlxuICAgICAgICBpZiAoIXNwbGljZSlcbiAgICAgICAgICBzcGxpY2UgPSBuZXdTcGxpY2UoaW5kZXgsIFtdLCAwKTtcblxuICAgICAgICBzcGxpY2UuYWRkZWRDb3VudCsrO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRURJVF9ERUxFVEU6XG4gICAgICAgIGlmICghc3BsaWNlKVxuICAgICAgICAgIHNwbGljZSA9IG5ld1NwbGljZShpbmRleCwgW10sIDApO1xuXG4gICAgICAgIHNwbGljZS5yZW1vdmVkLnB1c2gob2xkW29sZEluZGV4XSk7XG4gICAgICAgIG9sZEluZGV4Kys7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzcGxpY2UpIHtcbiAgICBzcGxpY2VzLnB1c2goc3BsaWNlKTtcbiAgfVxuICByZXR1cm4gc3BsaWNlcztcbn1cblxuZnVuY3Rpb24gc2hhcmVkUHJlZml4KGN1cnJlbnQsIG9sZCwgc2VhcmNoTGVuZ3RoKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VhcmNoTGVuZ3RoOyBpKyspXG4gICAgaWYgKCFlcXVhbHMoY3VycmVudFtpXSwgb2xkW2ldKSlcbiAgICAgIHJldHVybiBpO1xuICByZXR1cm4gc2VhcmNoTGVuZ3RoO1xufVxuXG5mdW5jdGlvbiBzaGFyZWRTdWZmaXgoY3VycmVudCwgb2xkLCBzZWFyY2hMZW5ndGgpIHtcbiAgbGV0IGluZGV4MSA9IGN1cnJlbnQubGVuZ3RoO1xuICBsZXQgaW5kZXgyID0gb2xkLmxlbmd0aDtcbiAgbGV0IGNvdW50ID0gMDtcbiAgd2hpbGUgKGNvdW50IDwgc2VhcmNoTGVuZ3RoICYmIGVxdWFscyhjdXJyZW50Wy0taW5kZXgxXSwgb2xkWy0taW5kZXgyXSkpXG4gICAgY291bnQrKztcblxuICByZXR1cm4gY291bnQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBzcGxpY2UgcmVjb3JkcyBpbmRpY2F0aW5nIHRoZSBtaW5pbXVtIGVkaXRzIHJlcXVpcmVkXG4gKiB0byB0cmFuc2Zvcm0gdGhlIGBwcmV2aW91c2AgYXJyYXkgaW50byB0aGUgYGN1cnJlbnRgIGFycmF5LlxuICpcbiAqIFNwbGljZSByZWNvcmRzIGFyZSBvcmRlcmVkIGJ5IGluZGV4IGFuZCBjb250YWluIHRoZSBmb2xsb3dpbmcgZmllbGRzOlxuICogLSBgaW5kZXhgOiBpbmRleCB3aGVyZSBlZGl0IHN0YXJ0ZWRcbiAqIC0gYHJlbW92ZWRgOiBhcnJheSBvZiByZW1vdmVkIGl0ZW1zIGZyb20gdGhpcyBpbmRleFxuICogLSBgYWRkZWRDb3VudGA6IG51bWJlciBvZiBpdGVtcyBhZGRlZCBhdCB0aGlzIGluZGV4XG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyBiYXNlZCBvbiB0aGUgTGV2ZW5zaHRlaW4gXCJtaW5pbXVtIGVkaXQgZGlzdGFuY2VcIlxuICogYWxnb3JpdGhtLiBOb3RlIHRoYXQgdXBkYXRlcyBhcmUgdHJlYXRlZCBhcyByZW1vdmFsIGZvbGxvd2VkIGJ5IGFkZGl0aW9uLlxuICpcbiAqIFRoZSB3b3JzdC1jYXNlIHRpbWUgY29tcGxleGl0eSBvZiB0aGlzIGFsZ29yaXRobSBpcyBgTyhsICogcClgXG4gKiAgIGw6IFRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgYXJyYXlcbiAqICAgcDogVGhlIGxlbmd0aCBvZiB0aGUgcHJldmlvdXMgYXJyYXlcbiAqXG4gKiBIb3dldmVyLCB0aGUgd29yc3QtY2FzZSBjb21wbGV4aXR5IGlzIHJlZHVjZWQgYnkgYW4gYE8obilgIG9wdGltaXphdGlvblxuICogdG8gZGV0ZWN0IGFueSBzaGFyZWQgcHJlZml4ICYgc3VmZml4IGJldHdlZW4gdGhlIHR3byBhcnJheXMgYW5kIG9ubHlcbiAqIHBlcmZvcm0gdGhlIG1vcmUgZXhwZW5zaXZlIG1pbmltdW0gZWRpdCBkaXN0YW5jZSBjYWxjdWxhdGlvbiBvdmVyIHRoZVxuICogbm9uLXNoYXJlZCBwb3J0aW9ucyBvZiB0aGUgYXJyYXlzLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshQXJyYXl9IGN1cnJlbnQgVGhlIFwiY2hhbmdlZFwiIGFycmF5IGZvciB3aGljaCBzcGxpY2VzIHdpbGwgYmVcbiAqIGNhbGN1bGF0ZWQuXG4gKiBAcGFyYW0geyFBcnJheX0gcHJldmlvdXMgVGhlIFwidW5jaGFuZ2VkXCIgb3JpZ2luYWwgYXJyYXkgdG8gY29tcGFyZVxuICogYGN1cnJlbnRgIGFnYWluc3QgdG8gZGV0ZXJtaW5lIHRoZSBzcGxpY2VzLlxuICogQHJldHVybiB7IUFycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIHNwbGljZSByZWNvcmQgb2JqZWN0cy4gRWFjaCBvZiB0aGVzZVxuICogY29udGFpbnM6IGBpbmRleGAgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBzcGxpY2Ugb2NjdXJyZWQ7IGByZW1vdmVkYFxuICogdGhlIGFycmF5IG9mIHJlbW92ZWQgaXRlbXMgZnJvbSB0aGlzIGxvY2F0aW9uOyBgYWRkZWRDb3VudGAgdGhlIG51bWJlclxuICogb2YgaXRlbXMgYWRkZWQgYXQgdGhpcyBsb2NhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZVNwbGljZXMoY3VycmVudCwgcHJldmlvdXMpIHtcbiAgcmV0dXJuIGNhbGNTcGxpY2VzKGN1cnJlbnQsIDAsIGN1cnJlbnQubGVuZ3RoLCBwcmV2aW91cywgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMubGVuZ3RoKTtcbn1cblxuZnVuY3Rpb24gZXF1YWxzKGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSkge1xuICByZXR1cm4gY3VycmVudFZhbHVlID09PSBwcmV2aW91c1ZhbHVlO1xufVxuIiwiLyoqXG5AbGljZW5zZVxuQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHRcblRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0XG5UaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHRcbkNvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvXG5zdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dFxuKi9cblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3XG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBudW1iZXIgb2Ygc3RyYXRlZ2llcyBmb3IgZW5xdWV1aW5nIGFzeW5jaHJvbm91c1xuICogdGFza3MuIEVhY2ggc3ViLW1vZHVsZSBwcm92aWRlcyBhIHN0YW5kYXJkIGBydW4oZm4pYCBpbnRlcmZhY2UgdGhhdCByZXR1cm5zIGFcbiAqIGhhbmRsZSwgYW5kIGEgYGNhbmNlbChoYW5kbGUpYCBpbnRlcmZhY2UgZm9yIGNhbmNlbGluZyBhc3luYyB0YXNrcyBiZWZvcmVcbiAqIHRoZXkgcnVuLlxuICpcbiAqIEBzdW1tYXJ5IE1vZHVsZSB0aGF0IHByb3ZpZGVzIGEgbnVtYmVyIG9mIHN0cmF0ZWdpZXMgZm9yIGVucXVldWluZ1xuICogYXN5bmNocm9ub3VzIHRhc2tzLlxuICovXG5cbmltcG9ydCAnLi9ib290LmpzJztcblxuLy8gTWljcm90YXNrIGltcGxlbWVudGVkIHVzaW5nIE11dGF0aW9uIE9ic2VydmVyXG5sZXQgbWljcm90YXNrQ3VyckhhbmRsZSA9IDA7XG5sZXQgbWljcm90YXNrTGFzdEhhbmRsZSA9IDA7XG5sZXQgbWljcm90YXNrQ2FsbGJhY2tzID0gW107XG5sZXQgbWljcm90YXNrTm9kZUNvbnRlbnQgPSAwO1xubGV0IG1pY3JvdGFza05vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG5uZXcgd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIobWljcm90YXNrRmx1c2gpLm9ic2VydmUobWljcm90YXNrTm9kZSwge2NoYXJhY3RlckRhdGE6IHRydWV9KTtcblxuZnVuY3Rpb24gbWljcm90YXNrRmx1c2goKSB7XG4gIGNvbnN0IGxlbiA9IG1pY3JvdGFza0NhbGxiYWNrcy5sZW5ndGg7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBsZXQgY2IgPSBtaWNyb3Rhc2tDYWxsYmFja3NbaV07XG4gICAgaWYgKGNiKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjYigpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhyb3cgZTsgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIG1pY3JvdGFza0NhbGxiYWNrcy5zcGxpY2UoMCwgbGVuKTtcbiAgbWljcm90YXNrTGFzdEhhbmRsZSArPSBsZW47XG59XG5cbi8qKlxuICogQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGBzZXRUaW1lb3V0YC5cbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAc3VtbWFyeSBBc3luYyBpbnRlcmZhY2Ugd3JhcHBlciBhcm91bmQgYHNldFRpbWVvdXRgLlxuICovXG5jb25zdCB0aW1lT3V0ID0ge1xuICAvKipcbiAgICogUmV0dXJucyBhIHN1Yi1tb2R1bGUgd2l0aCB0aGUgYXN5bmMgaW50ZXJmYWNlIHByb3ZpZGluZyB0aGUgcHJvdmlkZWRcbiAgICogZGVsYXkuXG4gICAqXG4gICAqIEBtZW1iZXJvZiB0aW1lT3V0XG4gICAqIEBwYXJhbSB7bnVtYmVyPX0gZGVsYXkgVGltZSB0byB3YWl0IGJlZm9yZSBjYWxsaW5nIGNhbGxiYWNrcyBpbiBtc1xuICAgKiBAcmV0dXJuIHshQXN5bmNJbnRlcmZhY2V9IEFuIGFzeW5jIHRpbWVvdXQgaW50ZXJmYWNlXG4gICAqL1xuICBhZnRlcihkZWxheSkge1xuICAgIHJldHVybiB7XG4gICAgICBydW4oZm4pIHsgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZuLCBkZWxheSk7IH0sXG4gICAgICBjYW5jZWwoaGFuZGxlKSB7XG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICAvKipcbiAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgaW4gdGhlIG5leHQgdGFzay5cbiAgICpcbiAgICogQG1lbWJlcm9mIHRpbWVPdXRcbiAgICogQHBhcmFtIHshRnVuY3Rpb259IGZuIENhbGxiYWNrIHRvIHJ1blxuICAgKiBAcGFyYW0ge251bWJlcj19IGRlbGF5IERlbGF5IGluIG1pbGxpc2Vjb25kc1xuICAgKiBAcmV0dXJuIHtudW1iZXJ9IEhhbmRsZSB1c2VkIGZvciBjYW5jZWxpbmcgdGFza1xuICAgKi9cbiAgcnVuKGZuLCBkZWxheSkge1xuICAgIHJldHVybiB3aW5kb3cuc2V0VGltZW91dChmbiwgZGVsYXkpO1xuICB9LFxuICAvKipcbiAgICogQ2FuY2VscyBhIHByZXZpb3VzbHkgZW5xdWV1ZWQgYHRpbWVPdXRgIGNhbGxiYWNrLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgdGltZU91dFxuICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbFxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgY2FuY2VsKGhhbmRsZSkge1xuICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgfVxufTtcbmV4cG9ydCB7dGltZU91dH07XG5cbi8qKlxuICogQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLlxuICpcbiAqIEBuYW1lc3BhY2VcbiAqIEBzdW1tYXJ5IEFzeW5jIGludGVyZmFjZSB3cmFwcGVyIGFyb3VuZCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC5cbiAqL1xuY29uc3QgYW5pbWF0aW9uRnJhbWUgPSB7XG4gIC8qKlxuICAgKiBFbnF1ZXVlcyBhIGZ1bmN0aW9uIGNhbGxlZCBhdCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCB0aW1pbmcuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBhbmltYXRpb25GcmFtZVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6dm9pZH0gZm4gQ2FsbGJhY2sgdG8gcnVuXG4gICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHVzZWQgZm9yIGNhbmNlbGluZyB0YXNrXG4gICAqL1xuICBydW4oZm4pIHtcbiAgICByZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7XG4gIH0sXG4gIC8qKlxuICAgKiBDYW5jZWxzIGEgcHJldmlvdXNseSBlbnF1ZXVlZCBgYW5pbWF0aW9uRnJhbWVgIGNhbGxiYWNrLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgYW5pbWF0aW9uRnJhbWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhhbmRsZSBIYW5kbGUgcmV0dXJuZWQgZnJvbSBgcnVuYCBvZiBjYWxsYmFjayB0byBjYW5jZWxcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIGNhbmNlbChoYW5kbGUpIHtcbiAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUoaGFuZGxlKTtcbiAgfVxufTtcbmV4cG9ydCB7YW5pbWF0aW9uRnJhbWV9O1xuXG4vKipcbiAqIEFzeW5jIGludGVyZmFjZSB3cmFwcGVyIGFyb3VuZCBgcmVxdWVzdElkbGVDYWxsYmFja2AuICBGYWxscyBiYWNrIHRvXG4gKiBgc2V0VGltZW91dGAgb24gYnJvd3NlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBgcmVxdWVzdElkbGVDYWxsYmFja2AuXG4gKlxuICogQG5hbWVzcGFjZVxuICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0SWRsZUNhbGxiYWNrYC5cbiAqL1xuY29uc3QgaWRsZVBlcmlvZCA9IHtcbiAgLyoqXG4gICAqIEVucXVldWVzIGEgZnVuY3Rpb24gY2FsbGVkIGF0IGByZXF1ZXN0SWRsZUNhbGxiYWNrYCB0aW1pbmcuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBpZGxlUGVyaW9kXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUlkbGVEZWFkbGluZSk6dm9pZH0gZm4gQ2FsbGJhY2sgdG8gcnVuXG4gICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHVzZWQgZm9yIGNhbmNlbGluZyB0YXNrXG4gICAqL1xuICBydW4oZm4pIHtcbiAgICByZXR1cm4gd2luZG93LnJlcXVlc3RJZGxlQ2FsbGJhY2sgP1xuICAgICAgd2luZG93LnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4pIDpcbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZuLCAxNik7XG4gIH0sXG4gIC8qKlxuICAgKiBDYW5jZWxzIGEgcHJldmlvdXNseSBlbnF1ZXVlZCBgaWRsZVBlcmlvZGAgY2FsbGJhY2suXG4gICAqXG4gICAqIEBtZW1iZXJvZiBpZGxlUGVyaW9kXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gYHJ1bmAgb2YgY2FsbGJhY2sgdG8gY2FuY2VsXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBjYW5jZWwoaGFuZGxlKSB7XG4gICAgd2luZG93LmNhbmNlbElkbGVDYWxsYmFjayA/XG4gICAgICB3aW5kb3cuY2FuY2VsSWRsZUNhbGxiYWNrKGhhbmRsZSkgOlxuICAgICAgd2luZG93LmNsZWFyVGltZW91dChoYW5kbGUpO1xuICB9XG59O1xuZXhwb3J0IHtpZGxlUGVyaW9kfTtcblxuLyoqXG4gKiBBc3luYyBpbnRlcmZhY2UgZm9yIGVucXVldWluZyBjYWxsYmFja3MgdGhhdCBydW4gYXQgbWljcm90YXNrIHRpbWluZy5cbiAqXG4gKiBOb3RlIHRoYXQgbWljcm90YXNrIHRpbWluZyBpcyBhY2hpZXZlZCB2aWEgYSBzaW5nbGUgYE11dGF0aW9uT2JzZXJ2ZXJgLFxuICogYW5kIHRodXMgY2FsbGJhY2tzIGVucXVldWVkIHdpdGggdGhpcyBBUEkgd2lsbCBhbGwgcnVuIGluIGEgc2luZ2xlXG4gKiBiYXRjaCwgYW5kIG5vdCBpbnRlcmxlYXZlZCB3aXRoIG90aGVyIG1pY3JvdGFza3Mgc3VjaCBhcyBwcm9taXNlcy5cbiAqIFByb21pc2VzIGFyZSBhdm9pZGVkIGFzIGFuIGltcGxlbWVudGF0aW9uIGNob2ljZSBmb3IgdGhlIHRpbWUgYmVpbmdcbiAqIGR1ZSB0byBTYWZhcmkgYnVncyB0aGF0IGNhdXNlIFByb21pc2VzIHRvIGxhY2sgbWljcm90YXNrIGd1YXJhbnRlZXMuXG4gKlxuICogQG5hbWVzcGFjZVxuICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIGZvciBlbnF1ZXVpbmcgY2FsbGJhY2tzIHRoYXQgcnVuIGF0IG1pY3JvdGFza1xuICogICB0aW1pbmcuXG4gKi9cbmNvbnN0IG1pY3JvVGFzayA9IHtcblxuICAvKipcbiAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgbWljcm90YXNrIHRpbWluZy5cbiAgICpcbiAgICogQG1lbWJlcm9mIG1pY3JvVGFza1xuICAgKiBAcGFyYW0geyFGdW5jdGlvbj19IGNhbGxiYWNrIENhbGxiYWNrIHRvIHJ1blxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IEhhbmRsZSB1c2VkIGZvciBjYW5jZWxpbmcgdGFza1xuICAgKi9cbiAgcnVuKGNhbGxiYWNrKSB7XG4gICAgbWljcm90YXNrTm9kZS50ZXh0Q29udGVudCA9IG1pY3JvdGFza05vZGVDb250ZW50Kys7XG4gICAgbWljcm90YXNrQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIHJldHVybiBtaWNyb3Rhc2tDdXJySGFuZGxlKys7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENhbmNlbHMgYSBwcmV2aW91c2x5IGVucXVldWVkIGBtaWNyb1Rhc2tgIGNhbGxiYWNrLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgbWljcm9UYXNrXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gYHJ1bmAgb2YgY2FsbGJhY2sgdG8gY2FuY2VsXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBjYW5jZWwoaGFuZGxlKSB7XG4gICAgY29uc3QgaWR4ID0gaGFuZGxlIC0gbWljcm90YXNrTGFzdEhhbmRsZTtcbiAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgIGlmICghbWljcm90YXNrQ2FsbGJhY2tzW2lkeF0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFzeW5jIGhhbmRsZTogJyArIGhhbmRsZSk7XG4gICAgICB9XG4gICAgICBtaWNyb3Rhc2tDYWxsYmFja3NbaWR4XSA9IG51bGw7XG4gICAgfVxuICB9XG5cbn07XG5leHBvcnQge21pY3JvVGFza307XG4iLCIvKipcbkBsaWNlbnNlXG5Db3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHRcblRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dFxuQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc29cbnN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4qL1xuXG53aW5kb3cuSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSA9IGZ1bmN0aW9uKHByb3ApIHsgcmV0dXJuIHByb3A7IH07XG4iLCIvKipcbkBsaWNlbnNlXG5Db3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHRcblRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dFxuQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc29cbnN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4qL1xuaW1wb3J0ICcuL2Jvb3QuanMnO1xuXG5jb25zdCBjYXNlTWFwID0ge307XG5jb25zdCBEQVNIX1RPX0NBTUVMID0gLy1bYS16XS9nO1xuY29uc3QgQ0FNRUxfVE9fREFTSCA9IC8oW0EtWl0pL2c7XG5cbi8qKlxuICogQGZpbGVvdmVydmlldyBNb2R1bGUgd2l0aCB1dGlsaXRpZXMgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBcImRhc2gtY2FzZVwiIGFuZFxuICogXCJjYW1lbENhc2VcIiBpZGVudGlmaWVycy5cbiAqL1xuXG4vKipcbiAqIENvbnZlcnRzIFwiZGFzaC1jYXNlXCIgaWRlbnRpZmllciAoZS5nLiBgZm9vLWJhci1iYXpgKSB0byBcImNhbWVsQ2FzZVwiXG4gKiAoZS5nLiBgZm9vQmFyQmF6YCkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRhc2ggRGFzaC1jYXNlIGlkZW50aWZpZXJcbiAqIEByZXR1cm4ge3N0cmluZ30gQ2FtZWwtY2FzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaWRlbnRpZmllclxuICovXG5leHBvcnQgZnVuY3Rpb24gZGFzaFRvQ2FtZWxDYXNlKGRhc2gpIHtcbiAgcmV0dXJuIGNhc2VNYXBbZGFzaF0gfHwgKFxuICAgIGNhc2VNYXBbZGFzaF0gPSBkYXNoLmluZGV4T2YoJy0nKSA8IDAgPyBkYXNoIDogZGFzaC5yZXBsYWNlKERBU0hfVE9fQ0FNRUwsXG4gICAgICAobSkgPT4gbVsxXS50b1VwcGVyQ2FzZSgpXG4gICAgKVxuICApO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIFwiY2FtZWxDYXNlXCIgaWRlbnRpZmllciAoZS5nLiBgZm9vQmFyQmF6YCkgdG8gXCJkYXNoLWNhc2VcIlxuICogKGUuZy4gYGZvby1iYXItYmF6YCkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNhbWVsIENhbWVsLWNhc2UgaWRlbnRpZmllclxuICogQHJldHVybiB7c3RyaW5nfSBEYXNoLWNhc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlkZW50aWZpZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbWVsVG9EYXNoQ2FzZShjYW1lbCkge1xuICByZXR1cm4gY2FzZU1hcFtjYW1lbF0gfHwgKFxuICAgIGNhc2VNYXBbY2FtZWxdID0gY2FtZWwucmVwbGFjZShDQU1FTF9UT19EQVNILCAnLSQxJykudG9Mb3dlckNhc2UoKVxuICApO1xufVxuIiwiLyoqXG5AbGljZW5zZVxuQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHRcblRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0XG5UaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHRcbkNvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvXG5zdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dFxuKi9cbmltcG9ydCAnLi9ib290LmpzJztcblxuaW1wb3J0IHsgY2FsY3VsYXRlU3BsaWNlcyB9IGZyb20gJy4vYXJyYXktc3BsaWNlLmpzJztcbmltcG9ydCB7IG1pY3JvVGFzayB9IGZyb20gJy4vYXN5bmMuanMnO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBgbm9kZWAgaXMgYSBzbG90IGVsZW1lbnRcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGBub2RlYCBpcyBhIHNsb3RcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGlzU2xvdChub2RlKSB7XG4gIHJldHVybiAobm9kZS5sb2NhbE5hbWUgPT09ICdzbG90Jyk7XG59XG5cbi8qKlxuICogQ2xhc3MgdGhhdCBsaXN0ZW5zIGZvciBjaGFuZ2VzIChhZGRpdGlvbnMgb3IgcmVtb3ZhbHMpIHRvXG4gKiBcImZsYXR0ZW5lZCBub2Rlc1wiIG9uIGEgZ2l2ZW4gYG5vZGVgLiBUaGUgbGlzdCBvZiBmbGF0dGVuZWQgbm9kZXMgY29uc2lzdHNcbiAqIG9mIGEgbm9kZSdzIGNoaWxkcmVuIGFuZCwgZm9yIGFueSBjaGlsZHJlbiB0aGF0IGFyZSBgPHNsb3Q+YCBlbGVtZW50cyxcbiAqIHRoZSBleHBhbmRlZCBmbGF0dGVuZWQgbGlzdCBvZiBgYXNzaWduZWROb2Rlc2AuXG4gKiBGb3IgZXhhbXBsZSwgaWYgdGhlIG9ic2VydmVkIG5vZGUgaGFzIGNoaWxkcmVuIGA8YT48L2E+PHNsb3Q+PC9zbG90PjxiPjwvYj5gXG4gKiBhbmQgdGhlIGA8c2xvdD5gIGhhcyBvbmUgYDxkaXY+YCBhc3NpZ25lZCB0byBpdCwgdGhlbiB0aGUgZmxhdHRlbmVkXG4gKiBub2RlcyBsaXN0IGlzIGA8YT48L2E+PGRpdj48L2Rpdj48Yj48L2I+YC4gSWYgdGhlIGA8c2xvdD5gIGhhcyBvdGhlclxuICogYDxzbG90PmAgZWxlbWVudHMgYXNzaWduZWQgdG8gaXQsIHRoZXNlIGFyZSBmbGF0dGVuZWQgYXMgd2VsbC5cbiAqXG4gKiBUaGUgcHJvdmlkZWQgYGNhbGxiYWNrYCBpcyBjYWxsZWQgd2hlbmV2ZXIgYW55IGNoYW5nZSB0byB0aGlzIGxpc3RcbiAqIG9mIGZsYXR0ZW5lZCBub2RlcyBvY2N1cnMsIHdoZXJlIGFuIGFkZGl0aW9uIG9yIHJlbW92YWwgb2YgYSBub2RlIGlzXG4gKiBjb25zaWRlcmVkIGEgY2hhbmdlLiBUaGUgYGNhbGxiYWNrYCBpcyBjYWxsZWQgd2l0aCBvbmUgYXJndW1lbnQsIGFuIG9iamVjdFxuICogY29udGFpbmluZyBhbiBhcnJheSBvZiBhbnkgYGFkZGVkTm9kZXNgIGFuZCBgcmVtb3ZlZE5vZGVzYC5cbiAqXG4gKiBOb3RlOiB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkIGFzeW5jaHJvbm91cyB0byBhbnkgY2hhbmdlc1xuICogYXQgYSBtaWNyb3Rhc2sgY2hlY2twb2ludC4gVGhpcyBpcyBiZWNhdXNlIG9ic2VydmF0aW9uIGlzIHBlcmZvcm1lZCB1c2luZ1xuICogYE11dGF0aW9uT2JzZXJ2ZXJgIGFuZCB0aGUgYDxzbG90PmAgZWxlbWVudCdzIGBzbG90Y2hhbmdlYCBldmVudCB3aGljaFxuICogYXJlIGFzeW5jaHJvbm91cy5cbiAqXG4gKiBBbiBleGFtcGxlOlxuICogYGBganNcbiAqIGNsYXNzIFRlc3RTZWxmT2JzZXJ2ZSBleHRlbmRzIFBvbHltZXJFbGVtZW50IHtcbiAqICAgc3RhdGljIGdldCBpcygpIHsgcmV0dXJuICd0ZXN0LXNlbGYtb2JzZXJ2ZSc7fVxuICogICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAqICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICogICAgIHRoaXMuX29ic2VydmVyID0gbmV3IEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIodGhpcywgKGluZm8pID0+IHtcbiAqICAgICAgIHRoaXMuaW5mbyA9IGluZm87XG4gKiAgICAgfSk7XG4gKiAgIH1cbiAqICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gKiAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAqICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gKiAgIH1cbiAqIH1cbiAqIGN1c3RvbUVsZW1lbnRzLmRlZmluZShUZXN0U2VsZk9ic2VydmUuaXMsIFRlc3RTZWxmT2JzZXJ2ZSk7XG4gKiBgYGBcbiAqXG4gKiBAc3VtbWFyeSBDbGFzcyB0aGF0IGxpc3RlbnMgZm9yIGNoYW5nZXMgKGFkZGl0aW9ucyBvciByZW1vdmFscykgdG9cbiAqIFwiZmxhdHRlbmVkIG5vZGVzXCIgb24gYSBnaXZlbiBgbm9kZWAuXG4gKi9cbmV4cG9ydCBjbGFzcyBGbGF0dGVuZWROb2Rlc09ic2VydmVyIHtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBmbGF0dGVuZWQgbm9kZXMgZm9yIHRoZSBnaXZlbiBgbm9kZWAuXG4gICAqIFRoaXMgbGlzdCBjb25zaXN0cyBvZiBhIG5vZGUncyBjaGlsZHJlbiBhbmQsIGZvciBhbnkgY2hpbGRyZW5cbiAgICogdGhhdCBhcmUgYDxzbG90PmAgZWxlbWVudHMsIHRoZSBleHBhbmRlZCBmbGF0dGVuZWQgbGlzdCBvZiBgYXNzaWduZWROb2Rlc2AuXG4gICAqIEZvciBleGFtcGxlLCBpZiB0aGUgb2JzZXJ2ZWQgbm9kZSBoYXMgY2hpbGRyZW4gYDxhPjwvYT48c2xvdD48L3Nsb3Q+PGI+PC9iPmBcbiAgICogYW5kIHRoZSBgPHNsb3Q+YCBoYXMgb25lIGA8ZGl2PmAgYXNzaWduZWQgdG8gaXQsIHRoZW4gdGhlIGZsYXR0ZW5lZFxuICAgKiBub2RlcyBsaXN0IGlzIGA8YT48L2E+PGRpdj48L2Rpdj48Yj48L2I+YC4gSWYgdGhlIGA8c2xvdD5gIGhhcyBvdGhlclxuICAgKiBgPHNsb3Q+YCBlbGVtZW50cyBhc3NpZ25lZCB0byBpdCwgdGhlc2UgYXJlIGZsYXR0ZW5lZCBhcyB3ZWxsLlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fEhUTUxTbG90RWxlbWVudH0gbm9kZSBUaGUgbm9kZSBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZSBsaXN0IG9mIGZsYXR0ZW5lZCBub2Rlcy5cbiAgICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIGZsYXR0ZW5lZCBub2RlcyBmb3IgdGhlIGdpdmVuIGBub2RlYC5cbiAgKi9cbiAgc3RhdGljIGdldEZsYXR0ZW5lZE5vZGVzKG5vZGUpIHtcbiAgICBpZiAoaXNTbG90KG5vZGUpKSB7XG4gICAgICBub2RlID0gLyoqIEB0eXBlIHtIVE1MU2xvdEVsZW1lbnR9ICovKG5vZGUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduXG4gICAgICByZXR1cm4gbm9kZS5hc3NpZ25lZE5vZGVzKHtmbGF0dGVuOiB0cnVlfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKG5vZGUuY2hpbGROb2RlcykubWFwKChub2RlKSA9PiB7XG4gICAgICAgIGlmIChpc1Nsb3Qobm9kZSkpIHtcbiAgICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtIVE1MU2xvdEVsZW1lbnR9ICovKG5vZGUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduXG4gICAgICAgICAgcmV0dXJuIG5vZGUuYXNzaWduZWROb2Rlcyh7ZmxhdHRlbjogdHJ1ZX0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBbbm9kZV07XG4gICAgICAgIH1cbiAgICAgIH0pLnJlZHVjZSgoYSwgYikgPT4gYS5jb25jYXQoYiksIFtdKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgTm9kZSBvbiB3aGljaCB0byBsaXN0ZW4gZm9yIGNoYW5nZXMuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFbGVtZW50LCB7IHRhcmdldDogIUVsZW1lbnQsIGFkZGVkTm9kZXM6ICFBcnJheTwhRWxlbWVudD4sIHJlbW92ZWROb2RlczogIUFycmF5PCFFbGVtZW50PiB9KTp2b2lkfSBjYWxsYmFjayBGdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGVyZSBhcmUgYWRkaXRpb25zXG4gICAqIG9yIHJlbW92YWxzIGZyb20gdGhlIHRhcmdldCdzIGxpc3Qgb2YgZmxhdHRlbmVkIG5vZGVzLlxuICAqL1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQsIGNhbGxiYWNrKSB7XG4gICAgLyoqXG4gICAgICogQHR5cGUge011dGF0aW9uT2JzZXJ2ZXJ9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtNdXRhdGlvbk9ic2VydmVyfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlciA9IG51bGw7XG4gICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQHR5cGUge0VsZW1lbnR9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl90YXJnZXQgPSB0YXJnZXQ7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMuX2VmZmVjdGl2ZU5vZGVzID0gW107XG4gICAgdGhpcy5fb2JzZXJ2ZXIgPSBudWxsO1xuICAgIHRoaXMuX3NjaGVkdWxlZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtmdW5jdGlvbigpfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5fYm91bmRTY2hlZHVsZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX3NjaGVkdWxlKCk7XG4gICAgfTtcbiAgICB0aGlzLmNvbm5lY3QoKTtcbiAgICB0aGlzLl9zY2hlZHVsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlcyBhbiBvYnNlcnZlci4gVGhpcyBtZXRob2QgaXMgYXV0b21hdGljYWxseSBjYWxsZWQgd2hlblxuICAgKiBhIGBGbGF0dGVuZWROb2Rlc09ic2VydmVyYCBpcyBjcmVhdGVkLiBJdCBzaG91bGQgb25seSBiZSBjYWxsZWQgdG9cbiAgICogcmUtYWN0aXZhdGUgYW4gb2JzZXJ2ZXIgdGhhdCBoYXMgYmVlbiBkZWFjdGl2YXRlZCB2aWEgdGhlIGBkaXNjb25uZWN0YCBtZXRob2QuXG4gICAqXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBjb25uZWN0KCkge1xuICAgIGlmIChpc1Nsb3QodGhpcy5fdGFyZ2V0KSkge1xuICAgICAgdGhpcy5fbGlzdGVuU2xvdHMoW3RoaXMuX3RhcmdldF0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fdGFyZ2V0LmNoaWxkcmVuKSB7XG4gICAgICB0aGlzLl9saXN0ZW5TbG90cyh0aGlzLl90YXJnZXQuY2hpbGRyZW4pO1xuICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSkge1xuICAgICAgICB0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIgPVxuICAgICAgICAgIFNoYWR5RE9NLm9ic2VydmVDaGlsZHJlbih0aGlzLl90YXJnZXQsIChtdXRhdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NNdXRhdGlvbnMobXV0YXRpb25zKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIgPVxuICAgICAgICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NNdXRhdGlvbnMobXV0YXRpb25zKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlci5vYnNlcnZlKHRoaXMuX3RhcmdldCwge2NoaWxkTGlzdDogdHJ1ZX0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9jb25uZWN0ZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlYWN0aXZhdGVzIHRoZSBmbGF0dGVuZWQgbm9kZXMgb2JzZXJ2ZXIuIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2RcbiAgICogdGhlIG9ic2VydmVyIGNhbGxiYWNrIHdpbGwgbm90IGJlIGNhbGxlZCB3aGVuIGNoYW5nZXMgdG8gZmxhdHRlbmVkIG5vZGVzXG4gICAqIG9jY3VyLiBUaGUgYGNvbm5lY3RgIG1ldGhvZCBtYXkgYmUgc3Vic2VxdWVudGx5IGNhbGxlZCB0byByZWFjdGl2YXRlXG4gICAqIHRoZSBvYnNlcnZlci5cbiAgICpcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIGRpc2Nvbm5lY3QoKSB7XG4gICAgaWYgKGlzU2xvdCh0aGlzLl90YXJnZXQpKSB7XG4gICAgICB0aGlzLl91bmxpc3RlblNsb3RzKFt0aGlzLl90YXJnZXRdKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3RhcmdldC5jaGlsZHJlbikge1xuICAgICAgdGhpcy5fdW5saXN0ZW5TbG90cyh0aGlzLl90YXJnZXQuY2hpbGRyZW4pO1xuICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSAmJiB0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIpIHtcbiAgICAgICAgU2hhZHlET00udW5vYnNlcnZlQ2hpbGRyZW4odGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyKTtcbiAgICAgICAgdGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlcikge1xuICAgICAgICB0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgdGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlciA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2Nvbm5lY3RlZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfc2NoZWR1bGUoKSB7XG4gICAgaWYgKCF0aGlzLl9zY2hlZHVsZWQpIHtcbiAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IHRydWU7XG4gICAgICBtaWNyb1Rhc2sucnVuKCgpID0+IHRoaXMuZmx1c2goKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QXJyYXk8TXV0YXRpb25SZWNvcmQ+fSBtdXRhdGlvbnMgTXV0YXRpb25zIHNpZ25hbGVkIGJ5IHRoZSBtdXRhdGlvbiBvYnNlcnZlclxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3Byb2Nlc3NNdXRhdGlvbnMobXV0YXRpb25zKSB7XG4gICAgdGhpcy5fcHJvY2Vzc1Nsb3RNdXRhdGlvbnMobXV0YXRpb25zKTtcbiAgICB0aGlzLmZsdXNoKCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtBcnJheTxNdXRhdGlvblJlY29yZD59IG11dGF0aW9ucyBNdXRhdGlvbnMgc2lnbmFsZWQgYnkgdGhlIG11dGF0aW9uIG9ic2VydmVyXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcHJvY2Vzc1Nsb3RNdXRhdGlvbnMobXV0YXRpb25zKSB7XG4gICAgaWYgKG11dGF0aW9ucykge1xuICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbXV0YXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBtdXRhdGlvbiA9IG11dGF0aW9uc1tpXTtcbiAgICAgICAgaWYgKG11dGF0aW9uLmFkZGVkTm9kZXMpIHtcbiAgICAgICAgICB0aGlzLl9saXN0ZW5TbG90cyhtdXRhdGlvbi5hZGRlZE5vZGVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobXV0YXRpb24ucmVtb3ZlZE5vZGVzKSB7XG4gICAgICAgICAgdGhpcy5fdW5saXN0ZW5TbG90cyhtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoZXMgdGhlIG9ic2VydmVyIGNhdXNpbmcgYW55IHBlbmRpbmcgY2hhbmdlcyB0byBiZSBpbW1lZGlhdGVseVxuICAgKiBkZWxpdmVyZWQgdGhlIG9ic2VydmVyIGNhbGxiYWNrLiBCeSBkZWZhdWx0IHRoZXNlIGNoYW5nZXMgYXJlIGRlbGl2ZXJlZFxuICAgKiBhc3luY2hyb25vdXNseSBhdCB0aGUgbmV4dCBtaWNyb3Rhc2sgY2hlY2twb2ludC5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFueSBwZW5kaW5nIGNoYW5nZXMgY2F1c2VkIHRoZSBvYnNlcnZlclxuICAgKiBjYWxsYmFjayB0byBydW4uXG4gICAqL1xuICBmbHVzaCgpIHtcbiAgICBpZiAoIXRoaXMuX2Nvbm5lY3RlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAod2luZG93LlNoYWR5RE9NKSB7XG4gICAgICBTaGFkeURPTS5mbHVzaCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlcikge1xuICAgICAgdGhpcy5fcHJvY2Vzc1Nsb3RNdXRhdGlvbnModGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlci50YWtlUmVjb3JkcygpKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlcikge1xuICAgICAgdGhpcy5fcHJvY2Vzc1Nsb3RNdXRhdGlvbnModGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyLnRha2VSZWNvcmRzKCkpO1xuICAgIH1cbiAgICB0aGlzLl9zY2hlZHVsZWQgPSBmYWxzZTtcbiAgICBsZXQgaW5mbyA9IHtcbiAgICAgIHRhcmdldDogdGhpcy5fdGFyZ2V0LFxuICAgICAgYWRkZWROb2RlczogW10sXG4gICAgICByZW1vdmVkTm9kZXM6IFtdXG4gICAgfTtcbiAgICBsZXQgbmV3Tm9kZXMgPSB0aGlzLmNvbnN0cnVjdG9yLmdldEZsYXR0ZW5lZE5vZGVzKHRoaXMuX3RhcmdldCk7XG4gICAgbGV0IHNwbGljZXMgPSBjYWxjdWxhdGVTcGxpY2VzKG5ld05vZGVzLFxuICAgICAgdGhpcy5fZWZmZWN0aXZlTm9kZXMpO1xuICAgIC8vIHByb2Nlc3MgcmVtb3ZhbHNcbiAgICBmb3IgKGxldCBpPTAsIHM7IChpPHNwbGljZXMubGVuZ3RoKSAmJiAocz1zcGxpY2VzW2ldKTsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqPTAsIG47IChqIDwgcy5yZW1vdmVkLmxlbmd0aCkgJiYgKG49cy5yZW1vdmVkW2pdKTsgaisrKSB7XG4gICAgICAgIGluZm8ucmVtb3ZlZE5vZGVzLnB1c2gobik7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHByb2Nlc3MgYWRkc1xuICAgIGZvciAobGV0IGk9MCwgczsgKGk8c3BsaWNlcy5sZW5ndGgpICYmIChzPXNwbGljZXNbaV0pOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGo9cy5pbmRleDsgaiA8IHMuaW5kZXggKyBzLmFkZGVkQ291bnQ7IGorKykge1xuICAgICAgICBpbmZvLmFkZGVkTm9kZXMucHVzaChuZXdOb2Rlc1tqXSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHVwZGF0ZSBjYWNoZVxuICAgIHRoaXMuX2VmZmVjdGl2ZU5vZGVzID0gbmV3Tm9kZXM7XG4gICAgbGV0IGRpZEZsdXNoID0gZmFsc2U7XG4gICAgaWYgKGluZm8uYWRkZWROb2Rlcy5sZW5ndGggfHwgaW5mby5yZW1vdmVkTm9kZXMubGVuZ3RoKSB7XG4gICAgICBkaWRGbHVzaCA9IHRydWU7XG4gICAgICB0aGlzLmNhbGxiYWNrLmNhbGwodGhpcy5fdGFyZ2V0LCBpbmZvKTtcbiAgICB9XG4gICAgcmV0dXJuIGRpZEZsdXNoO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7IUFycmF5PEVsZW1lbnR8Tm9kZT58IU5vZGVMaXN0PE5vZGU+fSBub2RlTGlzdCBOb2RlcyB0aGF0IGNvdWxkIGNoYW5nZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2xpc3RlblNsb3RzKG5vZGVMaXN0KSB7XG4gICAgZm9yIChsZXQgaT0wOyBpIDwgbm9kZUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBuID0gbm9kZUxpc3RbaV07XG4gICAgICBpZiAoaXNTbG90KG4pKSB7XG4gICAgICAgIG4uYWRkRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHRoaXMuX2JvdW5kU2NoZWR1bGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyFBcnJheTxFbGVtZW50fE5vZGU+fCFOb2RlTGlzdDxOb2RlPn0gbm9kZUxpc3QgTm9kZXMgdGhhdCBjb3VsZCBjaGFuZ2VcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF91bmxpc3RlblNsb3RzKG5vZGVMaXN0KSB7XG4gICAgZm9yIChsZXQgaT0wOyBpIDwgbm9kZUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBuID0gbm9kZUxpc3RbaV07XG4gICAgICBpZiAoaXNTbG90KG4pKSB7XG4gICAgICAgIG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHRoaXMuX2JvdW5kU2NoZWR1bGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG59XG4iLCIvKipcbkBsaWNlbnNlXG5Db3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHRcblRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dFxuQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc29cbnN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4qL1xuaW1wb3J0ICcuL2Jvb3QuanMnO1xuXG4vLyB1bmlxdWUgZ2xvYmFsIGlkIGZvciBkZWR1cGluZyBtaXhpbnMuXG5sZXQgZGVkdXBlSWQgPSAwO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMge0Z1bmN0aW9ufVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gTWl4aW5GdW5jdGlvbigpe31cbi8qKiBAdHlwZSB7KFdlYWtNYXAgfCB1bmRlZmluZWQpfSAqL1xuTWl4aW5GdW5jdGlvbi5wcm90b3R5cGUuX19taXhpbkFwcGxpY2F0aW9ucztcbi8qKiBAdHlwZSB7KE9iamVjdCB8IHVuZGVmaW5lZCl9ICovXG5NaXhpbkZ1bmN0aW9uLnByb3RvdHlwZS5fX21peGluU2V0O1xuXG4vKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqL1xuLyoqXG4gKiBXcmFwcyBhbiBFUzYgY2xhc3MgZXhwcmVzc2lvbiBtaXhpbiBzdWNoIHRoYXQgdGhlIG1peGluIGlzIG9ubHkgYXBwbGllZFxuICogaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYXBwbGllZCBpdHMgYmFzZSBhcmd1bWVudC4gQWxzbyBtZW1vaXplcyBtaXhpblxuICogYXBwbGljYXRpb25zLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IG1peGluIEVTNiBjbGFzcyBleHByZXNzaW9uIG1peGluIHRvIHdyYXBcbiAqIEByZXR1cm4ge1R9XG4gKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c31cbiAqL1xuZXhwb3J0IGNvbnN0IGRlZHVwaW5nTWl4aW4gPSBmdW5jdGlvbihtaXhpbikge1xuICBsZXQgbWl4aW5BcHBsaWNhdGlvbnMgPSAvKiogQHR5cGUgeyFNaXhpbkZ1bmN0aW9ufSAqLyhtaXhpbikuX19taXhpbkFwcGxpY2F0aW9ucztcbiAgaWYgKCFtaXhpbkFwcGxpY2F0aW9ucykge1xuICAgIG1peGluQXBwbGljYXRpb25zID0gbmV3IFdlYWtNYXAoKTtcbiAgICAvKiogQHR5cGUgeyFNaXhpbkZ1bmN0aW9ufSAqLyhtaXhpbikuX19taXhpbkFwcGxpY2F0aW9ucyA9IG1peGluQXBwbGljYXRpb25zO1xuICB9XG4gIC8vIG1haW50YWluIGEgdW5pcXVlIGlkIGZvciBlYWNoIG1peGluXG4gIGxldCBtaXhpbkRlZHVwZUlkID0gZGVkdXBlSWQrKztcbiAgZnVuY3Rpb24gZGVkdXBpbmdNaXhpbihiYXNlKSB7XG4gICAgbGV0IGJhc2VTZXQgPSAvKiogQHR5cGUgeyFNaXhpbkZ1bmN0aW9ufSAqLyhiYXNlKS5fX21peGluU2V0O1xuICAgIGlmIChiYXNlU2V0ICYmIGJhc2VTZXRbbWl4aW5EZWR1cGVJZF0pIHtcbiAgICAgIHJldHVybiBiYXNlO1xuICAgIH1cbiAgICBsZXQgbWFwID0gbWl4aW5BcHBsaWNhdGlvbnM7XG4gICAgbGV0IGV4dGVuZGVkID0gbWFwLmdldChiYXNlKTtcbiAgICBpZiAoIWV4dGVuZGVkKSB7XG4gICAgICBleHRlbmRlZCA9IC8qKiBAdHlwZSB7IUZ1bmN0aW9ufSAqLyhtaXhpbikoYmFzZSk7XG4gICAgICBtYXAuc2V0KGJhc2UsIGV4dGVuZGVkKTtcbiAgICB9XG4gICAgLy8gY29weSBpbmhlcml0ZWQgbWl4aW4gc2V0IGZyb20gdGhlIGV4dGVuZGVkIGNsYXNzLCBvciB0aGUgYmFzZSBjbGFzc1xuICAgIC8vIE5PVEU6IHdlIGF2b2lkIHVzZSBvZiBTZXQgaGVyZSBiZWNhdXNlIHNvbWUgYnJvd3NlciAoSUUxMSlcbiAgICAvLyBjYW5ub3QgZXh0ZW5kIGEgYmFzZSBTZXQgdmlhIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICBsZXQgbWl4aW5TZXQgPSBPYmplY3QuY3JlYXRlKC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKGV4dGVuZGVkKS5fX21peGluU2V0IHx8IGJhc2VTZXQgfHwgbnVsbCk7XG4gICAgbWl4aW5TZXRbbWl4aW5EZWR1cGVJZF0gPSB0cnVlO1xuICAgIC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKGV4dGVuZGVkKS5fX21peGluU2V0ID0gbWl4aW5TZXQ7XG4gICAgcmV0dXJuIGV4dGVuZGVkO1xuICB9XG5cbiAgcmV0dXJuIGRlZHVwaW5nTWl4aW47XG59O1xuLyogZXNsaW50LWVuYWJsZSB2YWxpZC1qc2RvYyAqL1xuIiwiLy8gQHRlbnNvcmZsb3cvdGZqcy1tb2RlbHMgQ29weXJpZ2h0IDIwMTggR29vZ2xlXG5pbXBvcnQqYXMgdGYgZnJvbVwiQHRlbnNvcmZsb3cvdGZqc1wiO2ltcG9ydHtUZW5zb3IsdXRpbCxzY2FsYXIsY2FzdCxmcm9tUGl4ZWxzLHRpZHksVGVuc29yQnVmZmVyLGNvbmNhdCx0ZW5zb3IyZH1mcm9tXCJAdGVuc29yZmxvdy90ZmpzXCI7dmFyIE1BTklGRVNUX0ZJTEU9XCJtYW5pZmVzdC5qc29uXCIsQ2hlY2twb2ludExvYWRlcj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dGhpcy51cmxQYXRoPWUsXCIvXCIhPT10aGlzLnVybFBhdGguY2hhckF0KHRoaXMudXJsUGF0aC5sZW5ndGgtMSkmJih0aGlzLnVybFBhdGgrPVwiL1wiKX1yZXR1cm4gZS5wcm90b3R5cGUubG9hZE1hbmlmZXN0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24odCxyKXt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7bi5vcGVuKFwiR0VUXCIsZS51cmxQYXRoK01BTklGRVNUX0ZJTEUpLG4ub25sb2FkPWZ1bmN0aW9uKCl7ZS5jaGVja3BvaW50TWFuaWZlc3Q9SlNPTi5wYXJzZShuLnJlc3BvbnNlVGV4dCksdCgpfSxuLm9uZXJyb3I9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKE1BTklGRVNUX0ZJTEUrXCIgbm90IGZvdW5kIGF0IFwiK2UudXJsUGF0aCtcIi4gXCIrdCl9LG4uc2VuZCgpfSl9LGUucHJvdG90eXBlLmdldENoZWNrcG9pbnRNYW5pZmVzdD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIG51bGw9PXRoaXMuY2hlY2twb2ludE1hbmlmZXN0P25ldyBQcm9taXNlKGZ1bmN0aW9uKHQscil7ZS5sb2FkTWFuaWZlc3QoKS50aGVuKGZ1bmN0aW9uKCl7dChlLmNoZWNrcG9pbnRNYW5pZmVzdCl9KX0pOm5ldyBQcm9taXNlKGZ1bmN0aW9uKHQscil7dChlLmNoZWNrcG9pbnRNYW5pZmVzdCl9KX0sZS5wcm90b3R5cGUuZ2V0QWxsVmFyaWFibGVzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gbnVsbCE9dGhpcy52YXJpYWJsZXM/bmV3IFByb21pc2UoZnVuY3Rpb24odCxyKXt0KGUudmFyaWFibGVzKX0pOm5ldyBQcm9taXNlKGZ1bmN0aW9uKHQscil7ZS5nZXRDaGVja3BvaW50TWFuaWZlc3QoKS50aGVuKGZ1bmN0aW9uKHIpe2Zvcih2YXIgbj1PYmplY3Qua2V5cyhlLmNoZWNrcG9pbnRNYW5pZmVzdCksbz1bXSxpPTA7aTxuLmxlbmd0aDtpKyspby5wdXNoKGUuZ2V0VmFyaWFibGUobltpXSkpO1Byb21pc2UuYWxsKG8pLnRoZW4oZnVuY3Rpb24ocil7ZS52YXJpYWJsZXM9e307Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspZS52YXJpYWJsZXNbbltvXV09cltvXTt0KGUudmFyaWFibGVzKX0pfSl9KX0sZS5wcm90b3R5cGUuZ2V0VmFyaWFibGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZighKGUgaW4gdGhpcy5jaGVja3BvaW50TWFuaWZlc3QpKXRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBsb2FkIG5vbi1leGlzdGFudCB2YXJpYWJsZSBcIitlKTt2YXIgcj1mdW5jdGlvbihyLG4pe3ZhciBvPW5ldyBYTUxIdHRwUmVxdWVzdDtvLnJlc3BvbnNlVHlwZT1cImFycmF5YnVmZmVyXCI7dmFyIGk9dC5jaGVja3BvaW50TWFuaWZlc3RbZV0uZmlsZW5hbWU7by5vcGVuKFwiR0VUXCIsdC51cmxQYXRoK2kpLG8ub25sb2FkPWZ1bmN0aW9uKCl7aWYoNDA0PT09by5zdGF0dXMpdGhyb3cgbmV3IEVycm9yKFwiTm90IGZvdW5kIHZhcmlhYmxlIFwiK2UpO3ZhciBuPW5ldyBGbG9hdDMyQXJyYXkoby5yZXNwb25zZSksaT1UZW5zb3IubWFrZSh0LmNoZWNrcG9pbnRNYW5pZmVzdFtlXS5zaGFwZSx7dmFsdWVzOm59KTtyKGkpfSxvLm9uZXJyb3I9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZldGNoIHZhcmlhYmxlIFwiK2UrXCI6IFwiK3QpfSxvLnNlbmQoKX07cmV0dXJuIG51bGw9PXRoaXMuY2hlY2twb2ludE1hbmlmZXN0P25ldyBQcm9taXNlKGZ1bmN0aW9uKGUsbil7dC5sb2FkTWFuaWZlc3QoKS50aGVuKGZ1bmN0aW9uKCl7bmV3IFByb21pc2UocikudGhlbihlKX0pfSk6bmV3IFByb21pc2Uocil9LGV9KCksbW9iaWxlTmV0MTAwQXJjaGl0ZWN0dXJlPVtbXCJjb252MmRcIiwyXSxbXCJzZXBhcmFibGVDb252XCIsMV0sW1wic2VwYXJhYmxlQ29udlwiLDJdLFtcInNlcGFyYWJsZUNvbnZcIiwxXSxbXCJzZXBhcmFibGVDb252XCIsMl0sW1wic2VwYXJhYmxlQ29udlwiLDFdLFtcInNlcGFyYWJsZUNvbnZcIiwyXSxbXCJzZXBhcmFibGVDb252XCIsMV0sW1wic2VwYXJhYmxlQ29udlwiLDFdLFtcInNlcGFyYWJsZUNvbnZcIiwxXSxbXCJzZXBhcmFibGVDb252XCIsMV0sW1wic2VwYXJhYmxlQ29udlwiLDFdLFtcInNlcGFyYWJsZUNvbnZcIiwyXSxbXCJzZXBhcmFibGVDb252XCIsMV1dLG1vYmlsZU5ldDc1QXJjaGl0ZWN0dXJlPVtbXCJjb252MmRcIiwyXSxbXCJzZXBhcmFibGVDb252XCIsMV0sW1wic2VwYXJhYmxlQ29udlwiLDJdLFtcInNlcGFyYWJsZUNvbnZcIiwxXSxbXCJzZXBhcmFibGVDb252XCIsMl0sW1wic2VwYXJhYmxlQ29udlwiLDFdLFtcInNlcGFyYWJsZUNvbnZcIiwyXSxbXCJzZXBhcmFibGVDb252XCIsMV0sW1wic2VwYXJhYmxlQ29udlwiLDFdLFtcInNlcGFyYWJsZUNvbnZcIiwxXSxbXCJzZXBhcmFibGVDb252XCIsMV0sW1wic2VwYXJhYmxlQ29udlwiLDFdLFtcInNlcGFyYWJsZUNvbnZcIiwxXSxbXCJzZXBhcmFibGVDb252XCIsMV1dLG1vYmlsZU5ldDUwQXJjaGl0ZWN0dXJlPVtbXCJjb252MmRcIiwyXSxbXCJzZXBhcmFibGVDb252XCIsMV0sW1wic2VwYXJhYmxlQ29udlwiLDJdLFtcInNlcGFyYWJsZUNvbnZcIiwxXSxbXCJzZXBhcmFibGVDb252XCIsMl0sW1wic2VwYXJhYmxlQ29udlwiLDFdLFtcInNlcGFyYWJsZUNvbnZcIiwyXSxbXCJzZXBhcmFibGVDb252XCIsMV0sW1wic2VwYXJhYmxlQ29udlwiLDFdLFtcInNlcGFyYWJsZUNvbnZcIiwxXSxbXCJzZXBhcmFibGVDb252XCIsMV0sW1wic2VwYXJhYmxlQ29udlwiLDFdLFtcInNlcGFyYWJsZUNvbnZcIiwxXSxbXCJzZXBhcmFibGVDb252XCIsMV1dLFZBTElEX09VVFBVVF9TVFJJREVTPVs4LDE2LDMyXTtmdW5jdGlvbiBhc3NlcnRWYWxpZE91dHB1dFN0cmlkZShlKXt1dGlsLmFzc2VydChcIm51bWJlclwiPT10eXBlb2YgZSxcIm91dHB1dFN0cmlkZSBpcyBub3QgYSBudW1iZXJcIiksdXRpbC5hc3NlcnQoVkFMSURfT1VUUFVUX1NUUklERVMuaW5kZXhPZihlKT49MCxcIm91dHB1dFN0cmlkZSBvZiBcIitlK1wiIGlzIGludmFsaWQuIEl0IG11c3QgYmUgZWl0aGVyIDgsIDE2LCBvciAzMlwiKX1mdW5jdGlvbiBhc3NlcnRWYWxpZFNjYWxlRmFjdG9yKGUpe3V0aWwuYXNzZXJ0KFwibnVtYmVyXCI9PXR5cGVvZiBlLFwiaW1hZ2VTY2FsZUZhY3RvciBpcyBub3QgYSBudW1iZXJcIiksdXRpbC5hc3NlcnQoZT49LjImJmU8PTEsXCJpbWFnZVNjYWxlRmFjdG9yIG11c3QgYmUgYmV0d2VlbiAwLjIgYW5kIDEuMFwiKX12YXIgbW9iaWxlTmV0QXJjaGl0ZWN0dXJlcz17MTAwOm1vYmlsZU5ldDEwMEFyY2hpdGVjdHVyZSw3NTptb2JpbGVOZXQ3NUFyY2hpdGVjdHVyZSw1MDptb2JpbGVOZXQ1MEFyY2hpdGVjdHVyZX07ZnVuY3Rpb24gdG9PdXRwdXRTdHJpZGVkTGF5ZXJzKGUsdCl7dmFyIHI9MSxuPTE7cmV0dXJuIGUubWFwKGZ1bmN0aW9uKGUsbyl7dmFyIGksYSxzPWVbMF0sdT1lWzFdO3JldHVybiByPT09dD8oaT0xLGE9bixuKj11KTooaT11LGE9MSxyKj11KSx7YmxvY2tJZDpvLGNvbnZUeXBlOnMsc3RyaWRlOmkscmF0ZTphLG91dHB1dFN0cmlkZTpyfX0pfXZhciBNb2JpbGVOZXQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7dGhpcy5QUkVQUk9DRVNTX0RJVklTT1I9c2NhbGFyKDEyNy41KSx0aGlzLk9ORT1zY2FsYXIoMSksdGhpcy52YXJpYWJsZXM9ZSx0aGlzLmNvbnZvbHV0aW9uRGVmaW5pdGlvbnM9dH1yZXR1cm4gZS5wcm90b3R5cGUucHJlZGljdD1mdW5jdGlvbihlLHQpe3ZhciByPXRoaXMsbj1jYXN0KGUsXCJmbG9hdDMyXCIpLmRpdih0aGlzLlBSRVBST0NFU1NfRElWSVNPUikuc3ViKHRoaXMuT05FKTtyZXR1cm4gdG9PdXRwdXRTdHJpZGVkTGF5ZXJzKHRoaXMuY29udm9sdXRpb25EZWZpbml0aW9ucyx0KS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXt2YXIgbj10LmJsb2NrSWQsbz10LnN0cmlkZSxpPXQuY29udlR5cGUsYT10LnJhdGU7aWYoXCJjb252MmRcIj09PWkpcmV0dXJuIHIuY29udihlLG8sbik7aWYoXCJzZXBhcmFibGVDb252XCI9PT1pKXJldHVybiByLnNlcGFyYWJsZUNvbnYoZSxvLG4sYSk7dGhyb3cgRXJyb3IoXCJVbmtub3duIGNvbnYgdHlwZSBvZiBcIitpKX0sbil9LGUucHJvdG90eXBlLmNvbnZUb091dHB1dD1mdW5jdGlvbihlLHQpe3JldHVybiBlLmNvbnYyZCh0aGlzLndlaWdodHModCksMSxcInNhbWVcIikuYWRkKHRoaXMuYmlhc2VzKHQpKX0sZS5wcm90b3R5cGUuY29udj1mdW5jdGlvbihlLHQscil7cmV0dXJuIGUuY29udjJkKHRoaXMud2VpZ2h0cyhcIkNvbnYyZF9cIitTdHJpbmcocikpLHQsXCJzYW1lXCIpLmFkZCh0aGlzLmJpYXNlcyhcIkNvbnYyZF9cIitTdHJpbmcocikpKS5jbGlwQnlWYWx1ZSgwLDYpfSxlLnByb3RvdHlwZS5zZXBhcmFibGVDb252PWZ1bmN0aW9uKGUsdCxyLG4pe3ZvaWQgMD09PW4mJihuPTEpO3ZhciBvPVwiQ29udjJkX1wiK1N0cmluZyhyKStcIl9kZXB0aHdpc2VcIixpPVwiQ29udjJkX1wiK1N0cmluZyhyKStcIl9wb2ludHdpc2VcIjtyZXR1cm4gZS5kZXB0aHdpc2VDb252MkQodGhpcy5kZXB0aHdpc2VXZWlnaHRzKG8pLHQsXCJzYW1lXCIsXCJOSFdDXCIsbikuYWRkKHRoaXMuYmlhc2VzKG8pKS5jbGlwQnlWYWx1ZSgwLDYpLmNvbnYyZCh0aGlzLndlaWdodHMoaSksWzEsMV0sXCJzYW1lXCIpLmFkZCh0aGlzLmJpYXNlcyhpKSkuY2xpcEJ5VmFsdWUoMCw2KX0sZS5wcm90b3R5cGUud2VpZ2h0cz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy52YXJpYWJsZXNbXCJNb2JpbGVuZXRWMS9cIitlK1wiL3dlaWdodHNcIl19LGUucHJvdG90eXBlLmJpYXNlcz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy52YXJpYWJsZXNbXCJNb2JpbGVuZXRWMS9cIitlK1wiL2JpYXNlc1wiXX0sZS5wcm90b3R5cGUuZGVwdGh3aXNlV2VpZ2h0cz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy52YXJpYWJsZXNbXCJNb2JpbGVuZXRWMS9cIitlK1wiL2RlcHRod2lzZV93ZWlnaHRzXCJdfSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHRoaXMudmFyaWFibGVzKXRoaXMudmFyaWFibGVzW2VdLmRpc3Bvc2UoKX0sZX0oKTtmdW5jdGlvbiBfX2F3YWl0ZXIoZSx0LHIsbil7cmV0dXJuIG5ldyhyfHwocj1Qcm9taXNlKSkoZnVuY3Rpb24obyxpKXtmdW5jdGlvbiBhKGUpe3RyeXt1KG4ubmV4dChlKSl9Y2F0Y2goZSl7aShlKX19ZnVuY3Rpb24gcyhlKXt0cnl7dShuLnRocm93KGUpKX1jYXRjaChlKXtpKGUpfX1mdW5jdGlvbiB1KGUpe2UuZG9uZT9vKGUudmFsdWUpOm5ldyByKGZ1bmN0aW9uKHQpe3QoZS52YWx1ZSl9KS50aGVuKGEscyl9dSgobj1uLmFwcGx5KGUsdHx8W10pKS5uZXh0KCkpfSl9ZnVuY3Rpb24gX19nZW5lcmF0b3IoZSx0KXt2YXIgcixuLG8saSxhPXtsYWJlbDowLHNlbnQ6ZnVuY3Rpb24oKXtpZigxJm9bMF0pdGhyb3cgb1sxXTtyZXR1cm4gb1sxXX0sdHJ5czpbXSxvcHM6W119O3JldHVybiBpPXtuZXh0OnMoMCksdGhyb3c6cygxKSxyZXR1cm46cygyKX0sXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiYoaVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxpO2Z1bmN0aW9uIHMoaSl7cmV0dXJuIGZ1bmN0aW9uKHMpe3JldHVybiBmdW5jdGlvbihpKXtpZihyKXRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO2Zvcig7YTspdHJ5e2lmKHI9MSxuJiYobz0yJmlbMF0/bi5yZXR1cm46aVswXT9uLnRocm93fHwoKG89bi5yZXR1cm4pJiZvLmNhbGwobiksMCk6bi5uZXh0KSYmIShvPW8uY2FsbChuLGlbMV0pKS5kb25lKXJldHVybiBvO3N3aXRjaChuPTAsbyYmKGk9WzImaVswXSxvLnZhbHVlXSksaVswXSl7Y2FzZSAwOmNhc2UgMTpvPWk7YnJlYWs7Y2FzZSA0OnJldHVybiBhLmxhYmVsKysse3ZhbHVlOmlbMV0sZG9uZTohMX07Y2FzZSA1OmEubGFiZWwrKyxuPWlbMV0saT1bMF07Y29udGludWU7Y2FzZSA3Omk9YS5vcHMucG9wKCksYS50cnlzLnBvcCgpO2NvbnRpbnVlO2RlZmF1bHQ6aWYoIShvPShvPWEudHJ5cykubGVuZ3RoPjAmJm9bby5sZW5ndGgtMV0pJiYoNj09PWlbMF18fDI9PT1pWzBdKSl7YT0wO2NvbnRpbnVlfWlmKDM9PT1pWzBdJiYoIW98fGlbMV0+b1swXSYmaVsxXTxvWzNdKSl7YS5sYWJlbD1pWzFdO2JyZWFrfWlmKDY9PT1pWzBdJiZhLmxhYmVsPG9bMV0pe2EubGFiZWw9b1sxXSxvPWk7YnJlYWt9aWYobyYmYS5sYWJlbDxvWzJdKXthLmxhYmVsPW9bMl0sYS5vcHMucHVzaChpKTticmVha31vWzJdJiZhLm9wcy5wb3AoKSxhLnRyeXMucG9wKCk7Y29udGludWV9aT10LmNhbGwoZSxhKX1jYXRjaChlKXtpPVs2LGVdLG49MH1maW5hbGx5e3I9bz0wfWlmKDUmaVswXSl0aHJvdyBpWzFdO3JldHVybnt2YWx1ZTppWzBdP2lbMV06dm9pZCAwLGRvbmU6ITB9fShbaSxzXSl9fX12YXIgcGFydE5hbWVzPVtcIm5vc2VcIixcImxlZnRFeWVcIixcInJpZ2h0RXllXCIsXCJsZWZ0RWFyXCIsXCJyaWdodEVhclwiLFwibGVmdFNob3VsZGVyXCIsXCJyaWdodFNob3VsZGVyXCIsXCJsZWZ0RWxib3dcIixcInJpZ2h0RWxib3dcIixcImxlZnRXcmlzdFwiLFwicmlnaHRXcmlzdFwiLFwibGVmdEhpcFwiLFwicmlnaHRIaXBcIixcImxlZnRLbmVlXCIsXCJyaWdodEtuZWVcIixcImxlZnRBbmtsZVwiLFwicmlnaHRBbmtsZVwiXSxOVU1fS0VZUE9JTlRTPXBhcnROYW1lcy5sZW5ndGgscGFydElkcz1wYXJ0TmFtZXMucmVkdWNlKGZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZVt0XT1yLGV9LHt9KSxjb25uZWN0ZWRQYXJ0TmFtZXM9W1tcImxlZnRIaXBcIixcImxlZnRTaG91bGRlclwiXSxbXCJsZWZ0RWxib3dcIixcImxlZnRTaG91bGRlclwiXSxbXCJsZWZ0RWxib3dcIixcImxlZnRXcmlzdFwiXSxbXCJsZWZ0SGlwXCIsXCJsZWZ0S25lZVwiXSxbXCJsZWZ0S25lZVwiLFwibGVmdEFua2xlXCJdLFtcInJpZ2h0SGlwXCIsXCJyaWdodFNob3VsZGVyXCJdLFtcInJpZ2h0RWxib3dcIixcInJpZ2h0U2hvdWxkZXJcIl0sW1wicmlnaHRFbGJvd1wiLFwicmlnaHRXcmlzdFwiXSxbXCJyaWdodEhpcFwiLFwicmlnaHRLbmVlXCJdLFtcInJpZ2h0S25lZVwiLFwicmlnaHRBbmtsZVwiXSxbXCJsZWZ0U2hvdWxkZXJcIixcInJpZ2h0U2hvdWxkZXJcIl0sW1wibGVmdEhpcFwiLFwicmlnaHRIaXBcIl1dLHBvc2VDaGFpbj1bW1wibm9zZVwiLFwibGVmdEV5ZVwiXSxbXCJsZWZ0RXllXCIsXCJsZWZ0RWFyXCJdLFtcIm5vc2VcIixcInJpZ2h0RXllXCJdLFtcInJpZ2h0RXllXCIsXCJyaWdodEVhclwiXSxbXCJub3NlXCIsXCJsZWZ0U2hvdWxkZXJcIl0sW1wibGVmdFNob3VsZGVyXCIsXCJsZWZ0RWxib3dcIl0sW1wibGVmdEVsYm93XCIsXCJsZWZ0V3Jpc3RcIl0sW1wibGVmdFNob3VsZGVyXCIsXCJsZWZ0SGlwXCJdLFtcImxlZnRIaXBcIixcImxlZnRLbmVlXCJdLFtcImxlZnRLbmVlXCIsXCJsZWZ0QW5rbGVcIl0sW1wibm9zZVwiLFwicmlnaHRTaG91bGRlclwiXSxbXCJyaWdodFNob3VsZGVyXCIsXCJyaWdodEVsYm93XCJdLFtcInJpZ2h0RWxib3dcIixcInJpZ2h0V3Jpc3RcIl0sW1wicmlnaHRTaG91bGRlclwiLFwicmlnaHRIaXBcIl0sW1wicmlnaHRIaXBcIixcInJpZ2h0S25lZVwiXSxbXCJyaWdodEtuZWVcIixcInJpZ2h0QW5rbGVcIl1dLGNvbm5lY3RlZFBhcnRJbmRpY2VzPWNvbm5lY3RlZFBhcnROYW1lcy5tYXAoZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXSxyPWVbMV07cmV0dXJuW3BhcnRJZHNbdF0scGFydElkc1tyXV19KTtmdW5jdGlvbiBlaXRoZXJQb2ludERvZXNudE1lZXRDb25maWRlbmNlKGUsdCxyKXtyZXR1cm4gZTxyfHx0PHJ9ZnVuY3Rpb24gZ2V0QWRqYWNlbnRLZXlQb2ludHMoZSx0KXtyZXR1cm4gY29ubmVjdGVkUGFydEluZGljZXMucmVkdWNlKGZ1bmN0aW9uKHIsbil7dmFyIG89blswXSxpPW5bMV07cmV0dXJuIGVpdGhlclBvaW50RG9lc250TWVldENvbmZpZGVuY2UoZVtvXS5zY29yZSxlW2ldLnNjb3JlLHQpP3I6KHIucHVzaChbZVtvXSxlW2ldXSkscil9LFtdKX12YXIgTkVHQVRJVkVfSU5GSU5JVFk9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLFBPU0lUSVZFX0lORklOSVRZPU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtmdW5jdGlvbiBnZXRCb3VuZGluZ0JveChlKXtyZXR1cm4gZS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXt2YXIgcj1lLm1heFgsbj1lLm1heFksbz1lLm1pblgsaT1lLm1pblksYT10LnBvc2l0aW9uLHM9YS54LHU9YS55O3JldHVybnttYXhYOk1hdGgubWF4KHIscyksbWF4WTpNYXRoLm1heChuLHUpLG1pblg6TWF0aC5taW4obyxzKSxtaW5ZOk1hdGgubWluKGksdSl9fSx7bWF4WDpORUdBVElWRV9JTkZJTklUWSxtYXhZOk5FR0FUSVZFX0lORklOSVRZLG1pblg6UE9TSVRJVkVfSU5GSU5JVFksbWluWTpQT1NJVElWRV9JTkZJTklUWX0pfWZ1bmN0aW9uIGdldEJvdW5kaW5nQm94UG9pbnRzKGUpe3ZhciB0PWdldEJvdW5kaW5nQm94KGUpLHI9dC5taW5YLG49dC5taW5ZLG89dC5tYXhYLGk9dC5tYXhZO3JldHVyblt7eDpyLHk6bn0se3g6byx5Om59LHt4Om8seTppfSx7eDpyLHk6aX1dfWZ1bmN0aW9uIHRvVGVuc29yQnVmZmVyKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PVwiZmxvYXQzMlwiKSxfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIHI7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24obil7c3dpdGNoKG4ubGFiZWwpe2Nhc2UgMDpyZXR1cm5bNCxlLmRhdGEoKV07Y2FzZSAxOnJldHVybiByPW4uc2VudCgpLFsyLG5ldyBUZW5zb3JCdWZmZXIoZS5zaGFwZSx0LHIpXX19KX0pfWZ1bmN0aW9uIHRvVGVuc29yQnVmZmVyczNEKGUpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24odCl7cmV0dXJuWzIsUHJvbWlzZS5hbGwoZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHRvVGVuc29yQnVmZmVyKGUsXCJmbG9hdDMyXCIpfSkpXX0pfSl9ZnVuY3Rpb24gc2NhbGVQb3NlKGUsdCxyKXtyZXR1cm57c2NvcmU6ZS5zY29yZSxrZXlwb2ludHM6ZS5rZXlwb2ludHMubWFwKGZ1bmN0aW9uKGUpe3ZhciBuPWUuc2NvcmUsbz1lLnBhcnQsaT1lLnBvc2l0aW9uO3JldHVybntzY29yZTpuLHBhcnQ6byxwb3NpdGlvbjp7eDppLngqdCx5OmkueSpyfX19KX19ZnVuY3Rpb24gc2NhbGVQb3NlcyhlLHQscil7cmV0dXJuIDE9PT1yJiYxPT09dD9lOmUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBzY2FsZVBvc2UoZSxyLHQpfSl9ZnVuY3Rpb24gZ2V0VmFsaWRSZXNvbHV0aW9uKGUsdCxyKXt2YXIgbj10KmUtMTtyZXR1cm4gbi1uJXIrMX1mdW5jdGlvbiBoYWxmKGUpe3JldHVybiBNYXRoLmZsb29yKGUvMil9dmFyIE1heEhlYXA9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7dGhpcy5wcmlvcml0eVF1ZXVlPW5ldyBBcnJheShlKSx0aGlzLm51bWJlck9mRWxlbWVudHM9LTEsdGhpcy5nZXRFbGVtZW50VmFsdWU9dH1yZXR1cm4gZS5wcm90b3R5cGUuZW5xdWV1ZT1mdW5jdGlvbihlKXt0aGlzLnByaW9yaXR5UXVldWVbKyt0aGlzLm51bWJlck9mRWxlbWVudHNdPWUsdGhpcy5zd2ltKHRoaXMubnVtYmVyT2ZFbGVtZW50cyl9LGUucHJvdG90eXBlLmRlcXVldWU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByaW9yaXR5UXVldWVbMF07cmV0dXJuIHRoaXMuZXhjaGFuZ2UoMCx0aGlzLm51bWJlck9mRWxlbWVudHMtLSksdGhpcy5zaW5rKDApLHRoaXMucHJpb3JpdHlRdWV1ZVt0aGlzLm51bWJlck9mRWxlbWVudHMrMV09bnVsbCxlfSxlLnByb3RvdHlwZS5lbXB0eT1mdW5jdGlvbigpe3JldHVybi0xPT09dGhpcy5udW1iZXJPZkVsZW1lbnRzfSxlLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubnVtYmVyT2ZFbGVtZW50cysxfSxlLnByb3RvdHlwZS5hbGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmlvcml0eVF1ZXVlLnNsaWNlKDAsdGhpcy5udW1iZXJPZkVsZW1lbnRzKzEpfSxlLnByb3RvdHlwZS5tYXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmlvcml0eVF1ZXVlWzBdfSxlLnByb3RvdHlwZS5zd2ltPWZ1bmN0aW9uKGUpe2Zvcig7ZT4wJiZ0aGlzLmxlc3MoaGFsZihlKSxlKTspdGhpcy5leGNoYW5nZShlLGhhbGYoZSkpLGU9aGFsZihlKX0sZS5wcm90b3R5cGUuc2luaz1mdW5jdGlvbihlKXtmb3IoOzIqZTw9dGhpcy5udW1iZXJPZkVsZW1lbnRzOyl7dmFyIHQ9MiplO2lmKHQ8dGhpcy5udW1iZXJPZkVsZW1lbnRzJiZ0aGlzLmxlc3ModCx0KzEpJiZ0KyssIXRoaXMubGVzcyhlLHQpKWJyZWFrO3RoaXMuZXhjaGFuZ2UoZSx0KSxlPXR9fSxlLnByb3RvdHlwZS5nZXRWYWx1ZUF0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdldEVsZW1lbnRWYWx1ZSh0aGlzLnByaW9yaXR5UXVldWVbZV0pfSxlLnByb3RvdHlwZS5sZXNzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZ2V0VmFsdWVBdChlKTx0aGlzLmdldFZhbHVlQXQodCl9LGUucHJvdG90eXBlLmV4Y2hhbmdlPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcy5wcmlvcml0eVF1ZXVlW2VdO3RoaXMucHJpb3JpdHlRdWV1ZVtlXT10aGlzLnByaW9yaXR5UXVldWVbdF0sdGhpcy5wcmlvcml0eVF1ZXVlW3RdPXJ9LGV9KCk7ZnVuY3Rpb24gc2NvcmVJc01heGltdW1JbkxvY2FsV2luZG93KGUsdCxyLG4sbyxpKXtmb3IodmFyIGE9aS5zaGFwZSxzPWFbMF0sdT1hWzFdLGw9ITAsYz1NYXRoLm1heChyLW8sMCkscD1NYXRoLm1pbihyK28rMSxzKSxmPWM7ZjxwOysrZil7Zm9yKHZhciBoPU1hdGgubWF4KG4tbywwKSxkPU1hdGgubWluKG4rbysxLHUpLHY9aDt2PGQ7Kyt2KWlmKGkuZ2V0KGYsdixlKT50KXtsPSExO2JyZWFrfWlmKCFsKWJyZWFrfXJldHVybiBsfWZ1bmN0aW9uIGJ1aWxkUGFydFdpdGhTY29yZVF1ZXVlKGUsdCxyKXtmb3IodmFyIG49ci5zaGFwZSxvPW5bMF0saT1uWzFdLGE9blsyXSxzPW5ldyBNYXhIZWFwKG8qaSphLGZ1bmN0aW9uKGUpe3JldHVybiBlLnNjb3JlfSksdT0wO3U8bzsrK3UpZm9yKHZhciBsPTA7bDxpOysrbClmb3IodmFyIGM9MDtjPGE7KytjKXt2YXIgcD1yLmdldCh1LGwsYyk7cDxlfHxzY29yZUlzTWF4aW11bUluTG9jYWxXaW5kb3coYyxwLHUsbCx0LHIpJiZzLmVucXVldWUoe3Njb3JlOnAscGFydDp7aGVhdG1hcFk6dSxoZWF0bWFwWDpsLGlkOmN9fSl9cmV0dXJuIHN9ZnVuY3Rpb24gZ2V0T2Zmc2V0UG9pbnQoZSx0LHIsbil7cmV0dXJue3k6bi5nZXQoZSx0LHIpLHg6bi5nZXQoZSx0LHIrTlVNX0tFWVBPSU5UUyl9fWZ1bmN0aW9uIGdldEltYWdlQ29vcmRzKGUsdCxyKXt2YXIgbj1nZXRPZmZzZXRQb2ludChlLmhlYXRtYXBZLGUuaGVhdG1hcFgsZS5pZCxyKSxvPW4ueSxpPW4ueDtyZXR1cm57eDplLmhlYXRtYXBYKnQraSx5OmUuaGVhdG1hcFkqdCtvfX1mdW5jdGlvbiBjbGFtcChlLHQscil7cmV0dXJuIGU8dD90OmU+cj9yOmV9ZnVuY3Rpb24gc3F1YXJlZERpc3RhbmNlKGUsdCxyLG4pe3ZhciBvPXItZSxpPW4tdDtyZXR1cm4gbypvK2kqaX1mdW5jdGlvbiBhZGRWZWN0b3JzKGUsdCl7cmV0dXJue3g6ZS54K3QueCx5OmUueSt0Lnl9fXZhciBwYXJlbnRDaGlsZHJlblR1cGxlcz1wb3NlQ2hhaW4ubWFwKGZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0scj1lWzFdO3JldHVybltwYXJ0SWRzW3RdLHBhcnRJZHNbcl1dfSkscGFyZW50VG9DaGlsZEVkZ2VzPXBhcmVudENoaWxkcmVuVHVwbGVzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZVsxXX0pLGNoaWxkVG9QYXJlbnRFZGdlcz1wYXJlbnRDaGlsZHJlblR1cGxlcy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF19KTtmdW5jdGlvbiBnZXREaXNwbGFjZW1lbnQoZSx0LHIpe3ZhciBuPXIuc2hhcGVbMl0vMjtyZXR1cm57eTpyLmdldCh0LnksdC54LGUpLHg6ci5nZXQodC55LHQueCxuK2UpfX1mdW5jdGlvbiBnZXRTdHJpZGVkSW5kZXhOZWFyUG9pbnQoZSx0LHIsbil7cmV0dXJue3k6Y2xhbXAoTWF0aC5yb3VuZChlLnkvdCksMCxyLTEpLHg6Y2xhbXAoTWF0aC5yb3VuZChlLngvdCksMCxuLTEpfX1mdW5jdGlvbiB0cmF2ZXJzZVRvVGFyZ2V0S2V5cG9pbnQoZSx0LHIsbixvLGksYSl7dmFyIHM9bi5zaGFwZSx1PXNbMF0sbD1zWzFdLGM9Z2V0RGlzcGxhY2VtZW50KGUsZ2V0U3RyaWRlZEluZGV4TmVhclBvaW50KHQucG9zaXRpb24saSx1LGwpLGEpLHA9Z2V0U3RyaWRlZEluZGV4TmVhclBvaW50KGFkZFZlY3RvcnModC5wb3NpdGlvbixjKSxpLHUsbCksZj1nZXRPZmZzZXRQb2ludChwLnkscC54LHIsbyksaD1uLmdldChwLnkscC54LHIpO3JldHVybntwb3NpdGlvbjphZGRWZWN0b3JzKHt4OnAueCppLHk6cC55Kml9LHt4OmYueCx5OmYueX0pLHBhcnQ6cGFydE5hbWVzW3JdLHNjb3JlOmh9fWZ1bmN0aW9uIGRlY29kZVBvc2UoZSx0LHIsbixvLGkpe3ZhciBhPXQuc2hhcGVbMl0scz1wYXJlbnRUb0NoaWxkRWRnZXMubGVuZ3RoLHU9bmV3IEFycmF5KGEpLGw9ZS5wYXJ0LGM9ZS5zY29yZSxwPWdldEltYWdlQ29vcmRzKGwsbixyKTt1W2wuaWRdPXtzY29yZTpjLHBhcnQ6cGFydE5hbWVzW2wuaWRdLHBvc2l0aW9uOnB9O2Zvcih2YXIgZj1zLTE7Zj49MDstLWYpe3ZhciBoPXBhcmVudFRvQ2hpbGRFZGdlc1tmXSxkPWNoaWxkVG9QYXJlbnRFZGdlc1tmXTt1W2hdJiYhdVtkXSYmKHVbZF09dHJhdmVyc2VUb1RhcmdldEtleXBvaW50KGYsdVtoXSxkLHQscixuLGkpKX1mb3IoZj0wO2Y8czsrK2Ype2g9Y2hpbGRUb1BhcmVudEVkZ2VzW2ZdLGQ9cGFyZW50VG9DaGlsZEVkZ2VzW2ZdO3VbaF0mJiF1W2RdJiYodVtkXT10cmF2ZXJzZVRvVGFyZ2V0S2V5cG9pbnQoZix1W2hdLGQsdCxyLG4sbykpfXJldHVybiB1fWZ1bmN0aW9uIHdpdGhpbk5tc1JhZGl1c09mQ29ycmVzcG9uZGluZ1BvaW50KGUsdCxyLG4pe3ZhciBvPXIueCxpPXIueTtyZXR1cm4gZS5zb21lKGZ1bmN0aW9uKGUpe3ZhciByPWUua2V5cG9pbnRzW25dLnBvc2l0aW9uO3JldHVybiBzcXVhcmVkRGlzdGFuY2UoaSxvLHIueSxyLngpPD10fSl9ZnVuY3Rpb24gZ2V0SW5zdGFuY2VTY29yZShlLHQscil7cmV0dXJuIHIucmVkdWNlKGZ1bmN0aW9uKHIsbixvKXt2YXIgaT1uLnBvc2l0aW9uLGE9bi5zY29yZTtyZXR1cm4gd2l0aGluTm1zUmFkaXVzT2ZDb3JyZXNwb25kaW5nUG9pbnQoZSx0LGksbyl8fChyKz1hKSxyfSwwKS9yLmxlbmd0aH12YXIga0xvY2FsTWF4aW11bVJhZGl1cz0xO2Z1bmN0aW9uIGRlY29kZU11bHRpcGxlUG9zZXMoZSx0LHIsbixvLGksYSxzKXtyZXR1cm4gdm9pZCAwPT09YSYmKGE9LjUpLHZvaWQgMD09PXMmJihzPTIwKSxfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIHUsbCxjLHAsZixoLGQsdixtLGcsYix5O3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKHcpe3N3aXRjaCh3LmxhYmVsKXtjYXNlIDA6cmV0dXJuIHU9W10sWzQsdG9UZW5zb3JCdWZmZXJzM0QoW2UsdCxyLG5dKV07Y2FzZSAxOmZvcihsPXcuc2VudCgpLGM9bFswXSxwPWxbMV0sZj1sWzJdLGg9bFszXSxkPWJ1aWxkUGFydFdpdGhTY29yZVF1ZXVlKGEsa0xvY2FsTWF4aW11bVJhZGl1cyxjKSx2PXMqczt1Lmxlbmd0aDxpJiYhZC5lbXB0eSgpOyltPWQuZGVxdWV1ZSgpLGc9Z2V0SW1hZ2VDb29yZHMobS5wYXJ0LG8scCksd2l0aGluTm1zUmFkaXVzT2ZDb3JyZXNwb25kaW5nUG9pbnQodSx2LGcsbS5wYXJ0LmlkKXx8KGI9ZGVjb2RlUG9zZShtLGMscCxvLGYsaCkseT1nZXRJbnN0YW5jZVNjb3JlKHUsdixiKSx1LnB1c2goe2tleXBvaW50czpiLHNjb3JlOnl9KSk7cmV0dXJuWzIsdV19fSl9KX12YXIgR09PR0xFX0NMT1VEX1NUT1JBR0VfRElSPVwiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3RmanMtbW9kZWxzL3dlaWdodHMvcG9zZW5ldC9cIixjaGVja3BvaW50cz17MS4wMTp7dXJsOkdPT0dMRV9DTE9VRF9TVE9SQUdFX0RJUitcIm1vYmlsZW5ldF92MV8xMDEvXCIsYXJjaGl0ZWN0dXJlOm1vYmlsZU5ldEFyY2hpdGVjdHVyZXNbMTAwXX0sMTp7dXJsOkdPT0dMRV9DTE9VRF9TVE9SQUdFX0RJUitcIm1vYmlsZW5ldF92MV8xMDAvXCIsYXJjaGl0ZWN0dXJlOm1vYmlsZU5ldEFyY2hpdGVjdHVyZXNbMTAwXX0sLjc1Ont1cmw6R09PR0xFX0NMT1VEX1NUT1JBR0VfRElSK1wibW9iaWxlbmV0X3YxXzA3NS9cIixhcmNoaXRlY3R1cmU6bW9iaWxlTmV0QXJjaGl0ZWN0dXJlc1s3NV19LC41Ont1cmw6R09PR0xFX0NMT1VEX1NUT1JBR0VfRElSK1wibW9iaWxlbmV0X3YxXzA1MC9cIixhcmNoaXRlY3R1cmU6bW9iaWxlTmV0QXJjaGl0ZWN0dXJlc1s1MF19fTtmdW5jdGlvbiBtb2QoZSx0KXtyZXR1cm4gdGlkeShmdW5jdGlvbigpe3ZhciByPWUuZGl2KHNjYWxhcih0LFwiaW50MzJcIikpO3JldHVybiBlLnN1YihyLm11bChzY2FsYXIodCxcImludDMyXCIpKSl9KX1mdW5jdGlvbiBhcmdtYXgyZChlKXt2YXIgdD1lLnNoYXBlLHI9dFswXSxuPXRbMV0sbz10WzJdO3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7dmFyIHQ9ZS5yZXNoYXBlKFtyKm4sb10pLmFyZ01heCgwKSxpPXQuZGl2KHNjYWxhcihuLFwiaW50MzJcIikpLmV4cGFuZERpbXMoMSksYT1tb2QodCxuKS5leHBhbmREaW1zKDEpO3JldHVybiBjb25jYXQoW2ksYV0sMSl9KX1mdW5jdGlvbiBnZXRQb2ludHNDb25maWRlbmNlKGUsdCl7Zm9yKHZhciByPXQuc2hhcGVbMF0sbj1uZXcgRmxvYXQzMkFycmF5KHIpLG89MDtvPHI7bysrKXt2YXIgaT10LmdldChvLDApLGE9dC5nZXQobywxKTtuW29dPWUuZ2V0KGksYSxvKX1yZXR1cm4gbn1mdW5jdGlvbiBnZXRPZmZzZXRQb2ludCQxKGUsdCxyLG4pe3JldHVybnt5Om4uZ2V0KGUsdCxyKSx4Om4uZ2V0KGUsdCxyK05VTV9LRVlQT0lOVFMpfX1mdW5jdGlvbiBnZXRPZmZzZXRWZWN0b3JzKGUsdCl7Zm9yKHZhciByPVtdLG49MDtuPE5VTV9LRVlQT0lOVFM7bisrKXt2YXIgbz1nZXRPZmZzZXRQb2ludCQxKGUuZ2V0KG4sMCkudmFsdWVPZigpLGUuZ2V0KG4sMSkudmFsdWVPZigpLG4sdCksaT1vLngsYT1vLnk7ci5wdXNoKGEpLHIucHVzaChpKX1yZXR1cm4gdGVuc29yMmQocixbTlVNX0tFWVBPSU5UUywyXSl9ZnVuY3Rpb24gZ2V0T2Zmc2V0UG9pbnRzKGUsdCxyKXtyZXR1cm4gdGlkeShmdW5jdGlvbigpe3ZhciBuPWdldE9mZnNldFZlY3RvcnMoZSxyKTtyZXR1cm4gZS50b1RlbnNvcigpLm11bChzY2FsYXIodCxcImludDMyXCIpKS50b0Zsb2F0KCkuYWRkKG4pfSl9ZnVuY3Rpb24gZGVjb2RlU2luZ2xlUG9zZShlLHQscil7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgbixvLGksYSxzLHUsbCxjLHAsZjtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihoKXtzd2l0Y2goaC5sYWJlbCl7Y2FzZSAwOnJldHVybiBuPTAsbz1hcmdtYXgyZChlKSxbNCxQcm9taXNlLmFsbChbdG9UZW5zb3JCdWZmZXIoZSksdG9UZW5zb3JCdWZmZXIodCksdG9UZW5zb3JCdWZmZXIobyxcImludDMyXCIpXSldO2Nhc2UgMTpyZXR1cm4gaT1oLnNlbnQoKSxhPWlbMF0scz1pWzFdLHU9aVsyXSxbNCx0b1RlbnNvckJ1ZmZlcihsPWdldE9mZnNldFBvaW50cyh1LHIscykpXTtjYXNlIDI6cmV0dXJuIGM9aC5zZW50KCkscD1BcnJheS5mcm9tKGdldFBvaW50c0NvbmZpZGVuY2UoYSx1KSksZj1wLm1hcChmdW5jdGlvbihlLHQpe3JldHVybiBuKz1lLHtwb3NpdGlvbjp7eTpjLmdldCh0LDApLHg6Yy5nZXQodCwxKX0scGFydDpwYXJ0TmFtZXNbdF0sc2NvcmU6ZX19KSxvLmRpc3Bvc2UoKSxsLmRpc3Bvc2UoKSxbMix7a2V5cG9pbnRzOmYsc2NvcmU6bi9mLmxlbmd0aH1dfX0pfSl9dmFyIF90aGlzPXZvaWQgMDtmdW5jdGlvbiB0b0lucHV0VGVuc29yKGUsdCxyLG4pe3ZhciBvPWUgaW5zdGFuY2VvZiBUZW5zb3I/ZTpmcm9tUGl4ZWxzKGUpO3JldHVybiBuP28ucmV2ZXJzZSgxKS5yZXNpemVCaWxpbmVhcihbdCxyXSk6by5yZXNpemVCaWxpbmVhcihbdCxyXSl9dmFyIFBvc2VOZXQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RoaXMubW9iaWxlTmV0PWV9cmV0dXJuIGUucHJvdG90eXBlLnByZWRpY3RGb3JTaW5nbGVQb3NlPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcztyZXR1cm4gdm9pZCAwPT09dCYmKHQ9MTYpLGFzc2VydFZhbGlkT3V0cHV0U3RyaWRlKHQpLHRpZHkoZnVuY3Rpb24oKXt2YXIgbj1yLm1vYmlsZU5ldC5wcmVkaWN0KGUsdCksbz1yLm1vYmlsZU5ldC5jb252VG9PdXRwdXQobixcImhlYXRtYXBfMlwiKSxpPXIubW9iaWxlTmV0LmNvbnZUb091dHB1dChuLFwib2Zmc2V0XzJcIik7cmV0dXJue2hlYXRtYXBTY29yZXM6by5zaWdtb2lkKCksb2Zmc2V0czppfX0pfSxlLnByb3RvdHlwZS5wcmVkaWN0Rm9yTXVsdGlQb3NlPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcztyZXR1cm4gdm9pZCAwPT09dCYmKHQ9MTYpLHRpZHkoZnVuY3Rpb24oKXt2YXIgbj1yLm1vYmlsZU5ldC5wcmVkaWN0KGUsdCksbz1yLm1vYmlsZU5ldC5jb252VG9PdXRwdXQobixcImhlYXRtYXBfMlwiKSxpPXIubW9iaWxlTmV0LmNvbnZUb091dHB1dChuLFwib2Zmc2V0XzJcIiksYT1yLm1vYmlsZU5ldC5jb252VG9PdXRwdXQobixcImRpc3BsYWNlbWVudF9md2RfMlwiKSxzPXIubW9iaWxlTmV0LmNvbnZUb091dHB1dChuLFwiZGlzcGxhY2VtZW50X2J3ZF8yXCIpO3JldHVybntoZWF0bWFwU2NvcmVzOm8uc2lnbW9pZCgpLG9mZnNldHM6aSxkaXNwbGFjZW1lbnRGd2Q6YSxkaXNwbGFjZW1lbnRCd2Q6c319KX0sZS5wcm90b3R5cGUuZXN0aW1hdGVTaW5nbGVQb3NlPWZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiB2b2lkIDA9PT10JiYodD0uNSksdm9pZCAwPT09ciYmKHI9ITEpLHZvaWQgMD09PW4mJihuPTE2KSxfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIG8saSxhLHMsdSxsLGMscCxmLGg9dGhpcztyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihkKXtzd2l0Y2goZC5sYWJlbCl7Y2FzZSAwOnJldHVybiBhc3NlcnRWYWxpZE91dHB1dFN0cmlkZShuKSxhc3NlcnRWYWxpZFNjYWxlRmFjdG9yKHQpLG89ZSBpbnN0YW5jZW9mIFRlbnNvcj9bZS5zaGFwZVswXSxlLnNoYXBlWzFdXTpbZS5oZWlnaHQsZS53aWR0aF0saT1vWzBdLGE9b1sxXSxzPWdldFZhbGlkUmVzb2x1dGlvbih0LGksbiksdT1nZXRWYWxpZFJlc29sdXRpb24odCxhLG4pLGw9dGlkeShmdW5jdGlvbigpe3ZhciB0PXRvSW5wdXRUZW5zb3IoZSxzLHUscik7cmV0dXJuIGgucHJlZGljdEZvclNpbmdsZVBvc2UodCxuKX0pLGM9bC5oZWF0bWFwU2NvcmVzLHA9bC5vZmZzZXRzLFs0LGRlY29kZVNpbmdsZVBvc2UoYyxwLG4pXTtjYXNlIDE6cmV0dXJuIGY9ZC5zZW50KCksYy5kaXNwb3NlKCkscC5kaXNwb3NlKCksWzIsc2NhbGVQb3NlKGYsaS9zLGEvdSldfX0pfSl9LGUucHJvdG90eXBlLmVzdGltYXRlTXVsdGlwbGVQb3Nlcz1mdW5jdGlvbihlLHQscixuLG8saSxhKXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9LjUpLHZvaWQgMD09PXImJihyPSExKSx2b2lkIDA9PT1uJiYobj0xNiksdm9pZCAwPT09byYmKG89NSksdm9pZCAwPT09aSYmKGk9LjUpLHZvaWQgMD09PWEmJihhPTIwKSxfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIHMsdSxsLGMscCxmLGgsZCx2LG0sZyxiPXRoaXM7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24oeSl7c3dpdGNoKHkubGFiZWwpe2Nhc2UgMDpyZXR1cm4gYXNzZXJ0VmFsaWRPdXRwdXRTdHJpZGUobiksYXNzZXJ0VmFsaWRTY2FsZUZhY3Rvcih0KSxzPWUgaW5zdGFuY2VvZiBUZW5zb3I/W2Uuc2hhcGVbMF0sZS5zaGFwZVsxXV06W2UuaGVpZ2h0LGUud2lkdGhdLHU9c1swXSxsPXNbMV0sYz1nZXRWYWxpZFJlc29sdXRpb24odCx1LG4pLHA9Z2V0VmFsaWRSZXNvbHV0aW9uKHQsbCxuKSxmPXRpZHkoZnVuY3Rpb24oKXt2YXIgdD10b0lucHV0VGVuc29yKGUsYyxwLHIpO3JldHVybiBiLnByZWRpY3RGb3JNdWx0aVBvc2UodCxuKX0pLGg9Zi5oZWF0bWFwU2NvcmVzLGQ9Zi5vZmZzZXRzLHY9Zi5kaXNwbGFjZW1lbnRGd2QsbT1mLmRpc3BsYWNlbWVudEJ3ZCxbNCxkZWNvZGVNdWx0aXBsZVBvc2VzKGgsZCx2LG0sbixvLGksYSldO2Nhc2UgMTpyZXR1cm4gZz15LnNlbnQoKSxoLmRpc3Bvc2UoKSxkLmRpc3Bvc2UoKSx2LmRpc3Bvc2UoKSxtLmRpc3Bvc2UoKSxbMixzY2FsZVBvc2VzKGcsdS9jLGwvcCldfX0pfSl9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLm1vYmlsZU5ldC5kaXNwb3NlKCl9LGV9KCk7ZnVuY3Rpb24gbG9hZChlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9MS4wMSksX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciB0LHI7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24obil7c3dpdGNoKG4ubGFiZWwpe2Nhc2UgMDppZihudWxsPT10Zil0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBUZW5zb3JGbG93LmpzLiBJZiB5b3UgYXJlIHVzaW5nIGEgPHNjcmlwdD4gdGFnLCBwbGVhc2UgYWxzbyBpbmNsdWRlIEB0ZW5zb3JmbG93L3RmanMgb24gdGhlIHBhZ2UgYmVmb3JlIHVzaW5nIHRoaXMgbW9kZWwuXCIpO3JldHVybiB0PU9iamVjdC5rZXlzKGNoZWNrcG9pbnRzKSx1dGlsLmFzc2VydChcIm51bWJlclwiPT10eXBlb2YgZSxcImdvdCBtdWx0aXBsaWVyIHR5cGUgb2YgXCIrdHlwZW9mIGUrXCIgd2hlbiBpdCBzaG91bGQgYmUgYSBudW1iZXIuXCIpLHV0aWwuYXNzZXJ0KHQuaW5kZXhPZihlLnRvU3RyaW5nKCkpPj0wLFwiaW52YWxpZCBtdWx0aXBsaWVyIHZhbHVlIG9mIFwiK2UrXCIuICBObyBjaGVja3BvaW50IGV4aXN0cyBmb3IgdGhhdCBtdWx0aXBsaWVyLiBNdXN0IGJlIG9uZSBvZiBcIit0LmpvaW4oXCIsXCIpK1wiLlwiKSxbNCxtb2JpbGVuZXRMb2FkZXIubG9hZChlKV07Y2FzZSAxOnJldHVybiByPW4uc2VudCgpLFsyLG5ldyBQb3NlTmV0KHIpXX19KX0pfXZhciBtb2JpbGVuZXRMb2FkZXI9e2xvYWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIF9fYXdhaXRlcihfdGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIHQscjtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihuKXtzd2l0Y2gobi5sYWJlbCl7Y2FzZSAwOnJldHVybiB0PWNoZWNrcG9pbnRzW2VdLFs0LG5ldyBDaGVja3BvaW50TG9hZGVyKHQudXJsKS5nZXRBbGxWYXJpYWJsZXMoKV07Y2FzZSAxOnJldHVybiByPW4uc2VudCgpLFsyLG5ldyBNb2JpbGVOZXQocix0LmFyY2hpdGVjdHVyZSldfX0pfSl9fTtleHBvcnR7TW9iaWxlTmV0LG1vYmlsZU5ldEFyY2hpdGVjdHVyZXMsQ2hlY2twb2ludExvYWRlcixkZWNvZGVNdWx0aXBsZVBvc2VzLGRlY29kZVNpbmdsZVBvc2UsbG9hZCxQb3NlTmV0LHBhcnRJZHMscGFydE5hbWVzLHBvc2VDaGFpbixnZXRBZGphY2VudEtleVBvaW50cyxnZXRCb3VuZGluZ0JveCxnZXRCb3VuZGluZ0JveFBvaW50c307XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnR7Y29uY2F0LHNsaWNlLHN0YWNrLHRlbnNvcix0aWR5LHVuc3RhY2ssdXRpbCxpbyxUZW5zb3IsYWRkLGFkZE4sbW9kLG11bCxkaXYsZmxvb3JEaXYsc3ViLG1pbmltdW0sbWF4aW11bSxwb3csc3F1YXJlZERpZmZlcmVuY2UsYWJzLGFjb3MsYWNvc2gsYXNpbixhc2luaCxhdGFuLGF0YW5oLGNlaWwsY29zLGNvc2gsZWx1LGVyZixleHAsZXhwbTEsZmxvb3IsbG9nLGxvZzFwLG5lZyxyZWNpcHJvY2FsLHJlbHUscm91bmQsc2VsdSxzaWdtb2lkLHNpbixzaWduLHNpbmgsc29mdHBsdXMsc3FydCxzcXVhcmUsdGFuaCx0YW4sY2xpcEJ5VmFsdWUsc2NhbGFyLGNvbnYxZCxjb252MmQsY29udjJkVHJhbnNwb3NlLGRlcHRod2lzZUNvbnYyZCxhdmdQb29sLG1heFBvb2wsZmlsbCxsaW5zcGFjZSxvbmVIb3Qsb25lcyxvbmVzTGlrZSxyYW5kb21Vbmlmb3JtLHJhbmdlLHRydW5jYXRlZE5vcm1hbCx6ZXJvcyx6ZXJvc0xpa2UsaW1hZ2Usd2hlcmVBc3luYyx0b3BrLHRlbnNvcjFkLGVxdWFsLG5vdEVxdWFsLGdyZWF0ZXIsZ3JlYXRlckVxdWFsLGxlc3MsbGVzc0VxdWFsLGxvZ2ljYWxBbmQsbG9naWNhbE5vdCxsb2dpY2FsT3Isd2hlcmUsbWF0TXVsLHRyYW5zcG9zZSxiYXRjaE5vcm1hbGl6YXRpb24sbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb24sc29mdG1heCxtYXgsbWVhbixtaW4sc3VtLGFsbCxhbnksYXJnTWF4LGFyZ01pbixwcm9kLGdhdGhlcixyZXZlcnNlLHN0cmlkZWRTbGljZSx0aWxlLHNwbGl0LGNhc3QsZXhwYW5kRGltcyxzcXVlZXplLHJlc2hhcGUscGFkLHNwYWNlVG9CYXRjaE5ELGJhdGNoVG9TcGFjZU5EfWZyb21cIkB0ZW5zb3JmbG93L3RmanMtY29yZVwiO3ZhciBfX2Fzc2lnbj1PYmplY3QuYXNzaWdufHxmdW5jdGlvbihlKXtmb3IodmFyIHQsYT0xLHI9YXJndW1lbnRzLmxlbmd0aDthPHI7YSsrKWZvcih2YXIgbiBpbiB0PWFyZ3VtZW50c1thXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGVbbl09dFtuXSk7cmV0dXJuIGV9O2Z1bmN0aW9uIF9fYXdhaXRlcihlLHQsYSxyKXtyZXR1cm4gbmV3KGF8fChhPVByb21pc2UpKShmdW5jdGlvbihuLG8pe2Z1bmN0aW9uIHMoZSl7dHJ5e3Aoci5uZXh0KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiBpKGUpe3RyeXtwKHIudGhyb3coZSkpfWNhdGNoKGUpe28oZSl9fWZ1bmN0aW9uIHAoZSl7ZS5kb25lP24oZS52YWx1ZSk6bmV3IGEoZnVuY3Rpb24odCl7dChlLnZhbHVlKX0pLnRoZW4ocyxpKX1wKChyPXIuYXBwbHkoZSx0fHxbXSkpLm5leHQoKSl9KX1mdW5jdGlvbiBfX2dlbmVyYXRvcihlLHQpe3ZhciBhLHIsbixvLHM9e2xhYmVsOjAsc2VudDpmdW5jdGlvbigpe2lmKDEmblswXSl0aHJvdyBuWzFdO3JldHVybiBuWzFdfSx0cnlzOltdLG9wczpbXX07cmV0dXJuIG89e25leHQ6aSgwKSx0aHJvdzppKDEpLHJldHVybjppKDIpfSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJihvW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLG87ZnVuY3Rpb24gaShvKXtyZXR1cm4gZnVuY3Rpb24oaSl7cmV0dXJuIGZ1bmN0aW9uKG8pe2lmKGEpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7Zm9yKDtzOyl0cnl7aWYoYT0xLHImJihuPXJbMiZvWzBdP1wicmV0dXJuXCI6b1swXT9cInRocm93XCI6XCJuZXh0XCJdKSYmIShuPW4uY2FsbChyLG9bMV0pKS5kb25lKXJldHVybiBuO3N3aXRjaChyPTAsbiYmKG89WzAsbi52YWx1ZV0pLG9bMF0pe2Nhc2UgMDpjYXNlIDE6bj1vO2JyZWFrO2Nhc2UgNDpyZXR1cm4gcy5sYWJlbCsrLHt2YWx1ZTpvWzFdLGRvbmU6ITF9O2Nhc2UgNTpzLmxhYmVsKysscj1vWzFdLG89WzBdO2NvbnRpbnVlO2Nhc2UgNzpvPXMub3BzLnBvcCgpLHMudHJ5cy5wb3AoKTtjb250aW51ZTtkZWZhdWx0OmlmKCEobj0obj1zLnRyeXMpLmxlbmd0aD4wJiZuW24ubGVuZ3RoLTFdKSYmKDY9PT1vWzBdfHwyPT09b1swXSkpe3M9MDtjb250aW51ZX1pZigzPT09b1swXSYmKCFufHxvWzFdPm5bMF0mJm9bMV08blszXSkpe3MubGFiZWw9b1sxXTticmVha31pZig2PT09b1swXSYmcy5sYWJlbDxuWzFdKXtzLmxhYmVsPW5bMV0sbj1vO2JyZWFrfWlmKG4mJnMubGFiZWw8blsyXSl7cy5sYWJlbD1uWzJdLHMub3BzLnB1c2gobyk7YnJlYWt9blsyXSYmcy5vcHMucG9wKCkscy50cnlzLnBvcCgpO2NvbnRpbnVlfW89dC5jYWxsKGUscyl9Y2F0Y2goZSl7bz1bNixlXSxyPTB9ZmluYWxseXthPW49MH1pZig1Jm9bMF0pdGhyb3cgb1sxXTtyZXR1cm57dmFsdWU6b1swXT9vWzFdOnZvaWQgMCxkb25lOiEwfX0oW28saV0pfX19dmFyIGNvbW1vbmpzR2xvYmFsPVwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OlwidW5kZWZpbmVkXCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOlwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gY3JlYXRlQ29tbW9uanNNb2R1bGUoZSx0KXtyZXR1cm4gZSh0PXtleHBvcnRzOnt9fSx0LmV4cG9ydHMpLHQuZXhwb3J0c312YXIgYXNwcm9taXNlPWFzUHJvbWlzZTtmdW5jdGlvbiBhc1Byb21pc2UoZSx0KXtmb3IodmFyIGE9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSkscj0wLG49MixvPSEwO248YXJndW1lbnRzLmxlbmd0aDspYVtyKytdPWFyZ3VtZW50c1tuKytdO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuLHMpe2Fbcl09ZnVuY3Rpb24oZSl7aWYobylpZihvPSExLGUpcyhlKTtlbHNle2Zvcih2YXIgdD1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKSxhPTA7YTx0Lmxlbmd0aDspdFthKytdPWFyZ3VtZW50c1thXTtuLmFwcGx5KG51bGwsdCl9fTt0cnl7ZS5hcHBseSh0fHxudWxsLGEpfWNhdGNoKGUpe28mJihvPSExLHMoZSkpfX0pfXZhciBiYXNlNjRfMT1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihlLHQpe3ZhciBhPXQ7YS5sZW5ndGg9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7aWYoIXQpcmV0dXJuIDA7Zm9yKHZhciBhPTA7LS10JTQ+MSYmXCI9XCI9PT1lLmNoYXJBdCh0KTspKythO3JldHVybiBNYXRoLmNlaWwoMyplLmxlbmd0aCkvNC1hfTtmb3IodmFyIHI9bmV3IEFycmF5KDY0KSxuPW5ldyBBcnJheSgxMjMpLG89MDtvPDY0OyluW3Jbb109bzwyNj9vKzY1Om88NTI/bys3MTpvPDYyP28tNDpvLTU5fDQzXT1vKys7YS5lbmNvZGU9ZnVuY3Rpb24oZSx0LGEpe2Zvcih2YXIgbixvPW51bGwscz1bXSxpPTAscD0wO3Q8YTspe3ZhciB1PWVbdCsrXTtzd2l0Y2gocCl7Y2FzZSAwOnNbaSsrXT1yW3U+PjJdLG49KDMmdSk8PDQscD0xO2JyZWFrO2Nhc2UgMTpzW2krK109cltufHU+PjRdLG49KDE1JnUpPDwyLHA9MjticmVhaztjYXNlIDI6c1tpKytdPXJbbnx1Pj42XSxzW2krK109cls2MyZ1XSxwPTB9aT44MTkxJiYoKG98fChvPVtdKSkucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxzKSksaT0wKX1yZXR1cm4gcCYmKHNbaSsrXT1yW25dLHNbaSsrXT02MSwxPT09cCYmKHNbaSsrXT02MSkpLG8/KGkmJm8ucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxzLnNsaWNlKDAsaSkpKSxvLmpvaW4oXCJcIikpOlN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHMuc2xpY2UoMCxpKSl9O2EuZGVjb2RlPWZ1bmN0aW9uKGUsdCxhKXtmb3IodmFyIHIsbz1hLHM9MCxpPTA7aTxlLmxlbmd0aDspe3ZhciBwPWUuY2hhckNvZGVBdChpKyspO2lmKDYxPT09cCYmcz4xKWJyZWFrO2lmKHZvaWQgMD09PShwPW5bcF0pKXRocm93IEVycm9yKFwiaW52YWxpZCBlbmNvZGluZ1wiKTtzd2l0Y2gocyl7Y2FzZSAwOnI9cCxzPTE7YnJlYWs7Y2FzZSAxOnRbYSsrXT1yPDwyfCg0OCZwKT4+NCxyPXAscz0yO2JyZWFrO2Nhc2UgMjp0W2ErK109KDE1JnIpPDw0fCg2MCZwKT4+MixyPXAscz0zO2JyZWFrO2Nhc2UgMzp0W2ErK109KDMmcik8PDZ8cCxzPTB9fWlmKDE9PT1zKXRocm93IEVycm9yKFwiaW52YWxpZCBlbmNvZGluZ1wiKTtyZXR1cm4gYS1vfSxhLnRlc3Q9ZnVuY3Rpb24oZSl7cmV0dXJuL14oPzpbQS1aYS16MC05Ky9dezR9KSooPzpbQS1aYS16MC05Ky9dezJ9PT18W0EtWmEtejAtOSsvXXszfT0pPyQvLnRlc3QoZSl9fSksZXZlbnRlbWl0dGVyPUV2ZW50RW1pdHRlcjtmdW5jdGlvbiBFdmVudEVtaXR0ZXIoKXt0aGlzLl9saXN0ZW5lcnM9e319RXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbj1mdW5jdGlvbihlLHQsYSl7cmV0dXJuKHRoaXMuX2xpc3RlbmVyc1tlXXx8KHRoaXMuX2xpc3RlbmVyc1tlXT1bXSkpLnB1c2goe2ZuOnQsY3R4OmF8fHRoaXN9KSx0aGlzfSxFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZj1mdW5jdGlvbihlLHQpe2lmKHZvaWQgMD09PWUpdGhpcy5fbGlzdGVuZXJzPXt9O2Vsc2UgaWYodm9pZCAwPT09dCl0aGlzLl9saXN0ZW5lcnNbZV09W107ZWxzZSBmb3IodmFyIGE9dGhpcy5fbGlzdGVuZXJzW2VdLHI9MDtyPGEubGVuZ3RoOylhW3JdLmZuPT09dD9hLnNwbGljZShyLDEpOisrcjtyZXR1cm4gdGhpc30sRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2xpc3RlbmVyc1tlXTtpZih0KXtmb3IodmFyIGE9W10scj0xO3I8YXJndW1lbnRzLmxlbmd0aDspYS5wdXNoKGFyZ3VtZW50c1tyKytdKTtmb3Iocj0wO3I8dC5sZW5ndGg7KXRbcl0uZm4uYXBwbHkodFtyKytdLmN0eCxhKX1yZXR1cm4gdGhpc307dmFyIGZsb2F0XzE9ZmFjdG9yeShmYWN0b3J5KTtmdW5jdGlvbiBmYWN0b3J5KGUpe3JldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiBGbG9hdDMyQXJyYXk/ZnVuY3Rpb24oKXt2YXIgdD1uZXcgRmxvYXQzMkFycmF5KFstMF0pLGE9bmV3IFVpbnQ4QXJyYXkodC5idWZmZXIpLHI9MTI4PT09YVszXTtmdW5jdGlvbiBuKGUscixuKXt0WzBdPWUscltuXT1hWzBdLHJbbisxXT1hWzFdLHJbbisyXT1hWzJdLHJbbiszXT1hWzNdfWZ1bmN0aW9uIG8oZSxyLG4pe3RbMF09ZSxyW25dPWFbM10scltuKzFdPWFbMl0scltuKzJdPWFbMV0scltuKzNdPWFbMF19ZnVuY3Rpb24gcyhlLHIpe3JldHVybiBhWzBdPWVbcl0sYVsxXT1lW3IrMV0sYVsyXT1lW3IrMl0sYVszXT1lW3IrM10sdFswXX1mdW5jdGlvbiBpKGUscil7cmV0dXJuIGFbM109ZVtyXSxhWzJdPWVbcisxXSxhWzFdPWVbcisyXSxhWzBdPWVbciszXSx0WzBdfWUud3JpdGVGbG9hdExFPXI/bjpvLGUud3JpdGVGbG9hdEJFPXI/bzpuLGUucmVhZEZsb2F0TEU9cj9zOmksZS5yZWFkRmxvYXRCRT1yP2k6c30oKTpmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSx0LGEscil7dmFyIG49dDwwPzE6MDtpZihuJiYodD0tdCksMD09PXQpZSgxL3Q+MD8wOjIxNDc0ODM2NDgsYSxyKTtlbHNlIGlmKGlzTmFOKHQpKWUoMjE0MzI4OTM0NCxhLHIpO2Vsc2UgaWYodD4zLjQwMjgyMzQ2NjM4NTI4ODZlMzgpZSgobjw8MzF8MjEzOTA5NTA0MCk+Pj4wLGEscik7ZWxzZSBpZih0PDEuMTc1NDk0MzUwODIyMjg3NWUtMzgpZSgobjw8MzF8TWF0aC5yb3VuZCh0LzEuNDAxMjk4NDY0MzI0ODE3ZS00NSkpPj4+MCxhLHIpO2Vsc2V7dmFyIG89TWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMik7ZSgobjw8MzF8bysxMjc8PDIzfDgzODg2MDcmTWF0aC5yb3VuZCh0Kk1hdGgucG93KDIsLW8pKjgzODg2MDgpKT4+PjAsYSxyKX19ZnVuY3Rpb24gYShlLHQsYSl7dmFyIHI9ZSh0LGEpLG49Mioocj4+MzEpKzEsbz1yPj4+MjMmMjU1LHM9ODM4ODYwNyZyO3JldHVybiAyNTU9PT1vP3M/TmFOOm4qKDEvMCk6MD09PW8/MS40MDEyOTg0NjQzMjQ4MTdlLTQ1Km4qczpuKk1hdGgucG93KDIsby0xNTApKihzKzgzODg2MDgpfWUud3JpdGVGbG9hdExFPXQuYmluZChudWxsLHdyaXRlVWludExFKSxlLndyaXRlRmxvYXRCRT10LmJpbmQobnVsbCx3cml0ZVVpbnRCRSksZS5yZWFkRmxvYXRMRT1hLmJpbmQobnVsbCxyZWFkVWludExFKSxlLnJlYWRGbG9hdEJFPWEuYmluZChudWxsLHJlYWRVaW50QkUpfSgpLFwidW5kZWZpbmVkXCIhPXR5cGVvZiBGbG9hdDY0QXJyYXk/ZnVuY3Rpb24oKXt2YXIgdD1uZXcgRmxvYXQ2NEFycmF5KFstMF0pLGE9bmV3IFVpbnQ4QXJyYXkodC5idWZmZXIpLHI9MTI4PT09YVs3XTtmdW5jdGlvbiBuKGUscixuKXt0WzBdPWUscltuXT1hWzBdLHJbbisxXT1hWzFdLHJbbisyXT1hWzJdLHJbbiszXT1hWzNdLHJbbis0XT1hWzRdLHJbbis1XT1hWzVdLHJbbis2XT1hWzZdLHJbbis3XT1hWzddfWZ1bmN0aW9uIG8oZSxyLG4pe3RbMF09ZSxyW25dPWFbN10scltuKzFdPWFbNl0scltuKzJdPWFbNV0scltuKzNdPWFbNF0scltuKzRdPWFbM10scltuKzVdPWFbMl0scltuKzZdPWFbMV0scltuKzddPWFbMF19ZnVuY3Rpb24gcyhlLHIpe3JldHVybiBhWzBdPWVbcl0sYVsxXT1lW3IrMV0sYVsyXT1lW3IrMl0sYVszXT1lW3IrM10sYVs0XT1lW3IrNF0sYVs1XT1lW3IrNV0sYVs2XT1lW3IrNl0sYVs3XT1lW3IrN10sdFswXX1mdW5jdGlvbiBpKGUscil7cmV0dXJuIGFbN109ZVtyXSxhWzZdPWVbcisxXSxhWzVdPWVbcisyXSxhWzRdPWVbciszXSxhWzNdPWVbcis0XSxhWzJdPWVbcis1XSxhWzFdPWVbcis2XSxhWzBdPWVbcis3XSx0WzBdfWUud3JpdGVEb3VibGVMRT1yP246byxlLndyaXRlRG91YmxlQkU9cj9vOm4sZS5yZWFkRG91YmxlTEU9cj9zOmksZS5yZWFkRG91YmxlQkU9cj9pOnN9KCk6ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsdCxhLHIsbixvKXt2YXIgcz1yPDA/MTowO2lmKHMmJihyPS1yKSwwPT09cillKDAsbixvK3QpLGUoMS9yPjA/MDoyMTQ3NDgzNjQ4LG4sbythKTtlbHNlIGlmKGlzTmFOKHIpKWUoMCxuLG8rdCksZSgyMTQ2OTU5MzYwLG4sbythKTtlbHNlIGlmKHI+MS43OTc2OTMxMzQ4NjIzMTU3ZTMwOCllKDAsbixvK3QpLGUoKHM8PDMxfDIxNDY0MzUwNzIpPj4+MCxuLG8rYSk7ZWxzZXt2YXIgaTtpZihyPDIuMjI1MDczODU4NTA3MjAxNGUtMzA4KWUoKGk9ci81ZS0zMjQpPj4+MCxuLG8rdCksZSgoczw8MzF8aS80Mjk0OTY3Mjk2KT4+PjAsbixvK2EpO2Vsc2V7dmFyIHA9TWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMik7MTAyND09PXAmJihwPTEwMjMpLGUoNDUwMzU5OTYyNzM3MDQ5NiooaT1yKk1hdGgucG93KDIsLXApKT4+PjAsbixvK3QpLGUoKHM8PDMxfHArMTAyMzw8MjB8MTA0ODU3NippJjEwNDg1NzUpPj4+MCxuLG8rYSl9fX1mdW5jdGlvbiBhKGUsdCxhLHIsbil7dmFyIG89ZShyLG4rdCkscz1lKHIsbithKSxpPTIqKHM+PjMxKSsxLHA9cz4+PjIwJjIwNDcsdT00Mjk0OTY3Mjk2KigxMDQ4NTc1JnMpK287cmV0dXJuIDIwNDc9PT1wP3U/TmFOOmkqKDEvMCk6MD09PXA/NWUtMzI0KmkqdTppKk1hdGgucG93KDIscC0xMDc1KSoodSs0NTAzNTk5NjI3MzcwNDk2KX1lLndyaXRlRG91YmxlTEU9dC5iaW5kKG51bGwsd3JpdGVVaW50TEUsMCw0KSxlLndyaXRlRG91YmxlQkU9dC5iaW5kKG51bGwsd3JpdGVVaW50QkUsNCwwKSxlLnJlYWREb3VibGVMRT1hLmJpbmQobnVsbCxyZWFkVWludExFLDAsNCksZS5yZWFkRG91YmxlQkU9YS5iaW5kKG51bGwscmVhZFVpbnRCRSw0LDApfSgpLGV9ZnVuY3Rpb24gd3JpdGVVaW50TEUoZSx0LGEpe3RbYV09MjU1JmUsdFthKzFdPWU+Pj44JjI1NSx0W2ErMl09ZT4+PjE2JjI1NSx0W2ErM109ZT4+PjI0fWZ1bmN0aW9uIHdyaXRlVWludEJFKGUsdCxhKXt0W2FdPWU+Pj4yNCx0W2ErMV09ZT4+PjE2JjI1NSx0W2ErMl09ZT4+PjgmMjU1LHRbYSszXT0yNTUmZX1mdW5jdGlvbiByZWFkVWludExFKGUsdCl7cmV0dXJuKGVbdF18ZVt0KzFdPDw4fGVbdCsyXTw8MTZ8ZVt0KzNdPDwyNCk+Pj4wfWZ1bmN0aW9uIHJlYWRVaW50QkUoZSx0KXtyZXR1cm4oZVt0XTw8MjR8ZVt0KzFdPDwxNnxlW3QrMl08PDh8ZVt0KzNdKT4+PjB9dmFyIGlucXVpcmVfMT1pbnF1aXJlO2Z1bmN0aW9uIGlucXVpcmUobW9kdWxlTmFtZSl7dHJ5e3ZhciBtb2QkJDE9ZXZhbChcInF1aXJlXCIucmVwbGFjZSgvXi8sXCJyZVwiKSkobW9kdWxlTmFtZSk7aWYobW9kJCQxJiYobW9kJCQxLmxlbmd0aHx8T2JqZWN0LmtleXMobW9kJCQxKS5sZW5ndGgpKXJldHVybiBtb2QkJDF9Y2F0Y2goZSl7fXJldHVybiBudWxsfXZhciB1dGY4XzE9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSx0KXt2YXIgYT10O2EubGVuZ3RoPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLGE9MCxyPTA7cjxlLmxlbmd0aDsrK3IpKGE9ZS5jaGFyQ29kZUF0KHIpKTwxMjg/dCs9MTphPDIwNDg/dCs9Mjo1NTI5Nj09KDY0NTEyJmEpJiY1NjMyMD09KDY0NTEyJmUuY2hhckNvZGVBdChyKzEpKT8oKytyLHQrPTQpOnQrPTM7cmV0dXJuIHR9LGEucmVhZD1mdW5jdGlvbihlLHQsYSl7aWYoYS10PDEpcmV0dXJuXCJcIjtmb3IodmFyIHIsbj1udWxsLG89W10scz0wO3Q8YTspKHI9ZVt0KytdKTwxMjg/b1tzKytdPXI6cj4xOTEmJnI8MjI0P29bcysrXT0oMzEmcik8PDZ8NjMmZVt0KytdOnI+MjM5JiZyPDM2NT8ocj0oKDcmcik8PDE4fCg2MyZlW3QrK10pPDwxMnwoNjMmZVt0KytdKTw8Nnw2MyZlW3QrK10pLTY1NTM2LG9bcysrXT01NTI5Nisocj4+MTApLG9bcysrXT01NjMyMCsoMTAyMyZyKSk6b1tzKytdPSgxNSZyKTw8MTJ8KDYzJmVbdCsrXSk8PDZ8NjMmZVt0KytdLHM+ODE5MSYmKChufHwobj1bXSkpLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsbykpLHM9MCk7cmV0dXJuIG4/KHMmJm4ucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxvLnNsaWNlKDAscykpKSxuLmpvaW4oXCJcIikpOlN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLG8uc2xpY2UoMCxzKSl9LGEud3JpdGU9ZnVuY3Rpb24oZSx0LGEpe2Zvcih2YXIgcixuLG89YSxzPTA7czxlLmxlbmd0aDsrK3MpKHI9ZS5jaGFyQ29kZUF0KHMpKTwxMjg/dFthKytdPXI6cjwyMDQ4Pyh0W2ErK109cj4+NnwxOTIsdFthKytdPTYzJnJ8MTI4KTo1NTI5Nj09KDY0NTEyJnIpJiY1NjMyMD09KDY0NTEyJihuPWUuY2hhckNvZGVBdChzKzEpKSk/KHI9NjU1MzYrKCgxMDIzJnIpPDwxMCkrKDEwMjMmbiksKytzLHRbYSsrXT1yPj4xOHwyNDAsdFthKytdPXI+PjEyJjYzfDEyOCx0W2ErK109cj4+NiY2M3wxMjgsdFthKytdPTYzJnJ8MTI4KToodFthKytdPXI+PjEyfDIyNCx0W2ErK109cj4+NiY2M3wxMjgsdFthKytdPTYzJnJ8MTI4KTtyZXR1cm4gYS1vfX0pLHBvb2xfMT1wb29sO2Z1bmN0aW9uIHBvb2woZSx0LGEpe3ZhciByPWF8fDgxOTIsbj1yPj4+MSxvPW51bGwscz1yO3JldHVybiBmdW5jdGlvbihhKXtpZihhPDF8fGE+bilyZXR1cm4gZShhKTtzK2E+ciYmKG89ZShyKSxzPTApO3ZhciBpPXQuY2FsbChvLHMscys9YSk7cmV0dXJuIDcmcyYmKHM9MSsoN3xzKSksaX19dmFyIGxvbmdiaXRzPUxvbmdCaXRzO2Z1bmN0aW9uIExvbmdCaXRzKGUsdCl7dGhpcy5sbz1lPj4+MCx0aGlzLmhpPXQ+Pj4wfXZhciB6ZXJvPUxvbmdCaXRzLnplcm89bmV3IExvbmdCaXRzKDAsMCk7emVyby50b051bWJlcj1mdW5jdGlvbigpe3JldHVybiAwfSx6ZXJvLnp6RW5jb2RlPXplcm8uenpEZWNvZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30semVyby5sZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gMX07dmFyIHplcm9IYXNoPUxvbmdCaXRzLnplcm9IYXNoPVwiXFwwXFwwXFwwXFwwXFwwXFwwXFwwXFwwXCI7TG9uZ0JpdHMuZnJvbU51bWJlcj1mdW5jdGlvbihlKXtpZigwPT09ZSlyZXR1cm4gemVybzt2YXIgdD1lPDA7dCYmKGU9LWUpO3ZhciBhPWU+Pj4wLHI9KGUtYSkvNDI5NDk2NzI5Nj4+PjA7cmV0dXJuIHQmJihyPX5yPj4+MCxhPX5hPj4+MCwrK2E+NDI5NDk2NzI5NSYmKGE9MCwrK3I+NDI5NDk2NzI5NSYmKHI9MCkpKSxuZXcgTG9uZ0JpdHMoYSxyKX0sTG9uZ0JpdHMuZnJvbT1mdW5jdGlvbihlKXtpZihcIm51bWJlclwiPT10eXBlb2YgZSlyZXR1cm4gTG9uZ0JpdHMuZnJvbU51bWJlcihlKTtpZihtaW5pbWFsLmlzU3RyaW5nKGUpKXtpZighbWluaW1hbC5Mb25nKXJldHVybiBMb25nQml0cy5mcm9tTnVtYmVyKHBhcnNlSW50KGUsMTApKTtlPW1pbmltYWwuTG9uZy5mcm9tU3RyaW5nKGUpfXJldHVybiBlLmxvd3x8ZS5oaWdoP25ldyBMb25nQml0cyhlLmxvdz4+PjAsZS5oaWdoPj4+MCk6emVyb30sTG9uZ0JpdHMucHJvdG90eXBlLnRvTnVtYmVyPWZ1bmN0aW9uKGUpe2lmKCFlJiZ0aGlzLmhpPj4+MzEpe3ZhciB0PTErfnRoaXMubG8+Pj4wLGE9fnRoaXMuaGk+Pj4wO3JldHVybiB0fHwoYT1hKzE+Pj4wKSwtKHQrNDI5NDk2NzI5NiphKX1yZXR1cm4gdGhpcy5sbys0Mjk0OTY3Mjk2KnRoaXMuaGl9LExvbmdCaXRzLnByb3RvdHlwZS50b0xvbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIG1pbmltYWwuTG9uZz9uZXcgbWluaW1hbC5Mb25nKDB8dGhpcy5sbywwfHRoaXMuaGksQm9vbGVhbihlKSk6e2xvdzowfHRoaXMubG8saGlnaDowfHRoaXMuaGksdW5zaWduZWQ6Qm9vbGVhbihlKX19O3ZhciBjaGFyQ29kZUF0PVN0cmluZy5wcm90b3R5cGUuY2hhckNvZGVBdDtMb25nQml0cy5mcm9tSGFzaD1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXplcm9IYXNoP3plcm86bmV3IExvbmdCaXRzKChjaGFyQ29kZUF0LmNhbGwoZSwwKXxjaGFyQ29kZUF0LmNhbGwoZSwxKTw8OHxjaGFyQ29kZUF0LmNhbGwoZSwyKTw8MTZ8Y2hhckNvZGVBdC5jYWxsKGUsMyk8PDI0KT4+PjAsKGNoYXJDb2RlQXQuY2FsbChlLDQpfGNoYXJDb2RlQXQuY2FsbChlLDUpPDw4fGNoYXJDb2RlQXQuY2FsbChlLDYpPDwxNnxjaGFyQ29kZUF0LmNhbGwoZSw3KTw8MjQpPj4+MCl9LExvbmdCaXRzLnByb3RvdHlwZS50b0hhc2g9ZnVuY3Rpb24oKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgyNTUmdGhpcy5sbyx0aGlzLmxvPj4+OCYyNTUsdGhpcy5sbz4+PjE2JjI1NSx0aGlzLmxvPj4+MjQsMjU1JnRoaXMuaGksdGhpcy5oaT4+PjgmMjU1LHRoaXMuaGk+Pj4xNiYyNTUsdGhpcy5oaT4+PjI0KX0sTG9uZ0JpdHMucHJvdG90eXBlLnp6RW5jb2RlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5oaT4+MzE7cmV0dXJuIHRoaXMuaGk9KCh0aGlzLmhpPDwxfHRoaXMubG8+Pj4zMSleZSk+Pj4wLHRoaXMubG89KHRoaXMubG88PDFeZSk+Pj4wLHRoaXN9LExvbmdCaXRzLnByb3RvdHlwZS56ekRlY29kZT1mdW5jdGlvbigpe3ZhciBlPS0oMSZ0aGlzLmxvKTtyZXR1cm4gdGhpcy5sbz0oKHRoaXMubG8+Pj4xfHRoaXMuaGk8PDMxKV5lKT4+PjAsdGhpcy5oaT0odGhpcy5oaT4+PjFeZSk+Pj4wLHRoaXN9LExvbmdCaXRzLnByb3RvdHlwZS5sZW5ndGg9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxvLHQ9KHRoaXMubG8+Pj4yOHx0aGlzLmhpPDw0KT4+PjAsYT10aGlzLmhpPj4+MjQ7cmV0dXJuIDA9PT1hPzA9PT10P2U8MTYzODQ/ZTwxMjg/MToyOmU8MjA5NzE1Mj8zOjQ6dDwxNjM4ND90PDEyOD81OjY6dDwyMDk3MTUyPzc6ODphPDEyOD85OjEwfTt2YXIgbWluaW1hbD1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihlLHQpe3ZhciBhPXQ7ZnVuY3Rpb24gcihlLHQsYSl7Zm9yKHZhciByPU9iamVjdC5rZXlzKHQpLG49MDtuPHIubGVuZ3RoOysrbil2b2lkIDAhPT1lW3Jbbl1dJiZhfHwoZVtyW25dXT10W3Jbbl1dKTtyZXR1cm4gZX1mdW5jdGlvbiBuKGUpe2Z1bmN0aW9uIHQoZSxhKXtpZighKHRoaXMgaW5zdGFuY2VvZiB0KSlyZXR1cm4gbmV3IHQoZSxhKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcIm1lc3NhZ2VcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGV9fSksRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U/RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcyx0KTpPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcInN0YWNrXCIse3ZhbHVlOihuZXcgRXJyb3IpLnN0YWNrfHxcIlwifSksYSYmcih0aGlzLGEpfXJldHVybih0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXQsT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwibmFtZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZX19KSx0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUrXCI6IFwiK3RoaXMubWVzc2FnZX0sdH1hLmFzUHJvbWlzZT1hc3Byb21pc2UsYS5iYXNlNjQ9YmFzZTY0XzEsYS5FdmVudEVtaXR0ZXI9ZXZlbnRlbWl0dGVyLGEuZmxvYXQ9ZmxvYXRfMSxhLmlucXVpcmU9aW5xdWlyZV8xLGEudXRmOD11dGY4XzEsYS5wb29sPXBvb2xfMSxhLkxvbmdCaXRzPWxvbmdiaXRzLGEuZW1wdHlBcnJheT1PYmplY3QuZnJlZXplP09iamVjdC5mcmVlemUoW10pOltdLGEuZW1wdHlPYmplY3Q9T2JqZWN0LmZyZWV6ZT9PYmplY3QuZnJlZXplKHt9KTp7fSxhLmlzTm9kZT1Cb29sZWFuKGNvbW1vbmpzR2xvYmFsLnByb2Nlc3MmJmNvbW1vbmpzR2xvYmFsLnByb2Nlc3MudmVyc2lvbnMmJmNvbW1vbmpzR2xvYmFsLnByb2Nlc3MudmVyc2lvbnMubm9kZSksYS5pc0ludGVnZXI9TnVtYmVyLmlzSW50ZWdlcnx8ZnVuY3Rpb24oZSl7cmV0dXJuXCJudW1iZXJcIj09dHlwZW9mIGUmJmlzRmluaXRlKGUpJiZNYXRoLmZsb29yKGUpPT09ZX0sYS5pc1N0cmluZz1mdW5jdGlvbihlKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgZXx8ZSBpbnN0YW5jZW9mIFN0cmluZ30sYS5pc09iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gZSYmXCJvYmplY3RcIj09dHlwZW9mIGV9LGEuaXNzZXQ9YS5pc1NldD1mdW5jdGlvbihlLHQpe3ZhciBhPWVbdF07cmV0dXJuIShudWxsPT1hfHwhZS5oYXNPd25Qcm9wZXJ0eSh0KSkmJihcIm9iamVjdFwiIT10eXBlb2YgYXx8KEFycmF5LmlzQXJyYXkoYSk/YS5sZW5ndGg6T2JqZWN0LmtleXMoYSkubGVuZ3RoKT4wKX0sYS5CdWZmZXI9ZnVuY3Rpb24oKXt0cnl7dmFyIGU9YS5pbnF1aXJlKFwiYnVmZmVyXCIpLkJ1ZmZlcjtyZXR1cm4gZS5wcm90b3R5cGUudXRmOFdyaXRlP2U6bnVsbH1jYXRjaChlKXtyZXR1cm4gbnVsbH19KCksYS5fQnVmZmVyX2Zyb209bnVsbCxhLl9CdWZmZXJfYWxsb2NVbnNhZmU9bnVsbCxhLm5ld0J1ZmZlcj1mdW5jdGlvbihlKXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgZT9hLkJ1ZmZlcj9hLl9CdWZmZXJfYWxsb2NVbnNhZmUoZSk6bmV3IGEuQXJyYXkoZSk6YS5CdWZmZXI/YS5fQnVmZmVyX2Zyb20oZSk6XCJ1bmRlZmluZWRcIj09dHlwZW9mIFVpbnQ4QXJyYXk/ZTpuZXcgVWludDhBcnJheShlKX0sYS5BcnJheT1cInVuZGVmaW5lZFwiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LGEuTG9uZz1jb21tb25qc0dsb2JhbC5kY29kZUlPJiZjb21tb25qc0dsb2JhbC5kY29kZUlPLkxvbmd8fGEuaW5xdWlyZShcImxvbmdcIiksYS5rZXkyUmU9L150cnVlfGZhbHNlfDB8MSQvLGEua2V5MzJSZT0vXi0/KD86MHxbMS05XVswLTldKikkLyxhLmtleTY0UmU9L14oPzpbXFxcXHgwMC1cXFxceGZmXXs4fXwtPyg/OjB8WzEtOV1bMC05XSopKSQvLGEubG9uZ1RvSGFzaD1mdW5jdGlvbihlKXtyZXR1cm4gZT9hLkxvbmdCaXRzLmZyb20oZSkudG9IYXNoKCk6YS5Mb25nQml0cy56ZXJvSGFzaH0sYS5sb25nRnJvbUhhc2g9ZnVuY3Rpb24oZSx0KXt2YXIgcj1hLkxvbmdCaXRzLmZyb21IYXNoKGUpO3JldHVybiBhLkxvbmc/YS5Mb25nLmZyb21CaXRzKHIubG8sci5oaSx0KTpyLnRvTnVtYmVyKEJvb2xlYW4odCkpfSxhLm1lcmdlPXIsYS5sY0ZpcnN0PWZ1bmN0aW9uKGUpe3JldHVybiBlLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpK2Uuc3Vic3RyaW5nKDEpfSxhLm5ld0Vycm9yPW4sYS5Qcm90b2NvbEVycm9yPW4oXCJQcm90b2NvbEVycm9yXCIpLGEub25lT2ZHZXR0ZXI9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXt9LGE9MDthPGUubGVuZ3RoOysrYSl0W2VbYV1dPTE7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBlPU9iamVjdC5rZXlzKHRoaXMpLGE9ZS5sZW5ndGgtMTthPi0xOy0tYSlpZigxPT09dFtlW2FdXSYmdm9pZCAwIT09dGhpc1tlW2FdXSYmbnVsbCE9PXRoaXNbZVthXV0pcmV0dXJuIGVbYV19fSxhLm9uZU9mU2V0dGVyPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGE9MDthPGUubGVuZ3RoOysrYSllW2FdIT09dCYmZGVsZXRlIHRoaXNbZVthXV19fSxhLnRvSlNPTk9wdGlvbnM9e2xvbmdzOlN0cmluZyxlbnVtczpTdHJpbmcsYnl0ZXM6U3RyaW5nLGpzb246ITB9LGEuX2NvbmZpZ3VyZT1mdW5jdGlvbigpe3ZhciBlPWEuQnVmZmVyO2U/KGEuX0J1ZmZlcl9mcm9tPWUuZnJvbSE9PVVpbnQ4QXJyYXkuZnJvbSYmZS5mcm9tfHxmdW5jdGlvbih0LGEpe3JldHVybiBuZXcgZSh0LGEpfSxhLl9CdWZmZXJfYWxsb2NVbnNhZmU9ZS5hbGxvY1Vuc2FmZXx8ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSk6YS5fQnVmZmVyX2Zyb209YS5fQnVmZmVyX2FsbG9jVW5zYWZlPW51bGx9fSksd3JpdGVyPVdyaXRlcixCdWZmZXJXcml0ZXIsTG9uZ0JpdHMkMT1taW5pbWFsLkxvbmdCaXRzLGJhc2U2ND1taW5pbWFsLmJhc2U2NCx1dGY4PW1pbmltYWwudXRmODtmdW5jdGlvbiBPcChlLHQsYSl7dGhpcy5mbj1lLHRoaXMubGVuPXQsdGhpcy5uZXh0PXZvaWQgMCx0aGlzLnZhbD1hfWZ1bmN0aW9uIG5vb3AoKXt9ZnVuY3Rpb24gU3RhdGUoZSl7dGhpcy5oZWFkPWUuaGVhZCx0aGlzLnRhaWw9ZS50YWlsLHRoaXMubGVuPWUubGVuLHRoaXMubmV4dD1lLnN0YXRlc31mdW5jdGlvbiBXcml0ZXIoKXt0aGlzLmxlbj0wLHRoaXMuaGVhZD1uZXcgT3Aobm9vcCwwLDApLHRoaXMudGFpbD10aGlzLmhlYWQsdGhpcy5zdGF0ZXM9bnVsbH1mdW5jdGlvbiB3cml0ZUJ5dGUoZSx0LGEpe3RbYV09MjU1JmV9ZnVuY3Rpb24gd3JpdGVWYXJpbnQzMihlLHQsYSl7Zm9yKDtlPjEyNzspdFthKytdPTEyNyZlfDEyOCxlPj4+PTc7dFthXT1lfWZ1bmN0aW9uIFZhcmludE9wKGUsdCl7dGhpcy5sZW49ZSx0aGlzLm5leHQ9dm9pZCAwLHRoaXMudmFsPXR9ZnVuY3Rpb24gd3JpdGVWYXJpbnQ2NChlLHQsYSl7Zm9yKDtlLmhpOyl0W2ErK109MTI3JmUubG98MTI4LGUubG89KGUubG8+Pj43fGUuaGk8PDI1KT4+PjAsZS5oaT4+Pj03O2Zvcig7ZS5sbz4xMjc7KXRbYSsrXT0xMjcmZS5sb3wxMjgsZS5sbz1lLmxvPj4+Nzt0W2ErK109ZS5sb31mdW5jdGlvbiB3cml0ZUZpeGVkMzIoZSx0LGEpe3RbYV09MjU1JmUsdFthKzFdPWU+Pj44JjI1NSx0W2ErMl09ZT4+PjE2JjI1NSx0W2ErM109ZT4+PjI0fVdyaXRlci5jcmVhdGU9bWluaW1hbC5CdWZmZXI/ZnVuY3Rpb24oKXtyZXR1cm4oV3JpdGVyLmNyZWF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgQnVmZmVyV3JpdGVyfSkoKX06ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFdyaXRlcn0sV3JpdGVyLmFsbG9jPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgbWluaW1hbC5BcnJheShlKX0sbWluaW1hbC5BcnJheSE9PUFycmF5JiYoV3JpdGVyLmFsbG9jPW1pbmltYWwucG9vbChXcml0ZXIuYWxsb2MsbWluaW1hbC5BcnJheS5wcm90b3R5cGUuc3ViYXJyYXkpKSxXcml0ZXIucHJvdG90eXBlLl9wdXNoPWZ1bmN0aW9uKGUsdCxhKXtyZXR1cm4gdGhpcy50YWlsPXRoaXMudGFpbC5uZXh0PW5ldyBPcChlLHQsYSksdGhpcy5sZW4rPXQsdGhpc30sVmFyaW50T3AucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoT3AucHJvdG90eXBlKSxWYXJpbnRPcC5wcm90b3R5cGUuZm49d3JpdGVWYXJpbnQzMixXcml0ZXIucHJvdG90eXBlLnVpbnQzMj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5sZW4rPSh0aGlzLnRhaWw9dGhpcy50YWlsLm5leHQ9bmV3IFZhcmludE9wKChlPj4+PTApPDEyOD8xOmU8MTYzODQ/MjplPDIwOTcxNTI/MzplPDI2ODQzNTQ1Nj80OjUsZSkpLmxlbix0aGlzfSxXcml0ZXIucHJvdG90eXBlLmludDMyPWZ1bmN0aW9uKGUpe3JldHVybiBlPDA/dGhpcy5fcHVzaCh3cml0ZVZhcmludDY0LDEwLExvbmdCaXRzJDEuZnJvbU51bWJlcihlKSk6dGhpcy51aW50MzIoZSl9LFdyaXRlci5wcm90b3R5cGUuc2ludDMyPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnVpbnQzMigoZTw8MV5lPj4zMSk+Pj4wKX0sV3JpdGVyLnByb3RvdHlwZS51aW50NjQ9ZnVuY3Rpb24oZSl7dmFyIHQ9TG9uZ0JpdHMkMS5mcm9tKGUpO3JldHVybiB0aGlzLl9wdXNoKHdyaXRlVmFyaW50NjQsdC5sZW5ndGgoKSx0KX0sV3JpdGVyLnByb3RvdHlwZS5pbnQ2ND1Xcml0ZXIucHJvdG90eXBlLnVpbnQ2NCxXcml0ZXIucHJvdG90eXBlLnNpbnQ2ND1mdW5jdGlvbihlKXt2YXIgdD1Mb25nQml0cyQxLmZyb20oZSkuenpFbmNvZGUoKTtyZXR1cm4gdGhpcy5fcHVzaCh3cml0ZVZhcmludDY0LHQubGVuZ3RoKCksdCl9LFdyaXRlci5wcm90b3R5cGUuYm9vbD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fcHVzaCh3cml0ZUJ5dGUsMSxlPzE6MCl9LFdyaXRlci5wcm90b3R5cGUuZml4ZWQzMj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fcHVzaCh3cml0ZUZpeGVkMzIsNCxlPj4+MCl9LFdyaXRlci5wcm90b3R5cGUuc2ZpeGVkMzI9V3JpdGVyLnByb3RvdHlwZS5maXhlZDMyLFdyaXRlci5wcm90b3R5cGUuZml4ZWQ2ND1mdW5jdGlvbihlKXt2YXIgdD1Mb25nQml0cyQxLmZyb20oZSk7cmV0dXJuIHRoaXMuX3B1c2god3JpdGVGaXhlZDMyLDQsdC5sbykuX3B1c2god3JpdGVGaXhlZDMyLDQsdC5oaSl9LFdyaXRlci5wcm90b3R5cGUuc2ZpeGVkNjQ9V3JpdGVyLnByb3RvdHlwZS5maXhlZDY0LFdyaXRlci5wcm90b3R5cGUuZmxvYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3B1c2gobWluaW1hbC5mbG9hdC53cml0ZUZsb2F0TEUsNCxlKX0sV3JpdGVyLnByb3RvdHlwZS5kb3VibGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3B1c2gobWluaW1hbC5mbG9hdC53cml0ZURvdWJsZUxFLDgsZSl9O3ZhciB3cml0ZUJ5dGVzPW1pbmltYWwuQXJyYXkucHJvdG90eXBlLnNldD9mdW5jdGlvbihlLHQsYSl7dC5zZXQoZSxhKX06ZnVuY3Rpb24oZSx0LGEpe2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7KytyKXRbYStyXT1lW3JdfTtXcml0ZXIucHJvdG90eXBlLmJ5dGVzPWZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoPj4+MDtpZighdClyZXR1cm4gdGhpcy5fcHVzaCh3cml0ZUJ5dGUsMSwwKTtpZihtaW5pbWFsLmlzU3RyaW5nKGUpKXt2YXIgYT1Xcml0ZXIuYWxsb2ModD1iYXNlNjQubGVuZ3RoKGUpKTtiYXNlNjQuZGVjb2RlKGUsYSwwKSxlPWF9cmV0dXJuIHRoaXMudWludDMyKHQpLl9wdXNoKHdyaXRlQnl0ZXMsdCxlKX0sV3JpdGVyLnByb3RvdHlwZS5zdHJpbmc9ZnVuY3Rpb24oZSl7dmFyIHQ9dXRmOC5sZW5ndGgoZSk7cmV0dXJuIHQ/dGhpcy51aW50MzIodCkuX3B1c2godXRmOC53cml0ZSx0LGUpOnRoaXMuX3B1c2god3JpdGVCeXRlLDEsMCl9LFdyaXRlci5wcm90b3R5cGUuZm9yaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlcz1uZXcgU3RhdGUodGhpcyksdGhpcy5oZWFkPXRoaXMudGFpbD1uZXcgT3Aobm9vcCwwLDApLHRoaXMubGVuPTAsdGhpc30sV3JpdGVyLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlcz8odGhpcy5oZWFkPXRoaXMuc3RhdGVzLmhlYWQsdGhpcy50YWlsPXRoaXMuc3RhdGVzLnRhaWwsdGhpcy5sZW49dGhpcy5zdGF0ZXMubGVuLHRoaXMuc3RhdGVzPXRoaXMuc3RhdGVzLm5leHQpOih0aGlzLmhlYWQ9dGhpcy50YWlsPW5ldyBPcChub29wLDAsMCksdGhpcy5sZW49MCksdGhpc30sV3JpdGVyLnByb3RvdHlwZS5sZGVsaW09ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmhlYWQsdD10aGlzLnRhaWwsYT10aGlzLmxlbjtyZXR1cm4gdGhpcy5yZXNldCgpLnVpbnQzMihhKSxhJiYodGhpcy50YWlsLm5leHQ9ZS5uZXh0LHRoaXMudGFpbD10LHRoaXMubGVuKz1hKSx0aGlzfSxXcml0ZXIucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLmhlYWQubmV4dCx0PXRoaXMuY29uc3RydWN0b3IuYWxsb2ModGhpcy5sZW4pLGE9MDtlOyllLmZuKGUudmFsLHQsYSksYSs9ZS5sZW4sZT1lLm5leHQ7cmV0dXJuIHR9LFdyaXRlci5fY29uZmlndXJlPWZ1bmN0aW9uKGUpe0J1ZmZlcldyaXRlcj1lfTt2YXIgd3JpdGVyX2J1ZmZlcj1CdWZmZXJXcml0ZXIkMTsoQnVmZmVyV3JpdGVyJDEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUod3JpdGVyLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPUJ1ZmZlcldyaXRlciQxO3ZhciBCdWZmZXI9bWluaW1hbC5CdWZmZXI7ZnVuY3Rpb24gQnVmZmVyV3JpdGVyJDEoKXt3cml0ZXIuY2FsbCh0aGlzKX1CdWZmZXJXcml0ZXIkMS5hbGxvYz1mdW5jdGlvbihlKXtyZXR1cm4oQnVmZmVyV3JpdGVyJDEuYWxsb2M9bWluaW1hbC5fQnVmZmVyX2FsbG9jVW5zYWZlKShlKX07dmFyIHdyaXRlQnl0ZXNCdWZmZXI9QnVmZmVyJiZCdWZmZXIucHJvdG90eXBlIGluc3RhbmNlb2YgVWludDhBcnJheSYmXCJzZXRcIj09PUJ1ZmZlci5wcm90b3R5cGUuc2V0Lm5hbWU/ZnVuY3Rpb24oZSx0LGEpe3Quc2V0KGUsYSl9OmZ1bmN0aW9uKGUsdCxhKXtpZihlLmNvcHkpZS5jb3B5KHQsYSwwLGUubGVuZ3RoKTtlbHNlIGZvcih2YXIgcj0wO3I8ZS5sZW5ndGg7KXRbYSsrXT1lW3IrK119O2Z1bmN0aW9uIHdyaXRlU3RyaW5nQnVmZmVyKGUsdCxhKXtlLmxlbmd0aDw0MD9taW5pbWFsLnV0Zjgud3JpdGUoZSx0LGEpOnQudXRmOFdyaXRlKGUsYSl9QnVmZmVyV3JpdGVyJDEucHJvdG90eXBlLmJ5dGVzPWZ1bmN0aW9uKGUpe21pbmltYWwuaXNTdHJpbmcoZSkmJihlPW1pbmltYWwuX0J1ZmZlcl9mcm9tKGUsXCJiYXNlNjRcIikpO3ZhciB0PWUubGVuZ3RoPj4+MDtyZXR1cm4gdGhpcy51aW50MzIodCksdCYmdGhpcy5fcHVzaCh3cml0ZUJ5dGVzQnVmZmVyLHQsZSksdGhpc30sQnVmZmVyV3JpdGVyJDEucHJvdG90eXBlLnN0cmluZz1mdW5jdGlvbihlKXt2YXIgdD1CdWZmZXIuYnl0ZUxlbmd0aChlKTtyZXR1cm4gdGhpcy51aW50MzIodCksdCYmdGhpcy5fcHVzaCh3cml0ZVN0cmluZ0J1ZmZlcix0LGUpLHRoaXN9O3ZhciByZWFkZXI9UmVhZGVyLEJ1ZmZlclJlYWRlcixMb25nQml0cyQyPW1pbmltYWwuTG9uZ0JpdHMsdXRmOCQxPW1pbmltYWwudXRmODtmdW5jdGlvbiBpbmRleE91dE9mUmFuZ2UoZSx0KXtyZXR1cm4gUmFuZ2VFcnJvcihcImluZGV4IG91dCBvZiByYW5nZTogXCIrZS5wb3MrXCIgKyBcIisodHx8MSkrXCIgPiBcIitlLmxlbil9ZnVuY3Rpb24gUmVhZGVyKGUpe3RoaXMuYnVmPWUsdGhpcy5wb3M9MCx0aGlzLmxlbj1lLmxlbmd0aH12YXIgY3JlYXRlX2FycmF5PVwidW5kZWZpbmVkXCIhPXR5cGVvZiBVaW50OEFycmF5P2Z1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxBcnJheS5pc0FycmF5KGUpKXJldHVybiBuZXcgUmVhZGVyKGUpO3Rocm93IEVycm9yKFwiaWxsZWdhbCBidWZmZXJcIil9OmZ1bmN0aW9uKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIG5ldyBSZWFkZXIoZSk7dGhyb3cgRXJyb3IoXCJpbGxlZ2FsIGJ1ZmZlclwiKX07ZnVuY3Rpb24gcmVhZExvbmdWYXJpbnQoKXt2YXIgZT1uZXcgTG9uZ0JpdHMkMigwLDApLHQ9MDtpZighKHRoaXMubGVuLXRoaXMucG9zPjQpKXtmb3IoO3Q8MzsrK3Qpe2lmKHRoaXMucG9zPj10aGlzLmxlbil0aHJvdyBpbmRleE91dE9mUmFuZ2UodGhpcyk7aWYoZS5sbz0oZS5sb3woMTI3JnRoaXMuYnVmW3RoaXMucG9zXSk8PDcqdCk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gZX1yZXR1cm4gZS5sbz0oZS5sb3woMTI3JnRoaXMuYnVmW3RoaXMucG9zKytdKTw8Nyp0KT4+PjAsZX1mb3IoO3Q8NDsrK3QpaWYoZS5sbz0oZS5sb3woMTI3JnRoaXMuYnVmW3RoaXMucG9zXSk8PDcqdCk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gZTtpZihlLmxvPShlLmxvfCgxMjcmdGhpcy5idWZbdGhpcy5wb3NdKTw8MjgpPj4+MCxlLmhpPShlLmhpfCgxMjcmdGhpcy5idWZbdGhpcy5wb3NdKT4+NCk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gZTtpZih0PTAsdGhpcy5sZW4tdGhpcy5wb3M+NCl7Zm9yKDt0PDU7Kyt0KWlmKGUuaGk9KGUuaGl8KDEyNyZ0aGlzLmJ1Zlt0aGlzLnBvc10pPDw3KnQrMyk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gZX1lbHNlIGZvcig7dDw1OysrdCl7aWYodGhpcy5wb3M+PXRoaXMubGVuKXRocm93IGluZGV4T3V0T2ZSYW5nZSh0aGlzKTtpZihlLmhpPShlLmhpfCgxMjcmdGhpcy5idWZbdGhpcy5wb3NdKTw8Nyp0KzMpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpcmV0dXJuIGV9dGhyb3cgRXJyb3IoXCJpbnZhbGlkIHZhcmludCBlbmNvZGluZ1wiKX1mdW5jdGlvbiByZWFkRml4ZWQzMl9lbmQoZSx0KXtyZXR1cm4oZVt0LTRdfGVbdC0zXTw8OHxlW3QtMl08PDE2fGVbdC0xXTw8MjQpPj4+MH1mdW5jdGlvbiByZWFkRml4ZWQ2NCgpe2lmKHRoaXMucG9zKzg+dGhpcy5sZW4pdGhyb3cgaW5kZXhPdXRPZlJhbmdlKHRoaXMsOCk7cmV0dXJuIG5ldyBMb25nQml0cyQyKHJlYWRGaXhlZDMyX2VuZCh0aGlzLmJ1Zix0aGlzLnBvcys9NCkscmVhZEZpeGVkMzJfZW5kKHRoaXMuYnVmLHRoaXMucG9zKz00KSl9UmVhZGVyLmNyZWF0ZT1taW5pbWFsLkJ1ZmZlcj9mdW5jdGlvbihlKXtyZXR1cm4oUmVhZGVyLmNyZWF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gbWluaW1hbC5CdWZmZXIuaXNCdWZmZXIoZSk/bmV3IEJ1ZmZlclJlYWRlcihlKTpjcmVhdGVfYXJyYXkoZSl9KShlKX06Y3JlYXRlX2FycmF5LFJlYWRlci5wcm90b3R5cGUuX3NsaWNlPW1pbmltYWwuQXJyYXkucHJvdG90eXBlLnN1YmFycmF5fHxtaW5pbWFsLkFycmF5LnByb3RvdHlwZS5zbGljZSxSZWFkZXIucHJvdG90eXBlLnVpbnQzMj1mdW5jdGlvbigpe3ZhciBlPTQyOTQ5NjcyOTU7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoZT0oMTI3JnRoaXMuYnVmW3RoaXMucG9zXSk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gZTtpZihlPShlfCgxMjcmdGhpcy5idWZbdGhpcy5wb3NdKTw8Nyk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gZTtpZihlPShlfCgxMjcmdGhpcy5idWZbdGhpcy5wb3NdKTw8MTQpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpcmV0dXJuIGU7aWYoZT0oZXwoMTI3JnRoaXMuYnVmW3RoaXMucG9zXSk8PDIxKT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiBlO2lmKGU9KGV8KDE1JnRoaXMuYnVmW3RoaXMucG9zXSk8PDI4KT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiBlO2lmKCh0aGlzLnBvcys9NSk+dGhpcy5sZW4pdGhyb3cgdGhpcy5wb3M9dGhpcy5sZW4saW5kZXhPdXRPZlJhbmdlKHRoaXMsMTApO3JldHVybiBlfX0oKSxSZWFkZXIucHJvdG90eXBlLmludDMyPWZ1bmN0aW9uKCl7cmV0dXJuIDB8dGhpcy51aW50MzIoKX0sUmVhZGVyLnByb3RvdHlwZS5zaW50MzI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnVpbnQzMigpO3JldHVybiBlPj4+MV4tKDEmZSl8MH0sUmVhZGVyLnByb3RvdHlwZS5ib29sPWZ1bmN0aW9uKCl7cmV0dXJuIDAhPT10aGlzLnVpbnQzMigpfSxSZWFkZXIucHJvdG90eXBlLmZpeGVkMzI9ZnVuY3Rpb24oKXtpZih0aGlzLnBvcys0PnRoaXMubGVuKXRocm93IGluZGV4T3V0T2ZSYW5nZSh0aGlzLDQpO3JldHVybiByZWFkRml4ZWQzMl9lbmQodGhpcy5idWYsdGhpcy5wb3MrPTQpfSxSZWFkZXIucHJvdG90eXBlLnNmaXhlZDMyPWZ1bmN0aW9uKCl7aWYodGhpcy5wb3MrND50aGlzLmxlbil0aHJvdyBpbmRleE91dE9mUmFuZ2UodGhpcyw0KTtyZXR1cm4gMHxyZWFkRml4ZWQzMl9lbmQodGhpcy5idWYsdGhpcy5wb3MrPTQpfSxSZWFkZXIucHJvdG90eXBlLmZsb2F0PWZ1bmN0aW9uKCl7aWYodGhpcy5wb3MrND50aGlzLmxlbil0aHJvdyBpbmRleE91dE9mUmFuZ2UodGhpcyw0KTt2YXIgZT1taW5pbWFsLmZsb2F0LnJlYWRGbG9hdExFKHRoaXMuYnVmLHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTQsZX0sUmVhZGVyLnByb3RvdHlwZS5kb3VibGU9ZnVuY3Rpb24oKXtpZih0aGlzLnBvcys4PnRoaXMubGVuKXRocm93IGluZGV4T3V0T2ZSYW5nZSh0aGlzLDQpO3ZhciBlPW1pbmltYWwuZmxvYXQucmVhZERvdWJsZUxFKHRoaXMuYnVmLHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTgsZX0sUmVhZGVyLnByb3RvdHlwZS5ieXRlcz1mdW5jdGlvbigpe3ZhciBlPXRoaXMudWludDMyKCksdD10aGlzLnBvcyxhPXRoaXMucG9zK2U7aWYoYT50aGlzLmxlbil0aHJvdyBpbmRleE91dE9mUmFuZ2UodGhpcyxlKTtyZXR1cm4gdGhpcy5wb3MrPWUsQXJyYXkuaXNBcnJheSh0aGlzLmJ1Zik/dGhpcy5idWYuc2xpY2UodCxhKTp0PT09YT9uZXcgdGhpcy5idWYuY29uc3RydWN0b3IoMCk6dGhpcy5fc2xpY2UuY2FsbCh0aGlzLmJ1Zix0LGEpfSxSZWFkZXIucHJvdG90eXBlLnN0cmluZz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuYnl0ZXMoKTtyZXR1cm4gdXRmOCQxLnJlYWQoZSwwLGUubGVuZ3RoKX0sUmVhZGVyLnByb3RvdHlwZS5za2lwPWZ1bmN0aW9uKGUpe2lmKFwibnVtYmVyXCI9PXR5cGVvZiBlKXtpZih0aGlzLnBvcytlPnRoaXMubGVuKXRocm93IGluZGV4T3V0T2ZSYW5nZSh0aGlzLGUpO3RoaXMucG9zKz1lfWVsc2UgZG97aWYodGhpcy5wb3M+PXRoaXMubGVuKXRocm93IGluZGV4T3V0T2ZSYW5nZSh0aGlzKX13aGlsZSgxMjgmdGhpcy5idWZbdGhpcy5wb3MrK10pO3JldHVybiB0aGlzfSxSZWFkZXIucHJvdG90eXBlLnNraXBUeXBlPWZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlIDA6dGhpcy5za2lwKCk7YnJlYWs7Y2FzZSAxOnRoaXMuc2tpcCg4KTticmVhaztjYXNlIDI6dGhpcy5za2lwKHRoaXMudWludDMyKCkpO2JyZWFrO2Nhc2UgMzpmb3IoOzspe2lmKDQ9PShlPTcmdGhpcy51aW50MzIoKSkpYnJlYWs7dGhpcy5za2lwVHlwZShlKX1icmVhaztjYXNlIDU6dGhpcy5za2lwKDQpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoXCJpbnZhbGlkIHdpcmUgdHlwZSBcIitlK1wiIGF0IG9mZnNldCBcIit0aGlzLnBvcyl9cmV0dXJuIHRoaXN9LFJlYWRlci5fY29uZmlndXJlPWZ1bmN0aW9uKGUpe0J1ZmZlclJlYWRlcj1lO3ZhciB0PW1pbmltYWwuTG9uZz9cInRvTG9uZ1wiOlwidG9OdW1iZXJcIjttaW5pbWFsLm1lcmdlKFJlYWRlci5wcm90b3R5cGUse2ludDY0OmZ1bmN0aW9uKCl7cmV0dXJuIHJlYWRMb25nVmFyaW50LmNhbGwodGhpcylbdF0oITEpfSx1aW50NjQ6ZnVuY3Rpb24oKXtyZXR1cm4gcmVhZExvbmdWYXJpbnQuY2FsbCh0aGlzKVt0XSghMCl9LHNpbnQ2NDpmdW5jdGlvbigpe3JldHVybiByZWFkTG9uZ1ZhcmludC5jYWxsKHRoaXMpLnp6RGVjb2RlKClbdF0oITEpfSxmaXhlZDY0OmZ1bmN0aW9uKCl7cmV0dXJuIHJlYWRGaXhlZDY0LmNhbGwodGhpcylbdF0oITApfSxzZml4ZWQ2NDpmdW5jdGlvbigpe3JldHVybiByZWFkRml4ZWQ2NC5jYWxsKHRoaXMpW3RdKCExKX19KX07dmFyIHJlYWRlcl9idWZmZXI9QnVmZmVyUmVhZGVyJDE7ZnVuY3Rpb24gQnVmZmVyUmVhZGVyJDEoZSl7cmVhZGVyLmNhbGwodGhpcyxlKX0oQnVmZmVyUmVhZGVyJDEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUocmVhZGVyLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPUJ1ZmZlclJlYWRlciQxLG1pbmltYWwuQnVmZmVyJiYoQnVmZmVyUmVhZGVyJDEucHJvdG90eXBlLl9zbGljZT1taW5pbWFsLkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UpLEJ1ZmZlclJlYWRlciQxLnByb3RvdHlwZS5zdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnVpbnQzMigpO3JldHVybiB0aGlzLmJ1Zi51dGY4U2xpY2UodGhpcy5wb3MsdGhpcy5wb3M9TWF0aC5taW4odGhpcy5wb3MrZSx0aGlzLmxlbikpfTt2YXIgc2VydmljZT1TZXJ2aWNlO2Z1bmN0aW9uIFNlcnZpY2UoZSx0LGEpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUpdGhyb3cgVHlwZUVycm9yKFwicnBjSW1wbCBtdXN0IGJlIGEgZnVuY3Rpb25cIik7bWluaW1hbC5FdmVudEVtaXR0ZXIuY2FsbCh0aGlzKSx0aGlzLnJwY0ltcGw9ZSx0aGlzLnJlcXVlc3REZWxpbWl0ZWQ9Qm9vbGVhbih0KSx0aGlzLnJlc3BvbnNlRGVsaW1pdGVkPUJvb2xlYW4oYSl9KFNlcnZpY2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobWluaW1hbC5FdmVudEVtaXR0ZXIucHJvdG90eXBlKSkuY29uc3RydWN0b3I9U2VydmljZSxTZXJ2aWNlLnByb3RvdHlwZS5ycGNDYWxsPWZ1bmN0aW9uIGUodCxhLHIsbixvKXtpZighbil0aHJvdyBUeXBlRXJyb3IoXCJyZXF1ZXN0IG11c3QgYmUgc3BlY2lmaWVkXCIpO3ZhciBzPXRoaXM7aWYoIW8pcmV0dXJuIG1pbmltYWwuYXNQcm9taXNlKGUscyx0LGEscixuKTtpZihzLnJwY0ltcGwpdHJ5e3JldHVybiBzLnJwY0ltcGwodCxhW3MucmVxdWVzdERlbGltaXRlZD9cImVuY29kZURlbGltaXRlZFwiOlwiZW5jb2RlXCJdKG4pLmZpbmlzaCgpLGZ1bmN0aW9uKGUsYSl7aWYoZSlyZXR1cm4gcy5lbWl0KFwiZXJyb3JcIixlLHQpLG8oZSk7aWYobnVsbCE9PWEpe2lmKCEoYSBpbnN0YW5jZW9mIHIpKXRyeXthPXJbcy5yZXNwb25zZURlbGltaXRlZD9cImRlY29kZURlbGltaXRlZFwiOlwiZGVjb2RlXCJdKGEpfWNhdGNoKGUpe3JldHVybiBzLmVtaXQoXCJlcnJvclwiLGUsdCksbyhlKX1yZXR1cm4gcy5lbWl0KFwiZGF0YVwiLGEsdCksbyhudWxsLGEpfXMuZW5kKCEwKX0pfWNhdGNoKGUpe3JldHVybiBzLmVtaXQoXCJlcnJvclwiLGUsdCksdm9pZCBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7byhlKX0sMCl9ZWxzZSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7byhFcnJvcihcImFscmVhZHkgZW5kZWRcIikpfSwwKX0sU2VydmljZS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJwY0ltcGwmJihlfHx0aGlzLnJwY0ltcGwobnVsbCxudWxsLG51bGwpLHRoaXMucnBjSW1wbD1udWxsLHRoaXMuZW1pdChcImVuZFwiKS5vZmYoKSksdGhpc307dmFyIHJwY18xPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKGUsdCl7dC5TZXJ2aWNlPXNlcnZpY2V9KSxyb290cz17fSxpbmRleE1pbmltYWw9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSx0KXt2YXIgYT10O2Z1bmN0aW9uIHIoKXthLlJlYWRlci5fY29uZmlndXJlKGEuQnVmZmVyUmVhZGVyKSxhLnV0aWwuX2NvbmZpZ3VyZSgpfWEuYnVpbGQ9XCJtaW5pbWFsXCIsYS5Xcml0ZXI9d3JpdGVyLGEuQnVmZmVyV3JpdGVyPXdyaXRlcl9idWZmZXIsYS5SZWFkZXI9cmVhZGVyLGEuQnVmZmVyUmVhZGVyPXJlYWRlcl9idWZmZXIsYS51dGlsPW1pbmltYWwsYS5ycGM9cnBjXzEsYS5yb290cz1yb290cyxhLmNvbmZpZ3VyZT1yLGEuV3JpdGVyLl9jb25maWd1cmUoYS5CdWZmZXJXcml0ZXIpLHIoKX0pLG1pbmltYWwkMT1pbmRleE1pbmltYWwsbWluaW1hbF8xPW1pbmltYWwkMS5yb290cyxtaW5pbWFsXzI9bWluaW1hbCQxLlJlYWRlcixtaW5pbWFsXzM9bWluaW1hbCQxLnV0aWwsJFJlYWRlcj1taW5pbWFsJDEuUmVhZGVyLCR1dGlsPW1pbmltYWwkMS51dGlsLCRyb290PW1pbmltYWwkMS5yb290cy5kZWZhdWx0fHwobWluaW1hbCQxLnJvb3RzLmRlZmF1bHQ9e30pOyRyb290LnRlbnNvcmZsb3c9ZnVuY3Rpb24oKXt2YXIgZSx0LGE9e307cmV0dXJuIGEuQW55PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxhPTA7YTx0Lmxlbmd0aDsrK2EpbnVsbCE9ZVt0W2FdXSYmKHRoaXNbdFthXV09ZVt0W2FdXSl9cmV0dXJuIGUucHJvdG90eXBlLnR5cGVVcmw9XCJcIixlLnByb3RvdHlwZS52YWx1ZT0kdXRpbC5uZXdCdWZmZXIoW10pLGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mICRSZWFkZXJ8fChlPSRSZWFkZXIuY3JlYXRlKGUpKTtmb3IodmFyIGE9dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3ICRyb290LnRlbnNvcmZsb3cuQW55O2UucG9zPGE7KXt2YXIgbj1lLnVpbnQzMigpO3N3aXRjaChuPj4+Myl7Y2FzZSAxOnIudHlwZVVybD1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMjpyLnZhbHVlPWUuYnl0ZXMoKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZuKX19cmV0dXJuIHJ9LGV9KCksYS5EYXRhVHlwZT0oZT17fSwodD1PYmplY3QuY3JlYXRlKGUpKVtlWzBdPVwiRFRfSU5WQUxJRFwiXT0wLHRbZVsxXT1cIkRUX0ZMT0FUXCJdPTEsdFtlWzJdPVwiRFRfRE9VQkxFXCJdPTIsdFtlWzNdPVwiRFRfSU5UMzJcIl09Myx0W2VbNF09XCJEVF9VSU5UOFwiXT00LHRbZVs1XT1cIkRUX0lOVDE2XCJdPTUsdFtlWzZdPVwiRFRfSU5UOFwiXT02LHRbZVs3XT1cIkRUX1NUUklOR1wiXT03LHRbZVs4XT1cIkRUX0NPTVBMRVg2NFwiXT04LHRbZVs5XT1cIkRUX0lOVDY0XCJdPTksdFtlWzEwXT1cIkRUX0JPT0xcIl09MTAsdFtlWzExXT1cIkRUX1FJTlQ4XCJdPTExLHRbZVsxMl09XCJEVF9RVUlOVDhcIl09MTIsdFtlWzEzXT1cIkRUX1FJTlQzMlwiXT0xMyx0W2VbMTRdPVwiRFRfQkZMT0FUMTZcIl09MTQsdFtlWzEwMV09XCJEVF9GTE9BVF9SRUZcIl09MTAxLHRbZVsxMDJdPVwiRFRfRE9VQkxFX1JFRlwiXT0xMDIsdFtlWzEwM109XCJEVF9JTlQzMl9SRUZcIl09MTAzLHRbZVsxMDRdPVwiRFRfVUlOVDhfUkVGXCJdPTEwNCx0W2VbMTA1XT1cIkRUX0lOVDE2X1JFRlwiXT0xMDUsdFtlWzEwNl09XCJEVF9JTlQ4X1JFRlwiXT0xMDYsdFtlWzEwN109XCJEVF9TVFJJTkdfUkVGXCJdPTEwNyx0W2VbMTA4XT1cIkRUX0NPTVBMRVg2NF9SRUZcIl09MTA4LHRbZVsxMDldPVwiRFRfSU5UNjRfUkVGXCJdPTEwOSx0W2VbMTEwXT1cIkRUX0JPT0xfUkVGXCJdPTExMCx0W2VbMTExXT1cIkRUX1FJTlQ4X1JFRlwiXT0xMTEsdFtlWzExMl09XCJEVF9RVUlOVDhfUkVGXCJdPTExMix0W2VbMTEzXT1cIkRUX1FJTlQzMl9SRUZcIl09MTEzLHRbZVsxMTRdPVwiRFRfQkZMT0FUMTZfUkVGXCJdPTExNCx0KSxhLlRlbnNvclNoYXBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZih0aGlzLmRpbT1bXSxlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxhPTA7YTx0Lmxlbmd0aDsrK2EpbnVsbCE9ZVt0W2FdXSYmKHRoaXNbdFthXV09ZVt0W2FdXSl9cmV0dXJuIGUucHJvdG90eXBlLmRpbT0kdXRpbC5lbXB0eUFycmF5LGUucHJvdG90eXBlLnVua25vd25SYW5rPSExLGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mICRSZWFkZXJ8fChlPSRSZWFkZXIuY3JlYXRlKGUpKTtmb3IodmFyIGE9dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3ICRyb290LnRlbnNvcmZsb3cuVGVuc29yU2hhcGU7ZS5wb3M8YTspe3ZhciBuPWUudWludDMyKCk7c3dpdGNoKG4+Pj4zKXtjYXNlIDI6ci5kaW0mJnIuZGltLmxlbmd0aHx8KHIuZGltPVtdKSxyLmRpbS5wdXNoKCRyb290LnRlbnNvcmZsb3cuVGVuc29yU2hhcGUuRGltLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDM6ci51bmtub3duUmFuaz1lLmJvb2woKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZuKX19cmV0dXJuIHJ9LGUuRGltPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxhPTA7YTx0Lmxlbmd0aDsrK2EpbnVsbCE9ZVt0W2FdXSYmKHRoaXNbdFthXV09ZVt0W2FdXSl9cmV0dXJuIGUucHJvdG90eXBlLnNpemU9JHV0aWwuTG9uZz8kdXRpbC5Mb25nLmZyb21CaXRzKDAsMCwhMSk6MCxlLnByb3RvdHlwZS5uYW1lPVwiXCIsZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgJFJlYWRlcnx8KGU9JFJlYWRlci5jcmVhdGUoZSkpO2Zvcih2YXIgYT12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgJHJvb3QudGVuc29yZmxvdy5UZW5zb3JTaGFwZS5EaW07ZS5wb3M8YTspe3ZhciBuPWUudWludDMyKCk7c3dpdGNoKG4+Pj4zKXtjYXNlIDE6ci5zaXplPWUuaW50NjQoKTticmVhaztjYXNlIDI6ci5uYW1lPWUuc3RyaW5nKCk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbil9fXJldHVybiByfSxlfSgpLGV9KCksYS5UZW5zb3I9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMuZmxvYXRWYWw9W10sdGhpcy5kb3VibGVWYWw9W10sdGhpcy5pbnRWYWw9W10sdGhpcy5zdHJpbmdWYWw9W10sdGhpcy5zY29tcGxleFZhbD1bXSx0aGlzLmludDY0VmFsPVtdLHRoaXMuYm9vbFZhbD1bXSx0aGlzLnVpbnQzMlZhbD1bXSx0aGlzLnVpbnQ2NFZhbD1bXSxlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxhPTA7YTx0Lmxlbmd0aDsrK2EpbnVsbCE9ZVt0W2FdXSYmKHRoaXNbdFthXV09ZVt0W2FdXSl9cmV0dXJuIGUucHJvdG90eXBlLmR0eXBlPTAsZS5wcm90b3R5cGUudGVuc29yU2hhcGU9bnVsbCxlLnByb3RvdHlwZS52ZXJzaW9uTnVtYmVyPTAsZS5wcm90b3R5cGUudGVuc29yQ29udGVudD0kdXRpbC5uZXdCdWZmZXIoW10pLGUucHJvdG90eXBlLmZsb2F0VmFsPSR1dGlsLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuZG91YmxlVmFsPSR1dGlsLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuaW50VmFsPSR1dGlsLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuc3RyaW5nVmFsPSR1dGlsLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuc2NvbXBsZXhWYWw9JHV0aWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5pbnQ2NFZhbD0kdXRpbC5lbXB0eUFycmF5LGUucHJvdG90eXBlLmJvb2xWYWw9JHV0aWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS51aW50MzJWYWw9JHV0aWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS51aW50NjRWYWw9JHV0aWwuZW1wdHlBcnJheSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiAkUmVhZGVyfHwoZT0kUmVhZGVyLmNyZWF0ZShlKSk7Zm9yKHZhciBhPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyAkcm9vdC50ZW5zb3JmbG93LlRlbnNvcjtlLnBvczxhOyl7dmFyIG49ZS51aW50MzIoKTtzd2l0Y2gobj4+PjMpe2Nhc2UgMTpyLmR0eXBlPWUuaW50MzIoKTticmVhaztjYXNlIDI6ci50ZW5zb3JTaGFwZT0kcm9vdC50ZW5zb3JmbG93LlRlbnNvclNoYXBlLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgMzpyLnZlcnNpb25OdW1iZXI9ZS5pbnQzMigpO2JyZWFrO2Nhc2UgNDpyLnRlbnNvckNvbnRlbnQ9ZS5ieXRlcygpO2JyZWFrO2Nhc2UgNTppZihyLmZsb2F0VmFsJiZyLmZsb2F0VmFsLmxlbmd0aHx8KHIuZmxvYXRWYWw9W10pLDI9PSg3Jm4pKWZvcih2YXIgbz1lLnVpbnQzMigpK2UucG9zO2UucG9zPG87KXIuZmxvYXRWYWwucHVzaChlLmZsb2F0KCkpO2Vsc2Ugci5mbG9hdFZhbC5wdXNoKGUuZmxvYXQoKSk7YnJlYWs7Y2FzZSA2OmlmKHIuZG91YmxlVmFsJiZyLmRvdWJsZVZhbC5sZW5ndGh8fChyLmRvdWJsZVZhbD1bXSksMj09KDcmbikpZm9yKG89ZS51aW50MzIoKStlLnBvcztlLnBvczxvOylyLmRvdWJsZVZhbC5wdXNoKGUuZG91YmxlKCkpO2Vsc2Ugci5kb3VibGVWYWwucHVzaChlLmRvdWJsZSgpKTticmVhaztjYXNlIDc6aWYoci5pbnRWYWwmJnIuaW50VmFsLmxlbmd0aHx8KHIuaW50VmFsPVtdKSwyPT0oNyZuKSlmb3Iobz1lLnVpbnQzMigpK2UucG9zO2UucG9zPG87KXIuaW50VmFsLnB1c2goZS5pbnQzMigpKTtlbHNlIHIuaW50VmFsLnB1c2goZS5pbnQzMigpKTticmVhaztjYXNlIDg6ci5zdHJpbmdWYWwmJnIuc3RyaW5nVmFsLmxlbmd0aHx8KHIuc3RyaW5nVmFsPVtdKSxyLnN0cmluZ1ZhbC5wdXNoKGUuYnl0ZXMoKSk7YnJlYWs7Y2FzZSA5OmlmKHIuc2NvbXBsZXhWYWwmJnIuc2NvbXBsZXhWYWwubGVuZ3RofHwoci5zY29tcGxleFZhbD1bXSksMj09KDcmbikpZm9yKG89ZS51aW50MzIoKStlLnBvcztlLnBvczxvOylyLnNjb21wbGV4VmFsLnB1c2goZS5mbG9hdCgpKTtlbHNlIHIuc2NvbXBsZXhWYWwucHVzaChlLmZsb2F0KCkpO2JyZWFrO2Nhc2UgMTA6aWYoci5pbnQ2NFZhbCYmci5pbnQ2NFZhbC5sZW5ndGh8fChyLmludDY0VmFsPVtdKSwyPT0oNyZuKSlmb3Iobz1lLnVpbnQzMigpK2UucG9zO2UucG9zPG87KXIuaW50NjRWYWwucHVzaChlLmludDY0KCkpO2Vsc2Ugci5pbnQ2NFZhbC5wdXNoKGUuaW50NjQoKSk7YnJlYWs7Y2FzZSAxMTppZihyLmJvb2xWYWwmJnIuYm9vbFZhbC5sZW5ndGh8fChyLmJvb2xWYWw9W10pLDI9PSg3Jm4pKWZvcihvPWUudWludDMyKCkrZS5wb3M7ZS5wb3M8bzspci5ib29sVmFsLnB1c2goZS5ib29sKCkpO2Vsc2Ugci5ib29sVmFsLnB1c2goZS5ib29sKCkpO2JyZWFrO2Nhc2UgMTY6aWYoci51aW50MzJWYWwmJnIudWludDMyVmFsLmxlbmd0aHx8KHIudWludDMyVmFsPVtdKSwyPT0oNyZuKSlmb3Iobz1lLnVpbnQzMigpK2UucG9zO2UucG9zPG87KXIudWludDMyVmFsLnB1c2goZS51aW50MzIoKSk7ZWxzZSByLnVpbnQzMlZhbC5wdXNoKGUudWludDMyKCkpO2JyZWFrO2Nhc2UgMTc6aWYoci51aW50NjRWYWwmJnIudWludDY0VmFsLmxlbmd0aHx8KHIudWludDY0VmFsPVtdKSwyPT0oNyZuKSlmb3Iobz1lLnVpbnQzMigpK2UucG9zO2UucG9zPG87KXIudWludDY0VmFsLnB1c2goZS51aW50NjQoKSk7ZWxzZSByLnVpbnQ2NFZhbC5wdXNoKGUudWludDY0KCkpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm4pfX1yZXR1cm4gcn0sZX0oKSxhLkF0dHJWYWx1ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYoZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksYT0wO2E8dC5sZW5ndGg7KythKW51bGwhPWVbdFthXV0mJih0aGlzW3RbYV1dPWVbdFthXV0pfXZhciB0O3JldHVybiBlLnByb3RvdHlwZS5saXN0PW51bGwsZS5wcm90b3R5cGUucz0kdXRpbC5uZXdCdWZmZXIoW10pLGUucHJvdG90eXBlLmk9JHV0aWwuTG9uZz8kdXRpbC5Mb25nLmZyb21CaXRzKDAsMCwhMSk6MCxlLnByb3RvdHlwZS5mPTAsZS5wcm90b3R5cGUuYj0hMSxlLnByb3RvdHlwZS50eXBlPTAsZS5wcm90b3R5cGUuc2hhcGU9bnVsbCxlLnByb3RvdHlwZS50ZW5zb3I9bnVsbCxlLnByb3RvdHlwZS5wbGFjZWhvbGRlcj1cIlwiLGUucHJvdG90eXBlLmZ1bmM9bnVsbCxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJ2YWx1ZVwiLHtnZXQ6JHV0aWwub25lT2ZHZXR0ZXIodD1bXCJsaXN0XCIsXCJzXCIsXCJpXCIsXCJmXCIsXCJiXCIsXCJ0eXBlXCIsXCJzaGFwZVwiLFwidGVuc29yXCIsXCJwbGFjZWhvbGRlclwiLFwiZnVuY1wiXSksc2V0OiR1dGlsLm9uZU9mU2V0dGVyKHQpfSksZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgJFJlYWRlcnx8KGU9JFJlYWRlci5jcmVhdGUoZSkpO2Zvcih2YXIgYT12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgJHJvb3QudGVuc29yZmxvdy5BdHRyVmFsdWU7ZS5wb3M8YTspe3ZhciBuPWUudWludDMyKCk7c3dpdGNoKG4+Pj4zKXtjYXNlIDE6ci5saXN0PSRyb290LnRlbnNvcmZsb3cuQXR0clZhbHVlLkxpc3RWYWx1ZS5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDI6ci5zPWUuYnl0ZXMoKTticmVhaztjYXNlIDM6ci5pPWUuaW50NjQoKTticmVhaztjYXNlIDQ6ci5mPWUuZmxvYXQoKTticmVhaztjYXNlIDU6ci5iPWUuYm9vbCgpO2JyZWFrO2Nhc2UgNjpyLnR5cGU9ZS5pbnQzMigpO2JyZWFrO2Nhc2UgNzpyLnNoYXBlPSRyb290LnRlbnNvcmZsb3cuVGVuc29yU2hhcGUuZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSA4OnIudGVuc29yPSRyb290LnRlbnNvcmZsb3cuVGVuc29yLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgOTpyLnBsYWNlaG9sZGVyPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSAxMDpyLmZ1bmM9JHJvb3QudGVuc29yZmxvdy5OYW1lQXR0ckxpc3QuZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbil9fXJldHVybiByfSxlLkxpc3RWYWx1ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYodGhpcy5zPVtdLHRoaXMuaT1bXSx0aGlzLmY9W10sdGhpcy5iPVtdLHRoaXMudHlwZT1bXSx0aGlzLnNoYXBlPVtdLHRoaXMudGVuc29yPVtdLHRoaXMuZnVuYz1bXSxlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxhPTA7YTx0Lmxlbmd0aDsrK2EpbnVsbCE9ZVt0W2FdXSYmKHRoaXNbdFthXV09ZVt0W2FdXSl9cmV0dXJuIGUucHJvdG90eXBlLnM9JHV0aWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5pPSR1dGlsLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuZj0kdXRpbC5lbXB0eUFycmF5LGUucHJvdG90eXBlLmI9JHV0aWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS50eXBlPSR1dGlsLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuc2hhcGU9JHV0aWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS50ZW5zb3I9JHV0aWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5mdW5jPSR1dGlsLmVtcHR5QXJyYXksZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgJFJlYWRlcnx8KGU9JFJlYWRlci5jcmVhdGUoZSkpO2Zvcih2YXIgYT12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgJHJvb3QudGVuc29yZmxvdy5BdHRyVmFsdWUuTGlzdFZhbHVlO2UucG9zPGE7KXt2YXIgbj1lLnVpbnQzMigpO3N3aXRjaChuPj4+Myl7Y2FzZSAyOnIucyYmci5zLmxlbmd0aHx8KHIucz1bXSksci5zLnB1c2goZS5ieXRlcygpKTticmVhaztjYXNlIDM6aWYoci5pJiZyLmkubGVuZ3RofHwoci5pPVtdKSwyPT0oNyZuKSlmb3IodmFyIG89ZS51aW50MzIoKStlLnBvcztlLnBvczxvOylyLmkucHVzaChlLmludDY0KCkpO2Vsc2Ugci5pLnB1c2goZS5pbnQ2NCgpKTticmVhaztjYXNlIDQ6aWYoci5mJiZyLmYubGVuZ3RofHwoci5mPVtdKSwyPT0oNyZuKSlmb3Iobz1lLnVpbnQzMigpK2UucG9zO2UucG9zPG87KXIuZi5wdXNoKGUuZmxvYXQoKSk7ZWxzZSByLmYucHVzaChlLmZsb2F0KCkpO2JyZWFrO2Nhc2UgNTppZihyLmImJnIuYi5sZW5ndGh8fChyLmI9W10pLDI9PSg3Jm4pKWZvcihvPWUudWludDMyKCkrZS5wb3M7ZS5wb3M8bzspci5iLnB1c2goZS5ib29sKCkpO2Vsc2Ugci5iLnB1c2goZS5ib29sKCkpO2JyZWFrO2Nhc2UgNjppZihyLnR5cGUmJnIudHlwZS5sZW5ndGh8fChyLnR5cGU9W10pLDI9PSg3Jm4pKWZvcihvPWUudWludDMyKCkrZS5wb3M7ZS5wb3M8bzspci50eXBlLnB1c2goZS5pbnQzMigpKTtlbHNlIHIudHlwZS5wdXNoKGUuaW50MzIoKSk7YnJlYWs7Y2FzZSA3OnIuc2hhcGUmJnIuc2hhcGUubGVuZ3RofHwoci5zaGFwZT1bXSksci5zaGFwZS5wdXNoKCRyb290LnRlbnNvcmZsb3cuVGVuc29yU2hhcGUuZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgODpyLnRlbnNvciYmci50ZW5zb3IubGVuZ3RofHwoci50ZW5zb3I9W10pLHIudGVuc29yLnB1c2goJHJvb3QudGVuc29yZmxvdy5UZW5zb3IuZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgOTpyLmZ1bmMmJnIuZnVuYy5sZW5ndGh8fChyLmZ1bmM9W10pLHIuZnVuYy5wdXNoKCRyb290LnRlbnNvcmZsb3cuTmFtZUF0dHJMaXN0LmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZuKX19cmV0dXJuIHJ9LGV9KCksZX0oKSxhLk5hbWVBdHRyTGlzdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYodGhpcy5hdHRyPXt9LGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLGE9MDthPHQubGVuZ3RoOysrYSludWxsIT1lW3RbYV1dJiYodGhpc1t0W2FdXT1lW3RbYV1dKX1yZXR1cm4gZS5wcm90b3R5cGUubmFtZT1cIlwiLGUucHJvdG90eXBlLmF0dHI9JHV0aWwuZW1wdHlPYmplY3QsZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgJFJlYWRlcnx8KGU9JFJlYWRlci5jcmVhdGUoZSkpO2Zvcih2YXIgYSxyPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxuPW5ldyAkcm9vdC50ZW5zb3JmbG93Lk5hbWVBdHRyTGlzdDtlLnBvczxyOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpuLm5hbWU9ZS5zdHJpbmcoKTticmVhaztjYXNlIDI6ZS5za2lwKCkucG9zKyssbi5hdHRyPT09JHV0aWwuZW1wdHlPYmplY3QmJihuLmF0dHI9e30pLGE9ZS5zdHJpbmcoKSxlLnBvcysrLG4uYXR0clthXT0kcm9vdC50ZW5zb3JmbG93LkF0dHJWYWx1ZS5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKX19cmV0dXJuIG59LGV9KCksYS5Ob2RlRGVmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZih0aGlzLmlucHV0PVtdLHRoaXMuYXR0cj17fSxlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxhPTA7YTx0Lmxlbmd0aDsrK2EpbnVsbCE9ZVt0W2FdXSYmKHRoaXNbdFthXV09ZVt0W2FdXSl9cmV0dXJuIGUucHJvdG90eXBlLm5hbWU9XCJcIixlLnByb3RvdHlwZS5vcD1cIlwiLGUucHJvdG90eXBlLmlucHV0PSR1dGlsLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuZGV2aWNlPVwiXCIsZS5wcm90b3R5cGUuYXR0cj0kdXRpbC5lbXB0eU9iamVjdCxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiAkUmVhZGVyfHwoZT0kUmVhZGVyLmNyZWF0ZShlKSk7Zm9yKHZhciBhLHI9dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LG49bmV3ICRyb290LnRlbnNvcmZsb3cuTm9kZURlZjtlLnBvczxyOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpuLm5hbWU9ZS5zdHJpbmcoKTticmVhaztjYXNlIDI6bi5vcD1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMzpuLmlucHV0JiZuLmlucHV0Lmxlbmd0aHx8KG4uaW5wdXQ9W10pLG4uaW5wdXQucHVzaChlLnN0cmluZygpKTticmVhaztjYXNlIDQ6bi5kZXZpY2U9ZS5zdHJpbmcoKTticmVhaztjYXNlIDU6ZS5za2lwKCkucG9zKyssbi5hdHRyPT09JHV0aWwuZW1wdHlPYmplY3QmJihuLmF0dHI9e30pLGE9ZS5zdHJpbmcoKSxlLnBvcysrLG4uYXR0clthXT0kcm9vdC50ZW5zb3JmbG93LkF0dHJWYWx1ZS5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKX19cmV0dXJuIG59LGV9KCksYS5WZXJzaW9uRGVmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZih0aGlzLmJhZENvbnN1bWVycz1bXSxlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxhPTA7YTx0Lmxlbmd0aDsrK2EpbnVsbCE9ZVt0W2FdXSYmKHRoaXNbdFthXV09ZVt0W2FdXSl9cmV0dXJuIGUucHJvdG90eXBlLnByb2R1Y2VyPTAsZS5wcm90b3R5cGUubWluQ29uc3VtZXI9MCxlLnByb3RvdHlwZS5iYWRDb25zdW1lcnM9JHV0aWwuZW1wdHlBcnJheSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiAkUmVhZGVyfHwoZT0kUmVhZGVyLmNyZWF0ZShlKSk7Zm9yKHZhciBhPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyAkcm9vdC50ZW5zb3JmbG93LlZlcnNpb25EZWY7ZS5wb3M8YTspe3ZhciBuPWUudWludDMyKCk7c3dpdGNoKG4+Pj4zKXtjYXNlIDE6ci5wcm9kdWNlcj1lLmludDMyKCk7YnJlYWs7Y2FzZSAyOnIubWluQ29uc3VtZXI9ZS5pbnQzMigpO2JyZWFrO2Nhc2UgMzppZihyLmJhZENvbnN1bWVycyYmci5iYWRDb25zdW1lcnMubGVuZ3RofHwoci5iYWRDb25zdW1lcnM9W10pLDI9PSg3Jm4pKWZvcih2YXIgbz1lLnVpbnQzMigpK2UucG9zO2UucG9zPG87KXIuYmFkQ29uc3VtZXJzLnB1c2goZS5pbnQzMigpKTtlbHNlIHIuYmFkQ29uc3VtZXJzLnB1c2goZS5pbnQzMigpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZuKX19cmV0dXJuIHJ9LGV9KCksYS5HcmFwaERlZj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYodGhpcy5ub2RlPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLGE9MDthPHQubGVuZ3RoOysrYSludWxsIT1lW3RbYV1dJiYodGhpc1t0W2FdXT1lW3RbYV1dKX1yZXR1cm4gZS5wcm90b3R5cGUubm9kZT0kdXRpbC5lbXB0eUFycmF5LGUucHJvdG90eXBlLnZlcnNpb25zPW51bGwsZS5wcm90b3R5cGUubGlicmFyeT1udWxsLGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mICRSZWFkZXJ8fChlPSRSZWFkZXIuY3JlYXRlKGUpKTtmb3IodmFyIGE9dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3ICRyb290LnRlbnNvcmZsb3cuR3JhcGhEZWY7ZS5wb3M8YTspe3ZhciBuPWUudWludDMyKCk7c3dpdGNoKG4+Pj4zKXtjYXNlIDE6ci5ub2RlJiZyLm5vZGUubGVuZ3RofHwoci5ub2RlPVtdKSxyLm5vZGUucHVzaCgkcm9vdC50ZW5zb3JmbG93Lk5vZGVEZWYuZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgNDpyLnZlcnNpb25zPSRyb290LnRlbnNvcmZsb3cuVmVyc2lvbkRlZi5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDI6ci5saWJyYXJ5PSRyb290LnRlbnNvcmZsb3cuRnVuY3Rpb25EZWZMaWJyYXJ5LmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm4pfX1yZXR1cm4gcn0sZX0oKSxhLkNvbGxlY3Rpb25EZWY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLGE9MDthPHQubGVuZ3RoOysrYSludWxsIT1lW3RbYV1dJiYodGhpc1t0W2FdXT1lW3RbYV1dKX12YXIgdDtyZXR1cm4gZS5wcm90b3R5cGUubm9kZUxpc3Q9bnVsbCxlLnByb3RvdHlwZS5ieXRlc0xpc3Q9bnVsbCxlLnByb3RvdHlwZS5pbnQ2NExpc3Q9bnVsbCxlLnByb3RvdHlwZS5mbG9hdExpc3Q9bnVsbCxlLnByb3RvdHlwZS5hbnlMaXN0PW51bGwsT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwia2luZFwiLHtnZXQ6JHV0aWwub25lT2ZHZXR0ZXIodD1bXCJub2RlTGlzdFwiLFwiYnl0ZXNMaXN0XCIsXCJpbnQ2NExpc3RcIixcImZsb2F0TGlzdFwiLFwiYW55TGlzdFwiXSksc2V0OiR1dGlsLm9uZU9mU2V0dGVyKHQpfSksZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgJFJlYWRlcnx8KGU9JFJlYWRlci5jcmVhdGUoZSkpO2Zvcih2YXIgYT12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgJHJvb3QudGVuc29yZmxvdy5Db2xsZWN0aW9uRGVmO2UucG9zPGE7KXt2YXIgbj1lLnVpbnQzMigpO3N3aXRjaChuPj4+Myl7Y2FzZSAxOnIubm9kZUxpc3Q9JHJvb3QudGVuc29yZmxvdy5Db2xsZWN0aW9uRGVmLk5vZGVMaXN0LmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgMjpyLmJ5dGVzTGlzdD0kcm9vdC50ZW5zb3JmbG93LkNvbGxlY3Rpb25EZWYuQnl0ZXNMaXN0LmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgMzpyLmludDY0TGlzdD0kcm9vdC50ZW5zb3JmbG93LkNvbGxlY3Rpb25EZWYuSW50NjRMaXN0LmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgNDpyLmZsb2F0TGlzdD0kcm9vdC50ZW5zb3JmbG93LkNvbGxlY3Rpb25EZWYuRmxvYXRMaXN0LmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgNTpyLmFueUxpc3Q9JHJvb3QudGVuc29yZmxvdy5Db2xsZWN0aW9uRGVmLkFueUxpc3QuZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbil9fXJldHVybiByfSxlLk5vZGVMaXN0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZih0aGlzLnZhbHVlPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLGE9MDthPHQubGVuZ3RoOysrYSludWxsIT1lW3RbYV1dJiYodGhpc1t0W2FdXT1lW3RbYV1dKX1yZXR1cm4gZS5wcm90b3R5cGUudmFsdWU9JHV0aWwuZW1wdHlBcnJheSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiAkUmVhZGVyfHwoZT0kUmVhZGVyLmNyZWF0ZShlKSk7Zm9yKHZhciBhPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyAkcm9vdC50ZW5zb3JmbG93LkNvbGxlY3Rpb25EZWYuTm9kZUxpc3Q7ZS5wb3M8YTspe3ZhciBuPWUudWludDMyKCk7c3dpdGNoKG4+Pj4zKXtjYXNlIDE6ci52YWx1ZSYmci52YWx1ZS5sZW5ndGh8fChyLnZhbHVlPVtdKSxyLnZhbHVlLnB1c2goZS5zdHJpbmcoKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbil9fXJldHVybiByfSxlfSgpLGUuQnl0ZXNMaXN0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZih0aGlzLnZhbHVlPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLGE9MDthPHQubGVuZ3RoOysrYSludWxsIT1lW3RbYV1dJiYodGhpc1t0W2FdXT1lW3RbYV1dKX1yZXR1cm4gZS5wcm90b3R5cGUudmFsdWU9JHV0aWwuZW1wdHlBcnJheSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiAkUmVhZGVyfHwoZT0kUmVhZGVyLmNyZWF0ZShlKSk7Zm9yKHZhciBhPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyAkcm9vdC50ZW5zb3JmbG93LkNvbGxlY3Rpb25EZWYuQnl0ZXNMaXN0O2UucG9zPGE7KXt2YXIgbj1lLnVpbnQzMigpO3N3aXRjaChuPj4+Myl7Y2FzZSAxOnIudmFsdWUmJnIudmFsdWUubGVuZ3RofHwoci52YWx1ZT1bXSksci52YWx1ZS5wdXNoKGUuYnl0ZXMoKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbil9fXJldHVybiByfSxlfSgpLGUuSW50NjRMaXN0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZih0aGlzLnZhbHVlPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLGE9MDthPHQubGVuZ3RoOysrYSludWxsIT1lW3RbYV1dJiYodGhpc1t0W2FdXT1lW3RbYV1dKX1yZXR1cm4gZS5wcm90b3R5cGUudmFsdWU9JHV0aWwuZW1wdHlBcnJheSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiAkUmVhZGVyfHwoZT0kUmVhZGVyLmNyZWF0ZShlKSk7Zm9yKHZhciBhPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyAkcm9vdC50ZW5zb3JmbG93LkNvbGxlY3Rpb25EZWYuSW50NjRMaXN0O2UucG9zPGE7KXt2YXIgbj1lLnVpbnQzMigpO3N3aXRjaChuPj4+Myl7Y2FzZSAxOmlmKHIudmFsdWUmJnIudmFsdWUubGVuZ3RofHwoci52YWx1ZT1bXSksMj09KDcmbikpZm9yKHZhciBvPWUudWludDMyKCkrZS5wb3M7ZS5wb3M8bzspci52YWx1ZS5wdXNoKGUuaW50NjQoKSk7ZWxzZSByLnZhbHVlLnB1c2goZS5pbnQ2NCgpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZuKX19cmV0dXJuIHJ9LGV9KCksZS5GbG9hdExpc3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMudmFsdWU9W10sZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksYT0wO2E8dC5sZW5ndGg7KythKW51bGwhPWVbdFthXV0mJih0aGlzW3RbYV1dPWVbdFthXV0pfXJldHVybiBlLnByb3RvdHlwZS52YWx1ZT0kdXRpbC5lbXB0eUFycmF5LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mICRSZWFkZXJ8fChlPSRSZWFkZXIuY3JlYXRlKGUpKTtmb3IodmFyIGE9dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3ICRyb290LnRlbnNvcmZsb3cuQ29sbGVjdGlvbkRlZi5GbG9hdExpc3Q7ZS5wb3M8YTspe3ZhciBuPWUudWludDMyKCk7c3dpdGNoKG4+Pj4zKXtjYXNlIDE6aWYoci52YWx1ZSYmci52YWx1ZS5sZW5ndGh8fChyLnZhbHVlPVtdKSwyPT0oNyZuKSlmb3IodmFyIG89ZS51aW50MzIoKStlLnBvcztlLnBvczxvOylyLnZhbHVlLnB1c2goZS5mbG9hdCgpKTtlbHNlIHIudmFsdWUucHVzaChlLmZsb2F0KCkpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm4pfX1yZXR1cm4gcn0sZX0oKSxlLkFueUxpc3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMudmFsdWU9W10sZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksYT0wO2E8dC5sZW5ndGg7KythKW51bGwhPWVbdFthXV0mJih0aGlzW3RbYV1dPWVbdFthXV0pfXJldHVybiBlLnByb3RvdHlwZS52YWx1ZT0kdXRpbC5lbXB0eUFycmF5LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mICRSZWFkZXJ8fChlPSRSZWFkZXIuY3JlYXRlKGUpKTtmb3IodmFyIGE9dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3ICRyb290LnRlbnNvcmZsb3cuQ29sbGVjdGlvbkRlZi5BbnlMaXN0O2UucG9zPGE7KXt2YXIgbj1lLnVpbnQzMigpO3N3aXRjaChuPj4+Myl7Y2FzZSAxOnIudmFsdWUmJnIudmFsdWUubGVuZ3RofHwoci52YWx1ZT1bXSksci52YWx1ZS5wdXNoKCRyb290LnRlbnNvcmZsb3cuQW55LmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZuKX19cmV0dXJuIHJ9LGV9KCksZX0oKSxhLlNhdmVyRGVmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxhPTA7YTx0Lmxlbmd0aDsrK2EpbnVsbCE9ZVt0W2FdXSYmKHRoaXNbdFthXV09ZVt0W2FdXSl9dmFyIHQsYTtyZXR1cm4gZS5wcm90b3R5cGUuZmlsZW5hbWVUZW5zb3JOYW1lPVwiXCIsZS5wcm90b3R5cGUuc2F2ZVRlbnNvck5hbWU9XCJcIixlLnByb3RvdHlwZS5yZXN0b3JlT3BOYW1lPVwiXCIsZS5wcm90b3R5cGUubWF4VG9LZWVwPTAsZS5wcm90b3R5cGUuc2hhcmRlZD0hMSxlLnByb3RvdHlwZS5rZWVwQ2hlY2twb2ludEV2ZXJ5TkhvdXJzPTAsZS5wcm90b3R5cGUudmVyc2lvbj0wLGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mICRSZWFkZXJ8fChlPSRSZWFkZXIuY3JlYXRlKGUpKTtmb3IodmFyIGE9dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3ICRyb290LnRlbnNvcmZsb3cuU2F2ZXJEZWY7ZS5wb3M8YTspe3ZhciBuPWUudWludDMyKCk7c3dpdGNoKG4+Pj4zKXtjYXNlIDE6ci5maWxlbmFtZVRlbnNvck5hbWU9ZS5zdHJpbmcoKTticmVhaztjYXNlIDI6ci5zYXZlVGVuc29yTmFtZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMzpyLnJlc3RvcmVPcE5hbWU9ZS5zdHJpbmcoKTticmVhaztjYXNlIDQ6ci5tYXhUb0tlZXA9ZS5pbnQzMigpO2JyZWFrO2Nhc2UgNTpyLnNoYXJkZWQ9ZS5ib29sKCk7YnJlYWs7Y2FzZSA2OnIua2VlcENoZWNrcG9pbnRFdmVyeU5Ib3Vycz1lLmZsb2F0KCk7YnJlYWs7Y2FzZSA3OnIudmVyc2lvbj1lLmludDMyKCk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbil9fXJldHVybiByfSxlLkNoZWNrcG9pbnRGb3JtYXRWZXJzaW9uPSh0PXt9LChhPU9iamVjdC5jcmVhdGUodCkpW3RbMF09XCJMRUdBQ1lcIl09MCxhW3RbMV09XCJWMVwiXT0xLGFbdFsyXT1cIlYyXCJdPTIsYSksZX0oKSxhLlRlbnNvckluZm89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLGE9MDthPHQubGVuZ3RoOysrYSludWxsIT1lW3RbYV1dJiYodGhpc1t0W2FdXT1lW3RbYV1dKX12YXIgdDtyZXR1cm4gZS5wcm90b3R5cGUubmFtZT1cIlwiLGUucHJvdG90eXBlLmNvb1NwYXJzZT1udWxsLGUucHJvdG90eXBlLmR0eXBlPTAsZS5wcm90b3R5cGUudGVuc29yU2hhcGU9bnVsbCxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJlbmNvZGluZ1wiLHtnZXQ6JHV0aWwub25lT2ZHZXR0ZXIodD1bXCJuYW1lXCIsXCJjb29TcGFyc2VcIl0pLHNldDokdXRpbC5vbmVPZlNldHRlcih0KX0pLGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mICRSZWFkZXJ8fChlPSRSZWFkZXIuY3JlYXRlKGUpKTtmb3IodmFyIGE9dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3ICRyb290LnRlbnNvcmZsb3cuVGVuc29ySW5mbztlLnBvczxhOyl7dmFyIG49ZS51aW50MzIoKTtzd2l0Y2gobj4+PjMpe2Nhc2UgMTpyLm5hbWU9ZS5zdHJpbmcoKTticmVhaztjYXNlIDQ6ci5jb29TcGFyc2U9JHJvb3QudGVuc29yZmxvdy5UZW5zb3JJbmZvLkNvb1NwYXJzZS5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDI6ci5kdHlwZT1lLmludDMyKCk7YnJlYWs7Y2FzZSAzOnIudGVuc29yU2hhcGU9JHJvb3QudGVuc29yZmxvdy5UZW5zb3JTaGFwZS5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZuKX19cmV0dXJuIHJ9LGUuQ29vU3BhcnNlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxhPTA7YTx0Lmxlbmd0aDsrK2EpbnVsbCE9ZVt0W2FdXSYmKHRoaXNbdFthXV09ZVt0W2FdXSl9cmV0dXJuIGUucHJvdG90eXBlLnZhbHVlc1RlbnNvck5hbWU9XCJcIixlLnByb3RvdHlwZS5pbmRpY2VzVGVuc29yTmFtZT1cIlwiLGUucHJvdG90eXBlLmRlbnNlU2hhcGVUZW5zb3JOYW1lPVwiXCIsZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgJFJlYWRlcnx8KGU9JFJlYWRlci5jcmVhdGUoZSkpO2Zvcih2YXIgYT12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgJHJvb3QudGVuc29yZmxvdy5UZW5zb3JJbmZvLkNvb1NwYXJzZTtlLnBvczxhOyl7dmFyIG49ZS51aW50MzIoKTtzd2l0Y2gobj4+PjMpe2Nhc2UgMTpyLnZhbHVlc1RlbnNvck5hbWU9ZS5zdHJpbmcoKTticmVhaztjYXNlIDI6ci5pbmRpY2VzVGVuc29yTmFtZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMzpyLmRlbnNlU2hhcGVUZW5zb3JOYW1lPWUuc3RyaW5nKCk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbil9fXJldHVybiByfSxlfSgpLGV9KCksYS5TaWduYXR1cmVEZWY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMuaW5wdXRzPXt9LHRoaXMub3V0cHV0cz17fSxlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxhPTA7YTx0Lmxlbmd0aDsrK2EpbnVsbCE9ZVt0W2FdXSYmKHRoaXNbdFthXV09ZVt0W2FdXSl9cmV0dXJuIGUucHJvdG90eXBlLmlucHV0cz0kdXRpbC5lbXB0eU9iamVjdCxlLnByb3RvdHlwZS5vdXRwdXRzPSR1dGlsLmVtcHR5T2JqZWN0LGUucHJvdG90eXBlLm1ldGhvZE5hbWU9XCJcIixlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiAkUmVhZGVyfHwoZT0kUmVhZGVyLmNyZWF0ZShlKSk7Zm9yKHZhciBhLHI9dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LG49bmV3ICRyb290LnRlbnNvcmZsb3cuU2lnbmF0dXJlRGVmO2UucG9zPHI7KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOmUuc2tpcCgpLnBvcysrLG4uaW5wdXRzPT09JHV0aWwuZW1wdHlPYmplY3QmJihuLmlucHV0cz17fSksYT1lLnN0cmluZygpLGUucG9zKyssbi5pbnB1dHNbYV09JHJvb3QudGVuc29yZmxvdy5UZW5zb3JJbmZvLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgMjplLnNraXAoKS5wb3MrKyxuLm91dHB1dHM9PT0kdXRpbC5lbXB0eU9iamVjdCYmKG4ub3V0cHV0cz17fSksYT1lLnN0cmluZygpLGUucG9zKyssbi5vdXRwdXRzW2FdPSRyb290LnRlbnNvcmZsb3cuVGVuc29ySW5mby5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDM6bi5tZXRob2ROYW1lPWUuc3RyaW5nKCk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyl9fXJldHVybiBufSxlfSgpLGEuQXNzZXRGaWxlRGVmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxhPTA7YTx0Lmxlbmd0aDsrK2EpbnVsbCE9ZVt0W2FdXSYmKHRoaXNbdFthXV09ZVt0W2FdXSl9cmV0dXJuIGUucHJvdG90eXBlLnRlbnNvckluZm89bnVsbCxlLnByb3RvdHlwZS5maWxlbmFtZT1cIlwiLGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mICRSZWFkZXJ8fChlPSRSZWFkZXIuY3JlYXRlKGUpKTtmb3IodmFyIGE9dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3ICRyb290LnRlbnNvcmZsb3cuQXNzZXRGaWxlRGVmO2UucG9zPGE7KXt2YXIgbj1lLnVpbnQzMigpO3N3aXRjaChuPj4+Myl7Y2FzZSAxOnIudGVuc29ySW5mbz0kcm9vdC50ZW5zb3JmbG93LlRlbnNvckluZm8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSAyOnIuZmlsZW5hbWU9ZS5zdHJpbmcoKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZuKX19cmV0dXJuIHJ9LGV9KCksYS5PcERlZj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYodGhpcy5pbnB1dEFyZz1bXSx0aGlzLm91dHB1dEFyZz1bXSx0aGlzLmF0dHI9W10sZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksYT0wO2E8dC5sZW5ndGg7KythKW51bGwhPWVbdFthXV0mJih0aGlzW3RbYV1dPWVbdFthXV0pfXJldHVybiBlLnByb3RvdHlwZS5uYW1lPVwiXCIsZS5wcm90b3R5cGUuaW5wdXRBcmc9JHV0aWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5vdXRwdXRBcmc9JHV0aWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5hdHRyPSR1dGlsLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuZGVwcmVjYXRpb249bnVsbCxlLnByb3RvdHlwZS5zdW1tYXJ5PVwiXCIsZS5wcm90b3R5cGUuZGVzY3JpcHRpb249XCJcIixlLnByb3RvdHlwZS5pc0NvbW11dGF0aXZlPSExLGUucHJvdG90eXBlLmlzQWdncmVnYXRlPSExLGUucHJvdG90eXBlLmlzU3RhdGVmdWw9ITEsZS5wcm90b3R5cGUuYWxsb3dzVW5pbml0aWFsaXplZElucHV0PSExLGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mICRSZWFkZXJ8fChlPSRSZWFkZXIuY3JlYXRlKGUpKTtmb3IodmFyIGE9dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3ICRyb290LnRlbnNvcmZsb3cuT3BEZWY7ZS5wb3M8YTspe3ZhciBuPWUudWludDMyKCk7c3dpdGNoKG4+Pj4zKXtjYXNlIDE6ci5uYW1lPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSAyOnIuaW5wdXRBcmcmJnIuaW5wdXRBcmcubGVuZ3RofHwoci5pbnB1dEFyZz1bXSksci5pbnB1dEFyZy5wdXNoKCRyb290LnRlbnNvcmZsb3cuT3BEZWYuQXJnRGVmLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDM6ci5vdXRwdXRBcmcmJnIub3V0cHV0QXJnLmxlbmd0aHx8KHIub3V0cHV0QXJnPVtdKSxyLm91dHB1dEFyZy5wdXNoKCRyb290LnRlbnNvcmZsb3cuT3BEZWYuQXJnRGVmLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDQ6ci5hdHRyJiZyLmF0dHIubGVuZ3RofHwoci5hdHRyPVtdKSxyLmF0dHIucHVzaCgkcm9vdC50ZW5zb3JmbG93Lk9wRGVmLkF0dHJEZWYuZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgODpyLmRlcHJlY2F0aW9uPSRyb290LnRlbnNvcmZsb3cuT3BEZWYuT3BEZXByZWNhdGlvbi5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDU6ci5zdW1tYXJ5PWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA2OnIuZGVzY3JpcHRpb249ZS5zdHJpbmcoKTticmVhaztjYXNlIDE4OnIuaXNDb21tdXRhdGl2ZT1lLmJvb2woKTticmVhaztjYXNlIDE2OnIuaXNBZ2dyZWdhdGU9ZS5ib29sKCk7YnJlYWs7Y2FzZSAxNzpyLmlzU3RhdGVmdWw9ZS5ib29sKCk7YnJlYWs7Y2FzZSAxOTpyLmFsbG93c1VuaW5pdGlhbGl6ZWRJbnB1dD1lLmJvb2woKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZuKX19cmV0dXJuIHJ9LGUuQXJnRGVmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxhPTA7YTx0Lmxlbmd0aDsrK2EpbnVsbCE9ZVt0W2FdXSYmKHRoaXNbdFthXV09ZVt0W2FdXSl9cmV0dXJuIGUucHJvdG90eXBlLm5hbWU9XCJcIixlLnByb3RvdHlwZS5kZXNjcmlwdGlvbj1cIlwiLGUucHJvdG90eXBlLnR5cGU9MCxlLnByb3RvdHlwZS50eXBlQXR0cj1cIlwiLGUucHJvdG90eXBlLm51bWJlckF0dHI9XCJcIixlLnByb3RvdHlwZS50eXBlTGlzdEF0dHI9XCJcIixlLnByb3RvdHlwZS5pc1JlZj0hMSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiAkUmVhZGVyfHwoZT0kUmVhZGVyLmNyZWF0ZShlKSk7Zm9yKHZhciBhPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyAkcm9vdC50ZW5zb3JmbG93Lk9wRGVmLkFyZ0RlZjtlLnBvczxhOyl7dmFyIG49ZS51aW50MzIoKTtzd2l0Y2gobj4+PjMpe2Nhc2UgMTpyLm5hbWU9ZS5zdHJpbmcoKTticmVhaztjYXNlIDI6ci5kZXNjcmlwdGlvbj1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMzpyLnR5cGU9ZS5pbnQzMigpO2JyZWFrO2Nhc2UgNDpyLnR5cGVBdHRyPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA1OnIubnVtYmVyQXR0cj1lLnN0cmluZygpO2JyZWFrO2Nhc2UgNjpyLnR5cGVMaXN0QXR0cj1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMTY6ci5pc1JlZj1lLmJvb2woKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZuKX19cmV0dXJuIHJ9LGV9KCksZS5BdHRyRGVmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxhPTA7YTx0Lmxlbmd0aDsrK2EpbnVsbCE9ZVt0W2FdXSYmKHRoaXNbdFthXV09ZVt0W2FdXSl9cmV0dXJuIGUucHJvdG90eXBlLm5hbWU9XCJcIixlLnByb3RvdHlwZS50eXBlPVwiXCIsZS5wcm90b3R5cGUuZGVmYXVsdFZhbHVlPW51bGwsZS5wcm90b3R5cGUuZGVzY3JpcHRpb249XCJcIixlLnByb3RvdHlwZS5oYXNNaW5pbXVtPSExLGUucHJvdG90eXBlLm1pbmltdW09JHV0aWwuTG9uZz8kdXRpbC5Mb25nLmZyb21CaXRzKDAsMCwhMSk6MCxlLnByb3RvdHlwZS5hbGxvd2VkVmFsdWVzPW51bGwsZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgJFJlYWRlcnx8KGU9JFJlYWRlci5jcmVhdGUoZSkpO2Zvcih2YXIgYT12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgJHJvb3QudGVuc29yZmxvdy5PcERlZi5BdHRyRGVmO2UucG9zPGE7KXt2YXIgbj1lLnVpbnQzMigpO3N3aXRjaChuPj4+Myl7Y2FzZSAxOnIubmFtZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMjpyLnR5cGU9ZS5zdHJpbmcoKTticmVhaztjYXNlIDM6ci5kZWZhdWx0VmFsdWU9JHJvb3QudGVuc29yZmxvdy5BdHRyVmFsdWUuZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSA0OnIuZGVzY3JpcHRpb249ZS5zdHJpbmcoKTticmVhaztjYXNlIDU6ci5oYXNNaW5pbXVtPWUuYm9vbCgpO2JyZWFrO2Nhc2UgNjpyLm1pbmltdW09ZS5pbnQ2NCgpO2JyZWFrO2Nhc2UgNzpyLmFsbG93ZWRWYWx1ZXM9JHJvb3QudGVuc29yZmxvdy5BdHRyVmFsdWUuZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbil9fXJldHVybiByfSxlfSgpLGUuT3BEZXByZWNhdGlvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYoZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksYT0wO2E8dC5sZW5ndGg7KythKW51bGwhPWVbdFthXV0mJih0aGlzW3RbYV1dPWVbdFthXV0pfXJldHVybiBlLnByb3RvdHlwZS52ZXJzaW9uPTAsZS5wcm90b3R5cGUuZXhwbGFuYXRpb249XCJcIixlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiAkUmVhZGVyfHwoZT0kUmVhZGVyLmNyZWF0ZShlKSk7Zm9yKHZhciBhPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyAkcm9vdC50ZW5zb3JmbG93Lk9wRGVmLk9wRGVwcmVjYXRpb247ZS5wb3M8YTspe3ZhciBuPWUudWludDMyKCk7c3dpdGNoKG4+Pj4zKXtjYXNlIDE6ci52ZXJzaW9uPWUuaW50MzIoKTticmVhaztjYXNlIDI6ci5leHBsYW5hdGlvbj1lLnN0cmluZygpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm4pfX1yZXR1cm4gcn0sZX0oKSxlfSgpLGEuT3BMaXN0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZih0aGlzLm9wPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLGE9MDthPHQubGVuZ3RoOysrYSludWxsIT1lW3RbYV1dJiYodGhpc1t0W2FdXT1lW3RbYV1dKX1yZXR1cm4gZS5wcm90b3R5cGUub3A9JHV0aWwuZW1wdHlBcnJheSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiAkUmVhZGVyfHwoZT0kUmVhZGVyLmNyZWF0ZShlKSk7Zm9yKHZhciBhPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyAkcm9vdC50ZW5zb3JmbG93Lk9wTGlzdDtlLnBvczxhOyl7dmFyIG49ZS51aW50MzIoKTtzd2l0Y2gobj4+PjMpe2Nhc2UgMTpyLm9wJiZyLm9wLmxlbmd0aHx8KHIub3A9W10pLHIub3AucHVzaCgkcm9vdC50ZW5zb3JmbG93Lk9wRGVmLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZuKX19cmV0dXJuIHJ9LGV9KCksYS5NZXRhR3JhcGhEZWY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMuY29sbGVjdGlvbkRlZj17fSx0aGlzLnNpZ25hdHVyZURlZj17fSx0aGlzLmFzc2V0RmlsZURlZj1bXSxlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxhPTA7YTx0Lmxlbmd0aDsrK2EpbnVsbCE9ZVt0W2FdXSYmKHRoaXNbdFthXV09ZVt0W2FdXSl9cmV0dXJuIGUucHJvdG90eXBlLm1ldGFJbmZvRGVmPW51bGwsZS5wcm90b3R5cGUuZ3JhcGhEZWY9bnVsbCxlLnByb3RvdHlwZS5zYXZlckRlZj1udWxsLGUucHJvdG90eXBlLmNvbGxlY3Rpb25EZWY9JHV0aWwuZW1wdHlPYmplY3QsZS5wcm90b3R5cGUuc2lnbmF0dXJlRGVmPSR1dGlsLmVtcHR5T2JqZWN0LGUucHJvdG90eXBlLmFzc2V0RmlsZURlZj0kdXRpbC5lbXB0eUFycmF5LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mICRSZWFkZXJ8fChlPSRSZWFkZXIuY3JlYXRlKGUpKTtmb3IodmFyIGEscj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qsbj1uZXcgJHJvb3QudGVuc29yZmxvdy5NZXRhR3JhcGhEZWY7ZS5wb3M8cjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6bi5tZXRhSW5mb0RlZj0kcm9vdC50ZW5zb3JmbG93Lk1ldGFHcmFwaERlZi5NZXRhSW5mb0RlZi5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDI6bi5ncmFwaERlZj0kcm9vdC50ZW5zb3JmbG93LkdyYXBoRGVmLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgMzpuLnNhdmVyRGVmPSRyb290LnRlbnNvcmZsb3cuU2F2ZXJEZWYuZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSA0OmUuc2tpcCgpLnBvcysrLG4uY29sbGVjdGlvbkRlZj09PSR1dGlsLmVtcHR5T2JqZWN0JiYobi5jb2xsZWN0aW9uRGVmPXt9KSxhPWUuc3RyaW5nKCksZS5wb3MrKyxuLmNvbGxlY3Rpb25EZWZbYV09JHJvb3QudGVuc29yZmxvdy5Db2xsZWN0aW9uRGVmLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgNTplLnNraXAoKS5wb3MrKyxuLnNpZ25hdHVyZURlZj09PSR1dGlsLmVtcHR5T2JqZWN0JiYobi5zaWduYXR1cmVEZWY9e30pLGE9ZS5zdHJpbmcoKSxlLnBvcysrLG4uc2lnbmF0dXJlRGVmW2FdPSRyb290LnRlbnNvcmZsb3cuU2lnbmF0dXJlRGVmLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgNjpuLmFzc2V0RmlsZURlZiYmbi5hc3NldEZpbGVEZWYubGVuZ3RofHwobi5hc3NldEZpbGVEZWY9W10pLG4uYXNzZXRGaWxlRGVmLnB1c2goJHJvb3QudGVuc29yZmxvdy5Bc3NldEZpbGVEZWYuZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pfX1yZXR1cm4gbn0sZS5NZXRhSW5mb0RlZj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYodGhpcy50YWdzPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLGE9MDthPHQubGVuZ3RoOysrYSludWxsIT1lW3RbYV1dJiYodGhpc1t0W2FdXT1lW3RbYV1dKX1yZXR1cm4gZS5wcm90b3R5cGUubWV0YUdyYXBoVmVyc2lvbj1cIlwiLGUucHJvdG90eXBlLnN0cmlwcGVkT3BMaXN0PW51bGwsZS5wcm90b3R5cGUuYW55SW5mbz1udWxsLGUucHJvdG90eXBlLnRhZ3M9JHV0aWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS50ZW5zb3JmbG93VmVyc2lvbj1cIlwiLGUucHJvdG90eXBlLnRlbnNvcmZsb3dHaXRWZXJzaW9uPVwiXCIsZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgJFJlYWRlcnx8KGU9JFJlYWRlci5jcmVhdGUoZSkpO2Zvcih2YXIgYT12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgJHJvb3QudGVuc29yZmxvdy5NZXRhR3JhcGhEZWYuTWV0YUluZm9EZWY7ZS5wb3M8YTspe3ZhciBuPWUudWludDMyKCk7c3dpdGNoKG4+Pj4zKXtjYXNlIDE6ci5tZXRhR3JhcGhWZXJzaW9uPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSAyOnIuc3RyaXBwZWRPcExpc3Q9JHJvb3QudGVuc29yZmxvdy5PcExpc3QuZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSAzOnIuYW55SW5mbz0kcm9vdC50ZW5zb3JmbG93LkFueS5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDQ6ci50YWdzJiZyLnRhZ3MubGVuZ3RofHwoci50YWdzPVtdKSxyLnRhZ3MucHVzaChlLnN0cmluZygpKTticmVhaztjYXNlIDU6ci50ZW5zb3JmbG93VmVyc2lvbj1lLnN0cmluZygpO2JyZWFrO2Nhc2UgNjpyLnRlbnNvcmZsb3dHaXRWZXJzaW9uPWUuc3RyaW5nKCk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbil9fXJldHVybiByfSxlfSgpLGV9KCksYS5TYXZlZE1vZGVsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZih0aGlzLm1ldGFHcmFwaHM9W10sZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksYT0wO2E8dC5sZW5ndGg7KythKW51bGwhPWVbdFthXV0mJih0aGlzW3RbYV1dPWVbdFthXV0pfXJldHVybiBlLnByb3RvdHlwZS5zYXZlZE1vZGVsU2NoZW1hVmVyc2lvbj0kdXRpbC5Mb25nPyR1dGlsLkxvbmcuZnJvbUJpdHMoMCwwLCExKTowLGUucHJvdG90eXBlLm1ldGFHcmFwaHM9JHV0aWwuZW1wdHlBcnJheSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiAkUmVhZGVyfHwoZT0kUmVhZGVyLmNyZWF0ZShlKSk7Zm9yKHZhciBhPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyAkcm9vdC50ZW5zb3JmbG93LlNhdmVkTW9kZWw7ZS5wb3M8YTspe3ZhciBuPWUudWludDMyKCk7c3dpdGNoKG4+Pj4zKXtjYXNlIDE6ci5zYXZlZE1vZGVsU2NoZW1hVmVyc2lvbj1lLmludDY0KCk7YnJlYWs7Y2FzZSAyOnIubWV0YUdyYXBocyYmci5tZXRhR3JhcGhzLmxlbmd0aHx8KHIubWV0YUdyYXBocz1bXSksci5tZXRhR3JhcGhzLnB1c2goJHJvb3QudGVuc29yZmxvdy5NZXRhR3JhcGhEZWYuZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm4pfX1yZXR1cm4gcn0sZX0oKSxhLkZ1bmN0aW9uRGVmTGlicmFyeT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYodGhpcy5mdW5jdGlvbj1bXSx0aGlzLmdyYWRpZW50PVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLGE9MDthPHQubGVuZ3RoOysrYSludWxsIT1lW3RbYV1dJiYodGhpc1t0W2FdXT1lW3RbYV1dKX1yZXR1cm4gZS5wcm90b3R5cGUuZnVuY3Rpb249JHV0aWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5ncmFkaWVudD0kdXRpbC5lbXB0eUFycmF5LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mICRSZWFkZXJ8fChlPSRSZWFkZXIuY3JlYXRlKGUpKTtmb3IodmFyIGE9dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3ICRyb290LnRlbnNvcmZsb3cuRnVuY3Rpb25EZWZMaWJyYXJ5O2UucG9zPGE7KXt2YXIgbj1lLnVpbnQzMigpO3N3aXRjaChuPj4+Myl7Y2FzZSAxOnIuZnVuY3Rpb24mJnIuZnVuY3Rpb24ubGVuZ3RofHwoci5mdW5jdGlvbj1bXSksci5mdW5jdGlvbi5wdXNoKCRyb290LnRlbnNvcmZsb3cuRnVuY3Rpb25EZWYuZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMjpyLmdyYWRpZW50JiZyLmdyYWRpZW50Lmxlbmd0aHx8KHIuZ3JhZGllbnQ9W10pLHIuZ3JhZGllbnQucHVzaCgkcm9vdC50ZW5zb3JmbG93LkdyYWRpZW50RGVmLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZuKX19cmV0dXJuIHJ9LGV9KCksYS5GdW5jdGlvbkRlZj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYodGhpcy5hdHRyPXt9LHRoaXMubm9kZURlZj1bXSx0aGlzLnJldD17fSxlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxhPTA7YTx0Lmxlbmd0aDsrK2EpbnVsbCE9ZVt0W2FdXSYmKHRoaXNbdFthXV09ZVt0W2FdXSl9cmV0dXJuIGUucHJvdG90eXBlLnNpZ25hdHVyZT1udWxsLGUucHJvdG90eXBlLmF0dHI9JHV0aWwuZW1wdHlPYmplY3QsZS5wcm90b3R5cGUubm9kZURlZj0kdXRpbC5lbXB0eUFycmF5LGUucHJvdG90eXBlLnJldD0kdXRpbC5lbXB0eU9iamVjdCxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiAkUmVhZGVyfHwoZT0kUmVhZGVyLmNyZWF0ZShlKSk7Zm9yKHZhciBhLHI9dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LG49bmV3ICRyb290LnRlbnNvcmZsb3cuRnVuY3Rpb25EZWY7ZS5wb3M8cjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6bi5zaWduYXR1cmU9JHJvb3QudGVuc29yZmxvdy5PcERlZi5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDU6ZS5za2lwKCkucG9zKyssbi5hdHRyPT09JHV0aWwuZW1wdHlPYmplY3QmJihuLmF0dHI9e30pLGE9ZS5zdHJpbmcoKSxlLnBvcysrLG4uYXR0clthXT0kcm9vdC50ZW5zb3JmbG93LkF0dHJWYWx1ZS5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDM6bi5ub2RlRGVmJiZuLm5vZGVEZWYubGVuZ3RofHwobi5ub2RlRGVmPVtdKSxuLm5vZGVEZWYucHVzaCgkcm9vdC50ZW5zb3JmbG93Lk5vZGVEZWYuZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgNDplLnNraXAoKS5wb3MrKyxuLnJldD09PSR1dGlsLmVtcHR5T2JqZWN0JiYobi5yZXQ9e30pLGE9ZS5zdHJpbmcoKSxlLnBvcysrLG4ucmV0W2FdPWUuc3RyaW5nKCk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyl9fXJldHVybiBufSxlfSgpLGEuR3JhZGllbnREZWY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLGE9MDthPHQubGVuZ3RoOysrYSludWxsIT1lW3RbYV1dJiYodGhpc1t0W2FdXT1lW3RbYV1dKX1yZXR1cm4gZS5wcm90b3R5cGUuZnVuY3Rpb25OYW1lPVwiXCIsZS5wcm90b3R5cGUuZ3JhZGllbnRGdW5jPVwiXCIsZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgJFJlYWRlcnx8KGU9JFJlYWRlci5jcmVhdGUoZSkpO2Zvcih2YXIgYT12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgJHJvb3QudGVuc29yZmxvdy5HcmFkaWVudERlZjtlLnBvczxhOyl7dmFyIG49ZS51aW50MzIoKTtzd2l0Y2gobj4+PjMpe2Nhc2UgMTpyLmZ1bmN0aW9uTmFtZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMjpyLmdyYWRpZW50RnVuYz1lLnN0cmluZygpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm4pfX1yZXR1cm4gcn0sZX0oKSxhfSgpO3ZhciBjb21waWxlZF9hcGk9JHJvb3QsY29tcGlsZWRfYXBpXzE9Y29tcGlsZWRfYXBpLnRlbnNvcmZsb3c7ZnVuY3Rpb24gZ2V0UGFyYW1WYWx1ZShlLHQsYSxyKXt2YXIgbj10LnBhcmFtc1tlXTtpZihuJiZ2b2lkIDAhPT1uLmlucHV0SW5kZXgpe2lmKFwidGVuc29yXCI9PT1uLnR5cGUpcmV0dXJuIGdldFRlbnNvcih0LmlucHV0TmFtZXNbbi5pbnB1dEluZGV4XSxhLHIpO2lmKFwidGVuc29yc1wiPT09bi50eXBlKXJldHVybigwPT09bi5pbnB1dEluZGV4PzA9PT1uLmlucHV0UGFyYW1MZW5ndGg/dC5pbnB1dE5hbWVzOnQuaW5wdXROYW1lcy5zbGljZShuLmlucHV0SW5kZXgsLW4uaW5wdXRQYXJhbUxlbmd0aCk6dC5pbnB1dE5hbWVzLnNwbGljZShuLmlucHV0SW5kZXgpKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGdldFRlbnNvcihlLGEscil9KTt2YXIgbz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChnZXRUZW5zb3IodC5pbnB1dE5hbWVzLnNsaWNlKG4uaW5wdXRJbmRleClbMF0sYSxyKS5kYXRhU3luYygpKTtyZXR1cm5cIm51bWJlclwiPT09bi50eXBlP29bMF06b31yZXR1cm4gbiYmbi52YWx1ZX1mdW5jdGlvbiBnZXRUZW5zb3IoZSx0LGEpe3ZhciByPXBhcnNlTm9kZU5hbWUoZSksbj1yWzBdLG89clsxXSxzPWEuY3VycmVudENvbnRleHRJZHMuZmluZChmdW5jdGlvbihlKXtyZXR1cm4hIXRbZ2V0Tm9kZU5hbWVXaXRoQ29udGV4dElkKG4sZSldfSk7cmV0dXJuIHZvaWQgMCE9PXM/dFtnZXROb2RlTmFtZVdpdGhDb250ZXh0SWQobixzKV1bb106dm9pZCAwfWZ1bmN0aW9uIGdldE5vZGVOYW1lQW5kSW5kZXgoZSx0KXt2YXIgYT1wYXJzZU5vZGVOYW1lKGUpLHI9YVswXSxuPWFbMV07cmV0dXJuW2dldE5vZGVOYW1lV2l0aENvbnRleHRJZChyLHQmJnQuY3VycmVudENvbnRleHRJZCksbl19ZnVuY3Rpb24gZ2V0Tm9kZU5hbWVXaXRoQ29udGV4dElkKGUsdCl7cmV0dXJuIHQ/ZStcIi1cIit0OmV9ZnVuY3Rpb24gcGFyc2VOb2RlTmFtZShlKXt2YXIgdD1lLmxhc3RJbmRleE9mKFwiOlwiKTtyZXR1cm4tMT09PXQ/W2UsMF06W2Uuc3Vic3RyaW5nKDAsdCksTnVtYmVyKGUuc3Vic3RyaW5nKHQrMSkpXX1mdW5jdGlvbiBzcGxpdCQxKGUsdCl7Zm9yKHZhciBhPVtdLHI9MDtyPGUubGVuZ3RoO3IrPXQpYS5wdXNoKGUuc2xpY2UocixyK3QpKTtyZXR1cm4gYX12YXIganNvbj1be3RmT3BOYW1lOlwiQWRkXCIsZGxPcE5hbWU6XCJhZGRcIixjYXRlZ29yeTpcImFyaXRobWV0aWNcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcImFcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcImJcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIkFkZE5cIixkbE9wTmFtZTpcImFkZE5cIixjYXRlZ29yeTpcImFyaXRobWV0aWNcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCx0ZklucHV0UGFyYW1MZW5ndGg6MCxkbFBhcmFtTmFtZTpcInRlbnNvcnNcIix0eXBlOlwidGVuc29yc1wifV19LHt0Zk9wTmFtZTpcIkJpYXNBZGRcIixkbE9wTmFtZTpcImFkZFwiLGNhdGVnb3J5OlwiYXJpdGhtZXRpY1wiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwiYVwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiYlwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiU3ViXCIsZGxPcE5hbWU6XCJzdWJcIixjYXRlZ29yeTpcImFyaXRobWV0aWNcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcImFcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcImJcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIlJlYWxEaXZcIixkbE9wTmFtZTpcImRpdlwiLGNhdGVnb3J5OlwiYXJpdGhtZXRpY1wiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwiYVwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiYlwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiRGl2XCIsZGxPcE5hbWU6XCJkaXZcIixjYXRlZ29yeTpcImFyaXRobWV0aWNcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcImFcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcImJcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIkZsb29yRGl2XCIsZGxPcE5hbWU6XCJmbG9vckRpdlwiLGNhdGVnb3J5OlwiYXJpdGhtZXRpY1wiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwiYVwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiYlwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiTXVsXCIsZGxPcE5hbWU6XCJtdWxcIixjYXRlZ29yeTpcImFyaXRobWV0aWNcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcImFcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcImJcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIk1heGltdW1cIixkbE9wTmFtZTpcIm1heGltdW1cIixjYXRlZ29yeTpcImFyaXRobWV0aWNcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcImFcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcImJcIix0eXBlOlwidGVuc29yXCJ9XX0se3RmT3BOYW1lOlwiTWluaW11bVwiLGRsT3BOYW1lOlwibWluaW11bVwiLGNhdGVnb3J5OlwiYXJpdGhtZXRpY1wiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwiYVwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiYlwiLHR5cGU6XCJ0ZW5zb3JcIn1dfSx7dGZPcE5hbWU6XCJQb3dcIixkbE9wTmFtZTpcInBvd1wiLGNhdGVnb3J5OlwiYXJpdGhtZXRpY1wiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwiYVwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiYlwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiU3F1YXJlZERpZmZlcmVuY2VcIixkbE9wTmFtZTpcInNxdWFyZWREaWZmZXJlbmNlXCIsY2F0ZWdvcnk6XCJhcml0aG1ldGljXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJhXCIsdHlwZTpcInRlbnNvclwifSx7dGZJbnB1dEluZGV4OjEsZGxQYXJhbU5hbWU6XCJiXCIsdHlwZTpcInRlbnNvclwifSx7dGZQYXJhbU5hbWU6XCJUXCIsZGxQYXJhbU5hbWU6XCJkdHlwZVwiLHR5cGU6XCJkdHlwZVwiLG5vdFN1cHBvcnRlZDohMH1dfSx7dGZPcE5hbWU6XCJNb2RcIixkbE9wTmFtZTpcIm1vZFwiLGNhdGVnb3J5OlwiYXJpdGhtZXRpY1wiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwiYVwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiYlwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiRmxvb3JNb2RcIixkbE9wTmFtZTpcIm1vZFwiLGNhdGVnb3J5OlwiYXJpdGhtZXRpY1wiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwiYVwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiYlwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX1dLGFyaXRobWV0aWM9T2JqZWN0LmZyZWV6ZSh7anNvbjpqc29ufSksanNvbiQxPVt7dGZPcE5hbWU6XCJBYnNcIixkbE9wTmFtZTpcImFic1wiLGNhdGVnb3J5OlwiYmFzaWNfbWF0aFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiQWNvc1wiLGRsT3BOYW1lOlwiYWNvc1wiLGNhdGVnb3J5OlwiYmFzaWNfbWF0aFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiQXNpblwiLGRsT3BOYW1lOlwiYXNpblwiLGNhdGVnb3J5OlwiYmFzaWNfbWF0aFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiYXRhblwiLGRsT3BOYW1lOlwiYXRhblwiLGNhdGVnb3J5OlwiYmFzaWNfbWF0aFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiQ2VpbFwiLGRsT3BOYW1lOlwiY2VpbFwiLGNhdGVnb3J5OlwiYmFzaWNfbWF0aFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiQ2xpcEJ5VmFsdWVcIixkbE9wTmFtZTpcImNsaXBCeVZhbHVlXCIsY2F0ZWdvcnk6XCJiYXNpY19tYXRoXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifSx7dGZQYXJhbU5hbWU6XCJjbGlwX3ZhbHVlX21pblwiLGRsUGFyYW1OYW1lOlwiY2xpcFZhbHVlTWluXCIsdHlwZTpcIm51bWJlclwifSx7dGZQYXJhbU5hbWU6XCJjbGlwX3ZhbHVlX21heFwiLGRsUGFyYW1OYW1lOlwiY2xpcFZhbHVlTWF4XCIsdHlwZTpcIm51bWJlclwifV19LHt0Zk9wTmFtZTpcIkNvc1wiLGRsT3BOYW1lOlwiY29zXCIsY2F0ZWdvcnk6XCJiYXNpY19tYXRoXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifSx7dGZQYXJhbU5hbWU6XCJUXCIsZGxQYXJhbU5hbWU6XCJkdHlwZVwiLHR5cGU6XCJkdHlwZVwiLG5vdFN1cHBvcnRlZDohMH1dfSx7dGZPcE5hbWU6XCJDb3NoXCIsZGxPcE5hbWU6XCJjb3NoXCIsY2F0ZWdvcnk6XCJiYXNpY19tYXRoXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifSx7dGZQYXJhbU5hbWU6XCJUXCIsZGxQYXJhbU5hbWU6XCJkdHlwZVwiLHR5cGU6XCJkdHlwZVwiLG5vdFN1cHBvcnRlZDohMH1dfSx7dGZPcE5hbWU6XCJFbHVcIixkbE9wTmFtZTpcImVsdVwiLGNhdGVnb3J5OlwiYmFzaWNfbWF0aFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiRXhwXCIsZGxPcE5hbWU6XCJleHBcIixjYXRlZ29yeTpcImJhc2ljX21hdGhcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIkZsb29yXCIsZGxPcE5hbWU6XCJmbG9vclwiLGNhdGVnb3J5OlwiYmFzaWNfbWF0aFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiTG9nXCIsZGxPcE5hbWU6XCJsb2dcIixjYXRlZ29yeTpcImJhc2ljX21hdGhcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIk5lZ1wiLGRsT3BOYW1lOlwibmVnXCIsY2F0ZWdvcnk6XCJiYXNpY19tYXRoXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifSx7dGZQYXJhbU5hbWU6XCJUXCIsZGxQYXJhbU5hbWU6XCJkdHlwZVwiLHR5cGU6XCJkdHlwZVwiLG5vdFN1cHBvcnRlZDohMH1dfSx7dGZPcE5hbWU6XCJSZWx1XCIsZGxPcE5hbWU6XCJyZWx1XCIsY2F0ZWdvcnk6XCJiYXNpY19tYXRoXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifSx7dGZQYXJhbU5hbWU6XCJUXCIsZGxQYXJhbU5hbWU6XCJkdHlwZVwiLHR5cGU6XCJkdHlwZVwiLG5vdFN1cHBvcnRlZDohMH1dfSx7dGZPcE5hbWU6XCJSZWx1NlwiLGRsT3BOYW1lOlwiY2xpcEJ5VmFsdWVcIixjYXRlZ29yeTpcImJhc2ljX21hdGhcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfSx7ZGxQYXJhbU5hbWU6XCJjbGlwVmFsdWVNaW5cIix0eXBlOlwibnVtYmVyXCIsZGVmYXVsdFZhbHVlOjB9LHtkbFBhcmFtTmFtZTpcImNsaXBWYWx1ZU1heFwiLHR5cGU6XCJudW1iZXJcIixkZWZhdWx0VmFsdWU6Nn1dfSx7dGZPcE5hbWU6XCJTZWx1XCIsZGxPcE5hbWU6XCJzZWx1XCIsY2F0ZWdvcnk6XCJiYXNpY19tYXRoXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifSx7dGZQYXJhbU5hbWU6XCJUXCIsZGxQYXJhbU5hbWU6XCJkdHlwZVwiLHR5cGU6XCJkdHlwZVwiLG5vdFN1cHBvcnRlZDohMH1dfSx7dGZPcE5hbWU6XCJTaWdtb2lkXCIsZGxPcE5hbWU6XCJzaWdtb2lkXCIsY2F0ZWdvcnk6XCJiYXNpY19tYXRoXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifSx7dGZQYXJhbU5hbWU6XCJUXCIsZGxQYXJhbU5hbWU6XCJkdHlwZVwiLHR5cGU6XCJkdHlwZVwiLG5vdFN1cHBvcnRlZDohMH1dfSx7dGZPcE5hbWU6XCJTaW5cIixkbE9wTmFtZTpcInNpblwiLGNhdGVnb3J5OlwiYmFzaWNfbWF0aFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiU2luaFwiLGRsT3BOYW1lOlwic2luaFwiLGNhdGVnb3J5OlwiYmFzaWNfbWF0aFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiU3FydFwiLGRsT3BOYW1lOlwic3FydFwiLGNhdGVnb3J5OlwiYmFzaWNfbWF0aFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiUnNxcnRcIixkbE9wTmFtZTpcInJzcXJ0XCIsY2F0ZWdvcnk6XCJiYXNpY19tYXRoXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifSx7dGZQYXJhbU5hbWU6XCJUXCIsZGxQYXJhbU5hbWU6XCJkdHlwZVwiLHR5cGU6XCJkdHlwZVwiLG5vdFN1cHBvcnRlZDohMH1dfSx7dGZPcE5hbWU6XCJTcXVhcmVcIixkbE9wTmFtZTpcInNxdWFyZVwiLGNhdGVnb3J5OlwiYmFzaWNfbWF0aFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiVGFuXCIsZGxPcE5hbWU6XCJ0YW5cIixjYXRlZ29yeTpcImJhc2ljX21hdGhcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIlRhbmhcIixkbE9wTmFtZTpcInRhbmhcIixjYXRlZ29yeTpcImJhc2ljX21hdGhcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIlNpZ25cIixkbE9wTmFtZTpcInNpZ25cIixjYXRlZ29yeTpcImJhc2ljX21hdGhcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIlJvdW5kXCIsZGxPcE5hbWU6XCJyb3VuZFwiLGNhdGVnb3J5OlwiYmFzaWNfbWF0aFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiRXhwbTFcIixkbE9wTmFtZTpcImV4cG0xXCIsY2F0ZWdvcnk6XCJiYXNpY19tYXRoXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifSx7dGZQYXJhbU5hbWU6XCJUXCIsZGxQYXJhbU5hbWU6XCJkdHlwZVwiLHR5cGU6XCJkdHlwZVwiLG5vdFN1cHBvcnRlZDohMH1dfSx7dGZPcE5hbWU6XCJMb2cxcFwiLGRsT3BOYW1lOlwibG9nMXBcIixjYXRlZ29yeTpcImJhc2ljX21hdGhcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIlJlY2lwcm9jYWxcIixkbE9wTmFtZTpcInJlY2lwcm9jYWxcIixjYXRlZ29yeTpcImJhc2ljX21hdGhcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIlJlY2lwcm9jYWxcIixkbE9wTmFtZTpcInJlY2lwcm9jYWxcIixjYXRlZ29yeTpcImJhc2ljX21hdGhcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIlNvZnRwbHVzXCIsZGxPcE5hbWU6XCJzb2Z0cGx1c1wiLGNhdGVnb3J5OlwiYmFzaWNfbWF0aFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiQXNpbmhcIixkbE9wTmFtZTpcImFzaW5oXCIsY2F0ZWdvcnk6XCJiYXNpY19tYXRoXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifSx7dGZQYXJhbU5hbWU6XCJUXCIsZGxQYXJhbU5hbWU6XCJkdHlwZVwiLHR5cGU6XCJkdHlwZVwiLG5vdFN1cHBvcnRlZDohMH1dfSx7dGZPcE5hbWU6XCJBY29zaFwiLGRsT3BOYW1lOlwiYWNvc2hcIixjYXRlZ29yeTpcImJhc2ljX21hdGhcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIkF0YW5oXCIsZGxPcE5hbWU6XCJhdGFuaFwiLGNhdGVnb3J5OlwiYmFzaWNfbWF0aFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiRXJmXCIsZGxPcE5hbWU6XCJlcmZcIixjYXRlZ29yeTpcImJhc2ljX21hdGhcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19XSxiYXNpY01hdGg9T2JqZWN0LmZyZWV6ZSh7anNvbjpqc29uJDF9KSxqc29uJDI9W3t0Zk9wTmFtZTpcIkxvb3BDb25kXCIsZGxPcE5hbWU6XCJsb29wQ29uZFwiLGNhdGVnb3J5OlwiY29udHJvbFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwicHJlZFwiLHR5cGU6XCJ0ZW5zb3JcIn1dfSx7dGZPcE5hbWU6XCJTd2l0Y2hcIixkbE9wTmFtZTpcInN3aXRjaFwiLGNhdGVnb3J5OlwiY29udHJvbFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwiZGF0YVwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwicHJlZFwiLHR5cGU6XCJ0ZW5zb3JcIn1dfSx7dGZPcE5hbWU6XCJNZXJnZVwiLGRsT3BOYW1lOlwibWVyZ2VcIixjYXRlZ29yeTpcImNvbnRyb2xcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCx0ZklucHV0UGFyYW1MZW5ndGg6MCxkbFBhcmFtTmFtZTpcInRlbnNvcnNcIix0eXBlOlwidGVuc29yc1wifV19LHt0Zk9wTmFtZTpcIkVudGVyXCIsZGxPcE5hbWU6XCJlbnRlclwiLGNhdGVnb3J5OlwiY29udHJvbFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwidGVuc29yXCIsdHlwZTpcInRlbnNvclwifSx7dGZQYXJhbU5hbWU6XCJUXCIsZGxQYXJhbU5hbWU6XCJkdHlwZVwiLHR5cGU6XCJkdHlwZVwiLG5vdFN1cHBvcnRlZDohMH0se3RmUGFyYW1OYW1lOlwiZnJhbWVfbmFtZVwiLGRsUGFyYW1OYW1lOlwiZnJhbWVOYW1lXCIsdHlwZTpcInN0cmluZ1wifSx7dGZQYXJhbU5hbWU6XCJpc19jb25zdGFudFwiLGRsUGFyYW1OYW1lOlwiaXNDb25zdGFudFwiLHR5cGU6XCJib29sXCJ9XX0se3RmT3BOYW1lOlwiRXhpdFwiLGRsT3BOYW1lOlwiZXhpdFwiLGNhdGVnb3J5OlwiY29udHJvbFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwidGVuc29yXCIsdHlwZTpcInRlbnNvclwifSx7dGZQYXJhbU5hbWU6XCJUXCIsZGxQYXJhbU5hbWU6XCJkdHlwZVwiLHR5cGU6XCJkdHlwZVwiLG5vdFN1cHBvcnRlZDohMH1dfSx7dGZPcE5hbWU6XCJOZXh0SXRlcmF0aW9uXCIsZGxPcE5hbWU6XCJuZXh0SXRlcmF0aW9uXCIsY2F0ZWdvcnk6XCJjb250cm9sXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ0ZW5zb3JcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIlRlbnNvckFycmF5VjNcIixkbE9wTmFtZTpcInRlbnNvckFycmF5XCIsY2F0ZWdvcnk6XCJjb250cm9sXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJzaXplXCIsdHlwZTpcIm51bWJlclwifSx7dGZQYXJhbU5hbWU6XCJkdHlwZVwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIn0se3RmUGFyYW1OYW1lOlwiZWxlbWVudF9zaGFwZVwiLGRsUGFyYW1OYW1lOlwiZWxlbWVudFNoYXBlXCIsdHlwZTpcInNoYXBlXCJ9LHt0ZlBhcmFtTmFtZTpcImR5bmFtaWNfc2l6ZVwiLGRsUGFyYW1OYW1lOlwiZHluYW1pY1NpemVcIix0eXBlOlwiYm9vbFwifSx7dGZQYXJhbU5hbWU6XCJjbGVhcl9hZnRlcl9yZWFkXCIsZGxQYXJhbU5hbWU6XCJjbGVhckFmdGVyUmVhZFwiLHR5cGU6XCJib29sXCJ9LHt0ZlBhcmFtTmFtZTpcImlkZW50aWNhbF9lbGVtZW50X3NoYXBlc1wiLGRsUGFyYW1OYW1lOlwiaWRlbnRpY2FsRWxlbWVudFNoYXBlc1wiLHR5cGU6XCJib29sXCJ9LHt0ZlBhcmFtTmFtZTpcInRlbnNvcl9hcnJheV9uYW1lXCIsZGxQYXJhbU5hbWU6XCJuYW1lXCIsdHlwZTpcInN0cmluZ1wifV19LHt0Zk9wTmFtZTpcIlRlbnNvckFycmF5V3JpdGVWM1wiLGRsT3BOYW1lOlwidGVuc29yQXJyYXlXcml0ZVwiLGNhdGVnb3J5OlwiY29udHJvbFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwidGVuc29yQXJyYXlJZFwiLHR5cGU6XCJudW1iZXJcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiaW5kZXhcIix0eXBlOlwibnVtYmVyXCJ9LHt0ZklucHV0SW5kZXg6MixkbFBhcmFtTmFtZTpcInRlbnNvclwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDozLGRsUGFyYW1OYW1lOlwiZmxvd0luXCIsdHlwZTpcIm51bWJlclwifSx7dGZQYXJhbU5hbWU6XCJUXCIsZGxQYXJhbU5hbWU6XCJkdHlwZVwiLHR5cGU6XCJkdHlwZVwiLG5vdFN1cHBvcnRlZDohMH1dfSx7dGZPcE5hbWU6XCJUZW5zb3JBcnJheVJlYWRWM1wiLGRsT3BOYW1lOlwidGVuc29yQXJyYXlSZWFkXCIsY2F0ZWdvcnk6XCJjb250cm9sXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ0ZW5zb3JBcnJheUlkXCIsdHlwZTpcIm51bWJlclwifSx7dGZJbnB1dEluZGV4OjEsZGxQYXJhbU5hbWU6XCJpbmRleFwiLHR5cGU6XCJudW1iZXJcIn0se3RmSW5wdXRJbmRleDoyLGRsUGFyYW1OYW1lOlwiZmxvd0luXCIsdHlwZTpcIm51bWJlclwifSx7dGZQYXJhbU5hbWU6XCJkdHlwZVwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiVGVuc29yQXJyYXlHYXRoZXJWM1wiLGRsT3BOYW1lOlwidGVuc29yQXJyYXlHYXRoZXJcIixjYXRlZ29yeTpcImNvbnRyb2xcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInRlbnNvckFycmF5SWRcIix0eXBlOlwibnVtYmVyXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcImluZGljZXNcIix0eXBlOlwibnVtYmVyW11cIn0se3RmSW5wdXRJbmRleDoyLGRsUGFyYW1OYW1lOlwiZmxvd0luXCIsdHlwZTpcIm51bWJlclwifSx7dGZQYXJhbU5hbWU6XCJkdHlwZVwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIn0se3RmUGFyYW1OYW1lOlwiZWxlbWVudF9zaGFwZVwiLGRsUGFyYW1OYW1lOlwiZWxlbWVudFNoYXBlXCIsdHlwZTpcInNoYXBlXCJ9XX0se3RmT3BOYW1lOlwiVGVuc29yQXJyYXlTY2F0dGVyVjNcIixkbE9wTmFtZTpcInRlbnNvckFycmF5U2NhdHRlclwiLGNhdGVnb3J5OlwiY29udHJvbFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwidGVuc29yQXJyYXlJZFwiLHR5cGU6XCJudW1iZXJcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiaW5kaWNlc1wiLHR5cGU6XCJudW1iZXJbXVwifSx7dGZJbnB1dEluZGV4OjIsZGxQYXJhbU5hbWU6XCJ0ZW5zb3JcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MyxkbFBhcmFtTmFtZTpcImZsb3dJblwiLHR5cGU6XCJudW1iZXJcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIn1dfSx7dGZPcE5hbWU6XCJUZW5zb3JBcnJheUNvbmNhdFYzXCIsZGxPcE5hbWU6XCJ0ZW5zb3JBcnJheUNvbmNhdFwiLGNhdGVnb3J5OlwiY29udHJvbFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwidGVuc29yQXJyYXlJZFwiLHR5cGU6XCJudW1iZXJcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiZmxvd0luXCIsdHlwZTpcIm51bWJlclwifSx7dGZQYXJhbU5hbWU6XCJkdHlwZVwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIn0se3RmUGFyYW1OYW1lOlwiZWxlbWVudF9zaGFwZV9leGNlcHQwXCIsZGxQYXJhbU5hbWU6XCJlbGVtZW50U2hhcGVFeGNlcHQwXCIsdHlwZTpcInNoYXBlXCIsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIlRlbnNvckFycmF5U3BsaXRWM1wiLGRsT3BOYW1lOlwidGVuc29yQXJyYXlTcGxpdFwiLGNhdGVnb3J5OlwiY29udHJvbFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwidGVuc29yQXJyYXlJZFwiLHR5cGU6XCJudW1iZXJcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwidGVuc29yXCIsdHlwZTpcInRlbnNvclwifSx7dGZJbnB1dEluZGV4OjIsZGxQYXJhbU5hbWU6XCJsZW5ndGhzXCIsdHlwZTpcIm51bWJlcltdXCJ9LHt0ZklucHV0SW5kZXg6MyxkbFBhcmFtTmFtZTpcImZsb3dJblwiLHR5cGU6XCJudW1iZXJcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIn1dfSx7dGZPcE5hbWU6XCJUZW5zb3JBcnJheVNpemVWM1wiLGRsT3BOYW1lOlwidGVuc29yQXJyYXlTaXplXCIsY2F0ZWdvcnk6XCJjb250cm9sXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ0ZW5zb3JBcnJheUlkXCIsdHlwZTpcIm51bWJlclwifSx7dGZJbnB1dEluZGV4OjEsZGxQYXJhbU5hbWU6XCJmbG93SW5cIix0eXBlOlwibnVtYmVyXCJ9XX0se3RmT3BOYW1lOlwiVGVuc29yQXJyYXlDbG9zZVYzXCIsZGxPcE5hbWU6XCJ0ZW5zb3JBcnJheUNsb3NlXCIsY2F0ZWdvcnk6XCJjb250cm9sXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ0ZW5zb3JBcnJheUlkXCIsdHlwZTpcIm51bWJlclwifV19XSxjb250cm9sPU9iamVjdC5mcmVlemUoe2pzb246anNvbiQyfSksanNvbiQzPVt7dGZPcE5hbWU6XCJBdmdQb29sXCIsZGxPcE5hbWU6XCJhdmdQb29sXCIsY2F0ZWdvcnk6XCJjb252b2x1dGlvblwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwic3RyaWRlc1wiLGRsUGFyYW1OYW1lOlwic3RyaWRlc1wiLHR5cGU6XCJudW1iZXJbXVwifSx7dGZQYXJhbU5hbWU6XCJwYWRkaW5nXCIsZGxQYXJhbU5hbWU6XCJwYWRcIix0eXBlOlwic3RyaW5nXCJ9LHt0ZlBhcmFtTmFtZTpcImRhdGFfZm9ybWF0XCIsZGxQYXJhbU5hbWU6XCJkYXRhRm9ybWF0XCIsdHlwZTpcInN0cmluZ1wiLG5vdFN1cHBvcnRlZDohMH0se3RmUGFyYW1OYW1lOlwia3NpemVcIixkbFBhcmFtTmFtZTpcImtlcm5lbFNpemVcIix0eXBlOlwibnVtYmVyW11cIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiTWF4UG9vbFwiLGRsT3BOYW1lOlwibWF4UG9vbFwiLGNhdGVnb3J5OlwiY29udm9sdXRpb25cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcInN0cmlkZXNcIixkbFBhcmFtTmFtZTpcInN0cmlkZXNcIix0eXBlOlwibnVtYmVyW11cIn0se3RmUGFyYW1OYW1lOlwicGFkZGluZ1wiLGRsUGFyYW1OYW1lOlwicGFkXCIsdHlwZTpcInN0cmluZ1wifSx7dGZQYXJhbU5hbWU6XCJkYXRhX2Zvcm1hdFwiLGRsUGFyYW1OYW1lOlwiZGF0YUZvcm1hdFwiLHR5cGU6XCJzdHJpbmdcIixub3RTdXBwb3J0ZWQ6ITB9LHt0ZlBhcmFtTmFtZTpcImtzaXplXCIsZGxQYXJhbU5hbWU6XCJrZXJuZWxTaXplXCIsdHlwZTpcIm51bWJlcltdXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIkNvbnYxRFwiLGRsT3BOYW1lOlwiY29udjFkXCIsY2F0ZWdvcnk6XCJjb252b2x1dGlvblwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiZmlsdGVyXCIsdHlwZTpcInRlbnNvclwifSx7dGZQYXJhbU5hbWU6XCJzdHJpZGVcIixkbFBhcmFtTmFtZTpcInN0cmlkZVwiLHR5cGU6XCJudW1iZXJcIn0se3RmUGFyYW1OYW1lOlwicGFkZGluZ1wiLGRsUGFyYW1OYW1lOlwicGFkXCIsdHlwZTpcInN0cmluZ1wifSx7dGZQYXJhbU5hbWU6XCJkYXRhX2Zvcm1hdFwiLGRsUGFyYW1OYW1lOlwiZGF0YUZvcm1hdFwiLHR5cGU6XCJzdHJpbmdcIixkZWZhdWx0VmFsdWU6XCJOV0NcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9LHt0ZlBhcmFtTmFtZTpcImRpbGF0aW9uXCIsZGxQYXJhbU5hbWU6XCJkaWxhdGlvblwiLHR5cGU6XCJudW1iZXJcIixkZWZhdWx0VmFsdWU6MX1dfSx7dGZPcE5hbWU6XCJDb252MkRcIixkbE9wTmFtZTpcImNvbnYyZFwiLGNhdGVnb3J5OlwiY29udm9sdXRpb25cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcImZpbHRlclwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9LHt0ZlBhcmFtTmFtZTpcInN0cmlkZXNcIixkbFBhcmFtTmFtZTpcInN0cmlkZXNcIix0eXBlOlwibnVtYmVyW11cIn0se3RmUGFyYW1OYW1lOlwicGFkZGluZ1wiLGRsUGFyYW1OYW1lOlwicGFkXCIsdHlwZTpcInN0cmluZ1wifSx7dGZQYXJhbU5hbWU6XCJ1c2VDdWRubk9uR3B1XCIsZGxQYXJhbU5hbWU6XCJ1c2VDdWRubk9uR3B1XCIsdHlwZTpcImJvb2xcIn0se3RmUGFyYW1OYW1lOlwiZGF0YV9mb3JtYXRcIixkbFBhcmFtTmFtZTpcImRhdGFGb3JtYXRcIix0eXBlOlwic3RyaW5nXCIsZGVmYXVsdFZhbHVlOlwiTkhXQ1wifSx7dGZQYXJhbU5hbWU6XCJkaWxhdGlvbnNcIixkbFBhcmFtTmFtZTpcImRpbGF0aW9uc1wiLHR5cGU6XCJudW1iZXJbXVwifV19LHt0Zk9wTmFtZTpcIkNvbnYyREJhY2twcm9wSW5wdXRcIixkbE9wTmFtZTpcImNvbnYyZFRyYW5zcG9zZVwiLGNhdGVnb3J5OlwiY29udm9sdXRpb25cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MixkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcImZpbHRlclwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwib3V0cHV0U2hhcGVcIix0eXBlOlwibnVtYmVyW11cIn0se3RmUGFyYW1OYW1lOlwic3RyaWRlc1wiLGRsUGFyYW1OYW1lOlwic3RyaWRlc1wiLHR5cGU6XCJudW1iZXJbXVwifSx7dGZQYXJhbU5hbWU6XCJwYWRkaW5nXCIsZGxQYXJhbU5hbWU6XCJwYWRcIix0eXBlOlwic3RyaW5nXCJ9LHt0ZlBhcmFtTmFtZTpcImRhdGFfZm9ybWF0XCIsZGxQYXJhbU5hbWU6XCJkYXRhRm9ybWF0XCIsdHlwZTpcInN0cmluZ1wiLG5vdFN1cHBvcnRlZDohMH1dfSx7dGZPcE5hbWU6XCJEZXB0aHdpc2VDb252MmRcIixkbE9wTmFtZTpcImRlcHRod2lzZUNvbnYyZFwiLGNhdGVnb3J5OlwiY29udm9sdXRpb25cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcImlucHV0XCIsdHlwZTpcInRlbnNvclwifSx7dGZJbnB1dEluZGV4OjEsZGxQYXJhbU5hbWU6XCJmaWx0ZXJcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcInN0cmlkZXNcIixkbFBhcmFtTmFtZTpcInN0cmlkZXNcIix0eXBlOlwibnVtYmVyW11cIn0se3RmUGFyYW1OYW1lOlwicGFkZGluZ1wiLGRsUGFyYW1OYW1lOlwicGFkXCIsdHlwZTpcInN0cmluZ1wifSx7dGZQYXJhbU5hbWU6XCJkYXRhX2Zvcm1hdFwiLGRsUGFyYW1OYW1lOlwiZGF0YUZvcm1hdFwiLHR5cGU6XCJzdHJpbmdcIixkZWZhdWx0VmFsdWU6XCJOSFdDXCJ9LHt0ZlBhcmFtTmFtZTpcImRpbGF0aW9uc1wiLGRsUGFyYW1OYW1lOlwiZGlsYXRpb25zXCIsdHlwZTpcIm51bWJlcltdXCJ9XX0se3RmT3BOYW1lOlwiRGVwdGh3aXNlQ29udjJkTmF0aXZlXCIsZGxPcE5hbWU6XCJkZXB0aHdpc2VDb252MmRcIixjYXRlZ29yeTpcImNvbnZvbHV0aW9uXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJpbnB1dFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiZmlsdGVyXCIsdHlwZTpcInRlbnNvclwifSx7dGZQYXJhbU5hbWU6XCJzdHJpZGVzXCIsZGxQYXJhbU5hbWU6XCJzdHJpZGVzXCIsdHlwZTpcIm51bWJlcltdXCJ9LHt0ZlBhcmFtTmFtZTpcInBhZGRpbmdcIixkbFBhcmFtTmFtZTpcInBhZFwiLHR5cGU6XCJzdHJpbmdcIn0se3RmUGFyYW1OYW1lOlwiZGF0YV9mb3JtYXRcIixkbFBhcmFtTmFtZTpcImRhdGFGb3JtYXRcIix0eXBlOlwic3RyaW5nXCIsZGVmYXVsdFZhbHVlOlwiTkhXQ1wifSx7dGZQYXJhbU5hbWU6XCJkaWxhdGlvbnNcIixkbFBhcmFtTmFtZTpcImRpbGF0aW9uc1wiLHR5cGU6XCJudW1iZXJbXVwifV19XSxjb252b2x1dGlvbj1PYmplY3QuZnJlZXplKHtqc29uOmpzb24kM30pLGpzb24kND1be3RmT3BOYW1lOlwiRmlsbFwiLGRsT3BOYW1lOlwiZmlsbFwiLGNhdGVnb3J5OlwiY3JlYXRpb25cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInNoYXBlXCIsdHlwZTpcIm51bWJlcltdXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcInZhbHVlXCIsdHlwZTpcIm51bWJlclwifSx7dGZQYXJhbU5hbWU6XCJUXCIsZGxQYXJhbU5hbWU6XCJkdHlwZVwiLHR5cGU6XCJkdHlwZVwifV19LHt0Zk9wTmFtZTpcIkxpblNwYWNlXCIsZGxPcE5hbWU6XCJsaW5zcGFjZVwiLGNhdGVnb3J5OlwiY3JlYXRpb25cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInN0YXJ0XCIsdHlwZTpcIm51bWJlclwifSx7dGZJbnB1dEluZGV4OjEsZGxQYXJhbU5hbWU6XCJzdG9wXCIsdHlwZTpcIm51bWJlclwifSx7dGZJbnB1dEluZGV4OjIsZGxQYXJhbU5hbWU6XCJudW1cIix0eXBlOlwibnVtYmVyXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIk9uZUhvdFwiLGRsT3BOYW1lOlwib25lSG90XCIsY2F0ZWdvcnk6XCJjcmVhdGlvblwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwiaW5kaWNlc1wiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiZGVwdGhcIix0eXBlOlwibnVtYmVyXCJ9LHt0ZklucHV0SW5kZXg6MixkbFBhcmFtTmFtZTpcIm9uVmFsdWVcIix0eXBlOlwibnVtYmVyXCIsZGVmYXVsdFZhbHVlOjF9LHt0ZklucHV0SW5kZXg6MyxkbFBhcmFtTmFtZTpcIm9mZlZhbHVlXCIsdHlwZTpcIm51bWJlclwiLGRlZmF1bHRWYWx1ZTowfSx7dGZQYXJhbU5hbWU6XCJheGlzXCIsZGxQYXJhbU5hbWU6XCJheGlzXCIsdHlwZTpcIm51bWJlclwiLG5vdFN1cHBvcnRlZDohMH0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiT25lc1wiLGRsT3BOYW1lOlwib25lc1wiLGNhdGVnb3J5OlwiY3JlYXRpb25cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInNoYXBlXCIsdHlwZTpcIm51bWJlcltdXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCJ9XX0se3RmT3BOYW1lOlwiT25lc0xpa2VcIixkbE9wTmFtZTpcIm9uZXNMaWtlXCIsY2F0ZWdvcnk6XCJjcmVhdGlvblwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiZHR5cGVcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCJ9XX0se3RmT3BOYW1lOlwiUmFuZG9tVW5pZm9ybVwiLGRsT3BOYW1lOlwicmFuZG9tVW5pZm9ybVwiLGNhdGVnb3J5OlwiY3JlYXRpb25cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInNoYXBlXCIsdHlwZTpcIm51bWJlcltdXCJ9LHt0ZlBhcmFtTmFtZTpcIm1pbnZhbFwiLGRsUGFyYW1OYW1lOlwibWludmFsXCIsdHlwZTpcIm51bWJlclwiLGRlZmF1bHRWYWx1ZTowfSx7dGZQYXJhbU5hbWU6XCJtYXh2YWxcIixkbFBhcmFtTmFtZTpcIm1heHZhbFwiLHR5cGU6XCJudW1iZXJcIixkZWZhdWx0VmFsdWU6MX0se3RmUGFyYW1OYW1lOlwiZHR5cGVcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCJ9LHt0ZlBhcmFtTmFtZTpcInNlZWRcIixkbFBhcmFtTmFtZTpcInNlZWRcIix0eXBlOlwibnVtYmVyXCIsZGVmYXVsdFZhbHVlOjB9LHt0ZlBhcmFtTmFtZTpcInNlZWQyXCIsZGxQYXJhbU5hbWU6XCJzZWVkMlwiLHR5cGU6XCJudW1iZXJcIixkZWZhdWx0VmFsdWU6MCxub3RTdXBwb3J0ZWQ6ITB9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcIlRcIix0eXBlOlwibnVtYmVyXCIsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIlJhbmdlXCIsZGxPcE5hbWU6XCJyYW5nZVwiLGNhdGVnb3J5OlwiY3JlYXRpb25cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInN0YXJ0XCIsdHlwZTpcIm51bWJlclwifSx7dGZJbnB1dEluZGV4OjEsZGxQYXJhbU5hbWU6XCJzdG9wXCIsdHlwZTpcIm51bWJlclwifSx7dGZJbnB1dEluZGV4OjIsZGxQYXJhbU5hbWU6XCJzdGVwXCIsdHlwZTpcIm51bWJlclwiLGRlZmF1bHRWYWx1ZTowfSx7dGZQYXJhbU5hbWU6XCJUaWR4XCIsZGxQYXJhbU5hbWU6XCJkdHlwZVwiLHR5cGU6XCJkdHlwZVwifV19LHt0Zk9wTmFtZTpcInRydW5jYXRlZE5vcm1hbFwiLGRsT3BOYW1lOlwidHJ1bmNhdGVkTm9ybWFsXCIsY2F0ZWdvcnk6XCJjcmVhdGlvblwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwic2hhcGVcIix0eXBlOlwibnVtYmVyW11cIn0se3RmUGFyYW1OYW1lOlwibWVhbnNcIixkbFBhcmFtTmFtZTpcIm1lYW5cIix0eXBlOlwibnVtYmVyXCIsZGVmYXVsdFZhbHVlOjB9LHt0ZlBhcmFtTmFtZTpcInN0ZGRldlwiLGRsUGFyYW1OYW1lOlwic3RkRGV2XCIsdHlwZTpcIm51bWJlclwiLGRlZmF1bHRWYWx1ZToxfSx7dGZQYXJhbU5hbWU6XCJzZWVkXCIsZGxQYXJhbU5hbWU6XCJzZWVkXCIsdHlwZTpcIm51bWJlclwifSx7dGZQYXJhbU5hbWU6XCJzZWVkMlwiLGRsUGFyYW1OYW1lOlwic2VlZDJcIix0eXBlOlwibnVtYmVyXCIsZGVmYXVsdFZhbHVlOjAsbm90U3VwcG9ydGVkOiEwfSx7dGZQYXJhbU5hbWU6XCJkdHlwZVwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiVFwiLHR5cGU6XCJudW1iZXJcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiWmVyb3NcIixkbE9wTmFtZTpcInplcm9zXCIsY2F0ZWdvcnk6XCJjcmVhdGlvblwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwic2hhcGVcIix0eXBlOlwibnVtYmVyW11cIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIn1dfSx7dGZPcE5hbWU6XCJaZXJvc0xpa2VcIixkbE9wTmFtZTpcInplcm9zTGlrZVwiLGNhdGVnb3J5OlwiY3JlYXRpb25cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCJ9XX1dLGNyZWF0aW9uPU9iamVjdC5mcmVlemUoe2pzb246anNvbiQ0fSksanNvbiQ1PVt7dGZPcE5hbWU6XCJOb25NYXhTdXBwcmVzc2lvblYyXCIsZGxPcE5hbWU6XCJub25NYXhTdXBwcmVzc2lvblwiLGNhdGVnb3J5OlwiZHluYW1pY1wiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwiYm94ZXNcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcInNjb3Jlc1wiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoyLGRsUGFyYW1OYW1lOlwibWF4T3V0cHV0U2l6ZVwiLHR5cGU6XCJudW1iZXJcIn0se3RmSW5wdXRJbmRleDozLGRsUGFyYW1OYW1lOlwiaW91VGhyZXNob2xkXCIsdHlwZTpcIm51bWJlclwifV19LHt0Zk9wTmFtZTpcIk5vbk1heFN1cHByZXNzaW9uVjNcIixkbE9wTmFtZTpcIm5vbk1heFN1cHByZXNzaW9uXCIsY2F0ZWdvcnk6XCJkeW5hbWljXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJib3hlc1wiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwic2NvcmVzXCIsdHlwZTpcInRlbnNvclwifSx7dGZJbnB1dEluZGV4OjIsZGxQYXJhbU5hbWU6XCJtYXhPdXRwdXRTaXplXCIsdHlwZTpcIm51bWJlclwifSx7dGZJbnB1dEluZGV4OjMsZGxQYXJhbU5hbWU6XCJpb3VUaHJlc2hvbGRcIix0eXBlOlwibnVtYmVyXCJ9LHt0ZklucHV0SW5kZXg6NCxkbFBhcmFtTmFtZTpcInNjb3JlVGhyZXNob2xkXCIsdHlwZTpcIm51bWJlclwifV19LHt0Zk9wTmFtZTpcIldoZXJlXCIsZGxPcE5hbWU6XCJ3aGVyZUFzeW5jXCIsY2F0ZWdvcnk6XCJkeW5hbWljXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJjb25kaXRpb25cIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19XSxkeW5hbWljPU9iamVjdC5mcmVlemUoe2pzb246anNvbiQ1fSksanNvbiQ2PVt7dGZPcE5hbWU6XCJUb3BLVjJcIixkbE9wTmFtZTpcInRvcEtcIixjYXRlZ29yeTpcImV2YWx1YXRpb25cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcImtcIix0eXBlOlwibnVtYmVyXCJ9LHt0ZlBhcmFtTmFtZTpcInNvcnRlZFwiLGRsUGFyYW1OYW1lOlwic29ydGVkXCIsdHlwZTpcImJvb2xcIn1dfV0sZXZhbHVhdGlvbj1PYmplY3QuZnJlZXplKHtqc29uOmpzb24kNn0pLGpzb24kNz1be3RmT3BOYW1lOlwiUGxhY2Vob2xkZXJXaXRoRGVmYXVsdFwiLGRsT3BOYW1lOlwicGxhY2Vob2xkZXJcIixjYXRlZ29yeTpcImdyYXBoXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJkZWZhdWx0XCIsdHlwZTpcInRlbnNvclwifSx7dGZQYXJhbU5hbWU6XCJzaGFwZVwiLGRsUGFyYW1OYW1lOlwic2hhcGVcIix0eXBlOlwic2hhcGVcIn0se3RmUGFyYW1OYW1lOlwiZHR5cGVcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCJ9XX0se3RmT3BOYW1lOlwiUGxhY2Vob2xkZXJcIixkbE9wTmFtZTpcInBsYWNlaG9sZGVyXCIsY2F0ZWdvcnk6XCJncmFwaFwiLHBhcmFtczpbe3RmUGFyYW1OYW1lOlwic2hhcGVcIixkbFBhcmFtTmFtZTpcInNoYXBlXCIsdHlwZTpcInNoYXBlXCJ9LHt0ZlBhcmFtTmFtZTpcImR0eXBlXCIsZGxQYXJhbU5hbWU6XCJkdHlwZVwiLHR5cGU6XCJkdHlwZVwifV19LHt0Zk9wTmFtZTpcIkNvbnN0XCIsZGxPcE5hbWU6XCJjb25zdFwiLGNhdGVnb3J5OlwiZ3JhcGhcIn0se3RmT3BOYW1lOlwiSWRlbnRpdHlcIixkbE9wTmFtZTpcImlkZW50aXR5XCIsY2F0ZWdvcnk6XCJncmFwaFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn1dfSx7dGZPcE5hbWU6XCJTbmFwc2hvdFwiLGRsT3BOYW1lOlwic25hcHNob3RcIixjYXRlZ29yeTpcImdyYXBoXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifV19LHt0Zk9wTmFtZTpcIlJhbmtcIixkbE9wTmFtZTpcInJhbmtcIixjYXRlZ29yeTpcImdyYXBoXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifV19LHt0Zk9wTmFtZTpcIlNpemVcIixkbE9wTmFtZTpcInNpemVcIixjYXRlZ29yeTpcImdyYXBoXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifV19LHt0Zk9wTmFtZTpcIlNoYXBlXCIsZGxPcE5hbWU6XCJzaGFwZVwiLGNhdGVnb3J5OlwiZ3JhcGhcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9XX0se3RmT3BOYW1lOlwiU2hhcGVOXCIsZGxPcE5hbWU6XCJzaGFwZU5cIixjYXRlZ29yeTpcImdyYXBoXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsdGZJbnB1dFBhcmFtTGVuZ3RoOjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvcnNcIn1dfSx7dGZPcE5hbWU6XCJQcmludFwiLGRsT3BOYW1lOlwicHJpbnRcIixjYXRlZ29yeTpcImdyYXBoXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifSx7dGZJbnB1dEluZGV4OjEsdGZJbnB1dFBhcmFtTGVuZ3RoOjEsZGxQYXJhbU5hbWU6XCJkYXRhXCIsdHlwZTpcInRlbnNvcnNcIn0se3RmUGFyYW1OYW1lOlwibWVzc2FnZVwiLGRsUGFyYW1OYW1lOlwibWVzc2FnZVwiLHR5cGU6XCJzdHJpbmdcIn0se3RmUGFyYW1OYW1lOlwiZmlyc3RfblwiLGRsUGFyYW1OYW1lOlwiZmlyc3ROXCIsdHlwZTpcIm51bWJlclwiLG5vdFN1cHBydGVkOiEwfSx7dGZQYXJhbU5hbWU6XCJzdW1tYXJpemVcIixkbFBhcmFtTmFtZTpcInN1bW1hcml6ZVwiLHR5cGU6XCJudW1iZXJcIixkZWZhdWx0VmFsdWU6M31dfSx7dGZPcE5hbWU6XCJOb09wXCIsZGxPcE5hbWU6XCJub29wXCIsY2F0ZWdvcnk6XCJncmFwaFwiLHBhcmFtczpbXX0se3RmT3BOYW1lOlwiU3RvcEdyYWRpZW50XCIsZGxPcE5hbWU6XCJzdG9wR3JhZGllbnRcIixjYXRlZ29yeTpcImdyYXBoXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifV19LHt0Zk9wTmFtZTpcIkZha2VRdWFudFdpdGhNaW5NYXhWYXJzXCIsZGxPcE5hbWU6XCJmYWtlUXVhbnRXaXRoTWluTWF4VmFyc1wiLGNhdGVnb3J5OlwiZ3JhcGhcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIm1pblwiLGRsUGFyYW1OYW1lOlwibWluXCIsdHlwZTpcIm51bWJlclwifSx7dGZQYXJhbU5hbWU6XCJtYXhcIixkbFBhcmFtTmFtZTpcIm1heFwiLHR5cGU6XCJudW1iZXJcIn1dfV0sZ3JhcGg9T2JqZWN0LmZyZWV6ZSh7anNvbjpqc29uJDd9KSxqc29uJDg9W3t0Zk9wTmFtZTpcIlJlc2l6ZUJpbGluZWFyXCIsZGxPcE5hbWU6XCJyZXNpemVCaWxpbmVhclwiLGNhdGVnb3J5OlwiaW1hZ2VcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcImltYWdlc1wiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwic2l6ZVwiLHR5cGU6XCJudW1iZXJbXVwifSx7dGZQYXJhbU5hbWU6XCJhbGlnbl9jb3JuZXJzXCIsZGxQYXJhbU5hbWU6XCJhbGlnbkNvcm5lcnNcIix0eXBlOlwiYm9vbFwifSx7dGZQYXJhbU5hbWU6XCJUXCIsZGxQYXJhbU5hbWU6XCJkdHlwZVwiLHR5cGU6XCJkdHlwZVwiLG5vdFN1cHBvcnRlZDohMH1dfSx7dGZPcE5hbWU6XCJSZXNpemVOZWFyZXN0TmVpZ2hib3JcIixkbE9wTmFtZTpcInJlc2l6ZU5lYXJlc3ROZWlnaGJvclwiLGNhdGVnb3J5OlwiaW1hZ2VcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcImltYWdlc1wiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwic2l6ZVwiLHR5cGU6XCJudW1iZXJbXVwifSx7dGZQYXJhbU5hbWU6XCJhbGlnbl9jb3JuZXJzXCIsZGxQYXJhbU5hbWU6XCJhbGlnbkNvcm5lcnNcIix0eXBlOlwiYm9vbFwifSx7dGZQYXJhbU5hbWU6XCJUXCIsZGxQYXJhbU5hbWU6XCJkdHlwZVwiLHR5cGU6XCJkdHlwZVwiLG5vdFN1cHBvcnRlZDohMH1dfSx7dGZPcE5hbWU6XCJDcm9wQW5kUmVzaXplXCIsZGxPcE5hbWU6XCJjcm9wQW5kUmVzaXplXCIsY2F0ZWdvcnk6XCJpbWFnZVwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwiaW1hZ2VcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcImJveGVzXCIsdHlwZTpcInRlbnNvclwifSx7dGZJbnB1dEluZGV4OjIsZGxQYXJhbU5hbWU6XCJib3hJbmRcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MyxkbFBhcmFtTmFtZTpcImNyb3BTaXplXCIsdHlwZTpcIm51bWJlcltdXCJ9LHt0ZlBhcmFtTmFtZTpcIm1ldGhvZFwiLGRsUGFyYW1OYW1lOlwibWV0aG9kXCIsdHlwZTpcInN0cmluZ1wifSx7dGZQYXJhbU5hbWU6XCJleHRyYXBvbGF0aW9uX3ZhbHVlXCIsZGxQYXJhbU5hbWU6XCJleHRyYXBvbGF0aW9uVmFsdWVcIix0eXBlOlwibnVtYmVyXCJ9XX1dLGltYWdlJDE9T2JqZWN0LmZyZWV6ZSh7anNvbjpqc29uJDh9KSxqc29uJDk9W3t0Zk9wTmFtZTpcIkVxdWFsXCIsZGxPcE5hbWU6XCJlcXVhbFwiLGNhdGVnb3J5OlwibG9naWNhbFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwiYVwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiYlwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiTm90RXF1YWxcIixkbE9wTmFtZTpcIm5vdEVxdWFsXCIsY2F0ZWdvcnk6XCJsb2dpY2FsXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJhXCIsdHlwZTpcInRlbnNvclwifSx7dGZJbnB1dEluZGV4OjEsZGxQYXJhbU5hbWU6XCJiXCIsdHlwZTpcInRlbnNvclwifSx7dGZQYXJhbU5hbWU6XCJUXCIsZGxQYXJhbU5hbWU6XCJkdHlwZVwiLHR5cGU6XCJkdHlwZVwiLG5vdFN1cHBvcnRlZDohMH1dfSx7dGZPcE5hbWU6XCJHcmVhdGVyXCIsZGxPcE5hbWU6XCJncmVhdGVyXCIsY2F0ZWdvcnk6XCJsb2dpY2FsXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJhXCIsdHlwZTpcInRlbnNvclwifSx7dGZJbnB1dEluZGV4OjEsZGxQYXJhbU5hbWU6XCJiXCIsdHlwZTpcInRlbnNvclwifSx7dGZQYXJhbU5hbWU6XCJUXCIsZGxQYXJhbU5hbWU6XCJkdHlwZVwiLHR5cGU6XCJkdHlwZVwiLG5vdFN1cHBvcnRlZDohMH1dfSx7dGZPcE5hbWU6XCJHcmVhdGVyRXF1YWxcIixkbE9wTmFtZTpcImdyZWF0ZXJFcXVhbFwiLGNhdGVnb3J5OlwibG9naWNhbFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwiYVwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiYlwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiTGVzc1wiLGRsT3BOYW1lOlwibGVzc1wiLGNhdGVnb3J5OlwibG9naWNhbFwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwiYVwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiYlwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiTGVzc0VxdWFsXCIsZGxPcE5hbWU6XCJsZXNzRXF1YWxcIixjYXRlZ29yeTpcImxvZ2ljYWxcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcImFcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcImJcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIkxvZ2ljYWxBbmRcIixkbE9wTmFtZTpcImxvZ2ljYWxBbmRcIixjYXRlZ29yeTpcImxvZ2ljYWxcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcImFcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcImJcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIkxvZ2ljYWxOb3RcIixkbE9wTmFtZTpcImxvZ2ljYWxOb3RcIixjYXRlZ29yeTpcImxvZ2ljYWxcIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcImFcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIkxvZ2ljYWxPclwiLGRsT3BOYW1lOlwibG9naWNhbE9yXCIsY2F0ZWdvcnk6XCJsb2dpY2FsXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJhXCIsdHlwZTpcInRlbnNvclwifSx7dGZJbnB1dEluZGV4OjEsZGxQYXJhbU5hbWU6XCJiXCIsdHlwZTpcInRlbnNvclwifSx7dGZQYXJhbU5hbWU6XCJUXCIsZGxQYXJhbU5hbWU6XCJkdHlwZVwiLHR5cGU6XCJkdHlwZVwiLG5vdFN1cHBvcnRlZDohMH1dfSx7dGZPcE5hbWU6XCJTZWxlY3RcIixkbE9wTmFtZTpcIndoZXJlXCIsY2F0ZWdvcnk6XCJsb2dpY2FsXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJjb25kaXRpb25cIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcImFcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MixkbFBhcmFtTmFtZTpcImJcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19XSxsb2dpY2FsPU9iamVjdC5mcmVlemUoe2pzb246anNvbiQ5fSksanNvbiQxMD1be3RmT3BOYW1lOlwiTWF0TXVsXCIsZGxPcE5hbWU6XCJtYXRNdWxcIixjYXRlZ29yeTpcIm1hdHJpY2VzXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJhXCIsdHlwZTpcInRlbnNvclwifSx7dGZJbnB1dEluZGV4OjEsZGxQYXJhbU5hbWU6XCJiXCIsdHlwZTpcInRlbnNvclwifSx7dGZQYXJhbU5hbWU6XCJ0cmFuc3Bvc2VfYVwiLGRsUGFyYW1OYW1lOlwidHJhbnNwb3NlQVwiLHR5cGU6XCJib29sXCIsZGVmYXVsdFZhbHVlOiExfSx7dGZQYXJhbU5hbWU6XCJ0cmFuc3Bvc2VfYlwiLGRsUGFyYW1OYW1lOlwidHJhbnNwb3NlQlwiLHR5cGU6XCJib29sXCIsZGVmYXVsdFZhbHVlOiExfSx7dGZQYXJhbU5hbWU6XCJUXCIsZGxQYXJhbU5hbWU6XCJkdHlwZVwiLHR5cGU6XCJkdHlwZVwiLG5vdFN1cHBvcnRlZDohMH1dfSx7dGZPcE5hbWU6XCJCYXRjaE1hdE11bFwiLGRsT3BOYW1lOlwibWF0TXVsXCIsY2F0ZWdvcnk6XCJtYXRyaWNlc1wiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwiYVwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiYlwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiYWRqX3hcIixkbFBhcmFtTmFtZTpcInRyYW5zcG9zZUFcIix0eXBlOlwiYm9vbFwiLGRlZmF1bHRWYWx1ZTohMX0se3RmUGFyYW1OYW1lOlwiYWRqX3lcIixkbFBhcmFtTmFtZTpcInRyYW5zcG9zZUJcIix0eXBlOlwiYm9vbFwiLGRlZmF1bHRWYWx1ZTohMX0se3RmUGFyYW1OYW1lOlwiVFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiVHJhbnNwb3NlXCIsZGxPcE5hbWU6XCJ0cmFuc3Bvc2VcIixjYXRlZ29yeTpcIm1hdHJpY2VzXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifSx7dGZJbnB1dEluZGV4OjEsZGxQYXJhbU5hbWU6XCJwZXJtXCIsdHlwZTpcIm51bWJlcltdXCJ9LHt0ZlBhcmFtTmFtZTpcIlRcIixkbFBhcmFtTmFtZTpcImR0eXBlXCIsdHlwZTpcImR0eXBlXCIsbm90U3VwcG9ydGVkOiEwfV19XSxtYXRyaWNlcz1PYmplY3QuZnJlZXplKHtqc29uOmpzb24kMTB9KSxqc29uJDExPVt7dGZPcE5hbWU6XCJGdXNlZEJhdGNoTm9ybVwiLGRsT3BOYW1lOlwiYmF0Y2hOb3JtYWxpemF0aW9uXCIsY2F0ZWdvcnk6XCJub3JtYWxpemF0aW9uXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifSx7dGZJbnB1dEluZGV4OjEsZGxQYXJhbU5hbWU6XCJzY2FsZVwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoyLGRsUGFyYW1OYW1lOlwib2Zmc2V0XCIsdHlwZTpcInRlbnNvclwifSx7dGZJbnB1dEluZGV4OjMsZGxQYXJhbU5hbWU6XCJtZWFuXCIsdHlwZTpcInRlbnNvclwifSx7dGZJbnB1dEluZGV4OjQsZGxQYXJhbU5hbWU6XCJ2YXJpYW5jZVwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiZXBzaWxvblwiLGRsUGFyYW1OYW1lOlwiZXBzaWxvblwiLHR5cGU6XCJudW1iZXJcIixkZWZhdWx0VmFsdWU6LjAwMX0se3RmUGFyYW1OYW1lOlwiZGF0YV9mb3JtYXRcIixkbFBhcmFtTmFtZTpcImRhdGFGb3JtYXRcIix0eXBlOlwic3RyaW5nXCIsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIkZ1c2VkQmF0Y2hOb3JtVjJcIixkbE9wTmFtZTpcImJhdGNoTm9ybWFsaXphdGlvblwiLGNhdGVnb3J5Olwibm9ybWFsaXphdGlvblwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwic2NhbGVcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MixkbFBhcmFtTmFtZTpcIm9mZnNldFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDozLGRsUGFyYW1OYW1lOlwibWVhblwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDo0LGRsUGFyYW1OYW1lOlwidmFyaWFuY2VcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcImVwc2lsb25cIixkbFBhcmFtTmFtZTpcImVwc2lsb25cIix0eXBlOlwibnVtYmVyXCIsZGVmYXVsdFZhbHVlOi4wMDF9LHt0ZlBhcmFtTmFtZTpcImRhdGFfZm9ybWF0XCIsZGxQYXJhbU5hbWU6XCJkYXRhRm9ybWF0XCIsdHlwZTpcInN0cmluZ1wiLG5vdFN1cHBvcnRlZDohMH1dfSx7dGZPcE5hbWU6XCJMUk5cIixkbE9wTmFtZTpcImxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uXCIsY2F0ZWdvcnk6XCJub3JtYWxpemF0aW9uXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifSx7dGZQYXJhbU5hbWU6XCJkZXB0aF9yYWRpdXNcIixkbFBhcmFtTmFtZTpcInJhZGl1c1wiLHR5cGU6XCJudW1iZXJcIixkZWZhdWx0VmFsdWU6NX0se3RmUGFyYW1OYW1lOlwiYmlhc1wiLGRsUGFyYW1OYW1lOlwiYmlhc1wiLHR5cGU6XCJudW1iZXJcIixkZWZhdWx0VmFsdWU6MX0se3RmUGFyYW1OYW1lOlwiYWxwaGFcIixkbFBhcmFtTmFtZTpcImFscGhhXCIsdHlwZTpcIm51bWJlclwiLGRlZmF1bHRWYWx1ZToxfSx7dGZQYXJhbU5hbWU6XCJiZXRhXCIsZGxQYXJhbU5hbWU6XCJiZXRhXCIsdHlwZTpcIm51bWJlclwiLGRlZmF1bHRWYWx1ZTouNX1dfSx7dGZPcE5hbWU6XCJTb2Z0bWF4XCIsZGxPcE5hbWU6XCJzb2Z0bWF4XCIsY2F0ZWdvcnk6XCJub3JtYWxpemF0aW9uXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifV19XSxub3JtYWxpemF0aW9uPU9iamVjdC5mcmVlemUoe2pzb246anNvbiQxMX0pLGpzb24kMTI9W3t0Zk9wTmFtZTpcIk1heFwiLGRsT3BOYW1lOlwibWF4XCIsY2F0ZWdvcnk6XCJyZWR1Y3Rpb25cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcImF4aXNcIix0eXBlOlwibnVtYmVyW11cIn0se3RmUGFyYW1OYW1lOlwia2VlcF9kaW1zXCIsZGxQYXJhbU5hbWU6XCJrZWVwRGltc1wiLHR5cGU6XCJib29sXCJ9XX0se3RmT3BOYW1lOlwiTWVhblwiLGRsT3BOYW1lOlwibWVhblwiLGNhdGVnb3J5OlwicmVkdWN0aW9uXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifSx7dGZJbnB1dEluZGV4OjEsZGxQYXJhbU5hbWU6XCJheGlzXCIsdHlwZTpcIm51bWJlcltdXCJ9LHt0ZlBhcmFtTmFtZTpcImtlZXBfZGltc1wiLGRsUGFyYW1OYW1lOlwia2VlcERpbXNcIix0eXBlOlwiYm9vbFwifV19LHt0Zk9wTmFtZTpcIk1pblwiLGRsT3BOYW1lOlwibWluXCIsY2F0ZWdvcnk6XCJyZWR1Y3Rpb25cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcImF4aXNcIix0eXBlOlwibnVtYmVyW11cIn0se3RmUGFyYW1OYW1lOlwia2VlcF9kaW1zXCIsZGxQYXJhbU5hbWU6XCJrZWVwRGltc1wiLHR5cGU6XCJib29sXCJ9XX0se3RmT3BOYW1lOlwiU3VtXCIsZGxPcE5hbWU6XCJzdW1cIixjYXRlZ29yeTpcInJlZHVjdGlvblwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiYXhpc1wiLHR5cGU6XCJudW1iZXJbXVwifSx7dGZQYXJhbU5hbWU6XCJrZWVwX2RpbXNcIixkbFBhcmFtTmFtZTpcImtlZXBEaW1zXCIsdHlwZTpcImJvb2xcIn1dfSx7dGZPcE5hbWU6XCJBbGxcIixkbE9wTmFtZTpcImFsbFwiLGNhdGVnb3J5OlwicmVkdWN0aW9uXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifSx7dGZJbnB1dEluZGV4OjEsZGxQYXJhbU5hbWU6XCJheGlzXCIsdHlwZTpcIm51bWJlcltdXCJ9LHt0ZlBhcmFtTmFtZTpcImtlZXBfZGltc1wiLGRsUGFyYW1OYW1lOlwia2VlcERpbXNcIix0eXBlOlwiYm9vbFwifV19LHt0Zk9wTmFtZTpcIkFueVwiLGRsT3BOYW1lOlwiYW55XCIsY2F0ZWdvcnk6XCJyZWR1Y3Rpb25cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcImF4aXNcIix0eXBlOlwibnVtYmVyW11cIn0se3RmUGFyYW1OYW1lOlwia2VlcF9kaW1zXCIsZGxQYXJhbU5hbWU6XCJrZWVwRGltc1wiLHR5cGU6XCJib29sXCJ9XX0se3RmT3BOYW1lOlwiQXJnTWF4XCIsZGxPcE5hbWU6XCJhcmdNYXhcIixjYXRlZ29yeTpcInJlZHVjdGlvblwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiYXhpc1wiLHR5cGU6XCJudW1iZXJcIn1dfSx7dGZPcE5hbWU6XCJBcmdNaW5cIixkbE9wTmFtZTpcImFyZ01pblwiLGNhdGVnb3J5OlwicmVkdWN0aW9uXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifSx7dGZJbnB1dEluZGV4OjEsZGxQYXJhbU5hbWU6XCJheGlzXCIsdHlwZTpcIm51bWJlclwifV19LHt0Zk9wTmFtZTpcIlByb2RcIixkbE9wTmFtZTpcInByb2RcIixjYXRlZ29yeTpcInJlZHVjdGlvblwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiYXhpc1wiLHR5cGU6XCJudW1iZXJbXVwifSx7dGZQYXJhbU5hbWU6XCJrZWVwX2RpbXNcIixkbFBhcmFtTmFtZTpcImtlZXBEaW1zXCIsdHlwZTpcImJvb2xcIn1dfV0scmVkdWN0aW9uPU9iamVjdC5mcmVlemUoe2pzb246anNvbiQxMn0pLGpzb24kMTM9W3t0Zk9wTmFtZTpcIkNvbmNhdFYyXCIsZGxPcE5hbWU6XCJjb25jYXRcIixjYXRlZ29yeTpcInNsaWNlX2pvaW5cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCx0ZklucHV0UGFyYW1MZW5ndGg6MSxkbFBhcmFtTmFtZTpcInRlbnNvcnNcIix0eXBlOlwidGVuc29yc1wifSx7dGZJbnB1dEluZGV4Oi0xLGRsUGFyYW1OYW1lOlwiYXhpc1wiLHR5cGU6XCJudW1iZXJcIn1dfSx7dGZPcE5hbWU6XCJDb25jYXRcIixkbE9wTmFtZTpcImNvbmNhdFwiLGNhdGVnb3J5Olwic2xpY2Vfam9pblwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDoxLHRmSW5wdXRQYXJhbUxlbmd0aDoxLGRsUGFyYW1OYW1lOlwidGVuc29yc1wiLHR5cGU6XCJ0ZW5zb3JzXCJ9LHt0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcImF4aXNcIix0eXBlOlwibnVtYmVyXCJ9XX0se3RmT3BOYW1lOlwiR2F0aGVyVjJcIixkbE9wTmFtZTpcImdhdGhlclwiLGNhdGVnb3J5Olwic2xpY2Vfam9pblwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiaW5kaWNlc1wiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiYXhpc1wiLGRsUGFyYW1OYW1lOlwiYXhpc1wiLHR5cGU6XCJudW1iZXJcIixkZWZhdWx0VmFsdWU6MH1dfSx7dGZPcE5hbWU6XCJHYXRoZXJcIixkbE9wTmFtZTpcImdhdGhlclwiLGNhdGVnb3J5Olwic2xpY2Vfam9pblwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiaW5kaWNlc1wiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiYXhpc1wiLGRsUGFyYW1OYW1lOlwiYXhpc1wiLHR5cGU6XCJudW1iZXJcIixkZWZhdWx0VmFsdWU6MH0se3RmUGFyYW1OYW1lOlwidmFsaWRhdGVfaW5kaWNlc1wiLGRsUGFyYW1OYW1lOlwidmFsaWRhdGVJbmRpY2VzXCIsdHlwZTpcImJvb2xcIixub3RTdXBwb3J0ZWQ6ITB9XX0se3RmT3BOYW1lOlwiUmV2ZXJzZVwiLGRsT3BOYW1lOlwicmV2ZXJzZVwiLGNhdGVnb3J5Olwic2xpY2Vfam9pblwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwiYXhpc1wiLHR5cGU6XCJudW1iZXJcIn1dfSx7dGZPcE5hbWU6XCJSZXZlcnNlVjJcIixkbE9wTmFtZTpcInJldmVyc2VcIixjYXRlZ29yeTpcInNsaWNlX2pvaW5cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcImF4aXNcIix0eXBlOlwibnVtYmVyXCJ9XX0se3RmT3BOYW1lOlwiU2xpY2VcIixkbE9wTmFtZTpcInNsaWNlXCIsY2F0ZWdvcnk6XCJzbGljZV9qb2luXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifSx7dGZJbnB1dEluZGV4OjEsZGxQYXJhbU5hbWU6XCJiZWdpblwiLHR5cGU6XCJudW1iZXJbXVwifSx7dGZJbnB1dEluZGV4OjIsZGxQYXJhbU5hbWU6XCJzaXplXCIsdHlwZTpcIm51bWJlcltdXCJ9XX0se3RmT3BOYW1lOlwiU3RyaWRlZFNsaWNlXCIsZGxPcE5hbWU6XCJzdHJpZGVkU2xpY2VcIixjYXRlZ29yeTpcInNsaWNlX2pvaW5cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcImJlZ2luXCIsdHlwZTpcIm51bWJlcltdXCJ9LHt0ZklucHV0SW5kZXg6MixkbFBhcmFtTmFtZTpcImVuZFwiLHR5cGU6XCJudW1iZXJbXVwifSx7dGZJbnB1dEluZGV4OjMsZGxQYXJhbU5hbWU6XCJzdHJpZGVzXCIsdHlwZTpcIm51bWJlcltdXCJ9LHt0ZlBhcmFtTmFtZTpcImJlZ2luX21hc2tcIixkbFBhcmFtTmFtZTpcImJlZ2luTWFza1wiLHR5cGU6XCJudW1iZXJcIixkZWZhdWx0VmFsdWU6MH0se3RmUGFyYW1OYW1lOlwiZW5kX21hc2tcIixkbFBhcmFtTmFtZTpcImVuZE1hc2tcIix0eXBlOlwibnVtYmVyXCIsZGVmYXVsdFZhbHVlOjB9LHt0ZlBhcmFtTmFtZTpcIm5ld19heGlzX21hc2tcIixkbFBhcmFtTmFtZTpcIm5ld0F4aXNNYXNrXCIsdHlwZTpcIm51bWJlclwiLGRlZmF1bHRWYWx1ZTowfSx7dGZQYXJhbU5hbWU6XCJlbGxpcHNpc19tYXNrXCIsZGxQYXJhbU5hbWU6XCJlbGxpcHNpc01hc2tcIix0eXBlOlwibnVtYmVyXCIsZGVmYXVsdFZhbHVlOjB9LHt0ZlBhcmFtTmFtZTpcInNocmlua19heGlzX21hc2tcIixkbFBhcmFtTmFtZTpcInNocmlua0F4aXNNYXNrXCIsdHlwZTpcIm51bWJlclwiLGRlZmF1bHRWYWx1ZTowfV19LHt0Zk9wTmFtZTpcIlBhY2tcIixkbE9wTmFtZTpcInN0YWNrXCIsY2F0ZWdvcnk6XCJzbGljZV9qb2luXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsdGZJbnB1dFBhcmFtTGVuZ3RoOjAsZGxQYXJhbU5hbWU6XCJ0ZW5zb3JzXCIsdHlwZTpcInRlbnNvcnNcIn0se3RmUGFyYW1OYW1lOlwiYXhpc1wiLGRsUGFyYW1OYW1lOlwiYXhpc1wiLHR5cGU6XCJudW1iZXJcIixkZWZhdWx0VmFsdWU6MH1dfSx7dGZPcE5hbWU6XCJVbnBhY2tcIixkbE9wTmFtZTpcInVuc3RhY2tcIixjYXRlZ29yeTpcInNsaWNlX2pvaW5cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCx0ZklucHV0UGFyYW1MZW5ndGg6MCxkbFBhcmFtTmFtZTpcInRlbnNvclwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiYXhpc1wiLGRsUGFyYW1OYW1lOlwiYXhpc1wiLHR5cGU6XCJudW1iZXJcIixkZWZhdWx0VmFsdWU6MH0se3RmUGFyYW1OYW1lOlwibnVtXCIsZGxQYXJhbU5hbWU6XCJudW1cIix0eXBlOlwibnVtYmVyXCIsZGVmYXVsdFZhbHVlOjAsbm90U3VwcG9ydGVkOiEwfV19LHt0Zk9wTmFtZTpcIlRpbGVcIixkbE9wTmFtZTpcInRpbGVcIixjYXRlZ29yeTpcInNsaWNlX2pvaW5cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcInJlcHNcIix0eXBlOlwibnVtYmVyW11cIn1dfSx7dGZPcE5hbWU6XCJTcGxpdFwiLGRsT3BOYW1lOlwic3BsaXRcIixjYXRlZ29yeTpcInNsaWNlX2pvaW5cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcImF4aXNcIix0eXBlOlwibnVtYmVyXCIsZGVmYXVsdFZhbHVlOjB9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIm51bV9zcGxpdFwiLGRsUGFyYW1OYW1lOlwibnVtT3JTaXplU3BsaXRzXCIsdHlwZTpcIm51bWJlclwiLGRlZmF1bHRWYWx1ZToxfV19LHt0Zk9wTmFtZTpcIlNwbGl0VlwiLGRsT3BOYW1lOlwic3BsaXRcIixjYXRlZ29yeTpcInNsaWNlX2pvaW5cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcIm51bU9yU2l6ZVNwbGl0c1wiLHR5cGU6XCJudW1iZXJbXVwifSx7dGZJbnB1dEluZGV4OjIsZGxQYXJhbU5hbWU6XCJheGlzXCIsdHlwZTpcIm51bWJlclwiLGRlZmF1bHRWYWx1ZTowfV19XSxzbGljZUpvaW49T2JqZWN0LmZyZWV6ZSh7anNvbjpqc29uJDEzfSksanNvbiQxND1be3RmT3BOYW1lOlwiQ2FzdFwiLGRsT3BOYW1lOlwiY2FzdFwiLGNhdGVnb3J5OlwidHJhbnNmb3JtYXRpb25cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZlBhcmFtTmFtZTpcIlNyY1RcIixkbFBhcmFtTmFtZTpcInNkdHlwZVwiLHR5cGU6XCJkdHlwZVwiLG5vdFN1cHBvcnRlZDohMH0se3RmUGFyYW1OYW1lOlwiRHN0VFwiLGRsUGFyYW1OYW1lOlwiZHR5cGVcIix0eXBlOlwiZHR5cGVcIn1dfSx7dGZPcE5hbWU6XCJFeHBhbmREaW1zXCIsZGxPcE5hbWU6XCJleHBhbmREaW1zXCIsY2F0ZWdvcnk6XCJ0cmFuc2Zvcm1hdGlvblwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLHRmUGFyYW1OYW1lRGVwcmVjYXRlZDpcImRpbVwiLGRsUGFyYW1OYW1lOlwiYXhpc1wiLHR5cGU6XCJudW1iZXJcIn1dfSx7dGZPcE5hbWU6XCJQYWRcIixkbE9wTmFtZTpcInBhZFwiLGNhdGVnb3J5OlwidHJhbnNmb3JtYXRpb25cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcInBhZGRpbmdcIix0eXBlOlwibnVtYmVyW11cIn0se3RmUGFyYW1OYW1lOlwiY29uc3RhbnRfdmFsdWVcIixkbFBhcmFtTmFtZTpcImNvbnN0YW50VmFsdWVcIix0eXBlOlwibnVtYmVyXCIsZGVmYXVsdFZhbHVlOjB9XX0se3RmT3BOYW1lOlwiUGFkVjJcIixkbE9wTmFtZTpcInBhZFwiLGNhdGVnb3J5OlwidHJhbnNmb3JtYXRpb25cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcInBhZGRpbmdcIix0eXBlOlwibnVtYmVyW11cIn0se3RmSW5wdXRJbmRleDoyLGRsUGFyYW1OYW1lOlwiY29uc3RhbnRWYWx1ZVwiLHR5cGU6XCJudW1iZXJcIixkZWZhdWx0VmFsdWU6MH1dfSx7dGZPcE5hbWU6XCJSZXNoYXBlXCIsZGxPcE5hbWU6XCJyZXNoYXBlXCIsY2F0ZWdvcnk6XCJ0cmFuc2Zvcm1hdGlvblwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmSW5wdXRJbmRleDoxLGRsUGFyYW1OYW1lOlwic2hhcGVcIix0eXBlOlwibnVtYmVyW11cIn1dfSx7dGZPcE5hbWU6XCJTcXVlZXplXCIsZGxPcE5hbWU6XCJzcXVlZXplXCIsY2F0ZWdvcnk6XCJ0cmFuc2Zvcm1hdGlvblwiLHBhcmFtczpbe3RmSW5wdXRJbmRleDowLGRsUGFyYW1OYW1lOlwieFwiLHR5cGU6XCJ0ZW5zb3JcIn0se3RmUGFyYW1OYW1lOlwiYXhpc1wiLHRmUGFyYW1OYW1lRGVwcmVjYXRlZDpcInNxdWVlemVfZGltc1wiLGRsUGFyYW1OYW1lOlwiYXhpc1wiLHR5cGU6XCJudW1iZXJbXVwifV19LHt0Zk9wTmFtZTpcIlNwYWNlVG9CYXRjaE5EXCIsZGxPcE5hbWU6XCJzcGFjZVRvQmF0Y2hORFwiLGNhdGVnb3J5OlwidHJhbnNmb3JtYXRpb25cIixwYXJhbXM6W3t0ZklucHV0SW5kZXg6MCxkbFBhcmFtTmFtZTpcInhcIix0eXBlOlwidGVuc29yXCJ9LHt0ZklucHV0SW5kZXg6MSxkbFBhcmFtTmFtZTpcImJsb2NrU2hhcGVcIix0eXBlOlwibnVtYmVyW11cIn0se3RmSW5wdXRJbmRleDoyLGRsUGFyYW1OYW1lOlwicGFkZGluZ3NcIix0eXBlOlwibnVtYmVyW11cIn1dfSx7dGZPcE5hbWU6XCJCYXRjaFRvU3BhY2VORFwiLGRsT3BOYW1lOlwiYmF0Y2hUb1NwYWNlTkRcIixjYXRlZ29yeTpcInRyYW5zZm9ybWF0aW9uXCIscGFyYW1zOlt7dGZJbnB1dEluZGV4OjAsZGxQYXJhbU5hbWU6XCJ4XCIsdHlwZTpcInRlbnNvclwifSx7dGZJbnB1dEluZGV4OjEsZGxQYXJhbU5hbWU6XCJibG9ja1NoYXBlXCIsdHlwZTpcIm51bWJlcltdXCJ9LHt0ZklucHV0SW5kZXg6MixkbFBhcmFtTmFtZTpcImNyb3BzXCIsdHlwZTpcIm51bWJlcltdXCJ9XX1dLHRyYW5zZm9ybWF0aW9uPU9iamVjdC5mcmVlemUoe2pzb246anNvbiQxNH0pLENPTlRST0xfRkxPV19PUFM9W1wiU3dpdGNoXCIsXCJNZXJnZVwiLFwiRW50ZXJcIixcIkV4aXRcIixcIk5leHRJdGVyYXRpb25cIl0sRFlOQU1JQ19TSEFQRV9PUFM9W1wiTm9uTWF4U3VwcHJlc3Npb25WMlwiLFwiTm9uTWF4U3VwcHJlc3Npb25WM1wiLFwiV2hlcmVcIl0sT3BlcmF0aW9uTWFwcGVyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3ZhciBlPVthcml0aG1ldGljLGJhc2ljTWF0aCxjb250cm9sLGNvbnZvbHV0aW9uLGNyZWF0aW9uLGR5bmFtaWMsZXZhbHVhdGlvbixsb2dpY2FsLGltYWdlJDEsZ3JhcGgsbWF0cmljZXMsbm9ybWFsaXphdGlvbixyZWR1Y3Rpb24sc2xpY2VKb2luLHRyYW5zZm9ybWF0aW9uXSx0PVtdLmNvbmNhdC5hcHBseShbXSxlLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5qc29ufSkpO3RoaXMub3BNYXBwZXJzPXQucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbdC50Zk9wTmFtZV09dCxlfSx7fSl9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiSW5zdGFuY2VcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2luc3RhbmNlfHwodGhpcy5faW5zdGFuY2U9bmV3IHRoaXMpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmlzQ29udHJvbEZsb3c9ZnVuY3Rpb24oZSl7cmV0dXJuIENPTlRST0xfRkxPV19PUFMuc29tZShmdW5jdGlvbih0KXtyZXR1cm4gdD09PWUub3B9KX0sZS5wcm90b3R5cGUuaXNEeW5hbWljU2hhcGU9ZnVuY3Rpb24oZSl7cmV0dXJuIERZTkFNSUNfU0hBUEVfT1BTLnNvbWUoZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1lLm9wfSl9LGUucHJvdG90eXBlLnRyYW5zZm9ybUdyYXBoPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsYT0hMSxyPSExLG49W10sbz1bXSxzPWUubm9kZS5yZWR1Y2UoZnVuY3Rpb24oZSxzKXtyZXR1cm4gZVtzLm5hbWVdPXQubWFwTm9kZShzKSx0LmlzQ29udHJvbEZsb3cocykmJihhPSEwKSx0LmlzRHluYW1pY1NoYXBlKHMpJiYocj0hMCksXCJQbGFjZWhvbGRlclwiPT09cy5vcCYmbi5wdXNoKGVbcy5uYW1lXSksXCJDb25zdFwiPT09cy5vcCYmby5wdXNoKGVbcy5uYW1lXSksZX0se30pLGk9W10scD1bXTtyZXR1cm4gT2JqZWN0LmtleXMocykuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1zW2VdO3QuaW5wdXROYW1lcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBhPWdldE5vZGVOYW1lQW5kSW5kZXgoZSlbMF07dC5pbnB1dHMucHVzaChzW2FdKSxzW2FdLmNoaWxkcmVuLnB1c2godCl9KSwwPT09dC5pbnB1dHMubGVuZ3RoJiZpLnB1c2godCl9KSxPYmplY3Qua2V5cyhzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXNbZV07MD09PXQuY2hpbGRyZW4ubGVuZ3RoJiZwLnB1c2godCl9KSx7bm9kZXM6cyxpbnB1dHM6aSxvdXRwdXRzOnAsd2VpZ2h0czpvLHBsYWNlaG9sZGVyczpuLHdpdGhDb250cm9sRmxvdzphLHdpdGhEeW5hbWljU2hhcGU6cn19LGUucHJvdG90eXBlLm1hcE5vZGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxhPXRoaXMub3BNYXBwZXJzW2Uub3BdO2lmKHZvaWQgMD09PWEpdGhyb3cgbmV3IEVycm9yKFwiVGVuc29yZmxvdyBPcCBpcyBub3Qgc3VwcG9ydGVkOiBcIitlLm9wKTt2YXIgcj17bmFtZTplLm5hbWUsb3A6YS5kbE9wTmFtZSxjYXRlZ29yeTphLmNhdGVnb3J5LGlucHV0TmFtZXM6KGUuaW5wdXR8fFtdKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3RhcnRzV2l0aChcIl5cIik/ZS5zdWJzdHIoMSk6ZX0pLGlucHV0czpbXSxjaGlsZHJlbjpbXSxwYXJhbXM6e319O3JldHVybiBhLnBhcmFtcyYmKHIucGFyYW1zPWEucGFyYW1zLnJlZHVjZShmdW5jdGlvbihhLHIpe3ZhciBuPXIudGZJbnB1dEluZGV4LG89ci50ZklucHV0UGFyYW1MZW5ndGgscz1yLnR5cGUsaT12b2lkIDA7aWYodm9pZCAwPT09bilzd2l0Y2goci50eXBlKXtjYXNlXCJzdHJpbmdcIjp2b2lkIDA9PT0oaT10LmdldFN0cmluZ1BhcmFtKGUuYXR0cixyLnRmUGFyYW1OYW1lLHIuZGVmYXVsdFZhbHVlKSkmJnIudGZQYXJhbU5hbWVEZXByZWNhdGVkJiYoaT10LmdldFN0cmluZ1BhcmFtKGUuYXR0cixyLnRmUGFyYW1OYW1lRGVwcmVjYXRlZCxyLmRlZmF1bHRWYWx1ZSkpO2JyZWFrO2Nhc2VcIm51bWJlclwiOnZvaWQgMD09PShpPXQuZ2V0TnVtYmVyUGFyYW0oZS5hdHRyLHIudGZQYXJhbU5hbWUsci5kZWZhdWx0VmFsdWUpKSYmci50ZlBhcmFtTmFtZURlcHJlY2F0ZWQmJihpPXQuZ2V0TnVtYmVyUGFyYW0oZS5hdHRyLHIudGZQYXJhbU5hbWVEZXByZWNhdGVkLHIuZGVmYXVsdFZhbHVlKSk7YnJlYWs7Y2FzZVwibnVtYmVyW11cIjp2b2lkIDA9PT0oaT10LmdldE51bWVyaWNBcnJheVBhcmFtKGUuYXR0cixyLnRmUGFyYW1OYW1lLHIuZGVmYXVsdFZhbHVlKSkmJnIudGZQYXJhbU5hbWVEZXByZWNhdGVkJiYoaT10LmdldE51bWVyaWNBcnJheVBhcmFtKGUuYXR0cixyLnRmUGFyYW1OYW1lRGVwcmVjYXRlZCxyLmRlZmF1bHRWYWx1ZSkpO2JyZWFrO2Nhc2VcImJvb2xcIjp2b2lkIDA9PT0oaT10LmdldEJvb2xQYXJhbShlLmF0dHIsci50ZlBhcmFtTmFtZSxyLmRlZmF1bHRWYWx1ZSkpJiZyLnRmUGFyYW1OYW1lRGVwcmVjYXRlZCYmKGk9dC5nZXRCb29sUGFyYW0oZS5hdHRyLHIudGZQYXJhbU5hbWVEZXByZWNhdGVkLHIuZGVmYXVsdFZhbHVlKSk7YnJlYWs7Y2FzZVwic2hhcGVcIjp2b2lkIDA9PT0oaT10LmdldFRlbnNvclNoYXBlUGFyYW0oZS5hdHRyLHIudGZQYXJhbU5hbWUsci5kZWZhdWx0VmFsdWUpKSYmci50ZlBhcmFtTmFtZURlcHJlY2F0ZWQmJihpPXQuZ2V0VGVuc29yU2hhcGVQYXJhbShlLmF0dHIsci50ZlBhcmFtTmFtZURlcHJlY2F0ZWQsci5kZWZhdWx0VmFsdWUpKTticmVhaztjYXNlXCJkdHlwZVwiOnZvaWQgMD09PShpPXQuZ2V0RHR5cGVQYXJhbShlLmF0dHIsci50ZlBhcmFtTmFtZSxyLmRlZmF1bHRWYWx1ZSkpJiZyLnRmUGFyYW1OYW1lRGVwcmVjYXRlZCYmKGk9dC5nZXREdHlwZVBhcmFtKGUuYXR0cixyLnRmUGFyYW1OYW1lRGVwcmVjYXRlZCxyLmRlZmF1bHRWYWx1ZSkpO2JyZWFrO2Nhc2VcInRlbnNvclwiOmNhc2VcInRlbnNvcnNcIjpicmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIHBhcmFtIHR5cGU6IFwiK3IudHlwZStcIiBmb3Igb3A6IFwiK2Uub3ApfXJldHVybiBhW3IuZGxQYXJhbU5hbWVdPXt2YWx1ZTppLGlucHV0SW5kZXg6bix0eXBlOnMsaW5wdXRQYXJhbUxlbmd0aDpvfSxhfSx7fSkpLHJ9LGUucHJvdG90eXBlLmdldFN0cmluZ1BhcmFtPWZ1bmN0aW9uKGUsdCxhLHIpe3ZvaWQgMD09PXImJihyPSExKTt2YXIgbj1lW3RdO2lmKHZvaWQgMCE9PW4pe3ZhciBvPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxuLnMpO3JldHVybiByP286by50b0xvd2VyQ2FzZSgpfXJldHVybiBhfSxlLnByb3RvdHlwZS5nZXRCb29sUGFyYW09ZnVuY3Rpb24oZSx0LGEpe3ZhciByPWVbdF07cmV0dXJuIHI/ci5iOmF9LGUucHJvdG90eXBlLmdldE51bWJlclBhcmFtPWZ1bmN0aW9uKGUsdCxhKXt2YXIgcj1lW3RdLG49cj9yW3IudmFsdWVdOmE7cmV0dXJuXCJudW1iZXJcIj09dHlwZW9mIG4/bjpuLnRvSW50KCl9LGUucHJvdG90eXBlLmdldER0eXBlUGFyYW09ZnVuY3Rpb24oZSx0LGEpe3ZhciByPWVbdF07aWYociYmci50eXBlKXN3aXRjaChyLnR5cGUpe2Nhc2UgY29tcGlsZWRfYXBpXzEuRGF0YVR5cGUuRFRfRkxPQVQ6cmV0dXJuXCJmbG9hdDMyXCI7Y2FzZSBjb21waWxlZF9hcGlfMS5EYXRhVHlwZS5EVF9JTlQzMjpyZXR1cm5cImludDMyXCI7Y2FzZSBjb21waWxlZF9hcGlfMS5EYXRhVHlwZS5EVF9CT09MOnJldHVyblwiYm9vbFwiO2RlZmF1bHQ6cmV0dXJuIGF9cmV0dXJuIGF9LGUucHJvdG90eXBlLmdldFRlbnNvclNoYXBlUGFyYW09ZnVuY3Rpb24oZSx0LGEpe3ZhciByPWVbdF07cmV0dXJuIHImJnIuc2hhcGU/ci5zaGFwZS5kaW0ubWFwKGZ1bmN0aW9uKGUpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiBlLnNpemU/ZS5zaXplOmUuc2l6ZS50b0ludCgpfSk6YX0sZS5wcm90b3R5cGUuZ2V0TnVtZXJpY0FycmF5UGFyYW09ZnVuY3Rpb24oZSx0LGEpe3ZhciByPWVbdF07cmV0dXJuIHI/KHIubGlzdC5mJiZyLmxpc3QuZi5sZW5ndGg/ci5saXN0LmY6ci5saXN0LmkpLm1hcChmdW5jdGlvbihlKXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgZT9lOmUudG9JbnQoKX0pOmF9LGV9KCksZXhlY3V0ZU9wPWZ1bmN0aW9uKGUsdCxhKXtzd2l0Y2goZS5vcCl7Y2FzZVwiYWRkXCI6cmV0dXJuW2FkZChnZXRQYXJhbVZhbHVlKFwiYVwiLGUsdCxhKSxnZXRQYXJhbVZhbHVlKFwiYlwiLGUsdCxhKSldO2Nhc2VcImFkZE5cIjpyZXR1cm5bYWRkTihnZXRQYXJhbVZhbHVlKFwidGVuc29yc1wiLGUsdCxhKSldO2Nhc2VcIm1vZFwiOnJldHVyblttb2QoZ2V0UGFyYW1WYWx1ZShcImFcIixlLHQsYSksZ2V0UGFyYW1WYWx1ZShcImJcIixlLHQsYSkpXTtjYXNlXCJtdWxcIjpyZXR1cm5bbXVsKGdldFBhcmFtVmFsdWUoXCJhXCIsZSx0LGEpLGdldFBhcmFtVmFsdWUoXCJiXCIsZSx0LGEpKV07Y2FzZVwiZGl2XCI6cmV0dXJuW2RpdihnZXRQYXJhbVZhbHVlKFwiYVwiLGUsdCxhKSxnZXRQYXJhbVZhbHVlKFwiYlwiLGUsdCxhKSldO2Nhc2VcImZsb29yRGl2XCI6cmV0dXJuW2Zsb29yRGl2KGdldFBhcmFtVmFsdWUoXCJhXCIsZSx0LGEpLGdldFBhcmFtVmFsdWUoXCJiXCIsZSx0LGEpKV07Y2FzZVwic3ViXCI6cmV0dXJuW3N1YihnZXRQYXJhbVZhbHVlKFwiYVwiLGUsdCxhKSxnZXRQYXJhbVZhbHVlKFwiYlwiLGUsdCxhKSldO2Nhc2VcIm1pbmltdW1cIjpyZXR1cm5bbWluaW11bShnZXRQYXJhbVZhbHVlKFwiYVwiLGUsdCxhKSxnZXRQYXJhbVZhbHVlKFwiYlwiLGUsdCxhKSldO2Nhc2VcIm1heGltdW1cIjpyZXR1cm5bbWF4aW11bShnZXRQYXJhbVZhbHVlKFwiYVwiLGUsdCxhKSxnZXRQYXJhbVZhbHVlKFwiYlwiLGUsdCxhKSldO2Nhc2VcInBvd1wiOnJldHVybltwb3coZ2V0UGFyYW1WYWx1ZShcImFcIixlLHQsYSksZ2V0UGFyYW1WYWx1ZShcImJcIixlLHQsYSkpXTtjYXNlXCJzcXVhcmVkRGlmZmVyZW5jZVwiOnJldHVybltzcXVhcmVkRGlmZmVyZW5jZShnZXRQYXJhbVZhbHVlKFwiYVwiLGUsdCxhKSxnZXRQYXJhbVZhbHVlKFwiYlwiLGUsdCxhKSldO2RlZmF1bHQ6dGhyb3cgVHlwZUVycm9yKFwiTm9kZSB0eXBlIFwiK2Uub3ArXCIgaXMgbm90IGltcGxlbWVudGVkXCIpfX0sZXhlY3V0ZU9wJDE9ZnVuY3Rpb24oZSx0LGEpe3N3aXRjaChlLm9wKXtjYXNlXCJhYnNcIjpyZXR1cm5bYWJzKGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpKV07Y2FzZVwiYWNvc1wiOnJldHVyblthY29zKGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpKV07Y2FzZVwiYWNvc2hcIjpyZXR1cm5bYWNvc2goZ2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSkpXTtjYXNlXCJhc2luXCI6cmV0dXJuW2FzaW4oZ2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSkpXTtjYXNlXCJhc2luaFwiOnJldHVyblthc2luaChnZXRQYXJhbVZhbHVlKFwieFwiLGUsdCxhKSldO2Nhc2VcImF0YW5cIjpyZXR1cm5bYXRhbihnZXRQYXJhbVZhbHVlKFwieFwiLGUsdCxhKSldO2Nhc2VcImF0YW5oXCI6cmV0dXJuW2F0YW5oKGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpKV07Y2FzZVwiY2VpbFwiOnJldHVybltjZWlsKGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpKV07Y2FzZVwiY29zXCI6cmV0dXJuW2NvcyhnZXRQYXJhbVZhbHVlKFwieFwiLGUsdCxhKSldO2Nhc2VcImNvc2hcIjpyZXR1cm5bY29zaChnZXRQYXJhbVZhbHVlKFwieFwiLGUsdCxhKSldO2Nhc2VcImVsdVwiOnJldHVybltlbHUoZ2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSkpXTtjYXNlXCJlcmZcIjpyZXR1cm5bZXJmKGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpKV07Y2FzZVwiZXhwXCI6cmV0dXJuW2V4cChnZXRQYXJhbVZhbHVlKFwieFwiLGUsdCxhKSldO2Nhc2VcImV4cG0xXCI6cmV0dXJuW2V4cG0xKGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpKV07Y2FzZVwiZmxvb3JcIjpyZXR1cm5bZmxvb3IoZ2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSkpXTtjYXNlXCJsb2dcIjpyZXR1cm5bbG9nKGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpKV07Y2FzZVwibG9nMXBcIjpyZXR1cm5bbG9nMXAoZ2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSkpXTtjYXNlXCJuZWdcIjpyZXR1cm5bbmVnKGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpKV07Y2FzZVwicmVjaXByb2NhbFwiOnJldHVybltyZWNpcHJvY2FsKGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpKV07Y2FzZVwicmVsdVwiOnJldHVybltyZWx1KGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpKV07Y2FzZVwicm91bmRcIjpyZXR1cm5bcm91bmQoZ2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSkpXTtjYXNlXCJzZWx1XCI6cmV0dXJuW3NlbHUoZ2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSkpXTtjYXNlXCJzaWdtb2lkXCI6cmV0dXJuW3NpZ21vaWQoZ2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSkpXTtjYXNlXCJzaW5cIjpyZXR1cm5bc2luKGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpKV07Y2FzZVwic2lnblwiOnJldHVybltzaWduKGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpKV07Y2FzZVwic2luaFwiOnJldHVybltzaW5oKGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpKV07Y2FzZVwic29mdHBsdXNcIjpyZXR1cm5bc29mdHBsdXMoZ2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSkpXTtjYXNlXCJzcXJ0XCI6cmV0dXJuW3NxcnQoZ2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSkpXTtjYXNlXCJzcXVhcmVcIjpyZXR1cm5bc3F1YXJlKGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpKV07Y2FzZVwidGFuaFwiOnJldHVyblt0YW5oKGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpKV07Y2FzZVwidGFuXCI6cmV0dXJuW3RhbihnZXRQYXJhbVZhbHVlKFwieFwiLGUsdCxhKSldO2Nhc2VcImNsaXBCeVZhbHVlXCI6cmV0dXJuW2NsaXBCeVZhbHVlKGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpLGdldFBhcmFtVmFsdWUoXCJjbGlwVmFsdWVNaW5cIixlLHQsYSksZ2V0UGFyYW1WYWx1ZShcImNsaXBWYWx1ZU1heFwiLGUsdCxhKSldO2Nhc2VcInJzcXJ0XCI6cmV0dXJuW2RpdihzY2FsYXIoMSxcImZsb2F0MzJcIiksc3FydChnZXRUZW5zb3IoZS5pbnB1dE5hbWVzWzBdLHQsYSkpKV07ZGVmYXVsdDp0aHJvdyBUeXBlRXJyb3IoXCJOb2RlIHR5cGUgXCIrZS5vcCtcIiBpcyBub3QgaW1wbGVtZW50ZWRcIil9fSxUZW5zb3JBcnJheT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxhLHIsbixvLHMsaSl7dGhpcy5uYW1lPXQsdGhpcy5kdHlwZT1hLHRoaXMubWF4U2l6ZT1yLHRoaXMuZWxlbWVudFNoYXBlPW4sdGhpcy5pZGVudGljYWxFbGVtZW50U2hhcGVzPW8sdGhpcy5keW5hbWljU2l6ZT1zLHRoaXMuY2xlYXJBZnRlclJlYWQ9aSx0aGlzLnRlbnNvcnM9W10sdGhpcy5jbG9zZWRfPSExLHRoaXMuaWQ9ZS5uZXh0SWQrK31yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiY2xvc2VkXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb3NlZF99LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuY2xlYXJBbmRDbG9zZT1mdW5jdGlvbigpe3RoaXMudGVuc29ycy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRlbnNvci5kaXNwb3NlKCl9KSx0aGlzLnRlbnNvcnM9W10sdGhpcy5jbG9zZWRfPSEwfSxlLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGVuc29ycy5sZW5ndGh9LGUucHJvdG90eXBlLnJlYWQ9ZnVuY3Rpb24oZSl7aWYodGhpcy5jbG9zZWRfKXRocm93IG5ldyBFcnJvcihcIlRlbnNvckFycmF5IFwiK3RoaXMubmFtZStcIiBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC5cIik7aWYoZTwwfHxlPj10aGlzLnRlbnNvcnMubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcIlRyaWVkIHRvIHJlYWQgZnJvbSBpbmRleCBcIitlK1wiLCBidXQgYXJyYXkgc2l6ZSBpczogXCIrdGhpcy50ZW5zb3JzLmxlbmd0aCk7dmFyIHQ9dGhpcy50ZW5zb3JzW2VdO2lmKHQuY2xlYXJlZCl0aHJvdyBuZXcgRXJyb3IoXCJUZW5zb3JBcnJheSBcIit0aGlzLm5hbWUrXCI6IENvdWxkIG5vdCByZWFkIGluZGV4IFwiK2UrXCIgdHdpY2UgYmVjYXVzZSBpdCB3YXMgY2xlYXJlZCBhZnRlciBhIHByZXZpb3VzIHJlYWQgKHBlcmhhcHMgdHJ5IHNldHRpbmcgY2xlYXJfYWZ0ZXJfcmVhZCA9IGZhbHNlPykuXCIpO3JldHVybiB0aGlzLmNsZWFyQWZ0ZXJSZWFkJiYodC5jbGVhcmVkPSEwKSx0LnJlYWQ9ITAsdC50ZW5zb3J9LGUucHJvdG90eXBlLnJlYWRNYW55PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIGUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiB0LnJlYWQoZSl9KX0sZS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24oZSx0KXtpZih0aGlzLmNsb3NlZF8pdGhyb3cgbmV3IEVycm9yKFwiVGVuc29yQXJyYXkgXCIrdGhpcy5uYW1lK1wiIGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLlwiKTtpZihlPDB8fCF0aGlzLmR5bmFtaWNTaXplJiZlPj10aGlzLm1heFNpemUpdGhyb3cgbmV3IEVycm9yKFwiVHJpZWQgdG8gd3JpdGUgdG8gaW5kZXggXCIrZStcIiwgYnV0IGFycmF5IGlzIG5vdCByZXNpemVhYmxlIGFuZCBzaXplIGlzOiBcIit0aGlzLm1heFNpemUpO3ZhciBhPXRoaXMudGVuc29yc1tlXXx8e307aWYodC5kdHlwZSE9PXRoaXMuZHR5cGUpdGhyb3cgbmV3IEVycm9yKFwiVGVuc29yQXJyYXkgXCIrdGhpcy5uYW1lK1wiOiBDb3VsZCBub3Qgd3JpdGUgdG8gVGVuc29yQXJyYXkgaW5kZXggXCIrZStcIixcXG4gICAgICAgICAgYmVjYXVzZSB0aGUgdmFsdWUgZHR5cGUgaXMgXCIrdC5kdHlwZStcIiwgYnV0IFRlbnNvckFycmF5IGR0eXBlIGlzIFwiK3RoaXMuZHR5cGUrXCIuXCIpO2lmKDA9PT10aGlzLnNpemUoKSYmMD09PXRoaXMuZWxlbWVudFNoYXBlLmxlbmd0aCYmKHRoaXMuZWxlbWVudFNoYXBlPXQuc2hhcGUpLHRoaXMuYXNzZXJ0U2hhcGVzTWF0Y2godGhpcy5lbGVtZW50U2hhcGUsdC5zaGFwZSxcIlRlbnNvckFycmF5IFwiK3RoaXMubmFtZStcIjogQ291bGQgbm90IHdyaXRlIHRvIFRlbnNvckFycmF5IGluZGV4IFwiK2UrXCIuXCIpLGEmJmEucmVhZCl0aHJvdyBuZXcgRXJyb3IoXCJUZW5zb3JBcnJheSBcIit0aGlzLm5hbWUrXCI6IENvdWxkIG5vdCB3cml0ZSB0byBUZW5zb3JBcnJheSBpbmRleCBcIitlK1wiLCBiZWNhdXNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gcmVhZC5cIik7aWYoYSYmYS53cml0dGVuKXRocm93IG5ldyBFcnJvcihcIlRlbnNvckFycmF5IFwiK3RoaXMubmFtZStcIjogQ291bGQgbm90IHdyaXRlIHRvIFRlbnNvckFycmF5IGluZGV4IFwiK2UrXCIsIGJlY2F1c2UgaXQgaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuLlwiKTthLnRlbnNvcj10LGEud3JpdHRlbj0hMCx0aGlzLnRlbnNvcnNbZV09YX0sZS5wcm90b3R5cGUud3JpdGVNYW55PWZ1bmN0aW9uKGUsdCl7dmFyIGE9dGhpcztpZihlLmxlbmd0aCE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcIlRlbnNvckFycmF5IFwiK3RoaXMubmFtZStcIjogY291bGQgbm90IHdyaXRlIG11bHRpcGxlIHRlbnNvcnMsYmVjYXVzZSB0aGUgaW5kZXggc2l6ZTogXCIrZS5sZW5ndGgrXCIgaXMgbm90IHRoZSBzYW1lIGFzIHRlbnNvcnMgc2l6ZTogXCIrdC5sZW5ndGgrXCIuXCIpO2UuZm9yRWFjaChmdW5jdGlvbihlLHIpe3JldHVybiBhLndyaXRlKGUsdFtyXSl9KX0sZS5wcm90b3R5cGUuZ2F0aGVyPWZ1bmN0aW9uKGUsdCl7aWYodCYmdCE9PXRoaXMuZHR5cGUpdGhyb3cgbmV3IEVycm9yKFwiVGVuc29yQXJyYXkgZHR5cGUgaXMgXCIrdGhpcy5kdHlwZStcIiBidXQgZ2F0aGVyIHJlcXVlc3RlZCBkdHlwZSBcIit0KTtpZighZSl7ZT1bXTtmb3IodmFyIGE9MDthPHRoaXMuc2l6ZSgpO2ErKyllLnB1c2goYSl9aWYoMD09PWUubGVuZ3RoKXJldHVybiB0ZW5zb3IoW10sWzBdLmNvbmNhdCh0aGlzLmVsZW1lbnRTaGFwZSkpO3ZhciByPXRoaXMucmVhZE1hbnkoZSk7cmV0dXJuIHRoaXMuYXNzZXJ0U2hhcGVzTWF0Y2godGhpcy5lbGVtZW50U2hhcGUsclswXS5zaGFwZSxcIlRlbnNvckFycmF5IHNoYXBlIG1pc21hdGNoOiBcIiksc3RhY2sociwwKX0sZS5wcm90b3R5cGUuY29uY2F0PWZ1bmN0aW9uKGUpe2lmKGUmJmUhPT10aGlzLmR0eXBlKXRocm93IG5ldyBFcnJvcihcIlRlbnNvckFycmF5IGR0eXBlIGlzIFwiK3RoaXMuZHR5cGUrXCIgYnV0IGNvbmNhdCByZXF1ZXN0ZWQgZHR5cGUgXCIrZSk7aWYoMD09PXRoaXMuc2l6ZSgpKXJldHVybiB0ZW5zb3IoW10sWzBdLmNvbmNhdCh0aGlzLmVsZW1lbnRTaGFwZSkpO2Zvcih2YXIgdD1bXSxhPTA7YTx0aGlzLnNpemUoKTthKyspdC5wdXNoKGEpO3ZhciByPXRoaXMucmVhZE1hbnkodCk7cmV0dXJuIHRoaXMuYXNzZXJ0U2hhcGVzTWF0Y2godGhpcy5lbGVtZW50U2hhcGUsclswXS5zaGFwZSxcIlRlbnNvckFycmF5IHNoYXBlIG1pc21hdGNoOiB0ZW5zb3IgYXJyYXkgc2hhcGUgKFwiK3RoaXMuZWxlbWVudFNoYXBlK1wiKSB2cyBmaXJzdCB0ZW5zb3Igc2hhcGUgKFwiK3JbMF0uc2hhcGUrXCIpXCIpLGNvbmNhdChyLDApfSxlLnByb3RvdHlwZS5zY2F0dGVyPWZ1bmN0aW9uKGUsdCl7aWYodC5kdHlwZSE9PXRoaXMuZHR5cGUpdGhyb3cgbmV3IEVycm9yKFwiVGVuc29yQXJyYXkgZHR5cGUgaXMgXCIrdGhpcy5kdHlwZStcIiBidXQgdGVuc29yIGhhcyBkdHlwZSBcIit0LmR0eXBlKTtpZihlLmxlbmd0aCE9PXQuc2hhcGVbMF0pdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgbGVuKGluZGljZXMpID09IHRlbnNvci5zaGFwZVswXSwgYnV0IHNhdzogXCIrZS5sZW5ndGgrXCIgdnMuIFwiK3Quc2hhcGVbMF0pO3ZhciBhPU1hdGgubWF4LmFwcGx5KE1hdGgsZSk7aWYoIXRoaXMuZHluYW1pY1NpemUmJmE+PXRoaXMubWF4U2l6ZSl0aHJvdyBuZXcgRXJyb3IoXCJNYXggaW5kZXggbXVzdCBiZSA8IGFycmF5IHNpemUgKFwiK2ErXCIgIHZzLiBcIit0aGlzLm1heFNpemUrXCIpXCIpO3RoaXMud3JpdGVNYW55KGUsdW5zdGFjayh0LDApKX0sZS5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24oZSx0KXt2YXIgYT10aGlzO2lmKHQuZHR5cGUhPT10aGlzLmR0eXBlKXRocm93IG5ldyBFcnJvcihcIlRlbnNvckFycmF5IGR0eXBlIGlzIFwiK3RoaXMuZHR5cGUrXCIgYnV0IHRlbnNvciBoYXMgZHR5cGUgXCIrdC5kdHlwZSk7dmFyIHI9MCxuPWUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiByKz1lfSk7aWYociE9PXQuc2hhcGVbMF0pdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgc3VtIG9mIGxlbmd0aHMgdG8gYmUgZXF1YWwgdG9cXG4gICAgICAgICAgdGVuc29yLnNoYXBlWzBdLCBidXQgc3VtIG9mIGxlbmd0aHMgaXNcXG4gICAgICAgIFwiK3IrXCIsIGFuZCB0ZW5zb3IncyBzaGFwZSBpczogXCIrdC5zaGFwZSk7aWYoIXRoaXMuZHluYW1pY1NpemUmJmUubGVuZ3RoIT09dGhpcy5tYXhTaXplKXRocm93IG5ldyBFcnJvcihcIlRlbnNvckFycmF5J3Mgc2l6ZSBpcyBub3QgZXF1YWwgdG8gdGhlIHNpemUgb2YgbGVuZ3RocyAoXCIrdGhpcy5tYXhTaXplK1wiIHZzLiBcIitlLmxlbmd0aCtcIiksIGFuZCB0aGUgVGVuc29yQXJyYXkgaXMgbm90IG1hcmtlZCBhcyBkeW5hbWljYWxseSByZXNpemVhYmxlXCIpO3ZhciBvPTA9PT1yPzA6dC5zaXplL3Iscz1bXTt0aWR5KGZ1bmN0aW9uKCl7dD10LnJlc2hhcGUoWzEscixvXSk7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDsrK2kpe3ZhciBwPVswLDA9PT1pPzA6bltpLTFdLDBdLHU9WzEsZVtpXSxvXTtzW2ldPXNsaWNlKHQscCx1KS5yZXNoYXBlKGEuZWxlbWVudFNoYXBlKX1yZXR1cm4gc30pO2Zvcih2YXIgaT1bXSxwPTA7cDxlLmxlbmd0aDtwKyspaVtwXT1wO3RoaXMud3JpdGVNYW55KGkscyl9LGUucHJvdG90eXBlLmFzc2VydFNoYXBlc01hdGNoPWZ1bmN0aW9uKGUsdCxhKXt2b2lkIDA9PT1hJiYoYT1cIlwiKSx1dGlsLmFzc2VydCh0aGlzLmFycmF5c0VxdWFsKGUsdCksYStcIiBTaGFwZXMgXCIrZStcIiBhbmQgXCIrdCtcIiBtdXN0IG1hdGNoXCIpfSxlLnByb3RvdHlwZS5hcnJheXNFcXVhbD1mdW5jdGlvbihlLHQpe2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBhPTA7YTxlLmxlbmd0aDthKyspaWYoLTEhPT1lW2FdJiYtMSE9PXRbYV0mJmVbYV0hPT10W2FdKXJldHVybiExO3JldHVybiEwfSxlLm5leHRJZD0wLGV9KCk7ZnVuY3Rpb24gZXhlY3V0ZU9wJDIoZSx0LGEpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIHIsbixvLHMsaSxwLHUsbSxsLGQsYyxmLHksaCxnLE4sUCxiLHgsSSx2LE8sdyxWLGssVCwkLFMsXyxBLEQsaixFLEMsUjtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihMKXtzd2l0Y2goTC5sYWJlbCl7Y2FzZSAwOnN3aXRjaChlLm9wKXtjYXNlXCJsb29wQ29uZFwiOnJldHVyblszLDFdO2Nhc2VcInN3aXRjaFwiOnJldHVyblszLDJdO2Nhc2VcIm1lcmdlXCI6cmV0dXJuWzMsNF07Y2FzZVwiZW50ZXJcIjpyZXR1cm5bMyw1XTtjYXNlXCJleGl0XCI6cmV0dXJuWzMsNl07Y2FzZVwibmV4dEl0ZXJhdGlvblwiOnJldHVyblszLDddO2Nhc2VcInRlbnNvckFycmF5XCI6cmV0dXJuWzMsOF07Y2FzZVwidGVuc29yQXJyYXlXcml0ZVwiOnJldHVyblszLDldO2Nhc2VcInRlbnNvckFycmF5UmVhZFwiOnJldHVyblszLDEwXTtjYXNlXCJ0ZW5zb3JBcnJheUdhdGhlclwiOnJldHVyblszLDExXTtjYXNlXCJ0ZW5zb3JBcnJheVNjYXR0ZXJcIjpyZXR1cm5bMywxMl07Y2FzZVwidGVuc29yQXJyYXlDb25jYXRcIjpyZXR1cm5bMywxM107Y2FzZVwidGVuc29yQXJyYXlTcGxpdFwiOnJldHVyblszLDE0XTtjYXNlXCJ0ZW5zb3JBcnJheVNpemVcIjpyZXR1cm5bMywxNV07Y2FzZVwidGVuc29yQXJyYXlDbG9zZVwiOnJldHVyblszLDE2XX1yZXR1cm5bMywxN107Y2FzZSAxOnJldHVyblsyLFtnZXRQYXJhbVZhbHVlKFwicHJlZFwiLGUsdCxhKV1dO2Nhc2UgMjpyZXR1cm4gcj1nZXRQYXJhbVZhbHVlKFwicHJlZFwiLGUsdCxhKSxuPWdldFBhcmFtVmFsdWUoXCJkYXRhXCIsZSx0LGEpLFs0LHIuZGF0YSgpXTtjYXNlIDM6cmV0dXJuWzIsTC5zZW50KClbMF0/W3ZvaWQgMCxuXTpbbix2b2lkIDBdXTtjYXNlIDQ6cmV0dXJuWzIsKG89ZS5pbnB1dE5hbWVzLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PWdldFRlbnNvcihlLHQsYSl9KSk/W2dldFRlbnNvcihvLHQsYSldOnZvaWQgMF07Y2FzZSA1OnJldHVybiBzPWdldFBhcmFtVmFsdWUoXCJmcmFtZU5hbWVcIixlLHQsYSksaT1nZXRQYXJhbVZhbHVlKFwidGVuc29yXCIsZSx0LGEpLGEuZW50ZXJGcmFtZShzKSxbMixbaV1dO2Nhc2UgNjpyZXR1cm4gcD1nZXRQYXJhbVZhbHVlKFwidGVuc29yXCIsZSx0LGEpLGEuZXhpdEZyYW1lKCksWzIsW3BdXTtjYXNlIDc6cmV0dXJuIHU9Z2V0UGFyYW1WYWx1ZShcInRlbnNvclwiLGUsdCxhKSxhLm5leHRJdGVyYXRpb24oKSxbMixbdV1dO2Nhc2UgODpyZXR1cm4gbT1nZXRQYXJhbVZhbHVlKFwic2l6ZVwiLGUsdCxhKSxsPWdldFBhcmFtVmFsdWUoXCJkdHlwZVwiLGUsdCxhKSxkPWdldFBhcmFtVmFsdWUoXCJlbGVtZW50U2hhcGVcIixlLHQsYSksYz1nZXRQYXJhbVZhbHVlKFwiZHluYW1pY1NpemVcIixlLHQsYSksZj1nZXRQYXJhbVZhbHVlKFwiY2xlYXJBZnRlclJlYWRcIixlLHQsYSkseT1nZXRQYXJhbVZhbHVlKFwiaWRlbnRpY2FsRWxlbWVudFNoYXBlc1wiLGUsdCxhKSxoPWdldFBhcmFtVmFsdWUoXCJuYW1lXCIsZSx0LGEpLGc9bmV3IFRlbnNvckFycmF5KGgsbCxtLGQseSxjLGYpLGEuYWRkVGVuc29yQXJyYXkoZyksWzIsW3NjYWxhcihnLmlkKSxzY2FsYXIoMSldXTtjYXNlIDk6cmV0dXJuIE49Z2V0UGFyYW1WYWx1ZShcInRlbnNvckFycmF5SWRcIixlLHQsYSksUD1nZXRQYXJhbVZhbHVlKFwiaW5kZXhcIixlLHQsYSksYj1nZXRQYXJhbVZhbHVlKFwidGVuc29yXCIsZSx0LGEpLGEuZ2V0VGVuc29yQXJyYXkoTikud3JpdGUoUCxiKSxbMixbc2NhbGFyKDEpXV07Y2FzZSAxMDpyZXR1cm4geD1nZXRQYXJhbVZhbHVlKFwidGVuc29yQXJyYXlJZFwiLGUsdCxhKSxJPWdldFBhcmFtVmFsdWUoXCJpbmRleFwiLGUsdCxhKSxbMixbYS5nZXRUZW5zb3JBcnJheSh4KS5yZWFkKEkpXV07Y2FzZSAxMTpyZXR1cm4gdj1nZXRQYXJhbVZhbHVlKFwidGVuc29yQXJyYXlJZFwiLGUsdCxhKSxPPWdldFBhcmFtVmFsdWUoXCJpbmRpY2VzXCIsZSx0LGEpLHc9Z2V0UGFyYW1WYWx1ZShcImR0eXBlXCIsZSx0LGEpLFsyLFthLmdldFRlbnNvckFycmF5KHYpLmdhdGhlcihPLHcpXV07Y2FzZSAxMjpyZXR1cm4gVj1nZXRQYXJhbVZhbHVlKFwidGVuc29yQXJyYXlJZFwiLGUsdCxhKSxrPWdldFBhcmFtVmFsdWUoXCJpbmRpY2VzXCIsZSx0LGEpLFQ9Z2V0UGFyYW1WYWx1ZShcInRlbnNvclwiLGUsdCxhKSxhLmdldFRlbnNvckFycmF5KFYpLnNjYXR0ZXIoayxUKSxbMixbc2NhbGFyKDEpXV07Y2FzZSAxMzpyZXR1cm4gJD1nZXRQYXJhbVZhbHVlKFwidGVuc29yQXJyYXlJZFwiLGUsdCxhKSxTPWEuZ2V0VGVuc29yQXJyYXkoJCksXz1nZXRQYXJhbVZhbHVlKFwiZHR5cGVcIixlLHQsYSksWzIsW1MuY29uY2F0KF8pXV07Y2FzZSAxNDpyZXR1cm4gQT1nZXRQYXJhbVZhbHVlKFwidGVuc29yQXJyYXlJZFwiLGUsdCxhKSxEPWdldFBhcmFtVmFsdWUoXCJ0ZW5zb3JcIixlLHQsYSksaj1nZXRQYXJhbVZhbHVlKFwibGVuZ3Roc1wiLGUsdCxhKSxhLmdldFRlbnNvckFycmF5KEEpLnNwbGl0KGosRCksWzIsW3NjYWxhcigxKV1dO2Nhc2UgMTU6cmV0dXJuIEU9Z2V0UGFyYW1WYWx1ZShcInRlbnNvckFycmF5SWRcIixlLHQsYSksQz1hLmdldFRlbnNvckFycmF5KEUpLFsyLFtzY2FsYXIoQy5zaXplKCksXCJpbnQzMlwiKV1dO2Nhc2UgMTY6cmV0dXJuIFI9Z2V0UGFyYW1WYWx1ZShcInRlbnNvckFycmF5SWRcIixlLHQsYSksYS5nZXRUZW5zb3JBcnJheShSKS5jbGVhckFuZENsb3NlKCksWzIsW11dO2Nhc2UgMTc6dGhyb3cgVHlwZUVycm9yKFwiTm9kZSB0eXBlIFwiK2Uub3ArXCIgaXMgbm90IGltcGxlbWVudGVkXCIpfX0pfSl9dmFyIGV4ZWN1dGVPcCQzPWZ1bmN0aW9uKGUsdCxhKXtzd2l0Y2goZS5vcCl7Y2FzZVwiY29udjFkXCI6dmFyIHI9Z2V0UGFyYW1WYWx1ZShcInN0cmlkZVwiLGUsdCxhKSxuPWdldFBhcmFtVmFsdWUoXCJwYWRcIixlLHQsYSksbz1nZXRQYXJhbVZhbHVlKFwiZGF0YUZvcm1hdFwiLGUsdCxhKS50b1VwcGVyQ2FzZSgpLHM9Z2V0UGFyYW1WYWx1ZShcImRpbGF0aW9uXCIsZSx0LGEpO3JldHVybltjb252MWQoZ2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSksZ2V0UGFyYW1WYWx1ZShcImZpbHRlclwiLGUsdCxhKSxyLG4sbyxzKV07Y2FzZVwiY29udjJkXCI6cj1nZXRQYXJhbVZhbHVlKFwic3RyaWRlc1wiLGUsdCxhKSxuPWdldFBhcmFtVmFsdWUoXCJwYWRcIixlLHQsYSksbz1nZXRQYXJhbVZhbHVlKFwiZGF0YUZvcm1hdFwiLGUsdCxhKS50b1VwcGVyQ2FzZSgpO3ZhciBpPWdldFBhcmFtVmFsdWUoXCJkaWxhdGlvbnNcIixlLHQsYSk7cmV0dXJuW2NvbnYyZChnZXRQYXJhbVZhbHVlKFwieFwiLGUsdCxhKSxnZXRQYXJhbVZhbHVlKFwiZmlsdGVyXCIsZSx0LGEpLFtyWzFdLHJbMl1dLG4sbyxbaVswXSxpWzFdXSldO2Nhc2VcImNvbnYyZFRyYW5zcG9zZVwiOnZhciBwPWdldFBhcmFtVmFsdWUoXCJvdXRwdXRTaGFwZVwiLGUsdCxhKTtyPWdldFBhcmFtVmFsdWUoXCJzdHJpZGVzXCIsZSx0LGEpLG49Z2V0UGFyYW1WYWx1ZShcInBhZFwiLGUsdCxhKTtyZXR1cm5bY29udjJkVHJhbnNwb3NlKGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpLGdldFBhcmFtVmFsdWUoXCJmaWx0ZXJcIixlLHQsYSkscCxbclsxXSxyWzJdXSxuKV07Y2FzZVwiZGVwdGh3aXNlQ29udjJkXCI6cj1nZXRQYXJhbVZhbHVlKFwic3RyaWRlc1wiLGUsdCxhKSxuPWdldFBhcmFtVmFsdWUoXCJwYWRcIixlLHQsYSksaT1nZXRQYXJhbVZhbHVlKFwiZGlsYXRpb25zXCIsZSx0LGEpLG89Z2V0UGFyYW1WYWx1ZShcImRhdGFGb3JtYXRcIixlLHQsYSkudG9VcHBlckNhc2UoKTtyZXR1cm5bZGVwdGh3aXNlQ29udjJkKGdldFBhcmFtVmFsdWUoXCJpbnB1dFwiLGUsdCxhKSxnZXRQYXJhbVZhbHVlKFwiZmlsdGVyXCIsZSx0LGEpLFtyWzFdLHJbMl1dLG4sbyxbaVswXSxpWzFdXSldO2Nhc2VcImF2Z1Bvb2xcIjpyPWdldFBhcmFtVmFsdWUoXCJzdHJpZGVzXCIsZSx0LGEpLG49Z2V0UGFyYW1WYWx1ZShcInBhZFwiLGUsdCxhKTt2YXIgdT1nZXRQYXJhbVZhbHVlKFwia2VybmVsU2l6ZVwiLGUsdCxhKTtyZXR1cm5bYXZnUG9vbChnZXRQYXJhbVZhbHVlKFwieFwiLGUsdCxhKSxbdVsxXSx1WzJdXSxbclsxXSxyWzJdXSxuKV07Y2FzZVwibWF4UG9vbFwiOnI9Z2V0UGFyYW1WYWx1ZShcInN0cmlkZXNcIixlLHQsYSksbj1nZXRQYXJhbVZhbHVlKFwicGFkXCIsZSx0LGEpLHU9Z2V0UGFyYW1WYWx1ZShcImtlcm5lbFNpemVcIixlLHQsYSk7cmV0dXJuW21heFBvb2woZ2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSksW3VbMV0sdVsyXV0sW3JbMV0sclsyXV0sbildO2RlZmF1bHQ6dGhyb3cgVHlwZUVycm9yKFwiTm9kZSB0eXBlIFwiK2Uub3ArXCIgaXMgbm90IGltcGxlbWVudGVkXCIpfX0sZXhlY3V0ZU9wJDQ9ZnVuY3Rpb24oZSx0LGEpe3N3aXRjaChlLm9wKXtjYXNlXCJmaWxsXCI6dmFyIHI9Z2V0UGFyYW1WYWx1ZShcInNoYXBlXCIsZSx0LGEpLG49Z2V0UGFyYW1WYWx1ZShcImR0eXBlXCIsZSx0LGEpLG89Z2V0UGFyYW1WYWx1ZShcInZhbHVlXCIsZSx0LGEpO3JldHVybltmaWxsKHIsbyxuKV07Y2FzZVwibGluc3BhY2VcIjp2YXIgcz1nZXRQYXJhbVZhbHVlKFwic3RhcnRcIixlLHQsYSksaT1nZXRQYXJhbVZhbHVlKFwic3RvcFwiLGUsdCxhKSxwPWdldFBhcmFtVmFsdWUoXCJudW1cIixlLHQsYSk7cmV0dXJuW2xpbnNwYWNlKHMsaSxwKV07Y2FzZVwib25lSG90XCI6dmFyIHU9Z2V0UGFyYW1WYWx1ZShcImluZGljZXNcIixlLHQsYSksbT1nZXRQYXJhbVZhbHVlKFwiZGVwdGhcIixlLHQsYSksbD1nZXRQYXJhbVZhbHVlKFwib25WYWx1ZVwiLGUsdCxhKSxkPWdldFBhcmFtVmFsdWUoXCJvZmZWYWx1ZVwiLGUsdCxhKTtyZXR1cm5bb25lSG90KHUsbSxsLGQpXTtjYXNlXCJvbmVzXCI6cmV0dXJuW29uZXMoZ2V0UGFyYW1WYWx1ZShcInNoYXBlXCIsZSx0LGEpLGdldFBhcmFtVmFsdWUoXCJkdHlwZVwiLGUsdCxhKSldO2Nhc2VcIm9uZXNMaWtlXCI6cmV0dXJuW29uZXNMaWtlKGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpKV07Y2FzZVwicmFuZG9tVW5pZm9ybVwiOnJldHVybltyYW5kb21Vbmlmb3JtKGdldFBhcmFtVmFsdWUoXCJzaGFwZVwiLGUsdCxhKSxnZXRQYXJhbVZhbHVlKFwibWludmFsXCIsZSx0LGEpLGdldFBhcmFtVmFsdWUoXCJtYXh2YWxcIixlLHQsYSksZ2V0UGFyYW1WYWx1ZShcImR0eXBlXCIsZSx0LGEpKV07Y2FzZVwicmFuZ2VcIjpzPWdldFBhcmFtVmFsdWUoXCJzdGFydFwiLGUsdCxhKTt2YXIgYz1nZXRQYXJhbVZhbHVlKFwic3RvcFwiLGUsdCxhKSxmPWdldFBhcmFtVmFsdWUoXCJzdGVwXCIsZSx0LGEpO3JldHVybltyYW5nZShzLGMsZixnZXRQYXJhbVZhbHVlKFwiZHR5cGVcIixlLHQsYSkpXTtjYXNlXCJ0cnVuY2F0ZWROb3JtYWxcIjpyPWdldFBhcmFtVmFsdWUoXCJzaGFwZVwiLGUsdCxhKTt2YXIgeT1nZXRQYXJhbVZhbHVlKFwibWVhblwiLGUsdCxhKSxoPWdldFBhcmFtVmFsdWUoXCJzdGREZXZcIixlLHQsYSksZz1nZXRQYXJhbVZhbHVlKFwic2VlZFwiLGUsdCxhKTtyZXR1cm5bdHJ1bmNhdGVkTm9ybWFsKHIseSxoLGdldFBhcmFtVmFsdWUoXCJkdHlwZVwiLGUsdCxhKSxnKV07Y2FzZVwiemVyb3NcIjpyZXR1cm5bemVyb3MoZ2V0UGFyYW1WYWx1ZShcInNoYXBlXCIsZSx0LGEpLGdldFBhcmFtVmFsdWUoXCJkdHlwZVwiLGUsdCxhKSldO2Nhc2VcInplcm9zTGlrZVwiOnJldHVyblt6ZXJvc0xpa2UoZ2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSkpXTtkZWZhdWx0OnRocm93IFR5cGVFcnJvcihcIk5vZGUgdHlwZSBcIitlLm9wK1wiIGlzIG5vdCBpbXBsZW1lbnRlZFwiKX19O2Z1bmN0aW9uIGV4ZWN1dGVPcCQ1KGUsdCxhKXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciByLG4sbyxzLGk7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24ocCl7c3dpdGNoKHAubGFiZWwpe2Nhc2UgMDpzd2l0Y2goZS5vcCl7Y2FzZVwibm9uTWF4U3VwcHJlc3Npb25cIjpyZXR1cm5bMywxXTtjYXNlXCJ3aGVyZUFzeW5jXCI6cmV0dXJuWzMsM119cmV0dXJuWzMsNV07Y2FzZSAxOnJldHVybiByPWdldFBhcmFtVmFsdWUoXCJib3hlc1wiLGUsdCxhKSxuPWdldFBhcmFtVmFsdWUoXCJzY29yZXNcIixlLHQsYSksbz1nZXRQYXJhbVZhbHVlKFwibWF4T3V0cHV0U2l6ZVwiLGUsdCxhKSxzPWdldFBhcmFtVmFsdWUoXCJpb3VUaHJlc2hvbGRcIixlLHQsYSksaT1nZXRQYXJhbVZhbHVlKFwic2NvcmVUaHJlc2hvbGRcIixlLHQsYSksWzQsaW1hZ2Uubm9uTWF4U3VwcHJlc3Npb25Bc3luYyhyLG4sbyxzLGkpXTtjYXNlIDI6cmV0dXJuWzIsW3Auc2VudCgpXV07Y2FzZSAzOnJldHVybls0LHdoZXJlQXN5bmMoZ2V0UGFyYW1WYWx1ZShcImNvbmRpdGlvblwiLGUsdCxhKSldO2Nhc2UgNDpyZXR1cm5bMixbcC5zZW50KCldXTtjYXNlIDU6dGhyb3cgVHlwZUVycm9yKFwiTm9kZSB0eXBlIFwiK2Uub3ArXCIgaXMgbm90IGltcGxlbWVudGVkXCIpfX0pfSl9dmFyIGV4ZWN1dGVPcCQ2PWZ1bmN0aW9uKGUsdCxhKXtzd2l0Y2goZS5vcCl7Y2FzZVwidG9wS1wiOnZhciByPWdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpLG49Z2V0UGFyYW1WYWx1ZShcImtcIixlLHQsYSksbz1nZXRQYXJhbVZhbHVlKFwic29ydGVkXCIsZSx0LGEpLHM9dG9wayhyLG4sbyk7cmV0dXJuW3MudmFsdWVzLHMuaW5kaWNlc107ZGVmYXVsdDp0aHJvdyBUeXBlRXJyb3IoXCJOb2RlIHR5cGUgXCIrZS5vcCtcIiBpcyBub3QgaW1wbGVtZW50ZWRcIil9fSxleGVjdXRlT3AkNz1mdW5jdGlvbihlLHQsYSl7c3dpdGNoKGUub3Ape2Nhc2VcImNvbnN0XCI6cmV0dXJuIHRbZS5uYW1lXTtjYXNlXCJwbGFjZWhvbGRlclwiOnZhciByPWdldFBhcmFtVmFsdWUoXCJkZWZhdWx0XCIsZSx0LGEpO3JldHVybltnZXRUZW5zb3IoZS5uYW1lLHQsYSl8fHJdO2Nhc2VcImlkZW50aXR5XCI6Y2FzZVwic3RvcEdyYWRpZW50XCI6Y2FzZVwiZmFrZVF1YW50V2l0aE1pbk1heFZhcnNcIjpyZXR1cm5bZ2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSldO2Nhc2VcInNuYXBzaG90XCI6cmV0dXJuW2dldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpLmNsb25lKCldO2Nhc2VcInNoYXBlXCI6cmV0dXJuW3RlbnNvcjFkKGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpLnNoYXBlLFwiaW50MzJcIildO2Nhc2VcInNoYXBlTlwiOnJldHVybiBnZXRQYXJhbVZhbHVlKFwieFwiLGUsdCxhKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHRlbnNvcjFkKGUuc2hhcGUpfSk7Y2FzZVwic2l6ZVwiOnJldHVybltzY2FsYXIoZ2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSkuc2l6ZSxcImludDMyXCIpXTtjYXNlXCJyYW5rXCI6cmV0dXJuW3NjYWxhcihnZXRQYXJhbVZhbHVlKFwieFwiLGUsdCxhKS5yYW5rLFwiaW50MzJcIildO2Nhc2VcIm5vb3BcIjpyZXR1cm5bXTtjYXNlXCJwcmludFwiOnZhciBuPWdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpLG89Z2V0UGFyYW1WYWx1ZShcImRhdGFcIixlLHQsYSkscz1nZXRQYXJhbVZhbHVlKFwibWVzc2FnZVwiLGUsdCxhKSxpPWdldFBhcmFtVmFsdWUoXCJzdW1tYXJpemVcIixlLHQsYSk7Y29uc29sZS53YXJuKFwiVGhlIGdyYXBoIGhhcyBhIHRmLnByaW50KCkgb3BlcmF0aW9uLHVzdWFsbHkgdXNlZCBmb3IgZGVidWdnaW5nLCB3aGljaCBzbG93cyBkb3duIHBlcmZvcm1hbmNlLlwiKSxjb25zb2xlLmxvZyhzKTtmb3IodmFyIHA9MDtwPG8ubGVuZ3RoO3ArKyljb25zb2xlLmxvZyhBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChvWzBdLmRhdGFTeW5jKCkpLnNsaWNlKDAsaSkpO3JldHVybltuXTtkZWZhdWx0OnRocm93IFR5cGVFcnJvcihcIk5vZGUgdHlwZSBcIitlLm9wK1wiIGlzIG5vdCBpbXBsZW1lbnRlZFwiKX19LGV4ZWN1dGVPcCQ4PWZ1bmN0aW9uKGUsdCxhKXtzd2l0Y2goZS5vcCl7Y2FzZVwicmVzaXplQmlsaW5lYXJcIjp2YXIgcj1nZXRQYXJhbVZhbHVlKFwiaW1hZ2VzXCIsZSx0LGEpLG49Z2V0UGFyYW1WYWx1ZShcInNpemVcIixlLHQsYSksbz1nZXRQYXJhbVZhbHVlKFwiYWxpZ25Db3JuZXJzXCIsZSx0LGEpO3JldHVybltpbWFnZS5yZXNpemVCaWxpbmVhcihyLFtuWzBdLG5bMV1dLG8pXTtjYXNlXCJyZXNpemVOZWFyZXN0TmVpZ2hib3JcIjpyPWdldFBhcmFtVmFsdWUoXCJpbWFnZXNcIixlLHQsYSksbj1nZXRQYXJhbVZhbHVlKFwic2l6ZVwiLGUsdCxhKSxvPWdldFBhcmFtVmFsdWUoXCJhbGlnbkNvcm5lcnNcIixlLHQsYSk7cmV0dXJuW2ltYWdlLnJlc2l6ZU5lYXJlc3ROZWlnaGJvcihyLFtuWzBdLG5bMV1dLG8pXTtjYXNlXCJjcm9wQW5kUmVzaXplXCI6dmFyIHM9Z2V0UGFyYW1WYWx1ZShcImltYWdlXCIsZSx0LGEpLGk9Z2V0UGFyYW1WYWx1ZShcImJveGVzXCIsZSx0LGEpLHA9Z2V0UGFyYW1WYWx1ZShcImJveEluZFwiLGUsdCxhKSx1PWdldFBhcmFtVmFsdWUoXCJjcm9wU2l6ZVwiLGUsdCxhKSxtPWdldFBhcmFtVmFsdWUoXCJtZXRob2RcIixlLHQsYSksbD1nZXRQYXJhbVZhbHVlKFwiZXh0cmFwb2xhdGlvblZhbHVlXCIsZSx0LGEpO3JldHVybltpbWFnZS5jcm9wQW5kUmVzaXplKHMsaSxwLHUsbSxsKV07ZGVmYXVsdDp0aHJvdyBUeXBlRXJyb3IoXCJOb2RlIHR5cGUgXCIrZS5vcCtcIiBpcyBub3QgaW1wbGVtZW50ZWRcIil9fSxleGVjdXRlT3AkOT1mdW5jdGlvbihlLHQsYSl7c3dpdGNoKGUub3Ape2Nhc2VcImVxdWFsXCI6cmV0dXJuW2VxdWFsKGdldFBhcmFtVmFsdWUoXCJhXCIsZSx0LGEpLGdldFBhcmFtVmFsdWUoXCJiXCIsZSx0LGEpKV07Y2FzZVwibm90RXF1YWxcIjpyZXR1cm5bbm90RXF1YWwoZ2V0UGFyYW1WYWx1ZShcImFcIixlLHQsYSksZ2V0UGFyYW1WYWx1ZShcImJcIixlLHQsYSkpXTtjYXNlXCJncmVhdGVyXCI6cmV0dXJuW2dyZWF0ZXIoZ2V0UGFyYW1WYWx1ZShcImFcIixlLHQsYSksZ2V0UGFyYW1WYWx1ZShcImJcIixlLHQsYSkpXTtjYXNlXCJncmVhdGVyRXF1YWxcIjpyZXR1cm5bZ3JlYXRlckVxdWFsKGdldFBhcmFtVmFsdWUoXCJhXCIsZSx0LGEpLGdldFBhcmFtVmFsdWUoXCJiXCIsZSx0LGEpKV07Y2FzZVwibGVzc1wiOnJldHVybltsZXNzKGdldFBhcmFtVmFsdWUoXCJhXCIsZSx0LGEpLGdldFBhcmFtVmFsdWUoXCJiXCIsZSx0LGEpKV07Y2FzZVwibGVzc0VxdWFsXCI6cmV0dXJuW2xlc3NFcXVhbChnZXRQYXJhbVZhbHVlKFwiYVwiLGUsdCxhKSxnZXRQYXJhbVZhbHVlKFwiYlwiLGUsdCxhKSldO2Nhc2VcImxvZ2ljYWxBbmRcIjpyZXR1cm5bbG9naWNhbEFuZChnZXRQYXJhbVZhbHVlKFwiYVwiLGUsdCxhKSxnZXRQYXJhbVZhbHVlKFwiYlwiLGUsdCxhKSldO2Nhc2VcImxvZ2ljYWxOb3RcIjpyZXR1cm5bbG9naWNhbE5vdChnZXRQYXJhbVZhbHVlKFwiYVwiLGUsdCxhKSldO2Nhc2VcImxvZ2ljYWxPclwiOnJldHVybltsb2dpY2FsT3IoZ2V0UGFyYW1WYWx1ZShcImFcIixlLHQsYSksZ2V0UGFyYW1WYWx1ZShcImJcIixlLHQsYSkpXTtjYXNlXCJ3aGVyZVwiOnJldHVyblt3aGVyZShnZXRQYXJhbVZhbHVlKFwiY29uZGl0aW9uXCIsZSx0LGEpLGdldFBhcmFtVmFsdWUoXCJhXCIsZSx0LGEpLGdldFBhcmFtVmFsdWUoXCJiXCIsZSx0LGEpKV07ZGVmYXVsdDp0aHJvdyBUeXBlRXJyb3IoXCJOb2RlIHR5cGUgXCIrZS5vcCtcIiBpcyBub3QgaW1wbGVtZW50ZWRcIil9fSxleGVjdXRlT3AkMTA9ZnVuY3Rpb24oZSx0LGEpe3N3aXRjaChlLm9wKXtjYXNlXCJtYXRNdWxcIjpyZXR1cm5bbWF0TXVsKGdldFBhcmFtVmFsdWUoXCJhXCIsZSx0LGEpLGdldFBhcmFtVmFsdWUoXCJiXCIsZSx0LGEpLGdldFBhcmFtVmFsdWUoXCJ0cmFuc3Bvc2VBXCIsZSx0LGEpLGdldFBhcmFtVmFsdWUoXCJ0cmFuc3Bvc2VCXCIsZSx0LGEpKV07Y2FzZVwidHJhbnNwb3NlXCI6cmV0dXJuW3RyYW5zcG9zZShnZXRQYXJhbVZhbHVlKFwieFwiLGUsdCxhKSxnZXRQYXJhbVZhbHVlKFwicGVybVwiLGUsdCxhKSldO2RlZmF1bHQ6dGhyb3cgVHlwZUVycm9yKFwiTm9kZSB0eXBlIFwiK2Uub3ArXCIgaXMgbm90IGltcGxlbWVudGVkXCIpfX0sZXhlY3V0ZU9wJDExPWZ1bmN0aW9uKGUsdCxhKXtzd2l0Y2goZS5vcCl7Y2FzZVwiYmF0Y2hOb3JtYWxpemF0aW9uXCI6cmV0dXJuW2JhdGNoTm9ybWFsaXphdGlvbihnZXRQYXJhbVZhbHVlKFwieFwiLGUsdCxhKSxnZXRQYXJhbVZhbHVlKFwibWVhblwiLGUsdCxhKSxnZXRQYXJhbVZhbHVlKFwidmFyaWFuY2VcIixlLHQsYSksZ2V0UGFyYW1WYWx1ZShcImVwc2lsb25cIixlLHQsYSksZ2V0UGFyYW1WYWx1ZShcInNjYWxlXCIsZSx0LGEpLGdldFBhcmFtVmFsdWUoXCJvZmZzZXRcIixlLHQsYSkpXTtjYXNlXCJsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvblwiOnJldHVybltsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbihnZXRQYXJhbVZhbHVlKFwieFwiLGUsdCxhKSxnZXRQYXJhbVZhbHVlKFwicmFkaXVzXCIsZSx0LGEpLGdldFBhcmFtVmFsdWUoXCJiaWFzXCIsZSx0LGEpLGdldFBhcmFtVmFsdWUoXCJhbHBoYVwiLGUsdCxhKSxnZXRQYXJhbVZhbHVlKFwiYmV0YVwiLGUsdCxhKSldO2Nhc2VcInNvZnRtYXhcIjpyZXR1cm5bc29mdG1heChnZXRQYXJhbVZhbHVlKFwieFwiLGUsdCxhKSldO2RlZmF1bHQ6dGhyb3cgVHlwZUVycm9yKFwiTm9kZSB0eXBlIFwiK2Uub3ArXCIgaXMgbm90IGltcGxlbWVudGVkXCIpfX0sZXhlY3V0ZU9wJDEyPWZ1bmN0aW9uKGUsdCxhKXtzd2l0Y2goZS5vcCl7Y2FzZVwibWF4XCI6dmFyIHI9Z2V0UGFyYW1WYWx1ZShcImF4aXNcIixlLHQsYSksbj1nZXRQYXJhbVZhbHVlKFwia2VlcERpbXNcIixlLHQsYSk7cmV0dXJuW21heChnZXRQYXJhbVZhbHVlKFwieFwiLGUsdCxhKSxyLG4pXTtjYXNlXCJtZWFuXCI6cj1nZXRQYXJhbVZhbHVlKFwiYXhpc1wiLGUsdCxhKSxuPWdldFBhcmFtVmFsdWUoXCJrZWVwRGltc1wiLGUsdCxhKTtyZXR1cm5bbWVhbihnZXRQYXJhbVZhbHVlKFwieFwiLGUsdCxhKSxyLG4pXTtjYXNlXCJtaW5cIjpyPWdldFBhcmFtVmFsdWUoXCJheGlzXCIsZSx0LGEpLG49Z2V0UGFyYW1WYWx1ZShcImtlZXBEaW1zXCIsZSx0LGEpO3JldHVyblttaW4oZ2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSkscixuKV07Y2FzZVwic3VtXCI6cj1nZXRQYXJhbVZhbHVlKFwiYXhpc1wiLGUsdCxhKSxuPWdldFBhcmFtVmFsdWUoXCJrZWVwRGltc1wiLGUsdCxhKTtyZXR1cm5bc3VtKGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpLHIsbildO2Nhc2VcImFsbFwiOnI9Z2V0UGFyYW1WYWx1ZShcImF4aXNcIixlLHQsYSksbj1nZXRQYXJhbVZhbHVlKFwia2VlcERpbXNcIixlLHQsYSk7cmV0dXJuW2FsbChnZXRQYXJhbVZhbHVlKFwieFwiLGUsdCxhKSxyLG4pXTtjYXNlXCJhbnlcIjpyPWdldFBhcmFtVmFsdWUoXCJheGlzXCIsZSx0LGEpLG49Z2V0UGFyYW1WYWx1ZShcImtlZXBEaW1zXCIsZSx0LGEpO3JldHVyblthbnkoZ2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSkscixuKV07Y2FzZVwiYXJnTWF4XCI6cj1nZXRQYXJhbVZhbHVlKFwiYXhpc1wiLGUsdCxhKTtyZXR1cm5bYXJnTWF4KGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpLHIpXTtjYXNlXCJhcmdNaW5cIjpyPWdldFBhcmFtVmFsdWUoXCJheGlzXCIsZSx0LGEpO3JldHVyblthcmdNaW4oZ2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSkscildO2Nhc2VcInByb2RcIjpyPWdldFBhcmFtVmFsdWUoXCJheGlzXCIsZSx0LGEpLG49Z2V0UGFyYW1WYWx1ZShcImtlZXBEaW1zXCIsZSx0LGEpO3JldHVybltwcm9kKGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpLHIsbildO2RlZmF1bHQ6dGhyb3cgVHlwZUVycm9yKFwiTm9kZSB0eXBlIFwiK2Uub3ArXCIgaXMgbm90IGltcGxlbWVudGVkXCIpfX0sZXhlY3V0ZU9wJDEzPWZ1bmN0aW9uKGUsdCxhKXtzd2l0Y2goZS5vcCl7Y2FzZVwiY29uY2F0XCI6dmFyIHI9Z2V0UGFyYW1WYWx1ZShcImF4aXNcIixlLHQsYSksbj1nZXRQYXJhbVZhbHVlKFwidGVuc29yc1wiLGUsdCxhKTtyZXR1cm5bY29uY2F0KG4scildO2Nhc2VcImdhdGhlclwiOnI9Z2V0UGFyYW1WYWx1ZShcImF4aXNcIixlLHQsYSk7dmFyIG89Z2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSkscz1nZXRQYXJhbVZhbHVlKFwiaW5kaWNlc1wiLGUsdCxhKTtyZXR1cm5bZ2F0aGVyKG8scyxyKV07Y2FzZVwicmV2ZXJzZVwiOnI9Z2V0UGFyYW1WYWx1ZShcImF4aXNcIixlLHQsYSksbz1nZXRQYXJhbVZhbHVlKFwieFwiLGUsdCxhKTtyZXR1cm5bcmV2ZXJzZShvLHIpXTtjYXNlXCJzbGljZVwiOnZhciBpPWdldFBhcmFtVmFsdWUoXCJiZWdpblwiLGUsdCxhKSxwPWdldFBhcmFtVmFsdWUoXCJzaXplXCIsZSx0LGEpO3JldHVybltzbGljZShnZXRQYXJhbVZhbHVlKFwieFwiLGUsdCxhKSxpLHApXTtjYXNlXCJzdHJpZGVkU2xpY2VcIjppPWdldFBhcmFtVmFsdWUoXCJiZWdpblwiLGUsdCxhKTt2YXIgdT1nZXRQYXJhbVZhbHVlKFwiZW5kXCIsZSx0LGEpLG09Z2V0UGFyYW1WYWx1ZShcInN0cmlkZXNcIixlLHQsYSksbD1nZXRQYXJhbVZhbHVlKFwiYmVnaW5NYXNrXCIsZSx0LGEpLGQ9Z2V0UGFyYW1WYWx1ZShcImVuZE1hc2tcIixlLHQsYSksYz1nZXRQYXJhbVZhbHVlKFwiZWxsaXBzaXNNYXNrXCIsZSx0LGEpLGY9Z2V0UGFyYW1WYWx1ZShcIm5ld0F4aXNNYXNrXCIsZSx0LGEpLHk9Z2V0UGFyYW1WYWx1ZShcInNocmlua0F4aXNNYXNrXCIsZSx0LGEpLGg9Z2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSk7aWYoMT09PWkubGVuZ3RoJiZoLnNoYXBlLmxlbmd0aD4xKWZvcih2YXIgZz0xO2c8aC5zaGFwZS5sZW5ndGg7ZysrKWkucHVzaCgwKSx1LnB1c2goaC5zaGFwZVtnXSksbS5wdXNoKG1bMF0pO3JldHVybltzdHJpZGVkU2xpY2UoaCxpLHUsbSxsLGQsYyxmLHkpXTtjYXNlXCJzdGFja1wiOnJldHVybiB0aWR5KGZ1bmN0aW9uKCl7dmFyIHI9Z2V0UGFyYW1WYWx1ZShcImF4aXNcIixlLHQsYSksbj1nZXRQYXJhbVZhbHVlKFwidGVuc29yc1wiLGUsdCxhKSxvPW5bMF0uc2hhcGUscz1uWzBdLnNxdWVlemUoKS5zaGFwZSxpPW4ubWFwKGZ1bmN0aW9uKGUpe3ZhciB0PXV0aWwuYXJyYXlzRXF1YWwoZS5zaGFwZSxvKTtpZighdCYmIXV0aWwuYXJyYXlzRXF1YWwoZS5zcXVlZXplKCkuc2hhcGUscykpdGhyb3cgbmV3IEVycm9yKFwidGhlIGlucHV0IHRlbnNvcnMgc2hhcGUgZG9lcyBub3QgbWF0Y2hcIik7cmV0dXJuIHQ/ZTplLnJlc2hhcGUobyl9KTtyZXR1cm5bc3RhY2soaSxyKV19KTtjYXNlXCJ1bnN0YWNrXCI6cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXt2YXIgcj1nZXRQYXJhbVZhbHVlKFwiYXhpc1wiLGUsdCxhKSxuPWdldFBhcmFtVmFsdWUoXCJ0ZW5zb3JcIixlLHQsYSk7cmV0dXJuIHVuc3RhY2sobixyKX0pO2Nhc2VcInRpbGVcIjp2YXIgTj1nZXRQYXJhbVZhbHVlKFwicmVwc1wiLGUsdCxhKTtyZXR1cm5bdGlsZShnZXRQYXJhbVZhbHVlKFwieFwiLGUsdCxhKSxOKV07Y2FzZVwic3BsaXRcIjpyPWdldFBhcmFtVmFsdWUoXCJheGlzXCIsZSx0LGEpO3ZhciBQPWdldFBhcmFtVmFsdWUoXCJudW1PclNpemVTcGxpdHNcIixlLHQsYSk7cmV0dXJuIHNwbGl0KGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpLFAscik7ZGVmYXVsdDp0aHJvdyBUeXBlRXJyb3IoXCJOb2RlIHR5cGUgXCIrZS5vcCtcIiBpcyBub3QgaW1wbGVtZW50ZWRcIil9fSxleGVjdXRlT3AkMTQ9ZnVuY3Rpb24oZSx0LGEpe3N3aXRjaChlLm9wKXtjYXNlXCJjYXN0XCI6cmV0dXJuW2Nhc3QoZ2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSksZ2V0UGFyYW1WYWx1ZShcImR0eXBlXCIsZSx0LGEpKV07Y2FzZVwiZXhwYW5kRGltc1wiOnZhciByPWdldFBhcmFtVmFsdWUoXCJheGlzXCIsZSx0LGEpO3JldHVybltleHBhbmREaW1zKGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpLHIpXTtjYXNlXCJzcXVlZXplXCI6cj1nZXRQYXJhbVZhbHVlKFwiYXhpc1wiLGUsdCxhKTtyZXR1cm5bc3F1ZWV6ZShnZXRQYXJhbVZhbHVlKFwieFwiLGUsdCxhKSxyKV07Y2FzZVwicmVzaGFwZVwiOnJldHVybltyZXNoYXBlKGdldFBhcmFtVmFsdWUoXCJ4XCIsZSx0LGEpLGdldFBhcmFtVmFsdWUoXCJzaGFwZVwiLGUsdCxhKSldO2Nhc2VcInBhZFwiOnJldHVybltwYWQoZ2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSksc3BsaXQkMShnZXRQYXJhbVZhbHVlKFwicGFkZGluZ1wiLGUsdCxhKSwyKSxnZXRQYXJhbVZhbHVlKFwiY29uc3RhbnRWYWx1ZVwiLGUsdCxhKSldO2Nhc2VcInNwYWNlVG9CYXRjaE5EXCI6dmFyIG49Z2V0UGFyYW1WYWx1ZShcImJsb2NrU2hhcGVcIixlLHQsYSksbz1zcGxpdCQxKGdldFBhcmFtVmFsdWUoXCJwYWRkaW5nc1wiLGUsdCxhKSwyKTtyZXR1cm5bc3BhY2VUb0JhdGNoTkQoZ2V0UGFyYW1WYWx1ZShcInhcIixlLHQsYSksbixvKV07Y2FzZVwiYmF0Y2hUb1NwYWNlTkRcIjpuPWdldFBhcmFtVmFsdWUoXCJibG9ja1NoYXBlXCIsZSx0LGEpO3ZhciBzPXNwbGl0JDEoZ2V0UGFyYW1WYWx1ZShcImNyb3BzXCIsZSx0LGEpLDIpO3JldHVybltiYXRjaFRvU3BhY2VORChnZXRQYXJhbVZhbHVlKFwieFwiLGUsdCxhKSxuLHMpXTtkZWZhdWx0OnRocm93IFR5cGVFcnJvcihcIk5vZGUgdHlwZSBcIitlLm9wK1wiIGlzIG5vdCBpbXBsZW1lbnRlZFwiKX19O2Z1bmN0aW9uIGV4ZWN1dGVPcCQxNShlLHQsYSl7c3dpdGNoKGUuY2F0ZWdvcnkpe2Nhc2VcImFyaXRobWV0aWNcIjpyZXR1cm4gZXhlY3V0ZU9wKGUsdCxhKTtjYXNlXCJiYXNpY19tYXRoXCI6cmV0dXJuIGV4ZWN1dGVPcCQxKGUsdCxhKTtjYXNlXCJjb250cm9sXCI6cmV0dXJuIGV4ZWN1dGVPcCQyKGUsdCxhKTtjYXNlXCJjb252b2x1dGlvblwiOnJldHVybiBleGVjdXRlT3AkMyhlLHQsYSk7Y2FzZVwiY3JlYXRpb25cIjpyZXR1cm4gZXhlY3V0ZU9wJDQoZSx0LGEpO2Nhc2VcImR5bmFtaWNcIjpyZXR1cm4gZXhlY3V0ZU9wJDUoZSx0LGEpO2Nhc2VcImV2YWx1YXRpb25cIjpyZXR1cm4gZXhlY3V0ZU9wJDYoZSx0LGEpO2Nhc2VcImltYWdlXCI6cmV0dXJuIGV4ZWN1dGVPcCQ4KGUsdCxhKTtjYXNlXCJncmFwaFwiOnJldHVybiBleGVjdXRlT3AkNyhlLHQsYSk7Y2FzZVwibG9naWNhbFwiOnJldHVybiBleGVjdXRlT3AkOShlLHQsYSk7Y2FzZVwibWF0cmljZXNcIjpyZXR1cm4gZXhlY3V0ZU9wJDEwKGUsdCxhKTtjYXNlXCJub3JtYWxpemF0aW9uXCI6cmV0dXJuIGV4ZWN1dGVPcCQxMShlLHQsYSk7Y2FzZVwicmVkdWN0aW9uXCI6cmV0dXJuIGV4ZWN1dGVPcCQxMihlLHQsYSk7Y2FzZVwic2xpY2Vfam9pblwiOnJldHVybiBleGVjdXRlT3AkMTMoZSx0LGEpO2Nhc2VcInRyYW5zZm9ybWF0aW9uXCI6cmV0dXJuIGV4ZWN1dGVPcCQxNChlLHQsYSk7ZGVmYXVsdDp0aHJvdyBUeXBlRXJyb3IoXCJOb2RlIHR5cGUgXCIrZS5vcCtcIiBpcyBub3QgaW1wbGVtZW50ZWRcIil9fXZhciBFeGVjdXRpb25Db250ZXh0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe3RoaXMud2VpZ2h0TWFwPWUsdGhpcy50ZW5zb3JBcnJheU1hcD10LHRoaXMucm9vdENvbnRleHQ9e2lkOjAsZnJhbWVOYW1lOlwiXCIsaXRlcmF0aW9uSWQ6MH0sdGhpcy5jb250ZXh0cz1bdGhpcy5yb290Q29udGV4dF0sdGhpcy5sYXN0SWQ9MCx0aGlzLmdlbmVyYXRlQ3VycmVudENvbnRleHRJZHMoKX1yZXR1cm4gZS5wcm90b3R5cGUubmV3RnJhbWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm57aWQ6ZSxmcmFtZU5hbWU6dCxpdGVyYXRpb25JZDowfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiY3VycmVudENvbnRleHRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGV4dHN9LHNldDpmdW5jdGlvbihlKXt0aGlzLmNvbnRleHRzIT09ZSYmKHRoaXMuY29udGV4dHM9ZSx0aGlzLmdlbmVyYXRlQ3VycmVudENvbnRleHRJZHMoKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiY3VycmVudENvbnRleHRJZFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY3VycmVudENvbnRleHRJZHNbMF19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiY3VycmVudENvbnRleHRJZHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnRDb250ZXh0SWRzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmdlbmVyYXRlQ3VycmVudENvbnRleHRJZHM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wO3Q8dGhpcy5jb250ZXh0cy5sZW5ndGgtMTt0Kyspe3ZhciBhPXRoaXMuY29udGV4dHMuc2xpY2UoMCx0aGlzLmNvbnRleHRzLmxlbmd0aC10KTtlLnB1c2godGhpcy5jb250ZXh0SWRmb3JDb250ZXh0cyhhKSl9ZS5wdXNoKFwiXCIpLHRoaXMuX2N1cnJlbnRDb250ZXh0SWRzPWV9LGUucHJvdG90eXBlLmNvbnRleHRJZGZvckNvbnRleHRzPWZ1bmN0aW9uKGUpe3JldHVybiBlP2UubWFwKGZ1bmN0aW9uKGUpe3JldHVybiAwPT09ZS5pZCYmMD09PWUuaXRlcmF0aW9uSWQ/XCJcIjplLmZyYW1lTmFtZStcIi1cIitlLml0ZXJhdGlvbklkfSkuam9pbihcIi9cIik6XCJcIn0sZS5wcm90b3R5cGUuZW50ZXJGcmFtZT1mdW5jdGlvbihlKXt0aGlzLmNvbnRleHRzJiYodGhpcy5sYXN0SWQrKyx0aGlzLmNvbnRleHRzPXRoaXMuY29udGV4dHMuc2xpY2UoKSx0aGlzLmNvbnRleHRzLnB1c2godGhpcy5uZXdGcmFtZSh0aGlzLmxhc3RJZCxlKSksdGhpcy5fY3VycmVudENvbnRleHRJZHMudW5zaGlmdCh0aGlzLmNvbnRleHRJZGZvckNvbnRleHRzKHRoaXMuY29udGV4dHMpKSl9LGUucHJvdG90eXBlLmV4aXRGcmFtZT1mdW5jdGlvbigpe2lmKCEodGhpcy5jb250ZXh0cyYmdGhpcy5jb250ZXh0cy5sZW5ndGg+MSkpdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGV4aXQgZnJhbWUsIHRoZSBjb250ZXh0IGlzIGVtcHR5XCIpO3RoaXMuY29udGV4dHM9dGhpcy5jb250ZXh0cy5zbGljZSgpLHRoaXMuY29udGV4dHMuc3BsaWNlKC0xKSx0aGlzLmN1cnJlbnRDb250ZXh0SWRzLnNoaWZ0KCl9LGUucHJvdG90eXBlLm5leHRJdGVyYXRpb249ZnVuY3Rpb24oKXtpZighKHRoaXMuY29udGV4dHMmJnRoaXMuY29udGV4dHMubGVuZ3RoPjApKXRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBpbmNyZWFzZSBmcmFtZSBpdGVyYXRpb24sIHRoZSBjb250ZXh0IGlzIGVtcHR5XCIpO3RoaXMuY29udGV4dHM9dGhpcy5jb250ZXh0cy5zbGljZSgpLHRoaXMubGFzdElkKys7dmFyIGU9T2JqZWN0LmFzc2lnbih7fSx0aGlzLmNvbnRleHRzW3RoaXMuY29udGV4dHMubGVuZ3RoLTFdKTtlLml0ZXJhdGlvbklkKz0xLGUuaWQ9dGhpcy5sYXN0SWQsdGhpcy5jb250ZXh0cy5zcGxpY2UoLTEsMSxlKSx0aGlzLl9jdXJyZW50Q29udGV4dElkcy5zcGxpY2UoMCwxLHRoaXMuY29udGV4dElkZm9yQ29udGV4dHModGhpcy5jb250ZXh0cykpfSxlLnByb3RvdHlwZS5nZXRXZWlnaHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMud2VpZ2h0TWFwW2VdfSxlLnByb3RvdHlwZS5hZGRUZW5zb3JBcnJheT1mdW5jdGlvbihlKXt0aGlzLnRlbnNvckFycmF5TWFwW2UuaWRdPWV9LGUucHJvdG90eXBlLmdldFRlbnNvckFycmF5PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRlbnNvckFycmF5TWFwW2VdfSxlfSgpLEdyYXBoRXhlY3V0b3I9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RoaXMuZ3JhcGg9ZSx0aGlzLmNvbXBpbGVkTWFwPW5ldyBNYXAsdGhpcy5fd2VpZ2h0TWFwPXt9LHRoaXMuU0VQRVJBVE9SPVwiLFwiLHRoaXMucGxhY2Vob2xkZXJzPWUucGxhY2Vob2xkZXJzLHRoaXMuX291dHB1dHM9ZS5vdXRwdXRzLHRoaXMuY29tcGlsZSgpfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJ3ZWlnaHRNYXBcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dlaWdodE1hcH0sc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PU9iamVjdC5rZXlzKGUpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaWR9KX0pO3RoaXMud2VpZ2h0SWRzPVtdLmNvbmNhdC5hcHBseShbXSx0KSx0aGlzLl93ZWlnaHRNYXA9ZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJpbnB1dHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxhY2Vob2xkZXJzLm1hcChmdW5jdGlvbihlKXtyZXR1cm57bmFtZTplLm5hbWUsc2hhcGU6ZS5wYXJhbXMuc2hhcGU/ZS5wYXJhbXMuc2hhcGUudmFsdWU6dm9pZCAwLGR0eXBlOmUucGFyYW1zLmR0eXBlP2UucGFyYW1zLmR0eXBlLnZhbHVlOnZvaWQgMH19KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJvdXRwdXRzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vdXRwdXRzLm1hcChmdW5jdGlvbihlKXtyZXR1cm57bmFtZTplLm5hbWUsc2hhcGU6ZS5wYXJhbXMuc2hhcGU/ZS5wYXJhbXMuc2hhcGUudmFsdWU6dm9pZCAwLGR0eXBlOmUucGFyYW1zLmR0eXBlP2UucGFyYW1zLmR0eXBlLnZhbHVlOnZvaWQgMH19KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJpbnB1dE5vZGVzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYWNlaG9sZGVycy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUubmFtZX0pfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcIm91dHB1dE5vZGVzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm91dHB1dHMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLm5hbWV9KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJpc0NvbnRyb2xGbG93TW9kZWxcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ3JhcGgud2l0aENvbnRyb2xGbG93fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImlzRHluYW1pY1NoYXBlTW9kZWxcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ3JhcGgud2l0aER5bmFtaWNTaGFwZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5jb21waWxlPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLmdyYXBoLndpdGhDb250cm9sRmxvdyYmIXRoaXMuZ3JhcGgud2l0aER5bmFtaWNTaGFwZSl7dmFyIHQ9W10sYT1lfHx0aGlzLmdyYXBoLnBsYWNlaG9sZGVycyxyPWEubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLm5hbWV9KS5zb3J0KCkuam9pbih0aGlzLlNFUEVSQVRPUik7aWYoIXRoaXMuY29tcGlsZWRNYXAuZ2V0KHIpKXtmb3IodmFyIG49YS5jb25jYXQodGhpcy5ncmFwaC53ZWlnaHRzKSxvPXt9O24ubGVuZ3RoPjA7KXt2YXIgcz1uLnBvcCgpO29bcy5uYW1lXT0hMCx0LnB1c2gocykscy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpeyFvW2UubmFtZV0mJmUuaW5wdXROYW1lcy5ldmVyeShmdW5jdGlvbihlKXt2YXIgdD1nZXROb2RlTmFtZUFuZEluZGV4KGUpWzBdO3JldHVybiBvW3RdfSkmJm4ucHVzaChlKX0pfXRoaXMuY29tcGlsZWRNYXAuc2V0KHIsdCl9fX0sZS5wcm90b3R5cGUuZXhlY3V0ZT1mdW5jdGlvbihlLHQsYSl7dmFyIHI9dGhpczt2b2lkIDA9PT10JiYodD0hMCk7dmFyIG49T2JqZWN0LmtleXMoZSkuc29ydCgpO3RoaXMuY2hlY2tJbnB1dChlLHQpLHRoaXMuY2hlY2tJbnB1dFNoYXBlQW5kVHlwZShlLHQpLHRoaXMuY29tcGlsZShuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gci5ncmFwaC5ub2Rlc1tlXX0pKTt2YXIgbz10aGlzLmNhbGN1bGF0ZU91dHB1dHMoYSk7dGhpcy5jaGVja091dHB1dCh0aGlzLmNvbXBpbGVkTWFwLmdldChuLmpvaW4odGhpcy5TRVBFUkFUT1IpKSxvKTt2YXIgcz17fTtyZXR1cm4gdGlkeShmdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgRXhlY3V0aW9uQ29udGV4dChyLl93ZWlnaHRNYXAscyksYT1fX2Fzc2lnbih7fSxyLndlaWdodE1hcCxlKSxpPXIuY29tcGlsZWRNYXAuZ2V0KG4uam9pbihyLlNFUEVSQVRPUikpLHA9MDtwPGkubGVuZ3RoO3ArKyl7dmFyIHU9aVtwXTtpZihhW3UubmFtZV18fChhW3UubmFtZV09ZXhlY3V0ZU9wJDE1KHUsYSx0KSksby5ldmVyeShmdW5jdGlvbihlKXtyZXR1cm4hIWFbZV19KSlicmVha31yZXR1cm4gci5maW5kT3V0cHV0cyhhLHQsbyl9KX0sZS5wcm90b3R5cGUuZXhlY3V0ZUFzeW5jPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgYSxyLG4sbyxzLGkscCx1PXRoaXM7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24obSl7c3dpdGNoKG0ubGFiZWwpe2Nhc2UgMDpyZXR1cm4gdGhpcy5jaGVja0lucHV0KGUsITEpLHRoaXMuY2hlY2tJbnB1dFNoYXBlQW5kVHlwZShlLCExKSxhPXt9LHI9bmV3IEV4ZWN1dGlvbkNvbnRleHQodGhpcy5fd2VpZ2h0TWFwLGEpLFs0LHRoaXMuZXhlY3V0ZVdpdGhDb250cm9sRmxvdyhlLHIpXTtjYXNlIDE6cmV0dXJuIG49bS5zZW50KCksbz10aGlzLmZpbmRPdXRwdXRzKG4scix0KSxzPU9iamVjdC5rZXlzKG8pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gb1tlXS5pZH0pLGk9T2JqZWN0LmtleXMoZSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5pZH0pfSkscD1bXS5jb25jYXQuYXBwbHkoW10saSksT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXtuW2VdLmZvckVhY2goZnVuY3Rpb24oZSl7ZSYmLTE9PT1zLmluZGV4T2YoZS5pZCkmJi0xPT09cC5pbmRleE9mKGUuaWQpJiYtMT09PXUud2VpZ2h0SWRzLmluZGV4T2YoZS5pZCkmJmUuZGlzcG9zZSgpfSl9KSxbMixvXX19KX0pfSxlLnByb3RvdHlwZS5leGVjdXRlV2l0aENvbnRyb2xGbG93PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgYSxyLG4sbyxzLGkscD10aGlzO3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKHUpe3N3aXRjaCh1LmxhYmVsKXtjYXNlIDA6YT1PYmplY3Qua2V5cyhlKSxyPWEubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBwLmdyYXBoLm5vZGVzW2VdfSksbj1yLmNvbmNhdCh0aGlzLmdyYXBoLndlaWdodHMpLm1hcChmdW5jdGlvbihlKXtyZXR1cm57bm9kZTplLGNvbnRleHRzOnQuY3VycmVudENvbnRleHR9fSksbz1fX2Fzc2lnbih7fSx0aGlzLndlaWdodE1hcCxlKSxzPXt9LHUubGFiZWw9MTtjYXNlIDE6cmV0dXJuIG4ubGVuZ3RoPjA/KGk9dGhpcy5wcm9jZXNzU3RhY2socixuLHQsbyxzKSxbNCxQcm9taXNlLmFsbChpKV0pOlszLDNdO2Nhc2UgMjpyZXR1cm4gdS5zZW50KCksWzMsMV07Y2FzZSAzOnJldHVyblsyLG9dfX0pfSl9LGUucHJvdG90eXBlLnByb2Nlc3NTdGFjaz1mdW5jdGlvbihlLHQsYSxyLG4pe2Zvcih2YXIgbz10aGlzLHM9W10saT1mdW5jdGlvbigpe3ZhciBpPXQucG9wKCk7YS5jdXJyZW50Q29udGV4dD1pLmNvbnRleHRzO3ZhciB1PVwiXCI7aWYoXCJlbnRlclwiPT09aS5ub2RlLm9wJiZnZXRQYXJhbVZhbHVlKFwiaXNDb25zdGFudFwiLGkubm9kZSxyLGEpJiYodT1nZXROb2RlTmFtZUFuZEluZGV4KGkubm9kZS5uYW1lLGEpWzBdKSwtMT09PWUuaW5kZXhPZihpLm5vZGUpKXt2YXIgbT1leGVjdXRlT3AkMTUoaS5ub2RlLHIsYSk7dXx8KHU9Z2V0Tm9kZU5hbWVBbmRJbmRleChpLm5vZGUubmFtZSxhKVswXSk7dmFyIGw9YS5jdXJyZW50Q29udGV4dDttIGluc3RhbmNlb2YgUHJvbWlzZT9zLnB1c2gobS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiByW3VdPWUsYS5jdXJyZW50Q29udGV4dD1sLG8ucHJvY2Vzc0NoaWxkTm9kZXMoaS5ub2RlLHQsYSxyLG4pLGV9KSk6KHJbdV09bSxwLnByb2Nlc3NDaGlsZE5vZGVzKGkubm9kZSx0LGEscixuKSl9ZWxzZSBwLnByb2Nlc3NDaGlsZE5vZGVzKGkubm9kZSx0LGEscixuKX0scD10aGlzO3QubGVuZ3RoPjA7KWkoKTtyZXR1cm4gc30sZS5wcm90b3R5cGUucHJvY2Vzc0NoaWxkTm9kZXM9ZnVuY3Rpb24oZSx0LGEscixuKXtlLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIG89Z2V0Tm9kZU5hbWVBbmRJbmRleChlLm5hbWUsYSlbMF07bltvXXx8KFwibWVyZ2VcIj09PWUub3A/ZS5pbnB1dE5hbWVzLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuISFnZXRUZW5zb3IoZSxyLGEpfSkmJihuW29dPSEwLHQucHVzaCh7Y29udGV4dHM6YS5jdXJyZW50Q29udGV4dCxub2RlOmV9KSk6ZS5pbnB1dE5hbWVzLmV2ZXJ5KGZ1bmN0aW9uKGUpe3JldHVybiEhZ2V0VGVuc29yKGUscixhKX0pJiYobltvXT0hMCx0LnB1c2goe2NvbnRleHRzOmEuY3VycmVudENvbnRleHQsbm9kZTplfSkpKX0pfSxlLnByb3RvdHlwZS5jYWxjdWxhdGVPdXRwdXRzPWZ1bmN0aW9uKGUpe3JldHVybiFlfHxlIGluc3RhbmNlb2YgQXJyYXl8fChlPVtlXSksZXx8dGhpcy5ncmFwaC5vdXRwdXRzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5uYW1lfSl9LGUucHJvdG90eXBlLmZpbmRPdXRwdXRzPWZ1bmN0aW9uKGUsdCxhKXtyZXR1cm4gdGhpcy5jYWxjdWxhdGVPdXRwdXRzKGEpLnJlZHVjZShmdW5jdGlvbihhLHIpe3JldHVybiBhW3JdPWdldFRlbnNvcihyLGUsdCksYX0se30pfSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztPYmplY3Qua2V5cyh0aGlzLndlaWdodE1hcCkuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gZS53ZWlnaHRNYXBbdF0uZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNwb3NlKCl9KX0pfSxlLnByb3RvdHlwZS5jaGVja0lucHV0U2hhcGVBbmRUeXBlPWZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09dCYmKHQ9ITApLHRoaXMucGxhY2Vob2xkZXJzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIHI9ZVthLm5hbWVdO2lmKHR8fHIpe3ZhciBuPXJbMF07aWYoYS5wYXJhbXMuc2hhcGUmJmEucGFyYW1zLnNoYXBlLnZhbHVlKXt2YXIgbz1hLnBhcmFtcy5zaGFwZS52YWx1ZSxzPW8ubGVuZ3RoPT09bi5zaGFwZS5sZW5ndGgmJm4uc2hhcGUuZXZlcnkoZnVuY3Rpb24oZSx0KXtyZXR1cm4tMT09PW9bdF18fG9bdF09PT1lfSk7dXRpbC5hc3NlcnQocyxcIlRoZSBzaGFwZSBvZiBkaWN0WydcIithLm5hbWUrXCInXSBwcm92aWRlZCBpbiBtb2RlbC5leGVjdXRlKGRpY3QpIG11c3QgYmUgW1wiK28rXCJdLCBidXQgd2FzIFtcIituLnNoYXBlK1wiXVwiKX1hLnBhcmFtcy5kdHlwZSYmYS5wYXJhbXMuZHR5cGUudmFsdWUmJnV0aWwuYXNzZXJ0KG4uZHR5cGU9PT1hLnBhcmFtcy5kdHlwZS52YWx1ZSxcIlRoZSBkdHlwZSBvZiBkaWN0WydcIithLm5hbWUrXCInXSBwcm92aWRlZCBpbiBtb2RlbC5leGVjdXRlKGRpY3QpIG11c3QgYmUgXCIrYS5wYXJhbXMuZHR5cGUudmFsdWUrXCIsIGJ1dCB3YXMgXCIrbi5kdHlwZSl9fSl9LGUucHJvdG90eXBlLmNoZWNrSW5wdXQ9ZnVuY3Rpb24oZSx0KXt2YXIgYT10aGlzO3ZvaWQgMD09PXQmJih0PSEwKTt2YXIgcj1PYmplY3Qua2V5cyhlKSxuPVtdLG89W107dGhpcy5pbnB1dE5vZGVzLmZvckVhY2goZnVuY3Rpb24oZSl7LTE9PT1yLmluZGV4T2YoZSkmJm4ucHVzaChlKX0pLHIuZm9yRWFjaChmdW5jdGlvbihlKXstMT09PWEuaW5wdXROb2Rlcy5pbmRleE9mKGUpJiZvLnB1c2goZSl9KTt2YXIgcz1vLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hYS5ncmFwaC5ub2Rlc1tlXX0pO2lmKG4ubGVuZ3RoPjAmJnQpdGhyb3cgbmV3IEVycm9yKFwiVGhlIGRpY3QgcHJvdmlkZWQgaW4gbW9kZWwuZXhlY3V0ZShkaWN0KSBoYXMgdGhlIGtleXMgW1wiK3IrXCJdLCBidXQgaXMgbWlzc2luZyB0aGUgcmVxdWlyZWQga2V5czogW1wiK24rXCJdLlwiKTtpZihvLmxlbmd0aD4wJiZ0KXRocm93IG5ldyBFcnJvcihcIlRoZSBkaWN0IHByb3ZpZGVkIGluIG1vZGVsLmV4ZWN1dGUoZGljdCkgaGFzIHVudXNlZCBrZXlzOiBbXCIrbytcIl0uIFBsZWFzZSBwcm92aWRlIG9ubHkgdGhlIGZvbGxvd2luZyBrZXlzOiBbXCIrdGhpcy5pbnB1dE5vZGVzK1wiXS5cIik7aWYocy5sZW5ndGg+MCl0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZGljdCBwcm92aWRlZCBpbiBtb2RlbC5leGVjdXRlKGRpY3QpIGhhcyBrZXlzOiBbXCIrcytcIl0gbm90IHBhcnQgb2YgbW9kZWwgZ3JhcGguXCIpfSxlLnByb3RvdHlwZS5jaGVja091dHB1dD1mdW5jdGlvbihlLHQpe3ZhciBhPWUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLm5hbWV9KSxyPVtdO2lmKHQuZm9yRWFjaChmdW5jdGlvbihlKXstMT09PWEuaW5kZXhPZihlKSYmci5wdXNoKGUpfSksci5sZW5ndGg+MCl0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZm9sbG93aW5nIG91dHB1dHMgYXJlIG5vdCBiZSBnZW5lcmF0ZWQgYnkgdGhlIGV4ZWN1dGlvbjogW1wiK3IrXCJdLlwiKX0sZX0oKSxGcm96ZW5Nb2RlbD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0LGEpe3RoaXMubW9kZWxVcmw9ZSx0aGlzLndlaWdodE1hbmlmZXN0VXJsPXQsdGhpcy5yZXF1ZXN0T3B0aW9uPWEsdGhpcy52ZXJzaW9uPVwibi9hXCJ9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcIm1vZGVsVmVyc2lvblwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52ZXJzaW9ufSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImlucHV0Tm9kZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXhlY3V0b3IuaW5wdXROb2Rlc30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJvdXRwdXROb2Rlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5leGVjdXRvci5vdXRwdXROb2Rlc30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJpbnB1dHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXhlY3V0b3IuaW5wdXRzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcIm91dHB1dHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXhlY3V0b3Iub3V0cHV0c30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJ3ZWlnaHRzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmV4ZWN1dG9yLndlaWdodE1hcH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5maW5kSU9IYW5kbGVyPWZ1bmN0aW9uKCl7dmFyIGU9W3RoaXMubW9kZWxVcmwsdGhpcy53ZWlnaHRNYW5pZmVzdFVybF07aWYodGhpcy5yZXF1ZXN0T3B0aW9uKXRoaXMuaGFuZGxlcj1pby5icm93c2VySFRUUFJlcXVlc3QoZSx0aGlzLnJlcXVlc3RPcHRpb24pO2Vsc2V7dmFyIHQ9aW8uZ2V0TG9hZEhhbmRsZXJzKGUpO2lmKDA9PT10Lmxlbmd0aCl0LnB1c2goaW8uYnJvd3NlckhUVFBSZXF1ZXN0KGUsdGhpcy5yZXF1ZXN0T3B0aW9uKSk7ZWxzZSBpZih0Lmxlbmd0aD4xKXRocm93IG5ldyBFcnJvcihcIkZvdW5kIG1vcmUgdGhhbiBvbmUgKFwiK3QubGVuZ3RoK1wiKSBsb2FkIGhhbmRsZXJzIGZvciBVUkwgJ1wiK1tlXStcIidcIik7dGhpcy5oYW5kbGVyPXRbMF19fSxlLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgZSx0LGE7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24ocil7c3dpdGNoKHIubGFiZWwpe2Nhc2UgMDppZih0aGlzLmZpbmRJT0hhbmRsZXIoKSxudWxsPT10aGlzLmhhbmRsZXIubG9hZCl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcHJvY2VlZCB3aXRoIG1vZGVsIGxvYWRpbmcgYmVjYXVzZSB0aGUgSU9IYW5kbGVyIHByb3ZpZGVkIGRvZXMgbm90IGhhdmUgdGhlIGBsb2FkYCBtZXRob2QgaW1wbGVtZW50ZWQuXCIpO3JldHVybls0LHRoaXMuaGFuZGxlci5sb2FkKCldO2Nhc2UgMTpyZXR1cm4gZT1yLnNlbnQoKSx0PWNvbXBpbGVkX2FwaV8xLkdyYXBoRGVmLmRlY29kZShuZXcgVWludDhBcnJheShlLm1vZGVsVG9wb2xvZ3kpKSx0aGlzLnZlcnNpb249dC52ZXJzaW9ucy5wcm9kdWNlcitcIi5cIit0LnZlcnNpb25zLm1pbkNvbnN1bWVyLGE9aW8uZGVjb2RlV2VpZ2h0cyhlLndlaWdodERhdGEsZS53ZWlnaHRTcGVjcyksdGhpcy5leGVjdXRvcj1uZXcgR3JhcGhFeGVjdXRvcihPcGVyYXRpb25NYXBwZXIuSW5zdGFuY2UudHJhbnNmb3JtR3JhcGgodCkpLHRoaXMuZXhlY3V0b3Iud2VpZ2h0TWFwPXRoaXMuY29udmVydFRlbnNvck1hcFRvVGVuc29yc01hcChhKSxbMiwhMF19fSl9KX0sZS5wcm90b3R5cGUucHJlZGljdD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmV4ZWN1dGVfKGUsITAsdGhpcy5vdXRwdXROb2Rlcyl9LGUucHJvdG90eXBlLmNvbnN0cnVjdFRlbnNvck1hcD1mdW5jdGlvbihlKXt2YXIgdD1lIGluc3RhbmNlb2YgVGVuc29yP1tlXTplO2lmKHQubGVuZ3RoIT09dGhpcy5pbnB1dE5vZGVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJJbnB1dCB0ZW5zb3IgY291bnQgbWlzbWF0Y2gsdGhlIGZyb3plbiBtb2RlbCBoYXMgXCIrdGhpcy5pbnB1dE5vZGVzLmxlbmd0aCtcIiBwbGFjZWhvbGRlcnMsIHdoaWxlIHRoZXJlIGFyZSBcIit0Lmxlbmd0aCtcIiBpbnB1dCB0ZW5zb3JzLlwiKTtyZXR1cm4gdGhpcy5pbnB1dE5vZGVzLnJlZHVjZShmdW5jdGlvbihlLGEscil7cmV0dXJuIGVbYV09dFtyXSxlfSx7fSl9LGUucHJvdG90eXBlLmV4ZWN1dGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5leGVjdXRlXyhlLCExLHQpfSxlLnByb3RvdHlwZS5leGVjdXRlXz1mdW5jdGlvbihlLHQsYSl7aWYodm9pZCAwPT09dCYmKHQ9ITApLGE9YXx8dGhpcy5vdXRwdXROb2RlcywoZSBpbnN0YW5jZW9mIFRlbnNvcnx8QXJyYXkuaXNBcnJheShlKSkmJihlPXRoaXMuY29uc3RydWN0VGVuc29yTWFwKGUpKSx0aGlzLmV4ZWN1dG9yLmlzQ29udHJvbEZsb3dNb2RlbHx8dGhpcy5leGVjdXRvci5pc0R5bmFtaWNTaGFwZU1vZGVsKXRocm93IG5ldyBFcnJvcihcIlRoZSBtb2RlbCBjb250YWlucyBjb250cm9sIGZsb3cgb3IgZHluYW1pYyBzaGFwZSBvcHMsIHBsZWFzZSB1c2UgZXhlY3V0ZUFzeW5jIG1ldGhvZFwiKTt2YXIgcj10aGlzLmV4ZWN1dG9yLmV4ZWN1dGUodGhpcy5jb252ZXJ0VGVuc29yTWFwVG9UZW5zb3JzTWFwKGUpLHQsYSksbj1PYmplY3Qua2V5cyhyKTtyZXR1cm4gQXJyYXkuaXNBcnJheShhKSYmYS5sZW5ndGg+MT9hLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gcltlXX0pOnJbblswXV19LGUucHJvdG90eXBlLmV4ZWN1dGVBc3luYz1mdW5jdGlvbihlLHQpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIGEscjtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihuKXtzd2l0Y2gobi5sYWJlbCl7Y2FzZSAwOmlmKCF0aGlzLmV4ZWN1dG9yLmlzQ29udHJvbEZsb3dNb2RlbCYmIXRoaXMuZXhlY3V0b3IuaXNEeW5hbWljU2hhcGVNb2RlbCl0aHJvdyBuZXcgRXJyb3IoXCJUaGUgbW9kZWwgZG9lcyBub3QgY29udGFpbiBjb250cm9sIGZsb3cgb3IgZHluYW1pYyBzaGFwZSBvcHMsIHBsZWFzZSB1c2UgZXhlY3V0ZSBtZXRob2QgZm9yIGJldHRlciBwZXJmb3JtYW5jZS5cIik7cmV0dXJuIHQ9dHx8dGhpcy5vdXRwdXROb2RlcywoZSBpbnN0YW5jZW9mIFRlbnNvcnx8QXJyYXkuaXNBcnJheShlKSkmJihlPXRoaXMuY29uc3RydWN0VGVuc29yTWFwKGUpKSxbNCx0aGlzLmV4ZWN1dG9yLmV4ZWN1dGVBc3luYyh0aGlzLmNvbnZlcnRUZW5zb3JNYXBUb1RlbnNvcnNNYXAoZSksdCldO2Nhc2UgMTpyZXR1cm4gYT1uLnNlbnQoKSxyPU9iamVjdC5rZXlzKGEpLFsyLEFycmF5LmlzQXJyYXkodCkmJnQubGVuZ3RoPjE/dC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGFbZV19KTphW3JbMF1dXX19KX0pfSxlLnByb3RvdHlwZS5jb252ZXJ0VGVuc29yTWFwVG9UZW5zb3JzTWFwPWZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3Qua2V5cyhlKS5yZWR1Y2UoZnVuY3Rpb24odCxhKXtyZXR1cm4gdFthXT1bZVthXV0sdH0se30pfSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5leGVjdXRvci5kaXNwb3NlKCl9LGV9KCk7ZnVuY3Rpb24gbG9hZEZyb3plbk1vZGVsKGUsdCxhKXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciByO3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKG4pe3N3aXRjaChuLmxhYmVsKXtjYXNlIDA6cmV0dXJuWzQsKHI9bmV3IEZyb3plbk1vZGVsKGUsdCxhKSkubG9hZCgpXTtjYXNlIDE6cmV0dXJuIG4uc2VudCgpLFsyLHJdfX0pfSl9dmFyIHZlcnNpb249XCIwLjYuNFwiO2V4cG9ydHtGcm96ZW5Nb2RlbCxsb2FkRnJvemVuTW9kZWwsdmVyc2lvbiBhcyB2ZXJzaW9uX2NvbnZlcnRlcn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10Zi1jb252ZXJ0ZXIuZXNtLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xudmFyIGV4dGVuZFN0YXRpY3M9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKGUsdCl7ZS5fX3Byb3RvX189dH18fGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmKGVbbl09dFtuXSl9O2Z1bmN0aW9uIF9fZXh0ZW5kcyhlLHQpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPWV9ZXh0ZW5kU3RhdGljcyhlLHQpLGUucHJvdG90eXBlPW51bGw9PT10P09iamVjdC5jcmVhdGUodCk6KG4ucHJvdG90eXBlPXQucHJvdG90eXBlLG5ldyBuKX12YXIgX19hc3NpZ249T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rKylmb3IodmFyIG8gaW4gdD1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbykmJihlW29dPXRbb10pO3JldHVybiBlfTtmdW5jdGlvbiBfX2F3YWl0ZXIoZSx0LG4scil7cmV0dXJuIG5ldyhufHwobj1Qcm9taXNlKSkoZnVuY3Rpb24obyxhKXtmdW5jdGlvbiBpKGUpe3RyeXt1KHIubmV4dChlKSl9Y2F0Y2goZSl7YShlKX19ZnVuY3Rpb24gcyhlKXt0cnl7dShyLnRocm93KGUpKX1jYXRjaChlKXthKGUpfX1mdW5jdGlvbiB1KGUpe2UuZG9uZT9vKGUudmFsdWUpOm5ldyBuKGZ1bmN0aW9uKHQpe3QoZS52YWx1ZSl9KS50aGVuKGkscyl9dSgocj1yLmFwcGx5KGUsdHx8W10pKS5uZXh0KCkpfSl9ZnVuY3Rpb24gX19nZW5lcmF0b3IoZSx0KXt2YXIgbixyLG8sYSxpPXtsYWJlbDowLHNlbnQ6ZnVuY3Rpb24oKXtpZigxJm9bMF0pdGhyb3cgb1sxXTtyZXR1cm4gb1sxXX0sdHJ5czpbXSxvcHM6W119O3JldHVybiBhPXtuZXh0OnMoMCksdGhyb3c6cygxKSxyZXR1cm46cygyKX0sXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiYoYVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxhO2Z1bmN0aW9uIHMoYSl7cmV0dXJuIGZ1bmN0aW9uKHMpe3JldHVybiBmdW5jdGlvbihhKXtpZihuKXRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO2Zvcig7aTspdHJ5e2lmKG49MSxyJiYobz0yJmFbMF0/ci5yZXR1cm46YVswXT9yLnRocm93fHwoKG89ci5yZXR1cm4pJiZvLmNhbGwociksMCk6ci5uZXh0KSYmIShvPW8uY2FsbChyLGFbMV0pKS5kb25lKXJldHVybiBvO3N3aXRjaChyPTAsbyYmKGE9WzImYVswXSxvLnZhbHVlXSksYVswXSl7Y2FzZSAwOmNhc2UgMTpvPWE7YnJlYWs7Y2FzZSA0OnJldHVybiBpLmxhYmVsKysse3ZhbHVlOmFbMV0sZG9uZTohMX07Y2FzZSA1OmkubGFiZWwrKyxyPWFbMV0sYT1bMF07Y29udGludWU7Y2FzZSA3OmE9aS5vcHMucG9wKCksaS50cnlzLnBvcCgpO2NvbnRpbnVlO2RlZmF1bHQ6aWYoIShvPShvPWkudHJ5cykubGVuZ3RoPjAmJm9bby5sZW5ndGgtMV0pJiYoNj09PWFbMF18fDI9PT1hWzBdKSl7aT0wO2NvbnRpbnVlfWlmKDM9PT1hWzBdJiYoIW98fGFbMV0+b1swXSYmYVsxXTxvWzNdKSl7aS5sYWJlbD1hWzFdO2JyZWFrfWlmKDY9PT1hWzBdJiZpLmxhYmVsPG9bMV0pe2kubGFiZWw9b1sxXSxvPWE7YnJlYWt9aWYobyYmaS5sYWJlbDxvWzJdKXtpLmxhYmVsPW9bMl0saS5vcHMucHVzaChhKTticmVha31vWzJdJiZpLm9wcy5wb3AoKSxpLnRyeXMucG9wKCk7Y29udGludWV9YT10LmNhbGwoZSxpKX1jYXRjaChlKXthPVs2LGVdLHI9MH1maW5hbGx5e249bz0wfWlmKDUmYVswXSl0aHJvdyBhWzFdO3JldHVybnt2YWx1ZTphWzBdP2FbMV06dm9pZCAwLGRvbmU6ITB9fShbYSxzXSl9fX1mdW5jdGlvbiBpc01vYmlsZSgpe3ZhciBlPW5hdmlnYXRvci51c2VyQWdlbnR8fG5hdmlnYXRvci52ZW5kb3J8fHdpbmRvdy5vcGVyYTtyZXR1cm4vKGFuZHJvaWR8YmJcXGQrfG1lZWdvKS4rbW9iaWxlfGF2YW50Z298YmFkYVxcL3xibGFja2JlcnJ5fGJsYXplcnxjb21wYWx8ZWxhaW5lfGZlbm5lY3xoaXB0b3B8aWVtb2JpbGV8aXAoaG9uZXxvZCl8aXJpc3xraW5kbGV8bGdlIHxtYWVtb3xtaWRwfG1tcHxtb2JpbGUuK2ZpcmVmb3h8bmV0ZnJvbnR8b3BlcmEgbShvYnxpbilpfHBhbG0oIG9zKT98cGhvbmV8cChpeGl8cmUpXFwvfHBsdWNrZXJ8cG9ja2V0fHBzcHxzZXJpZXMoNHw2KTB8c3ltYmlhbnx0cmVvfHVwXFwuKGJyb3dzZXJ8bGluayl8dm9kYWZvbmV8d2FwfHdpbmRvd3MgY2V8eGRhfHhpaW5vL2kudGVzdChlKXx8LzEyMDd8NjMxMHw2NTkwfDNnc298NHRocHw1MFsxLTZdaXw3NzBzfDgwMnN8YSB3YXxhYmFjfGFjKGVyfG9vfHNcXC0pfGFpKGtvfHJuKXxhbChhdnxjYXxjbyl8YW1vaXxhbihleHxueXx5dyl8YXB0dXxhcihjaHxnbyl8YXModGV8dXMpfGF0dHd8YXUoZGl8XFwtbXxyIHxzICl8YXZhbnxiZShja3xsbHxucSl8YmkobGJ8cmQpfGJsKGFjfGF6KXxicihlfHYpd3xidW1ifGJ3XFwtKG58dSl8YzU1XFwvfGNhcGl8Y2N3YXxjZG1cXC18Y2VsbHxjaHRtfGNsZGN8Y21kXFwtfGNvKG1wfG5kKXxjcmF3fGRhKGl0fGxsfG5nKXxkYnRlfGRjXFwtc3xkZXZpfGRpY2F8ZG1vYnxkbyhjfHApb3xkcygxMnxcXC1kKXxlbCg0OXxhaSl8ZW0obDJ8dWwpfGVyKGljfGswKXxlc2w4fGV6KFs0LTddMHxvc3x3YXx6ZSl8ZmV0Y3xmbHkoXFwtfF8pfGcxIHV8ZzU2MHxnZW5lfGdmXFwtNXxnXFwtbW98Z28oXFwud3xvZCl8Z3IoYWR8dW4pfGhhaWV8aGNpdHxoZFxcLShtfHB8dCl8aGVpXFwtfGhpKHB0fHRhKXxocCggaXxpcCl8aHNcXC1jfGh0KGMoXFwtfCB8X3xhfGd8cHxzfHQpfHRwKXxodShhd3x0Yyl8aVxcLSgyMHxnb3xtYSl8aTIzMHxpYWMoIHxcXC18XFwvKXxpYnJvfGlkZWF8aWcwMXxpa29tfGltMWt8aW5ub3xpcGFxfGlyaXN8amEodHx2KWF8amJyb3xqZW11fGppZ3N8a2RkaXxrZWppfGtndCggfFxcLyl8a2xvbnxrcHQgfGt3Y1xcLXxreW8oY3xrKXxsZShub3x4aSl8bGcoIGd8XFwvKGt8bHx1KXw1MHw1NHxcXC1bYS13XSl8bGlid3xseW54fG0xXFwtd3xtM2dhfG01MFxcL3xtYSh0ZXx1aXx4byl8bWMoMDF8MjF8Y2EpfG1cXC1jcnxtZShyY3xyaSl8bWkobzh8b2F8dHMpfG1tZWZ8bW8oMDF8MDJ8Yml8ZGV8ZG98dChcXC18IHxvfHYpfHp6KXxtdCg1MHxwMXx2ICl8bXdicHxteXdhfG4xMFswLTJdfG4yMFsyLTNdfG4zMCgwfDIpfG41MCgwfDJ8NSl8bjcoMCgwfDEpfDEwKXxuZSgoY3xtKVxcLXxvbnx0Znx3Znx3Z3x3dCl8bm9rKDZ8aSl8bnpwaHxvMmltfG9wKHRpfHd2KXxvcmFufG93ZzF8cDgwMHxwYW4oYXxkfHQpfHBkeGd8cGcoMTN8XFwtKFsxLThdfGMpKXxwaGlsfHBpcmV8cGwoYXl8dWMpfHBuXFwtMnxwbyhja3xydHxzZSl8cHJveHxwc2lvfHB0XFwtZ3xxYVxcLWF8cWMoMDd8MTJ8MjF8MzJ8NjB8XFwtWzItN118aVxcLSl8cXRla3xyMzgwfHI2MDB8cmFrc3xyaW05fHJvKHZlfHpvKXxzNTVcXC98c2EoZ2V8bWF8bW18bXN8bnl8dmEpfHNjKDAxfGhcXC18b298cFxcLSl8c2RrXFwvfHNlKGMoXFwtfDB8MSl8NDd8bWN8bmR8cmkpfHNnaFxcLXxzaGFyfHNpZShcXC18bSl8c2tcXC0wfHNsKDQ1fGlkKXxzbShhbHxhcnxiM3xpdHx0NSl8c28oZnR8bnkpfHNwKDAxfGhcXC18dlxcLXx2ICl8c3koMDF8bWIpfHQyKDE4fDUwKXx0NigwMHwxMHwxOCl8dGEoZ3R8bGspfHRjbFxcLXx0ZGdcXC18dGVsKGl8bSl8dGltXFwtfHRcXC1tb3x0byhwbHxzaCl8dHMoNzB8bVxcLXxtM3xtNSl8dHhcXC05fHVwKFxcLmJ8ZzF8c2kpfHV0c3R8djQwMHx2NzUwfHZlcml8dmkocmd8dGUpfHZrKDQwfDVbMC0zXXxcXC12KXx2bTQwfHZvZGF8dnVsY3x2eCg1Mnw1M3w2MHw2MXw3MHw4MHw4MXw4M3w4NXw5OCl8dzNjKFxcLXwgKXx3ZWJjfHdoaXR8d2koZyB8bmN8bncpfHdtbGJ8d29udXx4NzAwfHlhc1xcLXx5b3VyfHpldG98enRlXFwtL2kudGVzdChlLnN1YnN0cigwLDQpKX1mdW5jdGlvbiBzaHVmZmxlKGUpe2Zvcih2YXIgdD1lLmxlbmd0aCxuPTAscj0wO3Q+MDspcj1NYXRoLnJhbmRvbSgpKnR8MCxuPWVbLS10XSxlW3RdPWVbcl0sZVtyXT1ufWZ1bmN0aW9uIGNsYW1wKGUsdCxuKXtyZXR1cm4gTWF0aC5tYXgoZSxNYXRoLm1pbih0LG4pKX1mdW5jdGlvbiBuZWFyZXN0TGFyZ2VyRXZlbihlKXtyZXR1cm4gZSUyPT0wP2U6ZSsxfWZ1bmN0aW9uIHJhbmRVbmlmb3JtKGUsdCl7dmFyIG49TWF0aC5yYW5kb20oKTtyZXR1cm4gdCpuKygxLW4pKmV9ZnVuY3Rpb24gZGlzdFNxdWFyZWQoZSx0KXtmb3IodmFyIG49MCxyPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBvPU51bWJlcihlW3JdKS1OdW1iZXIodFtyXSk7bis9bypvfXJldHVybiBufWZ1bmN0aW9uIGFzc2VydChlLHQpe2lmKCFlKXRocm93IG5ldyBFcnJvcihcInN0cmluZ1wiPT10eXBlb2YgdD90OnQoKSl9ZnVuY3Rpb24gYXNzZXJ0U2hhcGVzTWF0Y2goZSx0LG4pe3ZvaWQgMD09PW4mJihuPVwiXCIpLGFzc2VydChhcnJheXNFcXVhbChlLHQpLG4rXCIgU2hhcGVzIFwiK2UrXCIgYW5kIFwiK3QrXCIgbXVzdCBtYXRjaFwiKX1mdW5jdGlvbiBhc3NlcnROb25OdWxsKGUpe2Fzc2VydChudWxsIT1lLFwiVGhlIGlucHV0IHRvIHRoZSB0ZW5zb3IgY29uc3RydWN0b3IgbXVzdCBiZSBhIG5vbi1udWxsIHZhbHVlLlwiKX1mdW5jdGlvbiBmbGF0dGVuKGUsdCl7aWYodm9pZCAwPT09dCYmKHQ9W10pLEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciBuPTA7bjxlLmxlbmd0aDsrK24pZmxhdHRlbihlW25dLHQpO2Vsc2UgdC5wdXNoKGUpO3JldHVybiB0fWZ1bmN0aW9uIHNpemVGcm9tU2hhcGUoZSl7aWYoMD09PWUubGVuZ3RoKXJldHVybiAxO2Zvcih2YXIgdD1lWzBdLG49MTtuPGUubGVuZ3RoO24rKyl0Kj1lW25dO3JldHVybiB0fWZ1bmN0aW9uIGlzU2NhbGFyU2hhcGUoZSl7cmV0dXJuIDA9PT1lLmxlbmd0aH1mdW5jdGlvbiBhcnJheXNFcXVhbChlLHQpe2lmKGU9PT10KXJldHVybiEwO2lmKG51bGw9PWV8fG51bGw9PXQpcmV0dXJuITE7aWYoZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZihlW25dIT09dFtuXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBpc0ludChlKXtyZXR1cm4gZSUxPT0wfWZ1bmN0aW9uIHRhbmgoZSl7aWYobnVsbCE9TWF0aC50YW5oKXJldHVybiBNYXRoLnRhbmgoZSk7aWYoZT09PTEvMClyZXR1cm4gMTtpZihlPT09LTEvMClyZXR1cm4tMTt2YXIgdD1NYXRoLmV4cCgyKmUpO3JldHVybih0LTEpLyh0KzEpfWZ1bmN0aW9uIHNpemVUb1NxdWFyaXNoU2hhcGUoZSl7Zm9yKHZhciB0PU1hdGguZmxvb3IoTWF0aC5zcXJ0KGUpKTt0PjE7LS10KWlmKGUldD09MClyZXR1cm5bdCxlL3RdO3JldHVyblsxLGVdfWZ1bmN0aW9uIGNyZWF0ZVNodWZmbGVkSW5kaWNlcyhlKXtmb3IodmFyIHQ9bmV3IFVpbnQzMkFycmF5KGUpLG49MDtuPGU7KytuKXRbbl09bjtyZXR1cm4gc2h1ZmZsZSh0KSx0fWZ1bmN0aW9uIHJpZ2h0UGFkKGUsdCl7cmV0dXJuIHQ8PWUubGVuZ3RoP2U6ZStcIiBcIi5yZXBlYXQodC1lLmxlbmd0aCl9ZnVuY3Rpb24gcmVwZWF0ZWRUcnkoZSx0LG4pe3JldHVybiB2b2lkIDA9PT10JiYodD1mdW5jdGlvbihlKXtyZXR1cm4gMH0pLG5ldyBQcm9taXNlKGZ1bmN0aW9uKHIsbyl7dmFyIGE9MCxpPWZ1bmN0aW9uKCl7aWYoZSgpKXIoKTtlbHNle3ZhciBzPXQoKythKTtudWxsIT1uJiZhPj1uP28oKTpzZXRUaW1lb3V0KGkscyl9fTtpKCl9KX1mdW5jdGlvbiBpbmZlckZyb21JbXBsaWNpdFNoYXBlKGUsdCl7Zm9yKHZhciBuPTEscj0tMSxvPTA7bzxlLmxlbmd0aDsrK28paWYoZVtvXT49MCluKj1lW29dO2Vsc2UgaWYoLTE9PT1lW29dKXtpZigtMSE9PXIpdGhyb3cgRXJyb3IoXCJTaGFwZXMgY2FuIG9ubHkgaGF2ZSAxIGltcGxpY2l0IHNpemUuIEZvdW5kIC0xIGF0IGRpbSBcIityK1wiIGFuZCBkaW0gXCIrbyk7cj1vfWVsc2UgaWYoZVtvXTwwKXRocm93IEVycm9yKFwiU2hhcGVzIGNhbiBub3QgYmUgPCAwLiBGb3VuZCBcIitlW29dK1wiIGF0IGRpbSBcIitvKTtpZigtMT09PXIpe2lmKHQ+MCYmdCE9PW4pdGhyb3cgRXJyb3IoXCJTaXplKFwiK3QrXCIpIG11c3QgbWF0Y2ggdGhlIHByb2R1Y3Qgb2Ygc2hhcGUgXCIrZSk7cmV0dXJuIGV9aWYoMD09PW4pdGhyb3cgRXJyb3IoXCJDYW5ub3QgaW5mZXIgdGhlIG1pc3Npbmcgc2l6ZSBpbiBbXCIrZStcIl0gd2hlbiB0aGVyZSBhcmUgMCBlbGVtZW50c1wiKTtpZih0JW4hPTApdGhyb3cgRXJyb3IoXCJUaGUgaW1wbGljaXQgc2hhcGUgY2FuJ3QgYmUgYSBmcmFjdGlvbmFsIG51bWJlci4gR290IFwiK3QrXCIgLyBcIituKTt2YXIgYT1lLnNsaWNlKCk7cmV0dXJuIGFbcl09dC9uLGF9ZnVuY3Rpb24gc3F1ZWV6ZVNoYXBlKGUsdCl7Zm9yKHZhciBuPVtdLHI9W10sbz0wLGE9MDthPGUubGVuZ3RoOysrYSl7aWYobnVsbCE9dCl7aWYodFtvXT09PWEmJjEhPT1lW2FdKXRocm93IG5ldyBFcnJvcihcIkNhbid0IHNxdWVlemUgYXhpcyBcIithK1wiIHNpbmNlIGl0cyBkaW0gJ1wiK2VbYV0rXCInIGlzIG5vdCAxXCIpOyhudWxsPT10W29dfHx0W29dPmEpJiYxPT09ZVthXSYmKG4ucHVzaChlW2FdKSxyLnB1c2goYSkpLHRbb108PWEmJm8rK30xIT09ZVthXSYmKG4ucHVzaChlW2FdKSxyLnB1c2goYSkpfXJldHVybntuZXdTaGFwZTpuLGtlcHREaW1zOnJ9fWZ1bmN0aW9uIGdldFR5cGVkQXJyYXlGcm9tRFR5cGUoZSx0KXt2YXIgbj1udWxsO2lmKG51bGw9PWV8fFwiZmxvYXQzMlwiPT09ZSluPW5ldyBGbG9hdDMyQXJyYXkodCk7ZWxzZSBpZihcImludDMyXCI9PT1lKW49bmV3IEludDMyQXJyYXkodCk7ZWxzZXtpZihcImJvb2xcIiE9PWUpdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBkYXRhIHR5cGUgXCIrZSk7bj1uZXcgVWludDhBcnJheSh0KX1yZXR1cm4gbn1mdW5jdGlvbiBjaGVja0NvbXB1dGF0aW9uRm9yTmFOKGUsdCxuKXtpZihcImZsb2F0MzJcIj09PXQpZm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspaWYoaXNOYU4oZVtyXSkpdGhyb3cgRXJyb3IoXCJUaGUgcmVzdWx0IG9mIHRoZSAnXCIrbitcIicgaGFzIE5hTnMuXCIpfWZ1bmN0aW9uIGNoZWNrQ29udmVyc2lvbkZvck5hTihlLHQpe2lmKFwiZmxvYXQzMlwiIT09dClmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZihpc05hTihlW25dKSl0aHJvdyBFcnJvcihcIk5hTiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgZHR5cGU6ICdcIit0K1wiJy5cIil9ZnVuY3Rpb24gaGFzRW5jb2RpbmdMb3NzKGUsdCl7cmV0dXJuXCJjb21wbGV4NjRcIiE9PXQmJigoXCJmbG9hdDMyXCIhPT10fHxcImNvbXBsZXg2NFwiPT09ZSkmJigoXCJpbnQzMlwiIT09dHx8XCJmbG9hdDMyXCI9PT1lfHxcImNvbXBsZXg2NFwiPT09ZSkmJihcImJvb2xcIiE9PXR8fFwiYm9vbFwiIT09ZSkpKX1mdW5jdGlvbiBjb3B5VHlwZWRBcnJheShlLHQsbil7aWYobnVsbD09dHx8XCJmbG9hdDMyXCI9PT10fHxcImNvbXBsZXg2NFwiPT09dClyZXR1cm4gbmV3IEZsb2F0MzJBcnJheShlKTtpZihcImludDMyXCI9PT10KXJldHVybiBuJiZjaGVja0NvbnZlcnNpb25Gb3JOYU4oZSx0KSxuZXcgSW50MzJBcnJheShlKTtpZihcImJvb2xcIj09PXQpe2Zvcih2YXIgcj1uZXcgVWludDhBcnJheShlLmxlbmd0aCksbz0wO288ci5sZW5ndGg7KytvKTAhPT1NYXRoLnJvdW5kKGVbb10pJiYocltvXT0xKTtyZXR1cm4gcn10aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGRhdGEgdHlwZSBcIit0KX1mdW5jdGlvbiBpc1R5cGVkQXJyYXkoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXl8fGUgaW5zdGFuY2VvZiBJbnQzMkFycmF5fHxlIGluc3RhbmNlb2YgVWludDhBcnJheX1mdW5jdGlvbiBieXRlc1BlckVsZW1lbnQoZSl7aWYoXCJmbG9hdDMyXCI9PT1lfHxcImludDMyXCI9PT1lKXJldHVybiA0O2lmKFwiY29tcGxleDY0XCI9PT1lKXJldHVybiA4O2lmKFwiYm9vbFwiPT09ZSlyZXR1cm4gMTt0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGR0eXBlIFwiK2UpfWZ1bmN0aW9uIGlzRnVuY3Rpb24oZSl7cmV0dXJuISEoZSYmZS5jb25zdHJ1Y3RvciYmZS5jYWxsJiZlLmFwcGx5KX1mdW5jdGlvbiBuZWFyZXN0RGl2aXNvcihlLHQpe2Zvcih2YXIgbj10O248ZTsrK24paWYoZSVuPT0wKXJldHVybiBuO3JldHVybiBlfWZ1bmN0aW9uIGNvbXB1dGVTdHJpZGVzKGUpe3ZhciB0PWUubGVuZ3RoO2lmKHQ8MilyZXR1cm5bXTt2YXIgbj1uZXcgQXJyYXkodC0xKTtuW3QtMl09ZVt0LTFdO2Zvcih2YXIgcj10LTM7cj49MDstLXIpbltyXT1uW3IrMV0qZVtyKzFdO3JldHVybiBufWZ1bmN0aW9uIHRvVHlwZWRBcnJheShlLHQsbil7cmV0dXJuIG5vQ29udmVyc2lvbk5lZWRlZChlLHQpP2U6KEFycmF5LmlzQXJyYXkoZSkmJihlPWZsYXR0ZW4oZSkpLGNvcHlUeXBlZEFycmF5KGUsdCxuKSl9ZnVuY3Rpb24gbm9Db252ZXJzaW9uTmVlZGVkKGUsdCl7cmV0dXJuIGUgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkmJlwiZmxvYXQzMlwiPT09dHx8ZSBpbnN0YW5jZW9mIEludDMyQXJyYXkmJlwiaW50MzJcIj09PXR8fGUgaW5zdGFuY2VvZiBVaW50OEFycmF5JiZcImJvb2xcIj09PXR9ZnVuY3Rpb24gbWFrZU9uZXNUeXBlZEFycmF5KGUsdCl7Zm9yKHZhciBuPW1ha2VaZXJvc1R5cGVkQXJyYXkoZSx0KSxyPTA7cjxuLmxlbmd0aDtyKyspbltyXT0xO3JldHVybiBufWZ1bmN0aW9uIG1ha2VaZXJvc1R5cGVkQXJyYXkoZSx0KXtpZihudWxsPT10fHxcImZsb2F0MzJcIj09PXR8fFwiY29tcGxleDY0XCI9PT10KXJldHVybiBuZXcgRmxvYXQzMkFycmF5KGUpO2lmKFwiaW50MzJcIj09PXQpcmV0dXJuIG5ldyBJbnQzMkFycmF5KGUpO2lmKFwiYm9vbFwiPT09dClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSk7dGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBkYXRhIHR5cGUgXCIrdCl9ZnVuY3Rpb24gbm93KCl7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHBlcmZvcm1hbmNlKXJldHVybiBwZXJmb3JtYW5jZS5ub3coKTtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgcHJvY2Vzcyl7dmFyIGU9cHJvY2Vzcy5ocnRpbWUoKTtyZXR1cm4gMWUzKmVbMF0rZVsxXS8xZTZ9dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IG1lYXN1cmUgdGltZSBpbiB0aGlzIGVudmlyb25tZW50LiBZb3Ugc2hvdWxkIHJ1biB0Zi5qcyBpbiB0aGUgYnJvd3NlciBvciBpbiBOb2RlLmpzXCIpfXZhciB1dGlsPU9iamVjdC5mcmVlemUoe3NodWZmbGU6c2h1ZmZsZSxjbGFtcDpjbGFtcCxuZWFyZXN0TGFyZ2VyRXZlbjpuZWFyZXN0TGFyZ2VyRXZlbixyYW5kVW5pZm9ybTpyYW5kVW5pZm9ybSxkaXN0U3F1YXJlZDpkaXN0U3F1YXJlZCxhc3NlcnQ6YXNzZXJ0LGFzc2VydFNoYXBlc01hdGNoOmFzc2VydFNoYXBlc01hdGNoLGFzc2VydE5vbk51bGw6YXNzZXJ0Tm9uTnVsbCxmbGF0dGVuOmZsYXR0ZW4sc2l6ZUZyb21TaGFwZTpzaXplRnJvbVNoYXBlLGlzU2NhbGFyU2hhcGU6aXNTY2FsYXJTaGFwZSxhcnJheXNFcXVhbDphcnJheXNFcXVhbCxpc0ludDppc0ludCx0YW5oOnRhbmgsc2l6ZVRvU3F1YXJpc2hTaGFwZTpzaXplVG9TcXVhcmlzaFNoYXBlLGNyZWF0ZVNodWZmbGVkSW5kaWNlczpjcmVhdGVTaHVmZmxlZEluZGljZXMscmlnaHRQYWQ6cmlnaHRQYWQscmVwZWF0ZWRUcnk6cmVwZWF0ZWRUcnksaW5mZXJGcm9tSW1wbGljaXRTaGFwZTppbmZlckZyb21JbXBsaWNpdFNoYXBlLHNxdWVlemVTaGFwZTpzcXVlZXplU2hhcGUsZ2V0VHlwZWRBcnJheUZyb21EVHlwZTpnZXRUeXBlZEFycmF5RnJvbURUeXBlLGNoZWNrQ29tcHV0YXRpb25Gb3JOYU46Y2hlY2tDb21wdXRhdGlvbkZvck5hTixjaGVja0NvbnZlcnNpb25Gb3JOYU46Y2hlY2tDb252ZXJzaW9uRm9yTmFOLGhhc0VuY29kaW5nTG9zczpoYXNFbmNvZGluZ0xvc3MsaXNUeXBlZEFycmF5OmlzVHlwZWRBcnJheSxieXRlc1BlckVsZW1lbnQ6Ynl0ZXNQZXJFbGVtZW50LGlzRnVuY3Rpb246aXNGdW5jdGlvbixuZWFyZXN0RGl2aXNvcjpuZWFyZXN0RGl2aXNvcixjb21wdXRlU3RyaWRlczpjb21wdXRlU3RyaWRlcyx0b1R5cGVkQXJyYXk6dG9UeXBlZEFycmF5LG1ha2VPbmVzVHlwZWRBcnJheTptYWtlT25lc1R5cGVkQXJyYXksbWFrZVplcm9zVHlwZWRBcnJheTptYWtlWmVyb3NUeXBlZEFycmF5LG5vdzpub3d9KSxQcm9maWxlcj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXt0aGlzLmJhY2tlbmRUaW1lcj1lLHRoaXMubG9nZ2VyPXQsbnVsbD09dCYmKHRoaXMubG9nZ2VyPW5ldyBMb2dnZXIpfXJldHVybiBlLnByb3RvdHlwZS5wcm9maWxlS2VybmVsPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj10aGlzLG89dGhpcy5iYWNrZW5kVGltZXIudGltZShmdW5jdGlvbigpe249dCgpfSk7cmV0dXJuKEFycmF5LmlzQXJyYXkobik/bjpbbl0pLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49dC5kYXRhU3luYygpO2NoZWNrQ29tcHV0YXRpb25Gb3JOYU4obix0LmR0eXBlLGUpLG8udGhlbihmdW5jdGlvbihvKXtyLmxvZ2dlci5sb2dLZXJuZWxQcm9maWxlKGUsdCxuLG8ua2VybmVsTXMpfSl9KSxufSxlfSgpLExvZ2dlcj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt9cmV0dXJuIGUucHJvdG90eXBlLmxvZ0tlcm5lbFByb2ZpbGU9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89cmlnaHRQYWQocitcIm1zXCIsOSksYT1yaWdodFBhZChlLDI1KSxpPXQucmFuayxzPXQuc2l6ZSx1PXJpZ2h0UGFkKHQuc2hhcGUudG9TdHJpbmcoKSwxNCk7Y29uc29sZS5sb2coXCIlY1wiK2ErXCJcXHQlY1wiK28rXCJcXHQlY1wiK2krXCJEIFwiK3UrXCJcXHQlY1wiK3MsXCJmb250LXdlaWdodDpib2xkXCIsXCJjb2xvcjpyZWRcIixcImNvbG9yOmJsdWVcIixcImNvbG9yOiBvcmFuZ2VcIil9LGV9KCksRk9STUFUX0xJTUlUX05VTV9WQUxTPTIwLEZPUk1BVF9OVU1fRklSU1RfTEFTVF9WQUxTPTMsRk9STUFUX05VTV9TSUdfRElHSVRTPTc7ZnVuY3Rpb24gdGVuc29yVG9TdHJpbmcoZSx0LG4scil7dmFyIG89Y29tcHV0ZVN0cmlkZXModCksYT1jb21wdXRlTWF4U2l6ZVBlckNvbHVtbihlLHQsbixvKSxpPXQubGVuZ3RoLHM9c3ViVGVuc29yVG9TdHJpbmcoZSx0LG4sbyxhKSx1PVtcIlRlbnNvclwiXTtyZXR1cm4gciYmKHUucHVzaChcIiAgZHR5cGU6IFwiK24pLHUucHVzaChcIiAgcmFuazogXCIraSksdS5wdXNoKFwiICBzaGFwZTogW1wiK3QrXCJdXCIpLHUucHVzaChcIiAgdmFsdWVzOlwiKSksdS5wdXNoKHMubWFwKGZ1bmN0aW9uKGUpe3JldHVyblwiICAgIFwiK2V9KS5qb2luKFwiXFxuXCIpKSx1LmpvaW4oXCJcXG5cIil9ZnVuY3Rpb24gY29tcHV0ZU1heFNpemVQZXJDb2x1bW4oZSx0LG4scil7dmFyIG89c2l6ZUZyb21TaGFwZSh0KSxhPXJbci5sZW5ndGgtMV0saT1uZXcgQXJyYXkoYSkuZmlsbCgwKSxzPXQubGVuZ3RoLHU9XCJjb21wbGV4NjRcIj09PW4/Y3JlYXRlQ29tcGxleFR1cGxlcyhlKTplO2lmKHM+MSlmb3IodmFyIGw9MDtsPG8vYTtsKyspZm9yKHZhciBjPWwqYSxwPTA7cDxhO3ArKylpW3BdPU1hdGgubWF4KGlbcF0sdmFsVG9TdHJpbmcodVtjK3BdLDApLmxlbmd0aCk7cmV0dXJuIGl9ZnVuY3Rpb24gdmFsVG9TdHJpbmcoZSx0KXtyZXR1cm4gcmlnaHRQYWQoQXJyYXkuaXNBcnJheShlKT9wYXJzZUZsb2F0KGVbMF0udG9GaXhlZChGT1JNQVRfTlVNX1NJR19ESUdJVFMpKStcIiArIFwiK3BhcnNlRmxvYXQoZVsxXS50b0ZpeGVkKEZPUk1BVF9OVU1fU0lHX0RJR0lUUykpK1wialwiOnBhcnNlRmxvYXQoZS50b0ZpeGVkKEZPUk1BVF9OVU1fU0lHX0RJR0lUUykpLnRvU3RyaW5nKCksdCl9ZnVuY3Rpb24gc3ViVGVuc29yVG9TdHJpbmcoZSx0LG4scixvLGEpe3ZvaWQgMD09PWEmJihhPSEwKTt2YXIgaT1cImNvbXBsZXg2NFwiPT09bj8yOjEscz10WzBdLHU9dC5sZW5ndGg7aWYoMD09PXUpcmV0dXJuXCJjb21wbGV4NjRcIj09PW4/W3ZhbFRvU3RyaW5nKGNyZWF0ZUNvbXBsZXhUdXBsZXMoZSlbMF0sMCldOltlWzBdLnRvU3RyaW5nKCldO2lmKDE9PT11KXtpZihzPkZPUk1BVF9MSU1JVF9OVU1fVkFMUyl7dmFyIGw9Rk9STUFUX05VTV9GSVJTVF9MQVNUX1ZBTFMqaSxjPUFycmF5LmZyb20oZS5zdWJhcnJheSgwLGwpKSxwPUFycmF5LmZyb20oZS5zdWJhcnJheShzLUZPUk1BVF9OVU1fRklSU1RfTEFTVF9WQUxTKmkscykpO3JldHVyblwiY29tcGxleDY0XCI9PT1uJiYoYz1jcmVhdGVDb21wbGV4VHVwbGVzKGMpLHA9Y3JlYXRlQ29tcGxleFR1cGxlcyhwKSksW1wiW1wiK2MubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZhbFRvU3RyaW5nKGUsb1t0XSl9KS5qb2luKFwiLCBcIikrXCIsIC4uLiwgXCIrcC5tYXAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdmFsVG9TdHJpbmcoZSxvW3MtRk9STUFUX05VTV9GSVJTVF9MQVNUX1ZBTFMrdF0pfSkuam9pbihcIiwgXCIpK1wiXVwiXX1yZXR1cm5bXCJbXCIrKFwiY29tcGxleDY0XCI9PT1uP2NyZWF0ZUNvbXBsZXhUdXBsZXMoZSk6QXJyYXkuZnJvbShlKSkubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZhbFRvU3RyaW5nKGUsb1t0XSl9KS5qb2luKFwiLCBcIikrXCJdXCJdfXZhciBkPXQuc2xpY2UoMSksaD1yLnNsaWNlKDEpLGY9clswXSppLG09W107aWYocz5GT1JNQVRfTElNSVRfTlVNX1ZBTFMpe2Zvcih2YXIgZz0wO2c8Rk9STUFUX05VTV9GSVJTVF9MQVNUX1ZBTFM7ZysrKXt2YXIgdj0oeD1nKmYpK2Y7bS5wdXNoLmFwcGx5KG0sc3ViVGVuc29yVG9TdHJpbmcoZS5zdWJhcnJheSh4LHYpLGQsbixoLG8sITEpKX1tLnB1c2goXCIuLi5cIik7Zm9yKGc9cy1GT1JNQVRfTlVNX0ZJUlNUX0xBU1RfVkFMUztnPHM7ZysrKXt2PSh4PWcqZikrZjttLnB1c2guYXBwbHkobSxzdWJUZW5zb3JUb1N0cmluZyhlLnN1YmFycmF5KHgsdiksZCxuLGgsbyxnPT09cy0xKSl9fWVsc2UgZm9yKGc9MDtnPHM7ZysrKXt2YXIgeDt2PSh4PWcqZikrZjttLnB1c2guYXBwbHkobSxzdWJUZW5zb3JUb1N0cmluZyhlLnN1YmFycmF5KHgsdiksZCxuLGgsbyxnPT09cy0xKSl9dmFyIHk9Mj09PXU/XCIsXCI6XCJcIjttWzBdPVwiW1wiK21bMF0reTtmb3IoZz0xO2c8bS5sZW5ndGgtMTtnKyspbVtnXT1cIiBcIittW2ddK3k7dmFyIFQ9XCIsXFxuXCI7Zm9yKGc9MjtnPHU7ZysrKVQrPVwiXFxuXCI7cmV0dXJuIG1bbS5sZW5ndGgtMV09XCIgXCIrbVttLmxlbmd0aC0xXStcIl1cIisoYT9cIlwiOlQpLG19ZnVuY3Rpb24gY3JlYXRlQ29tcGxleFR1cGxlcyhlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bis9Mil0LnB1c2goW2Vbbl0sZVtuKzFdXSk7cmV0dXJuIHR9dmFyIFRlbnNvckJ1ZmZlcj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0LG4pe2lmKHRoaXMuZHR5cGU9dCx0aGlzLnNoYXBlPWUuc2xpY2UoKSx0aGlzLnNpemU9c2l6ZUZyb21TaGFwZShlKSxudWxsIT1uKXt2YXIgcj1uLmxlbmd0aDthc3NlcnQocj09PXRoaXMuc2l6ZSxcIkxlbmd0aCBvZiB2YWx1ZXMgJ1wiK3IrXCInIGRvZXMgbm90IG1hdGNoIHRoZSBzaXplIGluZmVycmVkIGJ5IHRoZSBzaGFwZSAnXCIrdGhpcy5zaXplK1wiJy5cIil9aWYoXCJjb21wbGV4NjRcIj09PXQpdGhyb3cgbmV3IEVycm9yKFwiY29tcGxleDY0IGR0eXBlIFRlbnNvckJ1ZmZlcnMgYXJlIG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSBjcmVhdGUgYSBUZW5zb3JCdWZmZXIgZm9yIHRoZSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMgc2VwYXJhdGVseSBhbmQgY2FsbCB0Zi5jb21wbGV4KHJlYWwsIGltYWcpLlwiKTt0aGlzLnZhbHVlcz1ufHxnZXRUeXBlZEFycmF5RnJvbURUeXBlKHQsc2l6ZUZyb21TaGFwZSh0aGlzLnNoYXBlKSksdGhpcy5zdHJpZGVzPWNvbXB1dGVTdHJpZGVzKGUpfXJldHVybiBlLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRbbi0xXT1hcmd1bWVudHNbbl07MD09PXQubGVuZ3RoJiYodD1bMF0pLGFzc2VydCh0Lmxlbmd0aD09PXRoaXMucmFuayxcIlRoZSBudW1iZXIgb2YgcHJvdmlkZWQgY29vcmRpbmF0ZXMgKFwiK3QubGVuZ3RoK1wiKSBtdXN0IG1hdGNoIHRoZSByYW5rIChcIit0aGlzLnJhbmsrXCIpXCIpO3ZhciByPXRoaXMubG9jVG9JbmRleCh0KTt0aGlzLnZhbHVlc1tyXT1lfSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspZVt0XT1hcmd1bWVudHNbdF07MD09PWUubGVuZ3RoJiYoZT1bMF0pO2Zvcih2YXIgbj1lW2UubGVuZ3RoLTFdLHI9MDtyPGUubGVuZ3RoLTE7KytyKW4rPXRoaXMuc3RyaWRlc1tyXSplW3JdO3JldHVybiB0aGlzLnZhbHVlc1tuXX0sZS5wcm90b3R5cGUubG9jVG9JbmRleD1mdW5jdGlvbihlKXtpZigwPT09dGhpcy5yYW5rKXJldHVybiAwO2lmKDE9PT10aGlzLnJhbmspcmV0dXJuIGVbMF07Zm9yKHZhciB0PWVbZS5sZW5ndGgtMV0sbj0wO248ZS5sZW5ndGgtMTsrK24pdCs9dGhpcy5zdHJpZGVzW25dKmVbbl07cmV0dXJuIHR9LGUucHJvdG90eXBlLmluZGV4VG9Mb2M9ZnVuY3Rpb24oZSl7aWYoMD09PXRoaXMucmFuaylyZXR1cm5bXTtpZigxPT09dGhpcy5yYW5rKXJldHVybltlXTtmb3IodmFyIHQ9bmV3IEFycmF5KHRoaXMuc2hhcGUubGVuZ3RoKSxuPTA7bjx0Lmxlbmd0aC0xOysrbil0W25dPU1hdGguZmxvb3IoZS90aGlzLnN0cmlkZXNbbl0pLGUtPXRbbl0qdGhpcy5zdHJpZGVzW25dO3JldHVybiB0W3QubGVuZ3RoLTFdPWUsdH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwicmFua1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaGFwZS5sZW5ndGh9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUudG9UZW5zb3I9ZnVuY3Rpb24oKXtyZXR1cm4gVGVuc29yLm1ha2UodGhpcy5zaGFwZSx7dmFsdWVzOnRoaXMudmFsdWVzfSx0aGlzLmR0eXBlKX0sZX0oKSx0cmFja2VyRm49bnVsbCxvcEhhbmRsZXI9bnVsbDtmdW5jdGlvbiBzZXRUZW5zb3JUcmFja2VyKGUpe3RyYWNrZXJGbj1lfWZ1bmN0aW9uIHNldE9wSGFuZGxlcihlKXtvcEhhbmRsZXI9ZX12YXIgVGVuc29yPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0LG4scixvKXt0aGlzLmlzRGlzcG9zZWRJbnRlcm5hbD0hMSx0aGlzLnNoYXBlPXQuc2xpY2UoKSx0aGlzLmR0eXBlPW58fFwiZmxvYXQzMlwiLHRoaXMuc2l6ZT1zaXplRnJvbVNoYXBlKHQpLG51bGwhPXImJmFzc2VydCh0aGlzLnNpemU9PT1yLmxlbmd0aCxcIkJhc2VkIG9uIHRoZSBwcm92aWRlZCBzaGFwZSwgW1wiK3QrXCJdLCBhbmQgZHR5cGUgXCIrdGhpcy5kdHlwZStcIiwgdGhlIHRlbnNvciBzaG91bGQgaGF2ZSBcIit0aGlzLnNpemUrXCIgdmFsdWVzIGJ1dCBoYXMgXCIrci5sZW5ndGgpLHRoaXMuc3RyaWRlcz1jb21wdXRlU3RyaWRlcyh0KSx0aGlzLmRhdGFJZD1udWxsIT1vP286e30sdGhpcy5pZD1lLm5leHRJZCsrLHRoaXMucmFua1R5cGU9dGhpcy5yYW5rPDU/dGhpcy5yYW5rLnRvU3RyaW5nKCk6XCJoaWdoZXJcIix0cmFja2VyRm4oKS5yZWdpc3RlclRlbnNvcih0aGlzKSxudWxsIT1yJiZ0cmFja2VyRm4oKS53cml0ZSh0aGlzLmRhdGFJZCxyKX1yZXR1cm4gZS5tYWtlPWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbmV3IGUodCxyLG4udmFsdWVzLG4uZGF0YUlkKX0sZS5wcm90b3R5cGUuZmxhdHRlbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLHRoaXMuYXMxRCgpfSxlLnByb3RvdHlwZS5hc1NjYWxhcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLGFzc2VydCgxPT09dGhpcy5zaXplLFwiVGhlIGFycmF5IG11c3QgaGF2ZSBvbmx5IDEgZWxlbWVudC5cIiksdGhpcy5yZXNoYXBlKFtdKX0sZS5wcm90b3R5cGUuYXMxRD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLHRoaXMucmVzaGFwZShbdGhpcy5zaXplXSl9LGUucHJvdG90eXBlLmFzMkQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSx0aGlzLnJlc2hhcGUoW2UsdF0pfSxlLnByb3RvdHlwZS5hczNEPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSx0aGlzLnJlc2hhcGUoW2UsdCxuXSl9LGUucHJvdG90eXBlLmFzNEQ9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksdGhpcy5yZXNoYXBlKFtlLHQsbixyXSl9LGUucHJvdG90eXBlLmFzVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuY2FzdCh0aGlzLGUpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJyYW5rXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNoYXBlLmxlbmd0aH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspZVt0XT1hcmd1bWVudHNbdF07YXNzZXJ0KGUubGVuZ3RoPT09dGhpcy5yYW5rLFwiTnVtYmVyIG9mIGNvb3JkaW5hdGVzIGluIGdldCgpIG11c3QgbWF0Y2ggdGhlIHJhbmsgb2YgdGhlIHRlbnNvclwiKSxhc3NlcnQoXCJjb21wbGV4NjRcIiE9PXRoaXMuZHR5cGUsXCJUZW5zb3IuZ2V0KCkgaXMgbm90IHN1cHBvcnRlZCBmb3IgY29tcGxleDY0IHRlbnNvcnMgeWV0LlwiKSx0aGlzLnRocm93SWZEaXNwb3NlZCgpLDA9PT1lLmxlbmd0aCYmKGU9WzBdKTtmb3IodmFyIG49ZVtlLmxlbmd0aC0xXSxyPTA7cjxlLmxlbmd0aC0xOysrciluKz10aGlzLnN0cmlkZXNbcl0qZVtyXTtyZXR1cm4gdGhpcy5kYXRhU3luYygpW25dfSxlLnByb3RvdHlwZS5idWZmZXI9ZnVuY3Rpb24oKXtyZXR1cm4gb3BIYW5kbGVyLmJ1ZmZlcih0aGlzLnNoYXBlLHRoaXMuZHR5cGUsdGhpcy5kYXRhU3luYygpKX0sZS5wcm90b3R5cGUuZGF0YT1mdW5jdGlvbigpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksWzIsdHJhY2tlckZuKCkucmVhZCh0aGlzLmRhdGFJZCldfSl9KX0sZS5wcm90b3R5cGUuZGF0YVN5bmM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSx0cmFja2VyRm4oKS5yZWFkU3luYyh0aGlzLmRhdGFJZCl9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmlzRGlzcG9zZWR8fCh0cmFja2VyRm4oKS5kaXNwb3NlVGVuc29yKHRoaXMpLHRoaXMuaXNEaXNwb3NlZEludGVybmFsPSEwKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiaXNEaXNwb3NlZFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0Rpc3Bvc2VkSW50ZXJuYWx9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUudGhyb3dJZkRpc3Bvc2VkPWZ1bmN0aW9uKCl7aWYodGhpcy5pc0Rpc3Bvc2VkKXRocm93IG5ldyBFcnJvcihcIlRlbnNvciBpcyBkaXNwb3NlZC5cIil9LGUucHJvdG90eXBlLnRvRmxvYXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hc1R5cGUoXCJmbG9hdDMyXCIpfSxlLnByb3RvdHlwZS50b0ludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFzVHlwZShcImludDMyXCIpfSxlLnByb3RvdHlwZS50b0Jvb2w9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hc1R5cGUoXCJib29sXCIpfSxlLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9ITEpLG9wSGFuZGxlci5wcmludCh0aGlzLGUpfSxlLnByb3RvdHlwZS5yZXNoYXBlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5yZXNoYXBlKHRoaXMsZSl9LGUucHJvdG90eXBlLnJlc2hhcGVBcz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSx0aGlzLnJlc2hhcGUoZS5zaGFwZSl9LGUucHJvdG90eXBlLmV4cGFuZERpbXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPTApLG9wSGFuZGxlci5leHBhbmREaW1zKHRoaXMsZSl9LGUucHJvdG90eXBlLmN1bXN1bT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXQmJih0PSExKSx2b2lkIDA9PT1uJiYobj0hMSksb3BIYW5kbGVyLmN1bXN1bSh0aGlzLGUsdCxuKX0sZS5wcm90b3R5cGUuc3F1ZWV6ZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuc3F1ZWV6ZSh0aGlzLGUpfSxlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5jbG9uZSh0aGlzKX0sZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSExKSx0ZW5zb3JUb1N0cmluZyh0aGlzLmRhdGFTeW5jKCksdGhpcy5zaGFwZSx0aGlzLmR0eXBlLGUpfSxlLnByb3RvdHlwZS50aWxlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci50aWxlKHRoaXMsZSl9LGUucHJvdG90eXBlLmdhdGhlcj1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0wKSx0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5nYXRoZXIodGhpcyxlLHQpfSxlLnByb3RvdHlwZS5tYXRNdWw9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT10JiYodD0hMSksdm9pZCAwPT09biYmKG49ITEpLHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLm1hdE11bCh0aGlzLGUsdCxuKX0sZS5wcm90b3R5cGUuZG90PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5kb3QodGhpcyxlKX0sZS5wcm90b3R5cGUubm9ybT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHZvaWQgMD09PWUmJihlPVwiZXVjbGlkZWFuXCIpLHZvaWQgMD09PXQmJih0PW51bGwpLHZvaWQgMD09PW4mJihuPSExKSx0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5ub3JtKHRoaXMsZSx0LG4pfSxlLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5zbGljZSh0aGlzLGUsdCl9LGUucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLnJldmVyc2UodGhpcyxlKX0sZS5wcm90b3R5cGUuY29uY2F0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PTApLHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLmNvbmNhdChbdGhpcyxlXSx0KX0sZS5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9MCksdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuc3BsaXQodGhpcyxlLHQpfSxlLnByb3RvdHlwZS5zdGFjaz1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0wKSxvcEhhbmRsZXIuc3RhY2soW3RoaXMsZV0sdCl9LGUucHJvdG90eXBlLnVuc3RhY2s9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9MCksb3BIYW5kbGVyLnVuc3RhY2sodGhpcyx0KX0sZS5wcm90b3R5cGUucGFkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PTApLG9wSGFuZGxlci5wYWQodGhpcyxlLHQpfSxlLnByb3RvdHlwZS5iYXRjaE5vcm1hbGl6YXRpb249ZnVuY3Rpb24oZSx0LG4scixvKXtyZXR1cm4gdm9pZCAwPT09biYmKG49LjAwMSksdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuYmF0Y2hOb3JtYWxpemF0aW9uKHRoaXMsZSx0LG4scixvKX0sZS5wcm90b3R5cGUuYWxsPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PWUmJihlPW51bGwpLHZvaWQgMD09PXQmJih0PSExKSx0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5hbGwodGhpcyxlLHQpfSxlLnByb3RvdHlwZS5hbnk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9bnVsbCksdm9pZCAwPT09dCYmKHQ9ITEpLHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLmFueSh0aGlzLGUsdCl9LGUucHJvdG90eXBlLmxvZ1N1bUV4cD1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1udWxsKSx2b2lkIDA9PT10JiYodD0hMSksdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIubG9nU3VtRXhwKHRoaXMsZSx0KX0sZS5wcm90b3R5cGUuc3VtPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PWUmJihlPW51bGwpLHZvaWQgMD09PXQmJih0PSExKSx0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5zdW0odGhpcyxlLHQpfSxlLnByb3RvdHlwZS5wcm9kPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PWUmJihlPW51bGwpLHZvaWQgMD09PXQmJih0PSExKSx0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5wcm9kKHRoaXMsZSx0KX0sZS5wcm90b3R5cGUubWVhbj1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1udWxsKSx2b2lkIDA9PT10JiYodD0hMSksdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIubWVhbih0aGlzLGUsdCl9LGUucHJvdG90eXBlLm1pbj1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1udWxsKSx2b2lkIDA9PT10JiYodD0hMSksdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIubWluKHRoaXMsZSx0KX0sZS5wcm90b3R5cGUubWF4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PWUmJihlPW51bGwpLHZvaWQgMD09PXQmJih0PSExKSx0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5tYXgodGhpcyxlLHQpfSxlLnByb3RvdHlwZS5hcmdNaW49ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPW51bGwpLHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLmFyZ01pbih0aGlzLGUpfSxlLnByb3RvdHlwZS5hcmdNYXg9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPW51bGwpLHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLmFyZ01heCh0aGlzLGUpfSxlLnByb3RvdHlwZS5jYXN0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5jYXN0KHRoaXMsZSl9LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuYWRkKHRoaXMsZSl9LGUucHJvdG90eXBlLmFkZFN0cmljdD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuYWRkU3RyaWN0KHRoaXMsZSl9LGUucHJvdG90eXBlLmF0YW4yPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5hdGFuMih0aGlzLGUpfSxlLnByb3RvdHlwZS5zdWI9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLnN1Yih0aGlzLGUpfSxlLnByb3RvdHlwZS5zdWJTdHJpY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLnN1YlN0cmljdCh0aGlzLGUpfSxlLnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLnBvdyh0aGlzLGUpfSxlLnByb3RvdHlwZS5wb3dTdHJpY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLnBvd1N0cmljdCh0aGlzLGUpfSxlLnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLm11bCh0aGlzLGUpfSxlLnByb3RvdHlwZS5tdWxTdHJpY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLm11bFN0cmljdCh0aGlzLGUpfSxlLnByb3RvdHlwZS5kaXY9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLmRpdih0aGlzLGUpfSxlLnByb3RvdHlwZS5mbG9vckRpdj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuZmxvb3JEaXYodGhpcyxlKX0sZS5wcm90b3R5cGUuZGl2U3RyaWN0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5kaXZTdHJpY3QodGhpcyxlKX0sZS5wcm90b3R5cGUubWluaW11bT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIubWluaW11bSh0aGlzLGUpfSxlLnByb3RvdHlwZS5taW5pbXVtU3RyaWN0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5taW5pbXVtU3RyaWN0KHRoaXMsZSl9LGUucHJvdG90eXBlLm1heGltdW09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLm1heGltdW0odGhpcyxlKX0sZS5wcm90b3R5cGUubWF4aW11bVN0cmljdD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIubWF4aW11bVN0cmljdCh0aGlzLGUpfSxlLnByb3RvdHlwZS5tb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLm1vZCh0aGlzLGUpfSxlLnByb3RvdHlwZS5tb2RTdHJpY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLm1vZFN0cmljdCh0aGlzLGUpfSxlLnByb3RvdHlwZS5zcXVhcmVkRGlmZmVyZW5jZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuc3F1YXJlZERpZmZlcmVuY2UodGhpcyxlKX0sZS5wcm90b3R5cGUuc3F1YXJlZERpZmZlcmVuY2VTdHJpY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLnNxdWFyZWREaWZmZXJlbmNlU3RyaWN0KHRoaXMsZSl9LGUucHJvdG90eXBlLnRyYW5zcG9zZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIudHJhbnNwb3NlKHRoaXMsZSl9LGUucHJvdG90eXBlLm5vdEVxdWFsPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5ub3RFcXVhbCh0aGlzLGUpfSxlLnByb3RvdHlwZS5ub3RFcXVhbFN0cmljdD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIubm90RXF1YWxTdHJpY3QodGhpcyxlKX0sZS5wcm90b3R5cGUubGVzcz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIubGVzcyh0aGlzLGUpfSxlLnByb3RvdHlwZS5sZXNzU3RyaWN0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5sZXNzU3RyaWN0KHRoaXMsZSl9LGUucHJvdG90eXBlLmVxdWFsPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5lcXVhbCh0aGlzLGUpfSxlLnByb3RvdHlwZS5lcXVhbFN0cmljdD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuZXF1YWxTdHJpY3QodGhpcyxlKX0sZS5wcm90b3R5cGUubGVzc0VxdWFsPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5sZXNzRXF1YWwodGhpcyxlKX0sZS5wcm90b3R5cGUubGVzc0VxdWFsU3RyaWN0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5sZXNzRXF1YWxTdHJpY3QodGhpcyxlKX0sZS5wcm90b3R5cGUuZ3JlYXRlcj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuZ3JlYXRlcih0aGlzLGUpfSxlLnByb3RvdHlwZS5ncmVhdGVyU3RyaWN0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5ncmVhdGVyU3RyaWN0KHRoaXMsZSl9LGUucHJvdG90eXBlLmdyZWF0ZXJFcXVhbD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuZ3JlYXRlckVxdWFsKHRoaXMsZSl9LGUucHJvdG90eXBlLmdyZWF0ZXJFcXVhbFN0cmljdD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuZ3JlYXRlckVxdWFsU3RyaWN0KHRoaXMsZSl9LGUucHJvdG90eXBlLmxvZ2ljYWxBbmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLmxvZ2ljYWxBbmQodGhpcyxlKX0sZS5wcm90b3R5cGUubG9naWNhbE9yPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5sb2dpY2FsT3IodGhpcyxlKX0sZS5wcm90b3R5cGUubG9naWNhbE5vdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5sb2dpY2FsTm90KHRoaXMpfSxlLnByb3RvdHlwZS5sb2dpY2FsWG9yPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5sb2dpY2FsWG9yKHRoaXMsZSl9LGUucHJvdG90eXBlLndoZXJlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLndoZXJlKGUsdGhpcyx0KX0sZS5wcm90b3R5cGUubmVnPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLm5lZyh0aGlzKX0sZS5wcm90b3R5cGUuY2VpbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5jZWlsKHRoaXMpfSxlLnByb3RvdHlwZS5mbG9vcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5mbG9vcih0aGlzKX0sZS5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5zaWduKHRoaXMpfSxlLnByb3RvdHlwZS5leHA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuZXhwKHRoaXMpfSxlLnByb3RvdHlwZS5leHBtMT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5leHBtMSh0aGlzKX0sZS5wcm90b3R5cGUubG9nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLmxvZyh0aGlzKX0sZS5wcm90b3R5cGUubG9nMXA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIubG9nMXAodGhpcyl9LGUucHJvdG90eXBlLnNxcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuc3FydCh0aGlzKX0sZS5wcm90b3R5cGUucnNxcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIucnNxcnQodGhpcyl9LGUucHJvdG90eXBlLnNxdWFyZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5zcXVhcmUodGhpcyl9LGUucHJvdG90eXBlLnJlY2lwcm9jYWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIucmVjaXByb2NhbCh0aGlzKX0sZS5wcm90b3R5cGUuYWJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLmFicyh0aGlzKX0sZS5wcm90b3R5cGUuY2xpcEJ5VmFsdWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuY2xpcEJ5VmFsdWUodGhpcyxlLHQpfSxlLnByb3RvdHlwZS5yZWx1PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLnJlbHUodGhpcyl9LGUucHJvdG90eXBlLmVsdT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5lbHUodGhpcyl9LGUucHJvdG90eXBlLnNlbHU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuc2VsdSh0aGlzKX0sZS5wcm90b3R5cGUubGVha3lSZWx1PWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0uMiksdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIubGVha3lSZWx1KHRoaXMsZSl9LGUucHJvdG90eXBlLnByZWx1PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5wcmVsdSh0aGlzLGUpfSxlLnByb3RvdHlwZS5zaWdtb2lkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLnNpZ21vaWQodGhpcyl9LGUucHJvdG90eXBlLmxvZ1NpZ21vaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIubG9nU2lnbW9pZCh0aGlzKX0sZS5wcm90b3R5cGUuc29mdHBsdXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuc29mdHBsdXModGhpcyl9LGUucHJvdG90eXBlLnplcm9zTGlrZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci56ZXJvc0xpa2UodGhpcyl9LGUucHJvdG90eXBlLm9uZXNMaWtlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLm9uZXNMaWtlKHRoaXMpfSxlLnByb3RvdHlwZS5zaW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuc2luKHRoaXMpfSxlLnByb3RvdHlwZS5jb3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuY29zKHRoaXMpfSxlLnByb3RvdHlwZS50YW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIudGFuKHRoaXMpfSxlLnByb3RvdHlwZS5hc2luPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLmFzaW4odGhpcyl9LGUucHJvdG90eXBlLmFjb3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuYWNvcyh0aGlzKX0sZS5wcm90b3R5cGUuYXRhbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5hdGFuKHRoaXMpfSxlLnByb3RvdHlwZS5zaW5oPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLnNpbmgodGhpcyl9LGUucHJvdG90eXBlLmNvc2g9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuY29zaCh0aGlzKX0sZS5wcm90b3R5cGUudGFuaD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci50YW5oKHRoaXMpfSxlLnByb3RvdHlwZS5hc2luaD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5hc2luaCh0aGlzKX0sZS5wcm90b3R5cGUuYWNvc2g9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuYWNvc2godGhpcyl9LGUucHJvdG90eXBlLmF0YW5oPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLmF0YW5oKHRoaXMpfSxlLnByb3RvdHlwZS5lcmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuZXJmKHRoaXMpfSxlLnByb3RvdHlwZS5yb3VuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5yb3VuZCh0aGlzKX0sZS5wcm90b3R5cGUuc3RlcD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9MCksdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuc3RlcCh0aGlzLGUpfSxlLnByb3RvdHlwZS5zb2Z0bWF4PWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0tMSksdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuc29mdG1heCh0aGlzLGUpfSxlLnByb3RvdHlwZS5yZXNpemVCaWxpbmVhcj1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0hMSksdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuaW1hZ2UucmVzaXplQmlsaW5lYXIodGhpcyxlLHQpfSxlLnByb3RvdHlwZS5yZXNpemVOZWFyZXN0TmVpZ2hib3I9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9ITEpLHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLmltYWdlLnJlc2l6ZU5lYXJlc3ROZWlnaGJvcih0aGlzLGUsdCl9LGUucHJvdG90eXBlLmNvbnYxZD1mdW5jdGlvbihlLHQsbixyLG8sYSl7cmV0dXJuIHZvaWQgMD09PXImJihyPVwiTldDXCIpLHZvaWQgMD09PW8mJihvPTEpLHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLmNvbnYxZCh0aGlzLGUsdCxuLHIsbyxhKX0sZS5wcm90b3R5cGUuY29udjJkPWZ1bmN0aW9uKGUsdCxuLHIsbyxhKXtyZXR1cm4gdm9pZCAwPT09ciYmKHI9XCJOSFdDXCIpLHZvaWQgMD09PW8mJihvPVsxLDFdKSx0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5jb252MmQodGhpcyxlLHQsbixyLG8sYSl9LGUucHJvdG90eXBlLmNvbnYyZFRyYW5zcG9zZT1mdW5jdGlvbihlLHQsbixyLG8pe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5jb252MmRUcmFuc3Bvc2UodGhpcyxlLHQsbixyLG8pfSxlLnByb3RvdHlwZS5kZXB0aHdpc2VDb252MkQ9ZnVuY3Rpb24oZSx0LG4scixvLGEpe3JldHVybiB2b2lkIDA9PT1yJiYocj1cIk5IV0NcIiksdm9pZCAwPT09byYmKG89WzEsMV0pLHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLmRlcHRod2lzZUNvbnYyZCh0aGlzLGUsdCxuLHIsbyxhKX0sZS5wcm90b3R5cGUuc2VwYXJhYmxlQ29udjJkPWZ1bmN0aW9uKGUsdCxuLHIsbyxhKXtyZXR1cm4gdm9pZCAwPT09byYmKG89WzEsMV0pLHZvaWQgMD09PWEmJihhPVwiTkhXQ1wiKSx0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5zZXBhcmFibGVDb252MmQodGhpcyxlLHQsbixyLG8sYSl9LGUucHJvdG90eXBlLmF2Z1Bvb2w9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLmF2Z1Bvb2wodGhpcyxlLHQsbixyKX0sZS5wcm90b3R5cGUubWF4UG9vbD1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIubWF4UG9vbCh0aGlzLGUsdCxuLHIpfSxlLnByb3RvdHlwZS5sb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbj1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9NSksdm9pZCAwPT09dCYmKHQ9MSksdm9pZCAwPT09biYmKG49MSksdm9pZCAwPT09ciYmKHI9LjUpLG9wSGFuZGxlci5sb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbih0aGlzLGUsdCxuLHIpfSxlLnByb3RvdHlwZS52YXJpYWJsZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHZvaWQgMD09PWUmJihlPSEwKSx0aGlzLnRocm93SWZEaXNwb3NlZCgpLFZhcmlhYmxlLnZhcmlhYmxlKHRoaXMsZSx0LG4pfSxlLnByb3RvdHlwZS51bnNvcnRlZFNlZ21lbnRTdW09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIudW5zb3J0ZWRTZWdtZW50U3VtKHRoaXMsZSx0KX0sZS5wcm90b3R5cGUuYmF0Y2hUb1NwYWNlTkQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuYmF0Y2hUb1NwYWNlTkQodGhpcyxlLHQpfSxlLnByb3RvdHlwZS5zcGFjZVRvQmF0Y2hORD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5zcGFjZVRvQmF0Y2hORCh0aGlzLGUsdCl9LGUucHJvdG90eXBlLnRvcGs9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9MSksdm9pZCAwPT09dCYmKHQ9ITApLHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLnRvcGsodGhpcyxlLHQpfSxlLnByb3RvdHlwZS5zdHJpZGVkU2xpY2U9ZnVuY3Rpb24oZSx0LG4scixvKXtyZXR1cm4gdm9pZCAwPT09ciYmKHI9MCksdm9pZCAwPT09byYmKG89MCksdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxvcEhhbmRsZXIuc3RyaWRlZFNsaWNlKHRoaXMsZSx0LG4scixvKX0sZS5wcm90b3R5cGUuZGVwdGhUb1NwYWNlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksb3BIYW5kbGVyLmRlcHRoVG9TcGFjZSh0aGlzLGUsdCl9LGUucHJvdG90eXBlLmZmdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLG9wSGFuZGxlci5zcGVjdHJhbC5mZnQodGhpcyl9LGUubmV4dElkPTAsZX0oKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVGVuc29yLFN5bWJvbC5oYXNJbnN0YW5jZSx7dmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuISFlJiZudWxsIT1lLnNoYXBlJiZudWxsIT1lLmR0eXBlfX0pO3ZhciBWYXJpYWJsZT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4scixvKXt2b2lkIDA9PT1yJiYocj0hMCk7dmFyIGE9ZS5jYWxsKHRoaXMsbi5zaGFwZSxuLmR0eXBlLG51bGwsbi5kYXRhSWQpfHx0aGlzO2EudHJhaW5hYmxlPXIsYS5uYW1lPW8sbnVsbD09YS5uYW1lJiYoYS5uYW1lPXQubmV4dFZhcklkLnRvU3RyaW5nKCksdC5uZXh0VmFySWQrKyk7dHJ5e3RyYWNrZXJGbigpLnJlZ2lzdGVyVmFyaWFibGUoYSl9Y2F0Y2goZSl7dGhyb3cgdHJhY2tlckZuKCkuZGlzcG9zZVRlbnNvcihhKSxlfXJldHVybiBhfXJldHVybiBfX2V4dGVuZHModCxlKSx0LnZhcmlhYmxlPWZ1bmN0aW9uKGUsbixyLG8pe3JldHVybiB2b2lkIDA9PT1uJiYobj0hMCksbnVsbCE9byYmbyE9PWUuZHR5cGUmJihlPWUuYXNUeXBlKG8pKSxuZXcgdChlLG4scil9LHQucHJvdG90eXBlLmFzc2lnbj1mdW5jdGlvbihlKXtpZihlLmR0eXBlIT09dGhpcy5kdHlwZSl0aHJvdyBuZXcgRXJyb3IoXCJkdHlwZSBvZiB0aGUgbmV3IHZhbHVlIChcIitlLmR0eXBlK1wiKSBhbmQgcHJldmlvdXMgdmFsdWUgKFwiK3RoaXMuZHR5cGUrXCIpIG11c3QgbWF0Y2hcIik7aWYoIWFycmF5c0VxdWFsKGUuc2hhcGUsdGhpcy5zaGFwZSkpdGhyb3cgbmV3IEVycm9yKFwic2hhcGUgb2YgdGhlIG5ldyB2YWx1ZSAoXCIrZS5zaGFwZStcIikgYW5kIHByZXZpb3VzIHZhbHVlIChcIit0aGlzLnNoYXBlK1wiKSBtdXN0IG1hdGNoXCIpO3RyYWNrZXJGbigpLmRpc3Bvc2VUZW5zb3IodGhpcyksdGhpcy5kYXRhSWQ9ZS5kYXRhSWQsdHJhY2tlckZuKCkucmVnaXN0ZXJUZW5zb3IodGhpcyl9LHQubmV4dFZhcklkPTAsdH0oVGVuc29yKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVmFyaWFibGUsU3ltYm9sLmhhc0luc3RhbmNlLHt2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFRlbnNvciYmbnVsbCE9ZS5hc3NpZ24mJmUuYXNzaWduIGluc3RhbmNlb2YgRnVuY3Rpb259fSk7dmFyIHZhcmlhYmxlPVZhcmlhYmxlLnZhcmlhYmxlO2Z1bmN0aW9uIGdldEZpbHRlcmVkTm9kZXNYVG9ZKGUsdCxuKXtmb3IodmFyIHI9e30sbz17fSxhPTA7YTx0Lmxlbmd0aDthKyspclt0W2FdLmlkXT0hMDtmb3IoYT0wO2E8ZS5sZW5ndGg7YSsrKXt2YXIgaT0oZj1lW2FdKS5pbnB1dHM7Zm9yKHZhciBzIGluIGkpe2Zvcih2YXIgdT1pW3NdLGw9ITEsYz0wO2M8dC5sZW5ndGg7YysrKWlmKHJbdS5pZF0pe2Yub3V0cHV0cy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiByW2UuaWRdPSEwfSksbD0hMCxvW2YuaWRdPSEwO2JyZWFrfWlmKGwpYnJlYWt9fXZhciBwPXt9O3Bbbi5pZF09ITA7dmFyIGQ9e307Zm9yKGE9ZS5sZW5ndGgtMTthPj0wO2EtLSlmb3IoaT0oZj1lW2FdKS5pbnB1dHMsYz0wO2M8Zi5vdXRwdXRzLmxlbmd0aDtjKyspaWYocFtmLm91dHB1dHNbY10uaWRdKXtmb3IodmFyIHMgaW4gaSlwW2lbc10uaWRdPSEwLGRbZi5pZF09ITA7YnJlYWt9dmFyIGg9W107Zm9yKGE9MDthPGUubGVuZ3RoO2ErKyl7dmFyIGY7aWYob1soZj1lW2FdKS5pZF0mJmRbZi5pZF0pe3ZhciBtPXt9O2Zvcih2YXIgcyBpbiBmLmlucHV0cyl7dmFyIGc9Zi5pbnB1dHNbc107cltnLmlkXSYmKG1bc109Zyl9dmFyIHY9T2JqZWN0LmFzc2lnbih7fSxmKTt2LmlucHV0cz1tLHYub3V0cHV0cz1mLm91dHB1dHMsaC5wdXNoKHYpfX1yZXR1cm4gaH1mdW5jdGlvbiBiYWNrcHJvcGFnYXRlR3JhZGllbnRzKGUsdCl7Zm9yKHZhciBuPWZ1bmN0aW9uKG4pe3ZhciByPXRbbl0sbz1bXTtpZihyLm91dHB1dHMuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbj1lW3QuaWRdO2lmKG51bGwhPW4pby5wdXNoKG4pO2Vsc2V7dmFyIHI9VGVuc29yLm1ha2UodC5zaGFwZSx7dmFsdWVzOm1ha2VaZXJvc1R5cGVkQXJyYXkodC5zaXplLHQuZHR5cGUpfSx0LmR0eXBlKTtvLnB1c2gocil9fSksbnVsbD09ci5ncmFkaWVudCl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY29tcHV0ZSBncmFkaWVudDogZ3JhZGllbnQgZnVuY3Rpb24gbm90IGZvdW5kIGZvciBcIityLm5hbWUrXCIuXCIpO3ZhciBhPXIuZ3JhZGllbnQoMT09PXIub3V0cHV0cy5sZW5ndGg/b1swXTpvKTtmb3IodmFyIGkgaW4gci5pbnB1dHMpe2lmKCEoaSBpbiBhKSl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgYmFja3Byb3AgdGhyb3VnaCBpbnB1dCBcIitpK1wiLiBBdmFpbGFibGUgZ3JhZGllbnRzIGZvdW5kOiBcIitPYmplY3Qua2V5cyhhKStcIi5cIik7dmFyIHM9YVtpXSgpLHU9ci5pbnB1dHNbaV07aWYoIWFycmF5c0VxdWFsKHMuc2hhcGUsdS5zaGFwZSkpdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgaW4gZ3JhZGllbnQgZm9yIG9wIFwiK3IubmFtZStcIi4gVGhlIGdyYWRpZW50IG9mIGlucHV0ICdcIitpK1wiJyBoYXMgc2hhcGUgJ1wiK3Muc2hhcGUrXCInLCB3aGljaCBkb2VzIG5vdCBtYXRjaCB0aGUgc2hhcGUgb2YgdGhlIGlucHV0ICdcIit1LnNoYXBlK1wiJ1wiKTtpZihudWxsPT1lW3UuaWRdKWVbdS5pZF09cztlbHNle3ZhciBsPWVbdS5pZF07ZVt1LmlkXT1sLmFkZChzKSxsLmRpc3Bvc2UoKX19fSxyPXQubGVuZ3RoLTE7cj49MDtyLS0pbihyKX1mdW5jdGlvbiBhc3NlcnRUeXBlc01hdGNoKGUsdCl7YXNzZXJ0KGUuZHR5cGU9PT10LmR0eXBlLFwiVGhlIGR0eXBlcyBvZiB0aGUgZmlyc3QoXCIrZS5kdHlwZStcIikgYW5kIHNlY29uZChcIit0LmR0eXBlK1wiKSBpbnB1dCBtdXN0IG1hdGNoXCIpfWZ1bmN0aW9uIGlzVGVuc29ySW5MaXN0KGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspaWYodFtuXS5pZD09PWUuaWQpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gZ2V0VGVuc29yc0luQ29udGFpbmVyKGUpe3ZhciB0PVtdO3JldHVybiB3YWxrVGVuc29yQ29udGFpbmVyKGUsdCxuZXcgU2V0KSx0fWZ1bmN0aW9uIHdhbGtUZW5zb3JDb250YWluZXIoZSx0LG4pe2lmKG51bGwhPWUpaWYoZSBpbnN0YW5jZW9mIFRlbnNvcil0LnB1c2goZSk7ZWxzZSBpZihpc0l0ZXJhYmxlKGUpKXt2YXIgcj1lO2Zvcih2YXIgbyBpbiByKXt2YXIgYT1yW29dO24uaGFzKGEpfHwobi5hZGQoYSksd2Fsa1RlbnNvckNvbnRhaW5lcihhLHQsbikpfX19ZnVuY3Rpb24gaXNJdGVyYWJsZShlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKXx8XCJvYmplY3RcIj09dHlwZW9mIGV9dmFyIFR5cGUsRW5naW5lPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQsbil7dGhpcy5iYWNrZW5kPWUsdGhpcy5zYWZlTW9kZT10LHRoaXMuZGVidWdNb2RlPW4sdGhpcy5yZWdpc3RlcmVkVmFyaWFibGVzPXt9LHRoaXMubmV4dFRhcGVOb2RlSWQ9MCx0aGlzLm51bUJ5dGVzPTAsdGhpcy5udW1UZW5zb3JzPTAsdGhpcy5udW1EYXRhQnVmZmVycz0wLHRoaXMucHJvZmlsaW5nPSExLHRoaXMuZ3JhZGllbnRTY29wZUNvdW50PTAsdGhpcy5jdXN0b21HcmFkaWVudERlcHRoPTAsdGhpcy5rZWVwVGVuc29ycz1uZXcgU2V0LHRoaXMudGVuc29ySW5mbz1uZXcgV2Vha01hcCx0aGlzLmFjdGl2ZVNjb3BlPXt0cmFjazpbXSxuYW1lOlwiZGVmYXVsdCBzY29wZVwifSx0aGlzLnNjb3BlU3RhY2s9W3RoaXMuYWN0aXZlU2NvcGVdLHRoaXMucHJvZmlsZXI9bmV3IFByb2ZpbGVyKGUpLHRoaXMuYWN0aXZlUHJvZmlsZT17bmV3Qnl0ZXM6MCxuZXdUZW5zb3JzOjAscGVha0J5dGVzOjAsa2VybmVsczpbXSxyZXN1bHQ6bnVsbH19cmV0dXJuIGUucHJvdG90eXBlLm1vdmVEYXRhPWZ1bmN0aW9uKGUpe3RoaXMud3JpdGUoZSx0aGlzLnJlYWRTeW5jKGUpKX0sZS5wcm90b3R5cGUudGlkeT1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpczt2b2lkIDA9PT1uJiYobj0hMSk7dmFyIG8sYT1udWxsO2lmKG51bGw9PXQpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKFwiUGxlYXNlIHByb3ZpZGUgYSBmdW5jdGlvbiB0byB0aWR5KClcIik7dD1lfWVsc2V7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIGUmJiEoZSBpbnN0YW5jZW9mIFN0cmluZykpdGhyb3cgbmV3IEVycm9yKFwiV2hlbiBjYWxsaW5nIHdpdGggdHdvIGFyZ3VtZW50cywgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRpZHkoKSBtdXN0IGJlIGEgc3RyaW5nXCIpO2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKFwiV2hlbiBjYWxsaW5nIHdpdGggdHdvIGFyZ3VtZW50cywgdGhlIDJuZCBhcmd1bWVudCB0byB0aWR5KCkgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO2E9ZX1yZXR1cm4gdGhpcy5zY29wZWRSdW4oZnVuY3Rpb24oKXtyZXR1cm4gci5zdGFydFNjb3BlKGEsbil9LGZ1bmN0aW9uKCl7cmV0dXJuIHIuZW5kU2NvcGUobyxuKX0sZnVuY3Rpb24oKXtyZXR1cm4obz10KCkpaW5zdGFuY2VvZiBQcm9taXNlJiZjb25zb2xlLmVycm9yKFwiQ2Fubm90IHJldHVybiBhIFByb21pc2UgaW5zaWRlIG9mIHRpZHkuXCIpLG99KX0sZS5wcm90b3R5cGUuc2NvcGVkUnVuPWZ1bmN0aW9uKGUsdCxuKXtlKCk7dHJ5e3ZhciByPW4oKTtyZXR1cm4gdCgpLHJ9Y2F0Y2goZSl7dGhyb3cgdCgpLGV9fSxlLnByb3RvdHlwZS5ydW5LZXJuZWw9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLG89dGhpcyxhPVtdLGk9ZnVuY3Rpb24oZSl7cmV0dXJuIGEucHVzaChlKSxlfSxzPXRoaXMuYWN0aXZlU2NvcGUubmFtZSx1PXRoaXMubnVtQnl0ZXMsbD10aGlzLm51bVRlbnNvcnM7aWYodGhpcy5zY29wZWRSdW4oZnVuY3Rpb24oKXtyZXR1cm4gby5jdXN0b21HcmFkaWVudERlcHRoKyt9LGZ1bmN0aW9uKCl7cmV0dXJuIG8uY3VzdG9tR3JhZGllbnREZXB0aC0tfSxmdW5jdGlvbigpe3I9by5kZWJ1Z01vZGUoKT9vLnByb2ZpbGVyLnByb2ZpbGVLZXJuZWwocyxmdW5jdGlvbigpe3JldHVybiBlKG8uYmFja2VuZCxpKX0pOmUoby5iYWNrZW5kLGkpfSksdGhpcy5zaG91bGRSZWNvcmQoKSl7dmFyIGM9e2lkOnRoaXMubmV4dFRhcGVOb2RlSWQrKyxuYW1lOnMsaW5wdXRzOnQsb3V0cHV0czpBcnJheS5pc0FycmF5KHIpP3I6W3JdfTtudWxsIT1uJiYoYy5ncmFkaWVudD1mdW5jdGlvbihlKXtyZXR1cm4gbihlLGEpfSksdGhpcy5hY3RpdmVUYXBlLnB1c2goYyl9cmV0dXJuIHRoaXMucHJvZmlsaW5nJiZ0aGlzLmFjdGl2ZVByb2ZpbGUua2VybmVscy5wdXNoKHtuYW1lOnMsYnl0ZXNBZGRlZDp0aGlzLm51bUJ5dGVzLXUsdG90YWxCeXRlc1NuYXBzaG90OnRoaXMubnVtQnl0ZXMsdGVuc29yc0FkZGVkOnRoaXMubnVtVGVuc29ycy1sLHRvdGFsVGVuc29yc1NuYXBzaG90OnRoaXMubnVtVGVuc29ycyxpbnB1dFNoYXBlczpPYmplY3Qua2V5cyh0KS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV0uc2hhcGV9KSxvdXRwdXRTaGFwZTpBcnJheS5pc0FycmF5KHIpP3IubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNoYXBlfSk6ci5zaGFwZX0pLHJ9LGUucHJvdG90eXBlLnJlZ2lzdGVyVGVuc29yPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMudGVuc29ySW5mby5oYXMoZS5kYXRhSWQpP3RoaXMudGVuc29ySW5mby5nZXQoZS5kYXRhSWQpLnJlZkNvdW50OjA7dGhpcy5udW1UZW5zb3JzKyssMD09PXQmJih0aGlzLm51bURhdGFCdWZmZXJzKyssXCJjb21wbGV4NjRcIiE9PWUuZHR5cGUmJih0aGlzLm51bUJ5dGVzKz1zaXplRnJvbVNoYXBlKGUuc2hhcGUpKmJ5dGVzUGVyRWxlbWVudChlLmR0eXBlKSksdGhpcy50ZW5zb3JJbmZvLnNldChlLmRhdGFJZCx7YmFja2VuZDp0aGlzLmJhY2tlbmQsZHR5cGU6ZS5kdHlwZSxzaGFwZTplLnNoYXBlLHJlZkNvdW50OjB9KSx0aGlzLmJhY2tlbmQucmVnaXN0ZXIoZS5kYXRhSWQsZS5zaGFwZSxlLmR0eXBlKSksdGhpcy50ZW5zb3JJbmZvLmdldChlLmRhdGFJZCkucmVmQ291bnQrKyxlIGluc3RhbmNlb2YgVmFyaWFibGV8fHRoaXMudHJhY2soZSl9LGUucHJvdG90eXBlLnJlZ2lzdGVyVmFyaWFibGU9ZnVuY3Rpb24oZSl7aWYobnVsbCE9dGhpcy5yZWdpc3RlcmVkVmFyaWFibGVzW2UubmFtZV0pdGhyb3cgbmV3IEVycm9yKFwiVmFyaWFibGUgd2l0aCBuYW1lIFwiK2UubmFtZStcIiB3YXMgYWxyZWFkeSByZWdpc3RlcmVkXCIpO3RoaXMucmVnaXN0ZXJlZFZhcmlhYmxlc1tlLm5hbWVdPWV9LGUucHJvdG90eXBlLmRpc3Bvc2VUZW5zb3I9ZnVuY3Rpb24oZSl7dGhpcy50ZW5zb3JJbmZvLmhhcyhlLmRhdGFJZCkmJih0aGlzLmtlZXBUZW5zb3JzLmhhcyhlLmlkKSYmdGhpcy5rZWVwVGVuc29ycy5kZWxldGUoZS5pZCksdGhpcy5udW1UZW5zb3JzLS0sdGhpcy50ZW5zb3JJbmZvLmdldChlLmRhdGFJZCkucmVmQ291bnQ8PTE/KHRoaXMudGVuc29ySW5mby5nZXQoZS5kYXRhSWQpLmJhY2tlbmQuZGlzcG9zZURhdGEoZS5kYXRhSWQpLHRoaXMubnVtRGF0YUJ1ZmZlcnMtLSxcImNvbXBsZXg2NFwiIT09ZS5kdHlwZSYmKHRoaXMubnVtQnl0ZXMtPXNpemVGcm9tU2hhcGUoZS5zaGFwZSkqYnl0ZXNQZXJFbGVtZW50KGUuZHR5cGUpKSx0aGlzLnRlbnNvckluZm8uZGVsZXRlKGUuZGF0YUlkKSk6dGhpcy50ZW5zb3JJbmZvLmdldChlLmRhdGFJZCkucmVmQ291bnQtLSl9LGUucHJvdG90eXBlLmRpc3Bvc2VWYXJpYWJsZXM9ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5yZWdpc3RlcmVkVmFyaWFibGVzKXt2YXIgdD10aGlzLnJlZ2lzdGVyZWRWYXJpYWJsZXNbZV07dGhpcy5kaXNwb3NlVGVuc29yKHQpLGRlbGV0ZSB0aGlzLnJlZ2lzdGVyZWRWYXJpYWJsZXNbZV19fSxlLnByb3RvdHlwZS5tZW1vcnk9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmJhY2tlbmQubWVtb3J5KCk7cmV0dXJuIGUubnVtVGVuc29ycz10aGlzLm51bVRlbnNvcnMsZS5udW1EYXRhQnVmZmVycz10aGlzLm51bURhdGFCdWZmZXJzLGUubnVtQnl0ZXM9dGhpcy5udW1CeXRlcyxlfSxlLnByb3RvdHlwZS5wcm9maWxlPWZ1bmN0aW9uKGUpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIHQsbjtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihyKXtyZXR1cm4gdGhpcy5wcm9maWxpbmc9ITAsdD10aGlzLm51bUJ5dGVzLG49dGhpcy5udW1UZW5zb3JzLHRoaXMuYWN0aXZlUHJvZmlsZS5rZXJuZWxzPVtdLHRoaXMuYWN0aXZlUHJvZmlsZS5yZXN1bHQ9ZSgpLHRoaXMucHJvZmlsaW5nPSExLHRoaXMuYWN0aXZlUHJvZmlsZS5wZWFrQnl0ZXM9TWF0aC5tYXguYXBwbHkoTWF0aCx0aGlzLmFjdGl2ZVByb2ZpbGUua2VybmVscy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG90YWxCeXRlc1NuYXBzaG90fSkpLHRoaXMuYWN0aXZlUHJvZmlsZS5uZXdCeXRlcz10aGlzLm51bUJ5dGVzLXQsdGhpcy5hY3RpdmVQcm9maWxlLm5ld1RlbnNvcnM9dGhpcy5udW1UZW5zb3JzLW4sWzIsdGhpcy5hY3RpdmVQcm9maWxlXX0pfSl9LGUucHJvdG90eXBlLnNob3VsZFJlY29yZD1mdW5jdGlvbigpe3JldHVybiBudWxsIT10aGlzLmFjdGl2ZVRhcGUmJjA9PT10aGlzLmN1c3RvbUdyYWRpZW50RGVwdGh9LGUucHJvdG90eXBlLmFkZFRhcGVOb2RlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj17fTtlLmZvckVhY2goZnVuY3Rpb24oZSx0KXtyW3RdPWV9KTt2YXIgbz17aWQ6dGhpcy5uZXh0VGFwZU5vZGVJZCsrLG5hbWU6dGhpcy5hY3RpdmVTY29wZS5uYW1lLGlucHV0czpyLG91dHB1dHM6W3RdLGdyYWRpZW50OmZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiBuKGUpLmZvckVhY2goZnVuY3Rpb24oZSxuKXt0W25dPWZ1bmN0aW9uKCl7cmV0dXJuIGV9fSksdH19O3RoaXMuYWN0aXZlVGFwZS5wdXNoKG8pfSxlLnByb3RvdHlwZS5rZWVwPWZ1bmN0aW9uKGUpe2lmKDE9PT10aGlzLnNjb3BlU3RhY2subGVuZ3RoJiZ0aGlzLnNhZmVNb2RlKXRocm93IG5ldyBFcnJvcihcIlNhZmUgbW9kZSBpcyBPTi4gRW5jbG9zZSBhbGwgdGVuc29yIG9wZXJhdGlvbnMgaW5zaWRlIHRmLnRpZHkoKTogdGYudGlkeSgoKSA9PiB7Li4ufSkgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLlwiKTtyZXR1cm4gdGhpcy5rZWVwVGVuc29ycy5hZGQoZS5pZCksZX0sZS5wcm90b3R5cGUuc3RhcnRTY29wZT1mdW5jdGlvbihlLHQpe3ZvaWQgMD09PXQmJih0PSExKSx0JiYwPT09dGhpcy5ncmFkaWVudFNjb3BlQ291bnQmJih0aGlzLmFjdGl2ZVRhcGU9W10pLHQmJnRoaXMuZ3JhZGllbnRTY29wZUNvdW50Kys7dmFyIG49e3RyYWNrOltdLG5hbWU6XCJ1bm5hbWVkIHNjb3BlXCJ9O2UmJihuLm5hbWU9ZSksdGhpcy5zY29wZVN0YWNrLnB1c2gobiksdGhpcy5hY3RpdmVTY29wZT1ufSxlLnByb3RvdHlwZS5lbmRTY29wZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7dm9pZCAwPT09dCYmKHQ9ITEpLHQmJih0aGlzLmdyYWRpZW50U2NvcGVDb3VudC0tLDA9PT10aGlzLmdyYWRpZW50U2NvcGVDb3VudCYmKHRoaXMuYWN0aXZlVGFwZT1udWxsKSk7dmFyIHI9bmV3IFNldCh0aGlzLmtlZXBUZW5zb3JzKSxvPWdldFRlbnNvcnNJbkNvbnRhaW5lcihlKTtvLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIHIuYWRkKGUuaWQpfSk7Zm9yKHZhciBhPTA7YTx0aGlzLmFjdGl2ZVNjb3BlLnRyYWNrLmxlbmd0aDthKyspe3ZhciBpPXRoaXMuYWN0aXZlU2NvcGUudHJhY2tbYV07ci5oYXMoaS5pZCl8fChudWxsIT10aGlzLmFjdGl2ZVRhcGU/by5wdXNoKGkpOmkuZGlzcG9zZSgpKX12YXIgcz10aGlzLnNjb3BlU3RhY2sucG9wKCk7dGhpcy5hY3RpdmVTY29wZT0wPT09dGhpcy5zY29wZVN0YWNrLmxlbmd0aD97dHJhY2s6W10sbmFtZTpcImRlZmF1bHQgc2NvcGVcIn06dGhpcy5zY29wZVN0YWNrW3RoaXMuc2NvcGVTdGFjay5sZW5ndGgtMV0sby5mb3JFYWNoKGZ1bmN0aW9uKGUpeyFuLmtlZXBUZW5zb3JzLmhhcyhlLmlkKSYmaXNUZW5zb3JJbkxpc3QoZSxzLnRyYWNrKSYmbi50cmFjayhlKX0pfSxlLnByb3RvdHlwZS5ncmFkaWVudHM9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89dGhpcztyZXR1cm4gdm9pZCAwPT09ciYmKHI9ITEpLGFzc2VydCh0Lmxlbmd0aD4wLFwiZ3JhZGllbnRzKCkgcmVjZWl2ZWQgYW4gZW1wdHkgbGlzdCBvZiB4cy5cIiksdGhpcy50aWR5KFwiZ3JhZGllbnRzXCIsZnVuY3Rpb24oKXt2YXIgYT1lKCk7YXNzZXJ0KGEgaW5zdGFuY2VvZiBUZW5zb3IsXCJUaGUgcmVzdWx0IHkgcmV0dXJuZWQgYnkgZigpIG11c3QgYmUgYSB0ZW5zb3IuXCIpO3ZhciBpPWdldEZpbHRlcmVkTm9kZXNYVG9ZKG8uYWN0aXZlVGFwZSx0LGEpO2lmKCFyJiYwPT09aS5sZW5ndGgmJnQubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNvbXB1dGUgZ3JhZGllbnQgb2YgeT1mKHgpIHdpdGggcmVzcGVjdCB0byB4LiBNYWtlIHN1cmUgdGhhdCB0aGUgZiB5b3UgcGFzc2VkIGVuY2xvc2VzIGFsbCBvcGVyYXRpb25zIHRoYXQgbGVhZCBmcm9tIHggdG8geS5cIik7dmFyIHM9e307cmV0dXJuIHNbYS5pZF09bnVsbD09bj9vbmVzKGEuc2hhcGUpOm4sYmFja3Byb3BhZ2F0ZUdyYWRpZW50cyhzLGkpLHt2YWx1ZTphLGdyYWRzOnQubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBzW2UuaWRdfSl9fSwhMCl9LGUucHJvdG90eXBlLmN1c3RvbUdyYWQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gYXNzZXJ0KGlzRnVuY3Rpb24oZSksXCJUaGUgZiBwYXNzZWQgaW4gY3VzdG9tR3JhZChmKSBtdXN0IGJlIGEgZnVuY3Rpb24uXCIpLGZ1bmN0aW9uKCl7Zm9yKHZhciBuLHIsbz1bXSxhPTA7YTxhcmd1bWVudHMubGVuZ3RoO2ErKylvW2FdPWFyZ3VtZW50c1thXTtpZihhc3NlcnQoby5ldmVyeShmdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFRlbnNvcn0pLFwiVGhlIGFyZ3MgcGFzc2VkIGluIGN1c3RvbUdyYWQoZikoeDEsIHgyLC4uLikgbXVzdCBhbGwgYmUgdGVuc29yc1wiKSx0LnNjb3BlZFJ1bihmdW5jdGlvbigpe3JldHVybiB0LmN1c3RvbUdyYWRpZW50RGVwdGgrK30sZnVuY3Rpb24oKXtyZXR1cm4gdC5jdXN0b21HcmFkaWVudERlcHRoLS19LGZ1bmN0aW9uKCl7cj10LnRpZHkoZS5uYW1lLGZ1bmN0aW9uKCl7dmFyIHQ9ZS5hcHBseSh2b2lkIDAsbykscj10LnZhbHVlLGE9dC5ncmFkRnVuYztyZXR1cm4gYXNzZXJ0KHIgaW5zdGFuY2VvZiBUZW5zb3IsXCJUaGUgZnVuY3Rpb24gZiBwYXNzZWQgaW4gY3VzdG9tR3JhZChmKSBtdXN0IHJldHVybiBhbiBvYmplY3Qgd2hlcmUgYG9iai52YWx1ZWAgaXMgYSB0ZW5zb3JcIiksYXNzZXJ0KGlzRnVuY3Rpb24oYSksXCJUaGUgZnVuY3Rpb24gZiBwYXNzZWQgaW4gY3VzdG9tR3JhZChmKSBtdXN0IHJldHVybiBhbiBvYmplY3Qgd2hlcmUgYG9iai5ncmFkRnVuY2AgaXMgYSBmdW5jdGlvbi5cIiksbj1hLHJ9LCEwKX0pLHQuc2hvdWxkUmVjb3JkKCkpe3QuYWRkVGFwZU5vZGUobyxyLGZ1bmN0aW9uKGUpe3ZhciB0PW4oZSkscj1BcnJheS5pc0FycmF5KHQpP3Q6W3RdO3JldHVybiBhc3NlcnQoci5sZW5ndGg9PT1vLmxlbmd0aCxcIlRoZSBmdW5jdGlvbiBmIHBhc3NlZCBpbiBjdXN0b21HcmFkKGYpIG11c3QgcmV0dXJuIGFuIG9iamVjdCB3aGVyZSBgb2JqLmdyYWRGdW5jYCBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgc2FtZSBudW1iZXIgb2YgdGVuc29ycyBhcyBpbnB1dHMgcGFzc2VkIHRvIGYoLi4uKS5cIiksYXNzZXJ0KHIuZXZlcnkoZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBUZW5zb3J9KSxcIlRoZSBmdW5jdGlvbiBmIHBhc3NlZCBpbiBjdXN0b21HcmFkKGYpIG11c3QgcmV0dXJuIGFuIG9iamVjdCB3aGVyZSBgb2JqLmdyYWRGdW5jYCBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGxpc3Qgb2Ygb25seSB0ZW5zb3JzLlwiKSxyfSl9cmV0dXJuIHJ9fSxlLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMudGVuc29ySW5mby5nZXQoZSk7dGhpcy5iYWNrZW5kIT09bi5iYWNrZW5kJiYobi5iYWNrZW5kLmRpc3Bvc2VEYXRhKGUpLG4uYmFja2VuZD10aGlzLmJhY2tlbmQsdGhpcy5iYWNrZW5kLnJlZ2lzdGVyKGUsbi5zaGFwZSxuLmR0eXBlKSksdGhpcy5iYWNrZW5kLndyaXRlKGUsdCl9LGUucHJvdG90eXBlLnJlYWRTeW5jPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRlbnNvckluZm8uZ2V0KGUpLmJhY2tlbmQucmVhZFN5bmMoZSl9LGUucHJvdG90eXBlLnJlYWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudGVuc29ySW5mby5nZXQoZSkuYmFja2VuZC5yZWFkKGUpfSxlLnByb3RvdHlwZS5mcm9tUGl4ZWxzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYmFja2VuZC5mcm9tUGl4ZWxzKGUsdCl9LGUucHJvdG90eXBlLnRpbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgdCxuO3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKHIpe3N3aXRjaChyLmxhYmVsKXtjYXNlIDA6cmV0dXJuIHQ9bm93KCksWzQsdGhpcy5iYWNrZW5kLnRpbWUoZSldO2Nhc2UgMTpyZXR1cm4obj1yLnNlbnQoKSkud2FsbE1zPW5vdygpLXQsWzIsbl19fSl9KX0sZS5wcm90b3R5cGUudHJhY2s9ZnVuY3Rpb24oZSl7aWYoMT09PXRoaXMuc2NvcGVTdGFjay5sZW5ndGgmJnRoaXMuc2FmZU1vZGUpdGhyb3cgbmV3IEVycm9yKFwiU2FmZSBtb2RlIGlzIE9OLiBFbmNsb3NlIGFsbCB0ZW5zb3Igb3BlcmF0aW9ucyBpbnNpZGUgdGYudGlkeSgpOiB0Zi50aWR5KCgpID0+IHtvcCgpOy4uLn0pOyB0byBhdm9pZCBtZW1vcnkgbGVha3MuXCIpO3JldHVybiB0aGlzLmFjdGl2ZVNjb3BlLnRyYWNrLnB1c2goZSksZX0sZX0oKTtmdW5jdGlvbiBvbmVzKGUpe3ZhciB0PW1ha2VPbmVzVHlwZWRBcnJheShzaXplRnJvbVNoYXBlKGUpLFwiZmxvYXQzMlwiKTtyZXR1cm4gVGVuc29yLm1ha2UoZSx7dmFsdWVzOnR9KX0hZnVuY3Rpb24oZSl7ZVtlLk5VTUJFUj0wXT1cIk5VTUJFUlwiLGVbZS5CT09MRUFOPTFdPVwiQk9PTEVBTlwiLGVbZS5TVFJJTkc9Ml09XCJTVFJJTkdcIn0oVHlwZXx8KFR5cGU9e30pKTt2YXIgTUFYX1RFWFRVUkVfU0laRSxVUkxfUFJPUEVSVElFUz1be25hbWU6XCJERUJVR1wiLHR5cGU6VHlwZS5CT09MRUFOfSx7bmFtZTpcIklTX0JST1dTRVJcIix0eXBlOlR5cGUuQk9PTEVBTn0se25hbWU6XCJXRUJHTF9DT05WX0lNMkNPTFwiLHR5cGU6VHlwZS5CT09MRUFOfSx7bmFtZTpcIldFQkdMX01BWF9URVhUVVJFX1NJWkVcIix0eXBlOlR5cGUuTlVNQkVSfSx7bmFtZTpcIldFQkdMX1BBR0lOR19FTkFCTEVEXCIsdHlwZTpUeXBlLkJPT0xFQU59LHtuYW1lOlwiV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT05cIix0eXBlOlR5cGUuTlVNQkVSfSx7bmFtZTpcIldFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9SRUxJQUJMRVwiLHR5cGU6VHlwZS5CT09MRUFOfSx7bmFtZTpcIldFQkdMX1ZFUlNJT05cIix0eXBlOlR5cGUuTlVNQkVSfSx7bmFtZTpcIldFQkdMX1JFTkRFUl9GTE9BVDMyX0VOQUJMRURcIix0eXBlOlR5cGUuQk9PTEVBTn0se25hbWU6XCJXRUJHTF9ET1dOTE9BRF9GTE9BVF9FTkFCTEVEXCIsdHlwZTpUeXBlLkJPT0xFQU59LHtuYW1lOlwiV0VCR0xfRkVOQ0VfQVBJX0VOQUJMRURcIix0eXBlOlR5cGUuQk9PTEVBTn0se25hbWU6XCJXRUJHTF9TSVpFX1VQTE9BRF9VTklGT1JNXCIsdHlwZTpUeXBlLk5VTUJFUn0se25hbWU6XCJCQUNLRU5EXCIsdHlwZTpUeXBlLlNUUklOR30se25hbWU6XCJFUFNJTE9OXCIsdHlwZTpUeXBlLk5VTUJFUn0se25hbWU6XCJQUk9EXCIsdHlwZTpUeXBlLkJPT0xFQU59LHtuYW1lOlwiVEVOU09STElLRV9DSEVDS19TSEFQRV9DT05TSVNURU5DWVwiLHR5cGU6VHlwZS5CT09MRUFOfV07ZnVuY3Rpb24gaXNXZWJHTFZlcnNpb25FbmFibGVkKGUsdCl7dmFyIG47dHJ5e249Z2V0V2ViR0xSZW5kZXJpbmdDb250ZXh0KGUsdCl9Y2F0Y2goZSl7cmV0dXJuITF9cmV0dXJuIG51bGwhPW4mJihsb3NlQ29udGV4dChuKSwhMCl9ZnVuY3Rpb24gZ2V0V2ViR0xNYXhUZXh0dXJlU2l6ZShlLHQpe2lmKG51bGw9PU1BWF9URVhUVVJFX1NJWkUpe3ZhciBuPWdldFdlYkdMUmVuZGVyaW5nQ29udGV4dChlLHQpO01BWF9URVhUVVJFX1NJWkU9bi5nZXRQYXJhbWV0ZXIobi5NQVhfVEVYVFVSRV9TSVpFKX1yZXR1cm4gTUFYX1RFWFRVUkVfU0laRX1mdW5jdGlvbiBnZXRXZWJHTERpc2pvaW50UXVlcnlUaW1lclZlcnNpb24oZSx0KXtpZigwPT09ZSlyZXR1cm4gMDt2YXIgbixyPWdldFdlYkdMUmVuZGVyaW5nQ29udGV4dChlLHQpO3JldHVybiBuPWhhc0V4dGVuc2lvbihyLFwiRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5X3dlYmdsMlwiKSYmMj09PWU/MjpoYXNFeHRlbnNpb24ocixcIkVYVF9kaXNqb2ludF90aW1lcl9xdWVyeVwiKT8xOjAsbnVsbCE9ciYmbG9zZUNvbnRleHQociksbn1mdW5jdGlvbiBpc1JlbmRlclRvRmxvYXRUZXh0dXJlRW5hYmxlZChlLHQpe2lmKDA9PT1lKXJldHVybiExO3ZhciBuPWdldFdlYkdMUmVuZGVyaW5nQ29udGV4dChlLHQpO2lmKDE9PT1lKXtpZighaGFzRXh0ZW5zaW9uKG4sXCJPRVNfdGV4dHVyZV9mbG9hdFwiKSlyZXR1cm4hMX1lbHNlIGlmKCFoYXNFeHRlbnNpb24obixcIkVYVF9jb2xvcl9idWZmZXJfZmxvYXRcIikpcmV0dXJuITE7dmFyIHI9Y3JlYXRlRmxvYXRUZXh0dXJlQW5kQmluZFRvRnJhbWVidWZmZXIobixlKTtyZXR1cm4gbG9zZUNvbnRleHQobikscn1mdW5jdGlvbiBpc0Rvd25sb2FkRmxvYXRUZXh0dXJlRW5hYmxlZChlLHQpe2lmKDA9PT1lKXJldHVybiExO3ZhciBuPWdldFdlYkdMUmVuZGVyaW5nQ29udGV4dChlLHQpO2lmKDE9PT1lKXtpZighaGFzRXh0ZW5zaW9uKG4sXCJPRVNfdGV4dHVyZV9mbG9hdFwiKSlyZXR1cm4hMTtpZighaGFzRXh0ZW5zaW9uKG4sXCJXRUJHTF9jb2xvcl9idWZmZXJfZmxvYXRcIikpcmV0dXJuITF9ZWxzZSBpZighaGFzRXh0ZW5zaW9uKG4sXCJFWFRfY29sb3JfYnVmZmVyX2Zsb2F0XCIpKXJldHVybiExO3ZhciByPWNyZWF0ZUZsb2F0VGV4dHVyZUFuZEJpbmRUb0ZyYW1lYnVmZmVyKG4sZSk7cmV0dXJuIGxvc2VDb250ZXh0KG4pLHJ9ZnVuY3Rpb24gaXNXZWJHTEZlbmNlRW5hYmxlZChlLHQpe2lmKDIhPT1lKXJldHVybiExO3ZhciBuPWdldFdlYkdMUmVuZGVyaW5nQ29udGV4dChlLHQpLHI9bnVsbCE9bi5mZW5jZVN5bmM7cmV0dXJuIGxvc2VDb250ZXh0KG4pLHJ9ZnVuY3Rpb24gaXNDaHJvbWUoKXtyZXR1cm5cInVuZGVmaW5lZFwiIT10eXBlb2YgbmF2aWdhdG9yJiZudWxsIT1uYXZpZ2F0b3ImJm51bGwhPW5hdmlnYXRvci51c2VyQWdlbnQmJi9DaHJvbWUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJi9Hb29nbGUgSW5jLy50ZXN0KG5hdmlnYXRvci52ZW5kb3IpfXZhciBURU5TT1JGTE9XSlNfRkxBR1NfUFJFRklYPVwidGZqc2ZsYWdzXCI7ZnVuY3Rpb24gZ2V0RmVhdHVyZXNGcm9tVVJMKCl7dmFyIGU9e307aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIHdpbmRvd3x8dm9pZCAwPT09d2luZG93LmxvY2F0aW9uKXJldHVybiBlO3ZhciB0PWdldFF1ZXJ5UGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO2lmKFRFTlNPUkZMT1dKU19GTEFHU19QUkVGSVggaW4gdCl7dmFyIG49e307dFtURU5TT1JGTE9XSlNfRkxBR1NfUFJFRklYXS5zcGxpdChcIixcIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnNwbGl0KFwiOlwiKSxyPXRbMF0sbz10WzFdO25bcl09b30pLFVSTF9QUk9QRVJUSUVTLmZvckVhY2goZnVuY3Rpb24odCl7dC5uYW1lIGluIG4mJihjb25zb2xlLmxvZyhcIlNldHRpbmcgZmVhdHVyZSBvdmVycmlkZSBmcm9tIFVSTCBcIit0Lm5hbWUrXCI6IFwiK25bdC5uYW1lXSksdC50eXBlPT09VHlwZS5OVU1CRVI/ZVt0Lm5hbWVdPStuW3QubmFtZV06dC50eXBlPT09VHlwZS5CT09MRUFOP2VbdC5uYW1lXT1cInRydWVcIj09PW5bdC5uYW1lXTp0LnR5cGU9PT1UeXBlLlNUUklORz9lW3QubmFtZV09blt0Lm5hbWVdOmNvbnNvbGUud2FybihcIlVua25vd24gVVJMIHBhcmFtOiBcIit0Lm5hbWUrXCIuXCIpKX0pfXJldHVybiBlfWZ1bmN0aW9uIGhhc0V4dGVuc2lvbihlLHQpe3JldHVybiBudWxsIT1lLmdldEV4dGVuc2lvbih0KX1mdW5jdGlvbiBnZXRXZWJHTFJlbmRlcmluZ0NvbnRleHQoZSx0KXtpZigwPT09ZXx8IXQpdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGdldCBXZWJHTCByZW5kZXJpbmcgY29udGV4dCwgV2ViR0wgaXMgZGlzYWJsZWQuXCIpO3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7cmV0dXJuIDE9PT1lP24uZ2V0Q29udGV4dChcIndlYmdsXCIpfHxuLmdldENvbnRleHQoXCJleHBlcmltZW50YWwtd2ViZ2xcIik6bi5nZXRDb250ZXh0KFwid2ViZ2wyXCIpfWZ1bmN0aW9uIGxvc2VDb250ZXh0KGUpe2lmKG51bGwhPWUpe3ZhciB0PWUuZ2V0RXh0ZW5zaW9uKFwiV0VCR0xfbG9zZV9jb250ZXh0XCIpO2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKFwiRXh0ZW5zaW9uIFdFQkdMX2xvc2VfY29udGV4dCBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgYnJvd3Nlci5cIik7dC5sb3NlQ29udGV4dCgpfX1mdW5jdGlvbiBjcmVhdGVGbG9hdFRleHR1cmVBbmRCaW5kVG9GcmFtZWJ1ZmZlcihlLHQpe3ZhciBuPWUuY3JlYXRlRnJhbWVidWZmZXIoKSxyPWUuY3JlYXRlVGV4dHVyZSgpO2UuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELHIpO3ZhciBvPTI9PT10P2UuUkdCQTMyRjplLlJHQkE7ZS50ZXhJbWFnZTJEKGUuVEVYVFVSRV8yRCwwLG8sMSwxLDAsZS5SR0JBLGUuRkxPQVQsbnVsbCksZS5iaW5kRnJhbWVidWZmZXIoZS5GUkFNRUJVRkZFUixuKSxlLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGUuRlJBTUVCVUZGRVIsZS5DT0xPUl9BVFRBQ0hNRU5UMCxlLlRFWFRVUkVfMkQsciwwKTt2YXIgYT1lLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoZS5GUkFNRUJVRkZFUik9PT1lLkZSQU1FQlVGRkVSX0NPTVBMRVRFO3JldHVybiBlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCxudWxsKSxlLmJpbmRGcmFtZWJ1ZmZlcihlLkZSQU1FQlVGRkVSLG51bGwpLGUuZGVsZXRlVGV4dHVyZShyKSxlLmRlbGV0ZUZyYW1lYnVmZmVyKG4pLGF9ZnVuY3Rpb24gZ2V0UXVlcnlQYXJhbXMoZSl7dmFyIHQ9e307cmV0dXJuIGUucmVwbGFjZSgvWz8mXShbXj0/Jl0rKSg/Oj0oW14mXSopKT8vZyxmdW5jdGlvbihlKXtmb3IodmFyIG49W10scj0xO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspbltyLTFdPWFyZ3VtZW50c1tyXTtyZXR1cm4gZGVjb2RlUGFyYW0odCxuWzBdLG5bMV0pLG4uam9pbihcIj1cIil9KSx0fWZ1bmN0aW9uIGRlY29kZVBhcmFtKGUsdCxuKXtlW2RlY29kZVVSSUNvbXBvbmVudCh0KV09ZGVjb2RlVVJJQ29tcG9uZW50KG58fFwiXCIpfXZhciBFUFNJTE9OX0ZMT0FUMTY9LjAwMSxURVNUX0VQU0lMT05fRkxPQVQxNj0uMSxFUFNJTE9OX0ZMT0FUMzI9MWUtNyxURVNUX0VQU0lMT05fRkxPQVQzMj0uMDAxLEVudmlyb25tZW50PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0aGlzLmZlYXR1cmVzPXt9LHRoaXMucmVnaXN0cnk9e30sbnVsbCE9ZSYmKHRoaXMuZmVhdHVyZXM9ZSksdGhpcy5nZXQoXCJERUJVR1wiKSYmY29uc29sZS53YXJuKFwiRGVidWdnaW5nIG1vZGUgaXMgT04uIFRoZSBvdXRwdXQgb2YgZXZlcnkgbWF0aCBjYWxsIHdpbGwgYmUgZG93bmxvYWRlZCB0byBDUFUgYW5kIGNoZWNrZWQgZm9yIE5hTnMuIFRoaXMgc2lnbmlmaWNhbnRseSBpbXBhY3RzIHBlcmZvcm1hbmNlLlwiKX1yZXR1cm4gZS5zZXRCYWNrZW5kPWZ1bmN0aW9uKGUsdCl7aWYodm9pZCAwPT09dCYmKHQ9ITEpLCEoZSBpbiBFTlYucmVnaXN0cnkpKXRocm93IG5ldyBFcnJvcihcIkJhY2tlbmQgbmFtZSAnXCIrZStcIicgbm90IGZvdW5kIGluIHJlZ2lzdHJ5XCIpO0VOVi5lbmdpbmUuYmFja2VuZD1FTlYuZmluZEJhY2tlbmQoZSksRU5WLmJhY2tlbmROYW1lPWV9LGUuZ2V0QmFja2VuZD1mdW5jdGlvbigpe3JldHVybiBFTlYuaW5pdEVuZ2luZSgpLEVOVi5iYWNrZW5kTmFtZX0sZS5kaXNwb3NlVmFyaWFibGVzPWZ1bmN0aW9uKCl7RU5WLmVuZ2luZS5kaXNwb3NlVmFyaWFibGVzKCl9LGUubWVtb3J5PWZ1bmN0aW9uKCl7cmV0dXJuIEVOVi5lbmdpbmUubWVtb3J5KCl9LGUucHJvZmlsZT1mdW5jdGlvbihlKXtyZXR1cm4gRU5WLmVuZ2luZS5wcm9maWxlKGUpfSxlLnRpZHk9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj0hMSksRU5WLmVuZ2luZS50aWR5KGUsdCxuKX0sZS5kaXNwb3NlPWZ1bmN0aW9uKGUpe2dldFRlbnNvcnNJbkNvbnRhaW5lcihlKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc3Bvc2UoKX0pfSxlLmtlZXA9ZnVuY3Rpb24oZSl7cmV0dXJuIEVOVi5lbmdpbmUua2VlcChlKX0sZS50aW1lPWZ1bmN0aW9uKGUpe3JldHVybiBFTlYuZW5naW5lLnRpbWUoZSl9LGUucHJvdG90eXBlLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbiB0aGlzLmZlYXR1cmVzP3RoaXMuZmVhdHVyZXNbZV06KHRoaXMuZmVhdHVyZXNbZV09dGhpcy5ldmFsdWF0ZUZlYXR1cmUoZSksdGhpcy5mZWF0dXJlc1tlXSl9LGUucHJvdG90eXBlLmdldEZlYXR1cmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmVhdHVyZXN9LGUucHJvdG90eXBlLnNldD1mdW5jdGlvbihlLHQpe3RoaXMuZmVhdHVyZXNbZV09dH0sZS5wcm90b3R5cGUuZ2V0QmVzdEJhY2tlbmROYW1lPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZigwPT09T2JqZWN0LmtleXModGhpcy5yZWdpc3RyeSkubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcIk5vIGJhY2tlbmQgZm91bmQgaW4gcmVnaXN0cnkuXCIpO3JldHVybiBPYmplY3Qua2V5cyh0aGlzLnJlZ2lzdHJ5KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue25hbWU6dCxlbnRyeTplLnJlZ2lzdHJ5W3RdfX0pLnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5lbnRyeS5wcmlvcml0eS1lLmVudHJ5LnByaW9yaXR5fSlbMF0ubmFtZX0sZS5wcm90b3R5cGUuZXZhbHVhdGVGZWF0dXJlPWZ1bmN0aW9uKGUpe2lmKFwiREVCVUdcIj09PWUpcmV0dXJuITE7aWYoXCJJU19CUk9XU0VSXCI9PT1lKXJldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c7aWYoXCJJU19OT0RFXCI9PT1lKXJldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiBwcm9jZXNzJiZ2b2lkIDAhPT1wcm9jZXNzLnZlcnNpb25zLm5vZGU7aWYoXCJJU19DSFJPTUVcIj09PWUpcmV0dXJuIGlzQ2hyb21lKCk7aWYoXCJXRUJHTF9DT05WX0lNMkNPTFwiPT09ZSlyZXR1cm4hMTtpZihcIldFQkdMX1BBR0lOR19FTkFCTEVEXCI9PT1lKXJldHVybiB0aGlzLmdldChcIklTX0JST1dTRVJcIikmJiF0aGlzLmdldChcIlBST0RcIik7aWYoXCJXRUJHTF9NQVhfVEVYVFVSRV9TSVpFXCI9PT1lKXJldHVybiBnZXRXZWJHTE1heFRleHR1cmVTaXplKHRoaXMuZ2V0KFwiV0VCR0xfVkVSU0lPTlwiKSx0aGlzLmdldChcIklTX0JST1dTRVJcIikpO2lmKFwiSVNfVEVTVFwiPT09ZSlyZXR1cm4hMTtpZihcIkJBQ0tFTkRcIj09PWUpcmV0dXJuIHRoaXMuZ2V0QmVzdEJhY2tlbmROYW1lKCk7aWYoXCJXRUJHTF9ESVNKT0lOVF9RVUVSWV9USU1FUl9FWFRFTlNJT05fVkVSU0lPTlwiPT09ZSl7dmFyIHQ9dGhpcy5nZXQoXCJXRUJHTF9WRVJTSU9OXCIpO3JldHVybiAwPT09dD8wOmdldFdlYkdMRGlzam9pbnRRdWVyeVRpbWVyVmVyc2lvbih0LHRoaXMuZ2V0KFwiSVNfQlJPV1NFUlwiKSl9aWYoXCJXRUJHTF9ESVNKT0lOVF9RVUVSWV9USU1FUl9FWFRFTlNJT05fUkVMSUFCTEVcIj09PWUpcmV0dXJuIHRoaXMuZ2V0KFwiV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT05cIik+MCYmIWlzTW9iaWxlKCk7aWYoXCJIQVNfV0VCR0xcIj09PWUpcmV0dXJuIHRoaXMuZ2V0KFwiV0VCR0xfVkVSU0lPTlwiKT4wO2lmKFwiV0VCR0xfVkVSU0lPTlwiPT09ZSlyZXR1cm4gaXNXZWJHTFZlcnNpb25FbmFibGVkKDIsdGhpcy5nZXQoXCJJU19CUk9XU0VSXCIpKT8yOmlzV2ViR0xWZXJzaW9uRW5hYmxlZCgxLHRoaXMuZ2V0KFwiSVNfQlJPV1NFUlwiKSk/MTowO2lmKFwiV0VCR0xfUkVOREVSX0ZMT0FUMzJfRU5BQkxFRFwiPT09ZSlyZXR1cm4gaXNSZW5kZXJUb0Zsb2F0VGV4dHVyZUVuYWJsZWQodGhpcy5nZXQoXCJXRUJHTF9WRVJTSU9OXCIpLHRoaXMuZ2V0KFwiSVNfQlJPV1NFUlwiKSk7aWYoXCJXRUJHTF9ET1dOTE9BRF9GTE9BVF9FTkFCTEVEXCI9PT1lKXJldHVybiBpc0Rvd25sb2FkRmxvYXRUZXh0dXJlRW5hYmxlZCh0aGlzLmdldChcIldFQkdMX1ZFUlNJT05cIiksdGhpcy5nZXQoXCJJU19CUk9XU0VSXCIpKTtpZihcIldFQkdMX0ZFTkNFX0FQSV9FTkFCTEVEXCI9PT1lKXJldHVybiBpc1dlYkdMRmVuY2VFbmFibGVkKHRoaXMuZ2V0KFwiV0VCR0xfVkVSU0lPTlwiKSx0aGlzLmdldChcIklTX0JST1dTRVJcIikpO2lmKFwiV0VCR0xfU0laRV9VUExPQURfVU5JRk9STVwiPT09ZSlyZXR1cm4gdGhpcy5nZXQoXCJXRUJHTF9SRU5ERVJfRkxPQVQzMl9FTkFCTEVEXCIpPzQ6MDtpZihcIlRFU1RfRVBTSUxPTlwiPT09ZSlyZXR1cm4gMzI9PT10aGlzLmJhY2tlbmQuZmxvYXRQcmVjaXNpb24oKT9URVNUX0VQU0lMT05fRkxPQVQzMjpURVNUX0VQU0lMT05fRkxPQVQxNjtpZihcIkVQU0lMT05cIj09PWUpcmV0dXJuIDMyPT09dGhpcy5iYWNrZW5kLmZsb2F0UHJlY2lzaW9uKCk/RVBTSUxPTl9GTE9BVDMyOkVQU0lMT05fRkxPQVQxNjtpZihcIlBST0RcIj09PWUpcmV0dXJuITE7aWYoXCJURU5TT1JMSUtFX0NIRUNLX1NIQVBFX0NPTlNJU1RFTkNZXCI9PT1lKXJldHVybiF0aGlzLmdldChcIlBST0RcIik7dGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBmZWF0dXJlIFwiK2UrXCIuXCIpfSxlLnByb3RvdHlwZS5zZXRGZWF0dXJlcz1mdW5jdGlvbihlKXt0aGlzLmZlYXR1cmVzPU9iamVjdC5hc3NpZ24oe30sZSl9LGUucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5mZWF0dXJlcz1nZXRGZWF0dXJlc0Zyb21VUkwoKSxudWxsIT10aGlzLmdsb2JhbEVuZ2luZSYmKHRoaXMuZ2xvYmFsRW5naW5lPW51bGwpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJiYWNrZW5kXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVuZ2luZS5iYWNrZW5kfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmZpbmRCYWNrZW5kPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluIHRoaXMucmVnaXN0cnk/dGhpcy5yZWdpc3RyeVtlXS5iYWNrZW5kOm51bGx9LGUucHJvdG90eXBlLnJlZ2lzdGVyQmFja2VuZD1mdW5jdGlvbihlLHQsbixyKXt2YXIgbz10aGlzO2lmKHZvaWQgMD09PW4mJihuPTEpLGUgaW4gdGhpcy5yZWdpc3RyeSlyZXR1cm4gY29uc29sZS53YXJuKGUrXCIgYmFja2VuZCB3YXMgYWxyZWFkeSByZWdpc3RlcmVkLiBSZXVzaW5nIGV4aXN0aW5nIGJhY2tlbmRcIiksbnVsbCE9ciYmcihmdW5jdGlvbigpe3JldHVybiBvLmVuZ2luZX0pLCExO3RyeXt2YXIgYT10KCk7cmV0dXJuIGEuc2V0RGF0YU1vdmVyKHttb3ZlRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gby5lbmdpbmUubW92ZURhdGEoZSl9fSksdGhpcy5yZWdpc3RyeVtlXT17YmFja2VuZDphLHByaW9yaXR5Om59LCEwfWNhdGNoKHQpe3JldHVybiBjb25zb2xlLndhcm4oXCJSZWdpc3RyYXRpb24gb2YgYmFja2VuZCBcIitlK1wiIGZhaWxlZFwiKSxjb25zb2xlLndhcm4odC5zdGFja3x8dC5tZXNzYWdlKSwhMX19LGUucHJvdG90eXBlLnJlbW92ZUJhY2tlbmQ9ZnVuY3Rpb24oZSl7aWYoIShlIGluIHRoaXMucmVnaXN0cnkpKXRocm93IG5ldyBFcnJvcihlK1wiIGJhY2tlbmQgbm90IGZvdW5kIGluIHJlZ2lzdHJ5XCIpO3RoaXMucmVnaXN0cnlbZV0uYmFja2VuZC5kaXNwb3NlKCksZGVsZXRlIHRoaXMucmVnaXN0cnlbZV19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImVuZ2luZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbml0RW5naW5lKCksdGhpcy5nbG9iYWxFbmdpbmV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuaW5pdEVuZ2luZT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYobnVsbD09dGhpcy5nbG9iYWxFbmdpbmUpe3RoaXMuYmFja2VuZE5hbWU9dGhpcy5nZXQoXCJCQUNLRU5EXCIpO3ZhciB0PXRoaXMuZmluZEJhY2tlbmQodGhpcy5iYWNrZW5kTmFtZSk7dGhpcy5nbG9iYWxFbmdpbmU9bmV3IEVuZ2luZSh0LCExLGZ1bmN0aW9uKCl7cmV0dXJuIGUuZ2V0KFwiREVCVUdcIil9KX19LGV9KCk7ZnVuY3Rpb24gZ2V0R2xvYmFsTmFtZXNwYWNlKCl7dmFyIGU7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyllPXdpbmRvdztlbHNle2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBwcm9jZXNzKXRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGEgZ2xvYmFsIG9iamVjdFwiKTtlPXByb2Nlc3N9cmV0dXJuIGV9ZnVuY3Rpb24gZ2V0T3JNYWtlRW52aXJvbm1lbnQoKXt2YXIgZT1nZXRHbG9iYWxOYW1lc3BhY2UoKTtyZXR1cm4gbnVsbD09ZS5FTlYmJihlLkVOVj1uZXcgRW52aXJvbm1lbnQoZ2V0RmVhdHVyZXNGcm9tVVJMKCkpLHNldFRlbnNvclRyYWNrZXIoZnVuY3Rpb24oKXtyZXR1cm4gZS5FTlYuZW5naW5lfSkpLGUuRU5WfXZhciBFTlY9Z2V0T3JNYWtlRW52aXJvbm1lbnQoKSxlbnZpcm9ubWVudD1PYmplY3QuZnJlZXplKHtFbnZpcm9ubWVudDpFbnZpcm9ubWVudCxFTlY6RU5WfSk7ZnVuY3Rpb24gZ3JhZChlKXtyZXR1cm4gYXNzZXJ0KGlzRnVuY3Rpb24oZSksXCJUaGUgZiBwYXNzZWQgaW4gZ3JhZChmKSBtdXN0IGJlIGEgZnVuY3Rpb25cIiksZnVuY3Rpb24odCxuKXtyZXR1cm4gYXNzZXJ0KHQgaW5zdGFuY2VvZiBUZW5zb3IsXCJUaGUgeCBwYXNzZWQgaW4gZ3JhZChmKSh4KSBtdXN0IGJlIGEgdGVuc29yXCIpLGFzc2VydChudWxsPT1ufHxuIGluc3RhbmNlb2YgVGVuc29yLFwiVGhlIGR5IHBhc3NlZCBpbiBncmFkKGYpKHgsIGR5KSBtdXN0IGJlIGEgdGVuc29yXCIpLEVOVi5lbmdpbmUudGlkeShmdW5jdGlvbigpe3ZhciByPUVOVi5lbmdpbmUuZ3JhZGllbnRzKGZ1bmN0aW9uKCl7cmV0dXJuIGUodCl9LFt0XSxuKSxvPXIudmFsdWUsYT1yLmdyYWRzO3JldHVybiBudWxsIT1uJiZhc3NlcnRTaGFwZXNNYXRjaChvLnNoYXBlLG4uc2hhcGUsXCJUaGUgc2hhcGUgb2YgZHkgcGFzc2VkIGluIGdyYWQoZikoeCwgZHkpIG11c3QgbWF0Y2ggdGhlIHNoYXBlIHJldHVybmVkIGJ5IGYoeClcIiksY2hlY2tHcmFkcyhhKSxhWzBdfSl9fWZ1bmN0aW9uIGdyYWRzKGUpe3JldHVybiBhc3NlcnQoaXNGdW5jdGlvbihlKSxcIlRoZSBmIHBhc3NlZCBpbiBncmFkcyhmKSBtdXN0IGJlIGEgZnVuY3Rpb25cIiksZnVuY3Rpb24odCxuKXtyZXR1cm4gYXNzZXJ0KEFycmF5LmlzQXJyYXkodCkmJnQuZXZlcnkoZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBUZW5zb3J9KSxcIlRoZSBhcmdzIHBhc3NlZCBpbiBncmFkcyhmKShhcmdzKSBtdXN0IGJlIGFuIGFycmF5IG9mIHRlbnNvcnNcIiksYXNzZXJ0KG51bGw9PW58fG4gaW5zdGFuY2VvZiBUZW5zb3IsXCJUaGUgZHkgcGFzc2VkIGluIGdyYWRzKGYpKGFyZ3MsIGR5KSBtdXN0IGJlIGEgdGVuc29yXCIpLEVOVi5lbmdpbmUudGlkeShmdW5jdGlvbigpe3ZhciByPUVOVi5lbmdpbmUuZ3JhZGllbnRzKGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodm9pZCAwLHQpfSx0LG4pLG89ci52YWx1ZSxhPXIuZ3JhZHM7cmV0dXJuIG51bGwhPW4mJmFzc2VydFNoYXBlc01hdGNoKG8uc2hhcGUsbi5zaGFwZSxcIlRoZSBzaGFwZSBvZiBkeSBwYXNzZWQgaW4gZ3JhZHMoZikoW3gxLC4uLl0sIGR5KSBtdXN0IG1hdGNoIHRoZSBzaGFwZSByZXR1cm5lZCBieSBmKFt4MSwuLi5dKVwiKSxjaGVja0dyYWRzKGEpLGF9KX19ZnVuY3Rpb24gdmFsdWVBbmRHcmFkKGUpe3JldHVybiBhc3NlcnQoaXNGdW5jdGlvbihlKSxcIlRoZSBmIHBhc3NlZCBpbiB2YWx1ZUFuZEdyYWQoZikgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpLGZ1bmN0aW9uKHQsbil7YXNzZXJ0KHQgaW5zdGFuY2VvZiBUZW5zb3IsXCJUaGUgeCBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkKGYpKHgpIG11c3QgYmUgYSB0ZW5zb3JcIiksYXNzZXJ0KG51bGw9PW58fG4gaW5zdGFuY2VvZiBUZW5zb3IsXCJUaGUgZHkgcGFzc2VkIGluIHZhbHVlQW5kR3JhZChmKSh4LCBkeSkgbXVzdCBiZSBhIHRlbnNvclwiKTt2YXIgcj1FTlYuZW5naW5lLmdyYWRpZW50cyhmdW5jdGlvbigpe3JldHVybiBlKHQpfSxbdF0sbiksbz1yLmdyYWRzLGE9ci52YWx1ZTtyZXR1cm4gY2hlY2tHcmFkcyhvKSx7Z3JhZDpvWzBdLHZhbHVlOmF9fX1mdW5jdGlvbiB2YWx1ZUFuZEdyYWRzKGUpe3JldHVybiBhc3NlcnQoaXNGdW5jdGlvbihlKSxcIlRoZSBmIHBhc3NlZCBpbiB2YWx1ZUFuZEdyYWRzKGYpIG11c3QgYmUgYSBmdW5jdGlvblwiKSxmdW5jdGlvbih0LG4pe2Fzc2VydChBcnJheS5pc0FycmF5KHQpJiZ0LmV2ZXJ5KGZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgVGVuc29yfSksXCJUaGUgYXJncyBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkcyhmKShhcmdzKSBtdXN0IGJlIGFycmF5IG9mIHRlbnNvcnNcIiksYXNzZXJ0KG51bGw9PW58fG4gaW5zdGFuY2VvZiBUZW5zb3IsXCJUaGUgZHkgcGFzc2VkIGluIHZhbHVlQW5kR3JhZHMoZikoYXJncywgZHkpIG11c3QgYmUgYSB0ZW5zb3JcIik7dmFyIHI9RU5WLmVuZ2luZS5ncmFkaWVudHMoZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh2b2lkIDAsdCl9LHQsbik7cmV0dXJuIG51bGwhPW4mJmFzc2VydFNoYXBlc01hdGNoKHIudmFsdWUuc2hhcGUsbi5zaGFwZSxcIlRoZSBzaGFwZSBvZiBkeSBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkcyhmKShbeDEsLi4uXSwgZHkpIG11c3QgbWF0Y2ggdGhlIHNoYXBlIHJldHVybmVkIGJ5IGYoW3gxLC4uLl0pXCIpLGNoZWNrR3JhZHMoci5ncmFkcykscn19ZnVuY3Rpb24gdmFyaWFibGVHcmFkcyhlLHQpe2lmKGFzc2VydChpc0Z1bmN0aW9uKGUpLFwiVGhlIGYgcGFzc2VkIGluIHZhcmlhYmxlR3JhZHMoZikgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpLGFzc2VydChudWxsPT10fHxBcnJheS5pc0FycmF5KHQpJiZ0LmV2ZXJ5KGZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgVmFyaWFibGV9KSxcIlRoZSB2YXJMaXN0IHBhc3NlZCBpbiB2YXJpYWJsZUdyYWRzKGYsIHZhckxpc3QpIG11c3QgYmUgYW4gYXJyYXkgb2YgdmFyaWFibGVzXCIpLG51bGw9PXQpZm9yKHZhciBuIGluIHQ9W10sRU5WLmVuZ2luZS5yZWdpc3RlcmVkVmFyaWFibGVzKXQucHVzaChFTlYuZW5naW5lLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbl0pO3ZhciByPXQubGVuZ3RoO2Fzc2VydCgodD10LmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZS50cmFpbmFibGV9KSkubGVuZ3RoPjAsXCJ2YXJpYWJsZUdyYWRzKCkgZXhwZWN0cyBhdCBsZWFzdCBvbmUgb2YgdGhlIGlucHV0IHZhcmlhYmxlcyB0byBiZSB0cmFpbmFibGUsIGJ1dCBub25lIG9mIHRoZSBcIityK1wiIHZhcmlhYmxlcyBpcyB0cmFpbmFibGUuXCIpO3ZhciBvPUVOVi5lbmdpbmUuZ3JhZGllbnRzKGUsdCxudWxsLCEwKSxhPW8udmFsdWUsaT1vLmdyYWRzO2Fzc2VydChpLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWV9KSxcIkNhbm5vdCBmaW5kIGEgY29ubmVjdGlvbiBiZXR3ZWVuIGFueSB2YXJpYWJsZSBhbmQgdGhlIHJlc3VsdCBvZiB0aGUgbG9zcyBmdW5jdGlvbiB5PWYoeCkuIFBsZWFzZSBtYWtlIHN1cmUgdGhlIG9wZXJhdGlvbnMgdGhhdCB1c2UgdmFyaWFibGVzIGFyZSBpbnNpZGUgdGhlIGZ1bmN0aW9uIGYgcGFzc2VkIHRvIG1pbmltaXplKCkuXCIpLGFzc2VydCgwPT09YS5yYW5rLFwiVGhlIGYgcGFzc2VkIGluIHZhcmlhYmxlR3JhZHMoZikgbXVzdCByZXR1cm4gYSBzY2FsYXIsIGJ1dCBpdCByZXR1cm5lZCBhIHJhbmstXCIrYS5yYW5rK1wiIHRlbnNvclwiKTt2YXIgcz17fTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKGUsdCl7bnVsbCE9aVt0XSYmKHNbZS5uYW1lXT1pW3RdKX0pLHt2YWx1ZTphLGdyYWRzOnN9fWZ1bmN0aW9uIGN1c3RvbUdyYWQoZSl7cmV0dXJuIEVOVi5lbmdpbmUuY3VzdG9tR3JhZChlKX1mdW5jdGlvbiBjaGVja0dyYWRzKGUpe2lmKGUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lfSkubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNvbXB1dGUgZ3JhZGllbnQgb2YgeT1mKHgpIHdpdGggcmVzcGVjdCB0byB4LiBNYWtlIHN1cmUgdGhhdFxcbiAgICB0aGUgZiB5b3UgcGFzc2VkIGVuY2xvc2VzIGFsbCBvcGVyYXRpb25zIHRoYXQgbGVhZCBmcm9tIHggdG8geS5cIil9dmFyIHRpZHk9RW52aXJvbm1lbnQudGlkeSxrZWVwPUVudmlyb25tZW50LmtlZXAsZGlzcG9zZT1FbnZpcm9ubWVudC5kaXNwb3NlLHRpbWU9RW52aXJvbm1lbnQudGltZSxwcm9maWxlPUVudmlyb25tZW50LnByb2ZpbGU7ZnVuY3Rpb24gd2Fybigpe2Zvcih2YXIgZT1bXSx0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyllW3RdPWFyZ3VtZW50c1t0XTtFTlYuZ2V0KFwiSVNfVEVTVFwiKXx8Y29uc29sZS53YXJuLmFwcGx5KGNvbnNvbGUsZSl9ZnVuY3Rpb24gZ2V0UmVzaGFwZWQoZSx0LG4scil7dm9pZCAwPT09ciYmKHI9ITApO3ZhciBvPVtdO2lmKHIpKG89by5jb25jYXQodC5zbGljZSgwKSkpLnB1c2goZVswXS9uKSxvPW8uY29uY2F0KGUuc2xpY2UoMSkpO2Vsc2V7bz1vLmNvbmNhdChlWzBdKTtmb3IodmFyIGE9dC5sZW5ndGgsaT0wO2k8YTsrK2kpbz1vLmNvbmNhdChbZVtpKzFdL3RbaV0sdFtpXV0pO289by5jb25jYXQoZS5zbGljZShhKzEpKX1yZXR1cm4gb31mdW5jdGlvbiBnZXRQZXJtdXRlZChlLHQsbil7dm9pZCAwPT09biYmKG49ITApO3ZhciByPVtdO2lmKG4pe3IucHVzaCh0KTtmb3IodmFyIG89dCsxO288ZTsrK28pbzw9Mip0PyhyLnB1c2gobyksci5wdXNoKG8tKHQrMSkpKTpyLnB1c2gobyl9ZWxzZXt2YXIgYT1bXSxpPVtdO2ZvcihvPTE7bzxlOysrbylvPj0yKnQrMXx8byUyPT0xP2kucHVzaChvKTphLnB1c2gobyk7ci5wdXNoLmFwcGx5KHIsYSksci5wdXNoKDApLHIucHVzaC5hcHBseShyLGkpfXJldHVybiByfWZ1bmN0aW9uIGdldFJlc2hhcGVkUGVybXV0ZWQoZSx0LG4scil7dm9pZCAwPT09ciYmKHI9ITApO3ZhciBvPVtdO3I/by5wdXNoKGVbMF0vbik6by5wdXNoKGVbMF0qbik7Zm9yKHZhciBhPTE7YTxlLmxlbmd0aDsrK2EpYTw9dC5sZW5ndGg/cj9vLnB1c2godFthLTFdKmVbYV0pOm8ucHVzaChlW2FdL3RbYS0xXSk6by5wdXNoKGVbYV0pO3JldHVybiBvfWZ1bmN0aW9uIGdldFNsaWNlQmVnaW5Db29yZHMoZSx0KXtmb3IodmFyIG49WzBdLHI9MDtyPHQ7KytyKW4ucHVzaChlW3JdWzBdKTtyZXR1cm4gbn1mdW5jdGlvbiBnZXRTbGljZVNpemUoZSx0LG4pe2Zvcih2YXIgcj1lLnNsaWNlKDAsMSksbz0wO288bjsrK28pci5wdXNoKGVbbysxXS10W29dWzBdLXRbb11bMV0pO3JldHVybiByfWZ1bmN0aW9uIGF4ZXNBcmVJbm5lck1vc3REaW1zKGUsdCl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDsrK24paWYoZVtlLmxlbmd0aC1uLTFdIT09dC0xLW4pcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gY29tYmluZUxvY2F0aW9ucyhlLHQsbil7Zm9yKHZhciByPWUubGVuZ3RoK3QubGVuZ3RoLG89W10sYT0wLGk9MCxzPTA7czxyO3MrKyktMT09PW4uaW5kZXhPZihzKT9vLnB1c2goZVthKytdKTpvLnB1c2godFtpKytdKTtyZXR1cm4gb31mdW5jdGlvbiBjb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKGUsdCl7Zm9yKHZhciBuPVtdLHI9ZS5sZW5ndGgsbz0wO288cjtvKyspLTE9PT10LmluZGV4T2YobykmJm4ucHVzaChlW29dKTtyZXR1cm5bbix0Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0pXX1mdW5jdGlvbiBleHBhbmRTaGFwZVRvS2VlcERpbShlLHQpe3JldHVybiBjb21iaW5lTG9jYXRpb25zKGUsdC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIDF9KSx0KX1mdW5jdGlvbiBwYXJzZUF4aXNQYXJhbShlLHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBhc3NlcnQoKGU9bnVsbD09ZT90Lm1hcChmdW5jdGlvbihlLHQpe3JldHVybiB0fSk6W10uY29uY2F0KGUpKS5ldmVyeShmdW5jdGlvbihlKXtyZXR1cm4gZT49LW4mJmU8bn0pLFwiQWxsIHZhbHVlcyBpbiBheGlzIHBhcmFtIG11c3QgYmUgaW4gcmFuZ2UgWy1cIituK1wiLCBcIituK1wiKSBidXQgZ290IGF4aXMgXCIrZSksYXNzZXJ0KGUuZXZlcnkoZnVuY3Rpb24oZSl7cmV0dXJuIGlzSW50KGUpfSksXCJBbGwgdmFsdWVzIGluIGF4aXMgcGFyYW0gbXVzdCBiZSBpbnRlZ2VycyBidXQgZ290IGF4aXMgXCIrZSksZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGU8MD9uK2U6ZX0pfWZ1bmN0aW9uIGFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKGUsdCxuKXthc3NlcnQoYXhlc0FyZUlubmVyTW9zdERpbXModCxuKSxlK1wiIHN1cHBvcnRzIG9ubHkgaW5uZXItbW9zdCBheGVzIGZvciBub3cuIEdvdCBheGVzIFwiK3QrXCIgYW5kIHJhbmstXCIrbitcIiBpbnB1dC5cIil9ZnVuY3Rpb24gZ2V0QXhlc1Blcm11dGF0aW9uKGUsdCl7aWYoYXhlc0FyZUlubmVyTW9zdERpbXMoZSx0KSlyZXR1cm4gbnVsbDtmb3IodmFyIG49W10scj0wO3I8dDsrK3IpLTE9PT1lLmluZGV4T2YocikmJm4ucHVzaChyKTtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBuLnB1c2goZSl9KSxufWZ1bmN0aW9uIGdldFVuZG9BeGVzUGVybXV0YXRpb24oZSl7cmV0dXJuIGUubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuW3QsZV19KS5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbMV0tdFsxXX0pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZVswXX0pfWZ1bmN0aW9uIGdldElubmVyTW9zdEF4ZXMoZSx0KXtmb3IodmFyIG49W10scj10LWU7cjx0OysrciluLnB1c2gocik7cmV0dXJuIG59ZnVuY3Rpb24gYXNzZXJ0UGFyYW1zQ29uc2lzdGVudChlLHQpe3ZhciBuPWVbMF0ubGVuZ3RoO2UuZm9yRWFjaChmdW5jdGlvbihlLHQpe2Fzc2VydChlLmxlbmd0aD09PW4sXCJFcnJvciBpbiBjb25jYXRcIituK1wiRDogcmFuayBvZiB0ZW5zb3JzW1wiK3QrXCJdIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIHJhbmsgb2YgdGhlIHJlc3QgKFwiK24rXCIpXCIpfSksYXNzZXJ0KHQ+PTAmJnQ8bixcIkVycm9yIGluIGNvbmNhdFwiK24rXCJEOiBheGlzIG11c3QgYmUgYmV0d2VlbiAwIGFuZCBcIisobi0xKStcIi5cIik7dmFyIHI9ZVswXTtlLmZvckVhY2goZnVuY3Rpb24oZSxvKXtmb3IodmFyIGE9MDthPG47YSsrKWFzc2VydChhPT09dHx8ZVthXT09PXJbYV0sXCJFcnJvciBpbiBjb25jYXRcIituK1wiRDogU2hhcGUgb2YgdGVuc29yc1tcIitvK1wiXSAoXCIrZStcIikgZG9lcyBub3QgbWF0Y2ggdGhlIHNoYXBlIG9mIHRoZSByZXN0IChcIityK1wiKSBhbG9uZyB0aGUgbm9uLWNvbmNhdGVuYXRlZCBheGlzIFwiK28rXCIuXCIpfSl9ZnVuY3Rpb24gY29tcHV0ZU91dFNoYXBlKGUsdCl7Zm9yKHZhciBuPWVbMF0uc2xpY2UoKSxyPTE7cjxlLmxlbmd0aDtyKyspblt0XSs9ZVtyXVt0XTtyZXR1cm4gbn1mdW5jdGlvbiBwcmVwYXJlQW5kVmFsaWRhdGUoZSx0KXtpZihlLnJhbms8MSl0aHJvdyBuZXcgRXJyb3IoXCJ0Zi5nYXRoZXJORCgpIGV4cGVjdHMgdGhlIGlucHV0IHRvIGJlIHJhbmsgMSBvciBoaWdoZXIsIGJ1dCB0aGUgcmFuayB3YXMgXCIrZS5yYW5rK1wiLlwiKTtpZih0LnJhbms8MSl0aHJvdyBuZXcgRXJyb3IoXCJ0Zi5nYXRoZXJORCgpIGV4cGVjdHMgdGhlIGluZGljZXMgdG8gYmUgcmFuayAxIG9yIGhpZ2hlciwgYnV0IHRoZSByYW5rIHdhcyBcIit0LnJhbmsrXCIuXCIpO2lmKFwiaW50MzJcIiE9PXQuZHR5cGUpdGhyb3cgbmV3IEVycm9yKFwidGYuZ2F0aGVyTkQoKSBleHBlY3RzIHRoZSBpbmRpY2VzIHRvIGJlIGludDMyIHR5cGUsIGJ1dCB0aGUgZHR5cGUgd2FzIFwiK3QuZHR5cGUrXCIuXCIpO2lmKHQuc2hhcGVbdC5yYW5rLTFdPmUucmFuayl0aHJvdyBuZXcgRXJyb3IoXCJpbmRleCBpbm5lcm1vc3QgZGltZW5zaW9uIGxlbmd0aCBtdXN0IGJlIDw9IHRlbnNvciByYW5rOyBzYXc6IFwiK3Quc2hhcGVbdC5yYW5rLTFdK1wiIHZzLiBcIitlLnJhbmspO2lmKDA9PT1lLnNpemUpdGhyb3cgbmV3IEVycm9yKFwiUmVxdWVzdGVkIG1vcmUgdGhhbiAwIGVudHJpZXMsIGJ1dCBpbnB1dCBpcyBlbXB0eS4gSW5wdXQgc2hhcGU6IFwiK2Uuc2hhcGUrXCIuXCIpO2Zvcih2YXIgbj10LnNoYXBlLHI9bltuLmxlbmd0aC0xXSxvPTEsYT0wO2E8bi5sZW5ndGgtMTsrK2Epbyo9blthXTt2YXIgaT1lLnNoYXBlLHM9bi5zbGljZSgpO3MucG9wKCk7dmFyIHU9MTtmb3IoYT1yO2E8ZS5yYW5rOysrYSl1Kj1pW2FdLHMucHVzaChpW2FdKTt2YXIgbD1jb21wdXRlU3RyaWRlcyhlLnNoYXBlKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUvdX0pLmNvbmNhdChbMV0pLnNsaWNlKDAscik7cmV0dXJuW3Msbyx1LGxdfXZhciBQQVJBTExFTElaRV9USFJFU0hPTEQ9MzA7ZnVuY3Rpb24gY29tcHV0ZU9wdGltYWxXaW5kb3dTaXplKGUpe3JldHVybiBlPD1QQVJBTExFTElaRV9USFJFU0hPTEQ/ZTpuZWFyZXN0RGl2aXNvcihlLE1hdGguZmxvb3IoTWF0aC5zcXJ0KGUpKSl9ZnVuY3Rpb24gdmFsaWRhdGVVcGRhdGVTaGFwZShlLHQsbil7dmFyIHI9dC5yYW5rPjE/dC5zaGFwZVt0LnJhbmstMV06MSxvPXQucmFuaz4xP3QucmFuay0xOjEsYT1cIk11c3QgaGF2ZSB1cGRhdGVzLnNoYXBlID0gaW5kaWNlcy5zaGFwZVs6YmF0Y2hEaW1dICsgc2hhcGVbc2xpY2VEaW06XSwgZ290IHVwZGF0ZXMuc2hhcGU6IFwiK24uc2hhcGUrXCIsIGluZGljZXMuc2hhcGU6IFwiK3Quc2hhcGUrXCIsIHNoYXBlOiBcIitlK1wiLCBzbGljZURpbTogXCIrcitcIiwgYW5kIGJhdGNoRGltOiBcIitvK1wiLlwiO2lmKG4ucmFuazxvKXRocm93IG5ldyBFcnJvcihhK1wiIHVwZGF0ZS5yYW5rIDwgXCIrbytcIi4gXCIpO2lmKGUubGVuZ3RoPHIrKG4ucmFuay1vKSl0aHJvdyBuZXcgRXJyb3IoYStcIiBPdXRwdXQgc2hhcGUgbGVuZ3RoIDwgXCIrKHIrKG4ucmFuay1vKSkpO2lmKG4ucmFuayE9PW8rZS5sZW5ndGgtcil0aHJvdyBuZXcgRXJyb3IoYStcIiB1cGRhdGUucmFuayAhPSBcIisobytlLmxlbmd0aC1yKSk7Zm9yKHZhciBpPTA7aTxvOysraSlpZihuLnNoYXBlW2ldIT09dC5zaGFwZVtpXSl0aHJvdyBuZXcgRXJyb3IoYStcIiB1cGRhdGVzLnNoYXBlW1wiK2krXCJdIChcIituLnNoYXBlW2ldK1wiKSAhPSBpbmRpY2VzLnNoYXBlW1wiK2krXCJdIChcIit0LnNoYXBlW2ldK1wiKS5cIik7Zm9yKGk9MDtpPG4ucmFuay1vOysraSlpZihuLnNoYXBlW2krb10hPT1lW2krcl0pdGhyb3cgbmV3IEVycm9yKGErXCIgdXBkYXRlcy5zaGFwZVtcIisoaStvKStcIl0gKFwiK24uc2hhcGVbaStvXStcIikgIT0gc2hhcGVbXCIrKGkrbykrXCJdIChcIitlW2krb10rXCIpXCIpfWZ1bmN0aW9uIHByZXBhcmVBbmRWYWxpZGF0ZSQxKGUsdCxuKXtpZih0LnJhbms8MSl0aHJvdyBuZXcgRXJyb3IoXCJ0Zi5zY2F0dGVyTkQoKSBleHBlY3RzIHRoZSBpbmRpY2VzIHRvIGJlIHJhbmsgMSBvciBoaWdoZXIsIGJ1dCB0aGUgcmFuayB3YXMgXCIrdC5yYW5rK1wiLlwiKTtpZihlLnJhbms8MSl0aHJvdyBuZXcgRXJyb3IoXCJ0Zi5zY2F0dGVyTkQoKSBleHBlY3RzIHRoZSB1cGRhdGVzIHRvIGJlIHJhbmsgMSBvciBoaWdoZXIsIGJ1dCB0aGUgcmFuayB3YXMgXCIrZS5yYW5rK1wiLlwiKTtpZihcImludDMyXCIhPT10LmR0eXBlKXRocm93IG5ldyBFcnJvcihcIlRoZSBkdHlwZSBvZiAnaW5kaWNlcycgc2hvdWxkIGJlIGludDMyLCBidXQgZ290IGR0eXBlOiBcIit0LmR0eXBlKTtpZihuLmxlbmd0aDwxKXRocm93IG5ldyBFcnJvcihcIk91dHB1dCByYW5rIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byAxLCBidXQgZ290IHNoYXBlOiBcIituKTtpZigwPT09bi5sZW5ndGgpe2lmKDA9PT10LnNpemUpdGhyb3cgbmV3IEVycm9yKFwiSW5kaWNlcyBzcGVjaWZpZWQgZm9yIGVtcHR5IG91dHB1dC4gaW5kaWNlcyBzaGFwZTogXCIrdC5zaGFwZSk7aWYoMD09PWUuc2l6ZSl0aHJvdyBuZXcgRXJyb3IoXCJVcGRhdGVzIHNwZWNpZmllZCBmb3IgZW1wdHkgb3V0cHV0LiB1cGRhdGVzIHNoYXBlOiBcIitlLnNoYXBlKX12YWxpZGF0ZVVwZGF0ZVNoYXBlKG4sdCxlKTtmb3IodmFyIHI9dC5yYW5rPjE/dC5zaGFwZVt0LnJhbmstMV06MSxvPW4ubGVuZ3RoLGE9MSxpPXI7aTxvOysraSlhKj1uW2ldO3ZhciBzPXI8MT8xOnIsdT10LnNpemUvcyxsPWNvbXB1dGVTdHJpZGVzKG4pLmNvbmNhdChbMV0pO3JldHVybltyLHUsYSxsLnNsaWNlKGwubGVuZ3RoLXIsbC5sZW5ndGgpLHNpemVGcm9tU2hhcGUobildfWZ1bmN0aW9uIHNlZ09wQ29tcHV0ZU9wdGltYWxXaW5kb3dTaXplKGUsdCl7dmFyIG4scj0hMTtmb3IoZTw9UEFSQUxMRUxJWkVfVEhSRVNIT0xEPyhuPWUscj0hMCk6bj1uZWFyZXN0RGl2aXNvcihlLE1hdGguZmxvb3IoTWF0aC5zcXJ0KGUpKSk7IXI7KXtpZihuPnR8fG49PT1lKXtyPSEwO2JyZWFrfW49bmVhcmVzdERpdmlzb3IoZSxuKzEpfXJldHVybiBufWZ1bmN0aW9uIGNvbXB1dGVPdXRTaGFwZSQxKGUsdCxuKXtmb3IodmFyIHI9W10sbz1lLmxlbmd0aCxhPTA7YTxvO2ErKylhIT09dD9yLnB1c2goZVthXSk6ci5wdXNoKG4pO3JldHVybiByfWZ1bmN0aW9uIGFzc2VydFBhcmFtc1ZhbGlkKGUsdCxuKXthc3NlcnQoZS5yYW5rPT09dC5sZW5ndGgsXCJFcnJvciBpbiBzbGljZVwiK2UucmFuaytcIkQ6IExlbmd0aCBvZiBiZWdpbiBcIit0K1wiIG11c3QgbWF0Y2ggdGhlIHJhbmsgb2YgdGhlIGFycmF5IChcIitlLnJhbmsrXCIpLlwiKSxhc3NlcnQoZS5yYW5rPT09bi5sZW5ndGgsXCJFcnJvciBpbiBzbGljZVwiK2UucmFuaytcIkQ6IExlbmd0aCBvZiBzaXplIFwiK24rXCIgbXVzdCBtYXRjaCB0aGUgcmFuayBvZiB0aGUgYXJyYXkgKFwiK2UucmFuaytcIikuXCIpO2Zvcih2YXIgcj0wO3I8ZS5yYW5rOysrcilhc3NlcnQodFtyXStuW3JdPD1lLnNoYXBlW3JdLFwiRXJyb3IgaW4gc2xpY2VcIitlLnJhbmsrXCJEOiBiZWdpbltcIityK1wiXSArIHNpemVbXCIrcitcIl0gKFwiKyh0W3JdK25bcl0pK1wiKSB3b3VsZCBvdmVyZmxvdyBpbnB1dC5zaGFwZVtcIityK1wiXSAoXCIrZS5zaGFwZVtyXStcIilcIil9ZnVuY3Rpb24gZ2V0U3RyaWRlZFNsaWNlZEluZm8oZSx0LG4scixvLGEsaSxzLHUpe2lmKHZvaWQgMD09PW8mJihvPTApLHZvaWQgMD09PWEmJihhPTApLHZvaWQgMD09PWkmJihpPTApLHZvaWQgMD09PXMmJihzPTApLHZvaWQgMD09PXUmJih1PTApLDAhPT1pKXRocm93IG5ldyBFcnJvcihcImVsbGlwc2lzIG1hc2sgaXMgbm90IHlldCBzdXBwb3J0ZWRcIik7aWYoMCE9PXMpdGhyb3cgbmV3IEVycm9yKFwibmV3IGF4aXMgbWFzayBpcyBub3QgeWV0IHN1cHBvcnRlZFwiKTtmb3IodmFyIGw9W10sYz1bXSxwPVtdLGQ9MDtkPGUubGVuZ3RoO2QrKylsW2RdPXN0YXJ0Rm9yQXhpcyhvLHQscixlLGQpLGNbZF09c3RvcEZvckF4aXMoYSxuLHIsZSxkKSx1JjE8PGQmJihjW2RdPWxbZF0rMSxwLnB1c2goZCkpO3ZhciBoPW5ldyBBcnJheShlLmxlbmd0aCkuZmlsbCgwKTtyZXR1cm4gaD1oLm1hcChmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wLG89bFt0XTshKHJbdF0+MD9vPj1jW3RdOm88PWNbdF0pO28rPXJbdF0pbis9MTtyZXR1cm4gbn0pLFtsLGgscF19ZnVuY3Rpb24gc3RhcnRGb3JBeGlzKGUsdCxuLHIsbyl7dmFyIGE9dFtvXTtlJjE8PG8mJihhPW5bb10+MD9OdW1iZXIuTUlOX1NBRkVfSU5URUdFUjpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7dmFyIGk9cltvXTtyZXR1cm4gYTwwJiYoYSs9aSksYT1jbGFtcCgwLGEsaS0xKX1mdW5jdGlvbiBzdG9wRm9yQXhpcyhlLHQsbixyLG8pe3ZhciBhPXRbb107ZSYxPDxvJiYoYT1uW29dPjA/TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI6TnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIpO3ZhciBpPXJbb107cmV0dXJuIGE8MCYmKGErPWkpLGE9bltvXT4wP2NsYW1wKDAsYSxpKTpjbGFtcCgtMSxhLGktMSl9ZnVuY3Rpb24gaW5mZXJTaGFwZShlKXt2YXIgdD1lO2lmKGlzVHlwZWRBcnJheShlKSlyZXR1cm5bZS5sZW5ndGhdO2lmKCFBcnJheS5pc0FycmF5KGUpKXJldHVybltdO2Zvcih2YXIgbj1bXTt0IGluc3RhbmNlb2YgQXJyYXk7KW4ucHVzaCh0Lmxlbmd0aCksdD10WzBdO3JldHVybiBlIGluc3RhbmNlb2YgQXJyYXkmJkVOVi5nZXQoXCJURU5TT1JMSUtFX0NIRUNLX1NIQVBFX0NPTlNJU1RFTkNZXCIpJiZkZWVwQXNzZXJ0U2hhcGVDb25zaXN0ZW5jeShlLG4sW10pLG59ZnVuY3Rpb24gZGVlcEFzc2VydFNoYXBlQ29uc2lzdGVuY3koZSx0LG4pe2lmKG49bnx8W10sZSBpbnN0YW5jZW9mIEFycmF5KXthc3NlcnQodC5sZW5ndGg+MCxmdW5jdGlvbigpe3JldHVyblwiRWxlbWVudCBhcnJbXCIrbi5qb2luKFwiXVtcIikrXCJdIHNob3VsZCBiZSBhIHByaW1pdGl2ZSwgYnV0IGlzIGFuIGFycmF5IG9mIFwiK2UubGVuZ3RoK1wiIGVsZW1lbnRzXCJ9KSxhc3NlcnQoZS5sZW5ndGg9PT10WzBdLGZ1bmN0aW9uKCl7cmV0dXJuXCJFbGVtZW50IGFycltcIituLmpvaW4oXCJdW1wiKStcIl0gc2hvdWxkIGhhdmUgXCIrdFswXStcIiBlbGVtZW50cywgYnV0IGhhcyBcIitlLmxlbmd0aCtcIiBlbGVtZW50c1wifSk7Zm9yKHZhciByPXQuc2xpY2UoMSksbz0wO288ZS5sZW5ndGg7KytvKWRlZXBBc3NlcnRTaGFwZUNvbnNpc3RlbmN5KGVbb10scixuLmNvbmNhdChvKSl9ZWxzZSBhc3NlcnQoMD09PXQubGVuZ3RoLGZ1bmN0aW9uKCl7cmV0dXJuXCJFbGVtZW50IGFycltcIituLmpvaW4oXCJdW1wiKStcIl0gaXMgYSBwcmltaXRpdmUsIGJ1dCBzaG91bGQgYmUgYW4gYXJyYXkgb2YgXCIrdFswXStcIiBlbGVtZW50c1wifSl9ZnVuY3Rpb24gY29udmVydFRvVGVuc29yKGUsdCxuLHIpe2lmKHZvaWQgMD09PXImJihyPVwiZmxvYXQzMlwiKSxyPXJ8fFwiZmxvYXQzMlwiLGUgaW5zdGFuY2VvZiBUZW5zb3IpcmV0dXJuIGU7aWYoIWlzVHlwZWRBcnJheShlKSYmIUFycmF5LmlzQXJyYXkoZSkmJlwibnVtYmVyXCIhPXR5cGVvZiBlJiZcImJvb2xlYW5cIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKFwiQXJndW1lbnQgJ1wiK3QrXCInIHBhc3NlZCB0byAnXCIrbitcIicgbXVzdCBiZSBhIFRlbnNvciBvciBUZW5zb3JMaWtlLCBidXQgZ290IFwiK2UuY29uc3RydWN0b3IubmFtZSk7dmFyIG89aW5mZXJTaGFwZShlKTtyZXR1cm4gaXNUeXBlZEFycmF5KGUpfHxBcnJheS5pc0FycmF5KGUpfHwoZT1bZV0pLFRlbnNvci5tYWtlKG8se3ZhbHVlczp0b1R5cGVkQXJyYXkoZSxyLEVOVi5nZXQoXCJERUJVR1wiKSl9LHIpfWZ1bmN0aW9uIGNvbnZlcnRUb1RlbnNvckFycmF5KGUsdCxuKXtpZighQXJyYXkuaXNBcnJheShlKSl0aHJvdyBuZXcgRXJyb3IoXCJBcmd1bWVudCBcIit0K1wiIHBhc3NlZCB0byBcIituK1wiIG11c3QgYmUgYSBgVGVuc29yW11gIG9yIGBUZW5zb3JMaWtlW11gXCIpO3JldHVybiBlLm1hcChmdW5jdGlvbihlLHIpe3JldHVybiBjb252ZXJ0VG9UZW5zb3IoZSx0K1wiW1wiK3IrXCJdXCIsbil9KX1mdW5jdGlvbiBvcChlKXt2YXIgdD1PYmplY3Qua2V5cyhlKTtpZigxIT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwiUGxlYXNlIHByb3ZpZGUgYW4gb2JqZWN0IHdpdGggYSBzaW5nbGUga2V5IChvcGVyYXRpb24gbmFtZSkgbWFwcGluZyB0byBhIGZ1bmN0aW9uLiBHb3QgYW4gb2JqZWN0IHdpdGggXCIrdC5sZW5ndGgrXCIga2V5cy5cIik7dmFyIG49dFswXSxyPWVbbl07bi5lbmRzV2l0aChcIl9cIikmJihuPW4uc3Vic3RyaW5nKDAsbi5sZW5ndGgtMSkpO3ZhciBvPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKWVbdF09YXJndW1lbnRzW3RdO0VOVi5lbmdpbmUuc3RhcnRTY29wZShuKTt0cnl7dmFyIG89ci5hcHBseSh2b2lkIDAsZSk7cmV0dXJuIG8gaW5zdGFuY2VvZiBQcm9taXNlJiZjb25zb2xlLmVycm9yKFwiQ2Fubm90IHJldHVybiBhIFByb21pc2UgaW5zaWRlIG9mIHRpZHkuXCIpLEVOVi5lbmdpbmUuZW5kU2NvcGUobyksb31jYXRjaChlKXt0aHJvdyBFTlYuZW5naW5lLmVuZFNjb3BlKG51bGwpLGV9fTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sXCJuYW1lXCIse3ZhbHVlOm4sY29uZmlndXJhYmxlOiEwfSksb31mdW5jdGlvbiBzb2Z0bWF4XyhlLHQpe3ZvaWQgMD09PXQmJih0PS0xKTt2YXIgbj1jb252ZXJ0VG9UZW5zb3IoZSxcImxvZ2l0c1wiLFwic29mdG1heFwiKTtpZigtMT09PXQmJih0PW4ucmFuay0xKSx0IT09bi5yYW5rLTEpdGhyb3cgRXJyb3IoXCJTb2Z0bWF4IGFsb25nIGEgbm9uLWxhc3QgZGltZW5zaW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiBMb2dpdHMgd2FzIHJhbmsgXCIrbi5yYW5rK1wiIGFuZCBkaW0gd2FzIFwiK3QpO3JldHVybiBjdXN0b21HcmFkKGZ1bmN0aW9uKGUpe3ZhciBuPWUubG9nU3VtRXhwKFt0XSwhMCkscj1lLnRvRmxvYXQoKS5zdWIobikuZXhwKCk7cmV0dXJue3ZhbHVlOnIsZ3JhZEZ1bmM6ZnVuY3Rpb24oZSl7dmFyIG49ZS5tdWwocik7cmV0dXJuIG4uc3ViKG4uc3VtKFt0XSwhMCkubXVsKHIpKX19fSkobil9dmFyIHNvZnRtYXg9b3Aoe3NvZnRtYXhfOnNvZnRtYXhffSk7ZnVuY3Rpb24gY29tcGxleF8oZSx0KXt2YXIgbj1jb252ZXJ0VG9UZW5zb3IoZSxcInJlYWxcIixcImNvbXBsZXhcIikscj1jb252ZXJ0VG9UZW5zb3IodCxcImltYWdcIixcImNvbXBsZXhcIik7cmV0dXJuIGFzc2VydFNoYXBlc01hdGNoKG4uc2hhcGUsci5zaGFwZSxcInJlYWwgYW5kIGltYWcgc2hhcGVzLCBcIituLnNoYXBlK1wiIGFuZCBcIityLnNoYXBlK1wiLCBtdXN0IG1hdGNoIGluIGNhbGwgdG8gdGYuY29tcGxleCgpLlwiKSxFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5jb21wbGV4KG4scil9LHskcmVhbDpuLCRpbWFnOnJ9KX1mdW5jdGlvbiByZWFsXyhlKXt2YXIgdD1jb252ZXJ0VG9UZW5zb3IoZSxcImlucHV0XCIsXCJyZWFsXCIpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZWFsKHQpfSx7JGlucHV0OnR9KX1mdW5jdGlvbiBpbWFnXyhlKXt2YXIgdD1jb252ZXJ0VG9UZW5zb3IoZSxcImlucHV0XCIsXCJpbWFnXCIpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5pbWFnKHQpfSx7JGlucHV0OnR9KX12YXIgY29tcGxleD1vcCh7Y29tcGxleF86Y29tcGxleF99KSxyZWFsPW9wKHtyZWFsXzpyZWFsX30pLGltYWc9b3Aoe2ltYWdfOmltYWdffSk7ZnVuY3Rpb24gdGVuc29yKGUsdCxuKXtpZih2b2lkIDA9PT1uJiYobj1cImZsb2F0MzJcIiksXCJjb21wbGV4NjRcIj09PW4pdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNvbnN0cnVjdCBhIGNvbXBsZXg2NCB0ZW5zb3IgZGlyZWN0bHkuIFBsZWFzZSB1c2UgdGYuY29tcGxleChyZWFsLCBpbWFnKS5cIik7aWYoIWlzVHlwZWRBcnJheShlKSYmIUFycmF5LmlzQXJyYXkoZSkmJlwibnVtYmVyXCIhPXR5cGVvZiBlJiZcImJvb2xlYW5cIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKFwidmFsdWVzIHBhc3NlZCB0byB0ZW5zb3IodmFsdWVzKSBtdXN0IGJlIGFuIGFycmF5IG9mIG51bWJlcnMgb3IgYm9vbGVhbnMsIG9yIGEgVHlwZWRBcnJheVwiKTt2YXIgcj1pbmZlclNoYXBlKGUpO3JldHVybiBudWxsIT10JiYxIT09ci5sZW5ndGgmJmFzc2VydFNoYXBlc01hdGNoKHQscixcIkVycm9yIGNyZWF0aW5nIGEgbmV3IFRlbnNvci4gSW5mZXJyZWQgc2hhcGUgKFwiK3IrXCIpIGRvZXMgbm90IG1hdGNoIHRoZSBwcm92aWRlZCBzaGFwZSAoXCIrdCtcIikuIFwiKSxpc1R5cGVkQXJyYXkoZSl8fEFycmF5LmlzQXJyYXkoZSl8fChlPVtlXSksdD10fHxyLFRlbnNvci5tYWtlKHQse3ZhbHVlczp0b1R5cGVkQXJyYXkoZSxuLEVOVi5nZXQoXCJERUJVR1wiKSl9LG4pfWZ1bmN0aW9uIHNjYWxhcihlLHQpe2lmKHZvaWQgMD09PXQmJih0PVwiZmxvYXQzMlwiKSwoaXNUeXBlZEFycmF5KGUpfHxBcnJheS5pc0FycmF5KGUpKSYmXCJjb21wbGV4NjRcIiE9PXQpdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgY3JlYXRpbmcgYSBuZXcgU2NhbGFyOiB2YWx1ZSBtdXN0IGJlIGEgcHJpbWl0aXZlIChudW1iZXJ8Ym9vbGVhbilcIik7cmV0dXJuIHRlbnNvcihlLFtdLHQpfWZ1bmN0aW9uIHRlbnNvcjFkKGUsdCl7dm9pZCAwPT09dCYmKHQ9XCJmbG9hdDMyXCIpLGFzc2VydE5vbk51bGwoZSk7dmFyIG49aW5mZXJTaGFwZShlKTtpZigxIT09bi5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwidGVuc29yMWQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgYSBmbGF0L1R5cGVkQXJyYXlcIik7cmV0dXJuIHRlbnNvcihlLG4sdCl9ZnVuY3Rpb24gdGVuc29yMmQoZSx0LG4pe2lmKHZvaWQgMD09PW4mJihuPVwiZmxvYXQzMlwiKSxhc3NlcnROb25OdWxsKGUpLG51bGwhPXQmJjIhPT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJ0ZW5zb3IyZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGhhdmUgdHdvIG51bWJlcnNcIik7dmFyIHI9aW5mZXJTaGFwZShlKTtpZigyIT09ci5sZW5ndGgmJjEhPT1yLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJ0ZW5zb3IyZCgpIHJlcXVpcmVzIHZhbHVlcyB0byBiZSBudW1iZXJbXVtdIG9yIGZsYXQvVHlwZWRBcnJheVwiKTtpZigxPT09ci5sZW5ndGgmJm51bGw9PXQpdGhyb3cgbmV3IEVycm9yKFwidGVuc29yMmQoKSByZXF1aXJlcyBzaGFwZSB0byBiZSBwcm92aWRlZCB3aGVuIGB2YWx1ZXNgIGFyZSBhIGZsYXQvVHlwZWRBcnJheVwiKTtyZXR1cm4gdGVuc29yKGUsdD10fHxyLG4pfWZ1bmN0aW9uIHRlbnNvcjNkKGUsdCxuKXtpZih2b2lkIDA9PT1uJiYobj1cImZsb2F0MzJcIiksYXNzZXJ0Tm9uTnVsbChlKSxudWxsIT10JiYzIT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwidGVuc29yM2QoKSByZXF1aXJlcyBzaGFwZSB0byBoYXZlIHRocmVlIG51bWJlcnNcIik7dmFyIHI9aW5mZXJTaGFwZShlKTtpZigzIT09ci5sZW5ndGgmJjEhPT1yLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJ0ZW5zb3IzZCgpIHJlcXVpcmVzIHZhbHVlcyB0byBiZSBudW1iZXJbXVtdW10gb3IgZmxhdC9UeXBlZEFycmF5XCIpO2lmKDE9PT1yLmxlbmd0aCYmbnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoXCJ0ZW5zb3IzZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGJlIHByb3ZpZGVkIHdoZW4gYHZhbHVlc2AgYXJlIGEgZmxhdCBhcnJheVwiKTtyZXR1cm4gdGVuc29yKGUsdD10fHxyLG4pfWZ1bmN0aW9uIHRlbnNvcjRkKGUsdCxuKXtpZih2b2lkIDA9PT1uJiYobj1cImZsb2F0MzJcIiksYXNzZXJ0Tm9uTnVsbChlKSxudWxsIT10JiY0IT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwidGVuc29yNGQoKSByZXF1aXJlcyBzaGFwZSB0byBoYXZlIGZvdXIgbnVtYmVyc1wiKTt2YXIgcj1pbmZlclNoYXBlKGUpO2lmKDQhPT1yLmxlbmd0aCYmMSE9PXIubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcInRlbnNvcjRkKCkgcmVxdWlyZXMgdmFsdWVzIHRvIGJlIG51bWJlcltdW11bXVtdIG9yIGZsYXQvVHlwZWRBcnJheVwiKTtpZigxPT09ci5sZW5ndGgmJm51bGw9PXQpdGhyb3cgbmV3IEVycm9yKFwidGVuc29yNGQoKSByZXF1aXJlcyBzaGFwZSB0byBiZSBwcm92aWRlZCB3aGVuIGB2YWx1ZXNgIGFyZSBhIGZsYXQgYXJyYXlcIik7cmV0dXJuIHRlbnNvcihlLHQ9dHx8cixuKX1mdW5jdGlvbiB0ZW5zb3I1ZChlLHQsbil7aWYodm9pZCAwPT09biYmKG49XCJmbG9hdDMyXCIpLGFzc2VydE5vbk51bGwoZSksbnVsbCE9dCYmNSE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcInRlbnNvcjVkKCkgcmVxdWlyZXMgc2hhcGUgdG8gaGF2ZSBmaXZlIG51bWJlcnNcIik7dmFyIHI9aW5mZXJTaGFwZShlKTtpZig1IT09ci5sZW5ndGgmJjEhPT1yLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJ0ZW5zb3I1ZCgpIHJlcXVpcmVzIHZhbHVlcyB0byBiZSBudW1iZXJbXVtdW11bXVtdIG9yIGZsYXQvVHlwZWRBcnJheVwiKTtpZigxPT09ci5sZW5ndGgmJm51bGw9PXQpdGhyb3cgbmV3IEVycm9yKFwidGVuc29yNWQoKSByZXF1aXJlcyBzaGFwZSB0byBiZSBwcm92aWRlZCB3aGVuIGB2YWx1ZXNgIGFyZSBhIGZsYXQgYXJyYXlcIik7cmV0dXJuIHRlbnNvcihlLHQ9dHx8cixuKX1mdW5jdGlvbiB0ZW5zb3I2ZChlLHQsbil7aWYodm9pZCAwPT09biYmKG49XCJmbG9hdDMyXCIpLGFzc2VydE5vbk51bGwoZSksbnVsbCE9dCYmNiE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcInRlbnNvcjZkKCkgcmVxdWlyZXMgc2hhcGUgdG8gaGF2ZSBzaXggbnVtYmVyc1wiKTt2YXIgcj1pbmZlclNoYXBlKGUpO2lmKDYhPT1yLmxlbmd0aCYmMSE9PXIubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcInRlbnNvcjZkKCkgcmVxdWlyZXMgdmFsdWVzIHRvIGJlIG51bWJlcltdW11bXVtdIG9yIGZsYXQvVHlwZWRBcnJheVwiKTtpZigxPT09ci5sZW5ndGgmJm51bGw9PXQpdGhyb3cgbmV3IEVycm9yKFwidGVuc29yNmQoKSByZXF1aXJlcyBzaGFwZSB0byBiZSBwcm92aWRlZCB3aGVuIGB2YWx1ZXNgIGFyZSBhIGZsYXQgYXJyYXlcIik7cmV0dXJuIHRlbnNvcihlLHQ9dHx8cixuKX1mdW5jdGlvbiBvbmVzJDEoZSx0KXtpZih2b2lkIDA9PT10JiYodD1cImZsb2F0MzJcIiksXCJjb21wbGV4NjRcIj09PXQpe3ZhciBuPW9uZXMkMShlLFwiZmxvYXQzMlwiKSxyPW9uZXMkMShlLFwiZmxvYXQzMlwiKTtyZXR1cm4gY29tcGxleChuLHIpfXZhciBvPW1ha2VPbmVzVHlwZWRBcnJheShzaXplRnJvbVNoYXBlKGUpLHQpO3JldHVybiBUZW5zb3IubWFrZShlLHt2YWx1ZXM6b30sdCl9ZnVuY3Rpb24gemVyb3MoZSx0KXtpZih2b2lkIDA9PT10JiYodD1cImZsb2F0MzJcIiksXCJjb21wbGV4NjRcIj09PXQpe3ZhciBuPXplcm9zKGUsXCJmbG9hdDMyXCIpLHI9emVyb3MoZSxcImZsb2F0MzJcIik7cmV0dXJuIGNvbXBsZXgobixyKX12YXIgbz1tYWtlWmVyb3NUeXBlZEFycmF5KHNpemVGcm9tU2hhcGUoZSksdCk7cmV0dXJuIFRlbnNvci5tYWtlKGUse3ZhbHVlczpvfSx0KX1mdW5jdGlvbiBmaWxsKGUsdCxuKXt2b2lkIDA9PT1uJiYobj1cImZsb2F0MzJcIik7dmFyIHI9Z2V0VHlwZWRBcnJheUZyb21EVHlwZShuLHNpemVGcm9tU2hhcGUoZSkpO3JldHVybiByLmZpbGwodCksVGVuc29yLm1ha2UoZSx7dmFsdWVzOnJ9LG4pfWZ1bmN0aW9uIG9uZXNMaWtlXyhlKXt2YXIgdD1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcIm9uZXNMaWtlXCIpO3JldHVybiBvbmVzJDEodC5zaGFwZSx0LmR0eXBlKX1mdW5jdGlvbiB6ZXJvc0xpa2VfKGUpe3ZhciB0PWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwiemVyb3NMaWtlXCIpO3JldHVybiB6ZXJvcyh0LnNoYXBlLHQuZHR5cGUpfWZ1bmN0aW9uIGxpbnNwYWNlKGUsdCxuKXtpZigwPT09bil0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcmVxdWVzdCB6ZXJvIHNhbXBsZXNcIik7dmFyIHI9KHQtZSkvKG4tMSksbz1tYWtlWmVyb3NUeXBlZEFycmF5KG4sXCJmbG9hdDMyXCIpO29bMF09ZTtmb3IodmFyIGE9MTthPG8ubGVuZ3RoO2ErKylvW2FdPW9bYS0xXStyO3JldHVybiB0ZW5zb3IxZChvLFwiZmxvYXQzMlwiKX1mdW5jdGlvbiByYW5nZShlLHQsbixyKXtpZih2b2lkIDA9PT1uJiYobj0xKSx2b2lkIDA9PT1yJiYocj1cImZsb2F0MzJcIiksMD09PW4pdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGhhdmUgYSBzdGVwIG9mIHplcm9cIik7aWYoZT09PXR8fGU8dCYmbjwwfHx0PGUmJm4+MSlyZXR1cm4gemVyb3MoWzBdLHIpO3ZhciBvPW1ha2VaZXJvc1R5cGVkQXJyYXkoTWF0aC5hYnMoTWF0aC5jZWlsKCh0LWUpL24pKSxyKTt0PGUmJjE9PT1uJiYobj0tMSksb1swXT1lO2Zvcih2YXIgYT0xO2E8by5sZW5ndGg7YSsrKW9bYV09b1thLTFdK247cmV0dXJuIHRlbnNvcjFkKG8scil9dmFyIERUeXBlLFJhbmssVXBjYXN0SW50MzJBbmRNYXAsVXBjYXN0Qm9vbEFuZE1hcCxVcGNhc3RGbG9hdDMyQW5kTWFwLFVwY2FzdENvbXBsZXg2NEFuZE1hcCxvbmVzTGlrZT1vcCh7b25lc0xpa2VfOm9uZXNMaWtlX30pLHplcm9zTGlrZT1vcCh7emVyb3NMaWtlXzp6ZXJvc0xpa2VffSk7IWZ1bmN0aW9uKGUpe2UuZmxvYXQzMj1cImZsb2F0MzJcIixlLmludDMyPVwiaW50MzJcIixlLmJvb2w9XCJib29sXCJ9KERUeXBlfHwoRFR5cGU9e30pKSxmdW5jdGlvbihlKXtlLlIwPVwiUjBcIixlLlIxPVwiUjFcIixlLlIyPVwiUjJcIixlLlIzPVwiUjNcIixlLlI0PVwiUjRcIixlLlI1PVwiUjVcIixlLlI2PVwiUjZcIn0oUmFua3x8KFJhbms9e30pKSxmdW5jdGlvbihlKXtlLmZsb2F0MzI9XCJmbG9hdDMyXCIsZS5pbnQzMj1cImludDMyXCIsZS5ib29sPVwiaW50MzJcIixlLmNvbXBsZXg2ND1cImNvbXBsZXg2NFwifShVcGNhc3RJbnQzMkFuZE1hcHx8KFVwY2FzdEludDMyQW5kTWFwPXt9KSksZnVuY3Rpb24oZSl7ZS5mbG9hdDMyPVwiZmxvYXQzMlwiLGUuaW50MzI9XCJpbnQzMlwiLGUuYm9vbD1cImJvb2xcIixlLmNvbXBsZXg2ND1cImNvbXBsZXg2NFwifShVcGNhc3RCb29sQW5kTWFwfHwoVXBjYXN0Qm9vbEFuZE1hcD17fSkpLGZ1bmN0aW9uKGUpe2UuZmxvYXQzMj1cImZsb2F0MzJcIixlLmludDMyPVwiZmxvYXQzMlwiLGUuYm9vbD1cImZsb2F0MzJcIixlLmNvbXBsZXg2ND1cImNvbXBsZXg2NFwifShVcGNhc3RGbG9hdDMyQW5kTWFwfHwoVXBjYXN0RmxvYXQzMkFuZE1hcD17fSkpLGZ1bmN0aW9uKGUpe2UuZmxvYXQzMj1cImNvbXBsZXg2NFwiLGUuaW50MzI9XCJjb21wbGV4NjRcIixlLmJvb2w9XCJjb21wbGV4NjRcIixlLmNvbXBsZXg2ND1cImNvbXBsZXg2NFwifShVcGNhc3RDb21wbGV4NjRBbmRNYXB8fChVcGNhc3RDb21wbGV4NjRBbmRNYXA9e30pKTt2YXIgdXBjYXN0VHlwZU1hcD17ZmxvYXQzMjpVcGNhc3RGbG9hdDMyQW5kTWFwLGludDMyOlVwY2FzdEludDMyQW5kTWFwLGJvb2w6VXBjYXN0Qm9vbEFuZE1hcCxjb21wbGV4NjQ6VXBjYXN0Q29tcGxleDY0QW5kTWFwfTtmdW5jdGlvbiB1cGNhc3RUeXBlKGUsdCl7cmV0dXJuIHVwY2FzdFR5cGVNYXBbZV1bdF19ZnVuY3Rpb24gc3VtT3V0VHlwZShlKXtyZXR1cm4gdXBjYXN0VHlwZShlLFwiaW50MzJcIil9dmFyIERhdGFTdG9yYWdlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0aGlzLmRhdGFNb3Zlcj1lLHRoaXMuZGF0YT1uZXcgV2Vha01hcH1yZXR1cm4gZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmRhdGEuaGFzKGUpfHx0aGlzLmRhdGFNb3Zlci5tb3ZlRGF0YShlKSx0aGlzLmRhdGEuZ2V0KGUpfSxlLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oZSx0KXt0aGlzLmRhdGEuc2V0KGUsdCl9LGUucHJvdG90eXBlLmhhcz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5kYXRhLmhhcyhlKX0sZS5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmRhdGEuZGVsZXRlKGUpfSxlfSgpO2Z1bmN0aW9uIGNhc3RUZW5zb3IoZSx0LG4pe2lmKFwiY29tcGxleDY0XCI9PT10KXtpZihcImNvbXBsZXg2NFwiPT09ZS5kdHlwZSlyZXR1cm4gZS5jbG9uZSgpO3ZhciByPXplcm9zKGUuc2hhcGUpLG89ZS50b0Zsb2F0KCksYT1uLmNvbXBsZXgobyxyKTtyZXR1cm4gci5kaXNwb3NlKCksby5kaXNwb3NlKCksYX1pZighaGFzRW5jb2RpbmdMb3NzKGUuZHR5cGUsdCkpcmV0dXJuIFRlbnNvci5tYWtlKGUuc2hhcGUse2RhdGFJZDplLmRhdGFJZH0sdCk7aWYoXCJjb21wbGV4NjRcIj09PWUuZHR5cGUpe3ZhciBpPW4ucmVhbChlKTthPWkuY2FzdCh0KTtyZXR1cm4gaS5kaXNwb3NlKCksYX1pZihcImludDMyXCI9PT10KXJldHVybiBuLmludChlKTtpZihcImJvb2xcIj09PXQpe3ZhciBzPXNjYWxhcigwLGUuZHR5cGUpO2E9bi5ub3RFcXVhbChlLHMpO3JldHVybiBzLmRpc3Bvc2UoKSxhfXRocm93IG5ldyBFcnJvcihcIkVycm9yIGluIENhc3Q6IHVua25vd24gZHR5cGUgYXJndW1lbnQgKFwiK3QrXCIpXCIpfWZ1bmN0aW9uIHJlc2hhcGVUZW5zb3IoZSx0KXtyZXR1cm4gVGVuc29yLm1ha2UodCx7ZGF0YUlkOmUuZGF0YUlkfSxlLmR0eXBlKX1mdW5jdGlvbiBtZXJnZVJlYWxBbmRJbWFnQXJyYXlzKGUsdCl7aWYoZS5sZW5ndGghPT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgbWVyZ2UgcmVhbCBhbmQgaW1hZyBhcnJheXMgb2YgZGlmZmVyZW50IGxlbmd0aHMuIHJlYWw6XCIrZS5sZW5ndGgrXCIsIGltYWc6IFwiK3QubGVuZ3RoK1wiLlwiKTtmb3IodmFyIG49bmV3IEZsb2F0MzJBcnJheSgyKmUubGVuZ3RoKSxyPTA7cjxuLmxlbmd0aDtyKz0yKW5bcl09ZVtyLzJdLG5bcisxXT10W3IvMl07cmV0dXJuIG59ZnVuY3Rpb24gc3BsaXRSZWFsQW5kSW1hZ0FycmF5cyhlKXtmb3IodmFyIHQ9bmV3IEZsb2F0MzJBcnJheShlLmxlbmd0aC8yKSxuPW5ldyBGbG9hdDMyQXJyYXkoZS5sZW5ndGgvMikscj0wO3I8ZS5sZW5ndGg7cis9Mil0W3IvMl09ZVtyXSxuW3IvMl09ZVtyKzFdO3JldHVybntyZWFsOnQsaW1hZzpufX1mdW5jdGlvbiBjb21wbGV4V2l0aEV2ZW5JbmRleChlKXtmb3IodmFyIHQ9TWF0aC5jZWlsKGUubGVuZ3RoLzQpLG49bmV3IEZsb2F0MzJBcnJheSh0KSxyPW5ldyBGbG9hdDMyQXJyYXkodCksbz0wO288ZS5sZW5ndGg7bys9NCluW01hdGguZmxvb3Ioby80KV09ZVtvXSxyW01hdGguZmxvb3Ioby80KV09ZVtvKzFdO3JldHVybntyZWFsOm4saW1hZzpyfX1mdW5jdGlvbiBjb21wbGV4V2l0aE9kZEluZGV4KGUpe2Zvcih2YXIgdD1NYXRoLmZsb29yKGUubGVuZ3RoLzQpLG49bmV3IEZsb2F0MzJBcnJheSh0KSxyPW5ldyBGbG9hdDMyQXJyYXkodCksbz0yO288ZS5sZW5ndGg7bys9NCluW01hdGguZmxvb3Ioby80KV09ZVtvXSxyW01hdGguZmxvb3Ioby80KV09ZVtvKzFdO3JldHVybntyZWFsOm4saW1hZzpyfX1mdW5jdGlvbiBnZXRDb21wbGV4V2l0aEluZGV4KGUsdCl7cmV0dXJue3JlYWw6ZVsyKnRdLGltYWc6ZVsyKnQrMV19fWZ1bmN0aW9uIGFzc2lnblRvVHlwZWRBcnJheShlLHQsbixyKXtlWzIqcl09dCxlWzIqcisxXT1ufWZ1bmN0aW9uIGV4cG9uZW50cyhlKXtmb3IodmFyIHQ9bmV3IEZsb2F0MzJBcnJheShlLzIpLG49bmV3IEZsb2F0MzJBcnJheShlLzIpLHI9MDtyPE1hdGguY2VpbChlLzIpO3IrKyl7dmFyIG89LTIqTWF0aC5QSSooci9lKTt0W3JdPU1hdGguY29zKG8pLG5bcl09TWF0aC5zaW4obyl9cmV0dXJue3JlYWw6dCxpbWFnOm59fWZ1bmN0aW9uIGV4cG9uZW50KGUsdCl7dmFyIG49LTIqTWF0aC5QSSooZS90KTtyZXR1cm57cmVhbDpNYXRoLmNvcyhuKSxpbWFnOk1hdGguc2luKG4pfX1mdW5jdGlvbiBub25NYXhTdXBwcmVzc2lvbkltcGwoZSx0LG4scixvKXtmb3IodmFyIGE9QXJyYXkuZnJvbSh0KS5tYXAoZnVuY3Rpb24oZSx0KXtyZXR1cm57c2NvcmU6ZSxib3hJbmRleDp0fX0pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZS5zY29yZT5vfSkuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiB0LnNjb3JlLWUuc2NvcmV9KSxpPVtdLHM9MDtzPGEubGVuZ3RoO3MrKyl7dmFyIHU9YVtzXSxsPXUuc2NvcmUsYz11LmJveEluZGV4O2lmKGw8bylicmVhaztmb3IodmFyIHA9ITEsZD1pLmxlbmd0aC0xO2Q+PTA7LS1kKXtpZihpbnRlcnNlY3Rpb25PdmVyVW5pb24oZSxjLGlbZF0pPj1yKXtwPSEwO2JyZWFrfX1pZighcCYmKGkucHVzaChjKSxpLmxlbmd0aD49bikpYnJlYWt9cmV0dXJuIHRlbnNvcjFkKGksXCJpbnQzMlwiKX1mdW5jdGlvbiBpbnRlcnNlY3Rpb25PdmVyVW5pb24oZSx0LG4pe3ZhciByPWUuc3ViYXJyYXkoNCp0LDQqdCs0KSxvPWUuc3ViYXJyYXkoNCpuLDQqbis0KSxhPU1hdGgubWluKHJbMF0sclsyXSksaT1NYXRoLm1pbihyWzFdLHJbM10pLHM9TWF0aC5tYXgoclswXSxyWzJdKSx1PU1hdGgubWF4KHJbMV0sclszXSksbD1NYXRoLm1pbihvWzBdLG9bMl0pLGM9TWF0aC5taW4ob1sxXSxvWzNdKSxwPU1hdGgubWF4KG9bMF0sb1syXSksZD1NYXRoLm1heChvWzFdLG9bM10pLGg9KHMtYSkqKHUtaSksZj0ocC1sKSooZC1jKTtpZihoPD0wfHxmPD0wKXJldHVybiAwO3ZhciBtPU1hdGgubWF4KGEsbCksZz1NYXRoLm1heChpLGMpLHY9TWF0aC5taW4ocyxwKSx4PU1hdGgubWluKHUsZCkseT1NYXRoLm1heCh2LW0sMCkqTWF0aC5tYXgoeC1nLDApO3JldHVybiB5LyhoK2YteSl9ZnVuY3Rpb24gc3BsaXQoZSx0LG4pe3ZhciByPUFycmF5KGUucmFuaykuZmlsbCgwKSxvPWUuc2hhcGUuc2xpY2UoKTtyZXR1cm4gdC5tYXAoZnVuY3Rpb24odCl7b1tuXT10O3ZhciBhPWUuc2xpY2UocixvKTtyZXR1cm4gcltuXSs9dCxhfSl9ZnVuY3Rpb24gdG9wa0ltcGwoZSx0LG4scixvKXtmb3IodmFyIGE9dFt0Lmxlbmd0aC0xXSxpPVtlLmxlbmd0aC9hLGFdLHM9aVswXSx1PWlbMV0sbD1nZXRUeXBlZEFycmF5RnJvbURUeXBlKG4scypyKSxjPWdldFR5cGVkQXJyYXlGcm9tRFR5cGUoXCJpbnQzMlwiLHMqcikscD0wO3A8cztwKyspe2Zvcih2YXIgZD1wKnUsaD1lLnN1YmFycmF5KGQsZCt1KSxmPVtdLG09MDttPGgubGVuZ3RoO20rKylmLnB1c2goe3ZhbHVlOmhbbV0saW5kZXg6bX0pO2Yuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiB0LnZhbHVlLWUudmFsdWV9KTt2YXIgZz1wKnIsdj1sLnN1YmFycmF5KGcsZytyKSx4PWMuc3ViYXJyYXkoZyxnK3IpO2ZvcihtPTA7bTxyO20rKyl2W21dPWZbbV0udmFsdWUseFttXT1mW21dLmluZGV4fXZhciB5PXQuc2xpY2UoKTtyZXR1cm4geVt5Lmxlbmd0aC0xXT1yLFt0ZW5zb3IobCx5LG4pLHRlbnNvcihjLHksXCJpbnQzMlwiKV19dmFyIEFyZ01pbk1heFByb2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe3RoaXMudmFyaWFibGVOYW1lcz1bXCJBXCJdO3ZhciByPWUud2luZG93U2l6ZSxvPWUuYmF0Y2hTaXplLGE9ZS5pblNpemUsaT1NYXRoLmNlaWwoYS9yKTtufHx0aGlzLnZhcmlhYmxlTmFtZXMucHVzaChcImJlc3RJbmRpY2VzQVwiKSx0aGlzLm91dHB1dFNoYXBlPVtvLGldO3ZhciBzPVwibWF4XCI9PT10P1wiPlwiOlwiPFwiLHU9bj9cImluT2Zmc2V0ICsgaTtcIjpcInJvdW5kKGdldEJlc3RJbmRpY2VzQShiYXRjaCwgaW5PZmZzZXQgKyBpKSk7XCI7dGhpcy51c2VyQ29kZT1cIlxcbiAgICAgIHZvaWQgbWFpbigpIHtcXG4gICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xcbiAgICAgICAgaW50IG91dElkeCA9IGNvb3Jkc1sxXTtcXG4gICAgICAgIGludCBpbk9mZnNldCA9IG91dElkeCAqIFwiK3IrXCI7XFxuXFxuICAgICAgICBpbnQgYmVzdEluZGV4ID0gaW5PZmZzZXQ7XFxuICAgICAgICBmbG9hdCBiZXN0VmFsdWUgPSBnZXRBKGJhdGNoLCBiZXN0SW5kZXgpO1xcblxcbiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBcIityK1wiOyBpKyspIHtcXG4gICAgICAgICAgaW50IGluSWR4ID0gXCIrdStcIjtcXG4gICAgICAgICAgZmxvYXQgY2FuZGlkYXRlID0gZ2V0QShiYXRjaCwgaW5JZHgpO1xcbiAgICAgICAgICBpZiAoY2FuZGlkYXRlIFwiK3MrXCIgYmVzdFZhbHVlKSB7XFxuICAgICAgICAgICAgYmVzdFZhbHVlID0gY2FuZGlkYXRlO1xcbiAgICAgICAgICAgIGJlc3RJbmRleCA9IGluSWR4O1xcbiAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBzZXRPdXRwdXQoZmxvYXQoYmVzdEluZGV4KSk7XFxuICAgICAgfVxcbiAgICBcIn19KCksQXZnUG9vbDJEQmFja3Byb3BQcm9ncmFtPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3RoaXMudmFyaWFibGVOYW1lcz1bXCJkeVwiXSx0aGlzLm91dHB1dFNoYXBlPWUuaW5TaGFwZTt2YXIgdD1lLmZpbHRlckhlaWdodCxuPWUuZmlsdGVyV2lkdGgscj1lLnN0cmlkZUhlaWdodCxvPWUuc3RyaWRlV2lkdGgsYT10LTEtZS5wYWRJbmZvLnRvcCxpPW4tMS1lLnBhZEluZm8ubGVmdCxzPTEvKHQqbik7dGhpcy51c2VyQ29kZT1cIlxcbiAgICAgIGNvbnN0IGl2ZWMyIHBhZHMgPSBpdmVjMihcIithK1wiLCBcIitpK1wiKTtcXG4gICAgICBjb25zdCBmbG9hdCBhdmdNdWx0aXBsaWVyID0gZmxvYXQoXCIrcytcIik7XFxuXFxuICAgICAgdm9pZCBtYWluKCkge1xcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XFxuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcXG4gICAgICAgIGludCBkID0gY29vcmRzWzNdO1xcblxcbiAgICAgICAgaXZlYzIgZHlSQ0Nvcm5lciA9IGNvb3Jkcy55eiAtIHBhZHM7XFxuICAgICAgICBpbnQgZHlSQ29ybmVyID0gZHlSQ0Nvcm5lci54O1xcbiAgICAgICAgaW50IGR5Q0Nvcm5lciA9IGR5UkNDb3JuZXIueTtcXG5cXG4gICAgICAgIC8vIENvbnZvbHZlIGR5KD8sID8sIGQpIHdpdGggcG9zIG1hc2soOiwgOiwgZCkgdG8gZ2V0IGR4KHhSLCB4QywgZCkuXFxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XFxuICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgXCIrdCtcIjsgd1IrKykge1xcbiAgICAgICAgICBmbG9hdCBkeVIgPSBmbG9hdChkeVJDb3JuZXIgKyB3UikgLyBcIityK1wiLjA7XFxuXFxuICAgICAgICAgIGlmIChkeVIgPCAwLjAgfHwgZHlSID49IFwiK2Uub3V0SGVpZ2h0K1wiLjAgfHwgZnJhY3QoZHlSKSA+IDAuMCkge1xcbiAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XFxuXFxuICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCBcIituK1wiOyB3QysrKSB7XFxuICAgICAgICAgICAgZmxvYXQgZHlDID0gZmxvYXQoZHlDQ29ybmVyICsgd0MpIC8gXCIrbytcIi4wO1xcblxcbiAgICAgICAgICAgIGlmIChkeUMgPCAwLjAgfHwgZHlDID49IFwiK2Uub3V0V2lkdGgrXCIuMCB8fFxcbiAgICAgICAgICAgICAgICBmcmFjdChkeUMpID4gMC4wKSB7XFxuICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaW50IGlkeUMgPSBpbnQoZHlDKTtcXG5cXG4gICAgICAgICAgICBmbG9hdCBkeVZhbHVlID0gZ2V0RHkoYiwgaWR5UiwgaWR5QywgZCk7XFxuXFxuICAgICAgICAgICAgZG90UHJvZCArPSBkeVZhbHVlICogYXZnTXVsdGlwbGllcjtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xcbiAgICAgIH1cXG4gICAgXCJ9fSgpO2Z1bmN0aW9uIGdldEJyb2FkY2FzdERpbXMoZSx0KXtmb3IodmFyIG49ZS5sZW5ndGgscj1bXSxvPTA7bzxuO28rKyl7dmFyIGE9bi0xLW8saT1lW2FdfHwxOyh0W3QubGVuZ3RoLTEtb118fDEpPjEmJjE9PT1pJiZyLnVuc2hpZnQoYSl9cmV0dXJuIHJ9ZnVuY3Rpb24gZ2V0UmVkdWN0aW9uQXhlcyhlLHQpe2Zvcih2YXIgbj1bXSxyPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBvPWVbZS5sZW5ndGgtci0xXSxhPXQubGVuZ3RoLXItMSxpPXRbYV07KG51bGw9PW98fDE9PT1vJiZpPjEpJiZuLnVuc2hpZnQoYSl9cmV0dXJuIG59ZnVuY3Rpb24gYnJvYWRjYXN0RGltc0FyZU91dGVyKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKWlmKGVbdF0hPT10KXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKGUsdCl7Zm9yKHZhciBuPVtdLHI9TWF0aC5tYXgoZS5sZW5ndGgsdC5sZW5ndGgpLG89MDtvPHI7bysrKXt2YXIgYT1lW2UubGVuZ3RoLW8tMV07bnVsbD09YSYmKGE9MSk7dmFyIGk9dFt0Lmxlbmd0aC1vLTFdO2lmKG51bGw9PWkmJihpPTEpLDE9PT1hKW4udW5zaGlmdChpKTtlbHNlIGlmKDE9PT1pKW4udW5zaGlmdChhKTtlbHNle2lmKGEhPT1pKXRocm93IEVycm9yKFwiT3BlcmFuZHMgY291bGQgbm90IGJlIGJyb2FkY2FzdCB0b2dldGhlciB3aXRoIHNoYXBlcyBcIitlK1wiIGFuZCBcIit0K1wiLlwiKTtuLnVuc2hpZnQoYSl9fXJldHVybiBufXZhciBCYXRjaE5vcm1Qcm9ncmFtPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIsbyxhKXt0aGlzLm91dHB1dFNoYXBlPVtdLHRoaXMuc3VwcG9ydHNCcm9hZGNhc3Rpbmc9ITAsdGhpcy52YXJpYWJsZU5hbWVzPVtcInhcIixcIm1lYW5cIixcInZhcmlhbmNlXCJdLGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKGUsdCksYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoZSxuKTt2YXIgaT1cIjAuMFwiO251bGwhPXImJihhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShlLHIpLHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKFwib2Zmc2V0XCIpLGk9XCJnZXRPZmZzZXRBdE91dENvb3JkcygpXCIpO3ZhciBzPVwiMS4wXCI7bnVsbCE9byYmKGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKGUsbyksdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goXCJzY2FsZVwiKSxzPVwiZ2V0U2NhbGVBdE91dENvb3JkcygpXCIpLHRoaXMub3V0cHV0U2hhcGU9ZSx0aGlzLnVzZXJDb2RlPVwiXFxuICAgICAgdm9pZCBtYWluKCkge1xcbiAgICAgICAgZmxvYXQgeCA9IGdldFhBdE91dENvb3JkcygpO1xcbiAgICAgICAgZmxvYXQgbWVhbiA9IGdldE1lYW5BdE91dENvb3JkcygpO1xcbiAgICAgICAgZmxvYXQgdmFyaWFuY2UgPSBnZXRWYXJpYW5jZUF0T3V0Q29vcmRzKCk7XFxuICAgICAgICBmbG9hdCBvZmZzZXQgPSBcIitpK1wiO1xcbiAgICAgICAgZmxvYXQgc2NhbGUgPSBcIitzK1wiO1xcbiAgICAgICAgZmxvYXQgaW52ID0gc2NhbGUgKiBpbnZlcnNlc3FydCh2YXJpYW5jZSArIGZsb2F0KFwiK2ErXCIpKTtcXG4gICAgICAgIHNldE91dHB1dChkb3QodmVjMyh4LCAtbWVhbiwgb2Zmc2V0KSwgdmVjMyhpbnYsIGludiwgMSkpKTtcXG4gICAgICB9XFxuICAgIFwifX0oKSxDT01QTEVYX01VTFRJUExZPXtSRUFMOlwicmV0dXJuIGFyZWFsICogYnJlYWwgLSBhaW1hZyAqIGJpbWFnO1wiLElNQUc6XCJyZXR1cm4gYXJlYWwgKiBiaW1hZyArIGFpbWFnICogYnJlYWw7XCJ9LEJpbmFyeU9wQ29tcGxleFByb2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe3RoaXMudmFyaWFibGVOYW1lcz1bXCJBUmVhbFwiLFwiQUltYWdcIixcIkJSZWFsXCIsXCJCSW1hZ1wiXSx0aGlzLnN1cHBvcnRzQnJvYWRjYXN0aW5nPSEwLHRoaXMub3V0cHV0U2hhcGU9YXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUodCxuKSx0aGlzLnVzZXJDb2RlPVwiXFxuICAgICAgZmxvYXQgYmluYXJ5T3BDb21wbGV4KFxcbiAgICAgICAgICBmbG9hdCBhcmVhbCwgZmxvYXQgYWltYWcsIGZsb2F0IGJyZWFsLCBmbG9hdCBiaW1hZykge1xcbiAgICAgICAgXCIrZStcIlxcbiAgICAgIH1cXG5cXG4gICAgICB2b2lkIG1haW4oKSB7XFxuICAgICAgICBmbG9hdCBhcmVhbCA9IGdldEFSZWFsQXRPdXRDb29yZHMoKTtcXG4gICAgICAgIGZsb2F0IGFpbWFnID0gZ2V0QUltYWdBdE91dENvb3JkcygpO1xcbiAgICAgICAgZmxvYXQgYnJlYWwgPSBnZXRCUmVhbEF0T3V0Q29vcmRzKCk7XFxuICAgICAgICBmbG9hdCBiaW1hZyA9IGdldEJJbWFnQXRPdXRDb29yZHMoKTtcXG4gICAgICAgIHNldE91dHB1dChiaW5hcnlPcENvbXBsZXgoYXJlYWwsIGFpbWFnLCBicmVhbCwgYmltYWcpKTtcXG4gICAgICB9XFxuICAgIFwifX0oKSxDSEVDS19OQU5fU05JUFBFVD1cIlxcbiAgaWYgKGlzTmFOKGEpKSByZXR1cm4gYTtcXG4gIGlmIChpc05hTihiKSkgcmV0dXJuIGI7XFxuXCIsQUREPVwicmV0dXJuIGEgKyBiO1wiLFNVQj1cInJldHVybiBhIC0gYjtcIixNVUw9XCJyZXR1cm4gYSAqIGI7XCIsRElWPVwiaWYgKGEgPT0gYikgcmV0dXJuIDEuMDtcXG4gIHJldHVybiBhIC8gYjtcIixJTlRfRElWPVwiXFxuICBmbG9hdCByZXN1bHRTaWduID0gc2lnbihhKSAqIHNpZ24oYik7XFxuICBpbnQgaWEgPSByb3VuZChhKTtcXG4gIGludCBpYiA9IHJvdW5kKGIpO1xcbiAgaW50IHJlc3VsdCA9IGlhIC8gaWI7XFxuICBpbnQgYW1vZGIgPSBpYSAtIGliICogcmVzdWx0O1xcblxcbiAgaWYgKHJlc3VsdFNpZ24gPCAwLjAgJiYgYW1vZGIgIT0gMCkge1xcbiAgICByZXN1bHQgLT0gMTtcXG4gIH1cXG4gIHJldHVybiBmbG9hdChyZXN1bHQpO1xcblwiLFBPVz1cIlxcbmlmKGEgPCAwLjAgJiYgZmxvb3IoYikgPCBiKXtcXG4gIHJldHVybiBOQU47XFxufVxcbnJldHVybiAocm91bmQobW9kKGIsIDIuMCkpID09IDAgfHwgcm91bmQobW9kKGIsIDIuMCkpID09IDIpID9cXG4gICAgcG93KGFicyhhKSwgYikgOiBzaWduKGEpICogcG93KGFicyhhKSwgYik7XFxuXCIsU1FVQVJFRF9ESUZGRVJFTkNFPVwicmV0dXJuIChhIC0gYikgKiAoYSAtIGIpO1wiLEVRVUFMPVwicmV0dXJuIGZsb2F0KGEgPT0gYik7XCIsTk9UX0VRVUFMPVwicmV0dXJuIGZsb2F0KGEgIT0gYik7XCIsTEVTUz1cInJldHVybiBmbG9hdChhIDwgYik7XCIsTEVTU19FUVVBTD1cInJldHVybiBmbG9hdChhIDw9IGIpO1wiLEdSRUFURVI9XCJyZXR1cm4gZmxvYXQoYSA+IGIpO1wiLEdSRUFURVJfRVFVQUw9XCJyZXR1cm4gZmxvYXQoYSA+PSBiKTtcIixMT0dJQ0FMX0FORD1cInJldHVybiBmbG9hdChhID49IDEuMCAmJiBiID49IDEuMCk7XCIsTE9HSUNBTF9PUj1cInJldHVybiBmbG9hdChhID49IDEuMCB8fCBiID49IDEuMCk7XCIsTUFYPUNIRUNLX05BTl9TTklQUEVUK1wiXFxuICByZXR1cm4gbWF4KGEsIGIpO1xcblwiLE1JTj1DSEVDS19OQU5fU05JUFBFVCtcIlxcbiAgcmV0dXJuIG1pbihhLCBiKTtcXG5cIixNT0Q9XCJpZiAoYiA9PSAwLjApIHJldHVybiBOQU47XFxuICByZXR1cm4gbW9kKGEsIGIpO1wiLEFUQU4yPUNIRUNLX05BTl9TTklQUEVUK1wiXFxuICByZXR1cm4gYXRhbihhLCBiKTtcXG5cIixFTFVfREVSPVwicmV0dXJuIChiID49IDEuMCkgPyBhIDogYSAqIChiICsgMS4wKTtcIixCaW5hcnlPcFByb2dyYW09ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCxuKXt0aGlzLnZhcmlhYmxlTmFtZXM9W1wiQVwiLFwiQlwiXSx0aGlzLnN1cHBvcnRzQnJvYWRjYXN0aW5nPSEwLHRoaXMub3V0cHV0U2hhcGU9YXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUodCxuKSx0aGlzLnVzZXJDb2RlPVwiXFxuICAgICAgdW5pZm9ybSBmbG9hdCBOQU47XFxuICAgICAgZmxvYXQgYmluYXJ5T3BlcmF0aW9uKGZsb2F0IGEsIGZsb2F0IGIpIHtcXG4gICAgICAgIFwiK2UrXCJcXG4gICAgICB9XFxuXFxuICAgICAgdm9pZCBtYWluKCkge1xcbiAgICAgICAgZmxvYXQgYSA9IGdldEFBdE91dENvb3JkcygpO1xcbiAgICAgICAgZmxvYXQgYiA9IGdldEJBdE91dENvb3JkcygpO1xcbiAgICAgICAgc2V0T3V0cHV0KGJpbmFyeU9wZXJhdGlvbihhLCBiKSk7XFxuICAgICAgfVxcbiAgICBcIn1yZXR1cm4gZS5wcm90b3R5cGUuZ2V0Q3VzdG9tU2V0dXBGdW5jPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gZnVuY3Rpb24odCxuKXtudWxsPT1lLnN0YXJ0TG9jJiYoZS5zdGFydExvYz10LmdldFVuaWZvcm1Mb2NhdGlvbk5vVGhyb3cobixcIk5BTlwiKSxudWxsPT1lLnN0YXJ0TG9jKXx8dC5nbC51bmlmb3JtMWYoZS5zdGFydExvYyxOYU4pfX0sZX0oKSxDbGlwUHJvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLHQsbil7dGhpcy52YXJpYWJsZU5hbWVzPVtcIkFcIl0sdGhpcy5vdXRwdXRTaGFwZT1lLHRoaXMudXNlckNvZGU9XCJcXG4gICAgICB2b2lkIG1haW4oKSB7XFxuICAgICAgICBmbG9hdCB2YWx1ZSA9IGdldEFBdE91dENvb3JkcygpO1xcbiAgICAgICAgaWYgKGlzTmFOKHZhbHVlKSkge1xcbiAgICAgICAgICBzZXRPdXRwdXQodmFsdWUpO1xcbiAgICAgICAgICByZXR1cm47XFxuICAgICAgICB9XFxuXFxuICAgICAgICBzZXRPdXRwdXQoY2xhbXAodmFsdWUsIGZsb2F0KFwiK3QrXCIpLCBmbG9hdChcIituK1wiKSkpO1xcbiAgICAgIH1cXG4gICAgXCJ9fSgpLENvbmNhdFByb2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt0aGlzLnZhcmlhYmxlTmFtZXM9W1wiQVwiLFwiQlwiXSx0aGlzLm91dHB1dFNoYXBlPVtdLHRoaXMub3V0cHV0U2hhcGU9Y29tcHV0ZU91dFNoYXBlKFtlLHRdLDEpLHRoaXMudXNlckNvZGU9XCJcXG4gICAgICB2b2lkIG1haW4oKSB7XFxuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcXG4gICAgICAgIGludCB5UiA9IGNvb3Jkcy54O1xcbiAgICAgICAgaW50IHlDID0gY29vcmRzLnk7XFxuXFxuICAgICAgICBmbG9hdCB2YWx1ZSA9IDAuMDtcXG4gICAgICAgIGlmICh5QyA8IFwiK2VbMV0rXCIpIHtcXG4gICAgICAgICAgdmFsdWUgPSBnZXRBKHlSLCB5Qyk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICB5QyAtPSBcIitlWzFdK1wiO1xcbiAgICAgICAgICB2YWx1ZSA9IGdldEIoeVIsIHlDKTtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIHNldE91dHB1dCh2YWx1ZSk7XFxuICAgICAgfVxcbiAgICBcIn19KCksQ29udjJERGVyRmlsdGVyUHJvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXt0aGlzLnZhcmlhYmxlTmFtZXM9W1wieFwiLFwiZHlcIl0sdGhpcy5vdXRwdXRTaGFwZT1lLmZpbHRlclNoYXBlO3ZhciB0PWUuc3RyaWRlSGVpZ2h0LG49ZS5zdHJpZGVXaWR0aCxyPWUucGFkSW5mby50b3Asbz1lLnBhZEluZm8ubGVmdDt0aGlzLnVzZXJDb2RlPVwiXFxuICAgICAgdm9pZCBtYWluKCkge1xcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XFxuICAgICAgICBpbnQgd1IgPSBjb29yZHMueDtcXG4gICAgICAgIGludCB3QyA9IGNvb3Jkcy55O1xcbiAgICAgICAgaW50IGQxID0gY29vcmRzLno7XFxuICAgICAgICBpbnQgZDIgPSBjb29yZHMudztcXG5cXG4gICAgICAgIC8vIENvbnZvbHZlIHgoPywgPywgZDEpIHdpdGggZHkoOiwgOiwgZDIpIHRvIGdldCBkdyh3Uiwgd0MsIGQxLCBkMikuXFxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XFxuXFxuICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8IFwiK2UuYmF0Y2hTaXplK1wiOyBiKyspIHtcXG4gICAgICAgICAgZm9yIChpbnQgeVIgPSAwOyB5UiA8IFwiK2Uub3V0SGVpZ2h0K1wiOyB5UisrKSB7XFxuICAgICAgICAgICAgaW50IHhSID0gd1IgKyB5UiAqIFwiK3QrXCIgLSBcIityK1wiO1xcblxcbiAgICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gXCIrZS5pbkhlaWdodCtcIikge1xcbiAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIGZvciAoaW50IHlDID0gMDsgeUMgPCBcIitlLm91dFdpZHRoK1wiOyB5QysrKSB7XFxuICAgICAgICAgICAgICBpbnQgeEMgPSB3QyArIHlDICogXCIrbitcIiAtIFwiK28rXCI7XFxuXFxuICAgICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49IFwiK2UuaW5XaWR0aCtcIikge1xcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICAgIGZsb2F0IGR5VmFsdWUgPSBnZXREeShiLCB5UiwgeUMsIGQyKTtcXG4gICAgICAgICAgICAgIGZsb2F0IHhWYWx1ZSA9IGdldFgoYiwgeFIsIHhDLCBkMSk7XFxuICAgICAgICAgICAgICBkb3RQcm9kICs9ICh4VmFsdWUgKiBkeVZhbHVlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHNldE91dHB1dChkb3RQcm9kKTtcXG4gICAgICB9XFxuICAgIFwifX0oKSxDb252MkREZXJJbnB1dFByb2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSl7dGhpcy52YXJpYWJsZU5hbWVzPVtcImR5XCIsXCJXXCJdLHRoaXMub3V0cHV0U2hhcGU9ZS5pblNoYXBlO3ZhciB0PWUuZmlsdGVySGVpZ2h0LG49ZS5maWx0ZXJXaWR0aCxyPWUuc3RyaWRlSGVpZ2h0LG89ZS5zdHJpZGVXaWR0aCxhPXQtMS1lLnBhZEluZm8udG9wLGk9bi0xLWUucGFkSW5mby5sZWZ0O3RoaXMudXNlckNvZGU9XCJcXG4gICAgICBjb25zdCBpdmVjMiBwYWRzID0gaXZlYzIoXCIrYStcIiwgXCIraStcIik7XFxuXFxuICAgICAgdm9pZCBtYWluKCkge1xcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XFxuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XFxuICAgICAgICBpbnQgZDEgPSBjb29yZHNbM107XFxuXFxuICAgICAgICBpdmVjMiBkeUNvcm5lciA9IGNvb3Jkcy55eiAtIHBhZHM7XFxuICAgICAgICBpbnQgZHlSQ29ybmVyID0gZHlDb3JuZXIueDtcXG4gICAgICAgIGludCBkeUNDb3JuZXIgPSBkeUNvcm5lci55O1xcblxcbiAgICAgICAgLy8gQ29udm9sdmUgZHkoPywgPywgZDIpIHdpdGggdyg6LCA6LCBkMSwgZDIpIHRvIGNvbXB1dGUgZHgoeFIsIHhDLCBkMSkuXFxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XFxuICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgXCIrdCtcIjsgd1IrKykge1xcbiAgICAgICAgICBmbG9hdCBkeVIgPSBmbG9hdChkeVJDb3JuZXIgKyB3UikgLyBcIityK1wiLjA7XFxuXFxuICAgICAgICAgIGlmIChkeVIgPCAwLjAgfHwgZHlSID49IFwiK2Uub3V0SGVpZ2h0K1wiLjAgfHwgZnJhY3QoZHlSKSA+IDAuMCkge1xcbiAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XFxuXFxuICAgICAgICAgIGludCB3UlBlcm0gPSBcIit0K1wiIC0gMSAtIHdSO1xcblxcbiAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgXCIrbitcIjsgd0MrKykge1xcbiAgICAgICAgICAgIGZsb2F0IGR5QyA9IGZsb2F0KGR5Q0Nvcm5lciArIHdDKSAvIFwiK28rXCIuMDtcXG5cXG4gICAgICAgICAgICBpZiAoZHlDIDwgMC4wIHx8IGR5QyA+PSBcIitlLm91dFdpZHRoK1wiLjAgfHxcXG4gICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xcbiAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XFxuXFxuICAgICAgICAgICAgaW50IHdDUGVybSA9IFwiK24rXCIgLSAxIC0gd0M7XFxuXFxuICAgICAgICAgICAgZm9yIChpbnQgZDIgPSAwOyBkMiA8IFwiK2Uub3V0Q2hhbm5lbHMrXCI7IGQyKyspIHtcXG4gICAgICAgICAgICAgIGZsb2F0IHhWYWx1ZSA9IGdldER5KGJhdGNoLCBpZHlSLCBpZHlDLCBkMik7XFxuICAgICAgICAgICAgICBmbG9hdCB3VmFsdWUgPSBnZXRXKHdSUGVybSwgd0NQZXJtLCBkMSwgZDIpO1xcbiAgICAgICAgICAgICAgZG90UHJvZCArPSB4VmFsdWUgKiB3VmFsdWU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XFxuICAgICAgfVxcbiAgICBcIn19KCksRGVwdGh3aXNlQ29udjJERGVyRmlsdGVyUHJvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXt0aGlzLnZhcmlhYmxlTmFtZXM9W1wieFwiLFwiZHlcIl0sdGhpcy5vdXRwdXRTaGFwZT1lLmZpbHRlclNoYXBlO3ZhciB0PWUuc3RyaWRlSGVpZ2h0LG49ZS5zdHJpZGVXaWR0aCxyPWUucGFkSW5mby50b3Asbz1lLnBhZEluZm8ubGVmdCxhPWUub3V0Q2hhbm5lbHMvZS5pbkNoYW5uZWxzO3RoaXMudXNlckNvZGU9XCJcXG4gICAgICB2b2lkIG1haW4oKSB7XFxuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcXG4gICAgICAgIGludCB3UiA9IGNvb3Jkcy54O1xcbiAgICAgICAgaW50IHdDID0gY29vcmRzLnk7XFxuICAgICAgICBpbnQgZDEgPSBjb29yZHMuejtcXG4gICAgICAgIGludCBkbSA9IGNvb3Jkcy53O1xcbiAgICAgICAgaW50IGQyID0gZDEgKiBcIithK1wiICsgZG07XFxuXFxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xcblxcbiAgICAgICAgLy8gVE9ETzogVmVjNCBvdmVyIHRoZSBiYXRjaCBzaXplXFxuICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8IFwiK2UuYmF0Y2hTaXplK1wiOyBiKyspIHtcXG4gICAgICAgICAgZm9yIChpbnQgeVIgPSAwOyB5UiA8IFwiK2Uub3V0SGVpZ2h0K1wiOyB5UisrKSB7XFxuICAgICAgICAgICAgaW50IHhSID0gd1IgKyB5UiAqIFwiK3QrXCIgLSBcIityK1wiO1xcblxcbiAgICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gXCIrZS5pbkhlaWdodCtcIikge1xcbiAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIGZvciAoaW50IHlDID0gMDsgeUMgPCBcIitlLm91dFdpZHRoK1wiOyB5QysrKSB7XFxuICAgICAgICAgICAgICBpbnQgeEMgPSB3QyArIHlDICogXCIrbitcIiAtIFwiK28rXCI7XFxuXFxuICAgICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49IFwiK2UuaW5XaWR0aCtcIikge1xcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICAgIGZsb2F0IGR5VmFsdWUgPSBnZXREeShiLCB5UiwgeUMsIGQyKTtcXG4gICAgICAgICAgICAgIGZsb2F0IHhWYWx1ZSA9IGdldFgoYiwgeFIsIHhDLCBkMSk7XFxuICAgICAgICAgICAgICBkb3RQcm9kICs9ICh4VmFsdWUgKiBkeVZhbHVlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHNldE91dHB1dChkb3RQcm9kKTtcXG4gICAgICB9XFxuICAgIFwifX0oKSxEZXB0aHdpc2VDb252MkREZXJJbnB1dFByb2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSl7dGhpcy52YXJpYWJsZU5hbWVzPVtcImR5XCIsXCJXXCJdLHRoaXMub3V0cHV0U2hhcGU9ZS5pblNoYXBlO3ZhciB0PWUuZmlsdGVySGVpZ2h0LG49ZS5maWx0ZXJXaWR0aCxyPWUuc3RyaWRlSGVpZ2h0LG89ZS5zdHJpZGVXaWR0aCxhPXQtMS1lLnBhZEluZm8udG9wLGk9bi0xLWUucGFkSW5mby5sZWZ0LHM9ZS5vdXRDaGFubmVscy9lLmluQ2hhbm5lbHM7dGhpcy51c2VyQ29kZT1cIlxcbiAgICAgIGNvbnN0IGl2ZWMyIHBhZHMgPSBpdmVjMihcIithK1wiLCBcIitpK1wiKTtcXG5cXG4gICAgICB2b2lkIG1haW4oKSB7XFxuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcXG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkc1swXTtcXG4gICAgICAgIGludCBkMSA9IGNvb3Jkc1szXTtcXG4gICAgICAgIGl2ZWMyIGR5Q29ybmVyID0gY29vcmRzLnl6IC0gcGFkcztcXG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeUNvcm5lci54O1xcbiAgICAgICAgaW50IGR5Q0Nvcm5lciA9IGR5Q29ybmVyLnk7XFxuXFxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xcblxcbiAgICAgICAgZm9yIChpbnQgd1IgPSAwOyB3UiA8IFwiK3QrXCI7IHdSKyspIHtcXG4gICAgICAgICAgZmxvYXQgZHlSID0gZmxvYXQoZHlSQ29ybmVyICsgd1IpIC8gXCIrcitcIi4wO1xcblxcbiAgICAgICAgICBpZiAoZHlSIDwgMC4wIHx8IGR5UiA+PSBcIitlLm91dEhlaWdodCtcIi4wIHx8IGZyYWN0KGR5UikgPiAwLjApIHtcXG4gICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBpbnQgaWR5UiA9IGludChkeVIpO1xcblxcbiAgICAgICAgICBpbnQgd1JQZXJtID0gXCIrdCtcIiAtIDEgLSB3UjtcXG5cXG4gICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8IFwiK24rXCI7IHdDKyspIHtcXG4gICAgICAgICAgICBmbG9hdCBkeUMgPSBmbG9hdChkeUNDb3JuZXIgKyB3QykgLyBcIitvK1wiLjA7XFxuXFxuICAgICAgICAgICAgaWYgKGR5QyA8IDAuMCB8fCBkeUMgPj0gXCIrZS5vdXRXaWR0aCtcIi4wIHx8XFxuICAgICAgICAgICAgICAgIGZyYWN0KGR5QykgPiAwLjApIHtcXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpbnQgaWR5QyA9IGludChkeUMpO1xcblxcbiAgICAgICAgICAgIGludCB3Q1Blcm0gPSBcIituK1wiIC0gMSAtIHdDO1xcblxcbiAgICAgICAgICAgIC8vIFRPRE86IFZlYzQgb3ZlciB0aGUgY2hhbm5lbE11bFxcbiAgICAgICAgICAgIGZvciAoaW50IGRtID0gMDsgZG0gPCBcIitzK1wiOyBkbSsrKSB7XFxuICAgICAgICAgICAgICBpbnQgZDIgPSBkMSAqIFwiK3MrXCIgKyBkbTtcXG4gICAgICAgICAgICAgIGZsb2F0IHhWYWx1ZSA9IGdldER5KGJhdGNoLCBpZHlSLCBpZHlDLCBkMik7XFxuICAgICAgICAgICAgICBmbG9hdCB3VmFsdWUgPSBnZXRXKHdSUGVybSwgd0NQZXJtLCBkMSwgZG0pO1xcbiAgICAgICAgICAgICAgZG90UHJvZCArPSB4VmFsdWUgKiB3VmFsdWU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XFxuICAgICAgfVxcbiAgICBcIn19KCksQ29udjJEUHJvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXt0aGlzLnZhcmlhYmxlTmFtZXM9W1wieFwiLFwiV1wiXSx0aGlzLm91dHB1dFNoYXBlPWUub3V0U2hhcGU7dmFyIHQ9ZS5wYWRJbmZvLnRvcCxuPWUucGFkSW5mby5sZWZ0LHI9ZS5zdHJpZGVIZWlnaHQsbz1lLnN0cmlkZVdpZHRoLGE9ZS5kaWxhdGlvbkhlaWdodCxpPWUuZGlsYXRpb25XaWR0aCxzPWUuZmlsdGVySGVpZ2h0LHU9ZS5maWx0ZXJXaWR0aCxsPTQqTWF0aC5mbG9vcihlLmluQ2hhbm5lbHMvNCksYz1lLmluQ2hhbm5lbHMlNDt0aGlzLnVzZXJDb2RlPVwiXFxuICAgICAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKFwiK3IrXCIsIFwiK28rXCIpO1xcbiAgICAgIGNvbnN0IGl2ZWMyIHBhZHMgPSBpdmVjMihcIit0K1wiLCBcIituK1wiKTtcXG5cXG4gICAgICB2b2lkIG1haW4oKSB7XFxuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcXG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkc1swXTtcXG4gICAgICAgIGludCBkMiA9IGNvb3Jkc1szXTtcXG5cXG4gICAgICAgIGl2ZWMyIHhSQ0Nvcm5lciA9IGNvb3Jkcy55eiAqIHN0cmlkZXMgLSBwYWRzO1xcbiAgICAgICAgaW50IHhSQ29ybmVyID0geFJDQ29ybmVyLng7XFxuICAgICAgICBpbnQgeENDb3JuZXIgPSB4UkNDb3JuZXIueTtcXG5cXG4gICAgICAgIC8vIENvbnZvbHZlIHgoPywgPywgZDEpIHdpdGggdyg6LCA6LCBkMSwgZDIpIHRvIGdldCB5KHlSLCB5QywgZDIpLlxcbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWQuIDogPSBhY3Jvc3MgYWxsIHZhbHVlcyBpbiB0aGF0IGF4aXMuXFxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xcbiAgICAgICAgZm9yIChpbnQgd1IgPSAwOyB3UiA8IFwiK3MrXCI7IHdSKyspIHtcXG4gICAgICAgICAgaW50IHhSID0geFJDb3JuZXIgKyB3UiAqIFwiK2ErXCI7XFxuXFxuICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gXCIrZS5pbkhlaWdodCtcIikge1xcbiAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCBcIit1K1wiOyB3QysrKSB7XFxuICAgICAgICAgICAgaW50IHhDID0geENDb3JuZXIgKyB3QyAqIFwiK2krXCI7XFxuXFxuICAgICAgICAgICAgaWYgKHhDIDwgMCB8fCB4QyA+PSBcIitlLmluV2lkdGgrXCIpIHtcXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBmb3IgKGludCBkMSA9IDA7IGQxIDwgXCIrbCtcIjsgZDEgKz0gNCkge1xcbiAgICAgICAgICAgICAgdmVjNCB4VmFsdWVzID0gdmVjNChcXG4gICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeFIsIHhDLCBkMSksXFxuICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgZDEgKyAxKSxcXG4gICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeFIsIHhDLCBkMSArIDIpLFxcbiAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsIGQxICsgMylcXG4gICAgICAgICAgICAgICk7XFxuICAgICAgICAgICAgICB2ZWM0IHdWYWx1ZXMgPSB2ZWM0KFxcbiAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgZDEsIGQyKSxcXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsIGQxICsgMSwgZDIpLFxcbiAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgZDEgKyAyLCBkMiksXFxuICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCBkMSArIDMsIGQyKVxcbiAgICAgICAgICAgICAgKTtcXG5cXG4gICAgICAgICAgICAgIGRvdFByb2QgKz0gZG90KHhWYWx1ZXMsIHdWYWx1ZXMpO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBpZiAoXCIrKDE9PT1jKStcIikge1xcbiAgICAgICAgICAgICAgZG90UHJvZCArPVxcbiAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsIFwiK2wrXCIpICpcXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsIFwiK2wrXCIsIGQyKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFwiKygyPT09YykrXCIpIHtcXG4gICAgICAgICAgICAgIHZlYzIgeFZhbHVlcyA9IHZlYzIoXFxuICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgXCIrbCtcIiksXFxuICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgXCIrbCtcIiArIDEpXFxuICAgICAgICAgICAgICApO1xcbiAgICAgICAgICAgICAgdmVjMiB3VmFsdWVzID0gdmVjMihcXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsIFwiK2wrXCIsIGQyKSxcXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsIFwiK2wrXCIgKyAxLCBkMilcXG4gICAgICAgICAgICAgICk7XFxuICAgICAgICAgICAgICBkb3RQcm9kICs9IGRvdCh4VmFsdWVzLCB3VmFsdWVzKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFwiKygzPT09YykrXCIpIHtcXG4gICAgICAgICAgICAgIHZlYzMgeFZhbHVlcyA9IHZlYzMoXFxuICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgXCIrbCtcIiksXFxuICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgXCIrbCtcIiArIDEpLFxcbiAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsIFwiK2wrXCIgKyAyKVxcbiAgICAgICAgICAgICAgKTtcXG4gICAgICAgICAgICAgIHZlYzMgd1ZhbHVlcyA9IHZlYzMoXFxuICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCBcIitsK1wiLCBkMiksXFxuICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCBcIitsK1wiICsgMSwgZDIpLFxcbiAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgXCIrbCtcIiArIDIsIGQyKVxcbiAgICAgICAgICAgICAgKTtcXG4gICAgICAgICAgICAgIGRvdFByb2QgKz0gZG90KHhWYWx1ZXMsIHdWYWx1ZXMpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xcbiAgICAgIH1cXG4gICAgXCJ9fSgpLERlcHRod2lzZUNvbnYyRFByb2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSl7dGhpcy52YXJpYWJsZU5hbWVzPVtcInhcIixcIldcIl0sdGhpcy5vdXRwdXRTaGFwZT1lLm91dFNoYXBlO3ZhciB0PWUuaW5IZWlnaHQsbj1lLmluV2lkdGgscj1lLnBhZEluZm8udG9wLG89ZS5wYWRJbmZvLmxlZnQsYT1lLnN0cmlkZUhlaWdodCxpPWUuc3RyaWRlV2lkdGgscz1lLmRpbGF0aW9uSGVpZ2h0LHU9ZS5kaWxhdGlvbldpZHRoLGw9ZS5maWx0ZXJIZWlnaHQsYz1lLmZpbHRlcldpZHRoLHA9ZS5vdXRDaGFubmVscy9lLmluQ2hhbm5lbHM7dGhpcy51c2VyQ29kZT1cIlxcbiAgICAgIGNvbnN0IGl2ZWMyIHN0cmlkZXMgPSBpdmVjMihcIithK1wiLCBcIitpK1wiKTtcXG4gICAgICBjb25zdCBpdmVjMiBwYWRzID0gaXZlYzIoXCIrcitcIiwgXCIrbytcIik7XFxuXFxuICAgICAgdm9pZCBtYWluKCkge1xcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XFxuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHMueDtcXG4gICAgICAgIGl2ZWMyIHhSQ0Nvcm5lciA9IGNvb3Jkcy55eiAqIHN0cmlkZXMgLSBwYWRzO1xcbiAgICAgICAgaW50IGQyID0gY29vcmRzLnc7XFxuICAgICAgICBpbnQgZDEgPSBkMiAvIFwiK3ArXCI7XFxuICAgICAgICBpbnQgcSA9IGQyIC0gZDEgKiBcIitwK1wiO1xcblxcbiAgICAgICAgaW50IHhSQ29ybmVyID0geFJDQ29ybmVyLng7XFxuICAgICAgICBpbnQgeENDb3JuZXIgPSB4UkNDb3JuZXIueTtcXG5cXG4gICAgICAgIC8vIENvbnZvbHZlIHgoPywgPywgZDEpIHdpdGggdyg6LCA6LCBkMSwgcSkgdG8gZ2V0IHkoeVIsIHlDLCBkMikuXFxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XFxuICAgICAgICAvLyBUT0RPKGRzbWlsa292KTogRmxhdHRlbiB0aGUgdHdvIGZvciBsb29wcyBhbmQgdmVjNCB0aGUgb3BlcmF0aW9ucy5cXG4gICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCBcIitsK1wiOyB3UisrKSB7XFxuICAgICAgICAgIGludCB4UiA9IHhSQ29ybmVyICsgd1IgKiBcIitzK1wiO1xcblxcbiAgICAgICAgICBpZiAoeFIgPCAwIHx8IHhSID49IFwiK3QrXCIpIHtcXG4gICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgXCIrYytcIjsgd0MrKykge1xcbiAgICAgICAgICAgIGludCB4QyA9IHhDQ29ybmVyICsgd0MgKiBcIit1K1wiO1xcblxcbiAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gXCIrbitcIikge1xcbiAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIGZsb2F0IHhWYWwgPSBnZXRYKGJhdGNoLCB4UiwgeEMsIGQxKTtcXG4gICAgICAgICAgICBmbG9hdCB3VmFsID0gZ2V0Vyh3Uiwgd0MsIGQxLCBxKTtcXG4gICAgICAgICAgICBkb3RQcm9kICs9IHhWYWwgKiB3VmFsO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XFxuICAgICAgfVxcbiAgICBcIn19KCksQ3JvcEFuZFJlc2l6ZVByb2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4scixvKXt0aGlzLnZhcmlhYmxlTmFtZXM9W1wiSW1hZ2VcIixcIkJveGVzXCIsXCJCb3hJbmRcIl0sdGhpcy5vdXRwdXRTaGFwZT1bXTt2YXIgYT1lWzBdLGk9ZVsxXSxzPWVbMl0sdT1lWzNdLGw9dFswXSxjPW5bMF0scD1uWzFdO3RoaXMub3V0cHV0U2hhcGU9W2wsYyxwLHVdO3ZhciBkPVwiYmlsaW5lYXJcIj09PXI/MTowLGg9W2ktMStcIi4wXCIscy0xK1wiLjBcIl0sZj1oWzBdLG09aFsxXSxnPWM+MT9bXCJcIisoaS0xKS8oYy0xKSxcIih5Mi15MSkgKiBoZWlnaHRfcmF0aW9cIixcInkxKlwiK2YrXCIgKyBmbG9hdCh5KSooaGVpZ2h0X3NjYWxlKVwiXTpbXCIwLjBcIixcIjAuMFwiLFwiMC41ICogKHkxK3kyKSAqIFwiK2ZdLHY9Z1swXSx4PWdbMV0seT1nWzJdLFQ9cD4xP1tcIlwiKyhzLTEpLyhwLTEpLFwiKHgyLXgxKSAqIHdpZHRoX3JhdGlvXCIsXCJ4MSpcIittK1wiICsgZmxvYXQoeCkqKHdpZHRoX3NjYWxlKVwiXTpbXCIwLjBcIixcIjAuMFwiLFwiMC41ICogKHgxK3gyKSAqIFwiK21dLFM9VFswXSxiPVRbMV0sRT1UWzJdO3RoaXMudXNlckNvZGU9XCJcXG4gICAgICBjb25zdCBmbG9hdCBoZWlnaHRfcmF0aW8gPSBmbG9hdChcIit2K1wiKTtcXG4gICAgICBjb25zdCBmbG9hdCB3aWR0aF9yYXRpbyA9IGZsb2F0KFwiK1MrXCIpO1xcbiAgICAgIHZvaWQgbWFpbigpIHtcXG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xcbiAgICAgICAgaW50IGIgPSBjb29yZHNbMF07XFxuICAgICAgICBpbnQgeSA9IGNvb3Jkc1sxXTtcXG4gICAgICAgIGludCB4ID0gY29vcmRzWzJdO1xcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XFxuXFxuICAgICAgICAvLyBnZXQgYm94IHZhbHNcXG4gICAgICAgIGZsb2F0IHkxID0gZ2V0Qm94ZXMoYiwwKTtcXG4gICAgICAgIGZsb2F0IHgxID0gZ2V0Qm94ZXMoYiwxKTtcXG4gICAgICAgIGZsb2F0IHkyID0gZ2V0Qm94ZXMoYiwyKTtcXG4gICAgICAgIGZsb2F0IHgyID0gZ2V0Qm94ZXMoYiwzKTtcXG5cXG4gICAgICAgIC8vIGdldCBpbWFnZSBpbiBiYXRjaCBpbmRleFxcbiAgICAgICAgaW50IGJJbmQgPSByb3VuZChnZXRCb3hJbmQoYikpO1xcbiAgICAgICAgaWYoYkluZCA8IDAgfHwgYkluZCA+PSBcIithK1wiKSB7XFxuICAgICAgICAgIHJldHVybjtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIGZsb2F0IGhlaWdodF9zY2FsZSA9IFwiK3grXCI7XFxuICAgICAgICBmbG9hdCB3aWR0aF9zY2FsZSA9IFwiK2IrXCI7XFxuXFxuICAgICAgICBmbG9hdCBpbl95ID0gXCIreStcIjtcXG4gICAgICAgIGlmKCBpbl95IDwgMC4wIHx8IGluX3kgPiBcIitmK1wiICkge1xcbiAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoXCIrbytcIikpO1xcbiAgICAgICAgICByZXR1cm47XFxuICAgICAgICB9XFxuICAgICAgICBmbG9hdCBpbl94ID0gXCIrRStcIjtcXG4gICAgICAgIGlmKCBpbl94IDwgMC4wIHx8IGluX3ggPiBcIittK1wiICkge1xcbiAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoXCIrbytcIikpO1xcbiAgICAgICAgICByZXR1cm47XFxuICAgICAgICB9XFxuXFxuICAgICAgICB2ZWMyIHNvdXJjZUZyYWNJbmRleFJDID0gdmVjMihpbl95LGluX3gpO1xcbiAgICAgICAgaWYoXCIrZCtcIiA9PSAxKSB7XFxuICAgICAgICAgIC8vIENvbXB1dGUgdGhlIGZvdXIgaW50ZWdlciBpbmRpY2VzLlxcbiAgICAgICAgICBpdmVjMiBzb3VyY2VGbG9vclJDID0gaXZlYzIoc291cmNlRnJhY0luZGV4UkMpO1xcbiAgICAgICAgICBpdmVjMiBzb3VyY2VDZWlsUkMgPSBpdmVjMihjZWlsKHNvdXJjZUZyYWNJbmRleFJDKSk7XFxuXFxuICAgICAgICAgIGZsb2F0IHRvcExlZnQgPSBnZXRJbWFnZShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUZsb29yUkMueSwgZCk7XFxuICAgICAgICAgIGZsb2F0IGJvdHRvbUxlZnQgPSBnZXRJbWFnZShiLCBzb3VyY2VDZWlsUkMueCwgc291cmNlRmxvb3JSQy55LCBkKTtcXG4gICAgICAgICAgZmxvYXQgdG9wUmlnaHQgPSBnZXRJbWFnZShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUNlaWxSQy55LCBkKTtcXG4gICAgICAgICAgZmxvYXQgYm90dG9tUmlnaHQgPSBnZXRJbWFnZShiLCBzb3VyY2VDZWlsUkMueCwgc291cmNlQ2VpbFJDLnksIGQpO1xcblxcbiAgICAgICAgICB2ZWMyIGZyYWNSQyA9IHNvdXJjZUZyYWNJbmRleFJDIC0gdmVjMihzb3VyY2VGbG9vclJDKTtcXG5cXG4gICAgICAgICAgZmxvYXQgdG9wID0gdG9wTGVmdCArICh0b3BSaWdodCAtIHRvcExlZnQpICogZnJhY1JDLnk7XFxuICAgICAgICAgIGZsb2F0IGJvdHRvbSA9IGJvdHRvbUxlZnQgKyAoYm90dG9tUmlnaHQgLSBib3R0b21MZWZ0KSAqIGZyYWNSQy55O1xcbiAgICAgICAgICBmbG9hdCBuZXdWYWx1ZSA9IHRvcCArIChib3R0b20gLSB0b3ApICogZnJhY1JDLng7XFxuICAgICAgICAgIHNldE91dHB1dChuZXdWYWx1ZSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAvLyBDb21wdXRlIHRoZSBjb29yZGluYXRvcnMgb2YgbmVhcmVzdCBuZWlnaGJvciBwb2ludC5cXG4gICAgICAgICAgaXZlYzIgc291cmNlTmVhcmVzdFJDID0gaXZlYzIoZmxvb3IoXFxuICAgICAgICAgICAgc291cmNlRnJhY0luZGV4UkMgKyB2ZWMyKDAuNSwwLjUpKSk7XFxuICAgICAgICAgIGZsb2F0IG5ld1ZhbHVlID0gZ2V0SW1hZ2UoYiwgc291cmNlTmVhcmVzdFJDLngsIHNvdXJjZU5lYXJlc3RSQy55LCBkKTtcXG4gICAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcXG4gICAgICAgIH1cXG4gICAgICB9XFxuICAgIFwifX0oKTtmdW5jdGlvbiBtYWtlU2hhZGVyKGUsdCxuLHIpe3ZhciBvPWUubWFwKGZ1bmN0aW9uKGUpe3ZhciB0PXNpemVGcm9tU2hhcGUoZS5zaGFwZUluZm8ubG9naWNhbFNoYXBlKTtyZXR1cm4gZS5zaGFwZUluZm8uaXNVbmlmb3JtP1widW5pZm9ybSBmbG9hdCBcIitlLm5hbWUrKHQ+MT9cIltcIit0K1wiXVwiOlwiXCIpK1wiO1wiOlwidW5pZm9ybSBzYW1wbGVyMkQgXCIrZS5uYW1lK1wiO1wifSk7bz1vLmpvaW4oXCJcXG5cIik7dmFyIGEsaT1lLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZ2V0SW5wdXRTYW1wbGluZ1NuaXBwZXQoZSx0LHIpfSkuam9pbihcIlxcblwiKSxzPXQudGV4U2hhcGU7cmV0dXJuIGE9dC5pc1BhY2tlZD9nZXRQYWNrZWRPdXRwdXRTYW1wbGluZ1NuaXBwZXQodC5sb2dpY2FsU2hhcGUscyk6Z2V0T3V0cHV0U2FtcGxpbmdTbmlwcGV0KHQubG9naWNhbFNoYXBlLHMpLFtTSEFERVJfUFJFRklYLEZMT0FUX1RFWFRVUkVfU0FNUExFX1NOSVBQRVQsRkxPQVRfVEVYVFVSRV9TRVRPVVRQVVRfU05JUFBFVCxvLGEsaSxuXS5qb2luKFwiXFxuXCIpfWZ1bmN0aW9uIGdldFNhbXBsZXJGcm9tSW5JbmZvKGUpe3ZhciB0PWUuc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZTtzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gZ2V0U2FtcGxlclNjYWxhcihlKTtjYXNlIDE6cmV0dXJuIGdldFNhbXBsZXIxRChlKTtjYXNlIDI6cmV0dXJuIGdldFNhbXBsZXIyRChlKTtjYXNlIDM6cmV0dXJuIGdldFNhbXBsZXIzRChlKTtjYXNlIDQ6cmV0dXJuIGdldFNhbXBsZXI0RChlKTtjYXNlIDU6cmV0dXJuIGdldFNhbXBsZXI1RChlKTtjYXNlIDY6cmV0dXJuIGdldFNhbXBsZXI2RChlKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcih0Lmxlbmd0aCtcIi1EIGlucHV0IHNhbXBsaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCIpfX1mdW5jdGlvbiBnZXRQYWNrZWRTYW1wbGVyRnJvbUluSW5mbyhlKXt2YXIgdD1lLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDI6cmV0dXJuIGdldFBhY2tlZFNhbXBsZXIyRChlKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihcIlBhY2tlZCBcIit0Lmxlbmd0aCtcIi1EIGlucHV0IHNhbXBsaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCIpfX1mdW5jdGlvbiBnZXRJbnB1dFNhbXBsaW5nU25pcHBldChlLHQsbil7dmFyIHI9Z2V0U2FtcGxlckZsYXQoZSk7cmV0dXJuIGUuc2hhcGVJbmZvLmlzUGFja2VkP3IrPWdldFBhY2tlZFNhbXBsZXJGcm9tSW5JbmZvKGUpOnIrPWdldFNhbXBsZXJGcm9tSW5JbmZvKGUpLChufHxhcnJheXNFcXVhbChlLnNoYXBlSW5mby5sb2dpY2FsU2hhcGUsdC5sb2dpY2FsU2hhcGUpKSYmKHIrPWdldFNhbXBsZXJBdE91dHB1dENvb3JkcyhlLHQsbikpLHJ9ZnVuY3Rpb24gZ2V0UGFja2VkT3V0cHV0U2FtcGxpbmdTbmlwcGV0KGUsdCl7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIGdldE91dHB1dFNjYWxhckNvb3JkcygpO2Nhc2UgMjpyZXR1cm4gZ2V0T3V0cHV0UGFja2VkMkRDb29yZHMoZSx0KTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihlLmxlbmd0aCtcIi1EIG91dHB1dCBwYWNrZWQgc2FtcGxpbmcgaXMgbm90IHlldCBzdXBwb3J0ZWRcIil9fWZ1bmN0aW9uIGdldE91dHB1dFNhbXBsaW5nU25pcHBldChlLHQpe3N3aXRjaChlLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBnZXRPdXRwdXRTY2FsYXJDb29yZHMoKTtjYXNlIDE6cmV0dXJuIGdldE91dHB1dDFEQ29vcmRzKGUsdCk7Y2FzZSAyOnJldHVybiBnZXRPdXRwdXQyRENvb3JkcyhlLHQpO2Nhc2UgMzpyZXR1cm4gZ2V0T3V0cHV0M0RDb29yZHMoZSx0KTtjYXNlIDQ6cmV0dXJuIGdldE91dHB1dDREQ29vcmRzKGUsdCk7Y2FzZSA1OnJldHVybiBnZXRPdXRwdXQ1RENvb3JkcyhlLHQpO2Nhc2UgNjpyZXR1cm4gZ2V0T3V0cHV0NkRDb29yZHMoZSx0KTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihlLmxlbmd0aCtcIi1EIG91dHB1dCBzYW1wbGluZyBpcyBub3QgeWV0IHN1cHBvcnRlZFwiKX19dmFyIFNBTVBMRV8xRF9TTklQUEVUPVwiXFxudmVjMiBVVmZyb20xRChpbnQgdGV4TnVtUiwgaW50IHRleE51bUMsIGludCBpbmRleCkge1xcbiAgaW50IHRleFIgPSBpbmRleCAvIHRleE51bUM7XFxuICBpbnQgdGV4QyA9IGluZGV4IC0gdGV4UiAqIHRleE51bUM7XFxuICByZXR1cm4gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMih0ZXhOdW1DLCB0ZXhOdW1SKTtcXG59XFxuXCIsU0FNUExFXzJEX1NOSVBQRVQ9XCJcXG52ZWMyIFVWZnJvbTJEKGludCB0ZXhOdW1SLCBpbnQgdGV4TnVtQywgaW50IG51bUMsIGludCByb3csIGludCBjb2wpIHtcXG4gIGludCBpbmRleCA9IHJvdyAqIG51bUMgKyBjb2w7XFxuICBpbnQgdGV4UiA9IGluZGV4IC8gdGV4TnVtQztcXG4gIGludCB0ZXhDID0gaW5kZXggLSB0ZXhSICogdGV4TnVtQztcXG4gIHJldHVybiAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKHRleE51bUMsIHRleE51bVIpO1xcbn1cXG52ZWMyIHBhY2tlZFVWZnJvbTJEKGludCB0ZXhlbHNJbkxvZ2ljYWxSb3csIGludCB0ZXhOdW1SLFxcbiAgaW50IHRleE51bUMsIGludCByb3csIGludCBjb2wpIHtcXG4gIGludCB0ZXhlbEluZGV4ID0gKHJvdyAvIDIpICogdGV4ZWxzSW5Mb2dpY2FsUm93ICsgKGNvbCAvIDIpO1xcbiAgaW50IHRleFIgPSB0ZXhlbEluZGV4IC8gdGV4TnVtQztcXG4gIGludCB0ZXhDID0gdGV4ZWxJbmRleCAtIHRleFIgKiB0ZXhOdW1DO1xcbiAgcmV0dXJuICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIodGV4TnVtQywgdGV4TnVtUik7XFxufVxcblwiLFNBTVBMRV8zRF9TTklQUEVUPVwiXFxudmVjMiBVVmZyb20zRChpbnQgdGV4TnVtUiwgaW50IHRleE51bUMsIGludCBzdHJpZGUwLFxcbiAgICBpbnQgc3RyaWRlMSwgaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoKSB7XFxuICAvLyBFeHBsaWNpdGx5IHVzZSBpbnRlZ2VyIG9wZXJhdGlvbnMgYXMgZG90KCkgb25seSB3b3JrcyBvbiBmbG9hdHMuXFxuICBpbnQgaW5kZXggPSByb3cgKiBzdHJpZGUwICsgY29sICogc3RyaWRlMSArIGRlcHRoO1xcbiAgaW50IHRleFIgPSBpbmRleCAvIHRleE51bUM7XFxuICBpbnQgdGV4QyA9IGluZGV4IC0gdGV4UiAqIHRleE51bUM7XFxuICByZXR1cm4gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMih0ZXhOdW1DLCB0ZXhOdW1SKTtcXG59XFxuXCIsU0FNUExFXzREX1NOSVBQRVQ9XCJcXG52ZWMyIFVWZnJvbTREKGludCB0ZXhOdW1SLCBpbnQgdGV4TnVtQywgaW50IHN0cmlkZTAsXFxuICAgIGludCBzdHJpZGUxLCBpbnQgc3RyaWRlMiwgaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxcbiAgICBpbnQgZGVwdGgyKSB7XFxuICAvLyBFeHBsaWNpdGx5IHVzZSBpbnRlZ2VyIG9wZXJhdGlvbnMgYXMgZG90KCkgb25seSB3b3JrcyBvbiBmbG9hdHMuXFxuICBpbnQgaW5kZXggPSByb3cgKiBzdHJpZGUwICsgY29sICogc3RyaWRlMSArIGRlcHRoICogc3RyaWRlMiArIGRlcHRoMjtcXG4gIGludCB0ZXhSID0gaW5kZXggLyB0ZXhOdW1DO1xcbiAgaW50IHRleEMgPSBpbmRleCAtIHRleFIgKiB0ZXhOdW1DO1xcbiAgcmV0dXJuICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIodGV4TnVtQywgdGV4TnVtUik7XFxufVxcblwiLFNBTVBMRV81RF9TTklQUEVUPVwiXFxudmVjMiBVVmZyb201RChpbnQgdGV4TnVtUiwgaW50IHRleE51bUMsIGludCBzdHJpZGUwLFxcbiAgICBpbnQgc3RyaWRlMSwgaW50IHN0cmlkZTIsIGludCBzdHJpZGUzLCBpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsXFxuICAgIGludCBkZXB0aDIsIGludCBkZXB0aDMpIHtcXG4gIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cXG4gIGludCBpbmRleCA9IHJvdyAqIHN0cmlkZTAgKyBjb2wgKiBzdHJpZGUxICtcXG4gICAgICAgICAgICAgIGRlcHRoICogc3RyaWRlMiArIGRlcHRoMiAqIHN0cmlkZTMgKyBkZXB0aDM7XFxuICBpbnQgdGV4UiA9IGluZGV4IC8gdGV4TnVtQztcXG4gIGludCB0ZXhDID0gaW5kZXggLSB0ZXhSICogdGV4TnVtQztcXG4gIHJldHVybiAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKHRleE51bUMsIHRleE51bVIpO1xcbn1cXG5cIixTQU1QTEVfNkRfU05JUFBFVD1cIlxcbnZlYzIgVVZmcm9tNkQoaW50IHRleE51bVIsIGludCB0ZXhOdW1DLCBpbnQgc3RyaWRlMCxcXG4gICAgaW50IHN0cmlkZTEsIGludCBzdHJpZGUyLCBpbnQgc3RyaWRlMywgaW50IHN0cmlkZTQsXFxuICAgIGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMiwgaW50IGRlcHRoMywgaW50IGRlcHRoNCkge1xcbiAgLy8gRXhwbGljaXRseSB1c2UgaW50ZWdlciBvcGVyYXRpb25zIGFzIGRvdCgpIG9ubHkgd29ya3Mgb24gZmxvYXRzLlxcbiAgaW50IGluZGV4ID0gcm93ICogc3RyaWRlMCArIGNvbCAqIHN0cmlkZTEgKyBkZXB0aCAqIHN0cmlkZTIgKyBkZXB0aDIgKlxcbiAgICBzdHJpZGUzICsgZGVwdGgzICogc3RyaWRlNCArIGRlcHRoNDtcXG4gIGludCB0ZXhSID0gaW5kZXggLyB0ZXhOdW1DO1xcbiAgaW50IHRleEMgPSBpbmRleCAtIHRleFIgKiB0ZXhOdW1DO1xcbiAgcmV0dXJuICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIodGV4TnVtQywgdGV4TnVtUik7XFxufVxcblwiLEZMT0FUX1RFWFRVUkVfU0FNUExFX1NOSVBQRVQ9XCJcXG4gIGZsb2F0IHNhbXBsZVRleHR1cmUoc2FtcGxlcjJEIHRleHR1cmVTYW1wbGVyLCB2ZWMyIHV2KSB7XFxuICAgIHJldHVybiB0ZXh0dXJlMkQodGV4dHVyZVNhbXBsZXIsIHV2KS5yO1xcbiAgfVxcblwiLEZMT0FUX1RFWFRVUkVfU0VUT1VUUFVUX1NOSVBQRVQ9XCJcXG4gIHZvaWQgc2V0T3V0cHV0KGZsb2F0IHZhbCkge1xcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHZhbCwgMCwgMCwgMCk7XFxuICB9XFxuXCIsU0hBREVSX1BSRUZJWD1cIlxcbiAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbiAgcHJlY2lzaW9uIGhpZ2hwIGludDtcXG4gIHZhcnlpbmcgdmVjMiByZXN1bHRVVjtcXG4gIGNvbnN0IHZlYzIgaGFsZkNSID0gdmVjMigwLjUsIDAuNSk7XFxuXFxuICBzdHJ1Y3QgaXZlYzVcXG4gIHtcXG4gICAgaW50IHg7XFxuICAgIGludCB5O1xcbiAgICBpbnQgejtcXG4gICAgaW50IHc7XFxuICAgIGludCB1O1xcbiAgfTtcXG5cXG4gIHN0cnVjdCBpdmVjNlxcbiAge1xcbiAgICBpbnQgeDtcXG4gICAgaW50IHk7XFxuICAgIGludCB6O1xcbiAgICBpbnQgdztcXG4gICAgaW50IHU7XFxuICAgIGludCB2O1xcbiAgfTtcXG5cXG4gIGJvb2wgaXNOYU4oZmxvYXQgdmFsKSB7XFxuICAgIHJldHVybiAodmFsIDwgMC4wIHx8IDAuMCA8IHZhbCB8fCB2YWwgPT0gMC4wKSA/IGZhbHNlIDogdHJ1ZTtcXG4gIH1cXG5cXG4gIGJvb2wgaGFzTmFOKHZlYzQgdmFsdWVzKSB7XFxuICAgIHZlYzQgdjEgPSB2YWx1ZXMgKiB2YWx1ZXM7XFxuICAgIHZlYzQgdjIgPSB2YWx1ZXMgKiB2YWx1ZXM7XFxuICAgIHJldHVybiBhbnkobm90RXF1YWwodjEsIHYyKSk7XFxuICB9XFxuXFxuICBmbG9hdCBnZXROYU4odmVjNCB2YWx1ZXMpIHtcXG4gICAgcmV0dXJuIGRvdCh2ZWM0KDEpLCB2YWx1ZXMpO1xcbiAgfVxcblxcbiAgaW50IHJvdW5kKGZsb2F0IHZhbHVlKSB7XFxuICAgIHJldHVybiBpbnQoZmxvb3IodmFsdWUgKyAwLjUpKTtcXG4gIH1cXG5cXG4gIGludCBpbW9kKGludCB4LCBpbnQgeSkge1xcbiAgICByZXR1cm4geCAtIHkgKiAoeCAvIHkpO1xcbiAgfVxcblxcbiAgLy9CYXNlZCBvbiB0aGUgd29yayBvZiBEYXZlIEhvc2tpbnNcXG4gIC8vaHR0cHM6Ly93d3cuc2hhZGVydG95LmNvbS92aWV3LzRkalNSV1xcbiAgI2RlZmluZSBIQVNIU0NBTEUxIDQ0My44OTc1XFxuICBmbG9hdCByYW5kb20oZmxvYXQgc2VlZCl7XFxuICAgIHZlYzIgcCA9IHJlc3VsdFVWICogc2VlZDtcXG4gICAgdmVjMyBwMyAgPSBmcmFjdCh2ZWMzKHAueHl4KSAqIEhBU0hTQ0FMRTEpO1xcbiAgICBwMyArPSBkb3QocDMsIHAzLnl6eCArIDE5LjE5KTtcXG4gICAgcmV0dXJuIGZyYWN0KChwMy54ICsgcDMueSkgKiBwMy56KTtcXG4gIH1cXG5cXG4gIFwiK1NBTVBMRV8xRF9TTklQUEVUK1wiXFxuICBcIitTQU1QTEVfMkRfU05JUFBFVCtcIlxcbiAgXCIrU0FNUExFXzNEX1NOSVBQRVQrXCJcXG4gIFwiK1NBTVBMRV80RF9TTklQUEVUK1wiXFxuICBcIitTQU1QTEVfNURfU05JUFBFVCtcIlxcbiAgXCIrU0FNUExFXzZEX1NOSVBQRVQrXCJcXG5cIjtmdW5jdGlvbiBnZXRPdXRwdXRTY2FsYXJDb29yZHMoKXtyZXR1cm5cIlxcbiAgICBpbnQgZ2V0T3V0cHV0Q29vcmRzKCkge1xcbiAgICAgIHJldHVybiAwO1xcbiAgICB9XFxuICBcIn1mdW5jdGlvbiBnZXRPdXRwdXQxRENvb3JkcyhlLHQpe3JldHVybiAxPT09dFswXT9cIlxcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XFxuICAgICAgICByZXR1cm4gaW50KHJlc3VsdFVWLnggKiBcIit0WzFdK1wiLjApO1xcbiAgICAgIH1cXG4gICAgXCI6MT09PXRbMV0/XCJcXG4gICAgICBpbnQgZ2V0T3V0cHV0Q29vcmRzKCkge1xcbiAgICAgICAgcmV0dXJuIGludChyZXN1bHRVVi55ICogXCIrdFswXStcIi4wKTtcXG4gICAgICB9XFxuICAgIFwiOlwiXFxuICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XFxuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKFwiK3RbMF0rXCIsIFwiK3RbMV0rXCIpKTtcXG4gICAgICByZXR1cm4gcmVzVGV4UkMueCAqIFwiK3RbMV0rXCIgKyByZXNUZXhSQy55O1xcbiAgICB9XFxuICBcIn1mdW5jdGlvbiBnZXRPdXRwdXQzRENvb3JkcyhlLHQpe3ZhciBuPWVbMV0qZVsyXSxyPWVbMl07cmV0dXJuXCJcXG4gICAgaXZlYzMgZ2V0T3V0cHV0Q29vcmRzKCkge1xcbiAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihcIit0WzBdK1wiLCBcIit0WzFdK1wiKSk7XFxuICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqIFwiK3RbMV0rXCIgKyByZXNUZXhSQy55O1xcbiAgICAgIGludCByID0gaW5kZXggLyBcIituK1wiO1xcbiAgICAgIGluZGV4IC09IHIgKiBcIituK1wiO1xcbiAgICAgIGludCBjID0gaW5kZXggLyBcIityK1wiO1xcbiAgICAgIGludCBkID0gaW5kZXggLSBjICogXCIrcitcIjtcXG4gICAgICByZXR1cm4gaXZlYzMociwgYywgZCk7XFxuICAgIH1cXG4gIFwifWZ1bmN0aW9uIGdldE91dHB1dDREQ29vcmRzKGUsdCl7dmFyIG49ZVszXSxyPWVbMl0qbixvPWVbMV0qcjtyZXR1cm5cIlxcbiAgICBpdmVjNCBnZXRPdXRwdXRDb29yZHMoKSB7XFxuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXFxuICAgICAgICB2ZWMyKFwiK3RbMF0rXCIsIFwiK3RbMV0rXCIpKTtcXG4gICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogXCIrdFsxXStcIiArIHJlc1RleFJDLnk7XFxuXFxuICAgICAgaW50IHIgPSBpbmRleCAvIFwiK28rXCI7XFxuICAgICAgaW5kZXggLT0gciAqIFwiK28rXCI7XFxuXFxuICAgICAgaW50IGMgPSBpbmRleCAvIFwiK3IrXCI7XFxuICAgICAgaW5kZXggLT0gYyAqIFwiK3IrXCI7XFxuXFxuICAgICAgaW50IGQgPSBpbmRleCAvIFwiK24rXCI7XFxuICAgICAgaW50IGQyID0gaW5kZXggLSBkICogXCIrbitcIjtcXG5cXG4gICAgICByZXR1cm4gaXZlYzQociwgYywgZCwgZDIpO1xcbiAgICB9XFxuICBcIn1mdW5jdGlvbiBnZXRPdXRwdXQ1RENvb3JkcyhlLHQpe3ZhciBuPWVbNF0scj1lWzNdKm4sbz1lWzJdKnIsYT1lWzFdKm87cmV0dXJuXCJcXG4gICAgaXZlYzUgZ2V0T3V0cHV0Q29vcmRzKCkge1xcbiAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKiB2ZWMyKFwiK3RbMF0rXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIit0WzFdK1wiKSk7XFxuXFxuICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqIFwiK3RbMV0rXCIgKyByZXNUZXhSQy55O1xcblxcbiAgICAgIGludCByID0gaW5kZXggLyBcIithK1wiO1xcbiAgICAgIGluZGV4IC09IHIgKiBcIithK1wiO1xcblxcbiAgICAgIGludCBjID0gaW5kZXggLyBcIitvK1wiO1xcbiAgICAgIGluZGV4IC09IGMgKiBcIitvK1wiO1xcblxcbiAgICAgIGludCBkID0gaW5kZXggLyBcIityK1wiO1xcbiAgICAgIGluZGV4IC09IGQgKiBcIityK1wiO1xcblxcbiAgICAgIGludCBkMiA9IGluZGV4ICAvIFwiK24rXCI7XFxuICAgICAgaW50IGQzID0gaW5kZXggLSBkMiAqIFwiK24rXCI7XFxuXFxuICAgICAgaXZlYzUgb3V0U2hhcGUgPSBpdmVjNShyLCBjLCBkLCBkMiwgZDMpO1xcbiAgICAgIHJldHVybiBvdXRTaGFwZTtcXG4gICAgfVxcbiAgXCJ9ZnVuY3Rpb24gZ2V0T3V0cHV0NkRDb29yZHMoZSx0KXt2YXIgbj1lWzVdLHI9ZVs0XSpuLG89ZVszXSpyLGE9ZVsyXSpvLGk9ZVsxXSphO3JldHVyblwiXFxuICAgIGl2ZWM2IGdldE91dHB1dENvb3JkcygpIHtcXG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcXG4gICAgICAgIHZlYzIoXCIrdFswXStcIiwgXCIrdFsxXStcIikpO1xcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBcIit0WzFdK1wiICsgcmVzVGV4UkMueTtcXG5cXG4gICAgICBpbnQgciA9IGluZGV4IC8gXCIraStcIjtcXG4gICAgICBpbmRleCAtPSByICogXCIraStcIjtcXG5cXG4gICAgICBpbnQgYyA9IGluZGV4IC8gXCIrYStcIjtcXG4gICAgICBpbmRleCAtPSBjICogXCIrYStcIjtcXG5cXG4gICAgICBpbnQgZCA9IGluZGV4IC8gXCIrbytcIjtcXG4gICAgICBpbmRleCAtPSBkICogXCIrbytcIjtcXG5cXG4gICAgICBpbnQgZDIgPSBpbmRleCAvIFwiK3IrXCI7XFxuICAgICAgaW5kZXggLT0gZDIgKiBcIityK1wiO1xcblxcbiAgICAgIGludCBkMyA9IGluZGV4IC8gXCIrbitcIjtcXG4gICAgICBpbnQgZDQgPSBpbmRleCAtIGQzICogXCIrbitcIjtcXG5cXG4gICAgICBpdmVjNiByZXN1bHQgPSBpdmVjNihyLCBjLCBkLCBkMiwgZDMsIGQ0KTtcXG4gICAgICByZXR1cm4gcmVzdWx0O1xcbiAgICB9XFxuICBcIn1mdW5jdGlvbiBnZXRPdXRwdXRQYWNrZWQyRENvb3JkcyhlLHQpe3ZhciBuPVtNYXRoLmNlaWwodFswXS8yKSxNYXRoLmNlaWwodFsxXS8yKV07aWYoYXJyYXlzRXF1YWwoZSx0KSlyZXR1cm5cIlxcbiAgICAgIGl2ZWMyIGdldE91dHB1dENvb3JkcygpIHtcXG4gICAgICAgIHJldHVybiAyICogaXZlYzIocmVzdWx0VVYueXggKiB2ZWMyKFwiK25bMF0rXCIsIFwiK25bMV0rXCIpKTtcXG4gICAgICB9XFxuICAgIFwiO3ZhciByPU1hdGguY2VpbChlWzFdLzIpO3JldHVyblwiXFxuICAgIGl2ZWMyIGdldE91dHB1dENvb3JkcygpIHtcXG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoXCIrblswXStcIiwgXCIrblsxXStcIikpO1xcblxcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBcIituWzFdK1wiICsgcmVzVGV4UkMueTtcXG4gICAgICBpbnQgciA9IDIgKiAoaW5kZXggLyBcIityK1wiKTtcXG4gICAgICBpbnQgYyA9IGltb2QoaW5kZXgsIFwiK3IrXCIpICogMjtcXG5cXG4gICAgICByZXR1cm4gaXZlYzIociwgYyk7XFxuICAgIH1cXG4gIFwifWZ1bmN0aW9uIGdldE91dHB1dDJEQ29vcmRzKGUsdCl7cmV0dXJuIGFycmF5c0VxdWFsKGUsdCk/XCJcXG4gICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XFxuICAgICAgICByZXR1cm4gaXZlYzIocmVzdWx0VVYueXggKiB2ZWMyKFwiK3RbMF0rXCIsIFwiK3RbMV0rXCIpKTtcXG4gICAgICB9XFxuICAgIFwiOjE9PT1lWzFdP1wiXFxuICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xcbiAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoXCIrdFswXStcIiwgXCIrdFsxXStcIikpO1xcbiAgICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqIFwiK3RbMV0rXCIgKyByZXNUZXhSQy55O1xcbiAgICAgICAgcmV0dXJuIGl2ZWMyKGluZGV4LCAwKTtcXG4gICAgICB9XFxuICAgIFwiOjE9PT1lWzBdP1wiXFxuICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xcbiAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoXCIrdFswXStcIiwgXCIrdFsxXStcIikpO1xcbiAgICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqIFwiK3RbMV0rXCIgKyByZXNUZXhSQy55O1xcbiAgICAgICAgcmV0dXJuIGl2ZWMyKDAsIGluZGV4KTtcXG4gICAgICB9XFxuICAgIFwiOlwiXFxuICAgIGl2ZWMyIGdldE91dHB1dENvb3JkcygpIHtcXG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoXCIrdFswXStcIiwgXCIrdFsxXStcIikpO1xcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBcIit0WzFdK1wiICsgcmVzVGV4UkMueTtcXG4gICAgICBpbnQgciA9IGluZGV4IC8gXCIrZVsxXStcIjtcXG4gICAgICBpbnQgYyA9IGluZGV4IC0gciAqIFwiK2VbMV0rXCI7XFxuICAgICAgcmV0dXJuIGl2ZWMyKHIsIGMpO1xcbiAgICB9XFxuICBcIn1mdW5jdGlvbiBnZXRTYW1wbGVyU2NhbGFyKGUpe3ZhciB0PWUubmFtZSxuPVwiZ2V0XCIrdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO3JldHVybiBlLnNoYXBlSW5mby5pc1VuaWZvcm0/XCJmbG9hdCBcIituK1wiKCkge3JldHVybiBcIit0K1wiO31cIjpcIlxcbiAgICBmbG9hdCBcIituK1wiKCkge1xcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKFwiK3QrXCIsIGhhbGZDUik7XFxuICAgIH1cXG4gIFwifWZ1bmN0aW9uIGdldFNhbXBsZXIxRChlKXt2YXIgdD1lLm5hbWUsbj1cImdldFwiK3QuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKTtyZXR1cm5cIlxcbiAgICBmbG9hdCBcIituK1wiKGludCBpbmRleCkge1xcbiAgICAgIHJldHVybiBcIituK1wiRmxhdChpbmRleCk7XFxuICAgIH1cXG4gIFwifWZ1bmN0aW9uIGdldFBhY2tlZFNhbXBsZXIyRChlKXt2YXIgdD1lLnNoYXBlSW5mby5sb2dpY2FsU2hhcGUsbj1lLm5hbWUscj1cImdldFwiK24uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrbi5zbGljZSgxKSxvPWUuc2hhcGVJbmZvLnRleFNoYXBlLGE9b1swXSxpPW9bMV07aWYobnVsbCE9byYmYXJyYXlzRXF1YWwodCxvKSlyZXR1cm5cIlxcbiAgICAgIHZlYzQgXCIrcitcIihpbnQgcm93LCBpbnQgY29sKSB7XFxuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIoY29sLCByb3cpICsgaGFsZkNSKSAvIHZlYzIoXCIraStcIi4wLCBcIithK1wiLjApO1xcblxcbiAgICAgICAgcmV0dXJuIHRleHR1cmUyRChcIituK1wiLCB1dik7XFxuICAgICAgfVxcbiAgICBcIjt2YXIgcz1bTWF0aC5jZWlsKG9bMF0vMiksTWF0aC5jZWlsKG9bMV0vMildO3JldHVyblwiXFxuICAgIHZlYzQgXCIrcitcIihpbnQgcm93LCBpbnQgY29sKSB7XFxuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTJEKFwiK01hdGguY2VpbCh0WzFdLzIpK1wiLCBcIitzWzBdK1wiLCBcIitzWzFdK1wiLCByb3csIGNvbCk7XFxuICAgICAgcmV0dXJuIHRleHR1cmUyRChcIituK1wiLCB1dik7XFxuICAgIH1cXG4gIFwifWZ1bmN0aW9uIGdldFNhbXBsZXIyRChlKXt2YXIgdD1lLnNoYXBlSW5mby5sb2dpY2FsU2hhcGUsbj1lLm5hbWUscj1cImdldFwiK24uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrbi5zbGljZSgxKSxvPWUuc2hhcGVJbmZvLnRleFNoYXBlO2lmKG51bGwhPW8mJmFycmF5c0VxdWFsKHQsbykpe3ZhciBhPW9bMF07cmV0dXJuXCJcXG4gICAgZmxvYXQgXCIrcitcIihpbnQgcm93LCBpbnQgY29sKSB7XFxuICAgICAgdmVjMiB1diA9ICh2ZWMyKGNvbCwgcm93KSArIGhhbGZDUikgLyB2ZWMyKFwiK29bMV0rXCIuMCwgXCIrYStcIi4wKTtcXG4gICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZShcIituK1wiLCB1dik7XFxuICAgIH1cXG4gIFwifXZhciBpPXNxdWVlemVTaGFwZSh0KSxzPWkubmV3U2hhcGUsdT1pLmtlcHREaW1zLGw9cztpZihsLmxlbmd0aDx0Lmxlbmd0aCl7cmV0dXJuXCJcXG4gICAgICBcIitnZXRTYW1wbGVyRnJvbUluSW5mbyhzcXVlZXplSW5wdXRJbmZvKGUsbCkpK1wiXFxuICAgICAgZmxvYXQgXCIrcitcIihpbnQgcm93LCBpbnQgY29sKSB7XFxuICAgICAgICByZXR1cm4gXCIrcitcIihcIitnZXRTcXVlZXplZFBhcmFtcyhbXCJyb3dcIixcImNvbFwiXSx1KStcIik7XFxuICAgICAgfVxcbiAgICBcIn1pZihlLnNoYXBlSW5mby5pc1VuaWZvcm0pcmV0dXJuXCJcXG4gICAgICBmbG9hdCBcIityK1wiKGludCByb3csIGludCBjb2wpIHtcXG4gICAgICAgIGZsb2F0IGluZGV4ID0gZG90KHZlYzIocm93LCBjb2wpLCB2ZWMyKFwiK3RbMV0rXCIsIDEpKTtcXG4gICAgICAgIHJldHVybiBcIityK1wiRmxhdChyb3VuZChpbmRleCkpO1xcbiAgICAgIH1cXG4gICAgXCI7dmFyIGM9b1swXSxwPW9bMV07cmV0dXJuIDE9PT1wP1wiXFxuICAgIGZsb2F0IFwiK3IrXCIoaW50IHJvdywgaW50IGNvbCkge1xcbiAgICAgIGZsb2F0IGluZGV4ID0gZG90KHZlYzIocm93LCBjb2wpLCB2ZWMyKFwiK3RbMV0rXCIsIDEpKTtcXG4gICAgICB2ZWMyIHV2ID0gdmVjMigwLjUsIChpbmRleCArIDAuNSkgLyBcIitjK1wiLjApO1xcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKFwiK24rXCIsIHV2KTtcXG4gICAgfVxcbiAgXCI6MT09PWM/XCJcXG4gICAgZmxvYXQgXCIrcitcIihpbnQgcm93LCBpbnQgY29sKSB7XFxuICAgICAgZmxvYXQgaW5kZXggPSBkb3QodmVjMihyb3csIGNvbCksIHZlYzIoXCIrdFsxXStcIiwgMSkpO1xcbiAgICAgIHZlYzIgdXYgPSB2ZWMyKChpbmRleCArIDAuNSkgLyBcIitwK1wiLjAsIDAuNSk7XFxuICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoXCIrbitcIiwgdXYpO1xcbiAgICB9XFxuICBcIjpcIlxcbiAgZmxvYXQgXCIrcitcIihpbnQgcm93LCBpbnQgY29sKSB7XFxuICAgIHZlYzIgdXYgPSBVVmZyb20yRChcIitjK1wiLCBcIitwK1wiLCBcIit0WzFdK1wiLCByb3csIGNvbCk7XFxuICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKFwiK24rXCIsIHV2KTtcXG4gIH1cXG5cIn1mdW5jdGlvbiBnZXRTYW1wbGVyM0QoZSl7dmFyIHQ9ZS5zaGFwZUluZm8ubG9naWNhbFNoYXBlLG49ZS5uYW1lLHI9XCJnZXRcIituLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK24uc2xpY2UoMSksbz10WzFdKnRbMl0sYT10WzJdLGk9c3F1ZWV6ZVNoYXBlKHQpLHM9aS5uZXdTaGFwZSx1PWkua2VwdERpbXMsbD1zO2lmKGwubGVuZ3RoPHQubGVuZ3RoKXtyZXR1cm5cIlxcbiAgICAgICAgXCIrZ2V0U2FtcGxlckZyb21JbkluZm8oc3F1ZWV6ZUlucHV0SW5mbyhlLGwpKStcIlxcbiAgICAgICAgZmxvYXQgXCIrcitcIihpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgpIHtcXG4gICAgICAgICAgcmV0dXJuIFwiK3IrXCIoXCIrZ2V0U3F1ZWV6ZWRQYXJhbXMoW1wicm93XCIsXCJjb2xcIixcImRlcHRoXCJdLHUpK1wiKTtcXG4gICAgICAgIH1cXG4gICAgICBcIn1pZihlLnNoYXBlSW5mby5pc1VuaWZvcm0pcmV0dXJuXCJcXG4gICAgICBmbG9hdCBcIityK1wiKGludCByb3csIGludCBjb2wsIGludCBkZXB0aCkge1xcbiAgICAgICAgZmxvYXQgaW5kZXggPSBkb3QodmVjMyhyb3csIGNvbCwgZGVwdGgpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMyhcIitvK1wiLCBcIithK1wiLCAxKSk7XFxuICAgICAgICByZXR1cm4gXCIrcitcIkZsYXQocm91bmQoaW5kZXgpKTtcXG4gICAgICB9XFxuICAgIFwiO3ZhciBjPWUuc2hhcGVJbmZvLnRleFNoYXBlLHA9Y1swXSxkPWNbMV07cmV0dXJuIGQ9PT1vP1wiXFxuICAgICAgICBmbG9hdCBcIityK1wiKGludCByb3csIGludCBjb2wsIGludCBkZXB0aCkge1xcbiAgICAgICAgICBmbG9hdCB0ZXhSID0gZmxvYXQocm93KTtcXG4gICAgICAgICAgZmxvYXQgdGV4QyA9IGRvdCh2ZWMyKGNvbCwgZGVwdGgpLCB2ZWMyKFwiK2ErXCIsIDEpKTtcXG4gICAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXFxuICAgICAgICAgICAgICAgICAgICAgdmVjMihcIitkK1wiLjAsIFwiK3ArXCIuMCk7XFxuICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKFwiK24rXCIsIHV2KTtcXG4gICAgICAgIH1cXG4gICAgICBcIjpkPT09YT9cIlxcbiAgICBmbG9hdCBcIityK1wiKGludCByb3csIGludCBjb2wsIGludCBkZXB0aCkge1xcbiAgICAgIGZsb2F0IHRleFIgPSBkb3QodmVjMihyb3csIGNvbCksIHZlYzIoXCIrdFsxXStcIiwgMSkpO1xcbiAgICAgIGZsb2F0IHRleEMgPSBmbG9hdChkZXB0aCk7XFxuICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIoXCIrZCtcIi4wLCBcIitwK1wiLjApO1xcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKFwiK24rXCIsIHV2KTtcXG4gICAgfVxcbiAgXCI6XCJcXG4gICAgICBmbG9hdCBcIityK1wiKGludCByb3csIGludCBjb2wsIGludCBkZXB0aCkge1xcbiAgICAgICAgdmVjMiB1diA9IFVWZnJvbTNEKFxcbiAgICAgICAgICAgIFwiK3ArXCIsIFwiK2QrXCIsIFwiK28rXCIsIFwiK2ErXCIsIHJvdywgY29sLCBkZXB0aCk7XFxuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZShcIituK1wiLCB1dik7XFxuICAgICAgfVxcbiAgXCJ9ZnVuY3Rpb24gZ2V0U2FtcGxlcjREKGUpe3ZhciB0PWUuc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZSxuPWUubmFtZSxyPVwiZ2V0XCIrbi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStuLnNsaWNlKDEpLG89dFszXSxhPXRbMl0qbyxpPXRbMV0qYSxzPXNxdWVlemVTaGFwZSh0KSx1PXMubmV3U2hhcGUsbD1zLmtlcHREaW1zO2lmKHUubGVuZ3RoPHQubGVuZ3RoKXtyZXR1cm5cIlxcbiAgICAgIFwiK2dldFNhbXBsZXJGcm9tSW5JbmZvKHNxdWVlemVJbnB1dEluZm8oZSx1KSkrXCJcXG4gICAgICBmbG9hdCBcIityK1wiKGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMikge1xcbiAgICAgICAgcmV0dXJuIFwiK3IrXCIoXCIrZ2V0U3F1ZWV6ZWRQYXJhbXMoW1wicm93XCIsXCJjb2xcIixcImRlcHRoXCIsXCJkZXB0aDJcIl0sbCkrXCIpO1xcbiAgICAgIH1cXG4gICAgXCJ9aWYoZS5zaGFwZUluZm8uaXNVbmlmb3JtKXJldHVyblwiXFxuICAgICAgZmxvYXQgXCIrcitcIihpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcXG4gICAgICAgIGZsb2F0IGluZGV4ID0gZG90KHZlYzQocm93LCBjb2wsIGRlcHRoLCBkZXB0aDIpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjNChcIitpK1wiLCBcIithK1wiLCBcIitvK1wiLCAxKSk7XFxuICAgICAgICByZXR1cm4gXCIrcitcIkZsYXQocm91bmQoaW5kZXgpKTtcXG4gICAgICB9XFxuICAgIFwiO3ZhciBjPWUuc2hhcGVJbmZvLnRleFNoYXBlLHA9Y1swXSxkPWNbMV07cmV0dXJuIGQ9PT1pP1wiXFxuICAgICAgZmxvYXQgXCIrcitcIihpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcXG4gICAgICAgIGZsb2F0IHRleFIgPSBmbG9hdChyb3cpO1xcbiAgICAgICAgZmxvYXQgdGV4QyA9XFxuICAgICAgICAgICAgZG90KHZlYzMoY29sLCBkZXB0aCwgZGVwdGgyKSwgdmVjMyhcIithK1wiLCBcIitvK1wiLCAxKSk7XFxuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cXG4gICAgICAgICAgICAgICAgICAgdmVjMihcIitkK1wiLjAsIFwiK3ArXCIuMCk7XFxuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZShcIituK1wiLCB1dik7XFxuICAgICAgfVxcbiAgICBcIjpkPT09bz9cIlxcbiAgICAgIGZsb2F0IFwiK3IrXCIoaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyKSB7XFxuICAgICAgICBmbG9hdCB0ZXhSID0gZG90KHZlYzMocm93LCBjb2wsIGRlcHRoKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmVjMyhcIit0WzFdKnRbMl0rXCIsIFwiK3RbMl0rXCIsIDEpKTtcXG4gICAgICAgIGZsb2F0IHRleEMgPSBmbG9hdChkZXB0aDIpO1xcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXFxuICAgICAgICAgICAgICAgICAgdmVjMihcIitkK1wiLjAsIFwiK3ArXCIuMCk7XFxuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZShcIituK1wiLCB1dik7XFxuICAgICAgfVxcbiAgICBcIjpcIlxcbiAgICBmbG9hdCBcIityK1wiKGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMikge1xcbiAgICAgIHZlYzIgdXYgPSBVVmZyb200RChcIitwK1wiLCBcIitkK1wiLCBcIitpK1wiLCBcIithK1wiLFxcbiAgICAgICAgICBcIitvK1wiLCByb3csIGNvbCwgZGVwdGgsIGRlcHRoMik7XFxuICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoXCIrbitcIiwgdXYpO1xcbiAgICB9XFxuICBcIn1mdW5jdGlvbiBnZXRTYW1wbGVyNUQoZSl7dmFyIHQ9ZS5zaGFwZUluZm8ubG9naWNhbFNoYXBlLG49ZS5uYW1lLHI9XCJnZXRcIituLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK24uc2xpY2UoMSksbz10WzRdLGE9dFszXSpvLGk9dFsyXSphLHM9dFsxXSppLHU9c3F1ZWV6ZVNoYXBlKHQpLGw9dS5uZXdTaGFwZSxjPXUua2VwdERpbXM7aWYobC5sZW5ndGg8dC5sZW5ndGgpe3JldHVyblwiXFxuICAgICAgXCIrZ2V0U2FtcGxlckZyb21JbkluZm8oc3F1ZWV6ZUlucHV0SW5mbyhlLGwpKStcIlxcbiAgICAgIGZsb2F0IFwiK3IrXCIoaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzKSB7XFxuICAgICAgICByZXR1cm4gXCIrcitcIihcIitnZXRTcXVlZXplZFBhcmFtcyhbXCJyb3dcIixcImNvbFwiLFwiZGVwdGhcIixcImRlcHRoMlwiLFwiZGVwdGgzXCJdLGMpK1wiKTtcXG4gICAgICB9XFxuICAgIFwifWlmKGUuc2hhcGVJbmZvLmlzVW5pZm9ybSlyZXR1cm5cIlxcbiAgICAgIGZsb2F0IFwiK3IrXCIoaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzKSB7XFxuICAgICAgICBmbG9hdCBpbmRleCA9IGRvdChcXG4gICAgICAgICAgdmVjNChyb3csIGNvbCwgZGVwdGgsIGRlcHRoMiksXFxuICAgICAgICAgIHZlYzQoXCIrcytcIiwgXCIraStcIiwgXCIrYStcIiwgXCIrbytcIikpICtcXG4gICAgICAgICAgZGVwdGgzO1xcbiAgICAgICAgcmV0dXJuIFwiK3IrXCJGbGF0KGluZGV4KTtcXG4gICAgICB9XFxuICAgIFwiO3ZhciBwPWUuc2hhcGVJbmZvLnRleFNoYXBlLGQ9cFswXSxoPXBbMV07cmV0dXJuIGg9PT1zP1wiXFxuICAgICAgZmxvYXQgXCIrcitcIihpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIsIGludCBkZXB0aDMpIHtcXG4gICAgICAgIGludCB0ZXhSID0gcm93O1xcbiAgICAgICAgZmxvYXQgdGV4QyA9IGRvdChcXG4gICAgICAgICAgdmVjNChjb2wsIGRlcHRoLCBkZXB0aDIsIGRlcHRoMyksXFxuICAgICAgICAgIHZlYzQoXCIraStcIiwgXCIrYStcIiwgXCIrbytcIiwgMSkpO1xcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXFxuICAgICAgICAgICAgICAgICAgIHZlYzIoXCIraCtcIi4wLCBcIitkK1wiLjApO1xcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoXCIrbitcIiwgdXYpO1xcbiAgICAgIH1cXG4gICAgXCI6aD09PW8/XCJcXG4gICAgICBmbG9hdCBcIityK1wiKGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMiwgaW50IGRlcHRoMykge1xcbiAgICAgICAgZmxvYXQgdGV4UiA9IGRvdChcXG4gICAgICAgICAgdmVjNChyb3csIGNvbCwgZGVwdGgsIGRlcHRoMiksXFxuICAgICAgICAgIHZlYzQoXCIrdFsxXSp0WzJdKnRbM10rXCIsIFwiK3RbMl0qdFszXStcIixcXG4gICAgICAgICAgICBcIit0WzNdK1wiLCAxKSk7XFxuICAgICAgICBpbnQgdGV4QyA9IGRlcHRoMztcXG4gICAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgL1xcbiAgICAgICAgICAgICAgICAgIHZlYzIoXCIraCtcIi4wLCBcIitkK1wiLjApO1xcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoXCIrbitcIiwgdXYpO1xcbiAgICAgIH1cXG4gICAgXCI6XCJcXG4gICAgZmxvYXQgXCIrcitcIihpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIsIGludCBkZXB0aDMpIHtcXG4gICAgICB2ZWMyIHV2ID0gVVZmcm9tNUQoXCIrZCtcIiwgXCIraCtcIiwgXCIrcytcIiwgXCIraStcIixcXG4gICAgICAgICAgXCIrYStcIiwgXCIrbytcIiwgcm93LCBjb2wsIGRlcHRoLCBkZXB0aDIsIGRlcHRoMyk7XFxuICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoXCIrbitcIiwgdXYpO1xcbiAgICB9XFxuICBcIn1mdW5jdGlvbiBnZXRTYW1wbGVyNkQoZSl7dmFyIHQ9ZS5zaGFwZUluZm8ubG9naWNhbFNoYXBlLG49ZS5uYW1lLHI9XCJnZXRcIituLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK24uc2xpY2UoMSksbz10WzVdLGE9dFs0XSpvLGk9dFszXSphLHM9dFsyXSppLHU9dFsxXSpzLGw9c3F1ZWV6ZVNoYXBlKHQpLGM9bC5uZXdTaGFwZSxwPWwua2VwdERpbXM7aWYoYy5sZW5ndGg8dC5sZW5ndGgpe3JldHVyblwiXFxuICAgICAgXCIrZ2V0U2FtcGxlckZyb21JbkluZm8oc3F1ZWV6ZUlucHV0SW5mbyhlLGMpKStcIlxcbiAgICAgIGZsb2F0IFwiK3IrXCIoaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxcbiAgICAgICAgICAgICAgICAgICAgaW50IGRlcHRoMiwgaW50IGRlcHRoMywgaW50IGRlcHRoNCkge1xcbiAgICAgICAgcmV0dXJuIFwiK3IrXCIoXCIrZ2V0U3F1ZWV6ZWRQYXJhbXMoW1wicm93XCIsXCJjb2xcIixcImRlcHRoXCIsXCJkZXB0aDJcIixcImRlcHRoM1wiLFwiZGVwdGg0XCJdLHApK1wiKTtcXG4gICAgICB9XFxuICAgIFwifWlmKGUuc2hhcGVJbmZvLmlzVW5pZm9ybSlyZXR1cm5cIlxcbiAgICAgIGZsb2F0IFwiK3IrXCIoaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxcbiAgICAgICAgICAgICAgICAgIGludCBkZXB0aDIsIGludCBkZXB0aDMsIGludCBkZXB0aDQpIHtcXG4gICAgICAgIGZsb2F0IGluZGV4ID0gZG90KFxcbiAgICAgICAgICB2ZWM0KHJvdywgY29sLCBkZXB0aCwgZGVwdGgyKSxcXG4gICAgICAgICAgdmVjNChcIit1K1wiLCBcIitzK1wiLCBcIitpK1wiLCBcIithK1wiKSkgK1xcbiAgICAgICAgICBkb3QoXFxuICAgICAgICAgICAgdmVjMihkZXB0aDMsIGRlcHRoNCksXFxuICAgICAgICAgICAgdmVjMihcIitvK1wiLCAxKSk7XFxuICAgICAgICByZXR1cm4gXCIrcitcIkZsYXQoaW5kZXgpO1xcbiAgICAgIH1cXG4gICAgXCI7dmFyIGQ9ZS5zaGFwZUluZm8udGV4U2hhcGUsaD1kWzBdLGY9ZFsxXTtyZXR1cm4gZj09PXU/XCJcXG4gICAgICBmbG9hdCBcIityK1wiKGludCByb3csIGludCBjb2wsIGludCBkZXB0aCxcXG4gICAgICAgICAgICAgICAgICAgIGludCBkZXB0aDIsIGludCBkZXB0aDMsIGludCBkZXB0aDQpIHtcXG4gICAgICAgIGludCB0ZXhSID0gcm93O1xcbiAgICAgICAgZmxvYXQgdGV4QyA9IGRvdChcXG4gICAgICAgICAgdmVjNChjb2wsIGRlcHRoLCBkZXB0aDIsIGRlcHRoMyksXFxuICAgICAgICAgIHZlYzQoXCIrcytcIiwgXCIraStcIiwgXCIrYStcIiwgXCIrbytcIikpICsgZGVwdGg0O1xcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXFxuICAgICAgICAgICAgICAgICAgIHZlYzIoXCIrZitcIi4wLCBcIitoK1wiLjApO1xcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoXCIrbitcIiwgdXYpO1xcbiAgICAgIH1cXG4gICAgXCI6Zj09PW8/XCJcXG4gICAgICBmbG9hdCBcIityK1wiKGludCByb3csIGludCBjb2wsIGludCBkZXB0aCxcXG4gICAgICAgICAgICAgICAgICAgIGludCBkZXB0aDIsIGludCBkZXB0aDMsIGludCBkZXB0aDQpIHtcXG4gICAgICAgIGZsb2F0IHRleFIgPSBkb3QoXFxuICAgICAgICAgIHZlYzQocm93LCBjb2wsIGRlcHRoLCBkZXB0aDIpLFxcbiAgICAgICAgICB2ZWM0KFwiK3RbMV0qdFsyXSp0WzNdKnRbNF0rXCIsXFxuICAgICAgICAgICAgICAgXCIrdFsyXSp0WzNdKnRbNF0rXCIsXFxuICAgICAgICAgICAgICAgXCIrdFszXSp0WzRdK1wiLFxcbiAgICAgICAgICAgICAgIFwiK3RbNF0rXCIpKSArIGRlcHRoMztcXG4gICAgICAgIGludCB0ZXhDID0gZGVwdGg0O1xcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXFxuICAgICAgICAgICAgICAgICAgdmVjMihcIitmK1wiLjAsIFwiK2grXCIuMCk7XFxuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZShcIituK1wiLCB1dik7XFxuICAgICAgfVxcbiAgICBcIjpcIlxcbiAgICBmbG9hdCBcIityK1wiKGludCByb3csIGludCBjb2wsIGludCBkZXB0aCxcXG4gICAgICAgICAgICAgICAgICBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzLCBpbnQgZGVwdGg0KSB7XFxuICAgICAgdmVjMiB1diA9IFVWZnJvbTZEKFwiK2grXCIsIFwiK2YrXCIsIFwiK3UrXCIsIFwiK3MrXCIsXFxuICAgICAgICAgIFwiK2krXCIsIFwiK2ErXCIsIFwiK28rXCJcXG4gICAgICAgICAgLHJvdywgY29sLCBkZXB0aCwgZGVwdGgyLCBkZXB0aDMsIGRlcHRoNCk7XFxuICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoXCIrbitcIiwgdXYpO1xcbiAgICB9XFxuICBcIn1mdW5jdGlvbiBnZXRTYW1wbGVyRmxhdChlKXt2YXIgdD1lLm5hbWUsbj1cImdldFwiK3QuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKStcIkZsYXRcIixyPXNpemVGcm9tU2hhcGUoZS5zaGFwZUluZm8ubG9naWNhbFNoYXBlKTtpZihlLnNoYXBlSW5mby5pc1VuaWZvcm0pcmV0dXJuIDE9PT1yP1wiZmxvYXQgXCIrbitcIihpbnQgaW5kZXgpIHtyZXR1cm4gXCIrdCtcIjt9XCI6XCJcXG4gICAgICBmbG9hdCBcIituK1wiKGludCBpbmRleCkge1xcbiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBcIityK1wiOyBpKyspIHtcXG4gICAgICAgICAgaWYgKGkgPT0gaW5kZXgpIHtcXG4gICAgICAgICAgICByZXR1cm4gXCIrdCtcIltpXTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgIH1cXG4gICAgXCI7dmFyIG89ZS5zaGFwZUluZm8udGV4U2hhcGUsYT1vWzBdLGk9b1sxXTtyZXR1cm4gMT09PWkmJjE9PT1hP1wiXFxuICAgICAgZmxvYXQgXCIrbitcIihpbnQgaW5kZXgpIHtcXG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKFwiK3QrXCIsIGhhbGZDUik7XFxuICAgICAgfVxcbiAgICBcIjoxPT09aT9cIlxcbiAgICAgIGZsb2F0IFwiK24rXCIoaW50IGluZGV4KSB7XFxuICAgICAgICB2ZWMyIHV2ID0gdmVjMigwLjUsIChmbG9hdChpbmRleCkgKyAwLjUpIC8gXCIrYStcIi4wKTtcXG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKFwiK3QrXCIsIHV2KTtcXG4gICAgICB9XFxuICAgIFwiOjE9PT1hP1wiXFxuICAgICAgZmxvYXQgXCIrbitcIihpbnQgaW5kZXgpIHtcXG4gICAgICAgIHZlYzIgdXYgPSB2ZWMyKChmbG9hdChpbmRleCkgKyAwLjUpIC8gXCIraStcIi4wLCAwLjUpO1xcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoXCIrdCtcIiwgdXYpO1xcbiAgICAgIH1cXG4gICAgXCI6XCJcXG4gICAgZmxvYXQgXCIrbitcIihpbnQgaW5kZXgpIHtcXG4gICAgICB2ZWMyIHV2ID0gVVZmcm9tMUQoXCIrYStcIiwgXCIraStcIiwgaW5kZXgpO1xcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKFwiK3QrXCIsIHV2KTtcXG4gICAgfVxcbiAgXCJ9ZnVuY3Rpb24gZ2V0QnJvYWRjYXN0T3V0cHV0Q29vcmRzU2FtcGxlcihlLHQsbixyKXt2YXIgbz1lLnNoYXBlSW5mby5sb2dpY2FsU2hhcGUubGVuZ3RoLGE9dC5sb2dpY2FsU2hhcGUubGVuZ3RoLGk9XCJpbnRcIjsyPT09YT9pPVwiaXZlYzJcIjozPT09YT9pPVwiaXZlYzNcIjo0PT09YSYmKGk9XCJpdmVjNFwiKTt2YXIgcz1nZXRCcm9hZGNhc3REaW1zKGUuc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZSx0LmxvZ2ljYWxTaGFwZSksdT1hLW87cmV0dXJuXCJcXG4gICAgZmxvYXQgXCIrcitcIigpIHtcXG4gICAgICBcIitpK1wiIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xcbiAgICAgIFwiKygwPT09bz9cIlwiOmE8MiYmcy5sZW5ndGg+PTE/XCJjb29yZHMgPSAwO1wiOnMubWFwKGZ1bmN0aW9uKGUpe3JldHVyblwiY29vcmRzW1wiKyhlK3UpK1wiXSA9IDA7XCJ9KS5qb2luKFwiXFxuXCIpKStcIlxcbiAgICAgIHJldHVybiBnZXRcIituK1wiKFwiKyhhPDImJm8+MD9cImNvb3Jkc1wiOmUuc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZS5tYXAoZnVuY3Rpb24oZSx0KXtyZXR1cm5cImNvb3Jkc1tcIisodCt1KStcIl1cIn0pLmpvaW4oXCIsIFwiKSkrXCIpO1xcbiAgICB9XFxuICBcIn1mdW5jdGlvbiBnZXRTYW1wbGVyQXRPdXRwdXRDb29yZHMoZSx0LG4pe3ZhciByPWUubmFtZSxvPXIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrci5zbGljZSgxKSxhPVwiZ2V0XCIrbytcIkF0T3V0Q29vcmRzXCIsaT1nZXRCcm9hZGNhc3REaW1zKGUuc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZSx0LmxvZ2ljYWxTaGFwZSkscz1lLnNoYXBlSW5mby5sb2dpY2FsU2hhcGUubGVuZ3RoLHU9dC5sb2dpY2FsU2hhcGUubGVuZ3RoLGw9biYmKHU+c3x8aS5sZW5ndGg+MCksYz1icm9hZGNhc3REaW1zQXJlT3V0ZXIoaSkscD1lLnNoYXBlSW5mby5pc1VuaWZvcm07aWYobCYmIWMpcmV0dXJuIGdldEJyb2FkY2FzdE91dHB1dENvb3Jkc1NhbXBsZXIoZSx0LG8sYSk7dmFyIGQ9c2l6ZUZyb21TaGFwZShlLnNoYXBlSW5mby5sb2dpY2FsU2hhcGUpLGg9XCJcIjtsJiZjJiYoaD1cIlxcbiAgICAgICAgaW50IG1haW5QYXJ0ID0gaW5kZXggLyBcIitkK1wiO1xcbiAgICAgICAgaW5kZXggLT0gbWFpblBhcnQgKiBcIitkK1wiO1xcbiAgICAgIFwiKTt2YXIgZj10LnRleFNoYXBlO2lmKHApcmV0dXJuIDE9PT1kP1wiZmxvYXQgXCIrYStcIigpIHtyZXR1cm4gXCIrcitcIjt9XCI6XCJcXG4gICAgICBmbG9hdCBcIithK1wiKCkge1xcbiAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihcIitmWzBdK1wiLCBcIitmWzFdK1wiKSk7XFxuICAgICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogXCIrZlsxXStcIiArIHJlc1RleFJDLnk7XFxuICAgICAgICBcIitoK1wiXFxuICAgICAgICByZXR1cm4gZ2V0XCIrbytcIkZsYXQoaW5kZXgpO1xcbiAgICAgIH1cXG4gICAgXCI7dmFyIG09ZS5zaGFwZUluZm8udGV4U2hhcGU7cmV0dXJuIGFycmF5c0VxdWFsKG0sZik/XCJcXG4gICAgICBmbG9hdCBcIithK1wiKCkge1xcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoXCIrcitcIiwgcmVzdWx0VVYpO1xcbiAgICAgIH1cXG4gICAgXCI6XCJcXG4gICAgZmxvYXQgXCIrYStcIigpIHtcXG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoXCIrZlswXStcIiwgXCIrZlsxXStcIikpO1xcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBcIitmWzFdK1wiICsgcmVzVGV4UkMueTtcXG4gICAgICBcIitoK1wiXFxuICAgICAgaW50IHRleFIgPSBpbmRleCAvIFwiK21bMV0rXCI7XFxuICAgICAgaW50IHRleEMgPSBpbmRleCAtIHRleFIgKiBcIittWzFdK1wiO1xcbiAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgL1xcbiAgICAgICAgICAgICAgICAgdmVjMihcIittWzFdK1wiLjAsIFwiK21bMF0rXCIuMCk7XFxuXFxuICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoXCIrcitcIiwgdXYpO1xcbiAgICB9XFxuICBcIn1mdW5jdGlvbiBnZXRDb29yZHNEYXRhVHlwZShlKXtpZihlPD0xKXJldHVyblwiaW50XCI7aWYoMj09PWUpcmV0dXJuXCJpdmVjMlwiO2lmKDM9PT1lKXJldHVyblwiaXZlYzNcIjtpZig0PT09ZSlyZXR1cm5cIml2ZWM0XCI7aWYoNT09PWUpcmV0dXJuXCJpdmVjNVwiO2lmKDY9PT1lKXJldHVyblwiaXZlYzZcIjt0aHJvdyBFcnJvcihcIkdQVSBmb3IgcmFuayBcIitlK1wiIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCIpfWZ1bmN0aW9uIHNxdWVlemVJbnB1dEluZm8oZSx0KXt2YXIgbj1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKTtyZXR1cm4gbi5zaGFwZUluZm8ubG9naWNhbFNoYXBlPXQsbn1mdW5jdGlvbiBnZXRTcXVlZXplZFBhcmFtcyhlLHQpe3JldHVybiB0Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0pLmpvaW4oXCIsIFwiKX12YXIgQ3VtU3VtUHJvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLHQsbil7dGhpcy52YXJpYWJsZU5hbWVzPVtcInhcIl0sdGhpcy5vdXRwdXRTaGFwZT1lO3ZhciByPWUubGVuZ3RoLG89ZVtlLmxlbmd0aC0xXSxhPW4/XCI8XCI6XCI+XCI7dGhpcy51c2VyQ29kZT1cIlxcbiAgICAgIGludCBnZXRJbmRleChpbnQgaSkge1xcbiAgICAgICAgXCIrKG4/XCJyZXR1cm4gXCIrbytcIiAtaSAtIDE7XCI6XCJyZXR1cm4gaTtcIikrXCJcXG4gICAgICB9XFxuXFxuICAgICAgdm9pZCBtYWluKCkge1xcbiAgICAgICAgXCIrZ2V0Q29vcmRzRGF0YVR5cGUocikrXCIgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XFxuICAgICAgICBpbnQgZW5kID0gXCIrZ2V0RmluYWxDb29yZChyLFwiY29vcmRzXCIpK1wiO1xcbiAgICAgICAgZmxvYXQgdmFsID0gMC4wO1xcbiAgICAgICAgZm9yIChpbnQgaSA9IFwiK28rXCIgLSAxOyBpID49IDA7IGkgLT0gMSkge1xcbiAgICAgICAgICBpbnQgaWR4ID0gZ2V0SW5kZXgoaSk7XFxuICAgICAgICAgIGlmIChpZHggXCIrYStcIiBlbmQpIHtcXG4gICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBpZiAoaWR4ID09IGVuZCAmJiBcIit0K1wiKSB7XFxuICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgXCIrZ2V0RmluYWxDb29yZChyLFwiY29vcmRzXCIpK1wiID0gaWR4O1xcbiAgICAgICAgICB2YWwgKz0gZ2V0WChcIitnZXRDb29yZHMocixcImNvb3Jkc1wiKStcIik7XFxuICAgICAgICB9XFxuICAgICAgICBzZXRPdXRwdXQodmFsKTtcXG4gICAgICB9XFxuICAgIFwifX0oKTtmdW5jdGlvbiBnZXRDb29yZHMoZSx0KXtpZigxPT09ZSlyZXR1cm5cIlwiK3Q7aWYoMj09PWUpcmV0dXJuIHQrXCIueCwgXCIrdCtcIi55XCI7aWYoMz09PWUpcmV0dXJuIHQrXCIueCwgXCIrdCtcIi55LCBcIit0K1wiLnpcIjtpZig0PT09ZSlyZXR1cm4gdCtcIi54LCBcIit0K1wiLnksIFwiK3QrXCIueiwgXCIrdCtcIi53XCI7dGhyb3cgRXJyb3IoXCJDdW11bGF0aXZlIHN1bSBmb3IgcmFuayBcIitlK1wiIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCIpfWZ1bmN0aW9uIGdldEZpbmFsQ29vcmQoZSx0KXtpZigxPT09ZSlyZXR1cm5cIlwiK3Q7aWYoMj09PWUpcmV0dXJuIHQrXCIueVwiO2lmKDM9PT1lKXJldHVybiB0K1wiLnpcIjtpZig0PT09ZSlyZXR1cm4gdCtcIi53XCI7dGhyb3cgRXJyb3IoXCJDdW11bGF0aXZlIHN1bSBmb3IgcmFuayBcIitlK1wiIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCIpfXZhciBEZXB0aFRvU3BhY2VQcm9ncmFtPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQsbil7dGhpcy52YXJpYWJsZU5hbWVzPVtcInhcIl0sdGhpcy5vdXRwdXRTaGFwZT1bXSx0aGlzLm91dHB1dFNoYXBlPWUsdGhpcy5ibG9ja1NpemU9dCx0aGlzLmRhdGFGb3JtYXQ9bix0aGlzLnVzZXJDb2RlPVwiXFxuICAgIHZvaWQgbWFpbigpIHtcXG4gICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcXG4gICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcXG4gICAgICBpbnQgaCA9IFwiK3RoaXMuZ2V0SGVpZ2h0Q29vcmRTdHJpbmcoKStcIjtcXG4gICAgICBpbnQgdyA9IFwiK3RoaXMuZ2V0V2lkdGhDb29yZFN0cmluZygpK1wiO1xcbiAgICAgIGludCBkID0gXCIrdGhpcy5nZXREZXB0aENvb3JkU3RyaW5nKCkrXCI7XFxuXFxuICAgICAgaW50IGluX2ggPSBoIC8gXCIrdCtcIjtcXG4gICAgICBpbnQgb2Zmc2V0X2ggPSBpbW9kKGgsIFwiK3QrXCIpO1xcbiAgICAgIGludCBpbl93ID0gdyAvIFwiK3QrXCI7XFxuICAgICAgaW50IG9mZnNldF93ID0gaW1vZCh3LCBcIit0K1wiKTtcXG4gICAgICBpbnQgb2Zmc2V0X2QgPSAob2Zmc2V0X2ggKiBcIit0K1wiICsgb2Zmc2V0X3cpICpcXG4gICAgICAgIFwiK3RoaXMuZ2V0T3V0cHV0RGVwdGhTaXplKCkrXCI7XFxuICAgICAgaW50IGluX2QgPSBkICsgb2Zmc2V0X2Q7XFxuXFxuICAgICAgZmxvYXQgcmVzdWx0ID0gXCIrdGhpcy5nZXRJbnB1dFNhbXBsaW5nU3RyaW5nKCkrXCI7XFxuICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XFxuICAgIH1cXG4gIFwifXJldHVybiBlLnByb3RvdHlwZS5nZXRIZWlnaHRDb29yZFN0cmluZz1mdW5jdGlvbigpe3JldHVyblwiTkhXQ1wiPT09dGhpcy5kYXRhRm9ybWF0P1wiY29vcmRzWzFdXCI6XCJjb29yZHNbMl1cIn0sZS5wcm90b3R5cGUuZ2V0V2lkdGhDb29yZFN0cmluZz1mdW5jdGlvbigpe3JldHVyblwiTkhXQ1wiPT09dGhpcy5kYXRhRm9ybWF0P1wiY29vcmRzWzJdXCI6XCJjb29yZHNbM11cIn0sZS5wcm90b3R5cGUuZ2V0RGVwdGhDb29yZFN0cmluZz1mdW5jdGlvbigpe3JldHVyblwiTkhXQ1wiPT09dGhpcy5kYXRhRm9ybWF0P1wiY29vcmRzWzNdXCI6XCJjb29yZHNbMV1cIn0sZS5wcm90b3R5cGUuZ2V0T3V0cHV0RGVwdGhTaXplPWZ1bmN0aW9uKCl7cmV0dXJuXCJOSFdDXCI9PT10aGlzLmRhdGFGb3JtYXQ/dGhpcy5vdXRwdXRTaGFwZVszXTp0aGlzLm91dHB1dFNoYXBlWzFdfSxlLnByb3RvdHlwZS5nZXRJbnB1dFNhbXBsaW5nU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJOSFdDXCI9PT10aGlzLmRhdGFGb3JtYXQ/XCJnZXRYKGIsIGluX2gsIGluX3csIGluX2QpXCI6XCJnZXRYKGIsIGluX2QsIGluX2gsIGluX3cpXCJ9LGV9KCksRW5jb2RlRmxvYXRQcm9ncmFtPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3RoaXMudmFyaWFibGVOYW1lcz1bXCJBXCJdLHRoaXMub3V0cHV0U2hhcGU9ZSx0aGlzLnVzZXJDb2RlPVwiXFxuICAgICAgY29uc3QgZmxvYXQgRkxPQVRfTUFYID0gMS43MDE0MTE4NGUzODtcXG4gICAgICBjb25zdCBmbG9hdCBGTE9BVF9NSU4gPSAxLjE3NTQ5NDM1ZS0zODtcXG5cXG4gICAgICBsb3dwIHZlYzQgZW5jb2RlX2Zsb2F0KGhpZ2hwIGZsb2F0IHYpIHtcXG4gICAgICAgIGlmIChpc05hTih2KSkge1xcbiAgICAgICAgICByZXR1cm4gdmVjNCgyNTUsIDI1NSwgMjU1LCAyNTUpO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgaGlnaHAgZmxvYXQgYXYgPSBhYnModik7XFxuXFxuICAgICAgICBpZihhdiA8IEZMT0FUX01JTikge1xcbiAgICAgICAgICByZXR1cm4gdmVjNCgwLjAsIDAuMCwgMC4wLCAwLjApO1xcbiAgICAgICAgfSBlbHNlIGlmKHYgPiBGTE9BVF9NQVgpIHtcXG4gICAgICAgICAgcmV0dXJuIHZlYzQoMC4wLCAwLjAsIDEyOC4wLCAxMjcuMCkgLyAyNTUuMDtcXG4gICAgICAgIH0gZWxzZSBpZih2IDwgLUZMT0FUX01BWCkge1xcbiAgICAgICAgICByZXR1cm4gdmVjNCgwLjAsIDAuMCwgIDEyOC4wLCAyNTUuMCkgLyAyNTUuMDtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIGhpZ2hwIHZlYzQgYyA9IHZlYzQoMCwwLDAsMCk7XFxuXFxuICAgICAgICBoaWdocCBmbG9hdCBlID0gZmxvb3IobG9nMihhdikpO1xcbiAgICAgICAgaGlnaHAgZmxvYXQgbSA9IGV4cDIoZnJhY3QobG9nMihhdikpKSAtIDEuMDtcXG5cXG4gICAgICAgIGNbMl0gPSBmbG9vcigxMjguMCAqIG0pO1xcbiAgICAgICAgbSAtPSBjWzJdIC8gMTI4LjA7XFxuICAgICAgICBjWzFdID0gZmxvb3IoMzI3NjguMCAqIG0pO1xcbiAgICAgICAgbSAtPSBjWzFdIC8gMzI3NjguMDtcXG4gICAgICAgIGNbMF0gPSBmbG9vcig4Mzg4NjA4LjAgKiBtKTtcXG5cXG4gICAgICAgIGhpZ2hwIGZsb2F0IGViaWFzID0gZSArIDEyNy4wO1xcbiAgICAgICAgY1szXSA9IGZsb29yKGViaWFzIC8gMi4wKTtcXG4gICAgICAgIGViaWFzIC09IGNbM10gKiAyLjA7XFxuICAgICAgICBjWzJdICs9IGZsb29yKGViaWFzKSAqIDEyOC4wO1xcblxcbiAgICAgICAgY1szXSArPSAxMjguMCAqIHN0ZXAoMC4wLCAtdik7XFxuXFxuICAgICAgICByZXR1cm4gYyAvIDI1NS4wO1xcbiAgICAgIH1cXG5cXG4gICAgICB2b2lkIG1haW4oKSB7XFxuICAgICAgICBmbG9hdCB4ID0gZ2V0QUF0T3V0Q29vcmRzKCk7XFxuICAgICAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVfZmxvYXQoeCk7XFxuICAgICAgfVxcbiAgICBcIn19KCksQ09NUExFWF9GRlQ9e1JFQUw6XCJyZXR1cm4gcmVhbCAqIGV4cFIgLSBpbWFnICogZXhwSTtcIixJTUFHOlwicmV0dXJuIHJlYWwgKiBleHBJICsgaW1hZyAqIGV4cFI7XCJ9LEZGVFByb2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt0aGlzLnZhcmlhYmxlTmFtZXM9W1wicmVhbFwiLFwiaW1hZ1wiXTt2YXIgbj10WzBdO3RoaXMub3V0cHV0U2hhcGU9W25dLHRoaXMudXNlckNvZGU9XCJcXG4gICAgICBmbG9hdCB1bmFyeU9wQ29tcGxleChmbG9hdCByZWFsLCBmbG9hdCBleHBSLCBmbG9hdCBpbWFnLCBmbG9hdCBleHBJKSB7XFxuICAgICAgICBcIitlK1wiXFxuICAgICAgfVxcblxcbiAgICAgIGZsb2F0IG11bE1hdERGVChpbnQgcm93KSB7XFxuICAgICAgICAvLyBUT0RPOiBHYXRoZXIgY29uc3RhbnRzIGluIG9uZSBwbGFjZT9cXG4gICAgICAgIGNvbnN0IGZsb2F0IFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1O1xcbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gMC4wO1xcblxcbiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBcIituK1wiOyBpKyspIHtcXG4gICAgICAgICAgZmxvYXQgeCA9IC0yLjAgKiBQSSAqIGZsb2F0KHJvdyAqIGkpIC8gZmxvYXQoXCIrbitcIik7XFxuICAgICAgICAgIGZsb2F0IGV4cFIgPSBjb3MoeCk7XFxuICAgICAgICAgIGZsb2F0IGV4cEkgPSBzaW4oeCk7XFxuICAgICAgICAgIGZsb2F0IHJlYWwgPSBnZXRSZWFsKGkpO1xcbiAgICAgICAgICBmbG9hdCBpbWFnID0gZ2V0SW1hZyhpKTtcXG5cXG4gICAgICAgICAgcmVzdWx0ICs9IHVuYXJ5T3BDb21wbGV4KHJlYWwsIGV4cFIsIGltYWcsIGV4cEkpO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgICB9XFxuXFxuICAgICAgdm9pZCBtYWluKCkge1xcbiAgICAgICAgaW50IHJvdyA9IGdldE91dHB1dENvb3JkcygpO1xcbiAgICAgICAgc2V0T3V0cHV0KG11bE1hdERGVChyb3cpKTtcXG4gICAgICB9XFxuICAgIFwifX0oKSxGcm9tUGl4ZWxzUHJvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXt0aGlzLnZhcmlhYmxlTmFtZXM9W1wiQVwiXTt2YXIgdD1lWzBdLG49ZVsxXTt0aGlzLm91dHB1dFNoYXBlPWUsdGhpcy51c2VyQ29kZT1cIlxcbiAgICAgIHZvaWQgbWFpbigpIHtcXG4gICAgICAgIGl2ZWMzIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xcbiAgICAgICAgaW50IHRleFIgPSBjb29yZHNbMF07XFxuICAgICAgICBpbnQgdGV4QyA9IGNvb3Jkc1sxXTtcXG4gICAgICAgIGludCBkZXB0aCA9IGNvb3Jkc1syXTtcXG4gICAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKFwiK24rXCIuMCwgXCIrdCtcIi4wKTtcXG5cXG4gICAgICAgIHZlYzQgdmFsdWVzID0gdGV4dHVyZTJEKEEsIHV2KTtcXG4gICAgICAgIGZsb2F0IHZhbHVlO1xcbiAgICAgICAgaWYgKGRlcHRoID09IDApIHtcXG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZXMucjtcXG4gICAgICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMSkge1xcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5nO1xcbiAgICAgICAgfSBlbHNlIGlmIChkZXB0aCA9PSAyKSB7XFxuICAgICAgICAgIHZhbHVlID0gdmFsdWVzLmI7XFxuICAgICAgICB9IGVsc2UgaWYgKGRlcHRoID09IDMpIHtcXG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZXMuYTtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIHNldE91dHB1dChmbG9vcih2YWx1ZSAqIDI1NS4wICsgMC41KSk7XFxuICAgICAgfVxcbiAgICBcIn19KCksR2F0aGVyUHJvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLHQsbil7dGhpcy52YXJpYWJsZU5hbWVzPVtcIkFcIixcImluZGljZXNcIl07dmFyIHI9ZS5zbGljZSgpO3Jbbl09dCx0aGlzLm91dHB1dFNoYXBlPXIsdGhpcy5yYW5rPXIubGVuZ3RoO3ZhciBvPWdldENvb3Jkc0RhdGFUeXBlKHRoaXMucmFuayksYT1nZXRTb3VyY2VDb29yZHMoZSxuKTt0aGlzLnVzZXJDb2RlPVwiXFxuICAgICAgdm9pZCBtYWluKCkge1xcbiAgICAgICAgXCIrbytcIiByZXNSQyA9IGdldE91dHB1dENvb3JkcygpO1xcbiAgICAgICAgc2V0T3V0cHV0KGdldEEoXCIrYStcIikpO1xcbiAgICAgIH1cXG4gICAgXCJ9fSgpO2Z1bmN0aW9uIGdldFNvdXJjZUNvb3JkcyhlLHQpe3ZhciBuPWUubGVuZ3RoO2lmKG4+NCl0aHJvdyBFcnJvcihcIkdhdGhlciBmb3IgcmFuayBcIituK1wiIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCIpO2lmKDE9PT1uKXJldHVyblwiaW50KGdldEluZGljZXMocmVzUkMpKVwiO2Zvcih2YXIgcj1bXCJyZXNSQy54XCIsXCJyZXNSQy55XCIsXCJyZXNSQy56XCIsXCJyZXNSQy53XCJdLG89W10sYT0wO2E8ZS5sZW5ndGg7YSsrKWE9PT10P28ucHVzaChcImludChnZXRJbmRpY2VzKFwiK3JbYV0rXCIpKVwiKTpvLnB1c2goXCJcIityW2FdKTtyZXR1cm4gby5qb2luKCl9dmFyIFRleHR1cmVVc2FnZSxQaHlzaWNhbFRleHR1cmVUeXBlLEdhdGhlck5EUHJvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLHQsbil7dGhpcy5zbGljZURpbT1lLHRoaXMuc3RyaWRlcz10LHRoaXMudmFyaWFibGVOYW1lcz1bXCJ4XCIsXCJpbmRpY2VzXCJdLHRoaXMub3V0cHV0U2hhcGU9bjt2YXIgcj1nZXRDb29yZHNEYXRhVHlwZSh0Lmxlbmd0aCksbz1nZXRDb29yZHNEYXRhVHlwZShuLmxlbmd0aCksYT10aGlzLnNsaWNlRGltPjE/XCJzdHJpZGVzW2pdXCI6XCJzdHJpZGVzXCI7dGhpcy51c2VyQ29kZT1cIlxcbiAgICAgICAgXCIrcitcIiBzdHJpZGVzID0gXCIrcitcIihcIit0aGlzLnN0cmlkZXMrXCIpO1xcbiAgICAgICAgIHZvaWQgbWFpbigpIHtcXG4gICAgICAgICAgXCIrbytcIiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcXG4gICAgICAgICAgaW50IGZsYXR0ZW5JbmRleCA9IDA7XFxuICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgXCIrdGhpcy5zbGljZURpbStcIjsgaisrKSB7XFxuICAgICAgICAgICAgaW50IGluZGV4ID0gcm91bmQoZ2V0SW5kaWNlcyhjb29yZHNbMF0sIGopKTtcXG4gICAgICAgICAgICBmbGF0dGVuSW5kZXggKz0gaW5kZXggKiBcIithK1wiO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIHNldE91dHB1dChnZXRYKGZsYXR0ZW5JbmRleCwgY29vcmRzWzFdKSk7XFxuICAgICAgICB9XFxuICAgICAgXCJ9fSgpO2Z1bmN0aW9uIGdldFVucGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQoZSx0KXtyZXR1cm5bdCxlXX1mdW5jdGlvbiBnZXRVbnBhY2tlZEFycmF5U2l6ZUZyb21NYXRyaXhTaXplKGUsdCl7cmV0dXJuIGUqdH1mdW5jdGlvbiBnZXRNYXRyaXhTaXplRnJvbVVucGFja2VkQXJyYXlTaXplKGUsdCl7aWYoZSV0IT0wKXRocm93IG5ldyBFcnJvcihcInVucGFja2VkU2l6ZSAoXCIrZStcIikgbXVzdCBiZSBhIG11bHRpcGxlIG9mIFwiK3QpO3JldHVybiBlL3R9ZnVuY3Rpb24gZW5jb2RlTWF0cml4VG9VbnBhY2tlZEFycmF5KGUsdCxuKXt2YXIgcj1nZXRVbnBhY2tlZEFycmF5U2l6ZUZyb21NYXRyaXhTaXplKGUubGVuZ3RoLG4pO2lmKHQubGVuZ3RoPHIpdGhyb3cgbmV3IEVycm9yKFwidW5wYWNrZWRBcnJheSBsZW5ndGggKFwiK3QubGVuZ3RoK1wiKSBtdXN0IGJlID49IFwiK3IpO2Zvcih2YXIgbz0wLGE9MDthPGUubGVuZ3RoOysrYSl0W29dPWVbYV0sbys9bn1mdW5jdGlvbiBkZWNvZGVNYXRyaXhGcm9tVW5wYWNrZWRBcnJheShlLHQsbil7dmFyIHI9Z2V0TWF0cml4U2l6ZUZyb21VbnBhY2tlZEFycmF5U2l6ZShlLmxlbmd0aCxuKTtpZih0Lmxlbmd0aDxyKXRocm93IG5ldyBFcnJvcihcIm1hdHJpeCBsZW5ndGggKFwiK3QubGVuZ3RoK1wiKSBtdXN0IGJlID49IFwiK3IpO2Zvcih2YXIgbz0wLGE9MDthPGUubGVuZ3RoO2ErPW4pdFtvKytdPWVbYV19ZnVuY3Rpb24gZ2V0UGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQoZSx0KXtyZXR1cm5bTWF0aC5jZWlsKHQvMiksTWF0aC5jZWlsKGUvMildfWZ1bmN0aW9uIGdldFBhY2tlZFJHQkFBcnJheVNpemVGcm9tTWF0cml4U2hhcGUoZSx0KXt2YXIgbj1nZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChlLHQpO3JldHVybiBuWzBdKm5bMV0qNH1mdW5jdGlvbiBlbmNvZGVNYXRyaXhUb1BhY2tlZFJHQkEoZSx0LG4scil7dmFyIG89Z2V0UGFja2VkUkdCQUFycmF5U2l6ZUZyb21NYXRyaXhTaGFwZSh0LG4pO2lmKHIubGVuZ3RoPG8pdGhyb3cgbmV3IEVycm9yKFwicGFja2VkUkdCQSBsZW5ndGggKFwiK3IubGVuZ3RoK1wiKSBtdXN0IGJlID49IFwiK28pO2Zvcih2YXIgYT1nZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodCh0LG4pLGk9YVswXSxzPWFbMV0sdT1uJTI9PTEsbD10JTI9PTEsYz1NYXRoLmZsb29yKG4vMikscD1NYXRoLmZsb29yKHQvMiksZD11PzQ6MCxoPW4sZj0wLG09MDttPHA7KyttKXtmb3IodmFyIGc9MiptKm4sdj0wO3Y8YzsrK3Ype3ZhciB4PWcrMip2O3JbZl09ZVt4XSxyW2YrMV09ZVt4KzFdLHJbZisyXT1lW3graF0scltmKzNdPWVbeCtoKzFdLGYrPTR9Zis9ZH1pZih1KXt4PW4tMSxmPTQqKGktMSk7dmFyIHk9MipuO2ZvcihkPTQqaSxtPTA7bTxwOysrbSlyW2ZdPWVbeF0scltmKzJdPWVbeCtuXSx4Kz15LGYrPWR9aWYobClmb3IoeD0odC0xKSpuLGY9KHMtMSkqaSo0LHY9MDt2PGM7Kyt2KXJbZisrXT1lW3grK10scltmKytdPWVbeCsrXSxmKz0yO3JldHVybiB1JiZsJiYocltyLmxlbmd0aC00XT1lW2UubGVuZ3RoLTFdKSxyfWZ1bmN0aW9uIGRlY29kZU1hdHJpeEZyb21QYWNrZWRSR0JBKGUsdCxuLHIpe3ZhciBvPXQqbjtpZihyLmxlbmd0aDxvKXRocm93IG5ldyBFcnJvcihcIm1hdHJpeCBsZW5ndGggKFwiK3IubGVuZ3RoK1wiKSBtdXN0IGJlID49IFwiK28pO2Zvcih2YXIgYT1uJTI9PTEsaT10JTI9PTEscz1NYXRoLmZsb29yKG4vMiksdT1NYXRoLmZsb29yKHQvMiksbD1nZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodCh0LG4pLGM9bFswXSxwPWxbMV0sZD1hPzQ6MCxoPW4rKGE/MTowKSxmPTAsbT0wLGc9bix2PTA7djx1Oysrdil7Zm9yKHZhciB4PTA7eDxzOysreClyW20rK109ZVtmKytdLHJbbSsrXT1lW2YrK10scltnKytdPWVbZisrXSxyW2crK109ZVtmKytdO2YrPWQsbSs9aCxnKz1ofWlmKGEpe2Y9NCooYy0xKTt2YXIgeT1uLTE7Zm9yKGQ9NCpjLGg9MipuLHY9MDt2PHU7Kyt2KXJbeV09ZVtmXSxyW3krbl09ZVtmKzJdLGYrPWQseSs9aH1pZihpKXtmb3IoZj0ocC0xKSpjKjQseT0odC0xKSpuLHg9MDt4PHM7Kyt4KXJbeSsrXT1lW2YrK10sclt5KytdPWVbZisrXSxmKz0yO2EmJihyW3ldPWVbZl0pfXJldHVybiByfWZ1bmN0aW9uIGNyZWF0ZVdlYkdMUmVuZGVyaW5nQ29udGV4dChlKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO3JldHVybiB0LndpZHRoPTEsdC5oZWlnaHQ9MSxjcmVhdGVXZWJHTFJlbmRlcmluZ0NvbnRleHRGcm9tQ2FudmFzKHQsZSl9ZnVuY3Rpb24gY3JlYXRlV2ViR0xSZW5kZXJpbmdDb250ZXh0RnJvbUNhbnZhcyhlLHQpe3ZhciBuLHI9RU5WLmdldChcIldFQkdMX1ZFUlNJT05cIik7aWYoMj09PXI/bj1lLmdldENvbnRleHQoXCJ3ZWJnbDJcIix0KToxPT09ciYmKG49ZS5nZXRDb250ZXh0KFwid2ViZ2xcIix0KXx8ZS5nZXRDb250ZXh0KFwiZXhwZXJpbWVudGFsLXdlYmdsXCIsdCkpLDA9PT1yfHxudWxsPT1uKXRocm93IG5ldyBFcnJvcihcIlRoaXMgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFdlYkdMLlwiKTtyZXR1cm4gbn1mdW5jdGlvbiBjYWxsQW5kQ2hlY2soZSx0KXt2YXIgbj10KCk7cmV0dXJuIGNoZWNrV2ViR0xFcnJvcihlKSxufSFmdW5jdGlvbihlKXtlW2UuUkVOREVSPTBdPVwiUkVOREVSXCIsZVtlLlVQTE9BRD0xXT1cIlVQTE9BRFwiLGVbZS5QSVhFTFM9Ml09XCJQSVhFTFNcIixlW2UuRE9XTkxPQUQ9M109XCJET1dOTE9BRFwiLGVbZS5QQUNLPTRdPVwiUEFDS1wifShUZXh0dXJlVXNhZ2V8fChUZXh0dXJlVXNhZ2U9e30pKSxmdW5jdGlvbihlKXtlW2UuVU5QQUNLRURfRkxPQVQxNj0wXT1cIlVOUEFDS0VEX0ZMT0FUMTZcIixlW2UuVU5QQUNLRURfRkxPQVQzMj0xXT1cIlVOUEFDS0VEX0ZMT0FUMzJcIixlW2UuUEFDS0VEXzRYMV9VTlNJR05FRF9CWVRFPTJdPVwiUEFDS0VEXzRYMV9VTlNJR05FRF9CWVRFXCIsZVtlLlBBQ0tFRF8yWDJfRkxPQVQzMj0zXT1cIlBBQ0tFRF8yWDJfRkxPQVQzMlwiLGVbZS5QQUNLRURfMlgyX0ZMT0FUMTY9NF09XCJQQUNLRURfMlgyX0ZMT0FUMTZcIn0oUGh5c2ljYWxUZXh0dXJlVHlwZXx8KFBoeXNpY2FsVGV4dHVyZVR5cGU9e30pKTt2YXIgd2ViR0xEZWJ1Z0Vycm9yQ2hlY2tpbmdFbmFibGVkPSExO2Z1bmN0aW9uIGVuYWJsZURlYnVnV2ViR0xFcnJvckNoZWNraW5nKGUpe3dlYkdMRGVidWdFcnJvckNoZWNraW5nRW5hYmxlZD1lfWZ1bmN0aW9uIGNoZWNrV2ViR0xFcnJvcihlKXtpZih3ZWJHTERlYnVnRXJyb3JDaGVja2luZ0VuYWJsZWQpe3ZhciB0PWUuZ2V0RXJyb3IoKTtpZih0IT09ZS5OT19FUlJPUil0aHJvdyBuZXcgRXJyb3IoXCJXZWJHTCBFcnJvcjogXCIrZ2V0V2ViR0xFcnJvck1lc3NhZ2UoZSx0KSl9fWZ1bmN0aW9uIGdldFdlYkdMRXJyb3JNZXNzYWdlKGUsdCl7c3dpdGNoKHQpe2Nhc2UgZS5OT19FUlJPUjpyZXR1cm5cIk5PX0VSUk9SXCI7Y2FzZSBlLklOVkFMSURfRU5VTTpyZXR1cm5cIklOVkFMSURfRU5VTVwiO2Nhc2UgZS5JTlZBTElEX1ZBTFVFOnJldHVyblwiSU5WQUxJRF9WQUxVRVwiO2Nhc2UgZS5JTlZBTElEX09QRVJBVElPTjpyZXR1cm5cIklOVkFMSURfT1BFUkFUSU9OXCI7Y2FzZSBlLklOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OOnJldHVyblwiSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT05cIjtjYXNlIGUuT1VUX09GX01FTU9SWTpyZXR1cm5cIk9VVF9PRl9NRU1PUllcIjtjYXNlIGUuQ09OVEVYVF9MT1NUX1dFQkdMOnJldHVyblwiQ09OVEVYVF9MT1NUX1dFQkdMXCI7ZGVmYXVsdDpyZXR1cm5cIlVua25vd24gZXJyb3IgY29kZSBcIit0fX1mdW5jdGlvbiBnZXRFeHRlbnNpb25PclRocm93KGUsdCl7cmV0dXJuIHRocm93SWZOdWxsKGUsZnVuY3Rpb24oKXtyZXR1cm4gZS5nZXRFeHRlbnNpb24odCl9LCdFeHRlbnNpb24gXCInK3QrJ1wiIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBicm93c2VyLicpfWZ1bmN0aW9uIGNyZWF0ZVZlcnRleFNoYWRlcihlLHQpe3ZhciBuPXRocm93SWZOdWxsKGUsZnVuY3Rpb24oKXtyZXR1cm4gZS5jcmVhdGVTaGFkZXIoZS5WRVJURVhfU0hBREVSKX0sXCJVbmFibGUgdG8gY3JlYXRlIHZlcnRleCBXZWJHTFNoYWRlci5cIik7aWYoY2FsbEFuZENoZWNrKGUsZnVuY3Rpb24oKXtyZXR1cm4gZS5zaGFkZXJTb3VyY2Uobix0KX0pLGNhbGxBbmRDaGVjayhlLGZ1bmN0aW9uKCl7cmV0dXJuIGUuY29tcGlsZVNoYWRlcihuKX0pLCExPT09ZS5nZXRTaGFkZXJQYXJhbWV0ZXIobixlLkNPTVBJTEVfU1RBVFVTKSl0aHJvdyBjb25zb2xlLmxvZyhlLmdldFNoYWRlckluZm9Mb2cobikpLG5ldyBFcnJvcihcIkZhaWxlZCB0byBjb21waWxlIHZlcnRleCBzaGFkZXIuXCIpO3JldHVybiBufWZ1bmN0aW9uIGNyZWF0ZUZyYWdtZW50U2hhZGVyKGUsdCl7dmFyIG49dGhyb3dJZk51bGwoZSxmdW5jdGlvbigpe3JldHVybiBlLmNyZWF0ZVNoYWRlcihlLkZSQUdNRU5UX1NIQURFUil9LFwiVW5hYmxlIHRvIGNyZWF0ZSBmcmFnbWVudCBXZWJHTFNoYWRlci5cIik7aWYoY2FsbEFuZENoZWNrKGUsZnVuY3Rpb24oKXtyZXR1cm4gZS5zaGFkZXJTb3VyY2Uobix0KX0pLGNhbGxBbmRDaGVjayhlLGZ1bmN0aW9uKCl7cmV0dXJuIGUuY29tcGlsZVNoYWRlcihuKX0pLCExPT09ZS5nZXRTaGFkZXJQYXJhbWV0ZXIobixlLkNPTVBJTEVfU1RBVFVTKSl0aHJvdyBsb2dTaGFkZXJTb3VyY2VBbmRJbmZvTG9nKHQsZS5nZXRTaGFkZXJJbmZvTG9nKG4pKSxuZXcgRXJyb3IoXCJGYWlsZWQgdG8gY29tcGlsZSBmcmFnbWVudCBzaGFkZXIuXCIpO3JldHVybiBufXZhciBsaW5lTnVtYmVyUmVnZXg9L0VSUk9SOiBbMC05XSs6KFswLTldKyk6L2c7ZnVuY3Rpb24gbG9nU2hhZGVyU291cmNlQW5kSW5mb0xvZyhlLHQpe3ZhciBuPWxpbmVOdW1iZXJSZWdleC5leGVjKHQpO2lmKG51bGw9PW4pcmV0dXJuIGNvbnNvbGUubG9nKFwiQ291bGRuJ3QgcGFyc2UgbGluZSBudW1iZXIgaW4gZXJyb3I6IFwiK3QpLHZvaWQgY29uc29sZS5sb2coZSk7Zm9yKHZhciByPStuWzFdLG89ZS5zcGxpdChcIlxcblwiKSxhPW8ubGVuZ3RoLnRvU3RyaW5nKCkubGVuZ3RoKzIsaT1vLm1hcChmdW5jdGlvbihlLHQpe3JldHVybiByaWdodFBhZCgodCsxKS50b1N0cmluZygpLGEpK2V9KSxzPTAsdT0wO3U8aS5sZW5ndGg7dSsrKXM9TWF0aC5tYXgoaVt1XS5sZW5ndGgscyk7dmFyIGw9aS5zbGljZSgwLHItMSksYz1pLnNsaWNlKHItMSxyKSxwPWkuc2xpY2Uocik7Y29uc29sZS5sb2cobC5qb2luKFwiXFxuXCIpKSxjb25zb2xlLmxvZyh0LnNwbGl0KFwiXFxuXCIpWzBdKSxjb25zb2xlLmxvZyhcIiVjIFwiK3JpZ2h0UGFkKGNbMF0scyksXCJib3JkZXI6MXB4IHNvbGlkIHJlZDsgYmFja2dyb3VuZC1jb2xvcjojZTNkMmQyOyBjb2xvcjojYTYxNzE3XCIpLGNvbnNvbGUubG9nKHAuam9pbihcIlxcblwiKSl9ZnVuY3Rpb24gY3JlYXRlUHJvZ3JhbShlKXtyZXR1cm4gdGhyb3dJZk51bGwoZSxmdW5jdGlvbigpe3JldHVybiBlLmNyZWF0ZVByb2dyYW0oKX0sXCJVbmFibGUgdG8gY3JlYXRlIFdlYkdMUHJvZ3JhbS5cIil9ZnVuY3Rpb24gbGlua1Byb2dyYW0oZSx0KXtpZihjYWxsQW5kQ2hlY2soZSxmdW5jdGlvbigpe3JldHVybiBlLmxpbmtQcm9ncmFtKHQpfSksITE9PT1lLmdldFByb2dyYW1QYXJhbWV0ZXIodCxlLkxJTktfU1RBVFVTKSl0aHJvdyBjb25zb2xlLmxvZyhlLmdldFByb2dyYW1JbmZvTG9nKHQpKSxuZXcgRXJyb3IoXCJGYWlsZWQgdG8gbGluayB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlcnMuXCIpfWZ1bmN0aW9uIHZhbGlkYXRlUHJvZ3JhbShlLHQpe2lmKGNhbGxBbmRDaGVjayhlLGZ1bmN0aW9uKCl7cmV0dXJuIGUudmFsaWRhdGVQcm9ncmFtKHQpfSksITE9PT1lLmdldFByb2dyYW1QYXJhbWV0ZXIodCxlLlZBTElEQVRFX1NUQVRVUykpdGhyb3cgY29uc29sZS5sb2coZS5nZXRQcm9ncmFtSW5mb0xvZyh0KSksbmV3IEVycm9yKFwiU2hhZGVyIHByb2dyYW0gdmFsaWRhdGlvbiBmYWlsZWQuXCIpfWZ1bmN0aW9uIGNyZWF0ZVN0YXRpY1ZlcnRleEJ1ZmZlcihlLHQpe3ZhciBuPXRocm93SWZOdWxsKGUsZnVuY3Rpb24oKXtyZXR1cm4gZS5jcmVhdGVCdWZmZXIoKX0sXCJVbmFibGUgdG8gY3JlYXRlIFdlYkdMQnVmZmVyXCIpO3JldHVybiBjYWxsQW5kQ2hlY2soZSxmdW5jdGlvbigpe3JldHVybiBlLmJpbmRCdWZmZXIoZS5BUlJBWV9CVUZGRVIsbil9KSxjYWxsQW5kQ2hlY2soZSxmdW5jdGlvbigpe3JldHVybiBlLmJ1ZmZlckRhdGEoZS5BUlJBWV9CVUZGRVIsdCxlLlNUQVRJQ19EUkFXKX0pLG59ZnVuY3Rpb24gY3JlYXRlU3RhdGljSW5kZXhCdWZmZXIoZSx0KXt2YXIgbj10aHJvd0lmTnVsbChlLGZ1bmN0aW9uKCl7cmV0dXJuIGUuY3JlYXRlQnVmZmVyKCl9LFwiVW5hYmxlIHRvIGNyZWF0ZSBXZWJHTEJ1ZmZlclwiKTtyZXR1cm4gY2FsbEFuZENoZWNrKGUsZnVuY3Rpb24oKXtyZXR1cm4gZS5iaW5kQnVmZmVyKGUuRUxFTUVOVF9BUlJBWV9CVUZGRVIsbil9KSxjYWxsQW5kQ2hlY2soZSxmdW5jdGlvbigpe3JldHVybiBlLmJ1ZmZlckRhdGEoZS5FTEVNRU5UX0FSUkFZX0JVRkZFUix0LGUuU1RBVElDX0RSQVcpfSksbn1mdW5jdGlvbiBnZXROdW1DaGFubmVscygpe3JldHVybiAyPT09RU5WLmdldChcIldFQkdMX1ZFUlNJT05cIik/MTo0fWZ1bmN0aW9uIGNyZWF0ZVRleHR1cmUoZSl7cmV0dXJuIHRocm93SWZOdWxsKGUsZnVuY3Rpb24oKXtyZXR1cm4gZS5jcmVhdGVUZXh0dXJlKCl9LFwiVW5hYmxlIHRvIGNyZWF0ZSBXZWJHTFRleHR1cmUuXCIpfWZ1bmN0aW9uIHZhbGlkYXRlVGV4dHVyZVNpemUoZSx0KXt2YXIgbj1FTlYuZ2V0KFwiV0VCR0xfTUFYX1RFWFRVUkVfU0laRVwiKTtpZihlPD0wfHx0PD0wKXt2YXIgcj1cIltcIitlK1wieFwiK3QrXCJdXCI7dGhyb3cgbmV3IEVycm9yKFwiUmVxdWVzdGVkIHRleHR1cmUgc2l6ZSBcIityK1wiIGlzIGludmFsaWQuXCIpfWlmKGU+bnx8dD5uKXtyPVwiW1wiK2UrXCJ4XCIrdCtcIl1cIjt0aHJvdyBuZXcgRXJyb3IoXCJSZXF1ZXN0ZWQgdGV4dHVyZSBzaXplIFwiK3IrXCIgZ3JlYXRlciB0aGFuIFdlYkdMIG1heGltdW0gb24gdGhpcyBicm93c2VyIC8gR1BVIFwiKyhcIltcIituK1wieFwiK24rXCJdXCIpK1wiLlwiKX19ZnVuY3Rpb24gY3JlYXRlRnJhbWVidWZmZXIoZSl7cmV0dXJuIHRocm93SWZOdWxsKGUsZnVuY3Rpb24oKXtyZXR1cm4gZS5jcmVhdGVGcmFtZWJ1ZmZlcigpfSxcIlVuYWJsZSB0byBjcmVhdGUgV2ViR0xGcmFtZWJ1ZmZlci5cIil9ZnVuY3Rpb24gYmluZFZlcnRleEJ1ZmZlclRvUHJvZ3JhbUF0dHJpYnV0ZShlLHQsbixyLG8sYSxpKXt2YXIgcz1lLmdldEF0dHJpYkxvY2F0aW9uKHQsbik7cmV0dXJuLTEhPT1zJiYoY2FsbEFuZENoZWNrKGUsZnVuY3Rpb24oKXtyZXR1cm4gZS5iaW5kQnVmZmVyKGUuQVJSQVlfQlVGRkVSLHIpfSksY2FsbEFuZENoZWNrKGUsZnVuY3Rpb24oKXtyZXR1cm4gZS52ZXJ0ZXhBdHRyaWJQb2ludGVyKHMsbyxlLkZMT0FULCExLGEsaSl9KSxjYWxsQW5kQ2hlY2soZSxmdW5jdGlvbigpe3JldHVybiBlLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHMpfSksITApfWZ1bmN0aW9uIGJpbmRUZXh0dXJlVW5pdChlLHQsbil7dmFsaWRhdGVUZXh0dXJlVW5pdChlLG4pLGNhbGxBbmRDaGVjayhlLGZ1bmN0aW9uKCl7cmV0dXJuIGUuYWN0aXZlVGV4dHVyZShlLlRFWFRVUkUwK24pfSksY2FsbEFuZENoZWNrKGUsZnVuY3Rpb24oKXtyZXR1cm4gZS5iaW5kVGV4dHVyZShlLlRFWFRVUkVfMkQsdCl9KX1mdW5jdGlvbiB1bmJpbmRUZXh0dXJlVW5pdChlLHQpe3ZhbGlkYXRlVGV4dHVyZVVuaXQoZSx0KSxjYWxsQW5kQ2hlY2soZSxmdW5jdGlvbigpe3JldHVybiBlLmFjdGl2ZVRleHR1cmUoZS5URVhUVVJFMCt0KX0pLGNhbGxBbmRDaGVjayhlLGZ1bmN0aW9uKCl7cmV0dXJuIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELG51bGwpfSl9ZnVuY3Rpb24gZ2V0UHJvZ3JhbVVuaWZvcm1Mb2NhdGlvbk9yVGhyb3coZSx0LG4pe3JldHVybiB0aHJvd0lmTnVsbChlLGZ1bmN0aW9uKCl7cmV0dXJuIGUuZ2V0VW5pZm9ybUxvY2F0aW9uKHQsbil9LCd1bmlmb3JtIFwiJytuKydcIiBub3QgcHJlc2VudCBpbiBwcm9ncmFtLicpfWZ1bmN0aW9uIGdldFByb2dyYW1Vbmlmb3JtTG9jYXRpb24oZSx0LG4pe3JldHVybiBlLmdldFVuaWZvcm1Mb2NhdGlvbih0LG4pfWZ1bmN0aW9uIGJpbmRUZXh0dXJlVG9Qcm9ncmFtVW5pZm9ybVNhbXBsZXIoZSx0LG4scixvKXtjYWxsQW5kQ2hlY2soZSxmdW5jdGlvbigpe3JldHVybiBiaW5kVGV4dHVyZVVuaXQoZSxuLG8pfSksY2FsbEFuZENoZWNrKGUsZnVuY3Rpb24oKXtyZXR1cm4gZS51bmlmb3JtMWkocixvKX0pfWZ1bmN0aW9uIGJpbmRDYW52YXNUb0ZyYW1lYnVmZmVyKGUpe2NhbGxBbmRDaGVjayhlLGZ1bmN0aW9uKCl7cmV0dXJuIGUuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsbnVsbCl9KSxjYWxsQW5kQ2hlY2soZSxmdW5jdGlvbigpe3JldHVybiBlLnZpZXdwb3J0KDAsMCxlLmNhbnZhcy53aWR0aCxlLmNhbnZhcy5oZWlnaHQpfSksY2FsbEFuZENoZWNrKGUsZnVuY3Rpb24oKXtyZXR1cm4gZS5zY2lzc29yKDAsMCxlLmNhbnZhcy53aWR0aCxlLmNhbnZhcy5oZWlnaHQpfSl9ZnVuY3Rpb24gYmluZENvbG9yVGV4dHVyZVRvRnJhbWVidWZmZXIoZSx0LG4pe2NhbGxBbmRDaGVjayhlLGZ1bmN0aW9uKCl7cmV0dXJuIGUuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsbil9KSxjYWxsQW5kQ2hlY2soZSxmdW5jdGlvbigpe3JldHVybiBlLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGUuRlJBTUVCVUZGRVIsZS5DT0xPUl9BVFRBQ0hNRU5UMCxlLlRFWFRVUkVfMkQsdCwwKX0pfWZ1bmN0aW9uIHVuYmluZENvbG9yVGV4dHVyZUZyb21GcmFtZWJ1ZmZlcihlLHQpe2NhbGxBbmRDaGVjayhlLGZ1bmN0aW9uKCl7cmV0dXJuIGUuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsdCl9KSxjYWxsQW5kQ2hlY2soZSxmdW5jdGlvbigpe3JldHVybiBlLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGUuRlJBTUVCVUZGRVIsZS5DT0xPUl9BVFRBQ0hNRU5UMCxlLlRFWFRVUkVfMkQsbnVsbCwwKX0pfWZ1bmN0aW9uIHZhbGlkYXRlRnJhbWVidWZmZXIoZSl7dmFyIHQ9ZS5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKGUuRlJBTUVCVUZGRVIpO2lmKHQhPT1lLkZSQU1FQlVGRkVSX0NPTVBMRVRFKXRocm93IG5ldyBFcnJvcihcIkVycm9yIGJpbmRpbmcgZnJhbWVidWZmZXI6IFwiK2dldEZyYW1lYnVmZmVyRXJyb3JNZXNzYWdlKGUsdCkpfWZ1bmN0aW9uIGdldEZyYW1lYnVmZmVyRXJyb3JNZXNzYWdlKGUsdCl7c3dpdGNoKHQpe2Nhc2UgZS5GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQ6cmV0dXJuXCJGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlRcIjtjYXNlIGUuRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQ6cmV0dXJuXCJGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVFwiO2Nhc2UgZS5GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlM6cmV0dXJuXCJGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlNcIjtjYXNlIGUuRlJBTUVCVUZGRVJfVU5TVVBQT1JURUQ6cmV0dXJuXCJGUkFNRUJVRkZFUl9VTlNVUFBPUlRFRFwiO2RlZmF1bHQ6cmV0dXJuXCJ1bmtub3duIGVycm9yIFwiK3R9fWZ1bmN0aW9uIHRocm93SWZOdWxsKGUsdCxuKXt2YXIgcj1jYWxsQW5kQ2hlY2soZSxmdW5jdGlvbigpe3JldHVybiB0KCl9KTtpZihudWxsPT1yKXRocm93IG5ldyBFcnJvcihuKTtyZXR1cm4gcn1mdW5jdGlvbiB2YWxpZGF0ZVRleHR1cmVVbml0KGUsdCl7dmFyIG49ZS5NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUy0xLHI9dCtlLlRFWFRVUkUwO2lmKHI8ZS5URVhUVVJFMHx8cj5uKXRocm93IG5ldyBFcnJvcihcInRleHR1cmVVbml0IG11c3QgYmUgaW4gXCIrKFwiW2dsLlRFWFRVUkUwLCBnbC5URVhUVVJFXCIrbitcIl1cIikrXCIuXCIpfWZ1bmN0aW9uIGdldFRleHR1cmVTaGFwZUZyb21Mb2dpY2FsU2hhcGUoZSx0KXt2b2lkIDA9PT10JiYodD1UZXh0dXJlVXNhZ2UuVVBMT0FEKTt2YXIgbj1FTlYuZ2V0KFwiV0VCR0xfTUFYX1RFWFRVUkVfU0laRVwiKTtpZih0PT09VGV4dHVyZVVzYWdlLlBBQ0smJihuKj0yLGU9ZS5tYXAoZnVuY3Rpb24odCxuKXtyZXR1cm4gbj49ZS5sZW5ndGgtMj9uZWFyZXN0TGFyZ2VyRXZlbihlW25dKTplW25dfSkpLDIhPT1lLmxlbmd0aCl7dmFyIHI9c3F1ZWV6ZVNoYXBlKGUpO2U9ci5uZXdTaGFwZX12YXIgbz1zaXplRnJvbVNoYXBlKGUpO3JldHVybiBlLmxlbmd0aDw9MSYmbzw9bj9bbywxXToyPT09ZS5sZW5ndGgmJmVbMF08PW4mJmVbMV08PW4/ZTozPT09ZS5sZW5ndGgmJmVbMF0qZVsxXTw9biYmZVsyXTw9bj9bZVswXSplWzFdLGVbMl1dOjM9PT1lLmxlbmd0aCYmZVswXTw9biYmZVsxXSplWzJdPD1uP1tlWzBdLGVbMV0qZVsyXV06ND09PWUubGVuZ3RoJiZlWzBdKmVbMV0qZVsyXTw9biYmZVszXTw9bj9bZVswXSplWzFdKmVbMl0sZVszXV06ND09PWUubGVuZ3RoJiZlWzBdPD1uJiZlWzFdKmVbMl0qZVszXTw9bj9bZVswXSxlWzFdKmVbMl0qZVszXV06c2l6ZVRvU3F1YXJpc2hTaGFwZShvKX12YXIgd2ViZ2xfdXRpbD1PYmplY3QuZnJlZXplKHtjcmVhdGVXZWJHTFJlbmRlcmluZ0NvbnRleHQ6Y3JlYXRlV2ViR0xSZW5kZXJpbmdDb250ZXh0LGNyZWF0ZVdlYkdMUmVuZGVyaW5nQ29udGV4dEZyb21DYW52YXM6Y3JlYXRlV2ViR0xSZW5kZXJpbmdDb250ZXh0RnJvbUNhbnZhcyxjYWxsQW5kQ2hlY2s6Y2FsbEFuZENoZWNrLGVuYWJsZURlYnVnV2ViR0xFcnJvckNoZWNraW5nOmVuYWJsZURlYnVnV2ViR0xFcnJvckNoZWNraW5nLGNoZWNrV2ViR0xFcnJvcjpjaGVja1dlYkdMRXJyb3IsZ2V0V2ViR0xFcnJvck1lc3NhZ2U6Z2V0V2ViR0xFcnJvck1lc3NhZ2UsZ2V0RXh0ZW5zaW9uT3JUaHJvdzpnZXRFeHRlbnNpb25PclRocm93LGNyZWF0ZVZlcnRleFNoYWRlcjpjcmVhdGVWZXJ0ZXhTaGFkZXIsY3JlYXRlRnJhZ21lbnRTaGFkZXI6Y3JlYXRlRnJhZ21lbnRTaGFkZXIsY3JlYXRlUHJvZ3JhbTpjcmVhdGVQcm9ncmFtLGxpbmtQcm9ncmFtOmxpbmtQcm9ncmFtLHZhbGlkYXRlUHJvZ3JhbTp2YWxpZGF0ZVByb2dyYW0sY3JlYXRlU3RhdGljVmVydGV4QnVmZmVyOmNyZWF0ZVN0YXRpY1ZlcnRleEJ1ZmZlcixjcmVhdGVTdGF0aWNJbmRleEJ1ZmZlcjpjcmVhdGVTdGF0aWNJbmRleEJ1ZmZlcixnZXROdW1DaGFubmVsczpnZXROdW1DaGFubmVscyxjcmVhdGVUZXh0dXJlOmNyZWF0ZVRleHR1cmUsdmFsaWRhdGVUZXh0dXJlU2l6ZTp2YWxpZGF0ZVRleHR1cmVTaXplLGNyZWF0ZUZyYW1lYnVmZmVyOmNyZWF0ZUZyYW1lYnVmZmVyLGJpbmRWZXJ0ZXhCdWZmZXJUb1Byb2dyYW1BdHRyaWJ1dGU6YmluZFZlcnRleEJ1ZmZlclRvUHJvZ3JhbUF0dHJpYnV0ZSxiaW5kVGV4dHVyZVVuaXQ6YmluZFRleHR1cmVVbml0LHVuYmluZFRleHR1cmVVbml0OnVuYmluZFRleHR1cmVVbml0LGdldFByb2dyYW1Vbmlmb3JtTG9jYXRpb25PclRocm93OmdldFByb2dyYW1Vbmlmb3JtTG9jYXRpb25PclRocm93LGdldFByb2dyYW1Vbmlmb3JtTG9jYXRpb246Z2V0UHJvZ3JhbVVuaWZvcm1Mb2NhdGlvbixiaW5kVGV4dHVyZVRvUHJvZ3JhbVVuaWZvcm1TYW1wbGVyOmJpbmRUZXh0dXJlVG9Qcm9ncmFtVW5pZm9ybVNhbXBsZXIsYmluZENhbnZhc1RvRnJhbWVidWZmZXI6YmluZENhbnZhc1RvRnJhbWVidWZmZXIsYmluZENvbG9yVGV4dHVyZVRvRnJhbWVidWZmZXI6YmluZENvbG9yVGV4dHVyZVRvRnJhbWVidWZmZXIsdW5iaW5kQ29sb3JUZXh0dXJlRnJvbUZyYW1lYnVmZmVyOnVuYmluZENvbG9yVGV4dHVyZUZyb21GcmFtZWJ1ZmZlcix2YWxpZGF0ZUZyYW1lYnVmZmVyOnZhbGlkYXRlRnJhbWVidWZmZXIsZ2V0RnJhbWVidWZmZXJFcnJvck1lc3NhZ2U6Z2V0RnJhbWVidWZmZXJFcnJvck1lc3NhZ2UsZ2V0VGV4dHVyZVNoYXBlRnJvbUxvZ2ljYWxTaGFwZTpnZXRUZXh0dXJlU2hhcGVGcm9tTG9naWNhbFNoYXBlfSk7ZnVuY3Rpb24gZ2V0V2ViR0xDb250ZXh0QXR0cmlidXRlcygpe3JldHVybnthbHBoYTohMSxhbnRpYWxpYXM6ITEscHJlbXVsdGlwbGllZEFscGhhOiExLHByZXNlcnZlRHJhd2luZ0J1ZmZlcjohMSxkZXB0aDohMSxzdGVuY2lsOiExLGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6ITB9fWZ1bmN0aW9uIGNyZWF0ZVdlYkdMQ29udGV4dChlKXt2YXIgdCxuPWdldFdlYkdMQ29udGV4dEF0dHJpYnV0ZXMoKTtyZXR1cm4gY2FsbEFuZENoZWNrKHQ9bnVsbCE9ZT9jcmVhdGVXZWJHTFJlbmRlcmluZ0NvbnRleHRGcm9tQ2FudmFzKGUsbik6Y3JlYXRlV2ViR0xSZW5kZXJpbmdDb250ZXh0KG4pLGZ1bmN0aW9uKCl7cmV0dXJuIHQuZGlzYWJsZSh0LkRFUFRIX1RFU1QpfSksY2FsbEFuZENoZWNrKHQsZnVuY3Rpb24oKXtyZXR1cm4gdC5kaXNhYmxlKHQuU1RFTkNJTF9URVNUKX0pLGNhbGxBbmRDaGVjayh0LGZ1bmN0aW9uKCl7cmV0dXJuIHQuZGlzYWJsZSh0LkJMRU5EKX0pLGNhbGxBbmRDaGVjayh0LGZ1bmN0aW9uKCl7cmV0dXJuIHQuZGlzYWJsZSh0LkRJVEhFUil9KSxjYWxsQW5kQ2hlY2sodCxmdW5jdGlvbigpe3JldHVybiB0LmRpc2FibGUodC5QT0xZR09OX09GRlNFVF9GSUxMKX0pLGNhbGxBbmRDaGVjayh0LGZ1bmN0aW9uKCl7cmV0dXJuIHQuZGlzYWJsZSh0LlNBTVBMRV9DT1ZFUkFHRSl9KSxjYWxsQW5kQ2hlY2sodCxmdW5jdGlvbigpe3JldHVybiB0LmVuYWJsZSh0LlNDSVNTT1JfVEVTVCl9KSxjYWxsQW5kQ2hlY2sodCxmdW5jdGlvbigpe3JldHVybiB0LmVuYWJsZSh0LkNVTExfRkFDRSl9KSxjYWxsQW5kQ2hlY2sodCxmdW5jdGlvbigpe3JldHVybiB0LmN1bGxGYWNlKHQuQkFDSyl9KSx0fWZ1bmN0aW9uIGNyZWF0ZVZlcnRleFNoYWRlciQxKGUpe3JldHVybiBjcmVhdGVWZXJ0ZXhTaGFkZXIoZSxcIlxcbiAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxuICAgIGF0dHJpYnV0ZSB2ZWMzIGNsaXBTcGFjZVBvcztcXG4gICAgYXR0cmlidXRlIHZlYzIgdXY7XFxuICAgIHZhcnlpbmcgdmVjMiByZXN1bHRVVjtcXG5cXG4gICAgdm9pZCBtYWluKCkge1xcbiAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChjbGlwU3BhY2VQb3MsIDEpO1xcbiAgICAgIHJlc3VsdFVWID0gdXY7XFxuICAgIH1cIil9ZnVuY3Rpb24gY3JlYXRlVmVydGV4QnVmZmVyKGUpe3JldHVybiBjcmVhdGVTdGF0aWNWZXJ0ZXhCdWZmZXIoZSxuZXcgRmxvYXQzMkFycmF5KFstMSwxLDAsMCwxLC0xLC0xLDAsMCwwLDEsMSwwLDEsMSwxLC0xLDAsMSwwXSkpfWZ1bmN0aW9uIGNyZWF0ZUluZGV4QnVmZmVyKGUpe3JldHVybiBjcmVhdGVTdGF0aWNJbmRleEJ1ZmZlcihlLG5ldyBVaW50MTZBcnJheShbMCwxLDIsMiwxLDNdKSl9ZnVuY3Rpb24gZ2V0VGV4dHVyZUNvbmZpZyhlLHQpe3ZhciBuLHIsbyxhLGkscyx1LGw9ZTtyZXR1cm4gMj09PUVOVi5nZXQoXCJXRUJHTF9WRVJTSU9OXCIpPyhuPWwuUjMyRixyPWwuUjE2RixvPWwuUkdCQTMyRixhPWwuUkVELGk9NCxzPTEsdT1sLkhBTEZfRkxPQVQpOihuPWUuUkdCQSxyPWUuUkdCQSxvPWwuUkdCQSxhPWUuUkdCQSxpPTQscz00LHU9bnVsbCE9dD90LkhBTEZfRkxPQVRfT0VTOm51bGwpLHtpbnRlcm5hbEZvcm1hdEZsb2F0Om4saW50ZXJuYWxGb3JtYXRIYWxmRmxvYXQ6cixpbnRlcm5hbEZvcm1hdFBhY2tlZEZsb2F0Om8sdGV4dHVyZUZvcm1hdEZsb2F0OmEsZG93bmxvYWRUZXh0dXJlRm9ybWF0OmUuUkdCQSxkb3dubG9hZFVucGFja051bUNoYW5uZWxzOmksZGVmYXVsdE51bUNoYW5uZWxzOnMsdGV4dHVyZVR5cGVIYWxmRmxvYXQ6dX19ZnVuY3Rpb24gY3JlYXRlQW5kQ29uZmlndXJlVGV4dHVyZShlLHQsbixyLG8sYSl7dmFsaWRhdGVUZXh0dXJlU2l6ZSh0LG4pO3ZhciBpPWNyZWF0ZVRleHR1cmUoZSkscz1lLlRFWFRVUkVfMkQ7cmV0dXJuIGNhbGxBbmRDaGVjayhlLGZ1bmN0aW9uKCl7cmV0dXJuIGUuYmluZFRleHR1cmUocyxpKX0pLGNhbGxBbmRDaGVjayhlLGZ1bmN0aW9uKCl7cmV0dXJuIGUudGV4UGFyYW1ldGVyaShzLGUuVEVYVFVSRV9XUkFQX1MsZS5DTEFNUF9UT19FREdFKX0pLGNhbGxBbmRDaGVjayhlLGZ1bmN0aW9uKCl7cmV0dXJuIGUudGV4UGFyYW1ldGVyaShzLGUuVEVYVFVSRV9XUkFQX1QsZS5DTEFNUF9UT19FREdFKX0pLGNhbGxBbmRDaGVjayhlLGZ1bmN0aW9uKCl7cmV0dXJuIGUudGV4UGFyYW1ldGVyaShzLGUuVEVYVFVSRV9NSU5fRklMVEVSLGUuTkVBUkVTVCl9KSxjYWxsQW5kQ2hlY2soZSxmdW5jdGlvbigpe3JldHVybiBlLnRleFBhcmFtZXRlcmkocyxlLlRFWFRVUkVfTUFHX0ZJTFRFUixlLk5FQVJFU1QpfSksY2FsbEFuZENoZWNrKGUsZnVuY3Rpb24oKXtyZXR1cm4gZS50ZXhJbWFnZTJEKHMsMCxyLHQsbiwwLG8sYSxudWxsKX0pLGNhbGxBbmRDaGVjayhlLGZ1bmN0aW9uKCl7cmV0dXJuIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELG51bGwpfSksaX1mdW5jdGlvbiBjcmVhdGVGbG9hdDMyTWF0cml4VGV4dHVyZShlLHQsbixyKXt2YXIgbz1nZXRVbnBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHQsbik7cmV0dXJuIGNyZWF0ZUFuZENvbmZpZ3VyZVRleHR1cmUoZSxvWzBdLG9bMV0sci5pbnRlcm5hbEZvcm1hdEZsb2F0LHIudGV4dHVyZUZvcm1hdEZsb2F0LGUuRkxPQVQpfWZ1bmN0aW9uIGNyZWF0ZUZsb2F0MTZNYXRyaXhUZXh0dXJlKGUsdCxuLHIpe3ZhciBvPWdldFVucGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQodCxuKTtyZXR1cm4gY3JlYXRlQW5kQ29uZmlndXJlVGV4dHVyZShlLG9bMF0sb1sxXSxyLmludGVybmFsRm9ybWF0RmxvYXQsci50ZXh0dXJlRm9ybWF0RmxvYXQsci50ZXh0dXJlVHlwZUhhbGZGbG9hdCl9ZnVuY3Rpb24gY3JlYXRlVW5zaWduZWRCeXRlc01hdHJpeFRleHR1cmUoZSx0LG4scil7dmFyIG89Z2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodCh0LG4pO3JldHVybiBjcmVhdGVBbmRDb25maWd1cmVUZXh0dXJlKGUsb1swXSxvWzFdLGUuUkdCQSxlLlJHQkEsZS5VTlNJR05FRF9CWVRFKX1mdW5jdGlvbiBjcmVhdGVQYWNrZWRNYXRyaXhUZXh0dXJlKGUsdCxuLHIpe3ZhciBvPWdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHQsbik7cmV0dXJuIGNyZWF0ZUFuZENvbmZpZ3VyZVRleHR1cmUoZSxvWzBdLG9bMV0sci5pbnRlcm5hbEZvcm1hdFBhY2tlZEZsb2F0LGUuUkdCQSxlLkZMT0FUKX1mdW5jdGlvbiBjcmVhdGVGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZShlLHQsbixyKXt2YXIgbz1nZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodCh0LG4pO3JldHVybiBjcmVhdGVBbmRDb25maWd1cmVUZXh0dXJlKGUsb1swXSxvWzFdLHIuaW50ZXJuYWxGb3JtYXRIYWxmRmxvYXQsZS5SR0JBLHIudGV4dHVyZVR5cGVIYWxmRmxvYXQpfWZ1bmN0aW9uIGJpbmRWZXJ0ZXhQcm9ncmFtQXR0cmlidXRlU3RyZWFtcyhlLHQsbil7cmV0dXJuIGNhbGxBbmRDaGVjayhlLGZ1bmN0aW9uKCl7cmV0dXJuIGUuYmluZEJ1ZmZlcihlLkFSUkFZX0JVRkZFUixuKX0pLGJpbmRWZXJ0ZXhCdWZmZXJUb1Byb2dyYW1BdHRyaWJ1dGUoZSx0LFwiY2xpcFNwYWNlUG9zXCIsbiwzLDIwLDApJiZiaW5kVmVydGV4QnVmZmVyVG9Qcm9ncmFtQXR0cmlidXRlKGUsdCxcInV2XCIsbiwyLDIwLDEyKX1mdW5jdGlvbiB1cGxvYWRQaXhlbERhdGFUb1RleHR1cmUoZSx0LG4pe2NhbGxBbmRDaGVjayhlLGZ1bmN0aW9uKCl7cmV0dXJuIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELHQpfSksY2FsbEFuZENoZWNrKGUsZnVuY3Rpb24oKXtyZXR1cm4gZS50ZXhJbWFnZTJEKGUuVEVYVFVSRV8yRCwwLGUuUkdCQSxlLlJHQkEsZS5VTlNJR05FRF9CWVRFLG4pfSksY2FsbEFuZENoZWNrKGUsZnVuY3Rpb24oKXtyZXR1cm4gZS5iaW5kVGV4dHVyZShlLlRFWFRVUkVfMkQsbnVsbCl9KX1mdW5jdGlvbiB1cGxvYWREYXRhVG9UZXh0dXJlKGUsdCxuLHIsbyxhKXt2YWxpZGF0ZVRleHR1cmVTaXplKG4sciksY2FsbEFuZENoZWNrKGUsZnVuY3Rpb24oKXtyZXR1cm4gZS5iaW5kVGV4dHVyZShlLlRFWFRVUkVfMkQsdCl9KSxjYWxsQW5kQ2hlY2soZSxmdW5jdGlvbigpe3JldHVybiBlLnRleFN1YkltYWdlMkQoZS5URVhUVVJFXzJELDAsMCwwLG4scixhLGUuRkxPQVQsbyl9KSxjYWxsQW5kQ2hlY2soZSxmdW5jdGlvbigpe3JldHVybiBlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCxudWxsKX0pfWZ1bmN0aW9uIHVwbG9hZE1hdHJpeFRvVGV4dHVyZShlLHQsbixyLG8sYSxpKXt2YXIgcyx1PWdldFVucGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQobixyKSxsPXVbMF0sYz11WzFdOzE9PT1pLmRlZmF1bHROdW1DaGFubmVscz9zPW86ZW5jb2RlTWF0cml4VG9VbnBhY2tlZEFycmF5KG8scz1uZXcgRmxvYXQzMkFycmF5KGdldFVucGFja2VkQXJyYXlTaXplRnJvbU1hdHJpeFNpemUoby5sZW5ndGgsYSkpLGEpLHVwbG9hZERhdGFUb1RleHR1cmUoZSx0LGwsYyxzLGkudGV4dHVyZUZvcm1hdEZsb2F0KX1mdW5jdGlvbiB1cGxvYWRNYXRyaXhUb1BhY2tlZFRleHR1cmUoZSx0LG4scixvLGEpe3ZhciBpPWdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KG4scikscz1pWzBdLHU9aVsxXSxsPW5ldyBGbG9hdDMyQXJyYXkoZ2V0UGFja2VkUkdCQUFycmF5U2l6ZUZyb21NYXRyaXhTaGFwZShuLHIpKTtlbmNvZGVNYXRyaXhUb1BhY2tlZFJHQkEobyxuLHIsbCksdXBsb2FkRGF0YVRvVGV4dHVyZShlLHQscyx1LGwsZS5SR0JBKX1mdW5jdGlvbiBtYXliZUNyZWF0ZUJ1ZmZlckZyb21PdXRwdXRUZXh0dXJlKGUsdCxuLHIsbyl7dmFyIGE9dDtpZigyPT09RU5WLmdldChcIldFQkdMX1ZFUlNJT05cIikpe3ZhciBpPWUscz1pLmNyZWF0ZUJ1ZmZlcigpO2NhbGxBbmRDaGVjayhlLGZ1bmN0aW9uKCl7cmV0dXJuIGUuYmluZEJ1ZmZlcihpLlBJWEVMX1BBQ0tfQlVGRkVSLHMpfSk7dmFyIHU9NCpnZXRVbnBhY2tlZEFycmF5U2l6ZUZyb21NYXRyaXhTaXplKG4qcixvLmRvd25sb2FkVW5wYWNrTnVtQ2hhbm5lbHMpO2NhbGxBbmRDaGVjayhlLGZ1bmN0aW9uKCl7cmV0dXJuIGUuYnVmZmVyRGF0YShpLlBJWEVMX1BBQ0tfQlVGRkVSLHUsZS5TVEFUSUNfRFJBVyl9KSxjYWxsQW5kQ2hlY2soZSxmdW5jdGlvbigpe3JldHVybiBpLnJlYWRQaXhlbHMoMCwwLHIsbixlLlJHQkEsZS5GTE9BVCwwKX0pLGNhbGxBbmRDaGVjayhlLGZ1bmN0aW9uKCl7cmV0dXJuIGUuYmluZEJ1ZmZlcihpLlBJWEVMX1BBQ0tfQlVGRkVSLG51bGwpfSksYT1zfXJldHVybiBhfWZ1bmN0aW9uIGRvd25sb2FkRmxvYXQzMk1hdHJpeEZyb21CdWZmZXIoZSx0LG4scixvKXt2YXIgYT1lLGk9bmV3IEZsb2F0MzJBcnJheShnZXRVbnBhY2tlZEFycmF5U2l6ZUZyb21NYXRyaXhTaXplKG4qcixvLmRvd25sb2FkVW5wYWNrTnVtQ2hhbm5lbHMpKTthLmJpbmRCdWZmZXIoZS5BUlJBWV9CVUZGRVIsdCksYS5nZXRCdWZmZXJTdWJEYXRhKGUuQVJSQVlfQlVGRkVSLDAsaSksYS5iaW5kQnVmZmVyKGUuQVJSQVlfQlVGRkVSLG51bGwpO3ZhciBzPW5ldyBGbG9hdDMyQXJyYXkobipyKTtyZXR1cm4gZGVjb2RlTWF0cml4RnJvbVVucGFja2VkQXJyYXkoaSxzLG8uZG93bmxvYWRVbnBhY2tOdW1DaGFubmVscyksc31mdW5jdGlvbiBkb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tT3V0cHV0VGV4dHVyZShlLHQsbixyKXt2YXIgbz1nZXRVbnBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHQsbiksYT1vWzBdLGk9b1sxXSxzPW5ldyBGbG9hdDMyQXJyYXkoZ2V0VW5wYWNrZWRBcnJheVNpemVGcm9tTWF0cml4U2l6ZSh0Km4sci5kb3dubG9hZFVucGFja051bUNoYW5uZWxzKSk7Y2FsbEFuZENoZWNrKGUsZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkUGl4ZWxzKDAsMCxhLGksci5kb3dubG9hZFRleHR1cmVGb3JtYXQsZS5GTE9BVCxzKX0pO3ZhciB1PW5ldyBGbG9hdDMyQXJyYXkodCpuKTtyZXR1cm4gZGVjb2RlTWF0cml4RnJvbVVucGFja2VkQXJyYXkocyx1LHIuZG93bmxvYWRVbnBhY2tOdW1DaGFubmVscyksdX1mdW5jdGlvbiBkb3dubG9hZEJ5dGVFbmNvZGVkRmxvYXRNYXRyaXhGcm9tT3V0cHV0VGV4dHVyZShlLHQsbixyKXt2YXIgbz1nZXRVbnBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHQsbiksYT1vWzBdLGk9b1sxXSxzPW5ldyBVaW50OEFycmF5KGdldFVucGFja2VkQXJyYXlTaXplRnJvbU1hdHJpeFNpemUodCpuLDQpKTtyZXR1cm4gY2FsbEFuZENoZWNrKGUsZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkUGl4ZWxzKDAsMCxhLGksci5kb3dubG9hZFRleHR1cmVGb3JtYXQsZS5VTlNJR05FRF9CWVRFLHMpfSksbmV3IEZsb2F0MzJBcnJheShzLmJ1ZmZlcil9ZnVuY3Rpb24gZG93bmxvYWRNYXRyaXhGcm9tUGFja2VkT3V0cHV0VGV4dHVyZShlLHQsbixyLG8sYSl7dmFyIGk9Z2V0UGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQocixvKSxzPWlbMF0sdT1pWzFdLGw9bmV3IEZsb2F0MzJBcnJheShnZXRQYWNrZWRSR0JBQXJyYXlTaXplRnJvbU1hdHJpeFNoYXBlKHIsbykpO2NhbGxBbmRDaGVjayhlLGZ1bmN0aW9uKCl7cmV0dXJuIGUucmVhZFBpeGVscygwLDAscyx1LGUuUkdCQSxlLkZMT0FULGwpfSk7dmFyIGM9bmV3IEZsb2F0MzJBcnJheSh0Km4pO3JldHVybiBkZWNvZGVNYXRyaXhGcm9tUGFja2VkUkdCQShsLHQsbixjKX12YXIgZ3BncHVfdXRpbD1PYmplY3QuZnJlZXplKHtnZXRXZWJHTENvbnRleHRBdHRyaWJ1dGVzOmdldFdlYkdMQ29udGV4dEF0dHJpYnV0ZXMsY3JlYXRlV2ViR0xDb250ZXh0OmNyZWF0ZVdlYkdMQ29udGV4dCxjcmVhdGVWZXJ0ZXhTaGFkZXI6Y3JlYXRlVmVydGV4U2hhZGVyJDEsY3JlYXRlVmVydGV4QnVmZmVyOmNyZWF0ZVZlcnRleEJ1ZmZlcixjcmVhdGVJbmRleEJ1ZmZlcjpjcmVhdGVJbmRleEJ1ZmZlcixnZXRUZXh0dXJlQ29uZmlnOmdldFRleHR1cmVDb25maWcsY3JlYXRlRmxvYXQzMk1hdHJpeFRleHR1cmU6Y3JlYXRlRmxvYXQzMk1hdHJpeFRleHR1cmUsY3JlYXRlRmxvYXQxNk1hdHJpeFRleHR1cmU6Y3JlYXRlRmxvYXQxNk1hdHJpeFRleHR1cmUsY3JlYXRlVW5zaWduZWRCeXRlc01hdHJpeFRleHR1cmU6Y3JlYXRlVW5zaWduZWRCeXRlc01hdHJpeFRleHR1cmUsY3JlYXRlUGFja2VkTWF0cml4VGV4dHVyZTpjcmVhdGVQYWNrZWRNYXRyaXhUZXh0dXJlLGNyZWF0ZUZsb2F0MTZQYWNrZWRNYXRyaXhUZXh0dXJlOmNyZWF0ZUZsb2F0MTZQYWNrZWRNYXRyaXhUZXh0dXJlLGJpbmRWZXJ0ZXhQcm9ncmFtQXR0cmlidXRlU3RyZWFtczpiaW5kVmVydGV4UHJvZ3JhbUF0dHJpYnV0ZVN0cmVhbXMsdXBsb2FkUGl4ZWxEYXRhVG9UZXh0dXJlOnVwbG9hZFBpeGVsRGF0YVRvVGV4dHVyZSx1cGxvYWRNYXRyaXhUb1RleHR1cmU6dXBsb2FkTWF0cml4VG9UZXh0dXJlLHVwbG9hZE1hdHJpeFRvUGFja2VkVGV4dHVyZTp1cGxvYWRNYXRyaXhUb1BhY2tlZFRleHR1cmUsbWF5YmVDcmVhdGVCdWZmZXJGcm9tT3V0cHV0VGV4dHVyZTptYXliZUNyZWF0ZUJ1ZmZlckZyb21PdXRwdXRUZXh0dXJlLGRvd25sb2FkRmxvYXQzMk1hdHJpeEZyb21CdWZmZXI6ZG93bmxvYWRGbG9hdDMyTWF0cml4RnJvbUJ1ZmZlcixkb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tT3V0cHV0VGV4dHVyZTpkb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tT3V0cHV0VGV4dHVyZSxkb3dubG9hZEJ5dGVFbmNvZGVkRmxvYXRNYXRyaXhGcm9tT3V0cHV0VGV4dHVyZTpkb3dubG9hZEJ5dGVFbmNvZGVkRmxvYXRNYXRyaXhGcm9tT3V0cHV0VGV4dHVyZSxkb3dubG9hZE1hdHJpeEZyb21QYWNrZWRPdXRwdXRUZXh0dXJlOmRvd25sb2FkTWF0cml4RnJvbVBhY2tlZE91dHB1dFRleHR1cmV9KSxHUEdQVUNvbnRleHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RoaXMub3V0cHV0VGV4dHVyZT1udWxsLHRoaXMucHJvZ3JhbT1udWxsLHRoaXMuZGlzcG9zZWQ9ITEsdGhpcy5hdXRvRGVidWdWYWxpZGF0ZT0hMSx0aGlzLnZlcnRleEF0dHJzQXJlQm91bmQ9ITEsdGhpcy5pdGVtc1RvUG9sbD1bXSx0aGlzLmdsPW51bGwhPWU/ZTpjcmVhdGVXZWJHTENvbnRleHQoKSwxPT09RU5WLmdldChcIldFQkdMX1ZFUlNJT05cIik/KHRoaXMudGV4dHVyZUZsb2F0RXh0ZW5zaW9uPWdldEV4dGVuc2lvbk9yVGhyb3codGhpcy5nbCxcIk9FU190ZXh0dXJlX2Zsb2F0XCIpLHRoaXMuY29sb3JCdWZmZXJGbG9hdEV4dGVuc2lvbj10aGlzLmdsLmdldEV4dGVuc2lvbihcIldFQkdMX2NvbG9yX2J1ZmZlcl9mbG9hdFwiKSxFTlYuZ2V0KFwiV0VCR0xfUkVOREVSX0ZMT0FUMzJfRU5BQkxFRFwiKXx8KHRoaXMudGV4dHVyZUhhbGZGbG9hdEV4dGVuc2lvbj1nZXRFeHRlbnNpb25PclRocm93KHRoaXMuZ2wsXCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0XCIpLHRoaXMuY29sb3JCdWZmZXJIYWxmRmxvYXRFeHRlbnNpb249dGhpcy5nbC5nZXRFeHRlbnNpb24oXCJFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXRcIikpKTp0aGlzLmNvbG9yQnVmZmVyRmxvYXRFeHRlbnNpb249Z2V0RXh0ZW5zaW9uT3JUaHJvdyh0aGlzLmdsLFwiRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdFwiKSx0aGlzLmxvc2VDb250ZXh0RXh0ZW5zaW9uPWdldEV4dGVuc2lvbk9yVGhyb3codGhpcy5nbCxcIldFQkdMX2xvc2VfY29udGV4dFwiKSx0aGlzLnZlcnRleEJ1ZmZlcj1jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5nbCksdGhpcy5pbmRleEJ1ZmZlcj1jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmdsKSx0aGlzLmZyYW1lYnVmZmVyPWNyZWF0ZUZyYW1lYnVmZmVyKHRoaXMuZ2wpLHRoaXMudGV4dHVyZUNvbmZpZz1nZXRUZXh0dXJlQ29uZmlnKHRoaXMuZ2wsdGhpcy50ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uKX1yZXR1cm4gZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoIXRoaXMuZGlzcG9zZWQpe251bGwhPXRoaXMucHJvZ3JhbSYmY29uc29sZS53YXJuKFwiRGlzcG9zaW5nIGEgR1BHUFVDb250ZXh0IHRoYXQgc3RpbGwgaGFzIGEgYm91bmQgV2ViR0xQcm9ncmFtLiBUaGlzIGlzIHByb2JhYmx5IGEgcmVzb3VyY2UgbGVhaywgZGVsZXRlIHRoZSBwcm9ncmFtIHdpdGggR1BHUFVDb250ZXh0LmRlbGV0ZVByb2dyYW0gYmVmb3JlIGRpc3Bvc2luZy5cIiksbnVsbCE9dGhpcy5vdXRwdXRUZXh0dXJlJiZjb25zb2xlLndhcm4oXCJEaXNwb3NpbmcgYSBHUEdQVUNvbnRleHQgdGhhdCBzdGlsbCBoYXMgYSBib3VuZCBvdXRwdXQgbWF0cml4IHRleHR1cmUuICBUaGlzIGlzIHByb2JhYmx5IGEgcmVzb3VyY2UgbGVhaywgZGVsZXRlIHRoZSBvdXRwdXQgbWF0cml4IHRleHR1cmUgd2l0aCBHUEdQVUNvbnRleHQuZGVsZXRlTWF0cml4VGV4dHVyZSBiZWZvcmUgZGlzcG9zaW5nLlwiKTt2YXIgdD10aGlzLmdsO2NhbGxBbmRDaGVjayh0LGZ1bmN0aW9uKCl7cmV0dXJuIHQuZmluaXNoKCl9KSxjYWxsQW5kQ2hlY2sodCxmdW5jdGlvbigpe3JldHVybiB0LmJpbmRGcmFtZWJ1ZmZlcih0LkZSQU1FQlVGRkVSLG51bGwpfSksY2FsbEFuZENoZWNrKHQsZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWxldGVGcmFtZWJ1ZmZlcihlLmZyYW1lYnVmZmVyKX0pLGNhbGxBbmRDaGVjayh0LGZ1bmN0aW9uKCl7cmV0dXJuIHQuYmluZEJ1ZmZlcih0LkFSUkFZX0JVRkZFUixudWxsKX0pLGNhbGxBbmRDaGVjayh0LGZ1bmN0aW9uKCl7cmV0dXJuIHQuZGVsZXRlQnVmZmVyKGUudmVydGV4QnVmZmVyKX0pLGNhbGxBbmRDaGVjayh0LGZ1bmN0aW9uKCl7cmV0dXJuIHQuYmluZEJ1ZmZlcih0LkVMRU1FTlRfQVJSQVlfQlVGRkVSLG51bGwpfSksY2FsbEFuZENoZWNrKHQsZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWxldGVCdWZmZXIoZS5pbmRleEJ1ZmZlcil9KSx0aGlzLmxvc2VDb250ZXh0RXh0ZW5zaW9uLmxvc2VDb250ZXh0KCksdGhpcy5kaXNwb3NlZD0hMH19LGUucHJvdG90eXBlLmVuYWJsZUF1dG9tYXRpY0RlYnVnVmFsaWRhdGlvbj1mdW5jdGlvbihlKXt0aGlzLmF1dG9EZWJ1Z1ZhbGlkYXRlPWUsZW5hYmxlRGVidWdXZWJHTEVycm9yQ2hlY2tpbmcoZSl9LGUucHJvdG90eXBlLmNyZWF0ZUZsb2F0MzJNYXRyaXhUZXh0dXJlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksY3JlYXRlRmxvYXQzMk1hdHJpeFRleHR1cmUodGhpcy5nbCxlLHQsdGhpcy50ZXh0dXJlQ29uZmlnKX0sZS5wcm90b3R5cGUuY3JlYXRlRmxvYXQxNk1hdHJpeFRleHR1cmU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxjcmVhdGVGbG9hdDE2TWF0cml4VGV4dHVyZSh0aGlzLmdsLGUsdCx0aGlzLnRleHR1cmVDb25maWcpfSxlLnByb3RvdHlwZS5jcmVhdGVVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLGNyZWF0ZVVuc2lnbmVkQnl0ZXNNYXRyaXhUZXh0dXJlKHRoaXMuZ2wsZSx0LHRoaXMudGV4dHVyZUNvbmZpZyl9LGUucHJvdG90eXBlLnVwbG9hZFBpeGVsRGF0YVRvVGV4dHVyZT1mdW5jdGlvbihlLHQpe3RoaXMudGhyb3dJZkRpc3Bvc2VkKCksdXBsb2FkUGl4ZWxEYXRhVG9UZXh0dXJlKHRoaXMuZ2wsZSx0KX0sZS5wcm90b3R5cGUuY3JlYXRlRmxvYXQxNlBhY2tlZE1hdHJpeFRleHR1cmU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxjcmVhdGVGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZSh0aGlzLmdsLGUsdCx0aGlzLnRleHR1cmVDb25maWcpfSxlLnByb3RvdHlwZS5jcmVhdGVQYWNrZWRNYXRyaXhUZXh0dXJlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksY3JlYXRlUGFja2VkTWF0cml4VGV4dHVyZSh0aGlzLmdsLGUsdCx0aGlzLnRleHR1cmVDb25maWcpfSxlLnByb3RvdHlwZS5kZWxldGVNYXRyaXhUZXh0dXJlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy50aHJvd0lmRGlzcG9zZWQoKSx0aGlzLm91dHB1dFRleHR1cmU9PT1lJiYodW5iaW5kQ29sb3JUZXh0dXJlRnJvbUZyYW1lYnVmZmVyKHRoaXMuZ2wsdGhpcy5mcmFtZWJ1ZmZlciksdGhpcy5vdXRwdXRUZXh0dXJlPW51bGwpLGNhbGxBbmRDaGVjayh0aGlzLmdsLGZ1bmN0aW9uKCl7cmV0dXJuIHQuZ2wuZGVsZXRlVGV4dHVyZShlKX0pfSxlLnByb3RvdHlwZS51cGxvYWRNYXRyaXhUb1RleHR1cmU9ZnVuY3Rpb24oZSx0LG4scil7dGhpcy50aHJvd0lmRGlzcG9zZWQoKTt2YXIgbz1nZXROdW1DaGFubmVscygpO3JldHVybiB1cGxvYWRNYXRyaXhUb1RleHR1cmUodGhpcy5nbCxlLHQsbixyLG8sdGhpcy50ZXh0dXJlQ29uZmlnKX0sZS5wcm90b3R5cGUudXBsb2FkTWF0cml4VG9QYWNrZWRUZXh0dXJlPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLHVwbG9hZE1hdHJpeFRvUGFja2VkVGV4dHVyZSh0aGlzLmdsLGUsdCxuLHIsdGhpcy50ZXh0dXJlQ29uZmlnKX0sZS5wcm90b3R5cGUuZG93bmxvYWRGbG9hdDMyTWF0cml4RnJvbU91dHB1dFRleHR1cmU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXM7cmV0dXJuIHRoaXMuZG93bmxvYWRNYXRyaXhEcml2ZXIoZSxmdW5jdGlvbigpe3JldHVybiBkb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tT3V0cHV0VGV4dHVyZShyLmdsLHQsbixyLnRleHR1cmVDb25maWcpfSl9LGUucHJvdG90eXBlLmRvd25sb2FkQnl0ZUVuY29kZWRGbG9hdE1hdHJpeEZyb21PdXRwdXRUZXh0dXJlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzO3JldHVybiB0aGlzLmRvd25sb2FkTWF0cml4RHJpdmVyKGUsZnVuY3Rpb24oKXtyZXR1cm4gZG93bmxvYWRCeXRlRW5jb2RlZEZsb2F0TWF0cml4RnJvbU91dHB1dFRleHR1cmUoci5nbCx0LG4sci50ZXh0dXJlQ29uZmlnKX0pfSxlLnByb3RvdHlwZS5kb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tQnVmZmVyPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZG93bmxvYWRGbG9hdDMyTWF0cml4RnJvbUJ1ZmZlcih0aGlzLmdsLGUsdCxuLHRoaXMudGV4dHVyZUNvbmZpZyl9LGUucHJvdG90eXBlLm1heWJlQ3JlYXRlQnVmZmVyRnJvbVRleHR1cmU9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyKGUpO3ZhciByPW1heWJlQ3JlYXRlQnVmZmVyRnJvbU91dHB1dFRleHR1cmUodGhpcy5nbCxlLHQsbix0aGlzLnRleHR1cmVDb25maWcpO3JldHVybiB0aGlzLnVuYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyKCkscn0sZS5wcm90b3R5cGUuY3JlYXRlQW5kV2FpdEZvckZlbmNlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5jcmVhdGVGZW5jZSh0aGlzLmdsKTtyZXR1cm4gdGhpcy5wb2xsRmVuY2UoZSl9LGUucHJvdG90eXBlLmNyZWF0ZUZlbmNlPWZ1bmN0aW9uKGUpe3ZhciB0LG4scj10aGlzO2lmKEVOVi5nZXQoXCJXRUJHTF9GRU5DRV9BUElfRU5BQkxFRFwiKSl7dmFyIG89ZSxhPW8uZmVuY2VTeW5jKG8uU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEUsMCk7ZS5mbHVzaCgpLG49ZnVuY3Rpb24oKXt2YXIgZT1vLmNsaWVudFdhaXRTeW5jKGEsMCwwKTtyZXR1cm4gZT09PW8uQUxSRUFEWV9TSUdOQUxFRHx8ZT09PW8uQ09ORElUSU9OX1NBVElTRklFRH0sdD1hfWVsc2UgRU5WLmdldChcIldFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9WRVJTSU9OXCIpPjA/KHQ9dGhpcy5iZWdpblF1ZXJ5KCksdGhpcy5lbmRRdWVyeSgpLG49ZnVuY3Rpb24oKXtyZXR1cm4gci5pc1F1ZXJ5QXZhaWxhYmxlKHQsRU5WLmdldChcIldFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9WRVJTSU9OXCIpKX0pOm49ZnVuY3Rpb24oKXtyZXR1cm4hMH07cmV0dXJue3F1ZXJ5OnQsaXNGZW5jZVBhc3NlZDpufX0sZS5wcm90b3R5cGUuZG93bmxvYWRNYXRyaXhGcm9tUGFja2VkVGV4dHVyZT1mdW5jdGlvbihlLHQsbixyKXt2YXIgbz10aGlzO3JldHVybiB0aGlzLmRvd25sb2FkTWF0cml4RHJpdmVyKGUsZnVuY3Rpb24oKXtyZXR1cm4gZG93bmxvYWRNYXRyaXhGcm9tUGFja2VkT3V0cHV0VGV4dHVyZShvLmdsLHRbMF0sdFsxXSxuLHIsby50ZXh0dXJlQ29uZmlnKX0pfSxlLnByb3RvdHlwZS5jcmVhdGVQcm9ncmFtPWZ1bmN0aW9uKGUpe3RoaXMudGhyb3dJZkRpc3Bvc2VkKCk7dmFyIHQ9dGhpcy5nbCxuPWNyZWF0ZUZyYWdtZW50U2hhZGVyKHQsZSkscj1jcmVhdGVWZXJ0ZXhTaGFkZXIkMSh0KSxvPWNyZWF0ZVByb2dyYW0odCk7cmV0dXJuIGNhbGxBbmRDaGVjayh0LGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXR0YWNoU2hhZGVyKG8scil9KSxjYWxsQW5kQ2hlY2sodCxmdW5jdGlvbigpe3JldHVybiB0LmF0dGFjaFNoYWRlcihvLG4pfSksbGlua1Byb2dyYW0odCxvKSx0aGlzLmF1dG9EZWJ1Z1ZhbGlkYXRlJiZ2YWxpZGF0ZVByb2dyYW0odCxvKSx0aGlzLnZlcnRleEF0dHJzQXJlQm91bmR8fCh0aGlzLnNldFByb2dyYW0obyksdGhpcy52ZXJ0ZXhBdHRyc0FyZUJvdW5kPWJpbmRWZXJ0ZXhQcm9ncmFtQXR0cmlidXRlU3RyZWFtcyh0LHRoaXMucHJvZ3JhbSx0aGlzLnZlcnRleEJ1ZmZlcikpLG99LGUucHJvdG90eXBlLmRlbGV0ZVByb2dyYW09ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLnRocm93SWZEaXNwb3NlZCgpLGU9PT10aGlzLnByb2dyYW0mJih0aGlzLnByb2dyYW09bnVsbCksbnVsbCE9ZSYmY2FsbEFuZENoZWNrKHRoaXMuZ2wsZnVuY3Rpb24oKXtyZXR1cm4gdC5nbC5kZWxldGVQcm9ncmFtKGUpfSl9LGUucHJvdG90eXBlLnNldFByb2dyYW09ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLnRocm93SWZEaXNwb3NlZCgpLHRoaXMucHJvZ3JhbT1lLG51bGwhPXRoaXMucHJvZ3JhbSYmdGhpcy5hdXRvRGVidWdWYWxpZGF0ZSYmdmFsaWRhdGVQcm9ncmFtKHRoaXMuZ2wsdGhpcy5wcm9ncmFtKSxjYWxsQW5kQ2hlY2sodGhpcy5nbCxmdW5jdGlvbigpe3JldHVybiB0LmdsLnVzZVByb2dyYW0oZSl9KX0sZS5wcm90b3R5cGUuZ2V0VW5pZm9ybUxvY2F0aW9uPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49ITApLHRoaXMudGhyb3dJZkRpc3Bvc2VkKCksbj9nZXRQcm9ncmFtVW5pZm9ybUxvY2F0aW9uT3JUaHJvdyh0aGlzLmdsLGUsdCk6Z2V0UHJvZ3JhbVVuaWZvcm1Mb2NhdGlvbih0aGlzLmdsLGUsdCl9LGUucHJvdG90eXBlLmdldEF0dHJpYnV0ZUxvY2F0aW9uPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gdGhpcy50aHJvd0lmRGlzcG9zZWQoKSxjYWxsQW5kQ2hlY2sodGhpcy5nbCxmdW5jdGlvbigpe3JldHVybiBuLmdsLmdldEF0dHJpYkxvY2F0aW9uKGUsdCl9KX0sZS5wcm90b3R5cGUuZ2V0VW5pZm9ybUxvY2F0aW9uTm9UaHJvdz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnRocm93SWZEaXNwb3NlZCgpLHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsdCl9LGUucHJvdG90eXBlLnNldElucHV0TWF0cml4VGV4dHVyZT1mdW5jdGlvbihlLHQsbil7dGhpcy50aHJvd0lmRGlzcG9zZWQoKSx0aGlzLnRocm93SWZOb1Byb2dyYW0oKSxiaW5kVGV4dHVyZVRvUHJvZ3JhbVVuaWZvcm1TYW1wbGVyKHRoaXMuZ2wsdGhpcy5wcm9ncmFtLGUsdCxuKX0sZS5wcm90b3R5cGUuc2V0T3V0cHV0TWF0cml4VGV4dHVyZT1mdW5jdGlvbihlLHQsbil7dGhpcy5zZXRPdXRwdXRNYXRyaXhUZXh0dXJlRHJpdmVyKGUsbix0KX0sZS5wcm90b3R5cGUuc2V0T3V0cHV0UGFja2VkTWF0cml4VGV4dHVyZT1mdW5jdGlvbihlLHQsbil7dGhpcy50aHJvd0lmRGlzcG9zZWQoKTt2YXIgcj1nZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodCh0LG4pLG89clswXSxhPXJbMV07dGhpcy5zZXRPdXRwdXRNYXRyaXhUZXh0dXJlRHJpdmVyKGUsbyxhKX0sZS5wcm90b3R5cGUuc2V0T3V0cHV0TWF0cml4V3JpdGVSZWdpb249ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5zZXRPdXRwdXRNYXRyaXhXcml0ZVJlZ2lvbkRyaXZlcihuLGUscix0KX0sZS5wcm90b3R5cGUuc2V0T3V0cHV0UGFja2VkTWF0cml4V3JpdGVSZWdpb249ZnVuY3Rpb24oZSx0LG4scil7dGhyb3cgbmV3IEVycm9yKFwic2V0T3V0cHV0UGFja2VkTWF0cml4V3JpdGVSZWdpb24gbm90IGltcGxlbWVudGVkLlwiKX0sZS5wcm90b3R5cGUuZGVidWdWYWxpZGF0ZT1mdW5jdGlvbigpe251bGwhPXRoaXMucHJvZ3JhbSYmdmFsaWRhdGVQcm9ncmFtKHRoaXMuZ2wsdGhpcy5wcm9ncmFtKSx2YWxpZGF0ZUZyYW1lYnVmZmVyKHRoaXMuZ2wpfSxlLnByb3RvdHlwZS5leGVjdXRlUHJvZ3JhbT1mdW5jdGlvbigpe3RoaXMudGhyb3dJZkRpc3Bvc2VkKCksdGhpcy50aHJvd0lmTm9Qcm9ncmFtKCk7dmFyIGU9dGhpcy5nbDt0aGlzLmF1dG9EZWJ1Z1ZhbGlkYXRlJiZ0aGlzLmRlYnVnVmFsaWRhdGUoKSxjYWxsQW5kQ2hlY2soZSxmdW5jdGlvbigpe3JldHVybiBlLmRyYXdFbGVtZW50cyhlLlRSSUFOR0xFUyw2LGUuVU5TSUdORURfU0hPUlQsMCl9KX0sZS5wcm90b3R5cGUuYmxvY2tVbnRpbEFsbFByb2dyYW1zQ29tcGxldGVkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLnRocm93SWZEaXNwb3NlZCgpLGNhbGxBbmRDaGVjayh0aGlzLmdsLGZ1bmN0aW9uKCl7cmV0dXJuIGUuZ2wuZmluaXNoKCl9KX0sZS5wcm90b3R5cGUuZ2V0UXVlcnlUaW1lckV4dGVuc2lvbj1mdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLmRpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbiYmKHRoaXMuZGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uPWdldEV4dGVuc2lvbk9yVGhyb3codGhpcy5nbCwyPT09RU5WLmdldChcIldFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9WRVJTSU9OXCIpP1wiRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5X3dlYmdsMlwiOlwiRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5XCIpKSx0aGlzLmRpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbn0sZS5wcm90b3R5cGUuZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb24oKX0sZS5wcm90b3R5cGUuZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb24oKX0sZS5wcm90b3R5cGUuYmVnaW5RdWVyeT1mdW5jdGlvbigpe2lmKDI9PT1FTlYuZ2V0KFwiV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT05cIikpe3ZhciBlPXRoaXMuZ2wsdD10aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDIoKSxuPWUuY3JlYXRlUXVlcnkoKTtyZXR1cm4gZS5iZWdpblF1ZXJ5KHQuVElNRV9FTEFQU0VEX0VYVCxuKSxufXZhciByPXRoaXMuZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMSgpLG89ci5jcmVhdGVRdWVyeUVYVCgpO3JldHVybiByLmJlZ2luUXVlcnlFWFQoci5USU1FX0VMQVBTRURfRVhULG8pLG99LGUucHJvdG90eXBlLmVuZFF1ZXJ5PWZ1bmN0aW9uKCl7aWYoMiE9PUVOVi5nZXQoXCJXRUJHTF9ESVNKT0lOVF9RVUVSWV9USU1FUl9FWFRFTlNJT05fVkVSU0lPTlwiKSl7dmFyIGU9dGhpcy5nZXRRdWVyeVRpbWVyRXh0ZW5zaW9uV2ViR0wxKCk7ZS5lbmRRdWVyeUVYVChlLlRJTUVfRUxBUFNFRF9FWFQpfWVsc2V7dmFyIHQ9dGhpcy5nbCxuPXRoaXMuZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMigpO3QuZW5kUXVlcnkobi5USU1FX0VMQVBTRURfRVhUKX19LGUucHJvdG90eXBlLndhaXRGb3JRdWVyeUFuZEdldFRpbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKG4pe3N3aXRjaChuLmxhYmVsKXtjYXNlIDA6cmV0dXJuWzQscmVwZWF0ZWRUcnkoZnVuY3Rpb24oKXtyZXR1cm4gdC5pc1F1ZXJ5QXZhaWxhYmxlKGUsRU5WLmdldChcIldFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9WRVJTSU9OXCIpKX0pXTtjYXNlIDE6cmV0dXJuIG4uc2VudCgpLFsyLHRoaXMuZ2V0UXVlcnlUaW1lKGUsRU5WLmdldChcIldFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9WRVJTSU9OXCIpKV19fSl9KX0sZS5wcm90b3R5cGUuZ2V0UXVlcnlUaW1lPWZ1bmN0aW9uKGUsdCl7aWYoMD09PXQpcmV0dXJuIG51bGw7aWYoMj09PXQpe3ZhciBuPXRoaXMuZ2w7cmV0dXJuIG4uZ2V0UXVlcnlQYXJhbWV0ZXIoZSxuLlFVRVJZX1JFU1VMVCkvMWU2fXZhciByPXRoaXMuZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMSgpO3JldHVybiByLmdldFF1ZXJ5T2JqZWN0RVhUKGUsci5RVUVSWV9SRVNVTFRfRVhUKS8xZTZ9LGUucHJvdG90eXBlLmlzUXVlcnlBdmFpbGFibGU9ZnVuY3Rpb24oZSx0KXtpZigwPT09dClyZXR1cm4hMDtpZigyPT09dCl7dmFyIG49dGhpcy5nbCxyPXRoaXMuZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMigpLG89bi5nZXRRdWVyeVBhcmFtZXRlcihlLG4uUVVFUllfUkVTVUxUX0FWQUlMQUJMRSk7cmV0dXJuIG51bGw9PXRoaXMuZGlzam9pbnQmJih0aGlzLmRpc2pvaW50PXRoaXMuZ2wuZ2V0UGFyYW1ldGVyKHIuR1BVX0RJU0pPSU5UX0VYVCkpLG8mJiF0aGlzLmRpc2pvaW50fW89KHI9dGhpcy5nZXRRdWVyeVRpbWVyRXh0ZW5zaW9uV2ViR0wxKCkpLmdldFF1ZXJ5T2JqZWN0RVhUKGUsci5RVUVSWV9SRVNVTFRfQVZBSUxBQkxFX0VYVCk7cmV0dXJuIG51bGw9PXRoaXMuZGlzam9pbnQmJih0aGlzLmRpc2pvaW50PXRoaXMuZ2wuZ2V0UGFyYW1ldGVyKHIuR1BVX0RJU0pPSU5UX0VYVCkpLG8mJiF0aGlzLmRpc2pvaW50fSxlLnByb3RvdHlwZS5wb2xsRmVuY2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24obil7dC5hZGRJdGVtVG9Qb2xsKGZ1bmN0aW9uKCl7cmV0dXJuIGUuaXNGZW5jZVBhc3NlZCgpfSxmdW5jdGlvbigpe3JldHVybiBuKCl9KX0pfSxlLnByb3RvdHlwZS5wb2xsSXRlbXM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9YmluU2VhcmNoTGFzdFRydWUodGhpcy5pdGVtc1RvUG9sbC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXNEb25lRm59KSksdD0wO3Q8PWU7Kyt0KXsoMCx0aGlzLml0ZW1zVG9Qb2xsW3RdLnJlc29sdmVGbikoKX10aGlzLml0ZW1zVG9Qb2xsPXRoaXMuaXRlbXNUb1BvbGwuc2xpY2UoZSsxKX0sZS5wcm90b3R5cGUuYWRkSXRlbVRvUG9sbD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7dGhpcy5pdGVtc1RvUG9sbC5wdXNoKHtpc0RvbmVGbjplLHJlc29sdmVGbjp0fSksdGhpcy5pdGVtc1RvUG9sbC5sZW5ndGg+MXx8cmVwZWF0ZWRUcnkoZnVuY3Rpb24oKXtyZXR1cm4gbi5wb2xsSXRlbXMoKSwwPT09bi5pdGVtc1RvUG9sbC5sZW5ndGh9KX0sZS5wcm90b3R5cGUuYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyPWZ1bmN0aW9uKGUpe3RoaXMudGhyb3dJZkRpc3Bvc2VkKCksYmluZENvbG9yVGV4dHVyZVRvRnJhbWVidWZmZXIodGhpcy5nbCxlLHRoaXMuZnJhbWVidWZmZXIpLHRoaXMuYXV0b0RlYnVnVmFsaWRhdGUmJnZhbGlkYXRlRnJhbWVidWZmZXIodGhpcy5nbCl9LGUucHJvdG90eXBlLnVuYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyPWZ1bmN0aW9uKCl7bnVsbCE9dGhpcy5vdXRwdXRUZXh0dXJlPyhiaW5kQ29sb3JUZXh0dXJlVG9GcmFtZWJ1ZmZlcih0aGlzLmdsLHRoaXMub3V0cHV0VGV4dHVyZSx0aGlzLmZyYW1lYnVmZmVyKSx0aGlzLmF1dG9EZWJ1Z1ZhbGlkYXRlJiZ2YWxpZGF0ZUZyYW1lYnVmZmVyKHRoaXMuZ2wpKTp1bmJpbmRDb2xvclRleHR1cmVGcm9tRnJhbWVidWZmZXIodGhpcy5nbCx0aGlzLmZyYW1lYnVmZmVyKX0sZS5wcm90b3R5cGUuZG93bmxvYWRNYXRyaXhEcml2ZXI9ZnVuY3Rpb24oZSx0KXt0aGlzLmJpbmRUZXh0dXJlVG9GcmFtZUJ1ZmZlcihlKTt2YXIgbj10KCk7cmV0dXJuIHRoaXMudW5iaW5kVGV4dHVyZVRvRnJhbWVCdWZmZXIoKSxufSxlLnByb3RvdHlwZS5zZXRPdXRwdXRNYXRyaXhUZXh0dXJlRHJpdmVyPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLnRocm93SWZEaXNwb3NlZCgpO3ZhciByPXRoaXMuZ2w7YmluZENvbG9yVGV4dHVyZVRvRnJhbWVidWZmZXIocixlLHRoaXMuZnJhbWVidWZmZXIpLHRoaXMuYXV0b0RlYnVnVmFsaWRhdGUmJnZhbGlkYXRlRnJhbWVidWZmZXIociksdGhpcy5vdXRwdXRUZXh0dXJlPWUsY2FsbEFuZENoZWNrKHIsZnVuY3Rpb24oKXtyZXR1cm4gci52aWV3cG9ydCgwLDAsdCxuKX0pLGNhbGxBbmRDaGVjayhyLGZ1bmN0aW9uKCl7cmV0dXJuIHIuc2Npc3NvcigwLDAsdCxuKX0pfSxlLnByb3RvdHlwZS5zZXRPdXRwdXRNYXRyaXhXcml0ZVJlZ2lvbkRyaXZlcj1mdW5jdGlvbihlLHQsbixyKXt2YXIgbz10aGlzO3RoaXMudGhyb3dJZkRpc3Bvc2VkKCksY2FsbEFuZENoZWNrKHRoaXMuZ2wsZnVuY3Rpb24oKXtyZXR1cm4gby5nbC5zY2lzc29yKGUsdCxuLHIpfSl9LGUucHJvdG90eXBlLnRocm93SWZEaXNwb3NlZD1mdW5jdGlvbigpe2lmKHRoaXMuZGlzcG9zZWQpdGhyb3cgbmV3IEVycm9yKFwiQXR0ZW1wdGVkIHRvIHVzZSBkaXNwb3NlZCBHUEdQVUNvbnRleHQuXCIpfSxlLnByb3RvdHlwZS50aHJvd0lmTm9Qcm9ncmFtPWZ1bmN0aW9uKCl7aWYobnVsbD09dGhpcy5wcm9ncmFtKXRocm93IG5ldyBFcnJvcihcIk5vIEdQVSBwcm9ncmFtIGlzIGN1cnJlbnRseSBzZXQuXCIpfSxlfSgpO2Z1bmN0aW9uIGJpblNlYXJjaExhc3RUcnVlKGUpe2Zvcih2YXIgdD0wLG49ZS5sZW5ndGgtMSxyPS0xO3Q8PW47KXt2YXIgbz10K24+PjE7ZVtvXSgpPyhyPW8sdD1vKzEpOm49by0xfXJldHVybiByfWZ1bmN0aW9uIGNvbXBpbGVQcm9ncmFtKGUsdCxuLHIpe2Zvcih2YXIgbz10LnVzZXJDb2RlLGE9bi5tYXAoZnVuY3Rpb24oZSxuKXt2YXIgcj17bG9naWNhbFNoYXBlOmUuc2hhcGUsdGV4U2hhcGU6ZS5pc1VuaWZvcm0/bnVsbDplLnRleERhdGEudGV4U2hhcGUsaXNVbmlmb3JtOmUuaXNVbmlmb3JtLGlzUGFja2VkOiFlLmlzVW5pZm9ybSYmZS50ZXhEYXRhLnVzYWdlPT09VGV4dHVyZVVzYWdlLlBBQ0t9O3JldHVybntuYW1lOnQudmFyaWFibGVOYW1lc1tuXSxzaGFwZUluZm86cn19KSxpPWEubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNoYXBlSW5mb30pLHM9e2xvZ2ljYWxTaGFwZTpyLnNoYXBlLHRleFNoYXBlOnIudGV4RGF0YS50ZXhTaGFwZSxpc1VuaWZvcm06ITEsaXNQYWNrZWQ6ci50ZXhEYXRhLnVzYWdlPT09VGV4dHVyZVVzYWdlLlBBQ0t9LHU9bWFrZVNoYWRlcihhLHMsbywhMD09PXQuc3VwcG9ydHNCcm9hZGNhc3RpbmcpLGw9ZS5jcmVhdGVQcm9ncmFtKHUpLGM9e30scD0wO3A8dC52YXJpYWJsZU5hbWVzLmxlbmd0aDtwKyspe3ZhciBkPXQudmFyaWFibGVOYW1lc1twXTtjW2RdPWUuZ2V0VW5pZm9ybUxvY2F0aW9uKGwsZCwhMSl9cmV0dXJue3Byb2dyYW06dCxzb3VyY2U6dSx3ZWJHTFByb2dyYW06bCx1bmlmb3JtTG9jYXRpb25zOmMsZ3BncHU6ZSxpblNoYXBlSW5mb3M6aSxvdXRTaGFwZUluZm86c319ZnVuY3Rpb24gdmFsaWRhdGVCaW5hcnlBbmRQcm9ncmFtKGUsdCl7aWYoZS5sZW5ndGghPT10Lmxlbmd0aCl0aHJvdyBFcnJvcihcIkJpbmFyeSB3YXMgY29tcGlsZWQgd2l0aCBcIitlLmxlbmd0aCtcIiBpbnB1dHMsIGJ1dCB3YXMgZXhlY3V0ZWQgd2l0aCBcIit0Lmxlbmd0aCtcIiBpbnB1dHNcIik7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUsbil7dmFyIHI9ZS5sb2dpY2FsU2hhcGUsbz10W25dLGE9by5zaGFwZTtpZighYXJyYXlzRXF1YWwocixhKSl0aHJvdyBFcnJvcihcIkJpbmFyeSB3YXMgY29tcGlsZWQgd2l0aCBkaWZmZXJlbnQgc2hhcGVzIHRoYW4gdGhlIGN1cnJlbnQgYXJncy4gU2hhcGVzIFwiK3IrXCIgYW5kIFwiK2ErXCIgbXVzdCBtYXRjaFwiKTtpZighZS5pc1VuaWZvcm18fCFvLmlzVW5pZm9ybSl7dmFyIGk9ZS50ZXhTaGFwZSxzPW8uaXNVbmlmb3JtP251bGw6by50ZXhEYXRhLnRleFNoYXBlO2lmKCFhcnJheXNFcXVhbChpLHMpKXRocm93IEVycm9yKFwiQmluYXJ5IHdhcyBjb21waWxlZCB3aXRoIGRpZmZlcmVudCB0ZXh0dXJlIHNoYXBlcyB0aGFuIHRoZSBjdXJyZW50IGFyZ3MuIFNoYXBlIFwiK2krXCIgYW5kIFwiK3MrXCIgbXVzdCBtYXRjaFwiKX19KX1mdW5jdGlvbiBydW5Qcm9ncmFtKGUsdCxuLHIpe3ZhbGlkYXRlQmluYXJ5QW5kUHJvZ3JhbShlLmluU2hhcGVJbmZvcyx0KSx2YWxpZGF0ZUJpbmFyeUFuZFByb2dyYW0oW2Uub3V0U2hhcGVJbmZvXSxbbl0pO3ZhciBvPW4udGV4RGF0YS50ZXh0dXJlLGE9bi50ZXhEYXRhLnRleFNoYXBlLGk9ZS5ncGdwdTtuLnRleERhdGEudXNhZ2U9PT1UZXh0dXJlVXNhZ2UuUEFDSz9pLnNldE91dHB1dFBhY2tlZE1hdHJpeFRleHR1cmUobyxhWzBdLGFbMV0pOmkuc2V0T3V0cHV0TWF0cml4VGV4dHVyZShvLGFbMF0sYVsxXSksaS5zZXRQcm9ncmFtKGUud2ViR0xQcm9ncmFtKSx0LmZvckVhY2goZnVuY3Rpb24odCxuKXt2YXIgcj1lLnByb2dyYW0udmFyaWFibGVOYW1lc1tuXSxvPWUudW5pZm9ybUxvY2F0aW9uc1tyXTtpZihudWxsIT1vKXtpZih0LmlzVW5pZm9ybSl7aWYoMT09PXNpemVGcm9tU2hhcGUodC5zaGFwZSkpaS5nbC51bmlmb3JtMWYobyx0LnVuaWZvcm1WYWx1ZXNbMF0pO2Vsc2V7dmFyIGE9dC51bmlmb3JtVmFsdWVzO2EgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXl8fChhPW5ldyBGbG9hdDMyQXJyYXkoYSkpLGkuZ2wudW5pZm9ybTFmdihvLGEpfXJldHVybn12YXIgcz10LnRleERhdGEudGV4dHVyZTtpLnNldElucHV0TWF0cml4VGV4dHVyZShzLG8sbil9fSksbnVsbCE9ciYmcihpLGUud2ViR0xQcm9ncmFtKSxpLmV4ZWN1dGVQcm9ncmFtKCl9ZnVuY3Rpb24gbWFrZVNoYWRlcktleShlLHQsbil7dmFyIHI9XCJcIjt0LmNvbmNhdChuKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3IrPWUuc2hhcGUrXCJfXCIrKGUuaXNVbmlmb3JtP1widW5pZm9ybVwiOmUudGV4RGF0YS50ZXhTaGFwZSl9KTt2YXIgbz1lLnVzZXJDb2RlLGE9KCEwPT09ZS5zdXBwb3J0c0Jyb2FkY2FzdGluZykudG9TdHJpbmcoKSxpPWUuY29uc3RydWN0b3IubmFtZTtyZXR1cm4gaSs9XCJfXCIrYStcIl9cIityK1wiX1wiK299dmFyIEltMkNvbFByb2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe3RoaXMudmFyaWFibGVOYW1lcz1bXCJBXCJdLHRoaXMub3V0cHV0U2hhcGU9ZTt2YXIgcj1uLmZpbHRlcldpZHRoLG89bi5pbkNoYW5uZWxzLGE9bi5zdHJpZGVXaWR0aCxpPW4uc3RyaWRlSGVpZ2h0LHM9bi5wYWRJbmZvLHU9bi5vdXRXaWR0aCxsPW4uZGlsYXRpb25XaWR0aCxjPW4uZGlsYXRpb25IZWlnaHQscD1zLmxlZnQsZD1zLnRvcCxoPW8qcjt0aGlzLnVzZXJDb2RlPVwiXFxuICAgICAgdm9pZCBtYWluKCkge1xcbiAgICAgICAgaXZlYzIgcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcXG5cXG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwKTtcXG5cXG4gICAgICAgIGZvcihpbnQgcm93PTA7IHJvdzw9MTsgcm93KyspIHtcXG4gICAgICAgICAgZm9yKGludCBjb2w9MDsgY29sPD0xOyBjb2wrKykge1xcbiAgICAgICAgICAgIGludCBibG9ja0luZGV4ID0gcmMueSArIGNvbDtcXG4gICAgICAgICAgICBpbnQgcG9zID0gcmMueCArIHJvdztcXG5cXG4gICAgICAgICAgICBpZihibG9ja0luZGV4ID49IFwiK2VbMV0rXCIgfHwgcG9zID49IFwiK2VbMF0rXCIpIGNvbnRpbnVlO1xcblxcbiAgICAgICAgICAgIGludCBvZmZzZXRZID0gaW50KGJsb2NrSW5kZXggLyAoXCIrdStcIikpICogXCIraStcIiAtIFwiK2QrXCI7XFxuICAgICAgICAgICAgaW50IGQwID0gb2Zmc2V0WSArIFwiK2MrXCIgKiAocG9zIC8gXCIraCtcIik7XFxuXFxuICAgICAgICAgICAgaWYoZDAgPj0gXCIrdFswXStcIiB8fCBkMCA8IDApIGNvbnRpbnVlO1xcblxcbiAgICAgICAgICAgIGludCBvZmZzZXRYID0gaW50KG1vZChmbG9hdChibG9ja0luZGV4KSwgXCIrdStcIi4pICogXCIrYStcIi4gLSBcIitwK1wiLik7XFxuICAgICAgICAgICAgaW50IGQxID0gb2Zmc2V0WCArIFwiK2wrXCIgKiAoaW50KG1vZChmbG9hdChwb3MpLCBcIitoK1wiLikgLyBcIitvK1wiLikpO1xcblxcbiAgICAgICAgICAgIGlmKGQxID49IFwiK3RbMV0rXCIgfHwgZDEgPCAwKSBjb250aW51ZTtcXG5cXG4gICAgICAgICAgICByZXN1bHRbcm93ICogMiArIGNvbF0gPSBnZXRBKGQwLCBkMSwgaW50KG1vZChmbG9hdChwb3MpLCBcIitvK1wiLikpKTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfVxcblxcbiAgICAgICAgZ2xfRnJhZ0NvbG9yID0gcmVzdWx0O1xcbiAgICAgIH1cXG4gICAgXCJ9fSgpLExSTlByb2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4scixvKXt0aGlzLnZhcmlhYmxlTmFtZXM9W1wieFwiXSx0aGlzLm91dHB1dFNoYXBlPVtdO3ZhciBhLGk9dCxzPWVbM10tMTt0aGlzLm91dHB1dFNoYXBlPWU7dmFyIHU9XCJmbG9hdChcIituK1wiKSArIGZsb2F0KFwiK3IrXCIpICogc3VtXCI7YT0uNT09PW8/XCJpbnZlcnNlc3FydChcIit1K1wiKVwiOjE9PT1vP1wiMS4wLyhcIit1K1wiKVwiOlwiZXhwKGxvZyhcIit1K1wiKSAqIGZsb2F0KC1cIitvK1wiKSk7XCIsdGhpcy51c2VyQ29kZT1cIlxcbiAgICAgIHZvaWQgbWFpbigpIHtcXG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xcbiAgICAgICAgaW50IGIgPSBjb29yZHNbMF07XFxuICAgICAgICBpbnQgciA9IGNvb3Jkc1sxXTtcXG4gICAgICAgIGludCBjID0gY29vcmRzWzJdO1xcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XFxuICAgICAgICBmbG9hdCB4ID0gZ2V0WChiLCByLCBjLCBkKTtcXG4gICAgICAgIGZsb2F0IHN1bSA9IDAuMDtcXG4gICAgICAgIGZvciAoaW50IGogPSAtXCIraStcIjsgaiA8PSBcIitpK1wiOyBqKyspIHtcXG4gICAgICAgICAgaW50IGlkeCA9IGQgKyBqO1xcbiAgICAgICAgICBpZiAoaWR4ID49IDAgJiYgaWR4IDw9ICBcIitzK1wiKSB7XFxuICAgICAgICAgICAgZmxvYXQgeiA9IGdldFgoYiwgciwgYywgaWR4KTtcXG4gICAgICAgICAgICBzdW0gKz0geiAqIHo7XFxuICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIGZsb2F0IHZhbCA9IHggKiBcIithK1wiO1xcbiAgICAgICAgc2V0T3V0cHV0KHZhbCk7XFxuICAgICAgfVxcbiAgICBcIn19KCksTFJOR3JhZFByb2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4scixvKXt0aGlzLnZhcmlhYmxlTmFtZXM9W1wiaW5wdXRJbWFnZVwiLFwib3V0cHV0SW1hZ2VcIixcImR5XCJdLHRoaXMub3V0cHV0U2hhcGU9W10sdGhpcy5vdXRwdXRTaGFwZT1lLHRoaXMuZGVwdGg9ZVszXSx0aGlzLmRlcHRoUmFkaXVzPXQsdGhpcy5iaWFzPW4sdGhpcy5hbHBoYT1yLHRoaXMuYmV0YT1vLHRoaXMudXNlckNvZGU9XCJcXG4gICAgICB2b2lkIG1haW4oKSB7XFxuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcXG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xcbiAgICAgICAgaW50IHIgPSBjb29yZHNbMV07XFxuICAgICAgICBpbnQgYyA9IGNvb3Jkc1syXTtcXG5cXG4gICAgICAgIGZsb2F0IHJlc3VsdCA9IDAuMDtcXG4gICAgICAgIGZvciAoaW50IGQgPSAwOyBkIDwgXCIrdGhpcy5kZXB0aCtcIjsgKytkKSB7XFxuICAgICAgICAgIGludCBkZXB0aEJlZ2luID0gaW50KG1heCgwLjAsIGZsb2F0KGQgLSBcIit0K1wiKSkpO1xcbiAgICAgICAgICBpbnQgZGVwdGhFbmQgPSBpbnQobWluKGZsb2F0KFwiK3RoaXMuZGVwdGgrXCIpLFxcbiAgICAgICAgICAgICAgZmxvYXQoZCArIFwiK3QrXCIgKyAxKSkpO1xcblxcbiAgICAgICAgICBjb25zdCBpbnQgTUlOX0RFUFRIX0JFR0lOID0gMDtcXG4gICAgICAgICAgY29uc3QgaW50IE1BWF9ERVBUSF9FTkQgPSBcIit0aGlzLmRlcHRoK1wiO1xcblxcbiAgICAgICAgICBmbG9hdCBub3JtID0gMC4wO1xcbiAgICAgICAgICBmb3IgKGludCBrID0gTUlOX0RFUFRIX0JFR0lOOyBrIDwgTUFYX0RFUFRIX0VORDsgKytrKSB7XFxuICAgICAgICAgICAgaWYgKGsgPCBkZXB0aEJlZ2luKXtcXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBlbHNlIGlmIChrID49IGRlcHRoQmVnaW4gJiYgayA8IGRlcHRoRW5kKSB7XFxuICAgICAgICAgICAgICBub3JtICs9IGdldElucHV0SW1hZ2UoYiwgciwgYywgaykgKiBnZXRJbnB1dEltYWdlKGIsIHIsIGMsIGspO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBlbHNlIHtcXG4gICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBub3JtID0gZmxvYXQoXCIrcitcIikgKiBub3JtICsgZmxvYXQoXCIrbitcIik7XFxuXFxuICAgICAgICAgIGZvcihpbnQgayA9IE1JTl9ERVBUSF9CRUdJTjsgayA8IE1BWF9ERVBUSF9FTkQ7ICsrayl7XFxuICAgICAgICAgICAgaWYgKGsgPCBkZXB0aEJlZ2luKXtcXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBlbHNlIGlmIChrID49IGRlcHRoQmVnaW4gJiYgayA8IGRlcHRoRW5kKXtcXG4gICAgICAgICAgICAgIGZsb2F0IGR5aSA9IC0yLjAgKiBmbG9hdChcIityK1wiKVxcbiAgICAgICAgICAgICAgICAqIGZsb2F0KFwiK28rXCIpXFxuICAgICAgICAgICAgICAgICogZ2V0SW5wdXRJbWFnZShiICxyICxjLCBrKSAqIGdldE91dHB1dEltYWdlKGIsIHIsIGMsIGQpXFxuICAgICAgICAgICAgICAgIC8gbm9ybTtcXG4gICAgICAgICAgICAgIGlmIChrID09IGQpIHtcXG4gICAgICAgICAgICAgICAgZHlpICs9IHBvdyhub3JtLCAtMS4wICogXCIrbytcIik7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICBpZiAoayA9PSBjb29yZHNbM10pIHtcXG4gICAgICAgICAgICAgICAgZHlpICo9IGdldER5KGIsIHIsIGMsIGQpO1xcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gZHlpO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBlbHNlIHtcXG4gICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfVxcbiAgICAgIH1cXG4gICAgICBzZXRPdXRwdXQocmVzdWx0KTtcXG4gICAgICB9XFxuICAgIFwifX0oKSxNYXhQb29sMkRCYWNrcHJvcFByb2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSl7dGhpcy52YXJpYWJsZU5hbWVzPVtcImR5XCIsXCJtYXhQb3NcIl0sdGhpcy5vdXRwdXRTaGFwZT1lLmluU2hhcGU7dmFyIHQ9ZS5maWx0ZXJIZWlnaHQsbj1lLmZpbHRlcldpZHRoLHI9ZS5zdHJpZGVIZWlnaHQsbz1lLnN0cmlkZVdpZHRoLGE9dC0xLWUucGFkSW5mby50b3AsaT1uLTEtZS5wYWRJbmZvLmxlZnQscz10Km4tMTt0aGlzLnVzZXJDb2RlPVwiXFxuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKFwiK2ErXCIsIFwiK2krXCIpO1xcblxcbiAgICAgIHZvaWQgbWFpbigpIHtcXG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xcbiAgICAgICAgaW50IGIgPSBjb29yZHNbMF07XFxuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcXG5cXG4gICAgICAgIGl2ZWMyIGR5UkNDb3JuZXIgPSBjb29yZHMueXogLSBwYWRzO1xcbiAgICAgICAgaW50IGR5UkNvcm5lciA9IGR5UkNDb3JuZXIueDtcXG4gICAgICAgIGludCBkeUNDb3JuZXIgPSBkeVJDQ29ybmVyLnk7XFxuXFxuICAgICAgICAvLyBDb252b2x2ZSBkeSg/LCA/LCBkKSB3aXRoIHBvcyBtYXNrKDosIDosIGQpIHRvIGdldCBkeCh4UiwgeEMsIGQpLlxcbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWQuIDogPSBhY3Jvc3MgYWxsIHZhbHVlcyBpbiB0aGF0IGF4aXMuXFxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xcbiAgICAgICAgZm9yIChpbnQgd1IgPSAwOyB3UiA8IFwiK3QrXCI7IHdSKyspIHtcXG4gICAgICAgICAgZmxvYXQgZHlSID0gZmxvYXQoZHlSQ29ybmVyICsgd1IpIC8gXCIrcitcIi4wO1xcblxcbiAgICAgICAgICBpZiAoZHlSIDwgMC4wIHx8IGR5UiA+PSBcIitlLm91dEhlaWdodCtcIi4wIHx8IGZyYWN0KGR5UikgPiAwLjApIHtcXG4gICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBpbnQgaWR5UiA9IGludChkeVIpO1xcblxcbiAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgXCIrbitcIjsgd0MrKykge1xcbiAgICAgICAgICAgIGZsb2F0IGR5QyA9IGZsb2F0KGR5Q0Nvcm5lciArIHdDKSAvIFwiK28rXCIuMDtcXG5cXG4gICAgICAgICAgICBpZiAoZHlDIDwgMC4wIHx8IGR5QyA+PSBcIitlLm91dFdpZHRoK1wiLjAgfHxcXG4gICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xcbiAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XFxuXFxuICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGIsIGlkeVIsIGlkeUMsIGQpO1xcbiAgICAgICAgICAgIGludCBtYXhQb3NWYWx1ZSA9IFwiK3MrXCIgLSBpbnQoZ2V0TWF4UG9zKGIsIGlkeVIsIGlkeUMsIGQpKTtcXG5cXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdmFsdWUsIGNoZWNrIGl0IGFnYWluc3QgdGhlIHZhbHVlIGZyb20gdGhlXFxuICAgICAgICAgICAgLy8gcG9zaXRpb24gbWF0cml4LlxcbiAgICAgICAgICAgIGludCBjdXJQb3NWYWx1ZSA9IHdSICogXCIrbitcIiArIHdDO1xcbiAgICAgICAgICAgIGZsb2F0IG1hc2sgPSBmbG9hdChtYXhQb3NWYWx1ZSA9PSBjdXJQb3NWYWx1ZSA/IDEuMCA6IDAuMCk7XFxuXFxuICAgICAgICAgICAgZG90UHJvZCArPSBkeVZhbHVlICogbWFzaztcXG4gICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xcbiAgICAgIH1cXG4gICAgXCJ9fSgpLE1hdE11bFByb2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4scil7dm9pZCAwPT09biYmKG49ITEpLHZvaWQgMD09PXImJihyPSExKSx0aGlzLnZhcmlhYmxlTmFtZXM9W1wibWF0cml4QVwiLFwibWF0cml4QlwiXTt2YXIgbz1lWzBdLGE9bj9lWzJdOmVbMV0saT1yP3RbMV06dFsyXSxzPW4/ZVsxXTplWzJdO3RoaXMub3V0cHV0U2hhcGU9W28sYSxpXTt2YXIgdT1mdW5jdGlvbihlLHQpe3JldHVybiBuP1wiYmF0Y2gsIFwiK3QrXCIgKyBcIitlK1wiLCBhUm93XCI6XCJiYXRjaCwgYVJvdywgXCIrdCtcIiArIFwiK2V9LGw9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcj9cImJhdGNoLCBiQ29sLCBcIit0K1wiICsgXCIrZTpcImJhdGNoLCBcIit0K1wiICsgXCIrZStcIiwgYkNvbFwifSxjPTQqTWF0aC5mbG9vcihzLzQpLHA9cyU0O3RoaXMudXNlckNvZGU9XCIgZmxvYXQgZG90QVJvd0JDb2woaW50IGJhdGNoLCBpbnQgYVJvdywgaW50IGJDb2wpIHtcXG4gICAgICBmbG9hdCByZXN1bHQgPSAwLjA7XFxuICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBcIitjK1wiOyBpICs9IDQpIHtcXG4gICAgICAgIHZlYzQgYSA9IHZlYzQoXFxuICAgICAgICAgIGdldE1hdHJpeEEoXCIrdSgwLFwiaVwiKStcIiksXFxuICAgICAgICAgIGdldE1hdHJpeEEoXCIrdSgxLFwiaVwiKStcIiksXFxuICAgICAgICAgIGdldE1hdHJpeEEoXCIrdSgyLFwiaVwiKStcIiksXFxuICAgICAgICAgIGdldE1hdHJpeEEoXCIrdSgzLFwiaVwiKStcIilcXG4gICAgICAgICk7XFxuICAgICAgICB2ZWM0IGIgPSB2ZWM0KFxcbiAgICAgICAgICBnZXRNYXRyaXhCKFwiK2woMCxcImlcIikrXCIpLFxcbiAgICAgICAgICBnZXRNYXRyaXhCKFwiK2woMSxcImlcIikrXCIpLFxcbiAgICAgICAgICBnZXRNYXRyaXhCKFwiK2woMixcImlcIikrXCIpLFxcbiAgICAgICAgICBnZXRNYXRyaXhCKFwiK2woMyxcImlcIikrXCIpXFxuICAgICAgICApO1xcblxcbiAgICAgICAgcmVzdWx0ICs9IGRvdChhLCBiKTtcXG4gICAgICB9XFxuXFxuICAgICAgaWYgKFwiKygxPT09cCkrXCIpIHtcXG4gICAgICAgIHJlc3VsdCArPSBnZXRNYXRyaXhBKFwiK3UoMCxjKStcIikgKlxcbiAgICAgICAgICBnZXRNYXRyaXhCKFwiK2woMCxjKStcIik7XFxuICAgICAgfSBlbHNlIGlmIChcIisoMj09PXApK1wiKSB7XFxuICAgICAgICB2ZWMyIGEgPSB2ZWMyKFxcbiAgICAgICAgICBnZXRNYXRyaXhBKFwiK3UoMCxjKStcIiksXFxuICAgICAgICAgIGdldE1hdHJpeEEoXCIrdSgxLGMpK1wiKVxcbiAgICAgICAgKTtcXG4gICAgICAgIHZlYzIgYiA9IHZlYzIoXFxuICAgICAgICAgIGdldE1hdHJpeEIoXCIrbCgwLGMpK1wiKSxcXG4gICAgICAgICAgZ2V0TWF0cml4QihcIitsKDEsYykrXCIpXFxuICAgICAgICApO1xcbiAgICAgICAgcmVzdWx0ICs9IGRvdChhLCBiKTtcXG4gICAgICB9IGVsc2UgaWYgKFwiKygzPT09cCkrXCIpIHtcXG4gICAgICAgIHZlYzMgYSA9IHZlYzMoXFxuICAgICAgICAgIGdldE1hdHJpeEEoXCIrdSgwLGMpK1wiKSxcXG4gICAgICAgICAgZ2V0TWF0cml4QShcIit1KDEsYykrXCIpLFxcbiAgICAgICAgICBnZXRNYXRyaXhBKFwiK3UoMixjKStcIilcXG4gICAgICAgICk7XFxuICAgICAgICB2ZWMzIGIgPSB2ZWMzKFxcbiAgICAgICAgICBnZXRNYXRyaXhCKFwiK2woMCxjKStcIiksXFxuICAgICAgICAgIGdldE1hdHJpeEIoXCIrbCgxLGMpK1wiKSxcXG4gICAgICAgICAgZ2V0TWF0cml4QihcIitsKDIsYykrXCIpXFxuICAgICAgICApO1xcbiAgICAgICAgcmVzdWx0ICs9IGRvdChhLCBiKTtcXG4gICAgICB9XFxuXFxuICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgfVxcblxcbiAgICB2b2lkIG1haW4oKSB7XFxuICAgICAgaXZlYzMgcmVzQlJDID0gZ2V0T3V0cHV0Q29vcmRzKCk7XFxuICAgICAgc2V0T3V0cHV0KGRvdEFSb3dCQ29sKHJlc0JSQy54LCByZXNCUkMueSwgcmVzQlJDLnopKTtcXG4gICAgfVxcbiAgICBcIn19KCksTWF0TXVsUGFja2VkUHJvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLHQsbixyLG8pe3ZvaWQgMD09PXImJihyPSExKSx2b2lkIDA9PT1vJiYobz0hMSksdGhpcy52YXJpYWJsZU5hbWVzPVtcIm1hdHJpeEFcIixcIm1hdHJpeEJcIl0sdGhpcy5vdXRwdXRTaGFwZT1uO3ZhciBhPXI/ZVswXTplWzFdLGk9TWF0aC5jZWlsKGEvMikscz1yP1wiaSAqIDIsIHJjLnhcIjpcInJjLngsIGkgKiAyXCIsdT1vP1wicmMueSwgaSAqIDJcIjpcImkgKiAyLCByYy55XCIsbD1yP1tcImEueHh5eVwiLFwiYS56end3XCJdOltcImEueHh6elwiLFwiYS55eXd3XCJdLGM9bz9bXCJiLnh6eHpcIixcImIueXd5d1wiXTpbXCJiLnh5eHlcIixcImIuend6d1wiXTt0aGlzLnVzZXJDb2RlPVwiXFxuICAgICAgY29uc3QgZmxvYXQgc2hhcmVkRGltZW5zaW9uID0gXCIraStcIi4wO1xcblxcbiAgICAgIHZlYzQgZG90MngyQVJvd0JDb2woaXZlYzIgcmMpIHtcXG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwKTtcXG4gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgXCIraStcIjsgaSsrKSB7XFxuICAgICAgICAgIHZlYzQgYSA9IGdldE1hdHJpeEEoXCIrcytcIik7XFxuICAgICAgICAgIHZlYzQgYiA9IGdldE1hdHJpeEIoXCIrdStcIik7XFxuXFxuICAgICAgICAgIHJlc3VsdCArPSAoXCIrbFswXStcIiAqIFwiK2NbMF0rXCIpICsgKFwiK2xbMV0rXCIgKiBcIitjWzFdK1wiKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiByZXN1bHQ7XFxuICAgICAgfVxcblxcbiAgICAgIHZvaWQgbWFpbigpIHtcXG4gICAgICAgIGl2ZWMyIHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7XFxuICAgICAgICBnbF9GcmFnQ29sb3IgPSBkb3QyeDJBUm93QkNvbChyYyk7XFxuICAgICAgfVxcbiAgICBcIn19KCksTXVsdGlub21pYWxQcm9ncmFtPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQsbil7dGhpcy52YXJpYWJsZU5hbWVzPVtcInByb2JzXCJdLHRoaXMub3V0cHV0U2hhcGU9W2Usbl0sdGhpcy51c2VyQ29kZT1cIlxcbiAgICAgIHVuaWZvcm0gZmxvYXQgc2VlZDtcXG5cXG4gICAgICB2b2lkIG1haW4oKSB7XFxuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcXG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkc1swXTtcXG5cXG4gICAgICAgIGZsb2F0IHIgPSByYW5kb20oc2VlZCk7XFxuICAgICAgICBmbG9hdCBjZGYgPSAwLjA7XFxuXFxuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFwiKyh0LTEpK1wiOyBpKyspIHtcXG4gICAgICAgICAgY2RmICs9IGdldFByb2JzKGJhdGNoLCBpKTtcXG5cXG4gICAgICAgICAgaWYgKHIgPCBjZGYpIHtcXG4gICAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoaSkpO1xcbiAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfVxcblxcbiAgICAgICAgLy8gSWYgbm8gb3RoZXIgZXZlbnQgaGFwcGVuZWQsIGxhc3QgZXZlbnQgaGFwcGVuZWQuXFxuICAgICAgICBzZXRPdXRwdXQoZmxvYXQoXCIrKHQtMSkrXCIpKTtcXG4gICAgICB9XFxuICAgIFwifXJldHVybiBlLnByb3RvdHlwZS5nZXRDdXN0b21TZXR1cEZ1bmM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gZnVuY3Rpb24obixyKXtudWxsPT10LnNlZWRMb2MmJih0LnNlZWRMb2M9bi5nZXRVbmlmb3JtTG9jYXRpb24ocixcInNlZWRcIikpLG4uZ2wudW5pZm9ybTFmKHQuc2VlZExvYyxlKX19LGV9KCksT25lSG90UHJvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLHQsbixyKXt0aGlzLnZhcmlhYmxlTmFtZXM9W1wiaW5kaWNlc1wiXSx0aGlzLm91dHB1dFNoYXBlPVtlLHRdLHRoaXMudXNlckNvZGU9XCJcXG4gICAgICB2b2lkIG1haW4oKSB7XFxuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcXG4gICAgICAgIGludCBpbmRleCA9IHJvdW5kKGdldEluZGljZXMoY29vcmRzLngpKTtcXG4gICAgICAgIHNldE91dHB1dChtaXgoZmxvYXQoXCIrcitcIiksIGZsb2F0KFwiK24rXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgICBmbG9hdChpbmRleCA9PSBjb29yZHMueSkpKTtcXG4gICAgICB9XFxuICAgIFwifX0oKSxQYWNrUHJvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXt0aGlzLnZhcmlhYmxlTmFtZXM9W1wiQVwiXSx0aGlzLm91dHB1dFNoYXBlPWUsdGhpcy51c2VyQ29kZT1cIlxcbiAgICAgIHZvaWQgbWFpbigpIHtcXG4gICAgICAgIGl2ZWMyIHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7XFxuXFxuICAgICAgICBpbnQgciA9IHJjLng7XFxuICAgICAgICBpbnQgYyA9IHJjLnk7XFxuXFxuICAgICAgICBpZihyID49IFwiK2VbMF0rXCIgfHwgYyA+PSBcIitlWzFdK1wiKSB7XFxuICAgICAgICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMCk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICBpbnQgcnAxID0gciArIDE7XFxuICAgICAgICAgIGludCBjcDEgPSBjICsgMTtcXG5cXG4gICAgICAgICAgYm9vbCBjRWRnZSA9IGNwMSA+PSBcIitlWzFdK1wiO1xcbiAgICAgICAgICBib29sIHJFZGdlID0gcnAxID49IFwiK2VbMF0rXCI7XFxuXFxuICAgICAgICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoXFxuICAgICAgICAgICAgICBnZXRBKHIsIGMpLFxcbiAgICAgICAgICAgICAgY0VkZ2UgPyAwLiA6IGdldEEociwgY3AxKSxcXG4gICAgICAgICAgICAgIHJFZGdlID8gMC4gOiBnZXRBKHJwMSwgYyksXFxuICAgICAgICAgICAgICByRWRnZSB8fCBjRWRnZSA/IDAuIDogZ2V0QShycDEsIGNwMSlcXG4gICAgICAgICAgICApO1xcbiAgICAgICAgfVxcbiAgICAgIH1cXG4gICAgXCJ9fSgpLFBhZFByb2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe3RoaXMudmFyaWFibGVOYW1lcz1bXCJ4XCJdLHRoaXMub3V0cHV0U2hhcGU9dC5tYXAoZnVuY3Rpb24odCxuKXtyZXR1cm4gdFswXStlW25dK3RbMV19KTt2YXIgcj1lLmxlbmd0aCxvPWdldENvb3Jkc0RhdGFUeXBlKHIpLGE9dC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF19KS5qb2luKFwiLFwiKSxpPXQubWFwKGZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF0rZVtuXX0pLmpvaW4oXCIsXCIpLHM9W1wiY29vcmRzWzBdXCIsXCJjb29yZHNbMV1cIixcImNvb3Jkc1syXVwiLFwiY29vcmRzWzNdXCJdLnNsaWNlKDAscik7dGhpcy51c2VyQ29kZT0xIT09cj9cIlxcbiAgICAgIFwiK28rXCIgc3RhcnQgPSBcIitvK1wiKFwiK2ErXCIpO1xcbiAgICAgIFwiK28rXCIgZW5kID0gXCIrbytcIihcIitpK1wiKTtcXG5cXG4gICAgICB2b2lkIG1haW4oKSB7XFxuICAgICAgICBcIitvK1wiIG91dEMgPSBnZXRPdXRwdXRDb29yZHMoKTtcXG4gICAgICAgIGlmIChhbnkobGVzc1RoYW4ob3V0Qywgc3RhcnQpKSB8fCBhbnkoZ3JlYXRlclRoYW5FcXVhbChvdXRDLCBlbmQpKSkge1xcbiAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoXCIrbitcIikpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgXCIrbytcIiBjb29yZHMgPSBvdXRDIC0gc3RhcnQ7XFxuICAgICAgICAgIHNldE91dHB1dChnZXRYKFwiK3MrXCIpKTtcXG4gICAgICAgIH1cXG4gICAgICB9XFxuICAgIFwiOlwiXFxuICAgICAgICBpbnQgc3RhcnQgPSBcIithK1wiO1xcbiAgICAgICAgaW50IGVuZCA9IFwiK2krXCI7XFxuXFxuICAgICAgICB2b2lkIG1haW4oKSB7XFxuICAgICAgICAgIGludCBvdXRDID0gZ2V0T3V0cHV0Q29vcmRzKCk7XFxuICAgICAgICAgIGlmIChvdXRDIDwgc3RhcnQgfHwgb3V0QyA+PSBlbmQpIHtcXG4gICAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoXCIrbitcIikpO1xcbiAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHNldE91dHB1dChnZXRYKG91dEMgLSBzdGFydCkpO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgXCJ9fSgpLFBvb2wyRFByb2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMudmFyaWFibGVOYW1lcz1bXCJ4XCJdLFwiYXZnXCI9PT10JiZuKXRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHBvc2l0aW9ucyBmb3IgYXZlcmFnZSBwb29sLlwiKTt2YXIgcj1lLmZpbHRlckhlaWdodCxvPWUuZmlsdGVyV2lkdGgsYT1lLnN0cmlkZUhlaWdodCxpPWUuc3RyaWRlV2lkdGgscz1lLnBhZEluZm8udG9wLHU9ZS5wYWRJbmZvLmxlZnQ7dGhpcy5vdXRwdXRTaGFwZT1lLm91dFNoYXBlO3ZhciBsPVwiYXZnXCI9PT10LGM9XCIwLjBcIjtpZihsfHwoYz1cIi0xLjAgLyAwLjBcIiksbil0aGlzLnVzZXJDb2RlPVwiXFxuICAgICAgICBjb25zdCBpdmVjMiBzdHJpZGVzID0gaXZlYzIoXCIrYStcIiwgXCIraStcIik7XFxuICAgICAgICBjb25zdCBpdmVjMiBwYWRzID0gaXZlYzIoXCIrcytcIiwgXCIrdStcIik7XFxuXFxuICAgICAgICB2b2lkIG1haW4oKSB7XFxuICAgICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xcbiAgICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XFxuICAgICAgICAgIGludCBkID0gY29vcmRzWzNdO1xcblxcbiAgICAgICAgICBpdmVjMiB4UkNDb3JuZXIgPSBjb29yZHMueXogKiBzdHJpZGVzIC0gcGFkcztcXG4gICAgICAgICAgaW50IHhSQ29ybmVyID0geFJDQ29ybmVyLng7XFxuICAgICAgICAgIGludCB4Q0Nvcm5lciA9IHhSQ0Nvcm5lci55O1xcblxcbiAgICAgICAgICAvLyBtYXgvbWluIHgoPywgPywgZCkgdG8gZ2V0IHkoeVIsIHlDLCBkKS5cXG4gICAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWRcXG4gICAgICAgICAgZmxvYXQgbWluTWF4VmFsdWUgPSAwLjA7XFxuICAgICAgICAgIGZsb2F0IG1pbk1heFZhbHVlRm91bmQgPSAwLjA7XFxuICAgICAgICAgIGludCBtaW5NYXhQb3NpdGlvbiA9IDA7XFxuICAgICAgICAgIGZsb2F0IGF2Z1ZhbHVlID0gMC4wO1xcblxcbiAgICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgXCIrcitcIjsgd1IrKykge1xcbiAgICAgICAgICAgIGludCB4UiA9IHhSQ29ybmVyICsgd1I7XFxuXFxuICAgICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSBcIitlLmluSGVpZ2h0K1wiKSB7XFxuICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8IFwiK28rXCI7IHdDKyspIHtcXG4gICAgICAgICAgICAgIGludCB4QyA9IHhDQ29ybmVyICsgd0M7XFxuXFxuICAgICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49IFwiK2UuaW5XaWR0aCtcIikge1xcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0WChiYXRjaCwgeFIsIHhDLCBkKTtcXG5cXG4gICAgICAgICAgICAgIC8vIElmIGEgbWluIC8gbWF4IHZhbHVlIGhhcyBhbHJlYWR5IGJlZW4gZm91bmQsIHVzZSBpdC4gSWYgbm90LFxcbiAgICAgICAgICAgICAgLy8gdXNlIHRoZSBjdXJyZW50IHZhbHVlLlxcbiAgICAgICAgICAgICAgZmxvYXQgY3Vyck1pbk1heFZhbHVlID0gbWl4KFxcbiAgICAgICAgICAgICAgICAgIHZhbHVlLCBtaW5NYXhWYWx1ZSwgbWluTWF4VmFsdWVGb3VuZCk7XFxuICAgICAgICAgICAgICBpZiAodmFsdWUgPj0gY3Vyck1pbk1heFZhbHVlKSB7XFxuICAgICAgICAgICAgICAgIG1pbk1heFZhbHVlID0gdmFsdWU7XFxuICAgICAgICAgICAgICAgIG1pbk1heFZhbHVlRm91bmQgPSAxLjA7XFxuICAgICAgICAgICAgICAgIG1pbk1heFBvc2l0aW9uID0gd1IgKiBcIitvK1wiICsgd0M7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICB9XFxuICAgICAgICAgIHNldE91dHB1dChmbG9hdChtaW5NYXhQb3NpdGlvbikpO1xcbiAgICAgICAgfVxcbiAgICAgIFwiO2Vsc2V7dmFyIHA9dCtcIihcIit0K1wiKFwiK3QrXCIobWluTWF4VmFsdWVbMF0sIG1pbk1heFZhbHVlWzFdKSwgbWluTWF4VmFsdWVbMl0pLCBtaW5NYXhWYWx1ZVszXSlcIjtcImF2Z1wiPT09dCYmKHA9XCJhdmdWYWx1ZSAvIGNvdW50XCIpO3ZhciBkPTQqTWF0aC5mbG9vcihvLzQpLGg9byU0LGY9XCJcXG4gICAgICBpZiAoXCIrbCtcIikge1xcbiAgICAgICAgYXZnVmFsdWUgKz0gZG90KHZhbHVlcywgb25lcyk7XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIG1pbk1heFZhbHVlID0gbWF4KHZhbHVlcywgbWluTWF4VmFsdWUpO1xcbiAgICAgIH1cXG4gICAgXCI7dGhpcy51c2VyQ29kZT1cIlxcbiAgICAgIGNvbnN0IGl2ZWMyIHN0cmlkZXMgPSBpdmVjMihcIithK1wiLCBcIitpK1wiKTtcXG4gICAgICBjb25zdCBpdmVjMiBwYWRzID0gaXZlYzIoXCIrcytcIiwgXCIrdStcIik7XFxuICAgICAgY29uc3QgZmxvYXQgaW5pdGlhbGl6YXRpb25WYWx1ZSA9IFwiK2MrXCI7XFxuICAgICAgY29uc3QgdmVjNCBvbmVzID0gdmVjNCgxLjAsIDEuMCwgMS4wLCAxLjApO1xcblxcbiAgICAgIGZsb2F0IGNvdW50ID0gMC4wO1xcblxcbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IHhSLCBpbnQgeEMsIGludCBkKSB7XFxuICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49IFwiK2UuaW5XaWR0aCtcIikge1xcbiAgICAgICAgICByZXR1cm4gaW5pdGlhbGl6YXRpb25WYWx1ZTtcXG4gICAgICAgIH1cXG4gICAgICAgIGNvdW50ICs9IDEuMDtcXG4gICAgICAgIHJldHVybiBnZXRYKGJhdGNoLCB4UiwgeEMsIGQpO1xcbiAgICAgIH1cXG5cXG4gICAgICB2b2lkIG1haW4oKSB7XFxuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcXG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkc1swXTtcXG4gICAgICAgIGludCBkID0gY29vcmRzWzNdO1xcblxcbiAgICAgICAgaXZlYzIgeFJDQ29ybmVyID0gY29vcmRzLnl6ICogc3RyaWRlcyAtIHBhZHM7XFxuICAgICAgICBpbnQgeFJDb3JuZXIgPSB4UkNDb3JuZXIueDtcXG4gICAgICAgIGludCB4Q0Nvcm5lciA9IHhSQ0Nvcm5lci55O1xcblxcbiAgICAgICAgLy8gbWF4L21pbiB4KD8sID8sIGQpIHRvIGdldCB5KHlSLCB5QywgZCkuXFxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZFxcbiAgICAgICAgdmVjNCBtaW5NYXhWYWx1ZSA9IHZlYzQoXCIrYytcIik7XFxuICAgICAgICBmbG9hdCBhdmdWYWx1ZSA9IDAuMDtcXG4gICAgICAgIGNvdW50ID0gMC4wO1xcblxcbiAgICAgICAgZm9yIChpbnQgd1IgPSAwOyB3UiA8IFwiK3IrXCI7IHdSKyspIHtcXG4gICAgICAgICAgaW50IHhSID0geFJDb3JuZXIgKyB3UjtcXG5cXG4gICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSBcIitlLmluSGVpZ2h0K1wiKSB7XFxuICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8IFwiK2QrXCI7IHdDICs9IDQpIHtcXG4gICAgICAgICAgICBpbnQgeEMgPSB4Q0Nvcm5lciArIHdDO1xcblxcbiAgICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMsIGQpLFxcbiAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhSLCB4QyArIDEsIGQpLFxcbiAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhSLCB4QyArIDIsIGQpLFxcbiAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhSLCB4QyArIDMsIGQpXFxuICAgICAgICAgICAgKTtcXG5cXG4gICAgICAgICAgICBcIitmK1wiXFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgaW50IHhDID0geENDb3JuZXIgKyBcIitkK1wiO1xcbiAgICAgICAgICBpZiAoXCIrKDE9PT1oKStcIikge1xcbiAgICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMsIGQpLFxcbiAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcXG4gICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXFxuICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXFxuICAgICAgICAgICAgKTtcXG5cXG4gICAgICAgICAgICBcIitmK1wiXFxuICAgICAgICAgIH0gZWxzZSBpZiAoXCIrKDI9PT1oKStcIikge1xcbiAgICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMsIGQpLFxcbiAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhSLCB4QyArIDEsIGQpLFxcbiAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcXG4gICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWVcXG4gICAgICAgICAgICApO1xcblxcbiAgICAgICAgICAgIFwiK2YrXCJcXG4gICAgICAgICAgfSBlbHNlIGlmIChcIisoMz09PWgpK1wiKSB7XFxuICAgICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxcbiAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhSLCB4QywgZCksXFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDICsgMSwgZCksXFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDICsgMiwgZCksXFxuICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXFxuICAgICAgICAgICAgKTtcXG5cXG4gICAgICAgICAgICBcIitmK1wiXFxuICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHNldE91dHB1dChcIitwK1wiKTtcXG4gICAgICB9XFxuICAgIFwifX19KCksUmVkdWNlUHJvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLHQpe3RoaXMudmFyaWFibGVOYW1lcz1bXCJ4XCJdO3ZhciBuPWUud2luZG93U2l6ZSxyPWUuYmF0Y2hTaXplLG89ZS5pblNpemUsYT1NYXRoLmNlaWwoby9uKTt0aGlzLm91dHB1dFNoYXBlPVtyLGFdO3ZhciBpPVwiMC4wXCIscz1cIlwiO1wicHJvZFwiPT09dD9pPVwiMS4wXCI6XCJtaW5cIj09PXQ/KGk9XCIxLjAgLyAwLjBcIixzPVwibWluXCIpOlwibWF4XCI9PT10JiYoaT1cIi0xLjAgLyAwLjBcIixzPVwibWF4XCIpO3ZhciB1PXQrXCIoXCIrdCtcIihcIit0K1wiKG1pbk1heFZhbHVlWzBdLCBtaW5NYXhWYWx1ZVsxXSksIG1pbk1heFZhbHVlWzJdKSwgbWluTWF4VmFsdWVbM10pXCI7XCJzdW1cIj09PXQ/dT1cInN1bVZhbHVlXCI6XCJwcm9kXCI9PT10P3U9XCJwcm9kVmFsdWVcIjpcImFsbFwiPT09dD91PVwiYWxsVmFsdWVcIjpcImFueVwiPT09dCYmKHU9XCJhbnlWYWx1ZVwiKTt2YXIgbD00Kk1hdGguZmxvb3Iobi80KSxjPW4lNCxwPVwiXFxuICAgICAgaWYgKFwiKyhcInN1bVwiPT09dCkrXCIpIHtcXG4gICAgICAgIHN1bVZhbHVlICs9IGRvdCh2YWx1ZXMsIG9uZXMpO1xcbiAgICAgIH0gZWxzZSBpZiAoXCIrKFwicHJvZFwiPT09dCkrXCIpIHtcXG4gICAgICAgIHZlYzIgdG1wID0gdmVjMih2YWx1ZXNbMF0sIHZhbHVlc1sxXSkgKiB2ZWMyKHZhbHVlc1syXSwgdmFsdWVzWzNdKTtcXG4gICAgICAgIHByb2RWYWx1ZSAqPSB0bXBbMF0gKiB0bXBbMV07XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIG1pbk1heFZhbHVlID0gXCIrcytcIih2YWx1ZXMsIG1pbk1heFZhbHVlKTtcXG4gICAgICB9XFxuICAgIFwiLGQ9XCJ2ZWM0XCI7XCJhbGxcIj09PXQ/KGk9XCIxLjBcIixwPVwiXFxuICAgICAgICBib29sIHJlZHVjZWRBbGxWYWx1ZSA9IGFsbCh2YWx1ZXMpO1xcbiAgICAgICAgZmxvYXQgZmxvYXRlZFJlZHVjZWRBbGxWYWx1ZSA9IGZsb2F0KHJlZHVjZWRBbGxWYWx1ZSk7XFxuICAgICAgICBhbGxWYWx1ZSA9IGZsb2F0KGFsbFZhbHVlID49IDEuMCAmJiBmbG9hdGVkUmVkdWNlZEFsbFZhbHVlID49IDEuMCk7XFxuICAgICAgXCIsZD1cImJ2ZWM0XCIpOlwiYW55XCI9PT10JiYoaT1cIjAuMFwiLHA9XCJcXG4gICAgICAgIGJvb2wgcmVkdWNlZEFueVZhbHVlID0gYW55KHZhbHVlcyk7XFxuICAgICAgICBmbG9hdCBmbG9hdGVkUmVkdWNlZEFueVZhbHVlID0gZmxvYXQocmVkdWNlZEFueVZhbHVlKTtcXG4gICAgICAgIGFueVZhbHVlID0gZmxvYXQoYW55VmFsdWUgPj0gMS4wIHx8IGZsb2F0ZWRSZWR1Y2VkQW55VmFsdWUgPj0gMS4wKTtcXG4gICAgICBcIixkPVwiYnZlYzRcIik7dmFyIGg9XCJcIjtvJW4+MCYmKGg9XCJcXG4gICAgICAgIGlmIChpbklkeCA8IDAgfHwgaW5JZHggPj0gXCIrbytcIikge1xcbiAgICAgICAgICByZXR1cm4gaW5pdGlhbGl6YXRpb25WYWx1ZTtcXG4gICAgICAgIH1cXG4gICAgICBcIiksdGhpcy51c2VyQ29kZT1cIlxcbiAgICAgIGNvbnN0IGZsb2F0IGluaXRpYWxpemF0aW9uVmFsdWUgPSBcIitpK1wiO1xcbiAgICAgIGNvbnN0IHZlYzQgb25lcyA9IHZlYzQoMS4wLCAxLjAsIDEuMCwgMS4wKTtcXG5cXG4gICAgICBmbG9hdCBnZXRWYWx1ZShpbnQgYmF0Y2gsIGludCBpbklkeCkge1xcbiAgICAgICAgXCIraCtcIlxcbiAgICAgICAgcmV0dXJuIGdldFgoYmF0Y2gsIGluSWR4KTtcXG4gICAgICB9XFxuXFxuICAgICAgdm9pZCBtYWluKCkge1xcbiAgICAgICAgaXZlYzIgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XFxuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XFxuICAgICAgICBpbnQgb3V0SWR4ID0gY29vcmRzWzFdO1xcbiAgICAgICAgaW50IGluT2Zmc2V0ID0gb3V0SWR4ICogXCIrbitcIjtcXG5cXG4gICAgICAgIHZlYzQgbWluTWF4VmFsdWUgPSB2ZWM0KFwiK2krXCIpO1xcbiAgICAgICAgZmxvYXQgcHJvZFZhbHVlID0gMS4wO1xcbiAgICAgICAgZmxvYXQgc3VtVmFsdWUgPSAwLjA7XFxuICAgICAgICBmbG9hdCBhbGxWYWx1ZSA9IDEuMDtcXG4gICAgICAgIGZsb2F0IGFueVZhbHVlID0gMC4wO1xcblxcbiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBcIitsK1wiOyBpICs9IDQpIHtcXG4gICAgICAgICAgaW50IGluSWR4ID0gaW5PZmZzZXQgKyBpO1xcbiAgICAgICAgICBcIitkK1wiIHZhbHVlcyA9IFwiK2QrXCIoXFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4KSxcXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAyKSxcXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAzKVxcbiAgICAgICAgICApO1xcblxcbiAgICAgICAgICBcIitwK1wiXFxuICAgICAgICB9XFxuXFxuICAgICAgICBpbnQgaW5JZHggPSBpbk9mZnNldCArIFwiK2wrXCI7XFxuICAgICAgICBpZiAoXCIrKDE9PT1jKStcIikge1xcbiAgICAgICAgICBcIitkK1wiIHZhbHVlcyA9IFwiK2QrXCIoXFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4KSxcXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlLFxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxcbiAgICAgICAgICApO1xcblxcbiAgICAgICAgICBcIitwK1wiXFxuICAgICAgICB9IGVsc2UgaWYgKFwiKygyPT09YykrXCIpIHtcXG4gICAgICAgICAgXCIrZCtcIiB2YWx1ZXMgPSBcIitkK1wiKFxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMSksXFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXFxuICAgICAgICAgICk7XFxuXFxuICAgICAgICAgIFwiK3ArXCJcXG4gICAgICAgIH0gZWxzZSBpZiAoXCIrKDM9PT1jKStcIikge1xcbiAgICAgICAgICBcIitkK1wiIHZhbHVlcyA9IFwiK2QrXCIoXFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4KSxcXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAyKSxcXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXFxuICAgICAgICAgICk7XFxuXFxuICAgICAgICAgIFwiK3ArXCJcXG4gICAgICAgIH1cXG4gICAgICAgIHNldE91dHB1dChcIit1K1wiKTtcXG4gICAgICB9XFxuICAgIFwifX0oKSxSZXNpemVCaWxpbmVhckJhY2twcm9wUHJvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLHQsbil7dGhpcy52YXJpYWJsZU5hbWVzPVtcImR5XCJdLHRoaXMub3V0cHV0U2hhcGU9W10sdGhpcy5vdXRwdXRTaGFwZT10LnNoYXBlO3ZhciByPXQuc2hhcGUsbz1yWzFdLGE9clsyXSxpPWUuc2hhcGUscz1pWzFdLHU9aVsyXSxsPVtuJiZzPjE/by0xOm8sbiYmdT4xP2EtMTphXSxjPVtuJiZzPjE/cy0xOnMsbiYmdT4xP3UtMTp1XSxwPWxbMF0vY1swXSxkPWxbMV0vY1sxXSxoPTEvcCxmPTEvZCxtPTIqTWF0aC5jZWlsKGgpKzIsZz0yKk1hdGguY2VpbChmKSsyO3RoaXMudXNlckNvZGU9XCJcXG4gICAgICB2b2lkIG1haW4oKSB7XFxuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcXG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XFxuICAgICAgICBpbnQgciA9IGNvb3Jkc1sxXTtcXG4gICAgICAgIGludCBjID0gY29vcmRzWzJdO1xcblxcbiAgICAgICAgZmxvYXQgYWNjdW11bGF0b3IgPSAwLjA7XFxuXFxuICAgICAgICBjb25zdCBmbG9hdCBoZWlnaHRTY2FsZSA9IGZsb2F0KFwiK3ArXCIpO1xcbiAgICAgICAgY29uc3QgZmxvYXQgd2lkdGhTY2FsZSA9IGZsb2F0KFwiK2QrXCIpO1xcblxcbiAgICAgICAgY29uc3QgZmxvYXQgaW52SGVpZ2h0U2NhbGUgPSBmbG9hdChcIitoK1wiKTtcXG4gICAgICAgIGNvbnN0IGZsb2F0IGludldpZHRoU2NhbGUgPSBmbG9hdChcIitmK1wiKTtcXG5cXG4gICAgICAgIGNvbnN0IGludCB3aW5IZWlnaHQgPSBpbnQoXCIrbStcIik7XFxuICAgICAgICBjb25zdCBpbnQgd2luV2lkdGggPSBpbnQoXCIrZytcIik7XFxuXFxuICAgICAgICAvLyBDb21wdXRlIGJvdW5kcyBmb3Igd2hlcmUgaW4gZHkgd2Ugd2lsbCBsb29rXFxuICAgICAgICBmbG9hdCBzdGFydFJMZXJwID0gZmxvb3IoZmxvYXQocikgKiBpbnZIZWlnaHRTY2FsZSk7XFxuICAgICAgICBpbnQgc3RhcnREeVIgPSBpbnQoc3RhcnRSTGVycCAtIGZsb2F0KHdpbkhlaWdodCAvIDIpKTtcXG5cXG4gICAgICAgIGZsb2F0IHN0YXJ0Q0xlcnAgPSBmbG9vcihmbG9hdChjKSAqIGludldpZHRoU2NhbGUpO1xcbiAgICAgICAgaW50IHN0YXJ0RHlDID0gaW50KHN0YXJ0Q0xlcnAgLSBmbG9hdCh3aW5XaWR0aCAvIDIpKTtcXG5cXG4gICAgICAgIC8vIExvb3Agb3ZlciBkeVxcbiAgICAgICAgZm9yIChpbnQgZHlST2Zmc2V0ID0gMDsgZHlST2Zmc2V0IDwgd2luSGVpZ2h0OyBkeVJPZmZzZXQrKykge1xcbiAgICAgICAgICBpbnQgZHlSID0gZHlST2Zmc2V0ICsgc3RhcnREeVI7XFxuXFxuICAgICAgICAgIC8vIEd1YXJkIGFnYWluc3QgdGhlIHdpbmRvdyBleGNlZWRpbmcgdGhlIGJvdW5kcyBvZiBkeVxcbiAgICAgICAgICBpZiAoZHlSIDwgMCB8fCBkeVIgPj0gXCIrcytcIikge1xcbiAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIGZvciAoaW50IGR5Q09mZnNldCA9IDA7IGR5Q09mZnNldCA8IHdpbldpZHRoOyBkeUNPZmZzZXQrKykge1xcbiAgICAgICAgICAgIGludCBkeUMgPSBkeUNPZmZzZXQgKyBzdGFydER5QztcXG5cXG4gICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSB3aW5kb3cgZXhjZWVkaW5nIHRoZSBib3VuZHMgb2YgZHlcXG4gICAgICAgICAgICBpZiAoZHlDIDwgMCB8fCBkeUMgPj0gXCIrdStcIikge1xcbiAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIGZsb2F0IGR4UiA9IGZsb2F0KGR5UikgKiBoZWlnaHRTY2FsZTtcXG4gICAgICAgICAgICBpbnQgdG9wRHhSSW5kZXggPSBpbnQoZmxvb3IoZHhSKSk7XFxuICAgICAgICAgICAgaW50IGJvdHRvbUR4UkluZGV4ID0gaW50KG1pbihjZWlsKGR4UiksIFwiKyhvLTEpK1wiLjApKTtcXG4gICAgICAgICAgICBmbG9hdCBkeFJMZXJwID0gZHhSIC0gZmxvYXQodG9wRHhSSW5kZXgpO1xcbiAgICAgICAgICAgIGZsb2F0IGludmVyc2VEeFJMZXJwID0gMS4wIC0gZHhSTGVycDtcXG5cXG4gICAgICAgICAgICBmbG9hdCBkeEMgPSBmbG9hdChkeUMpICogd2lkdGhTY2FsZTtcXG4gICAgICAgICAgICBpbnQgbGVmdER4Q0luZGV4ID0gaW50KGZsb29yKGR4QykpO1xcbiAgICAgICAgICAgIGludCByaWdodER4Q0luZGV4ID0gaW50KG1pbihjZWlsKGR4QyksIFwiKyhhLTEpK1wiLjApKTtcXG4gICAgICAgICAgICBmbG9hdCBkeENMZXJwID0gZHhDIC0gZmxvYXQobGVmdER4Q0luZGV4KTtcXG4gICAgICAgICAgICBmbG9hdCBpbnZlcnNlRHhDTGVycCA9IDEuMCAtIGR4Q0xlcnA7XFxuXFxuICAgICAgICAgICAgaWYgKHIgPT0gdG9wRHhSSW5kZXggJiYgYyA9PSBsZWZ0RHhDSW5kZXgpIHtcXG4gICAgICAgICAgICAgIC8vIHRvcExlZnRcXG4gICAgICAgICAgICAgIGFjY3VtdWxhdG9yICs9XFxuICAgICAgICAgICAgICAgIGdldER5KGIsIGR5UiwgZHlDLCBkKSAqIGludmVyc2VEeFJMZXJwICogaW52ZXJzZUR4Q0xlcnA7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIGlmIChyID09IHRvcER4UkluZGV4ICYmIGMgPT0gcmlnaHREeENJbmRleCkge1xcbiAgICAgICAgICAgICAgLy8gdG9wUmlnaHRcXG4gICAgICAgICAgICAgIGFjY3VtdWxhdG9yICs9IGdldER5KGIsIGR5UiwgZHlDLCBkKSAqIGludmVyc2VEeFJMZXJwICogZHhDTGVycDtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgaWYgKHIgPT0gYm90dG9tRHhSSW5kZXggJiYgYyA9PSBsZWZ0RHhDSW5kZXgpIHtcXG4gICAgICAgICAgICAgIC8vIGJvdHRvbUxlZnRcXG4gICAgICAgICAgICAgIGFjY3VtdWxhdG9yICs9IGdldER5KGIsIGR5UiwgZHlDLCBkKSAqIGR4UkxlcnAgKiBpbnZlcnNlRHhDTGVycDtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgaWYgKHIgPT0gYm90dG9tRHhSSW5kZXggJiYgYyA9PSByaWdodER4Q0luZGV4KSB7XFxuICAgICAgICAgICAgICAvLyBib3R0b21SaWdodFxcbiAgICAgICAgICAgICAgYWNjdW11bGF0b3IgKz0gZ2V0RHkoYiwgZHlSLCBkeUMsIGQpICogZHhSTGVycCAqIGR4Q0xlcnA7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICAvLyBFbmQgbG9vcCBvdmVyIGR5XFxuXFxuICAgICAgICBzZXRPdXRwdXQoYWNjdW11bGF0b3IpO1xcbiAgICAgIH1cXG4gICAgXCJ9fSgpLFJlc2l6ZUJpbGluZWFyUHJvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLHQsbixyKXt0aGlzLnZhcmlhYmxlTmFtZXM9W1wiQVwiXSx0aGlzLm91dHB1dFNoYXBlPVtdO3ZhciBvPWVbMF0sYT1lWzFdLGk9ZVsyXSxzPWVbM107dGhpcy5vdXRwdXRTaGFwZT1bbyx0LG4sc107dmFyIHU9W3ImJnQ+MT9hLTE6YSxyJiZuPjE/aS0xOmldLGw9W3ImJnQ+MT90LTE6dCxyJiZuPjE/bi0xOm5dO3RoaXMudXNlckNvZGU9XCJcXG4gICAgICBjb25zdCB2ZWMyIGVmZmVjdGl2ZUlucHV0T3Zlck91dHB1dFJhdGlvUkMgPSB2ZWMyKFxcbiAgICAgICAgICBcIit1WzBdL2xbMF0rXCIsXFxuICAgICAgICAgIFwiK3VbMV0vbFsxXStcIik7XFxuICAgICAgY29uc3QgdmVjMiBpbnB1dFNoYXBlUkMgPSB2ZWMyKFwiK2ErXCIuMCwgXCIraStcIi4wKTtcXG5cXG4gICAgICB2b2lkIG1haW4oKSB7XFxuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcXG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XFxuICAgICAgICBpdmVjMiB5UkMgPSBjb29yZHMueXo7XFxuXFxuICAgICAgICAvLyBGcmFjdGlvbmFsIHNvdXJjZSBpbmRleC5cXG4gICAgICAgIHZlYzIgc291cmNlRnJhY0luZGV4UkMgPSB2ZWMyKHlSQykgKiBlZmZlY3RpdmVJbnB1dE92ZXJPdXRwdXRSYXRpb1JDO1xcblxcbiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZm91ciBpbnRlZ2VyIGluZGljZXMuXFxuICAgICAgICBpdmVjMiBzb3VyY2VGbG9vclJDID0gaXZlYzIoc291cmNlRnJhY0luZGV4UkMpO1xcbiAgICAgICAgaXZlYzIgc291cmNlQ2VpbFJDID0gaXZlYzIoXFxuICAgICAgICAgIG1pbihpbnB1dFNoYXBlUkMgLSAxLjAsIGNlaWwoc291cmNlRnJhY0luZGV4UkMpKSk7XFxuXFxuICAgICAgICBmbG9hdCB0b3BMZWZ0ID0gZ2V0QShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUZsb29yUkMueSwgZCk7XFxuICAgICAgICBmbG9hdCBib3R0b21MZWZ0ID0gZ2V0QShiLCBzb3VyY2VDZWlsUkMueCwgc291cmNlRmxvb3JSQy55LCBkKTtcXG4gICAgICAgIGZsb2F0IHRvcFJpZ2h0ID0gZ2V0QShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUNlaWxSQy55LCBkKTtcXG4gICAgICAgIGZsb2F0IGJvdHRvbVJpZ2h0ID0gZ2V0QShiLCBzb3VyY2VDZWlsUkMueCwgc291cmNlQ2VpbFJDLnksIGQpO1xcblxcbiAgICAgICAgdmVjMiBmcmFjUkMgPSBzb3VyY2VGcmFjSW5kZXhSQyAtIHZlYzIoc291cmNlRmxvb3JSQyk7XFxuXFxuICAgICAgICBmbG9hdCB0b3AgPSB0b3BMZWZ0ICsgKHRvcFJpZ2h0IC0gdG9wTGVmdCkgKiBmcmFjUkMueTtcXG4gICAgICAgIGZsb2F0IGJvdHRvbSA9IGJvdHRvbUxlZnQgKyAoYm90dG9tUmlnaHQgLSBib3R0b21MZWZ0KSAqIGZyYWNSQy55O1xcbiAgICAgICAgZmxvYXQgbmV3VmFsdWUgPSB0b3AgKyAoYm90dG9tIC0gdG9wKSAqIGZyYWNSQy54O1xcblxcbiAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcXG4gICAgICB9XFxuICAgIFwifX0oKSxSZXNpemVOZWFyZXN0TmVpZ2JvckJhY2twcm9wUHJvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLHQsbil7dGhpcy52YXJpYWJsZU5hbWVzPVtcImR5XCJdLHRoaXMub3V0cHV0U2hhcGU9W10sdGhpcy5vdXRwdXRTaGFwZT10LnNoYXBlO3ZhciByPXQuc2hhcGUsbz1yWzFdLGE9clsyXSxpPWUuc2hhcGUscz1pWzFdLHU9aVsyXSxsPVtuJiZzPjE/by0xOm8sbiYmdT4xP2EtMTphXSxjPVtuJiZzPjE/cy0xOnMsbiYmdT4xP3UtMTp1XSxwPWxbMF0vY1swXSxkPWxbMV0vY1sxXSxoPTEvcCxmPTEvZCxtPTIqTWF0aC5jZWlsKGgpKzIsZz0yKk1hdGguY2VpbChmKSsyO3RoaXMudXNlckNvZGU9XCJcXG4gICAgICB2b2lkIG1haW4oKSB7XFxuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcXG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XFxuICAgICAgICBpbnQgciA9IGNvb3Jkc1sxXTtcXG4gICAgICAgIGludCBjID0gY29vcmRzWzJdO1xcblxcbiAgICAgICAgZmxvYXQgYWNjdW11bGF0b3IgPSAwLjA7XFxuXFxuICAgICAgICBjb25zdCBmbG9hdCBoZWlnaHRTY2FsZSA9IGZsb2F0KFwiK3ArXCIpO1xcbiAgICAgICAgY29uc3QgZmxvYXQgd2lkdGhTY2FsZSA9IGZsb2F0KFwiK2QrXCIpO1xcblxcbiAgICAgICAgY29uc3QgZmxvYXQgaW52SGVpZ2h0U2NhbGUgPSBmbG9hdChcIitoK1wiKTtcXG4gICAgICAgIGNvbnN0IGZsb2F0IGludldpZHRoU2NhbGUgPSBmbG9hdChcIitmK1wiKTtcXG5cXG4gICAgICAgIGNvbnN0IGludCB3aW5IZWlnaHQgPSBpbnQoXCIrbStcIik7XFxuICAgICAgICBjb25zdCBpbnQgd2luV2lkdGggPSBpbnQoXCIrZytcIik7XFxuXFxuICAgICAgICAvLyBDb21wdXRlIGJvdW5kcyBmb3Igd2hlcmUgaW4gZHkgd2Ugd2lsbCBsb29rXFxuICAgICAgICBmbG9hdCBzdGFydFJMZXJwID0gZmxvb3IoZmxvYXQocikgKiBpbnZIZWlnaHRTY2FsZSk7XFxuICAgICAgICBpbnQgc3RhcnREeVIgPSBpbnQoZmxvb3Ioc3RhcnRSTGVycCAtIGZsb2F0KHdpbkhlaWdodCAvIDIpKSk7XFxuXFxuICAgICAgICBmbG9hdCBzdGFydENMZXJwID0gZmxvb3IoZmxvYXQoYykgKiBpbnZXaWR0aFNjYWxlKTtcXG4gICAgICAgIGludCBzdGFydER5QyA9IGludChmbG9vcihzdGFydENMZXJwIC0gZmxvYXQod2luV2lkdGggLyAyKSkpO1xcblxcbiAgICAgICAgLy8gTG9vcCBvdmVyIGR5XFxuICAgICAgICBmb3IgKGludCBkeVJPZmZzZXQgPSAwOyBkeVJPZmZzZXQgPCB3aW5IZWlnaHQ7IGR5Uk9mZnNldCsrKSB7XFxuICAgICAgICAgIGludCBkeVIgPSBkeVJPZmZzZXQgKyBzdGFydER5UjtcXG5cXG4gICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCB0aGUgd2luZG93IGV4Y2VlZGluZyB0aGUgYm91bmRzIG9mIGR5XFxuICAgICAgICAgIGlmIChkeVIgPCAwIHx8IGR5UiA+PSBcIitzK1wiKSB7XFxuICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgZm9yIChpbnQgZHlDT2Zmc2V0ID0gMDsgZHlDT2Zmc2V0IDwgd2luV2lkdGg7IGR5Q09mZnNldCsrKSB7XFxuICAgICAgICAgICAgaW50IGR5QyA9IGR5Q09mZnNldCArIHN0YXJ0RHlDO1xcblxcbiAgICAgICAgICAgIC8vIEd1YXJkIGFnYWluc3QgdGhlIHdpbmRvdyBleGNlZWRpbmcgdGhlIGJvdW5kcyBvZiBkeVxcbiAgICAgICAgICAgIGlmIChkeUMgPCAwIHx8IGR5QyA+PSBcIit1K1wiKSB7XFxuICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgZmxvYXQgc291cmNlRnJhY1JvdyA9XFxuICAgICAgICAgICAgICBmbG9hdChcIitsWzBdK1wiKSAqXFxuICAgICAgICAgICAgICAgIChmbG9hdChkeVIpIC8gZmxvYXQoXCIrY1swXStcIikpO1xcblxcbiAgICAgICAgICAgIGZsb2F0IHNvdXJjZUZyYWNDb2wgPVxcbiAgICAgICAgICAgICAgICBmbG9hdChcIitsWzFdK1wiKSAqXFxuICAgICAgICAgICAgICAgICAgKGZsb2F0KGR5QykgLyBmbG9hdChcIitjWzFdK1wiKSk7XFxuXFxuICAgICAgICAgICAgaW50IHNvdXJjZU5lYXJlc3RSb3cgPSBpbnQobWluKFxcbiAgICAgICAgICAgICAgICBmbG9hdChpbnQoXCIrbytcIikgLSAxKSxcXG4gICAgICAgICAgICAgICAgXCIrbitcIiA/IGZsb2F0KHJvdW5kKHNvdXJjZUZyYWNSb3cpKSA6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KGZsb29yKHNvdXJjZUZyYWNSb3cpKSkpO1xcblxcbiAgICAgICAgICAgIGludCBzb3VyY2VOZWFyZXN0Q29sID0gaW50KG1pbihcXG4gICAgICAgICAgICAgICAgZmxvYXQoaW50KFwiK2ErXCIpIC0gMSksXFxuICAgICAgICAgICAgICAgIFwiK24rXCIgPyBmbG9hdChyb3VuZChzb3VyY2VGcmFjQ29sKSkgOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdChmbG9vcihzb3VyY2VGcmFjQ29sKSkpKTtcXG5cXG4gICAgICAgICAgICBpZiAociA9PSBzb3VyY2VOZWFyZXN0Um93ICYmIGMgPT0gc291cmNlTmVhcmVzdENvbCkge1xcbiAgICAgICAgICAgICAgYWNjdW11bGF0b3IgKz0gZ2V0RHkoYiwgZHlSLCBkeUMsIGQpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgLy8gRW5kIGxvb3Agb3ZlciBkeVxcblxcbiAgICAgICAgc2V0T3V0cHV0KGFjY3VtdWxhdG9yKTtcXG4gICAgICB9XFxuICAgIFwifX0oKSxSZXNpemVOZWFyZXN0TmVpZ2hib3JQcm9ncmFtPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMudmFyaWFibGVOYW1lcz1bXCJBXCJdLHRoaXMub3V0cHV0U2hhcGU9W107dmFyIG89ZVswXSxhPWVbMV0saT1lWzJdLHM9ZVszXTt0aGlzLm91dHB1dFNoYXBlPVtvLHQsbixzXTt2YXIgdT1bciYmdD4xP2EtMTphLHImJm4+MT9pLTE6aV0sbD1bciYmdD4xP3QtMTp0LHImJm4+MT9uLTE6bl0sYz1yP1wiMC41XCI6XCIwLjBcIjt0aGlzLnVzZXJDb2RlPVwiXFxuICAgICAgY29uc3QgdmVjMiBlZmZlY3RpdmVJbnB1dE92ZXJPdXRwdXRSYXRpb1JDID0gdmVjMihcXG4gICAgICAgICAgXCIrdVswXS9sWzBdK1wiLFxcbiAgICAgICAgICBcIit1WzFdL2xbMV0rXCIpO1xcbiAgICAgIGNvbnN0IHZlYzIgaW5wdXRTaGFwZVJDID0gdmVjMihcIithK1wiLjAsIFwiK2krXCIuMCk7XFxuXFxuICAgICAgdm9pZCBtYWluKCkge1xcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XFxuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcXG4gICAgICAgIGludCBkID0gY29vcmRzWzNdO1xcbiAgICAgICAgaXZlYzIgeVJDID0gY29vcmRzLnl6O1xcblxcbiAgICAgICAgLy8gRnJhY3Rpb25hbCBzb3VyY2UgaW5kZXguXFxuICAgICAgICB2ZWMyIHNvdXJjZUZyYWNJbmRleFJDID0gdmVjMih5UkMpICogZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQztcXG5cXG4gICAgICAgIC8vIENvbXB1dGUgdGhlIGNvb3JkaW5hdG9ycyBvZiBuZWFyZXN0IG5laWdoYm9yIHBvaW50LlxcbiAgICAgICAgaXZlYzIgc291cmNlTmVhcmVzdFJDID0gaXZlYzIoXFxuICAgICAgICAgIG1pbihpbnB1dFNoYXBlUkMgLSAxLjAsIGZsb29yKHNvdXJjZUZyYWNJbmRleFJDICsgXCIrYytcIikpKTtcXG5cXG4gICAgICAgIGZsb2F0IG5ld1ZhbHVlID0gZ2V0QShiLCBzb3VyY2VOZWFyZXN0UkMueCwgc291cmNlTmVhcmVzdFJDLnksIGQpO1xcblxcbiAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcXG4gICAgICB9XFxuICAgIFwifX0oKSxSZXZlcnNlUHJvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLHQpe3RoaXMudmFyaWFibGVOYW1lcz1bXCJ4XCJdO3ZhciBuPWUubGVuZ3RoO2lmKG4+NCl0aHJvdyBuZXcgRXJyb3IoXCJXZWJHTCBiYWNrZW5kOiBSZXZlcnNlIG9mIHJhbmstXCIrbitcIiB0ZW5zb3IgaXMgbm90IHlldCBzdXBwb3J0ZWRcIik7aWYodGhpcy5vdXRwdXRTaGFwZT1lLDEhPT1uKXt2YXIgcj1lLm1hcChmdW5jdGlvbihuLHIpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4tMSE9PXQuaW5kZXhPZihuKSYmMSE9PWVbbl0/ZVtuXStcIiAtIGNvb3Jkc1tcIituK1wiXSAtIDFcIjpcImNvb3Jkc1tcIituK1wiXVwifShyKX0pLmpvaW4oXCIsXCIpLG89Z2V0Q29vcmRzRGF0YVR5cGUobik7dGhpcy51c2VyQ29kZT1cIlxcbiAgICAgIHZvaWQgbWFpbigpIHtcXG4gICAgICAgIFwiK28rXCIgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XFxuICAgICAgICBzZXRPdXRwdXQoZ2V0WChcIityK1wiKSk7XFxuICAgICAgfVxcbiAgICBcIn1lbHNlIHRoaXMudXNlckNvZGU9XCJcXG4gICAgICAgIHZvaWQgbWFpbigpIHtcXG4gICAgICAgICAgaW50IGNvb3JkID0gZ2V0T3V0cHV0Q29vcmRzKCk7XFxuICAgICAgICAgIHNldE91dHB1dChnZXRYKFwiK2VbMF0rXCIgLSBjb29yZCAtIDEpKTtcXG4gICAgICAgIH1cXG4gICAgICBcIn19KCksU2NhdHRlck5EUHJvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLHQsbixyKXt0aGlzLnVwZGF0ZVNpemU9ZSx0aGlzLnNsaWNlRGltPXQsdGhpcy5zdHJpZGVzPW4sdGhpcy52YXJpYWJsZU5hbWVzPVtcInVwZGF0ZXNcIixcImluZGljZXNcIl0sdGhpcy5vdXRwdXRTaGFwZT1yO3ZhciBvPWdldENvb3Jkc0RhdGFUeXBlKG4ubGVuZ3RoKSxhPWdldENvb3Jkc0RhdGFUeXBlKHIubGVuZ3RoKSxpPXRoaXMuc2xpY2VEaW0+MT9cInN0cmlkZXNbal1cIjpcInN0cmlkZXNcIjt0aGlzLnVzZXJDb2RlPVwiXFxuICAgICAgICBcIitvK1wiIHN0cmlkZXMgPSBcIitvK1wiKFwiK3RoaXMuc3RyaWRlcytcIik7XFxuXFxuICAgICAgICB2b2lkIG1haW4oKSB7XFxuICAgICAgICAgIFwiK2ErXCIgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XFxuICAgICAgICAgIGZsb2F0IHN1bSA9IDAuMDtcXG4gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBcIit0aGlzLnVwZGF0ZVNpemUrXCI7IGkrKykge1xcbiAgICAgICAgICAgIGludCBmbGF0dGVuSW5kZXggPSAwO1xcbiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgXCIrdGhpcy5zbGljZURpbStcIjsgaisrKSB7XFxuICAgICAgICAgICAgICBpbnQgaW5kZXggPSByb3VuZChnZXRJbmRpY2VzKGksIGopKTtcXG4gICAgICAgICAgICAgIGZsYXR0ZW5JbmRleCArPSBpbmRleCAqIFwiK2krXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChmbGF0dGVuSW5kZXggPT0gY29vcmRzWzBdKSB7XFxuICAgICAgICAgICAgICBzdW0gKz0gZ2V0VXBkYXRlcyhpLCBjb29yZHNbMV0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfVxcbiAgICAgICAgICBzZXRPdXRwdXQoc3VtKTtcXG4gICAgICAgIH1cXG4gICAgICBcIn19KCksU2VnbWVudE9wUHJvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLHQpe3RoaXMudmFyaWFibGVOYW1lcz1bXCJ4XCIsXCJzZWdtZW50SWRzXCJdO3ZhciBuPWUud2luZG93U2l6ZSxyPWUuYmF0Y2hTaXplLG89ZS5pblNpemUsYT1lLm51bVNlZ21lbnRzLGk9YSpNYXRoLmNlaWwoby9uKTt0aGlzLm91dHB1dFNoYXBlPVtyLGldO3ZhciBzPTQqTWF0aC5mbG9vcihuLzQpLHU9biU0LGw9XCJcXG4gICAgICAgIHN1bVZhbHVlICs9IGRvdCh2YWx1ZXMsIGZpbHRlcik7XFxuICAgIFwiLGM9XCJcIjtvJW4+MCYmKGM9XCJcXG4gICAgICAgIGlmIChpbklkeCA8IDAgfHwgaW5JZHggPj0gXCIrbytcIikge1xcbiAgICAgICAgICByZXR1cm4gaW5pdGlhbGl6YXRpb25WYWx1ZTtcXG4gICAgICAgIH1cXG4gICAgICBcIik7dmFyIHA9XCJcIjtvJW4+MCYmKHA9XCJcXG4gICAgICAgIGlmIChpbklkeCA8IDAgfHwgaW5JZHggPj0gXCIrbytcIikge1xcbiAgICAgICAgICByZXR1cm4gLTEuMDtcXG4gICAgICAgIH1cXG4gICAgICBcIiksdGhpcy51c2VyQ29kZT1cIlxcbiAgICAgIGNvbnN0IGZsb2F0IGluaXRpYWxpemF0aW9uVmFsdWUgPSAwLjA7XFxuXFxuICAgICAgZmxvYXQgZ2V0VmFsdWUoaW50IGJhdGNoLCBpbnQgaW5JZHgpIHtcXG4gICAgICAgIFwiK2MrXCJcXG4gICAgICAgIHJldHVybiBnZXRYKGJhdGNoLCBpbklkeCk7XFxuICAgICAgfVxcblxcbiAgICAgIGZsb2F0IGdldFNlZ21lbnRJZEF0SW5kZXgoaW50IGluSWR4KSB7XFxuICAgICAgICBcIitwK1wiXFxuICAgICAgICByZXR1cm4gZ2V0U2VnbWVudElkcyhpbklkeCk7XFxuICAgICAgfVxcblxcbiAgICAgIHZvaWQgbWFpbigpIHtcXG4gICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xcbiAgICAgICAgaW50IG91dElkeCA9IGNvb3Jkc1sxXTtcXG4gICAgICAgIGludCBpbk9mZnNldCA9IGludChmbG9vcihmbG9hdChvdXRJZHgpIC8gZmxvYXQoXFxuICAgICAgICAgIFwiK2ErXCIpKSAqIGZsb2F0KFwiK24rXCIpKTtcXG4gICAgICAgIGludCBjdXJyZW50U2VnID0gaW50KG1vZChmbG9hdChvdXRJZHgpLCBmbG9hdChcIithK1wiKSkpO1xcblxcbiAgICAgICAgZmxvYXQgc3VtVmFsdWUgPSAwLjA7XFxuXFxuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFwiK3MrXCI7IGkgKz0gNCkge1xcbiAgICAgICAgICBpbnQgaW5JZHggPSBpbk9mZnNldCArIGk7XFxuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHgpLFxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDEpLFxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDIpLFxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDMpXFxuICAgICAgICAgICk7XFxuXFxuICAgICAgICAgIHZlYzQgZmlsdGVyID0gdmVjNChcXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCkpID09IGN1cnJlbnRTZWcgPyAxIDogMCxcXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCArIDEpKSA9PSBjdXJyZW50U2VnID8gMSA6IDAsXFxuICAgICAgICAgICAgaW50KGdldFNlZ21lbnRJZEF0SW5kZXgoaW5JZHggKyAyKSkgPT0gY3VycmVudFNlZyA/IDEgOiAwLFxcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4ICsgMykpID09IGN1cnJlbnRTZWcgPyAxIDogMFxcbiAgICAgICAgICApO1xcblxcbiAgICAgICAgICBcIitsK1wiXFxuICAgICAgICB9XFxuXFxuICAgICAgICBpbnQgaW5JZHggPSBpbk9mZnNldCArIFwiK3MrXCI7XFxuICAgICAgICBpZiAoXCIrKDE9PT11KStcIikge1xcbiAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4KSxcXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlLFxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxcbiAgICAgICAgICApO1xcblxcbiAgICAgICAgICBpbnQgaW5JZHhTZWcgPSBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCkpO1xcblxcbiAgICAgICAgICB2ZWM0IGZpbHRlciA9IHZlYzQoXFxuICAgICAgICAgICAgaW50KGdldFNlZ21lbnRJZEF0SW5kZXgoaW5JZHgpKSA9PSBjdXJyZW50U2VnID8gMSA6IDAsXFxuICAgICAgICAgICAgMCxcXG4gICAgICAgICAgICAwLFxcbiAgICAgICAgICAgIDBcXG4gICAgICAgICAgKTtcXG5cXG4gICAgICAgICAgXCIrbCtcIlxcbiAgICAgICAgfSBlbHNlIGlmIChcIisoMj09PXUpK1wiKSB7XFxuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHgpLFxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDEpLFxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxcbiAgICAgICAgICApO1xcblxcbiAgICAgICAgICB2ZWM0IGZpbHRlciA9IHZlYzQoXFxuICAgICAgICAgICAgaW50KGdldFNlZ21lbnRJZEF0SW5kZXgoaW5JZHgpKSA9PSBjdXJyZW50U2VnID8gMSA6IDAsXFxuICAgICAgICAgICAgaW50KGdldFNlZ21lbnRJZEF0SW5kZXgoaW5JZHggKyAxKSkgPT0gY3VycmVudFNlZyA/IDEgOiAwLFxcbiAgICAgICAgICAgICAgMCxcXG4gICAgICAgICAgICAgIDBcXG4gICAgICAgICAgKTtcXG5cXG4gICAgICAgICAgXCIrbCtcIlxcbiAgICAgICAgfSBlbHNlIGlmIChcIisoMz09PXUpK1wiKSB7XFxuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHgpLFxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDEpLFxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDIpLFxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWVcXG4gICAgICAgICAgKTtcXG5cXG4gICAgICAgICAgdmVjNCBmaWx0ZXIgPSB2ZWM0KFxcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4KSkgPT0gY3VycmVudFNlZyA/IDEgOiAwLFxcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4ICsgMSkpID09IGN1cnJlbnRTZWcgPyAxIDogMCxcXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCArIDIpKSA9PSBjdXJyZW50U2VnID8gMSA6IDAsXFxuICAgICAgICAgICAgMFxcbiAgICAgICAgICApO1xcblxcbiAgICAgICAgICBcIitsK1wiXFxuICAgICAgICB9XFxuICAgICAgICBzZXRPdXRwdXQoc3VtVmFsdWUpO1xcbiAgICAgIH1cXG4gICAgXCJ9fSgpLFNlbGVjdFByb2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe3ZhciByLG87aWYodGhpcy52YXJpYWJsZU5hbWVzPVtcImNcIixcImFcIixcImJcIl0sdGhpcy5vdXRwdXRTaGFwZT10LG4+NCl0aHJvdyBFcnJvcihcIldoZXJlIGZvciByYW5rIFwiK24rXCIgaXMgbm90IHlldCBzdXBwb3J0ZWRcIik7aWYoMT09PW4pbz1cInJlc1JDXCIscj1cInJlc1JDXCI7ZWxzZXtmb3IodmFyIGE9W1wicmVzUkMueFwiLFwicmVzUkMueVwiLFwicmVzUkMuelwiLFwicmVzUkMud1wiXSxpPVtdLHM9W10sdT0wO3U8dC5sZW5ndGg7dSsrKXMucHVzaChcIlwiK2FbdV0pLHU8ZSYmaS5wdXNoKFwiXCIrYVt1XSk7cj1pLmpvaW4oKSxvPXMuam9pbigpfXZhciBsPWdldENvb3Jkc0RhdGFUeXBlKG4pO3RoaXMudXNlckNvZGU9XCJcXG4gICAgICB2b2lkIG1haW4oKSB7XFxuICAgICAgICBcIitsK1wiIHJlc1JDID0gZ2V0T3V0cHV0Q29vcmRzKCk7XFxuICAgICAgICBmbG9hdCBjVmFsID0gZ2V0QyhcIityK1wiKTtcXG4gICAgICAgIGlmIChjVmFsID49IDEuMCkge1xcbiAgICAgICAgICBzZXRPdXRwdXQoZ2V0QShcIitvK1wiKSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICBzZXRPdXRwdXQoZ2V0QihcIitvK1wiKSk7XFxuICAgICAgICB9XFxuICAgICAgfVxcbiAgICBcIn19KCksU2xpY2VQcm9ncmFtPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0aGlzLnZhcmlhYmxlTmFtZXM9W1wic291cmNlXCJdLHRoaXMub3V0cHV0U2hhcGU9ZSx0aGlzLnJhbms9ZS5sZW5ndGg7dmFyIHQ9Z2V0Q29vcmRzRGF0YVR5cGUodGhpcy5yYW5rKSxuPWdldENvb3JkcyQxKHRoaXMucmFuayk7dGhpcy51c2VyQ29kZT1cIlxcbiAgICAgIHVuaWZvcm0gXCIrdCtcIiBzdGFydDtcXG5cXG4gICAgICB2b2lkIG1haW4oKSB7XFxuICAgICAgICBcIit0K1wiIHNvdXJjZUxvYyA9IHN0YXJ0ICsgZ2V0T3V0cHV0Q29vcmRzKCk7XFxuICAgICAgICBzZXRPdXRwdXQoZ2V0U291cmNlKFwiK24rXCIpKTtcXG4gICAgICB9XFxuICAgIFwifXJldHVybiBlLnByb3RvdHlwZS5nZXRDdXN0b21TZXR1cEZ1bmM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZihlLmxlbmd0aCE9PXRoaXMucmFuayl0aHJvdyBFcnJvcihcIlRoZSByYW5rIChcIit0aGlzLnJhbmsrXCIpIG9mIHRoZSBwcm9ncmFtIG11c3QgbWF0Y2ggdGhlIGxlbmd0aCBvZiBzdGFydCAoXCIrZS5sZW5ndGgrXCIpXCIpO3JldHVybiBmdW5jdGlvbihuLHIpe2lmKG51bGwhPXQuc3RhcnRMb2N8fCh0LnN0YXJ0TG9jPW4uZ2V0VW5pZm9ybUxvY2F0aW9uTm9UaHJvdyhyLFwic3RhcnRcIiksbnVsbCE9dC5zdGFydExvYykpaWYoMT09PXQucmFuayluLmdsLnVuaWZvcm0xaSh0LnN0YXJ0TG9jLGVbMF0pO2Vsc2UgaWYoMj09PXQucmFuayluLmdsLnVuaWZvcm0yaSh0LnN0YXJ0TG9jLGVbMF0sZVsxXSk7ZWxzZSBpZigzPT09dC5yYW5rKW4uZ2wudW5pZm9ybTNpKHQuc3RhcnRMb2MsZVswXSxlWzFdLGVbMl0pO2Vsc2V7aWYoNCE9PXQucmFuayl0aHJvdyBFcnJvcihcIlNsaWNpbmcgZm9yIHJhbmsgXCIrdC5yYW5rK1wiIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCIpO24uZ2wudW5pZm9ybTRpKHQuc3RhcnRMb2MsZVswXSxlWzFdLGVbMl0sZVszXSl9fX0sZX0oKTtmdW5jdGlvbiBnZXRDb29yZHMkMShlKXtpZigxPT09ZSlyZXR1cm5cInNvdXJjZUxvY1wiO2lmKDI9PT1lKXJldHVyblwic291cmNlTG9jLngsIHNvdXJjZUxvYy55XCI7aWYoMz09PWUpcmV0dXJuXCJzb3VyY2VMb2MueCwgc291cmNlTG9jLnksIHNvdXJjZUxvYy56XCI7aWYoND09PWUpcmV0dXJuXCJzb3VyY2VMb2MueCwgc291cmNlTG9jLnksIHNvdXJjZUxvYy56LCBzb3VyY2VMb2Mud1wiO3Rocm93IEVycm9yKFwiU2xpY2luZyBmb3IgcmFuayBcIitlK1wiIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCIpfXZhciBTdHJpZGVkU2xpY2VQcm9ncmFtPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMudmFyaWFibGVOYW1lcz1bXCJ4XCJdO3ZhciBvPW4uZmlsdGVyKGZ1bmN0aW9uKGUsdCl7cmV0dXJuLTE9PT1yLmluZGV4T2YodCl9KTt0aGlzLm91dHB1dFNoYXBlPW87dmFyIGE9bi5sZW5ndGgsaT1nZXRDb29yZHNEYXRhVHlwZShuLmxlbmd0aCkscz1nZXRDb29yZHNEYXRhVHlwZShvLmxlbmd0aCksdT1cIlwiO2lmKDE9PT1hKXU9XCJjb29yZHMgKiBzdHJpZGVzICsgYmVnaW5cIjtlbHNle3ZhciBsPTA7dT1uLm1hcChmdW5jdGlvbihlLHQpe3JldHVybi0xPT09ci5pbmRleE9mKHQpPyhsKyssMT09PW8ubGVuZ3RoP1wiY29vcmRzICogc3RyaWRlc1tcIit0K1wiXSArIGJlZ2luW1wiK3QrXCJdXCI6XCJjb29yZHNbXCIrKGwtMSkrXCJdICogc3RyaWRlc1tcIit0K1wiXSArIGJlZ2luW1wiK3QrXCJdXCIpOlwiYmVnaW5bXCIrdCtcIl1cIn0pLmpvaW4oXCIsXCIpfXRoaXMudXNlckNvZGU9XCJcXG4gICAgICBcIitpK1wiIGJlZ2luID0gXCIraStcIihcIitlK1wiKTtcXG4gICAgICBcIitpK1wiIHN0cmlkZXMgPSBcIitpK1wiKFwiK3QrXCIpO1xcblxcbiAgICAgIHZvaWQgbWFpbigpIHtcXG4gICAgICAgIFwiK3MrXCIgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XFxuICAgICAgICBzZXRPdXRwdXQoZ2V0WChcIit1K1wiKSk7XFxuICAgICAgfVxcbiAgICBcIn19KCksVGV4dHVyZU1hbmFnZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RoaXMuZ3BncHU9ZSx0aGlzLm51bVVzZWRUZXh0dXJlcz0wLHRoaXMubnVtRnJlZVRleHR1cmVzPTAsdGhpcy5mcmVlVGV4dHVyZXM9e30sdGhpcy5sb2dFbmFibGVkPSExLHRoaXMudXNlZFRleHR1cmVzPXt9fXJldHVybiBlLnByb3RvdHlwZS5hY3F1aXJlVGV4dHVyZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9Z2V0UGh5c2ljYWxGcm9tTG9naWNhbFRleHR1cmVUeXBlKHQpLG89Z2V0S2V5RnJvbVRleHR1cmVTaGFwZShlLHIpO2lmKG8gaW4gdGhpcy5mcmVlVGV4dHVyZXN8fCh0aGlzLmZyZWVUZXh0dXJlc1tvXT1bXSksbyBpbiB0aGlzLnVzZWRUZXh0dXJlc3x8KHRoaXMudXNlZFRleHR1cmVzW29dPVtdKSx0aGlzLmZyZWVUZXh0dXJlc1tvXS5sZW5ndGg+MCl7dGhpcy5udW1GcmVlVGV4dHVyZXMtLSx0aGlzLm51bVVzZWRUZXh0dXJlcysrLHRoaXMubG9nKCk7dmFyIGE9dGhpcy5mcmVlVGV4dHVyZXNbb10uc2hpZnQoKTtyZXR1cm4gdGhpcy51c2VkVGV4dHVyZXNbb10ucHVzaChhKSxhfXJldHVybiB0aGlzLm51bVVzZWRUZXh0dXJlcysrLHRoaXMubG9nKCkscj09PVBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzJYMl9GTE9BVDMyP249dGhpcy5ncGdwdS5jcmVhdGVQYWNrZWRNYXRyaXhUZXh0dXJlKGVbMF0sZVsxXSk6cj09PVBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzJYMl9GTE9BVDE2P249dGhpcy5ncGdwdS5jcmVhdGVGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZShlWzBdLGVbMV0pOnI9PT1QaHlzaWNhbFRleHR1cmVUeXBlLlVOUEFDS0VEX0ZMT0FUMzI/bj10aGlzLmdwZ3B1LmNyZWF0ZUZsb2F0MzJNYXRyaXhUZXh0dXJlKGVbMF0sZVsxXSk6cj09PVBoeXNpY2FsVGV4dHVyZVR5cGUuVU5QQUNLRURfRkxPQVQxNj9uPXRoaXMuZ3BncHUuY3JlYXRlRmxvYXQxNk1hdHJpeFRleHR1cmUoZVswXSxlWzFdKTpyPT09UGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfNFgxX1VOU0lHTkVEX0JZVEUmJihuPXRoaXMuZ3BncHUuY3JlYXRlVW5zaWduZWRCeXRlc01hdHJpeFRleHR1cmUoZVswXSxlWzFdKSksdGhpcy51c2VkVGV4dHVyZXNbb10ucHVzaChuKSxufSxlLnByb3RvdHlwZS5yZWxlYXNlVGV4dHVyZT1mdW5jdGlvbihlLHQsbil7aWYobnVsbCE9dGhpcy5mcmVlVGV4dHVyZXMpe3ZhciByPWdldEtleUZyb21UZXh0dXJlU2hhcGUodCxnZXRQaHlzaWNhbEZyb21Mb2dpY2FsVGV4dHVyZVR5cGUobikpO3IgaW4gdGhpcy5mcmVlVGV4dHVyZXN8fCh0aGlzLmZyZWVUZXh0dXJlc1tyXT1bXSksdGhpcy5mcmVlVGV4dHVyZXNbcl0ucHVzaChlKSx0aGlzLm51bUZyZWVUZXh0dXJlcysrLHRoaXMubnVtVXNlZFRleHR1cmVzLS07dmFyIG89dGhpcy51c2VkVGV4dHVyZXNbcl0sYT1vLmluZGV4T2YoZSk7aWYoYTwwKXRocm93IG5ldyBFcnJvcihcIkNhbm5vdCByZWxlYXNlIGEgdGV4dHVyZSB0aGF0IHdhcyBuZXZlciBwcm92aWRlZCBieSB0aGlzIHRleHR1cmUgbWFuYWdlclwiKTtvLnNwbGljZShhLDEpLHRoaXMubG9nKCl9fSxlLnByb3RvdHlwZS5sb2c9ZnVuY3Rpb24oKXtpZih0aGlzLmxvZ0VuYWJsZWQpe3ZhciBlPXRoaXMubnVtRnJlZVRleHR1cmVzK3RoaXMubnVtVXNlZFRleHR1cmVzO2NvbnNvbGUubG9nKFwiRnJlZS9Vc2VkXCIsdGhpcy5udW1GcmVlVGV4dHVyZXMrXCIgLyBcIit0aGlzLm51bVVzZWRUZXh0dXJlcyxcIihcIitlK1wiKVwiKX19LGUucHJvdG90eXBlLmdldE51bVVzZWRUZXh0dXJlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm51bVVzZWRUZXh0dXJlc30sZS5wcm90b3R5cGUuZ2V0TnVtRnJlZVRleHR1cmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubnVtRnJlZVRleHR1cmVzfSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZihudWxsIT10aGlzLmZyZWVUZXh0dXJlcyl7Zm9yKHZhciB0IGluIHRoaXMuZnJlZVRleHR1cmVzKXRoaXMuZnJlZVRleHR1cmVzW3RdLmZvckVhY2goZnVuY3Rpb24odCl7ZS5ncGdwdS5kZWxldGVNYXRyaXhUZXh0dXJlKHQpfSk7Zm9yKHZhciB0IGluIHRoaXMudXNlZFRleHR1cmVzKXRoaXMudXNlZFRleHR1cmVzW3RdLmZvckVhY2goZnVuY3Rpb24odCl7ZS5ncGdwdS5kZWxldGVNYXRyaXhUZXh0dXJlKHQpfSk7dGhpcy5mcmVlVGV4dHVyZXM9bnVsbCx0aGlzLnVzZWRUZXh0dXJlcz1udWxsLHRoaXMubnVtVXNlZFRleHR1cmVzPTAsdGhpcy5udW1GcmVlVGV4dHVyZXM9MH19LGV9KCk7ZnVuY3Rpb24gZ2V0UGh5c2ljYWxGcm9tTG9naWNhbFRleHR1cmVUeXBlKGUpe2lmKGU9PT1UZXh0dXJlVXNhZ2UuRE9XTkxPQUR8fGU9PT1UZXh0dXJlVXNhZ2UuUElYRUxTKXJldHVybiBQaHlzaWNhbFRleHR1cmVUeXBlLlBBQ0tFRF80WDFfVU5TSUdORURfQllURTtpZihlPT09VGV4dHVyZVVzYWdlLlVQTE9BRClyZXR1cm4gUGh5c2ljYWxUZXh0dXJlVHlwZS5VTlBBQ0tFRF9GTE9BVDMyO2lmKGU9PT1UZXh0dXJlVXNhZ2UuUkVOREVSKXJldHVybiBFTlYuZ2V0KFwiV0VCR0xfUkVOREVSX0ZMT0FUMzJfRU5BQkxFRFwiKT9QaHlzaWNhbFRleHR1cmVUeXBlLlVOUEFDS0VEX0ZMT0FUMzI6UGh5c2ljYWxUZXh0dXJlVHlwZS5VTlBBQ0tFRF9GTE9BVDE2O2lmKGU9PT1UZXh0dXJlVXNhZ2UuUEFDSylyZXR1cm4gRU5WLmdldChcIldFQkdMX1JFTkRFUl9GTE9BVDMyX0VOQUJMRURcIik/UGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfMlgyX0ZMT0FUMzI6UGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfMlgyX0ZMT0FUMTY7dGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBsb2dpY2FsIHRleHR1cmUgdHlwZSBcIitlKX1mdW5jdGlvbiBnZXRLZXlGcm9tVGV4dHVyZVNoYXBlKGUsdCl7cmV0dXJuIGVbMF0rXCJfXCIrZVsxXStcIl9cIit0fXZhciBUaWxlUHJvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLHQpe3RoaXMudmFyaWFibGVOYW1lcz1bXCJBXCJdO2Zvcih2YXIgbj1uZXcgQXJyYXkoZS5sZW5ndGgpLHI9MDtyPG4ubGVuZ3RoO3IrKyluW3JdPWVbcl0qdFtyXTt0aGlzLm91dHB1dFNoYXBlPW4sdGhpcy5yYW5rPW4ubGVuZ3RoO3ZhciBvPWdldENvb3Jkc0RhdGFUeXBlKHRoaXMucmFuayksYT1nZXRTb3VyY2VDb29yZHMkMShlKTt0aGlzLnVzZXJDb2RlPVwiXFxuICAgICAgdm9pZCBtYWluKCkge1xcbiAgICAgICAgXCIrbytcIiByZXNSQyA9IGdldE91dHB1dENvb3JkcygpO1xcbiAgICAgICAgc2V0T3V0cHV0KGdldEEoXCIrYStcIikpO1xcbiAgICAgIH1cXG4gICAgXCJ9fSgpO2Z1bmN0aW9uIGdldFNvdXJjZUNvb3JkcyQxKGUpe3ZhciB0PWUubGVuZ3RoO2lmKHQ+NSl0aHJvdyBFcnJvcihcIlRpbGUgZm9yIHJhbmsgXCIrdCtcIiBpcyBub3QgeWV0IHN1cHBvcnRlZFwiKTtpZigxPT09dClyZXR1cm5cImltb2QocmVzUkMsIFwiK2VbMF0rXCIpXCI7Zm9yKHZhciBuPVtcInJlc1JDLnhcIixcInJlc1JDLnlcIixcInJlc1JDLnpcIixcInJlc1JDLndcIixcInJlc1JDLnVcIl0scj1bXSxvPTA7bzxlLmxlbmd0aDtvKyspci5wdXNoKFwiaW1vZChcIituW29dK1wiLCBcIitlW29dK1wiKVwiKTtyZXR1cm4gci5qb2luKCl9dmFyIFRyYW5zcG9zZVByb2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt0aGlzLnZhcmlhYmxlTmFtZXM9W1wiQVwiXTtmb3IodmFyIG49bmV3IEFycmF5KGUubGVuZ3RoKSxyPTA7cjxuLmxlbmd0aDtyKyspbltyXT1lW3Rbcl1dO3RoaXMub3V0cHV0U2hhcGU9bix0aGlzLnJhbms9bi5sZW5ndGg7dmFyIG89Z2V0Q29vcmRzRGF0YVR5cGUodGhpcy5yYW5rKSxhPWdldFN3aXRjaGVkQ29vcmRzKHQpO3RoaXMudXNlckNvZGU9XCJcXG4gICAgdm9pZCBtYWluKCkge1xcbiAgICAgIFwiK28rXCIgcmVzUkMgPSBnZXRPdXRwdXRDb29yZHMoKTtcXG4gICAgICBzZXRPdXRwdXQoZ2V0QShcIithK1wiKSk7XFxuICAgIH1cXG4gICAgXCJ9fSgpO2Z1bmN0aW9uIGdldFN3aXRjaGVkQ29vcmRzKGUpe3ZhciB0PWUubGVuZ3RoO2lmKHQ+Nil0aHJvdyBFcnJvcihcIlRyYW5zcG9zZSBmb3IgcmFuayBcIit0K1wiIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCIpO2Zvcih2YXIgbj1bXCJyZXNSQy54XCIsXCJyZXNSQy55XCIsXCJyZXNSQy56XCIsXCJyZXNSQy53XCIsXCJyZXNSQy51XCIsXCJyZXNSQy52XCJdLHI9bmV3IEFycmF5KHQpLG89MDtvPGUubGVuZ3RoO28rKylyW2Vbb11dPW5bb107cmV0dXJuIHIuam9pbigpfXZhciBFUkZfUD0uMzI3NTkxMSxFUkZfQTE9LjI1NDgyOTU5MixFUkZfQTI9LS4yODQ0OTY3MzYsRVJGX0EzPTEuNDIxNDEzNzQxLEVSRl9BND0tMS40NTMxNTIwMjcsRVJGX0E1PTEuMDYxNDA1NDI5LFNFTFVfU0NBTEVBTFBIQT0xLjc1ODA5OTM0MDg0NzM3NjgsU0VMVV9TQ0FMRT0xLjA1MDcwMDk4NzM1NTQ4MDUsVW5hcnlPcFByb2dyYW09ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7dGhpcy52YXJpYWJsZU5hbWVzPVtcIkFcIl0sdGhpcy5vdXRwdXRTaGFwZT1lLHRoaXMudXNlckNvZGU9XCJcXG4gICAgICB1bmlmb3JtIGZsb2F0IE5BTjtcXG4gICAgICBmbG9hdCB1bmFyeU9wZXJhdGlvbihmbG9hdCB4KSB7XFxuICAgICAgICBcIit0K1wiXFxuICAgICAgfVxcblxcbiAgICAgIHZvaWQgbWFpbigpIHtcXG4gICAgICAgIGZsb2F0IHggPSBnZXRBQXRPdXRDb29yZHMoKTtcXG4gICAgICAgIGZsb2F0IHkgPSB1bmFyeU9wZXJhdGlvbih4KTtcXG5cXG4gICAgICAgIHNldE91dHB1dCh5KTtcXG4gICAgICB9XFxuICAgIFwifXJldHVybiBlLnByb3RvdHlwZS5nZXRDdXN0b21TZXR1cEZ1bmM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiBmdW5jdGlvbih0LG4pe251bGw9PWUuc3RhcnRMb2MmJihlLnN0YXJ0TG9jPXQuZ2V0VW5pZm9ybUxvY2F0aW9uTm9UaHJvdyhuLFwiTkFOXCIpLG51bGw9PWUuc3RhcnRMb2MpfHx0LmdsLnVuaWZvcm0xZihlLnN0YXJ0TG9jLE5hTil9fSxlfSgpLENIRUNLX05BTl9TTklQUEVUJDE9XCJpZiAoaXNOYU4oeCkpIHJldHVybiB4O1wiLEFCUz1cInJldHVybiBhYnMoeCk7XCIsUkVMVT1DSEVDS19OQU5fU05JUFBFVCQxK1wiXFxuICByZXR1cm4gKHggPCAwLjApID8gMC4wIDogeDtcXG5cIixFTFU9XCJyZXR1cm4gKHggPj0gMC4wKSA/IHggOiAoZXhwKHgpIC0gMS4wKTtcIixTRUxVPVwiXFxuICAvLyBTdGFibGUgYW5kIEF0dHJhY3RpbmcgRml4ZWQgUG9pbnQgKDAsIDEpIGZvciBOb3JtYWxpemVkIFdlaWdodHMuXFxuICAvLyBzZWU6IGh0dHBzOi8vYXJ4aXYub3JnL2Ficy8xNzA2LjAyNTE1XFxuICBmbG9hdCBzY2FsZUFscGhhID0gXCIrU0VMVV9TQ0FMRUFMUEhBK1wiO1xcbiAgZmxvYXQgc2NhbGUgPSBcIitTRUxVX1NDQUxFK1wiO1xcbiAgcmV0dXJuICh4ID49IDAuMCkgPyBzY2FsZSAqIHggOiBzY2FsZUFscGhhICogKGV4cCh4KSAtIDEuMCk7XFxuXCI7ZnVuY3Rpb24gU1RFUChlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9MCksQ0hFQ0tfTkFOX1NOSVBQRVQkMStcIlxcbiAgICByZXR1cm4geCA+IDAuMCA/IDEuMCA6IGZsb2F0KFwiK2UrXCIpO1xcbiAgXCJ9dmFyIE5FRz1cInJldHVybiAteDtcIixDRUlMPVwicmV0dXJuIGNlaWwoeCk7XCIsRkxPT1I9XCJyZXR1cm4gZmxvb3IoeCk7XCIsU0lHTj1cIlxcbiAgaWYgKGlzTmFOKHgpKSB7IHJldHVybiAwLjA7IH1cXG4gIHJldHVybiBzaWduKHgpO1xcblwiLFJPVU5EPVwiXFxuICAvLyBPcGVuR0wgRVMgZG9lcyBub3Qgc3VwcG9ydCByb3VuZCBmdW5jdGlvbi5cXG4gIC8vIFRoZSBhbGdvcml0aG0gaXMgYmFzZWQgb24gYmFua2VyJ3Mgcm91bmRpbmcuXFxuICBmbG9hdCBiYXNlID0gZmxvb3IoeCk7XFxuICBpZiAoKHggLSBiYXNlKSA8IDAuNSkge1xcbiAgICByZXR1cm4gZmxvb3IoeCk7XFxuICB9IGVsc2UgaWYgKCh4IC0gYmFzZSkgPiAwLjUpIHtcXG4gICAgcmV0dXJuIGNlaWwoeCk7XFxuICB9IGVsc2Uge1xcbiAgICBpZiAobW9kKGJhc2UsIDIuMCkgPT0gMC4wKSB7XFxuICAgICAgcmV0dXJuIGJhc2U7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgcmV0dXJuIGJhc2UgKyAxLjA7XFxuICAgIH1cXG4gIH1cXG5cIixFWFA9XCJyZXR1cm4gZXhwKHgpO1wiLEVYUE0xPVwicmV0dXJuIGV4cCh4KSAtIDEuMDtcIixMT0c9XCJpZiAoeCA8IDAuMCkgcmV0dXJuIE5BTjtcXG4gIHJldHVybiBsb2coeCk7XCIsTE9HMVA9XCJyZXR1cm4gbG9nKDEuMCArIHgpO1wiLFNRUlQ9XCJyZXR1cm4gc3FydCh4KTtcIixSU1FSVD1cInJldHVybiBpbnZlcnNlc3FydCh4KTtcIixTSUdNT0lEPVwicmV0dXJuIDEuMCAvICgxLjAgKyBleHAoLTEuMCAqIHgpKTtcIixTT0ZUUExVUz1cIlxcbiAgZmxvYXQgZXBzaWxvbiA9IDEuMTkyMDkyODk1NTA3ODEyNWUtNztcXG4gIGZsb2F0IHRocmVzaG9sZCA9IGxvZyhlcHNpbG9uKSArIDIuMDtcXG5cXG4gIGJvb2wgdG9vX2xhcmdlID0geCA+IC10aHJlc2hvbGQ7XFxuICBib29sIHRvb19zbWFsbCA9IHggPCB0aHJlc2hvbGQ7XFxuXFxuICBmbG9hdCByZXN1bHQ7XFxuICBmbG9hdCBleHBfeCA9IGV4cCh4KTtcXG5cXG4gIGlmICh0b29fbGFyZ2Upe1xcbiAgICByZXN1bHQgPSB4O1xcbiAgfVxcbiAgZWxzZSBpZiAodG9vX3NtYWxsKXtcXG4gICAgcmVzdWx0ID0gZXhwX3g7XFxuICB9XFxuICBlbHNle1xcbiAgICByZXN1bHQgPSBsb2coZXhwX3ggKyAxLjApO1xcbiAgfVxcbiAgcmV0dXJuIHJlc3VsdDtcXG5cIixTSU49Q0hFQ0tfTkFOX1NOSVBQRVQkMStcIlxcbiAgcmV0dXJuIHNpbih4KTtcXG5cIixDT1M9Q0hFQ0tfTkFOX1NOSVBQRVQkMStcIlxcbiAgcmV0dXJuIGNvcyh4KTtcXG5cIixUQU49XCJyZXR1cm4gdGFuKHgpO1wiLEFTSU49XCJyZXR1cm4gYXNpbih4KTtcIixBQ09TPVwicmV0dXJuIGFjb3MoeCk7XCIsQVRBTj1DSEVDS19OQU5fU05JUFBFVCQxK1wiXFxuICByZXR1cm4gYXRhbih4KTtcXG5cIixTSU5IPVwiXFxuICBmbG9hdCBlMnggPSBleHAoeCk7XFxuICByZXR1cm4gKGUyeCAtIDEuMCAvIGUyeCkgLyAyLjA7XFxuXCIsQ09TSD1cIlxcbiAgZmxvYXQgZTJ4ID0gZXhwKC14KTtcXG4gIHJldHVybiAoZTJ4ICsgMS4wIC8gZTJ4KSAvIDIuMDtcXG5cIixUQU5IPVwiXFxuICBmbG9hdCBlMnggPSBleHAoLTIuMCAqIGFicyh4KSk7XFxuICByZXR1cm4gc2lnbih4KSAqICgxLjAgLSBlMngpIC8gKDEuMCArIGUyeCk7XFxuXCIsQVNJTkg9XCJyZXR1cm4gbG9nKHggKyBzcXJ0KHggKiB4ICsgMS4wKSk7XCIsQUNPU0g9Q0hFQ0tfTkFOX1NOSVBQRVQkMStcIlxcbiAgaWYgKHggPCAxLjApIHJldHVybiBOQU47XFxuICByZXR1cm4gbG9nKHggKyBzcXJ0KHggKiB4IC0gMS4wKSk7XCIsQVRBTkg9Q0hFQ0tfTkFOX1NOSVBQRVQkMStcIlxcbiAgaWYgKCh4IDwgLTEuMCkgfHwgKHggPiAxLjApKSByZXR1cm4gTkFOO1xcbiAgcmV0dXJuIChsb2coMS4wICsgeCkgLSBsb2coMS4wIC0geCkpIC8gMi4wO1wiLEVSRj0nXFxuICAvLyBFcnJvciBmdW5jdGlvbiBpcyBjYWxjdWxhdGVkIGFwcHJveGltYXRlbHkgd2l0aCBlbGVtZW50YXJ5IGZ1bmN0aW9uLlxcbiAgLy8gU2VlIFwiSGFuZGJvb2sgb2YgTWF0aGVtYXRpY2FsIEZ1bmN0aW9ucyB3aXRoIEZvcm11bGFzLFxcbiAgLy8gR3JhcGhzLCBhbmQgTWF0aGVtYXRpY2FsIFRhYmxlc1wiLCBBYnJhbW93aXR6IGFuZCBTdGVndW4uXFxuICBmbG9hdCBwID0gJytFUkZfUCtcIjtcXG4gIGZsb2F0IGExID0gXCIrRVJGX0ExK1wiO1xcbiAgZmxvYXQgYTIgPSBcIitFUkZfQTIrXCI7XFxuICBmbG9hdCBhMyA9IFwiK0VSRl9BMytcIjtcXG4gIGZsb2F0IGE0ID0gXCIrRVJGX0E0K1wiO1xcbiAgZmxvYXQgYTUgPSBcIitFUkZfQTUrXCI7XFxuXFxuICBmbG9hdCB0ID0gMS4wIC8gKDEuMCArIHAgKiB4KTtcXG4gIHJldHVybiAxLjAgLSAoKCgoKGE1KnQgKyBhNCkqdCkgKyBhMykqdCArIGEyKSp0ICsgYTEpKnQqZXhwKC14KngpO1xcblwiLFNRVUFSRT1cInJldHVybiB4ICogeDtcIixSRUNJUFJPQ0FMPVwicmV0dXJuIDEuMCAvIHg7XCIsTE9HSUNBTF9OT1Q9XCJyZXR1cm4gZmxvYXQoISh4ID49IDEuMCkpO1wiLFRPX0lOVD1cInJldHVybiBmbG9hdChpbnQoeCkpO1wiLFVucGFja1Byb2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSl7dGhpcy52YXJpYWJsZU5hbWVzPVtcIkFcIl0sdGhpcy5vdXRwdXRTaGFwZT1lLHRoaXMudXNlckNvZGU9XCJcXG4gICAgICBjb25zdCB2ZWMyIG9uZVBpeGVsID0gMS4gLyB2ZWMyKFwiK2VbMV0rXCIsIFwiK2VbMF0rXCIpO1xcblxcbiAgICAgIHZvaWQgbWFpbigpIHtcXG4gICAgICAgIGl2ZWMyIHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7XFxuICAgICAgICB2ZWMyIG1vZENvb3JkID0gbW9kKHZlYzIocmMueSwgcmMueCksIDIuKTtcXG4gICAgICAgIHZlYzQgcGFja2VkSW5wdXQgPSBnZXRBKHJjLngsIHJjLnkpO1xcblxcbiAgICAgICAgc2V0T3V0cHV0KFxcbiAgICAgICAgICBtb2RDb29yZC54ID09IDAuID9cXG4gICAgICAgICAgICAobW9kQ29vcmQueSA9PSAwLiA/IHBhY2tlZElucHV0LnIgOiBwYWNrZWRJbnB1dC5iKSA6XFxuICAgICAgICAgICAgKG1vZENvb3JkLnkgPT0gMC4gPyBwYWNrZWRJbnB1dC5nIDogcGFja2VkSW5wdXQuYSlcXG4gICAgICAgICk7XFxuICAgICAgfVxcbiAgICBcIn19KCk7ZnVuY3Rpb24gY29uY2F0MWRfKGUpe3JldHVybiBjb25jYXQoZSwwKX1mdW5jdGlvbiBjb25jYXQyZF8oZSx0KXtyZXR1cm4gY29uY2F0KGUsdCl9ZnVuY3Rpb24gY29uY2F0M2RfKGUsdCl7cmV0dXJuIGNvbmNhdChlLHQpfWZ1bmN0aW9uIGNvbmNhdDRkXyhlLHQpe3JldHVybiBjb25jYXQoZSx0KX1mdW5jdGlvbiBjb25jYXRfKGUsdCl7dm9pZCAwPT09dCYmKHQ9MCksYXNzZXJ0KGUubGVuZ3RoPj0xLFwiUGFzcyBhdCBsZWFzdCBvbmUgdGVuc29yIHRvIGNvbmNhdFwiKTt2YXIgbj1jb252ZXJ0VG9UZW5zb3JBcnJheShlLFwidGVuc29yc1wiLFwiY29uY2F0XCIpO3Q9cGFyc2VBeGlzUGFyYW0odCxuWzBdLnNoYXBlKVswXTt2YXIgcj1jb21wdXRlT3V0U2hhcGUobi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2hhcGV9KSx0KTtpZigwPT09c2l6ZUZyb21TaGFwZShyKSlyZXR1cm4gdGVuc29yKFtdLHIpO2lmKDE9PT0obj1uLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZS5zaXplPjB9KSkubGVuZ3RoKXJldHVybiBuWzBdO3ZhciBvPW4ubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNoYXBlfSk7YXNzZXJ0UGFyYW1zQ29uc2lzdGVudChvLHQpO3ZhciBhPW47cmV0dXJuIEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNvbmNhdChuLHQpfSxhLGZ1bmN0aW9uKGUpe3ZhciBuPW8ubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlW3RdfSk7cmV0dXJuIHNwbGl0JDEoZSxuLHQpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZX19KX0pfWZ1bmN0aW9uIHNwbGl0XyhlLHQsbil7dm9pZCAwPT09biYmKG49MCk7dmFyIHIsbz1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcInNwbGl0XCIpO249cGFyc2VBeGlzUGFyYW0obixvLnNoYXBlKVswXSxcIm51bWJlclwiPT10eXBlb2YgdD8oYXNzZXJ0KG8uc2hhcGVbbl0ldD09MCxcIk51bWJlciBvZiBzcGxpdHMgbXVzdCBldmVubHkgZGl2aWRlIHRoZSBheGlzLlwiKSxyPUFycmF5KHQpLmZpbGwoby5zaGFwZVtuXS90KSk6KGFzc2VydChvLnNoYXBlW25dPT09dC5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSt0fSksXCJUaGUgc3VtIG9mIHNpemVzIG11c3QgbWF0Y2ggdGhlIHNpemUgb2YgdGhlIGF4aXMgZGltZW5zaW9uLlwiKSxyPXQpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5zcGxpdChvLHIsbil9LHskeDpvfSxmdW5jdGlvbihlKXtyZXR1cm57JHg6ZnVuY3Rpb24oKXtyZXR1cm4gY29uY2F0KGUsbil9fX0pfXZhciBjb25jYXQ9b3Aoe2NvbmNhdF86Y29uY2F0X30pLGNvbmNhdDFkPW9wKHtjb25jYXQxZF86Y29uY2F0MWRffSksY29uY2F0MmQ9b3Aoe2NvbmNhdDJkXzpjb25jYXQyZF99KSxjb25jYXQzZD1vcCh7Y29uY2F0M2RfOmNvbmNhdDNkX30pLGNvbmNhdDRkPW9wKHtjb25jYXQ0ZF86Y29uY2F0NGRffSksc3BsaXQkMT1vcCh7c3BsaXRfOnNwbGl0X30pLGNvbW1vbmpzR2xvYmFsPVwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OlwidW5kZWZpbmVkXCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOlwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gY3JlYXRlQ29tbW9uanNNb2R1bGUoZSx0KXtyZXR1cm4gZSh0PXtleHBvcnRzOnt9fSx0LmV4cG9ydHMpLHQuZXhwb3J0c312YXIgYWxlYT1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihlKXshZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4gdC5jPWUuYyx0LnMwPWUuczAsdC5zMT1lLnMxLHQuczI9ZS5zMix0fWZ1bmN0aW9uIG8oZSx0KXt2YXIgbj1uZXcgZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLHI9KHQ9NDAyMjg3MTE5NyxmdW5jdGlvbihlKXtlPWUudG9TdHJpbmcoKTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9LjAyNTE5NjAzMjgyNDE2OTM4Kih0Kz1lLmNoYXJDb2RlQXQobikpO3ItPXQ9cj4+PjAsdD0ocio9dCk+Pj4wLHQrPTQyOTQ5NjcyOTYqKHItPXQpfXJldHVybiAyLjMyODMwNjQzNjUzODY5NjNlLTEwKih0Pj4+MCl9KTtuLm5leHQ9ZnVuY3Rpb24oKXt2YXIgZT0yMDkxNjM5Km4uczArMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMCpuLmM7cmV0dXJuIG4uczA9bi5zMSxuLnMxPW4uczIsbi5zMj1lLShuLmM9MHxlKX0sbi5jPTEsbi5zMD1yKFwiIFwiKSxuLnMxPXIoXCIgXCIpLG4uczI9cihcIiBcIiksbi5zMC09cihlKSxuLnMwPDAmJihuLnMwKz0xKSxuLnMxLT1yKGUpLG4uczE8MCYmKG4uczErPTEpLG4uczItPXIoZSksbi5zMjwwJiYobi5zMis9MSkscj1udWxsfShlKSxvPXQmJnQuc3RhdGUsYT1uLm5leHQ7cmV0dXJuIGEuaW50MzI9ZnVuY3Rpb24oKXtyZXR1cm4gNDI5NDk2NzI5NipuLm5leHQoKXwwfSxhLmRvdWJsZT1mdW5jdGlvbigpe3JldHVybiBhKCkrMS4xMTAyMjMwMjQ2MjUxNTY1ZS0xNiooMjA5NzE1MiphKCl8MCl9LGEucXVpY2s9YSxvJiYoXCJvYmplY3RcIj09dHlwZW9mIG8mJnIobyxuKSxhLnN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHIobix7fSl9KSxhfXQmJnQuZXhwb3J0cz90LmV4cG9ydHM9bzpuJiZuLmFtZD9uKGZ1bmN0aW9uKCl7cmV0dXJuIG99KTp0aGlzLmFsZWE9b30oMCxlLCExKX0pLHhvcjEyOD1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihlKXshZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4gdC54PWUueCx0Lnk9ZS55LHQuej1lLnosdC53PWUudyx0fWZ1bmN0aW9uIG8oZSx0KXt2YXIgbj1uZXcgZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPVwiXCI7dC54PTAsdC55PTAsdC56PTAsdC53PTAsdC5uZXh0PWZ1bmN0aW9uKCl7dmFyIGU9dC54XnQueDw8MTE7cmV0dXJuIHQueD10LnksdC55PXQueix0Lno9dC53LHQud149dC53Pj4+MTleZV5lPj4+OH0sZT09PSgwfGUpP3QueD1lOm4rPWU7Zm9yKHZhciByPTA7cjxuLmxlbmd0aCs2NDtyKyspdC54Xj0wfG4uY2hhckNvZGVBdChyKSx0Lm5leHQoKX0oZSksbz10JiZ0LnN0YXRlLGE9ZnVuY3Rpb24oKXtyZXR1cm4obi5uZXh0KCk+Pj4wKS80Mjk0OTY3Mjk2fTtyZXR1cm4gYS5kb3VibGU9ZnVuY3Rpb24oKXtkb3t2YXIgZT0oKG4ubmV4dCgpPj4+MTEpKyhuLm5leHQoKT4+PjApLzQyOTQ5NjcyOTYpLygxPDwyMSl9d2hpbGUoMD09PWUpO3JldHVybiBlfSxhLmludDMyPW4ubmV4dCxhLnF1aWNrPWEsbyYmKFwib2JqZWN0XCI9PXR5cGVvZiBvJiZyKG8sbiksYS5zdGF0ZT1mdW5jdGlvbigpe3JldHVybiByKG4se30pfSksYX10JiZ0LmV4cG9ydHM/dC5leHBvcnRzPW86biYmbi5hbWQ/bihmdW5jdGlvbigpe3JldHVybiBvfSk6dGhpcy54b3IxMjg9b30oMCxlLCExKX0pLHhvcndvdz1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihlKXshZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4gdC54PWUueCx0Lnk9ZS55LHQuej1lLnosdC53PWUudyx0LnY9ZS52LHQuZD1lLmQsdH1mdW5jdGlvbiBvKGUsdCl7dmFyIG49bmV3IGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1cIlwiO3QubmV4dD1mdW5jdGlvbigpe3ZhciBlPXQueF50Lng+Pj4yO3JldHVybiB0Lng9dC55LHQueT10LnosdC56PXQudyx0Lnc9dC52LCh0LmQ9dC5kKzM2MjQzN3wwKSsodC52PXQudl50LnY8PDReZV5lPDwxKXwwfSx0Lng9MCx0Lnk9MCx0Lno9MCx0Lnc9MCx0LnY9MCxlPT09KDB8ZSk/dC54PWU6bis9ZTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoKzY0O3IrKyl0LnhePTB8bi5jaGFyQ29kZUF0KHIpLHI9PW4ubGVuZ3RoJiYodC5kPXQueDw8MTBedC54Pj4+NCksdC5uZXh0KCl9KGUpLG89dCYmdC5zdGF0ZSxhPWZ1bmN0aW9uKCl7cmV0dXJuKG4ubmV4dCgpPj4+MCkvNDI5NDk2NzI5Nn07cmV0dXJuIGEuZG91YmxlPWZ1bmN0aW9uKCl7ZG97dmFyIGU9KChuLm5leHQoKT4+PjExKSsobi5uZXh0KCk+Pj4wKS80Mjk0OTY3Mjk2KS8oMTw8MjEpfXdoaWxlKDA9PT1lKTtyZXR1cm4gZX0sYS5pbnQzMj1uLm5leHQsYS5xdWljaz1hLG8mJihcIm9iamVjdFwiPT10eXBlb2YgbyYmcihvLG4pLGEuc3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gcihuLHt9KX0pLGF9dCYmdC5leHBvcnRzP3QuZXhwb3J0cz1vOm4mJm4uYW1kP24oZnVuY3Rpb24oKXtyZXR1cm4gb30pOnRoaXMueG9yd293PW99KDAsZSwhMSl9KSx4b3JzaGlmdDc9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIHQueD1lLnguc2xpY2UoKSx0Lmk9ZS5pLHR9ZnVuY3Rpb24gbyhlLHQpe251bGw9PWUmJihlPStuZXcgRGF0ZSk7dmFyIG49bmV3IGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5uZXh0PWZ1bmN0aW9uKCl7dmFyIGUsbixyPXQueCxvPXQuaTtyZXR1cm4gZT1yW29dLG49KGVePWU+Pj43KV5lPDwyNCxuXj0oZT1yW28rMSY3XSleZT4+PjEwLG5ePShlPXJbbyszJjddKV5lPj4+MyxuXj0oZT1yW28rNCY3XSleZTw8NyxlPXJbbys3JjddLG5ePShlXj1lPDwxMyleZTw8OSxyW29dPW4sdC5pPW8rMSY3LG59LGZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXTtpZih0PT09KDB8dCkpclswXT10O2Vsc2UgZm9yKHQ9XCJcIit0LG49MDtuPHQubGVuZ3RoOysrbilyWzcmbl09cls3Jm5dPDwxNV50LmNoYXJDb2RlQXQobikrcltuKzEmN108PDEzO2Zvcig7ci5sZW5ndGg8ODspci5wdXNoKDApO2ZvcihuPTA7bjw4JiYwPT09cltuXTsrK24pO2Zvcig4PT1uP3JbN109LTE6cltuXSxlLng9cixlLmk9MCxuPTI1NjtuPjA7LS1uKWUubmV4dCgpfSh0LGUpfShlKSxvPXQmJnQuc3RhdGUsYT1mdW5jdGlvbigpe3JldHVybihuLm5leHQoKT4+PjApLzQyOTQ5NjcyOTZ9O3JldHVybiBhLmRvdWJsZT1mdW5jdGlvbigpe2Rve3ZhciBlPSgobi5uZXh0KCk+Pj4xMSkrKG4ubmV4dCgpPj4+MCkvNDI5NDk2NzI5NikvKDE8PDIxKX13aGlsZSgwPT09ZSk7cmV0dXJuIGV9LGEuaW50MzI9bi5uZXh0LGEucXVpY2s9YSxvJiYoby54JiZyKG8sbiksYS5zdGF0ZT1mdW5jdGlvbigpe3JldHVybiByKG4se30pfSksYX10JiZ0LmV4cG9ydHM/dC5leHBvcnRzPW86biYmbi5hbWQ/bihmdW5jdGlvbigpe3JldHVybiBvfSk6dGhpcy54b3JzaGlmdDc9b30oMCxlLCExKX0pLHhvcjQwOTY9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIHQuaT1lLmksdC53PWUudyx0Llg9ZS5YLnNsaWNlKCksdH1mdW5jdGlvbiBvKGUsdCl7bnVsbD09ZSYmKGU9K25ldyBEYXRlKTt2YXIgbj1uZXcgZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0Lm5leHQ9ZnVuY3Rpb24oKXt2YXIgZSxuLHI9dC53LG89dC5YLGE9dC5pO3JldHVybiB0Lnc9cj1yKzE2NDA1MzE1Mjd8MCxuPW9bYSszNCYxMjddLGU9b1thPWErMSYxMjddLG5ePW48PDEzLGVePWU8PDE3LG5ePW4+Pj4xNSxlXj1lPj4+MTIsbj1vW2FdPW5eZSx0Lmk9YSxuKyhyXnI+Pj4xNil8MH0sZnVuY3Rpb24oZSx0KXt2YXIgbixyLG8sYSxpLHM9W10sdT0xMjg7Zm9yKHQ9PT0oMHx0KT8ocj10LHQ9bnVsbCk6KHQrPVwiXFwwXCIscj0wLHU9TWF0aC5tYXgodSx0Lmxlbmd0aCkpLG89MCxhPS0zMjthPHU7KythKXQmJihyXj10LmNoYXJDb2RlQXQoKGErMzIpJXQubGVuZ3RoKSksMD09PWEmJihpPXIpLHJePXI8PDEwLHJePXI+Pj4xNSxyXj1yPDw0LHJePXI+Pj4xMyxhPj0wJiYoaT1pKzE2NDA1MzE1Mjd8MCxvPTA9PShuPXNbMTI3JmFdXj1yK2kpP28rMTowKTtmb3Iobz49MTI4JiYoc1sxMjcmKHQmJnQubGVuZ3RofHwwKV09LTEpLG89MTI3LGE9NTEyO2E+MDstLWEpcj1zW28rMzQmMTI3XSxuPXNbbz1vKzEmMTI3XSxyXj1yPDwxMyxuXj1uPDwxNyxyXj1yPj4+MTUsbl49bj4+PjEyLHNbb109cl5uO2Uudz1pLGUuWD1zLGUuaT1vfSh0LGUpfShlKSxvPXQmJnQuc3RhdGUsYT1mdW5jdGlvbigpe3JldHVybihuLm5leHQoKT4+PjApLzQyOTQ5NjcyOTZ9O3JldHVybiBhLmRvdWJsZT1mdW5jdGlvbigpe2Rve3ZhciBlPSgobi5uZXh0KCk+Pj4xMSkrKG4ubmV4dCgpPj4+MCkvNDI5NDk2NzI5NikvKDE8PDIxKX13aGlsZSgwPT09ZSk7cmV0dXJuIGV9LGEuaW50MzI9bi5uZXh0LGEucXVpY2s9YSxvJiYoby5YJiZyKG8sbiksYS5zdGF0ZT1mdW5jdGlvbigpe3JldHVybiByKG4se30pfSksYX10JiZ0LmV4cG9ydHM/dC5leHBvcnRzPW86biYmbi5hbWQ/bihmdW5jdGlvbigpe3JldHVybiBvfSk6dGhpcy54b3I0MDk2PW99KDAsZSwhMSl9KSx0eWNoZWk9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIHQuYT1lLmEsdC5iPWUuYix0LmM9ZS5jLHQuZD1lLmQsdH1mdW5jdGlvbiBvKGUsdCl7dmFyIG49bmV3IGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1cIlwiO3QubmV4dD1mdW5jdGlvbigpe3ZhciBlPXQuYixuPXQuYyxyPXQuZCxvPXQuYTtyZXR1cm4gZT1lPDwyNV5lPj4+N15uLG49bi1yfDAscj1yPDwyNF5yPj4+OF5vLG89by1lfDAsdC5iPWU9ZTw8MjBeZT4+PjEyXm4sdC5jPW49bi1yfDAsdC5kPXI8PDE2Xm4+Pj4xNl5vLHQuYT1vLWV8MH0sdC5hPTAsdC5iPTAsdC5jPS0xNjQwNTMxNTI3LHQuZD0xMzY3MTMwNTUxLGU9PT1NYXRoLmZsb29yKGUpPyh0LmE9ZS80Mjk0OTY3Mjk2fDAsdC5iPTB8ZSk6bis9ZTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoKzIwO3IrKyl0LmJePTB8bi5jaGFyQ29kZUF0KHIpLHQubmV4dCgpfShlKSxvPXQmJnQuc3RhdGUsYT1mdW5jdGlvbigpe3JldHVybihuLm5leHQoKT4+PjApLzQyOTQ5NjcyOTZ9O3JldHVybiBhLmRvdWJsZT1mdW5jdGlvbigpe2Rve3ZhciBlPSgobi5uZXh0KCk+Pj4xMSkrKG4ubmV4dCgpPj4+MCkvNDI5NDk2NzI5NikvKDE8PDIxKX13aGlsZSgwPT09ZSk7cmV0dXJuIGV9LGEuaW50MzI9bi5uZXh0LGEucXVpY2s9YSxvJiYoXCJvYmplY3RcIj09dHlwZW9mIG8mJnIobyxuKSxhLnN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHIobix7fSl9KSxhfXQmJnQuZXhwb3J0cz90LmV4cG9ydHM9bzpuJiZuLmFtZD9uKGZ1bmN0aW9uKCl7cmV0dXJuIG99KTp0aGlzLnR5Y2hlaT1vfSgwLGUsITEpfSksc2VlZHJhbmRvbT1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihlKXshZnVuY3Rpb24odCxuKXt2YXIgcixvPXRoaXMsYT0yNTYsaT02LHM9XCJyYW5kb21cIix1PW4ucG93KGEsaSksbD1uLnBvdygyLDUyKSxjPTIqbCxwPWEtMTtmdW5jdGlvbiBkKGUsZCxnKXt2YXIgdj1bXSx4PWYoZnVuY3Rpb24gZSh0LG4pe3ZhciByLG89W10sYT10eXBlb2YgdDtpZihuJiZcIm9iamVjdFwiPT1hKWZvcihyIGluIHQpdHJ5e28ucHVzaChlKHRbcl0sbi0xKSl9Y2F0Y2goZSl7fXJldHVybiBvLmxlbmd0aD9vOlwic3RyaW5nXCI9PWE/dDp0K1wiXFwwXCJ9KChkPTE9PWQ/e2VudHJvcHk6ITB9OmR8fHt9KS5lbnRyb3B5P1tlLG0odCldOm51bGw9PWU/ZnVuY3Rpb24oKXt0cnl7dmFyIGU7cmV0dXJuIHImJihlPXIucmFuZG9tQnl0ZXMpP2U9ZShhKTooZT1uZXcgVWludDhBcnJheShhKSwoby5jcnlwdG98fG8ubXNDcnlwdG8pLmdldFJhbmRvbVZhbHVlcyhlKSksbShlKX1jYXRjaChlKXt2YXIgbj1vLm5hdmlnYXRvcixpPW4mJm4ucGx1Z2lucztyZXR1cm5bK25ldyBEYXRlLG8saSxvLnNjcmVlbixtKHQpXX19KCk6ZSwzKSx2KSx5PW5ldyBmdW5jdGlvbihlKXt2YXIgdCxuPWUubGVuZ3RoLHI9dGhpcyxvPTAsaT1yLmk9ci5qPTAscz1yLlM9W107bnx8KGU9W24rK10pO2Zvcig7bzxhOylzW29dPW8rKztmb3Iobz0wO288YTtvKyspc1tvXT1zW2k9cCZpK2VbbyVuXSsodD1zW29dKV0sc1tpXT10OyhyLmc9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49MCxvPXIuaSxpPXIuaixzPXIuUztlLS07KXQ9c1tvPXAmbysxXSxuPW4qYStzW3AmKHNbb109c1tpPXAmaSt0XSkrKHNbaV09dCldO3JldHVybiByLmk9byxyLmo9aSxufSkoYSl9KHYpLFQ9ZnVuY3Rpb24oKXtmb3IodmFyIGU9eS5nKGkpLHQ9dSxuPTA7ZTxsOyllPShlK24pKmEsdCo9YSxuPXkuZygxKTtmb3IoO2U+PWM7KWUvPTIsdC89MixuPj4+PTE7cmV0dXJuKGUrbikvdH07cmV0dXJuIFQuaW50MzI9ZnVuY3Rpb24oKXtyZXR1cm4gMHx5LmcoNCl9LFQucXVpY2s9ZnVuY3Rpb24oKXtyZXR1cm4geS5nKDQpLzQyOTQ5NjcyOTZ9LFQuZG91YmxlPVQsZihtKHkuUyksdCksKGQucGFzc3x8Z3x8ZnVuY3Rpb24oZSx0LHIsbyl7cmV0dXJuIG8mJihvLlMmJmgobyx5KSxlLnN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIGgoeSx7fSl9KSxyPyhuW3NdPWUsdCk6ZX0pKFQseCxcImdsb2JhbFwiaW4gZD9kLmdsb2JhbDp0aGlzPT1uLGQuc3RhdGUpfWZ1bmN0aW9uIGgoZSx0KXtyZXR1cm4gdC5pPWUuaSx0Lmo9ZS5qLHQuUz1lLlMuc2xpY2UoKSx0fWZ1bmN0aW9uIGYoZSx0KXtmb3IodmFyIG4scj1lK1wiXCIsbz0wO288ci5sZW5ndGg7KXRbcCZvXT1wJihuXj0xOSp0W3Amb10pK3IuY2hhckNvZGVBdChvKyspO3JldHVybiBtKHQpfWZ1bmN0aW9uIG0oZSl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoMCxlKX1pZihuW1wic2VlZFwiK3NdPWQsZihuLnJhbmRvbSgpLHQpLGUuZXhwb3J0cyl7ZS5leHBvcnRzPWQ7dHJ5e3I9cmVxdWlyZShcImNyeXB0b1wiKX1jYXRjaChlKXt9fWVsc2UgMH0oW10sTWF0aCl9KTtzZWVkcmFuZG9tLmFsZWE9YWxlYSxzZWVkcmFuZG9tLnhvcjEyOD14b3IxMjgsc2VlZHJhbmRvbS54b3J3b3c9eG9yd293LHNlZWRyYW5kb20ueG9yc2hpZnQ3PXhvcnNoaWZ0NyxzZWVkcmFuZG9tLnhvcjQwOTY9eG9yNDA5NixzZWVkcmFuZG9tLnR5Y2hlaT10eWNoZWk7dmFyIHNlZWRyYW5kb20kMT1zZWVkcmFuZG9tLHNlZWRyYW5kb21fMT1zZWVkcmFuZG9tJDEuYWxlYSxNUFJhbmRHYXVzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0LG4scixvKXt0aGlzLm1lYW49ZSx0aGlzLnN0ZERldj10LHRoaXMuZHR5cGU9bix0aGlzLm5leHRWYWw9TmFOLHRoaXMudHJ1bmNhdGVkPXIsdGhpcy50cnVuY2F0ZWQmJih0aGlzLnVwcGVyPXRoaXMubWVhbisyKnRoaXMuc3RkRGV2LHRoaXMubG93ZXI9dGhpcy5tZWFuLTIqdGhpcy5zdGREZXYpO3ZhciBhPW98fE1hdGgucmFuZG9tKCk7dGhpcy5yYW5kb209c2VlZHJhbmRvbV8xKGEudG9TdHJpbmcoKSl9cmV0dXJuIGUucHJvdG90eXBlLm5leHRWYWx1ZT1mdW5jdGlvbigpe2lmKCFpc05hTih0aGlzLm5leHRWYWwpKXt2YXIgZT10aGlzLm5leHRWYWw7cmV0dXJuIHRoaXMubmV4dFZhbD1OYU4sZX1mb3IodmFyIHQsbixyPSExOyFyOyl7dmFyIG89dm9pZCAwLGE9dm9pZCAwLGk9dm9pZCAwO2Rve2k9KG89Mip0aGlzLnJhbmRvbSgpLTEpKm8rKGE9Mip0aGlzLnJhbmRvbSgpLTEpKmF9d2hpbGUoaT49MXx8MD09PWkpO3ZhciBzPU1hdGguc3FydCgtMipNYXRoLmxvZyhpKS9pKTt0PXRoaXMubWVhbit0aGlzLnN0ZERldipvKnMsbj10aGlzLm1lYW4rdGhpcy5zdGREZXYqYSpzLHRoaXMudHJ1bmNhdGVkJiYhdGhpcy5pc1ZhbGlkVHJ1bmNhdGVkKHQpfHwocj0hMCl9cmV0dXJuIHRoaXMudHJ1bmNhdGVkJiYhdGhpcy5pc1ZhbGlkVHJ1bmNhdGVkKG4pfHwodGhpcy5uZXh0VmFsPXRoaXMuY29udmVydFZhbHVlKG4pKSx0aGlzLmNvbnZlcnRWYWx1ZSh0KX0sZS5wcm90b3R5cGUuY29udmVydFZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT10aGlzLmR0eXBlfHxcImZsb2F0MzJcIj09PXRoaXMuZHR5cGU/ZTpNYXRoLnJvdW5kKGUpfSxlLnByb3RvdHlwZS5pc1ZhbGlkVHJ1bmNhdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlPD10aGlzLnVwcGVyJiZlPj10aGlzLmxvd2VyfSxlfSgpO2Z1bmN0aW9uIGNsb25lXyhlKXt2YXIgdD1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcImNsb25lXCIpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gVGVuc29yLm1ha2UodC5zaGFwZSx7ZGF0YUlkOnQuZGF0YUlkfSx0LmR0eXBlKX0seyR4OnR9LGZ1bmN0aW9uKGUpe3JldHVybnskeDpmdW5jdGlvbigpe3JldHVybiBlLnRvRmxvYXQoKX19fSl9ZnVuY3Rpb24gZXllXyhlLHQsbixyKXt2b2lkIDA9PT1yJiYocj1cImZsb2F0MzJcIiksbnVsbD09dCYmKHQ9ZSk7Zm9yKHZhciBvPWJ1ZmZlcihbZSx0XSxyKSxhPWU8PXQ/ZTp0LGk9MDtpPGE7KytpKW8uc2V0KDEsaSxpKTt2YXIgcz1vLnRvVGVuc29yKCkuYXMyRChlLHQpO2lmKG51bGw9PW4pcmV0dXJuIHM7aWYoMT09PW4ubGVuZ3RoKXJldHVybiB0aWxlKGV4cGFuZERpbXMocywwKSxbblswXSwxLDFdKTtpZigyPT09bi5sZW5ndGgpcmV0dXJuIHRpbGUoZXhwYW5kRGltcyhleHBhbmREaW1zKHMsMCksMCksW25bMF0sblsxXSwxLDFdKTtpZigzPT09bi5sZW5ndGgpcmV0dXJuIHRpbGUoZXhwYW5kRGltcyhleHBhbmREaW1zKGV4cGFuZERpbXMocywwKSwwKSwwKSxbblswXSxuWzFdLG5bMl0sMSwxXSk7dGhyb3cgbmV3IEVycm9yKFwiZXllKCkgY3VycmVudGx5IHN1cHBvcnRzIG9ubHkgMUQgYW5kIDJEIGJhdGNoU2hhcGVzLCBidXQgcmVjZWl2ZWQgXCIrbi5sZW5ndGgrXCJELlwiKX1mdW5jdGlvbiByYW5kb21Ob3JtYWxfKGUsdCxuLHIsbyl7aWYodm9pZCAwPT09dCYmKHQ9MCksdm9pZCAwPT09biYmKG49MSksbnVsbCE9ciYmXCJib29sXCI9PT1yKXRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGRhdGEgdHlwZSBcIityKTtmb3IodmFyIGE9bmV3IE1QUmFuZEdhdXNzKHQsbixyLCExLG8pLGk9YnVmZmVyKGUscikscz0wO3M8aS52YWx1ZXMubGVuZ3RoO3MrKylpLnZhbHVlc1tzXT1hLm5leHRWYWx1ZSgpO3JldHVybiBpLnRvVGVuc29yKCl9ZnVuY3Rpb24gdHJ1bmNhdGVkTm9ybWFsXyhlLHQsbixyLG8pe2lmKHZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PW4mJihuPTEpLG51bGwhPXImJlwiYm9vbFwiPT09cil0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBkYXRhIHR5cGUgXCIrcik7Zm9yKHZhciBhPW5ldyBNUFJhbmRHYXVzcyh0LG4sciwhMCxvKSxpPWJ1ZmZlcihlLHIpLHM9MDtzPGkudmFsdWVzLmxlbmd0aDtzKyspaS52YWx1ZXNbc109YS5uZXh0VmFsdWUoKTtyZXR1cm4gaS50b1RlbnNvcigpfWZ1bmN0aW9uIHJhbmRvbVVuaWZvcm1fKGUsdCxuLHIpe3ZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PW4mJihuPTEpLHZvaWQgMD09PXImJihyPVwiZmxvYXQzMlwiKTtmb3IodmFyIG89YnVmZmVyKGUsciksYT0wO2E8by52YWx1ZXMubGVuZ3RoO2ErKylvLnZhbHVlc1thXT1yYW5kVW5pZm9ybSh0LG4pO3JldHVybiBvLnRvVGVuc29yKCl9ZnVuY3Rpb24gcmFuZF8oZSx0LG4pe3ZhciByPXNpemVGcm9tU2hhcGUoZSksbz1udWxsO2lmKG51bGw9PW58fFwiZmxvYXQzMlwiPT09bilvPW5ldyBGbG9hdDMyQXJyYXkocik7ZWxzZSBpZihcImludDMyXCI9PT1uKW89bmV3IEludDMyQXJyYXkocik7ZWxzZXtpZihcImJvb2xcIiE9PW4pdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBkYXRhIHR5cGUgXCIrbik7bz1uZXcgVWludDhBcnJheShyKX1mb3IodmFyIGE9MDthPHI7YSsrKW9bYV09dCgpO3JldHVybiBUZW5zb3IubWFrZShlLHt2YWx1ZXM6b30sbil9ZnVuY3Rpb24gbXVsdGlub21pYWxfKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPSExKTt2YXIgbz1jb252ZXJ0VG9UZW5zb3IoZSxcImxvZ2l0c1wiLFwibXVsdGlub21pYWxcIiksYT1vLnNpemUsaT1vLnJhbms7aWYoYTwyKXRocm93IG5ldyBFcnJvcihcIkVycm9yIGluIG11bHRpbm9taWFsOiB5b3UgbmVlZCBhdCBsZWFzdCAyIG91dGNvbWVzLCBidXQgZ290IFwiK2ErXCIuXCIpO2lmKGk+Mil0aHJvdyBuZXcgRXJyb3IoXCJSYW5rIG9mIHByb2JhYmlsaXRpZXMgbXVzdCBiZSAxIG9yIDIsIGJ1dCBpcyBcIitpKTtuPW58fE1hdGgucmFuZG9tKCk7dmFyIHM9MT09PWk/by5hczJEKDEsLTEpOm8sdT1FTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5tdWx0aW5vbWlhbChzLHIsdCxuKX0se2xvZ2l0czJEOnN9KTtyZXR1cm4gMT09PWk/dS5hczFEKCk6dX1mdW5jdGlvbiBvbmVIb3RfKGUsdCxuLHIpe3ZvaWQgMD09PW4mJihuPTEpLHZvaWQgMD09PXImJihyPTApO3ZhciBvPWNvbnZlcnRUb1RlbnNvcihlLFwiaW5kaWNlc1wiLFwib25lSG90XCIsXCJpbnQzMlwiKTtpZihhc3NlcnQoXCJpbnQzMlwiPT09by5kdHlwZSxcIkluZGljZXMgbXVzdCBiZSBvZiBkdHlwZSBgaW50MzJgXCIpLHQ8Mil0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciBpbiBvbmVIb3Q6IGRlcHRoIG11c3QgYmUgPj0yLCBidXQgaXQgaXMgXCIrdCk7cmV0dXJuIEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLm9uZUhvdChvLHQsbixyKX0seyRpbmRpY2VzOm99LGZ1bmN0aW9uKGUpe3JldHVybnskaW5kaWNlczpmdW5jdGlvbigpe3JldHVybiB6ZXJvc0xpa2Uobyl9fX0pfWZ1bmN0aW9uIGZyb21QaXhlbHNfKGUsdCl7aWYodm9pZCAwPT09dCYmKHQ9MyksdD40KXRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb25zdHJ1Y3QgVGVuc29yIHdpdGggbW9yZSB0aGFuIDQgY2hhbm5lbHMgZnJvbSBwaXhlbHMuXCIpO3JldHVybiBFTlYuZW5naW5lLmZyb21QaXhlbHMoZSx0KX1mdW5jdGlvbiB0b1BpeGVscyhlLHQpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIG4scixvLGEsaSxzLHUsbCxjLHAsZCxoLGYsbSxnLHYseCx5LFQsUztyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihiKXtzd2l0Y2goYi5sYWJlbCl7Y2FzZSAwOmlmKDIhPT0obj1jb252ZXJ0VG9UZW5zb3IoZSxcImltZ1wiLFwidG9QaXhlbHNcIixcImludDMyXCIpKS5yYW5rJiYzIT09bi5yYW5rKXRocm93IG5ldyBFcnJvcihcInRvUGl4ZWxzIG9ubHkgc3VwcG9ydHMgcmFuayAyIG9yIDMgdGVuc29ycywgZ290IHJhbmsgXCIrbi5yYW5rK1wiLlwiKTtpZihyPW4uc2hhcGUuc2xpY2UoMCwyKSxvPXJbMF0sYT1yWzFdLChpPTI9PT1uLnJhbms/MTpuLnNoYXBlWzJdKT40fHwyPT09aSl0aHJvdyBuZXcgRXJyb3IoXCJ0b1BpeGVscyBvbmx5IHN1cHBvcnRzIGRlcHRoIG9mIHNpemUgMSwgMyBvciA0IGJ1dCBnb3QgXCIraSk7cmV0dXJuIHM9bi5taW4oKSx1PW4ubWF4KCksWzQscy5kYXRhKCldO2Nhc2UgMTpyZXR1cm4gbD1iLnNlbnQoKVswXSxbNCx1LmRhdGEoKV07Y2FzZSAyOmlmKGM9Yi5zZW50KClbMF0scy5kaXNwb3NlKCksdS5kaXNwb3NlKCksXCJmbG9hdDMyXCI9PT1uLmR0eXBlKXtpZihsPDB8fGM+MSl0aHJvdyBuZXcgRXJyb3IoXCJUZW5zb3IgdmFsdWVzIGZvciBhIGZsb2F0MzIgVGVuc29yIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswIC0gMV0gYnV0IGdvdCByYW5nZSBbXCIrbCtcIiAtIFwiK2MrXCJdLlwiKX1lbHNle2lmKFwiaW50MzJcIiE9PW4uZHR5cGUpdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgdHlwZSBmb3IgdG9QaXhlbHM6IFwiK24uZHR5cGUrXCIuIFBsZWFzZSB1c2UgZmxvYXQzMiBvciBpbnQzMiB0ZW5zb3JzLlwiKTtpZihsPDB8fGM+MjU1KXRocm93IG5ldyBFcnJvcihcIlRlbnNvciB2YWx1ZXMgZm9yIGEgaW50MzIgVGVuc29yIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswIC0gMjU1XSBidXQgZ290IHJhbmdlIFtcIitsK1wiIC0gXCIrYytcIl0uXCIpfXJldHVybls0LG4uZGF0YSgpXTtjYXNlIDM6Zm9yKHA9Yi5zZW50KCksZD1cImZsb2F0MzJcIj09PW4uZHR5cGU/MjU1OjEsaD1uZXcgVWludDhDbGFtcGVkQXJyYXkoYSpvKjQpLGY9MDtmPG8qYTsrK2YpbT12b2lkIDAsZz12b2lkIDAsdj12b2lkIDAseD12b2lkIDAsMT09PWk/KG09cFtmXSpkLGc9cFtmXSpkLHY9cFtmXSpkLHg9MjU1KTozPT09aT8obT1wWzMqZl0qZCxnPXBbMypmKzFdKmQsdj1wWzMqZisyXSpkLHg9MjU1KTo0PT09aSYmKG09cFs0KmZdKmQsZz1wWzQqZisxXSpkLHY9cFs0KmYrMl0qZCx4PXBbNCpmKzNdKmQpLGhbKHk9NCpmKSswXT1NYXRoLnJvdW5kKG0pLGhbeSsxXT1NYXRoLnJvdW5kKGcpLGhbeSsyXT1NYXRoLnJvdW5kKHYpLGhbeSszXT1NYXRoLnJvdW5kKHgpO3JldHVybiBudWxsIT10JiYodC53aWR0aD1hLHQuaGVpZ2h0PW8sVD10LmdldENvbnRleHQoXCIyZFwiKSxTPW5ldyBJbWFnZURhdGEoaCxhLG8pLFQucHV0SW1hZ2VEYXRhKFMsMCwwKSksbiE9PWUmJm4uZGlzcG9zZSgpLFsyLGhdfX0pfSl9ZnVuY3Rpb24gcmVzaGFwZV8oZSx0KXt2YXIgbj1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcInJlc2hhcGVcIik7dD1pbmZlckZyb21JbXBsaWNpdFNoYXBlKHQsbi5zaXplKSxhc3NlcnQobi5zaXplPT09c2l6ZUZyb21TaGFwZSh0KSxcIm5ldyBzaGFwZSBhbmQgb2xkIHNoYXBlIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuXCIpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXNoYXBlKG4sdCl9LHskeDpufSxmdW5jdGlvbihlKXtyZXR1cm57JHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZXNoYXBlKG4uc2hhcGUpfX19KX1mdW5jdGlvbiBzcXVlZXplXyhlLHQpe3ZhciBuPWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwic3F1ZWV6ZVwiKTtyZXR1cm4gcmVzaGFwZShuLHNxdWVlemVTaGFwZShuLnNoYXBlLHQpLm5ld1NoYXBlKX1mdW5jdGlvbiBjYXN0XyhlLHQpe3ZhciBuPWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwiY2FzdFwiKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2FzdChuLHQpfSx7JHg6bn0sZnVuY3Rpb24oZSl7cmV0dXJueyR4OmZ1bmN0aW9uKCl7cmV0dXJuIGUuY2xvbmUoKX19fSl9ZnVuY3Rpb24gdGlsZV8oZSx0KXt2YXIgbj1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcInRpbGVcIik7YXNzZXJ0KG4ucmFuaz09PXQubGVuZ3RoLFwiRXJyb3IgaW4gdHJhbnNwb3NlOiByYW5rIG9mIGlucHV0IFwiK24ucmFuaytcIiBtdXN0IG1hdGNoIGxlbmd0aCBvZiByZXBzIFwiK3QrXCIuXCIpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS50aWxlKG4sdCl9LHskeDpufSxmdW5jdGlvbihlKXtyZXR1cm57JHg6ZnVuY3Rpb24oKXt2YXIgcj16ZXJvc0xpa2Uobik7aWYoMT09PW4ucmFuaylmb3IodmFyIG89MDtvPHRbMF07KytvKXI9ci5hZGQoZS5zbGljZShbbypuLnNoYXBlWzBdXSxbbi5zaGFwZVswXV0pKTtlbHNlIGlmKDI9PT1uLnJhbmspZm9yKG89MDtvPHRbMF07KytvKWZvcih2YXIgYT0wO2E8dFsxXTsrK2Epcj1yLmFkZChlLnNsaWNlKFtvKm4uc2hhcGVbMF0sYSpuLnNoYXBlWzFdXSxbbi5zaGFwZVswXSxuLnNoYXBlWzFdXSkpO2Vsc2UgaWYoMz09PW4ucmFuaylmb3Iobz0wO288dFswXTsrK28pZm9yKGE9MDthPHRbMV07KythKWZvcih2YXIgaT0wO2k8dFsyXTsrK2kpcj1yLmFkZChlLnNsaWNlKFtvKm4uc2hhcGVbMF0sYSpuLnNoYXBlWzFdLGkqbi5zaGFwZVsyXV0sW24uc2hhcGVbMF0sbi5zaGFwZVsxXSxuLnNoYXBlWzJdXSkpO2Vsc2V7aWYoNCE9PW4ucmFuayl0aHJvdyBuZXcgRXJyb3IoXCJHcmFkaWVudCBmb3IgdGlsZSBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkIGZvciByYW5rLVwiK24ucmFuaytcIiB0ZW5zb3JzIHlldC5cIik7Zm9yKG89MDtvPHRbMF07KytvKWZvcihhPTA7YTx0WzFdOysrYSlmb3IoaT0wO2k8dFsyXTsrK2kpZm9yKHZhciBzPTA7czx0WzNdOysrcylyPXIuYWRkKGUuc2xpY2UoW28qbi5zaGFwZVswXSxhKm4uc2hhcGVbMV0saSpuLnNoYXBlWzJdLHMqbi5zaGFwZVszXV0sW24uc2hhcGVbMF0sbi5zaGFwZVsxXSxuLnNoYXBlWzJdLG4uc2hhcGVbM11dKSl9cmV0dXJuIHJ9fX0pfWZ1bmN0aW9uIHBhZDFkXyhlLHQsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPTApLGFzc2VydCgyPT09dC5sZW5ndGgsXCJJbnZhbGlkIG51bWJlciBvZiBwYWRkaW5ncy4gTXVzdCBiZSBsZW5ndGggb2YgMi5cIikscGFkKGUsW3RdLG4pfWZ1bmN0aW9uIHBhZDJkXyhlLHQsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPTApLGFzc2VydCgyPT09dC5sZW5ndGgmJjI9PT10WzBdLmxlbmd0aCYmMj09PXRbMV0ubGVuZ3RoLFwiSW52YWxpZCBudW1iZXIgb2YgcGFkZGluZ3MuIE11c3QgYmUgbGVuZ3RoIG9mIDIgZWFjaC5cIikscGFkKGUsdCxuKX1mdW5jdGlvbiBwYWQzZF8oZSx0LG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj0wKSxhc3NlcnQoMz09PXQubGVuZ3RoJiYyPT09dFswXS5sZW5ndGgmJjI9PT10WzFdLmxlbmd0aCYmMj09PXRbMl0ubGVuZ3RoLFwiSW52YWxpZCBudW1iZXIgb2YgcGFkZGluZ3MuIE11c3QgYmUgbGVuZ3RoIG9mIDIgZWFjaC5cIikscGFkKGUsdCxuKX1mdW5jdGlvbiBwYWQ0ZF8oZSx0LG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj0wKSxhc3NlcnQoND09PXQubGVuZ3RoJiYyPT09dFswXS5sZW5ndGgmJjI9PT10WzFdLmxlbmd0aCYmMj09PXRbMl0ubGVuZ3RoJiYyPT09dFszXS5sZW5ndGgsXCJJbnZhbGlkIG51bWJlciBvZiBwYWRkaW5ncy4gTXVzdCBiZSBsZW5ndGggb2YgMiBlYWNoLlwiKSxwYWQoZSx0LG4pfWZ1bmN0aW9uIHBhZF8oZSx0LG4pe3ZvaWQgMD09PW4mJihuPTApO3ZhciByPWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwicGFkXCIpO2lmKDA9PT1yLnJhbmspdGhyb3cgbmV3IEVycm9yKFwicGFkKHNjYWxhcikgaXMgbm90IGRlZmluZWQuIFBhc3Mgbm9uLXNjYWxhciB0byBwYWRcIik7dmFyIG89dC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF19KTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFkKHIsdCxuKX0seyR4OnJ9LGZ1bmN0aW9uKGUpe3JldHVybnskeDpmdW5jdGlvbigpe3JldHVybiBlLnNsaWNlKG8sci5zaGFwZSl9fX0pfWZ1bmN0aW9uIHN0YWNrXyhlLHQpe3ZvaWQgMD09PXQmJih0PTApO3ZhciBuPWNvbnZlcnRUb1RlbnNvckFycmF5KGUsXCJ0ZW5zb3JzXCIsXCJzdGFja1wiKTtpZihhc3NlcnQobi5sZW5ndGg+PTEsXCJQYXNzIGF0IGxlYXN0IG9uZSB0ZW5zb3IgdG8gdGYuc3RhY2tcIiksMT09PW4ubGVuZ3RoKXJldHVybiBuWzBdLmV4cGFuZERpbXModCk7dmFyIHI9blswXS5yYW5rLG89blswXS5zaGFwZSxhPW5bMF0uZHR5cGU7YXNzZXJ0KHQ8PXIsXCJBeGlzIG11c3QgYmUgPD0gcmFuayBvZiB0aGUgdGVuc29yXCIpLG4uZm9yRWFjaChmdW5jdGlvbihlKXthc3NlcnRTaGFwZXNNYXRjaChvLGUuc2hhcGUsXCJBbGwgdGVuc29ycyBwYXNzZWQgdG8gc3RhY2sgbXVzdCBoYXZlIG1hdGNoaW5nIHNoYXBlc1wiKX0pLG4uZm9yRWFjaChmdW5jdGlvbihlKXthc3NlcnQoYT09PWUuZHR5cGUsXCJBbGwgdGVuc29ycyBwYXNzZWQgdG8gc3RhY2sgbXVzdCBoYXZlIG1hdGNoaW5nIGR0eXBlc1wiKX0pO3ZhciBpPW4ubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmV4cGFuZERpbXModCl9KTtyZXR1cm4gY29uY2F0KGksdCl9ZnVuY3Rpb24gYmF0Y2hUb1NwYWNlTkRfKGUsdCxuKXt2YXIgcj1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcImJhdGNoVG9TcGFjZU5EXCIpLG89dC5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSp0fSk7YXNzZXJ0KHIucmFuaz49MSt0Lmxlbmd0aCxcImlucHV0IHJhbmsgaXMgXCIrci5yYW5rK1wiIGJ1dCBzaG91bGQgYmUgPiB0aGFuIGJsb2NrU2hhcGUubGVuZ3RoIFwiK3QubGVuZ3RoKSxhc3NlcnQobi5sZW5ndGg9PT10Lmxlbmd0aCxcImNyb3BzLmxlbmd0aCBpcyBcIituLmxlbmd0aCtcIiBidXQgc2hvdWxkIGJlIGVxdWFsIHRvIGJsb2NrU2hhcGUubGVuZ3RoICBcIit0Lmxlbmd0aCksYXNzZXJ0KHIuc2hhcGVbMF0lbz09MCxcImlucHV0IHRlbnNvciBiYXRjaCBpcyBcIityLnNoYXBlWzBdK1wiIGJ1dCBpcyBub3QgZGl2aXNpYmxlIGJ5IHRoZSBwcm9kdWN0IG9mIHRoZSBlbGVtZW50cyBvZiBibG9ja1NoYXBlIFwiK3Quam9pbihcIiAqIFwiKStcIiA9PT0gXCIrbyk7cmV0dXJuIEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmJhdGNoVG9TcGFjZU5EKHIsdCxuKX0seyR4OnJ9LGZ1bmN0aW9uKGUpe3JldHVybnskeDpmdW5jdGlvbigpe3JldHVybiBlLnNwYWNlVG9CYXRjaE5EKHQsbil9fX0pfWZ1bmN0aW9uIHNwYWNlVG9CYXRjaE5EXyhlLHQsbil7dmFyIHI9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJzcGFjZVRvQmF0Y2hORFwiKTthc3NlcnQoci5yYW5rPj0xK3QubGVuZ3RoLFwiaW5wdXQgcmFuayBcIityLnJhbmsrXCIgc2hvdWxkIGJlID4gdGhhbiBbYmxvY2tTaGFwZV0gXCIrdC5sZW5ndGgpLGFzc2VydChuLmxlbmd0aD09PXQubGVuZ3RoLFwicGFkZGluZ3Muc2hhcGVbMF0gXCIrbi5sZW5ndGgrXCIgbXVzdCBiZSBlcXVhbCB0byBbYmxvY2tTaGFwZV0gXCIrdC5sZW5ndGgpLGFzc2VydChyLnNoYXBlLnJlZHVjZShmdW5jdGlvbihlLHIsbyl7cmV0dXJuIG8+MCYmbzw9dC5sZW5ndGg/ZSYmKHIrbltvLTFdWzBdK25bby0xXVsxXSkldFtvLTFdPT0wOmV9LCEwKSxcImlucHV0IHNwYXRpYWwgZGltZW5zaW9ucyBcIityLnNoYXBlLnNsaWNlKDEpK1wiIHdpdGggcGFkZGluZ3MgXCIrbi50b1N0cmluZygpK1wiIG11c3QgYmUgZGl2aXNpYmxlIGJ5IGJsb2NrU2hhcGVzIFwiK3QudG9TdHJpbmcoKSk7cmV0dXJuIEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNwYWNlVG9CYXRjaE5EKHIsdCxuKX0seyR4OnJ9LGZ1bmN0aW9uKGUpe3JldHVybnskeDpmdW5jdGlvbigpe3JldHVybiBlLmJhdGNoVG9TcGFjZU5EKHQsbil9fX0pfWZ1bmN0aW9uIHVuc3RhY2tfKGUsdCl7dm9pZCAwPT09dCYmKHQ9MCk7Zm9yKHZhciBuLHI9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJ1bnN0YWNrXCIpLG89ci5zaGFwZVt0XSxhPUFycmF5KHIucmFuay0xKS5maWxsKDApLGk9MCxzPTA7czxyLnJhbms7cysrKXMhPT10JiYoYVtpXT1yLnNoYXBlW3NdLGkrKyk7bj1BcnJheShvKS5maWxsKDEpO3ZhciB1PUFycmF5KHIucmFuaykuZmlsbCgwKSxsPXIuc2hhcGUuc2xpY2UoKTtyZXR1cm4gbi5tYXAoZnVuY3Rpb24oZSl7bFt0XT1lO3ZhciBuPXIuc2xpY2UodSxsKTtyZXR1cm4gdVt0XSs9ZSxuLnJlc2hhcGUoYSl9KX1mdW5jdGlvbiBjdW1zdW1fKGUsdCxuLHIpe3ZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PW4mJihuPSExKSx2b2lkIDA9PT1yJiYocj0hMSk7dmFyIG89Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJjdW1zdW1cIiksYT1nZXRBeGVzUGVybXV0YXRpb24oW3R8PTBdLG8ucmFuayksaT1vO251bGwhPWEmJihpPW8udHJhbnNwb3NlKGEpKTt2YXIgcz1nZXRJbm5lck1vc3RBeGVzKDEsby5yYW5rKVswXSx1PUVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmN1bXN1bShpLHMsbixyKX0se3Blcm11dGVkWDppfSxmdW5jdGlvbihlKXtyZXR1cm57cGVybXV0ZWRYOmZ1bmN0aW9uKCl7cmV0dXJuIGUuY3Vtc3VtKHQsbiwhcil9fX0pO3JldHVybiBudWxsIT1hJiYodT11LnRyYW5zcG9zZShhKSksdX1mdW5jdGlvbiBleHBhbmREaW1zXyhlLHQpe3ZvaWQgMD09PXQmJih0PTApO3ZhciBuPWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwiZXhwYW5kRGltc1wiKTthc3NlcnQodDw9bi5yYW5rLFwiQXhpcyBtdXN0IGJlIDw9IHJhbmsgb2YgdGhlIHRlbnNvclwiKTt2YXIgcj1uLnNoYXBlLnNsaWNlKCk7cmV0dXJuIHQ8MCYmKGFzc2VydCgtKG4ucmFuaysxKTw9dCxcIkF4aXMgbXVzdCBiZSBpbiB0aGUgaW50ZXJ2YWwgW1wiKy0obi5yYW5rKzEpK1wiLCBcIituLnJhbmsrXCJdXCIpLHQ9bi5yYW5rK3QrMSksci5zcGxpY2UodCwwLDEpLHJlc2hhcGUobixyKX1mdW5jdGlvbiBkZXB0aFRvU3BhY2VfKGUsdCxuKXt2b2lkIDA9PT1uJiYobj1cIk5IV0NcIik7dmFyIHI9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJkZXB0aFRvU3BhY2VcIiksbz1cIk5IV0NcIj09PW4/ci5zaGFwZVsxXTpyLnNoYXBlWzJdLGE9XCJOSFdDXCI9PT1uP3Iuc2hhcGVbMl06ci5zaGFwZVszXSxpPVwiTkhXQ1wiPT09bj9yLnNoYXBlWzNdOnIuc2hhcGVbMV07cmV0dXJuIGFzc2VydChvKnQ+PTAsXCJOZWdhdGl2ZSBkaW1lbnNpb24gc2l6ZSBjYXVzZWQgYnkgb3ZlcmZsb3cgd2hlbiBtdWx0aXBseWluZ1xcbiAgICAgIFwiK28rXCIgYW5kIFwiK3QrXCIgIGZvciBkZXB0aFRvU3BhY2Ugd2l0aCBpbnB1dCBzaGFwZVxcbiAgICAgIFwiK3Iuc2hhcGUpLGFzc2VydChhKnQ+PTAsXCJOZWdhdGl2ZSBkaW1lbnNpb24gc2l6ZSBjYXVzZWQgYnkgb3ZlcmZsb3cgd2hlbiBtdWx0aXBseWluZ1xcbiAgICAgIFwiK2ErXCIgYW5kIFwiK3QrXCIgZm9yIGRlcHRoVG9TcGFjZSB3aXRoIGlucHV0IHNoYXBlXFxuICAgICAgICAgIFwiK3Iuc2hhcGUpLGFzc2VydChpJSh0KnQpPT0wLFwiRGltZW5zaW9uIHNpemUgbXVzdCBiZSBldmVubHkgZGl2aXNpYmxlIGJ5IFwiK3QqdCtcIiBidXQgaXMgXCIraStcIiBmb3IgZGVwdGhUb1NwYWNlIHdpdGggaW5wdXQgc2hhcGUgXCIrci5zaGFwZSksRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGVwdGhUb1NwYWNlKHIsdCxuKX0seyR4OnJ9KX1mdW5jdGlvbiBidWZmZXIoZSx0LG4pe3JldHVybiB2b2lkIDA9PT10JiYodD1cImZsb2F0MzJcIiksbmV3IFRlbnNvckJ1ZmZlcihlLHQsbil9ZnVuY3Rpb24gcHJpbnQoZSx0KXt2b2lkIDA9PT10JiYodD0hMSksY29uc29sZS5sb2coZS50b1N0cmluZyh0KSl9dmFyIGJhdGNoVG9TcGFjZU5EPW9wKHtiYXRjaFRvU3BhY2VORF86YmF0Y2hUb1NwYWNlTkRffSksY2FzdD1vcCh7Y2FzdF86Y2FzdF99KSxjbG9uZT1vcCh7Y2xvbmVfOmNsb25lX30pLGN1bXN1bT1vcCh7Y3Vtc3VtXzpjdW1zdW1ffSksZGVwdGhUb1NwYWNlPW9wKHtkZXB0aFRvU3BhY2VfOmRlcHRoVG9TcGFjZV99KSxleHBhbmREaW1zPW9wKHtleHBhbmREaW1zXzpleHBhbmREaW1zX30pLGV5ZT1vcCh7ZXllXzpleWVffSksZnJvbVBpeGVscz1vcCh7ZnJvbVBpeGVsc186ZnJvbVBpeGVsc199KSxtdWx0aW5vbWlhbD1vcCh7bXVsdGlub21pYWxfOm11bHRpbm9taWFsX30pLG9uZUhvdD1vcCh7b25lSG90XzpvbmVIb3RffSkscGFkPW9wKHtwYWRfOnBhZF99KSxwYWQxZD1vcCh7cGFkMWRfOnBhZDFkX30pLHBhZDJkPW9wKHtwYWQyZF86cGFkMmRffSkscGFkM2Q9b3Aoe3BhZDNkXzpwYWQzZF99KSxwYWQ0ZD1vcCh7cGFkNGRfOnBhZDRkX30pLHJhbmQ9b3Aoe3JhbmRfOnJhbmRffSkscmFuZG9tTm9ybWFsPW9wKHtyYW5kb21Ob3JtYWxfOnJhbmRvbU5vcm1hbF99KSxyYW5kb21Vbmlmb3JtPW9wKHtyYW5kb21Vbmlmb3JtXzpyYW5kb21Vbmlmb3JtX30pLHJlc2hhcGU9b3Aoe3Jlc2hhcGVfOnJlc2hhcGVffSksc3BhY2VUb0JhdGNoTkQ9b3Aoe3NwYWNlVG9CYXRjaE5EXzpzcGFjZVRvQmF0Y2hORF99KSxzcXVlZXplPW9wKHtzcXVlZXplXzpzcXVlZXplX30pLHN0YWNrPW9wKHtzdGFja186c3RhY2tffSksdGlsZT1vcCh7dGlsZV86dGlsZV99KSx0cnVuY2F0ZWROb3JtYWw9b3Aoe3RydW5jYXRlZE5vcm1hbF86dHJ1bmNhdGVkTm9ybWFsX30pLHVuc3RhY2s9b3Aoe3Vuc3RhY2tfOnVuc3RhY2tffSk7ZnVuY3Rpb24gd2hlcmVJbXBsKGUsdCl7Zm9yKHZhciBuPVtdLHI9MDtyPHQubGVuZ3RoO3IrKyl0W3JdJiZuLnB1c2gocik7dmFyIG89YnVmZmVyKGUsXCJpbnQzMlwiKSxhPWJ1ZmZlcihbbi5sZW5ndGgsZS5sZW5ndGhdLFwiaW50MzJcIik7Zm9yKHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9by5pbmRleFRvTG9jKG5bcl0pLHM9ciplLmxlbmd0aDthLnZhbHVlcy5zZXQoaSxzKX1yZXR1cm4gYS50b1RlbnNvcigpfXZhciBCRUZPUkVfUEFHSU5HX0NPTlNUQU5UPTMwMCxNYXRoQmFja2VuZFdlYkdMPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2lmKHZvaWQgMD09PXQmJih0PSEwKSx0aGlzLmdwZ3B1PWUsdGhpcy5kZWxheWVkU3RvcmFnZT10LHRoaXMucGVuZGluZ1JlYWQ9bmV3IFdlYWtNYXAsdGhpcy5wZW5kaW5nRGlzcG9zYWw9bmV3IFdlYWtTZXQsdGhpcy5scnVEYXRhR1BVPVtdLHRoaXMubnVtQnl0ZXNJbkdQVT0wLHRoaXMudXBsb2FkV2FpdE1zPTAsdGhpcy5kb3dubG9hZFdhaXRNcz0wLHRoaXMuYmluYXJ5Q2FjaGU9e30sdGhpcy5kaXNwb3NlZD0hMSxFTlYuZ2V0KFwiV0VCR0xfVkVSU0lPTlwiKTwxKXRocm93IG5ldyBFcnJvcihcIldlYkdMIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2VcIik7RU5WLmdldChcIklTX0JST1dTRVJcIikmJih0aGlzLmNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpKSxudWxsPT1lPyh0aGlzLmdwZ3B1PW5ldyBHUEdQVUNvbnRleHQoY3JlYXRlV2ViR0xDb250ZXh0KHRoaXMuY2FudmFzKSksdGhpcy5ncGdwdUNyZWF0ZWRMb2NhbGx5PSEwKTp0aGlzLmdwZ3B1Q3JlYXRlZExvY2FsbHk9ITEsRU5WLmdldChcIldFQkdMX1BBR0lOR19FTkFCTEVEXCIpJiYodGhpcy5OVU1fQllURVNfQkVGT1JFX1BBR0lORz13aW5kb3cuc2NyZWVuLmhlaWdodCp3aW5kb3cuc2NyZWVuLndpZHRoKndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKkJFRk9SRV9QQUdJTkdfQ09OU1RBTlQpLHRoaXMudGV4dHVyZU1hbmFnZXI9bmV3IFRleHR1cmVNYW5hZ2VyKHRoaXMuZ3BncHUpfXJldHVybiBlLnByb3RvdHlwZS5yZWdpc3Rlcj1mdW5jdGlvbihlLHQsbil7aWYodGhpcy50ZXhEYXRhLmhhcyhlKSl0aHJvdyBuZXcgRXJyb3IoXCJEYXRhIGJ1ZmZlciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRcIik7dGhpcy50ZXhEYXRhLnNldChlLHtzaGFwZTp0LGR0eXBlOm4sdmFsdWVzOm51bGwsdGV4dHVyZTpudWxsLGNvbXBsZXhUZW5zb3JzOm51bGwsdGV4U2hhcGU6bnVsbCx1c2FnZTpUZXh0dXJlVXNhZ2UuUkVOREVSfSl9LGUucHJvdG90eXBlLnNldERhdGFNb3Zlcj1mdW5jdGlvbihlKXt0aGlzLnRleERhdGE9bmV3IERhdGFTdG9yYWdlKGUpfSxlLnByb3RvdHlwZS5mcm9tUGl4ZWxzPWZ1bmN0aW9uKGUsdCl7aWYobnVsbD09ZSl0aHJvdyBuZXcgRXJyb3IoXCJwaXhlbHMgcGFzc2VkIHRvIHRmLmZyb21QaXhlbHMoKSBjYW4gbm90IGJlIG51bGxcIik7dmFyIG49W2UuaGVpZ2h0LGUud2lkdGhdLHI9W2UuaGVpZ2h0LGUud2lkdGgsdF07aWYoIShlIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudHx8ZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fGUgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8ZSBpbnN0YW5jZW9mIEltYWdlRGF0YSkpdGhyb3cgbmV3IEVycm9yKFwicGl4ZWxzIHBhc3NlZCB0byB0Zi5mcm9tUGl4ZWxzKCkgbXVzdCBiZSBlaXRoZXIgYW4gSFRNTFZpZGVvRWxlbWVudCwgSFRNTEltYWdlRWxlbWVudCwgSFRNTENhbnZhc0VsZW1lbnQgb3IgSW1hZ2VEYXRhLCBidXQgd2FzIFwiK2UuY29uc3RydWN0b3IubmFtZSk7aWYoZSBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQpe2lmKG51bGw9PXRoaXMuZnJvbVBpeGVsc0NhbnZhcyl7aWYoIUVOVi5nZXQoXCJJU19CUk9XU0VSXCIpKXRocm93IG5ldyBFcnJvcihcIkNhbid0IHJlYWQgcGl4ZWxzIGZyb20gSFRNTEltYWdlRWxlbWVudCBvdXRzaWRlIHRoZSBicm93c2VyLlwiKTtpZihcImNvbXBsZXRlXCIhPT1kb2N1bWVudC5yZWFkeVN0YXRlKXRocm93IG5ldyBFcnJvcihcIlRoZSBET00gaXMgbm90IHJlYWR5IHlldC4gUGxlYXNlIGNhbGwgdGYuZnJvbVBpeGVscygpIG9uY2UgdGhlIERPTSBpcyByZWFkeS4gT25lIHdheSB0byBkbyB0aGF0IGlzIHRvIGFkZCBhbiBldmVudCBsaXN0ZW5lciBmb3IgYERPTUNvbnRlbnRMb2FkZWRgIG9uIHRoZSBkb2N1bWVudCBvYmplY3RcIik7dGhpcy5mcm9tUGl4ZWxzQ2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIil9dGhpcy5mcm9tUGl4ZWxzQ2FudmFzLndpZHRoPWUud2lkdGgsdGhpcy5mcm9tUGl4ZWxzQ2FudmFzLmhlaWdodD1lLmhlaWdodCx0aGlzLmZyb21QaXhlbHNDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpLmRyYXdJbWFnZShlLDAsMCxlLndpZHRoLGUuaGVpZ2h0KSxlPXRoaXMuZnJvbVBpeGVsc0NhbnZhc312YXIgbz10aGlzLm1ha2VUZW5zb3JIYW5kbGUobixcImludDMyXCIpO3RoaXMudGV4RGF0YS5nZXQoby5kYXRhSWQpLnVzYWdlPVRleHR1cmVVc2FnZS5QSVhFTFMsdGhpcy5ncGdwdS51cGxvYWRQaXhlbERhdGFUb1RleHR1cmUodGhpcy5nZXRUZXh0dXJlKG8uZGF0YUlkKSxlKTt2YXIgYT1uZXcgRnJvbVBpeGVsc1Byb2dyYW0ociksaT10aGlzLmNvbXBpbGVBbmRSdW4oYSxbb10pO3JldHVybiB0aGlzLmRpc3Bvc2VEYXRhKG8uZGF0YUlkKSxpfSxlLnByb3RvdHlwZS5tYWtlVGVuc29ySGFuZGxlPWZ1bmN0aW9uKGUsdCl7dmFyIG49e307cmV0dXJuIHRoaXMucmVnaXN0ZXIobixlLHQpLHtkYXRhSWQ6bixzaGFwZTplLGR0eXBlOnR9fSxlLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQpe2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKFwiTWF0aEJhY2tlbmRXZWJHTC53cml0ZSgpOiB2YWx1ZXMgY2FuIG5vdCBiZSBudWxsXCIpO3ZhciBuPXRoaXMudGV4RGF0YS5nZXQoZSkscj1uLnRleHR1cmUsbz1uLnRleFNoYXBlLGE9bi51c2FnZTtpZihcImNvbXBsZXg2NFwiPT09bi5kdHlwZSl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3Qgd3JpdGUgdG8gYSBjb21wbGV4NjQgZHR5cGUuIFBsZWFzZSB1c2UgdGYuY29tcGxleChyZWFsLCBpbWFnKS5cIik7bnVsbCE9ciYmKHRoaXMucmVsZWFzZVRleHR1cmUoZSxyLG8sYSksbi50ZXh0dXJlPW51bGwsbi50ZXhTaGFwZT1udWxsKSxuLnVzYWdlPVRleHR1cmVVc2FnZS5VUExPQUQsbi52YWx1ZXM9dCx0aGlzLmRlbGF5ZWRTdG9yYWdlfHx0aGlzLnVwbG9hZFRvR1BVKGUpfSxlLnByb3RvdHlwZS5yZWFkU3luYz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnRleERhdGEuZ2V0KGUpLG49dC52YWx1ZXMscj10LmR0eXBlLG89dC5jb21wbGV4VGVuc29ycztpZihudWxsIT1uKXJldHVybiB0aGlzLmNhY2hlT25DUFUoZSksbjt2YXIgYSxpLHM9bnVsbCE9dGhpcy5hY3RpdmVUaW1lcnM7KHMmJihhPXBlcmZvcm1hbmNlLm5vdygpKSxcImNvbXBsZXg2NFwiPT09cik/aT1tZXJnZVJlYWxBbmRJbWFnQXJyYXlzKG8ucmVhbC5kYXRhU3luYygpLG8uaW1hZy5kYXRhU3luYygpKTppPXRoaXMuZ2V0VmFsdWVzRnJvbVRleHR1cmUoZSk7cmV0dXJuIHMmJih0aGlzLmRvd25sb2FkV2FpdE1zKz1wZXJmb3JtYW5jZS5ub3coKS1hKSx0aGlzLmNhY2hlT25DUFUoZSxpKSx0LnZhbHVlc30sZS5wcm90b3R5cGUucmVhZD1mdW5jdGlvbihlKXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciB0LG4scixvLGEsaSxzLHU7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24obCl7c3dpdGNoKGwubGFiZWwpe2Nhc2UgMDppZih0aGlzLnBlbmRpbmdSZWFkLmhhcyhlKSlyZXR1cm4gdD10aGlzLnBlbmRpbmdSZWFkLmdldChlKSxbMixuZXcgUHJvbWlzZShmdW5jdGlvbihlKXtyZXR1cm4gdC5wdXNoKGUpfSldO2lmKG49dGhpcy50ZXhEYXRhLmdldChlKSxyPW4udGV4dHVyZSxvPW4udmFsdWVzLGE9bi50ZXhTaGFwZSxudWxsIT1vKXJldHVybiB0aGlzLmNhY2hlT25DUFUoZSksWzIsb107aWYodGhpcy5wZW5kaW5nUmVhZC5zZXQoZSxbXSksIUVOVi5nZXQoXCJXRUJHTF9ET1dOTE9BRF9GTE9BVF9FTkFCTEVEXCIpJiYyPT09RU5WLmdldChcIldFQkdMX1ZFUlNJT05cIikpdGhyb3cgbmV3IEVycm9yKFwidGVuc29yLmRhdGEoKSB3aXRoIFdFQkdMX0RPV05MT0FEX0ZMT0FUX0VOQUJMRUQ9ZmFsc2UgYW5kIFdFQkdMX1ZFUlNJT049MiBub3QgeWV0IHN1cHBvcnRlZC5cIik7cmV0dXJuIGk9dGhpcy5ncGdwdS5tYXliZUNyZWF0ZUJ1ZmZlckZyb21UZXh0dXJlKHIsYVswXSxhWzFdKSxbNCx0aGlzLmdwZ3B1LmNyZWF0ZUFuZFdhaXRGb3JGZW5jZSgpXTtjYXNlIDE6cmV0dXJuIGwuc2VudCgpLHM9aSBpbnN0YW5jZW9mIFdlYkdMVGV4dHVyZT90aGlzLmdldFZhbHVlc0Zyb21UZXh0dXJlKGUpOnRoaXMuZ3BncHUuZG93bmxvYWRGbG9hdDMyTWF0cml4RnJvbUJ1ZmZlcihpLGFbMF0sYVsxXSksdGhpcy5jYWNoZU9uQ1BVKGUscyksdT10aGlzLnBlbmRpbmdSZWFkLmdldChlKSx0aGlzLnBlbmRpbmdSZWFkLmRlbGV0ZShlKSx1LmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUocyl9KSx0aGlzLnBlbmRpbmdEaXNwb3NhbC5oYXMoZSkmJih0aGlzLnBlbmRpbmdEaXNwb3NhbC5kZWxldGUoZSksdGhpcy5kaXNwb3NlRGF0YShlKSksWzIsc119fSl9KX0sZS5wcm90b3R5cGUuZ2V0VmFsdWVzRnJvbVRleHR1cmU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy50ZXhEYXRhLmdldChlKSxuPXQuc2hhcGUscj10LmR0eXBlLG89dC50ZXh0dXJlLGE9dC50ZXhTaGFwZTtpZihFTlYuZ2V0KFwiV0VCR0xfRE9XTkxPQURfRkxPQVRfRU5BQkxFRFwiKSlyZXR1cm4gdGhpcy50ZXhEYXRhLmdldChlKS51c2FnZT09PVRleHR1cmVVc2FnZS5QQUNLP3RoaXMuZ3BncHUuZG93bmxvYWRNYXRyaXhGcm9tUGFja2VkVGV4dHVyZShvLG4sYVswXSxhWzFdKTp0aGlzLmdwZ3B1LmRvd25sb2FkRmxvYXQzMk1hdHJpeEZyb21PdXRwdXRUZXh0dXJlKG8sYVswXSxhWzFdKTt2YXIgaT10aGlzLm1ha2VUZW5zb3JIYW5kbGUobixcImZsb2F0MzJcIik7aS5zaXplPXNpemVGcm9tU2hhcGUobiksdGhpcy50ZXhEYXRhLmdldChpLmRhdGFJZCkudXNhZ2U9VGV4dHVyZVVzYWdlLkRPV05MT0FEO3ZhciBzPW5ldyBFbmNvZGVGbG9hdFByb2dyYW0obik7dGhpcy5jb21waWxlQW5kUnVuKHMsW3tzaGFwZTpuLGR0eXBlOnIsZGF0YUlkOmV9XSxpLG51bGwsITEpO3ZhciB1PXRoaXMudGV4RGF0YS5nZXQoaS5kYXRhSWQpLGw9dGhpcy5ncGdwdS5kb3dubG9hZEJ5dGVFbmNvZGVkRmxvYXRNYXRyaXhGcm9tT3V0cHV0VGV4dHVyZSh1LnRleHR1cmUsdS50ZXhTaGFwZVswXSx1LnRleFNoYXBlWzFdKTtyZXR1cm4gdGhpcy5kaXNwb3NlRGF0YShpLmRhdGFJZCksbH0sZS5wcm90b3R5cGUudGltZT1mdW5jdGlvbihlKXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciB0LG4scixvLGEsaTtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihzKXtzd2l0Y2gocy5sYWJlbCl7Y2FzZSAwOnJldHVybiB0PXRoaXMuYWN0aXZlVGltZXJzLG49W10scj0hMSxudWxsPT10aGlzLnByb2dyYW1UaW1lcnNTdGFjaz8odGhpcy5wcm9ncmFtVGltZXJzU3RhY2s9bixyPSEwKTp0aGlzLmFjdGl2ZVRpbWVycy5wdXNoKG4pLHRoaXMuYWN0aXZlVGltZXJzPW4sZSgpLG89ZmxhdHRlbih0aGlzLmFjdGl2ZVRpbWVycyksdGhpcy5hY3RpdmVUaW1lcnM9dCxyJiYodGhpcy5wcm9ncmFtVGltZXJzU3RhY2s9bnVsbCksWzQsUHJvbWlzZS5hbGwobykudGhlbihmdW5jdGlvbihlKXt2YXIgdD0wO3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIHQrPWV9KSx0fSldO2Nhc2UgMTpyZXR1cm4gYT1zLnNlbnQoKSxpPXt1cGxvYWRXYWl0TXM6dGhpcy51cGxvYWRXYWl0TXMsZG93bmxvYWRXYWl0TXM6dGhpcy5kb3dubG9hZFdhaXRNcyxrZXJuZWxNczphLHdhbGxNczpudWxsfSx0aGlzLnVwbG9hZFdhaXRNcz0wLHRoaXMuZG93bmxvYWRXYWl0TXM9MCxbMixpXX19KX0pfSxlLnByb3RvdHlwZS5tZW1vcnk9ZnVuY3Rpb24oKXtyZXR1cm57dW5yZWxpYWJsZTohMSxudW1CeXRlc0luR1BVOnRoaXMubnVtQnl0ZXNJbkdQVX19LGUucHJvdG90eXBlLnN0YXJ0VGltZXI9ZnVuY3Rpb24oKXtyZXR1cm4gRU5WLmdldChcIldFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9WRVJTSU9OXCIpPjA/dGhpcy5ncGdwdS5iZWdpblF1ZXJ5KCk6e3N0YXJ0TXM6cGVyZm9ybWFuY2Uubm93KCksZW5kTXM6bnVsbH19LGUucHJvdG90eXBlLmVuZFRpbWVyPWZ1bmN0aW9uKGUpe3JldHVybiBFTlYuZ2V0KFwiV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT05cIik+MD8odGhpcy5ncGdwdS5lbmRRdWVyeSgpLGUpOihlLmVuZE1zPXBlcmZvcm1hbmNlLm5vdygpLGUpfSxlLnByb3RvdHlwZS5nZXRRdWVyeVRpbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihuKXtyZXR1cm4gRU5WLmdldChcIldFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9WRVJTSU9OXCIpPjA/WzIsdGhpcy5ncGdwdS53YWl0Rm9yUXVlcnlBbmRHZXRUaW1lKGUpXTpbMiwodD1lKS5lbmRNcy10LnN0YXJ0TXNdfSl9KX0sZS5wcm90b3R5cGUuZGlzcG9zZURhdGE9ZnVuY3Rpb24oZSl7aWYoIXRoaXMucGVuZGluZ0Rpc3Bvc2FsLmhhcyhlKSlpZih0aGlzLnBlbmRpbmdSZWFkLmhhcyhlKSl0aGlzLnBlbmRpbmdEaXNwb3NhbC5hZGQoZSk7ZWxzZSBpZih0aGlzLnRleERhdGEuaGFzKGUpKXt2YXIgdD10aGlzLnRleERhdGEuZ2V0KGUpLG49dC50ZXh0dXJlLHI9dC50ZXhTaGFwZSxvPXQudXNhZ2UsYT10LmNvbXBsZXhUZW5zb3JzO251bGwhPW4mJnRoaXMucmVsZWFzZVRleHR1cmUoZSxuLHIsbyksbnVsbCE9YSYmKGEucmVhbC5kaXNwb3NlKCksYS5pbWFnLmRpc3Bvc2UoKSksdGhpcy50ZXhEYXRhLmRlbGV0ZShlKX19LGUucHJvdG90eXBlLmdldFRleHR1cmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudXBsb2FkVG9HUFUoZSksdGhpcy50ZXhEYXRhLmdldChlKS50ZXh0dXJlfSxlLnByb3RvdHlwZS5nZXRHUEdQVUNvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ncGdwdX0sZS5wcm90b3R5cGUuZ2V0Q2FudmFzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FudmFzfSxlLnByb3RvdHlwZS5jb21wbGV4PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5tYWtlT3V0cHV0QXJyYXkoZS5zaGFwZSxcImNvbXBsZXg2NFwiKTtyZXR1cm4gdGhpcy50ZXhEYXRhLmdldChuLmRhdGFJZCkuY29tcGxleFRlbnNvcnM9e3JlYWw6RU5WLmVuZ2luZS5rZWVwKGUuY2xvbmUoKSksaW1hZzpFTlYuZW5naW5lLmtlZXAodC5jbG9uZSgpKX0sbn0sZS5wcm90b3R5cGUucmVhbD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50ZXhEYXRhLmdldChlLmRhdGFJZCkuY29tcGxleFRlbnNvcnMucmVhbC5jbG9uZSgpfSxlLnByb3RvdHlwZS5pbWFnPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRleERhdGEuZ2V0KGUuZGF0YUlkKS5jb21wbGV4VGVuc29ycy5pbWFnLmNsb25lKCl9LGUucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uZXcgU2xpY2VQcm9ncmFtKG4pLG89ci5nZXRDdXN0b21TZXR1cEZ1bmModCk7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bihyLFtlXSxudWxsLG8pfSxlLnByb3RvdHlwZS5zdHJpZGVkU2xpY2U9ZnVuY3Rpb24oZSx0LG4scixvLGEsaSxzLHUpe3ZhciBsPWdldFN0cmlkZWRTbGljZWRJbmZvKGUuc2hhcGUsdCxuLHIsbyxhLGkscyx1KSxjPWxbMF0scD1sWzFdLGQ9bFsyXSxoPXAuZmlsdGVyKGZ1bmN0aW9uKGUsdCl7cmV0dXJuLTE9PT1kLmluZGV4T2YodCl9KTtpZihoLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT1lfSkpcmV0dXJuIHRlbnNvcihbXSxoKTt2YXIgZj1uZXcgU3RyaWRlZFNsaWNlUHJvZ3JhbShjLHIscCxkKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKGYsW2VdKX0sZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBSZXZlcnNlUHJvZ3JhbShlLnNoYXBlLHQpO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4obixbZV0pfSxlLnByb3RvdHlwZS5jb25jYXQyVGVuc29ycz1mdW5jdGlvbihlLHQsbil7dmFyIHI9Y29tcHV0ZU91dFNoYXBlKFtlLnNoYXBlLHQuc2hhcGVdLG4pLG89ZS5hczJEKC0xLHNpemVGcm9tU2hhcGUoZS5zaGFwZS5zbGljZShuKSkpLGE9dC5hczJEKC0xLHNpemVGcm9tU2hhcGUodC5zaGFwZS5zbGljZShuKSkpLGk9bmV3IENvbmNhdFByb2dyYW0oby5zaGFwZSxhLnNoYXBlKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKGksW28sYV0pLnJlc2hhcGUocil9LGUucHJvdG90eXBlLmNvbmNhdD1mdW5jdGlvbihlLHQpe2lmKDE9PT1lLmxlbmd0aClyZXR1cm4gZVswXTtmb3IodmFyIG49ZVswXSxyPTE7cjxlLmxlbmd0aDsrK3Ipbj10aGlzLmNvbmNhdDJUZW5zb3JzKG4sZVtyXSx0KTtyZXR1cm4gbn0sZS5wcm90b3R5cGUubmVnPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBVbmFyeU9wUHJvZ3JhbShlLnNoYXBlLE5FRyk7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bih0LFtlXSl9LGUucHJvdG90eXBlLmJhdGNoTWF0TXVsPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPW4/ZS5zaGFwZVsyXTplLnNoYXBlWzFdLGE9cj90LnNoYXBlWzFdOnQuc2hhcGVbMl07aWYoMT09PWUuc2hhcGVbMF0mJjE9PT10LnNoYXBlWzBdKXt2YXIgaT1lLmFzMkQoZS5zaGFwZVsxXSxlLnNoYXBlWzJdKSxzPXQuYXMyRCh0LnNoYXBlWzFdLHQuc2hhcGVbMl0pLHU9bmV3IFBhY2tQcm9ncmFtKGkuc2hhcGUpLGw9dGhpcy5jb21waWxlQW5kUnVuKHUsW2ldLHRoaXMubWFrZVBhY2tlZFRlbnNvcihpLnNoYXBlKSksYz1uZXcgUGFja1Byb2dyYW0ocy5zaGFwZSkscD10aGlzLmNvbXBpbGVBbmRSdW4oYyxbc10sdGhpcy5tYWtlUGFja2VkVGVuc29yKHMuc2hhcGUpKSxkPW5ldyBNYXRNdWxQYWNrZWRQcm9ncmFtKGwuc2hhcGUscC5zaGFwZSxbbyxhXSxuLHIpLGg9dGhpcy5jb21waWxlQW5kUnVuKGQsW2wscF0sdGhpcy5tYWtlUGFja2VkVGVuc29yKGQub3V0cHV0U2hhcGUpKSxmPW5ldyBVbnBhY2tQcm9ncmFtKGguc2hhcGUpLG09dGhpcy5jb21waWxlQW5kUnVuKGYsW2hdKTtyZXR1cm4gbC5kaXNwb3NlKCkscC5kaXNwb3NlKCksaC5kaXNwb3NlKCksbS5yZXNoYXBlKFsxLGguc2hhcGVbMF0saC5zaGFwZVsxXV0pfXJldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4obmV3IE1hdE11bFByb2dyYW0oZS5zaGFwZSx0LnNoYXBlLG4sciksW2UsdF0pfSxlLnByb3RvdHlwZS5tdWx0aXBseT1mdW5jdGlvbihlLHQpe2lmKFwiY29tcGxleDY0XCI9PT1lLmR0eXBlKXt2YXIgbj10aGlzLnRleERhdGEuZ2V0KGUuZGF0YUlkKSxyPXRoaXMudGV4RGF0YS5nZXQodC5kYXRhSWQpLG89bmV3IEJpbmFyeU9wQ29tcGxleFByb2dyYW0oQ09NUExFWF9NVUxUSVBMWS5SRUFMLGUuc2hhcGUsdC5zaGFwZSksYT1uZXcgQmluYXJ5T3BDb21wbGV4UHJvZ3JhbShDT01QTEVYX01VTFRJUExZLklNQUcsZS5zaGFwZSx0LnNoYXBlKSxpPVt0aGlzLm1ha2VDb21wbGV4Q29tcG9uZW50VGVuc29ySGFuZGxlKGUsbi5jb21wbGV4VGVuc29ycy5yZWFsKSx0aGlzLm1ha2VDb21wbGV4Q29tcG9uZW50VGVuc29ySGFuZGxlKGUsbi5jb21wbGV4VGVuc29ycy5pbWFnKSx0aGlzLm1ha2VDb21wbGV4Q29tcG9uZW50VGVuc29ySGFuZGxlKHQsci5jb21wbGV4VGVuc29ycy5yZWFsKSx0aGlzLm1ha2VDb21wbGV4Q29tcG9uZW50VGVuc29ySGFuZGxlKHQsci5jb21wbGV4VGVuc29ycy5pbWFnKV0scz10aGlzLmNvbXBpbGVBbmRSdW4obyxpKSx1PXRoaXMuY29tcGlsZUFuZFJ1bihhLGkpLGw9dGhpcy5jb21wbGV4KHMsdSk7cmV0dXJuIHMuZGlzcG9zZSgpLHUuZGlzcG9zZSgpLGx9dmFyIGM9bmV3IEJpbmFyeU9wUHJvZ3JhbShNVUwsZS5zaGFwZSx0LnNoYXBlKSxwPXRoaXMubWFrZU91dHB1dEFycmF5KGMub3V0cHV0U2hhcGUsZS5kdHlwZSk7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bihjLFtlLHRdLHApfSxlLnByb3RvdHlwZS5iYXRjaE5vcm1hbGl6YXRpb249ZnVuY3Rpb24oZSx0LG4scixvLGEpe3ZhciBpPVtlLHQsbl0scz1udWxsO251bGwhPWEmJihzPWEuc2hhcGUsaS5wdXNoKGEpKTt2YXIgdT1udWxsO251bGwhPW8mJih1PW8uc2hhcGUsaS5wdXNoKG8pKTt2YXIgbD1uZXcgQmF0Y2hOb3JtUHJvZ3JhbShlLnNoYXBlLHQuc2hhcGUsbi5zaGFwZSxzLHUscik7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bihsLGkpfSxlLnByb3RvdHlwZS5sb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbjREPWZ1bmN0aW9uKGUsdCxuLHIsbyl7dmFyIGE9bmV3IExSTlByb2dyYW0oZS5zaGFwZSx0LG4scixvKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKGEsW2VdKX0sZS5wcm90b3R5cGUuTFJOR3JhZD1mdW5jdGlvbihlLHQsbixyLG8sYSxpKXt2YXIgcz1uZXcgTFJOR3JhZFByb2dyYW0odC5zaGFwZSxyLG8sYSxpKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKHMsW3QsbixlXSl9LGUucHJvdG90eXBlLnRpbGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgVGlsZVByb2dyYW0oZS5zaGFwZSx0KTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKG4sW2VdKX0sZS5wcm90b3R5cGUucGFkPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uZXcgUGFkUHJvZ3JhbShlLnNoYXBlLHQsbik7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bihyLFtlXSl9LGUucHJvdG90eXBlLnRyYW5zcG9zZT1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBUcmFuc3Bvc2VQcm9ncmFtKGUuc2hhcGUsdCk7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bihuLFtlXSl9LGUucHJvdG90eXBlLmdhdGhlcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9bmV3IEdhdGhlclByb2dyYW0oZS5zaGFwZSx0LnNpemUsbik7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bihyLFtlLHRdKX0sZS5wcm90b3R5cGUuYmF0Y2hUb1NwYWNlTkQ9ZnVuY3Rpb24oZSx0LG4pe2Fzc2VydChlLnJhbms8PTQsXCJiYXRjaFRvU3BhY2VORCBmb3IgcmFuayA+IDQgd2l0aCBhIFdlYkdMIGJhY2tlbmQgbm90IGltcGxlbWVudGVkIHlldFwiKTt2YXIgcj10LnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlKnR9KSxvPWdldFJlc2hhcGVkKGUuc2hhcGUsdCxyKSxhPWdldFBlcm11dGVkKG8ubGVuZ3RoLHQubGVuZ3RoKSxpPWdldFJlc2hhcGVkUGVybXV0ZWQoZS5zaGFwZSx0LHIpLHM9Z2V0U2xpY2VCZWdpbkNvb3JkcyhuLHQubGVuZ3RoKSx1PWdldFNsaWNlU2l6ZShpLG4sdC5sZW5ndGgpO3JldHVybiBlLnJlc2hhcGUobykudHJhbnNwb3NlKGEpLnJlc2hhcGUoaSkuc2xpY2Uocyx1KX0sZS5wcm90b3R5cGUuc3BhY2VUb0JhdGNoTkQ9ZnVuY3Rpb24oZSx0LG4pe2Fzc2VydChlLnJhbms8PTQsXCJzcGFjZVRvQmF0Y2hORCBmb3IgcmFuayA+IDQgd2l0aCBhIFdlYkdMIGJhY2tlbmQgbm90IGltcGxlbWVudGVkIHlldFwiKTt2YXIgcj10LnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlKnR9KSxvPVtbMCwwXV07by5wdXNoLmFwcGx5KG8sbik7Zm9yKHZhciBhPTErdC5sZW5ndGg7YTxlLnNoYXBlLmxlbmd0aDsrK2Epby5wdXNoKFswLDBdKTt2YXIgaT1lLnBhZChvKSxzPWdldFJlc2hhcGVkKGkuc2hhcGUsdCxyLCExKSx1PWdldFBlcm11dGVkKHMubGVuZ3RoLHQubGVuZ3RoLCExKSxsPWdldFJlc2hhcGVkUGVybXV0ZWQoaS5zaGFwZSx0LHIsITEpO3JldHVybiBpLnJlc2hhcGUocykudHJhbnNwb3NlKHUpLnJlc2hhcGUobCl9LGUucHJvdG90eXBlLnJlZHVjZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5zaGFwZVswXSxvPWUuc2hhcGVbMV0sYT1jb21wdXRlT3B0aW1hbFdpbmRvd1NpemUobyksaT1uZXcgUmVkdWNlUHJvZ3JhbSh7d2luZG93U2l6ZTphLGluU2l6ZTpvLGJhdGNoU2l6ZTpyfSx0KSxzPWkub3V0cHV0U2hhcGUsdT1zWzBdLGw9c1sxXSxjPXRoaXMubWFrZU91dHB1dEFycmF5KFt1LGxdLG4pO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4oaSxbZV0sYyksMT09PWMuc2hhcGVbMV0/Yzp0aGlzLnJlZHVjZShjLHQsbil9LGUucHJvdG90eXBlLmFyZ1JlZHVjZT1mdW5jdGlvbihlLHQsbil7dm9pZCAwPT09biYmKG49bnVsbCk7dmFyIHI9ZS5zaGFwZVswXSxvPWUuc2hhcGVbMV07bnVsbCE9biYmKHI9bi5zaGFwZVswXSxvPW4uc2hhcGVbMV0pO3ZhciBhPWNvbXB1dGVPcHRpbWFsV2luZG93U2l6ZShvKSxpPW5ldyBBcmdNaW5NYXhQcm9ncmFtKHt3aW5kb3dTaXplOmEsaW5TaXplOm8sYmF0Y2hTaXplOnJ9LHQsbnVsbD09bikscz1pLm91dHB1dFNoYXBlLHU9c1swXSxsPXNbMV0sYz10aGlzLm1ha2VPdXRwdXRBcnJheShbdSxsXSxcImludDMyXCIpLHA9W2VdO3JldHVybiBudWxsIT1uJiZwLnB1c2gobiksdGhpcy5jb21waWxlQW5kUnVuKGkscCxjKSwxPT09Yy5zaGFwZVsxXT9jOnRoaXMuYXJnUmVkdWNlKGUsdCxjKX0sZS5wcm90b3R5cGUuc3VtPWZ1bmN0aW9uKGUsdCl7YXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoXCJzdW1cIix0LGUucmFuayk7dmFyIG49Y29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhlLnNoYXBlLHQpLHI9blswXSxvPXNpemVGcm9tU2hhcGUoblsxXSksYT1lLmFzMkQoLTEsbyksaT1zdW1PdXRUeXBlKGUuZHR5cGUpO3JldHVybiB0aGlzLnJlZHVjZShhLFwic3VtXCIsaSkucmVzaGFwZShyKX0sZS5wcm90b3R5cGUucHJvZD1mdW5jdGlvbihlLHQpe3ZhciBuPWNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoZS5zaGFwZSx0KSxyPW5bMF0sbz1zaXplRnJvbVNoYXBlKG5bMV0pLGE9ZS5hczJEKC0xLG8pLGk9c3VtT3V0VHlwZShlLmR0eXBlKTtyZXR1cm4gdGhpcy5yZWR1Y2UoYSxcInByb2RcIixpKS5yZXNoYXBlKHIpfSxlLnByb3RvdHlwZS51bnNvcnRlZFNlZ21lbnRTdW09ZnVuY3Rpb24oZSx0LG4pe3ZhciByPTAsbz1nZXRBeGVzUGVybXV0YXRpb24oW3JdLGUucmFuayksYT1lO251bGwhPW8mJihhPWUudHJhbnNwb3NlKG8pLHI9Z2V0SW5uZXJNb3N0QXhlcygxLGUucmFuaylbMF0pO3ZhciBpPWNvbXB1dGVPdXRTaGFwZSQxKGEuc2hhcGUscixuKSxzPXNpemVGcm9tU2hhcGUoW2Euc2hhcGVbcl1dKSx1PWEuYXMyRCgtMSxzKSxsPXN1bU91dFR5cGUoZS5kdHlwZSksYz10aGlzLnNlZ09wQ29tcHV0ZSh1LFwidW5zb3J0ZWRTZWdtZW50U3VtXCIsdCxsLG4pLnJlc2hhcGUoaSk7cmV0dXJuIG51bGwhPW8mJihjPWMudHJhbnNwb3NlKGdldFVuZG9BeGVzUGVybXV0YXRpb24obykpKSxjfSxlLnByb3RvdHlwZS5zZWdPcENvbXB1dGU9ZnVuY3Rpb24oZSx0LG4scixvKXt2YXIgYT1lLnNoYXBlWzBdLGk9ZS5zaGFwZVsxXSxzPXNlZ09wQ29tcHV0ZU9wdGltYWxXaW5kb3dTaXplKGksbyksdT1uZXcgU2VnbWVudE9wUHJvZ3JhbSh7d2luZG93U2l6ZTpzLGluU2l6ZTppLGJhdGNoU2l6ZTphLG51bVNlZ21lbnRzOm99LHQpLGw9dS5vdXRwdXRTaGFwZSxjPWxbMF0scD1sWzFdLGQ9dGhpcy5tYWtlT3V0cHV0QXJyYXkoW2MscF0scik7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bih1LFtlLG5dLGQpLGQuc2hhcGVbMV09PT1vP2Q6KG49cmFuZ2UoMCxvKS50aWxlKFtpL3NdKSx0aGlzLnNlZ09wQ29tcHV0ZShkLHQsbixyLG8pKX0sZS5wcm90b3R5cGUuYXJnTWluPWZ1bmN0aW9uKGUsdCl7dmFyIG49W3RdO2Fzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKFwiYXJnTWluXCIsbixlLnJhbmspO3ZhciByPWNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoZS5zaGFwZSxuKSxvPXJbMF0sYT1zaXplRnJvbVNoYXBlKHJbMV0pLGk9ZS5hczJEKC0xLGEpO3JldHVybiB0aGlzLmFyZ1JlZHVjZShpLFwibWluXCIpLnJlc2hhcGUobyl9LGUucHJvdG90eXBlLmFyZ01heD1mdW5jdGlvbihlLHQpe3ZhciBuPVt0XTthc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcyhcImFyZ01heFwiLG4sZS5yYW5rKTt2YXIgcj1jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKGUuc2hhcGUsbiksbz1yWzBdLGE9c2l6ZUZyb21TaGFwZShyWzFdKSxpPWUuYXMyRCgtMSxhKTtyZXR1cm4gdGhpcy5hcmdSZWR1Y2UoaSxcIm1heFwiKS5yZXNoYXBlKG8pfSxlLnByb3RvdHlwZS5jdW1zdW09ZnVuY3Rpb24oZSx0LG4scil7aWYodCE9PWUucmFuay0xKXRocm93IG5ldyBFcnJvcihcIldlYkdMIGN1bXN1bSBzaGFkZXIgZXhwZWN0cyBhbiBpbm5lci1tb3N0IGF4aXM9XCIrKGUucmFuay0xKStcIiBidXQgZ290IGF4aXM9XCIrdCk7dmFyIG89bmV3IEN1bVN1bVByb2dyYW0oZS5zaGFwZSxuLHIpO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4obyxbZV0pfSxlLnByb3RvdHlwZS5lcXVhbD1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBCaW5hcnlPcFByb2dyYW0oRVFVQUwsZS5zaGFwZSx0LnNoYXBlKSxyPXRoaXMubWFrZU91dHB1dEFycmF5KG4ub3V0cHV0U2hhcGUsXCJib29sXCIpO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4obixbZSx0XSxyKX0sZS5wcm90b3R5cGUubm90RXF1YWw9ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgQmluYXJ5T3BQcm9ncmFtKE5PVF9FUVVBTCxlLnNoYXBlLHQuc2hhcGUpLHI9dGhpcy5tYWtlT3V0cHV0QXJyYXkobi5vdXRwdXRTaGFwZSxcImJvb2xcIik7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bihuLFtlLHRdLHIpfSxlLnByb3RvdHlwZS5sZXNzPWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IEJpbmFyeU9wUHJvZ3JhbShMRVNTLGUuc2hhcGUsdC5zaGFwZSkscj10aGlzLm1ha2VPdXRwdXRBcnJheShuLm91dHB1dFNoYXBlLFwiYm9vbFwiKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKG4sW2UsdF0scil9LGUucHJvdG90eXBlLmxlc3NFcXVhbD1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBCaW5hcnlPcFByb2dyYW0oTEVTU19FUVVBTCxlLnNoYXBlLHQuc2hhcGUpLHI9dGhpcy5tYWtlT3V0cHV0QXJyYXkobi5vdXRwdXRTaGFwZSxcImJvb2xcIik7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bihuLFtlLHRdLHIpfSxlLnByb3RvdHlwZS5ncmVhdGVyPWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IEJpbmFyeU9wUHJvZ3JhbShHUkVBVEVSLGUuc2hhcGUsdC5zaGFwZSkscj10aGlzLm1ha2VPdXRwdXRBcnJheShuLm91dHB1dFNoYXBlLFwiYm9vbFwiKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKG4sW2UsdF0scil9LGUucHJvdG90eXBlLmdyZWF0ZXJFcXVhbD1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBCaW5hcnlPcFByb2dyYW0oR1JFQVRFUl9FUVVBTCxlLnNoYXBlLHQuc2hhcGUpLHI9dGhpcy5tYWtlT3V0cHV0QXJyYXkobi5vdXRwdXRTaGFwZSxcImJvb2xcIik7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bihuLFtlLHRdLHIpfSxlLnByb3RvdHlwZS5sb2dpY2FsTm90PWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBVbmFyeU9wUHJvZ3JhbShlLnNoYXBlLExPR0lDQUxfTk9UKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKHQsW2VdKX0sZS5wcm90b3R5cGUubG9naWNhbEFuZD1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBCaW5hcnlPcFByb2dyYW0oTE9HSUNBTF9BTkQsZS5zaGFwZSx0LnNoYXBlKSxyPXRoaXMubWFrZU91dHB1dEFycmF5KG4ub3V0cHV0U2hhcGUsXCJib29sXCIpO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4obixbZSx0XSxyKX0sZS5wcm90b3R5cGUubG9naWNhbE9yPWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IEJpbmFyeU9wUHJvZ3JhbShMT0dJQ0FMX09SLGUuc2hhcGUsdC5zaGFwZSkscj10aGlzLm1ha2VPdXRwdXRBcnJheShuLm91dHB1dFNoYXBlLFwiYm9vbFwiKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKG4sW2UsdF0scil9LGUucHJvdG90eXBlLnNlbGVjdD1mdW5jdGlvbihlLHQsbil7dmFyIHI9bmV3IFNlbGVjdFByb2dyYW0oZS5yYW5rLHQuc2hhcGUsdC5yYW5rKSxvPXRoaXMubWFrZU91dHB1dEFycmF5KHIub3V0cHV0U2hhcGUsdXBjYXN0VHlwZSh0LmR0eXBlLG4uZHR5cGUpKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKHIsW2UsdCxuXSxvKX0sZS5wcm90b3R5cGUud2hlcmU9ZnVuY3Rpb24oZSl7d2FybihcInRmLndoZXJlKCkgaW4gd2ViZ2wgbG9ja3MgdGhlIFVJIHRocmVhZC4gQ2FsbCB0Zi53aGVyZUFzeW5jKCkgaW5zdGVhZFwiKTt2YXIgdD1lLmRhdGFTeW5jKCk7cmV0dXJuIHdoZXJlSW1wbChlLnNoYXBlLHQpfSxlLnByb3RvdHlwZS50b3BrPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdG9wa0ltcGwoZS5kYXRhU3luYygpLGUuc2hhcGUsZS5kdHlwZSx0LG4pfSxlLnByb3RvdHlwZS5taW49ZnVuY3Rpb24oZSx0KXthc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcyhcIm1pblwiLHQsZS5yYW5rKTt2YXIgbj1jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKGUuc2hhcGUsdCkscj1uWzBdLG89c2l6ZUZyb21TaGFwZShuWzFdKSxhPWUuYXMyRCgtMSxvKTtyZXR1cm4gdGhpcy5yZWR1Y2UoYSxcIm1pblwiLGEuZHR5cGUpLnJlc2hhcGUocil9LGUucHJvdG90eXBlLm1pbmltdW09ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgQmluYXJ5T3BQcm9ncmFtKE1JTixlLnNoYXBlLHQuc2hhcGUpO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4obixbZSx0XSl9LGUucHJvdG90eXBlLm1vZD1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBCaW5hcnlPcFByb2dyYW0oTU9ELGUuc2hhcGUsdC5zaGFwZSkscj1uLmdldEN1c3RvbVNldHVwRnVuYygpO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4obixbZSx0XSxudWxsLHIpfSxlLnByb3RvdHlwZS5tYXg9ZnVuY3Rpb24oZSx0KXthc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcyhcIm1heFwiLHQsZS5yYW5rKTt2YXIgbj1jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKGUuc2hhcGUsdCkscj1uWzBdLG89c2l6ZUZyb21TaGFwZShuWzFdKSxhPWUuYXMyRCgtMSxvKTtyZXR1cm4gdGhpcy5yZWR1Y2UoYSxcIm1heFwiLGEuZHR5cGUpLnJlc2hhcGUocil9LGUucHJvdG90eXBlLm1heGltdW09ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgQmluYXJ5T3BQcm9ncmFtKE1BWCxlLnNoYXBlLHQuc2hhcGUpO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4obixbZSx0XSl9LGUucHJvdG90eXBlLmFsbD1mdW5jdGlvbihlLHQpe2Fzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKFwiYWxsXCIsdCxlLnJhbmspO3ZhciBuPWNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoZS5zaGFwZSx0KSxyPW5bMF0sbz1zaXplRnJvbVNoYXBlKG5bMV0pLGE9ZS5hczJEKC0xLG8pO3JldHVybiB0aGlzLnJlZHVjZShhLFwiYWxsXCIsYS5kdHlwZSkucmVzaGFwZShyKX0sZS5wcm90b3R5cGUuYW55PWZ1bmN0aW9uKGUsdCl7YXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoXCJhbnlcIix0LGUucmFuayk7dmFyIG49Y29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhlLnNoYXBlLHQpLHI9blswXSxvPXNpemVGcm9tU2hhcGUoblsxXSksYT1lLmFzMkQoLTEsbyk7cmV0dXJuIHRoaXMucmVkdWNlKGEsXCJhbnlcIixhLmR0eXBlKS5yZXNoYXBlKHIpfSxlLnByb3RvdHlwZS5zcXVhcmVkRGlmZmVyZW5jZT1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBCaW5hcnlPcFByb2dyYW0oU1FVQVJFRF9ESUZGRVJFTkNFLGUuc2hhcGUsdC5zaGFwZSk7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bihuLFtlLHRdKX0sZS5wcm90b3R5cGUucmVhbERpdmlkZT1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBCaW5hcnlPcFByb2dyYW0oRElWLGUuc2hhcGUsdC5zaGFwZSkscj10aGlzLm1ha2VPdXRwdXRBcnJheShuLm91dHB1dFNoYXBlLFwiZmxvYXQzMlwiKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKG4sW2UsdF0scil9LGUucHJvdG90eXBlLmZsb29yRGl2PWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IEJpbmFyeU9wUHJvZ3JhbShJTlRfRElWLGUuc2hhcGUsdC5zaGFwZSkscj10aGlzLm1ha2VPdXRwdXRBcnJheShuLm91dHB1dFNoYXBlLFwiaW50MzJcIik7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bihuLFtlLHRdLHIpfSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oZSx0KXtpZihcImNvbXBsZXg2NFwiPT09ZS5kdHlwZSYmXCJjb21wbGV4NjRcIj09PXQuZHR5cGUpcmV0dXJuIHRoaXMuY29tcGxleFNlcGFyYWJsZUJpbmFyeU9wKGUsdCxBREQpO3ZhciBuPW5ldyBCaW5hcnlPcFByb2dyYW0oQURELGUuc2hhcGUsdC5zaGFwZSkscj10aGlzLm1ha2VPdXRwdXRBcnJheShuLm91dHB1dFNoYXBlLHVwY2FzdFR5cGUoZS5kdHlwZSx0LmR0eXBlKSk7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bihuLFtlLHRdLHIpfSxlLnByb3RvdHlwZS5jb21wbGV4U2VwYXJhYmxlQmluYXJ5T3A9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMsbz10aGlzLnRleERhdGEuZ2V0KGUuZGF0YUlkKSxhPXRoaXMudGV4RGF0YS5nZXQodC5kYXRhSWQpLGk9W1tvLmNvbXBsZXhUZW5zb3JzLnJlYWwsYS5jb21wbGV4VGVuc29ycy5yZWFsXSxbby5jb21wbGV4VGVuc29ycy5pbWFnLGEuY29tcGxleFRlbnNvcnMuaW1hZ11dLm1hcChmdW5jdGlvbihvKXt2YXIgYT1vWzBdLGk9b1sxXSxzPW5ldyBCaW5hcnlPcFByb2dyYW0obixlLnNoYXBlLHQuc2hhcGUpLHU9ci5tYWtlT3V0cHV0QXJyYXkocy5vdXRwdXRTaGFwZSx1cGNhc3RUeXBlKGEuZHR5cGUsaS5kdHlwZSkpLGw9ci5tYWtlQ29tcGxleENvbXBvbmVudFRlbnNvckhhbmRsZShlLGEpLGM9ci5tYWtlQ29tcGxleENvbXBvbmVudFRlbnNvckhhbmRsZSh0LGkpO3JldHVybiByLmNvbXBpbGVBbmRSdW4ocyxbbCxjXSx1KX0pLHM9aVswXSx1PWlbMV0sbD10aGlzLmNvbXBsZXgocyx1KTtyZXR1cm4gcy5kaXNwb3NlKCksdS5kaXNwb3NlKCksbH0sZS5wcm90b3R5cGUubWFrZUNvbXBsZXhDb21wb25lbnRUZW5zb3JIYW5kbGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm57ZGF0YUlkOnQuZGF0YUlkLGR0eXBlOnQuZHR5cGUsc2hhcGU6ZS5zaGFwZX19LGUucHJvdG90eXBlLmFkZE49ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWVbMF0sbj0xO248ZS5sZW5ndGg7bisrKXQ9dGhpcy5hZGQodCxlW25dKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuc3VidHJhY3Q9ZnVuY3Rpb24oZSx0KXtpZihcImNvbXBsZXg2NFwiPT09ZS5kdHlwZSYmXCJjb21wbGV4NjRcIj09PXQuZHR5cGUpcmV0dXJuIHRoaXMuY29tcGxleFNlcGFyYWJsZUJpbmFyeU9wKGUsdCxTVUIpO3ZhciBuPW5ldyBCaW5hcnlPcFByb2dyYW0oU1VCLGUuc2hhcGUsdC5zaGFwZSkscj10aGlzLm1ha2VPdXRwdXRBcnJheShuLm91dHB1dFNoYXBlLHVwY2FzdFR5cGUoZS5kdHlwZSx0LmR0eXBlKSk7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bihuLFtlLHRdLHIpfSxlLnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgQmluYXJ5T3BQcm9ncmFtKFBPVyxlLnNoYXBlLHQuc2hhcGUpLHI9bi5nZXRDdXN0b21TZXR1cEZ1bmMoKSxvPXRoaXMubWFrZU91dHB1dEFycmF5KG4ub3V0cHV0U2hhcGUsdXBjYXN0VHlwZShlLmR0eXBlLHQuZHR5cGUpKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKG4sW2UsdF0sbyxyKX0sZS5wcm90b3R5cGUuY2VpbD1mdW5jdGlvbihlKXt2YXIgdD1uZXcgVW5hcnlPcFByb2dyYW0oZS5zaGFwZSxDRUlMKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKHQsW2VdKX0sZS5wcm90b3R5cGUuZmxvb3I9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IFVuYXJ5T3BQcm9ncmFtKGUuc2hhcGUsRkxPT1IpO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4odCxbZV0pfSxlLnByb3RvdHlwZS5zaWduPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBVbmFyeU9wUHJvZ3JhbShlLnNoYXBlLFNJR04pO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4odCxbZV0pfSxlLnByb3RvdHlwZS5yb3VuZD1mdW5jdGlvbihlKXt2YXIgdD1uZXcgVW5hcnlPcFByb2dyYW0oZS5zaGFwZSxST1VORCk7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bih0LFtlXSl9LGUucHJvdG90eXBlLmV4cD1mdW5jdGlvbihlKXt2YXIgdD1uZXcgVW5hcnlPcFByb2dyYW0oZS5zaGFwZSxFWFApO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4odCxbZV0pfSxlLnByb3RvdHlwZS5leHBtMT1mdW5jdGlvbihlKXt2YXIgdD1uZXcgVW5hcnlPcFByb2dyYW0oZS5zaGFwZSxFWFBNMSk7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bih0LFtlXSl9LGUucHJvdG90eXBlLmxvZz1mdW5jdGlvbihlKXt2YXIgdD1uZXcgVW5hcnlPcFByb2dyYW0oZS5zaGFwZSxMT0cpLG49dC5nZXRDdXN0b21TZXR1cEZ1bmMoKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKHQsW2VdLG51bGwsbil9LGUucHJvdG90eXBlLmxvZzFwPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBVbmFyeU9wUHJvZ3JhbShlLnNoYXBlLExPRzFQKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKHQsW2VdKX0sZS5wcm90b3R5cGUuc3FydD1mdW5jdGlvbihlKXt2YXIgdD1uZXcgVW5hcnlPcFByb2dyYW0oZS5zaGFwZSxTUVJUKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKHQsW2VdKX0sZS5wcm90b3R5cGUucnNxcnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IFVuYXJ5T3BQcm9ncmFtKGUuc2hhcGUsUlNRUlQpO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4odCxbZV0pfSxlLnByb3RvdHlwZS5zcXVhcmU9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IFVuYXJ5T3BQcm9ncmFtKGUuc2hhcGUsU1FVQVJFKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKHQsW2VdKX0sZS5wcm90b3R5cGUucmVjaXByb2NhbD1mdW5jdGlvbihlKXt2YXIgdD1uZXcgVW5hcnlPcFByb2dyYW0oZS5zaGFwZSxSRUNJUFJPQ0FMKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKHQsW2VdKX0sZS5wcm90b3R5cGUucmVsdT1mdW5jdGlvbihlKXt2YXIgdD1uZXcgVW5hcnlPcFByb2dyYW0oZS5zaGFwZSxSRUxVKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKHQsW2VdKX0sZS5wcm90b3R5cGUuZWx1PWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBVbmFyeU9wUHJvZ3JhbShlLnNoYXBlLEVMVSk7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bih0LFtlXSl9LGUucHJvdG90eXBlLmVsdURlcj1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBCaW5hcnlPcFByb2dyYW0oRUxVX0RFUixlLnNoYXBlLHQuc2hhcGUpO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4obixbZSx0XSl9LGUucHJvdG90eXBlLnNlbHU9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IFVuYXJ5T3BQcm9ncmFtKGUuc2hhcGUsU0VMVSk7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bih0LFtlXSl9LGUucHJvdG90eXBlLmludD1mdW5jdGlvbihlKXt2YXIgdD1uZXcgVW5hcnlPcFByb2dyYW0oZS5zaGFwZSxUT19JTlQpLG49dGhpcy5tYWtlT3V0cHV0QXJyYXkodC5vdXRwdXRTaGFwZSxcImludDMyXCIpO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4odCxbZV0sbil9LGUucHJvdG90eXBlLmNsaXA9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW5ldyBDbGlwUHJvZ3JhbShlLnNoYXBlLHQsbik7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bihyLFtlXSl9LGUucHJvdG90eXBlLmFicz1mdW5jdGlvbihlKXt2YXIgdD1uZXcgVW5hcnlPcFByb2dyYW0oZS5zaGFwZSxBQlMpO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4odCxbZV0pfSxlLnByb3RvdHlwZS5zaWdtb2lkPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBVbmFyeU9wUHJvZ3JhbShlLnNoYXBlLFNJR01PSUQpO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4odCxbZV0pfSxlLnByb3RvdHlwZS5zb2Z0cGx1cz1mdW5jdGlvbihlKXt2YXIgdD1uZXcgVW5hcnlPcFByb2dyYW0oZS5zaGFwZSxTT0ZUUExVUyk7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bih0LFtlXSl9LGUucHJvdG90eXBlLnNpbj1mdW5jdGlvbihlKXt2YXIgdD1uZXcgVW5hcnlPcFByb2dyYW0oZS5zaGFwZSxTSU4pO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4odCxbZV0pfSxlLnByb3RvdHlwZS5jb3M9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IFVuYXJ5T3BQcm9ncmFtKGUuc2hhcGUsQ09TKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKHQsW2VdKX0sZS5wcm90b3R5cGUudGFuPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBVbmFyeU9wUHJvZ3JhbShlLnNoYXBlLFRBTik7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bih0LFtlXSl9LGUucHJvdG90eXBlLmFzaW49ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IFVuYXJ5T3BQcm9ncmFtKGUuc2hhcGUsQVNJTik7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bih0LFtlXSl9LGUucHJvdG90eXBlLmFjb3M9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IFVuYXJ5T3BQcm9ncmFtKGUuc2hhcGUsQUNPUyk7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bih0LFtlXSl9LGUucHJvdG90eXBlLmF0YW49ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IFVuYXJ5T3BQcm9ncmFtKGUuc2hhcGUsQVRBTik7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bih0LFtlXSl9LGUucHJvdG90eXBlLmF0YW4yPWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IEJpbmFyeU9wUHJvZ3JhbShBVEFOMixlLnNoYXBlLHQuc2hhcGUpO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4obixbZSx0XSl9LGUucHJvdG90eXBlLnNpbmg9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IFVuYXJ5T3BQcm9ncmFtKGUuc2hhcGUsU0lOSCk7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bih0LFtlXSl9LGUucHJvdG90eXBlLmNvc2g9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IFVuYXJ5T3BQcm9ncmFtKGUuc2hhcGUsQ09TSCk7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bih0LFtlXSl9LGUucHJvdG90eXBlLnRhbmg9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IFVuYXJ5T3BQcm9ncmFtKGUuc2hhcGUsVEFOSCk7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bih0LFtlXSl9LGUucHJvdG90eXBlLmFzaW5oPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBVbmFyeU9wUHJvZ3JhbShlLnNoYXBlLEFTSU5IKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKHQsW2VdKX0sZS5wcm90b3R5cGUuYWNvc2g9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IFVuYXJ5T3BQcm9ncmFtKGUuc2hhcGUsQUNPU0gpLG49dC5nZXRDdXN0b21TZXR1cEZ1bmMoKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKHQsW2VdLG51bGwsbil9LGUucHJvdG90eXBlLmF0YW5oPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBVbmFyeU9wUHJvZ3JhbShlLnNoYXBlLEFUQU5IKSxuPXQuZ2V0Q3VzdG9tU2V0dXBGdW5jKCk7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bih0LFtlXSxudWxsLG4pfSxlLnByb3RvdHlwZS5lcmY9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IFVuYXJ5T3BQcm9ncmFtKGUuc2hhcGUsRVJGKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKHQsW2VdKX0sZS5wcm90b3R5cGUuc3RlcD1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBVbmFyeU9wUHJvZ3JhbShlLnNoYXBlLFNURVAodCkpO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4obixbZV0pfSxlLnByb3RvdHlwZS5jb252MmRXaXRoSW0yUm93PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uLmZpbHRlcldpZHRoLG89bi5maWx0ZXJIZWlnaHQsYT1uLmluQ2hhbm5lbHMsaT1uLm91dFdpZHRoLHM9bi5vdXRIZWlnaHQsdT1yKm8qYSxsPXMqaSxjPVt1LGxdLHA9ZS5zcXVlZXplKFswXSksZD10LnJlc2hhcGUoW3UsLTFdKSxoPW5ldyBJbTJDb2xQcm9ncmFtKGMscC5zaGFwZSxuKSxmPXRoaXMuY29tcGlsZUFuZFJ1bihoLFtwXSx0aGlzLm1ha2VQYWNrZWRUZW5zb3IoYykpLG09bmV3IFBhY2tQcm9ncmFtKGQuc2hhcGUpLGc9dGhpcy5jb21waWxlQW5kUnVuKG0sW2RdLHRoaXMubWFrZVBhY2tlZFRlbnNvcihkLnNoYXBlKSksdj1uZXcgTWF0TXVsUGFja2VkUHJvZ3JhbShmLnNoYXBlLGcuc2hhcGUsW2wsbi5vdXRDaGFubmVsc10sITAsITEpLHg9dGhpcy5jb21waWxlQW5kUnVuKHYsW2YsZ10sdGhpcy5tYWtlUGFja2VkVGVuc29yKHYub3V0cHV0U2hhcGUpKSx5PW5ldyBVbnBhY2tQcm9ncmFtKHguc2hhcGUpLFQ9dGhpcy5jb21waWxlQW5kUnVuKHksW3hdKTtyZXR1cm4gZi5kaXNwb3NlKCksZy5kaXNwb3NlKCkseC5kaXNwb3NlKCksVC5yZXNoYXBlKFsxLHMsaSxuLm91dENoYW5uZWxzXSl9LGUucHJvdG90eXBlLmNvbnYyZD1mdW5jdGlvbihlLHQsbil7aWYoRU5WLmdldChcIldFQkdMX0NPTlZfSU0yQ09MXCIpJiYxPT09ZS5zaGFwZVswXSlyZXR1cm4gdGhpcy5jb252MmRXaXRoSW0yUm93KGUsdCxuKTt2YXIgcj1uZXcgQ29udjJEUHJvZ3JhbShuKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKHIsW2UsdF0pfSxlLnByb3RvdHlwZS5jb252MmREZXJJbnB1dD1mdW5jdGlvbihlLHQsbil7dmFyIHI9bmV3IENvbnYyRERlcklucHV0UHJvZ3JhbShuKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKHIsW2UsdF0pfSxlLnByb3RvdHlwZS5jb252MmREZXJGaWx0ZXI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW5ldyBDb252MkREZXJGaWx0ZXJQcm9ncmFtKG4pO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4ocixbZSx0XSl9LGUucHJvdG90eXBlLmRlcHRod2lzZUNvbnYyRD1mdW5jdGlvbihlLHQsbil7dmFyIHI9bmV3IERlcHRod2lzZUNvbnYyRFByb2dyYW0obik7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bihyLFtlLHRdKX0sZS5wcm90b3R5cGUuZGVwdGh3aXNlQ29udjJERGVySW5wdXQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW5ldyBEZXB0aHdpc2VDb252MkREZXJJbnB1dFByb2dyYW0obik7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bihyLFtlLHRdKX0sZS5wcm90b3R5cGUuZGVwdGh3aXNlQ29udjJERGVyRmlsdGVyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uZXcgRGVwdGh3aXNlQ29udjJERGVyRmlsdGVyUHJvZ3JhbShuKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKHIsW2UsdF0pfSxlLnByb3RvdHlwZS5tYXhQb29sPWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IFBvb2wyRFByb2dyYW0odCxcIm1heFwiLCExKSxyPXRoaXMubWFrZU91dHB1dEFycmF5KG4ub3V0cHV0U2hhcGUsZS5kdHlwZSk7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bihuLFtlXSxyKX0sZS5wcm90b3R5cGUuYXZnUG9vbD1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBQb29sMkRQcm9ncmFtKHQsXCJhdmdcIiwhMSkscj10aGlzLm1ha2VPdXRwdXRBcnJheShuLm91dHB1dFNoYXBlLFwiZmxvYXQzMlwiKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKG4sW2VdLHIpfSxlLnByb3RvdHlwZS5tYXhQb29sQmFja3Byb3A9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89bmV3IFBvb2wyRFByb2dyYW0ocixcIm1heFwiLCEwKSxhPXRoaXMuY29tcGlsZUFuZFJ1bihvLFt0XSksaT1uZXcgTWF4UG9vbDJEQmFja3Byb3BQcm9ncmFtKHIpLHM9dGhpcy5tYWtlT3V0cHV0QXJyYXkoaS5vdXRwdXRTaGFwZSx0LmR0eXBlKSx1PXRoaXMuY29tcGlsZUFuZFJ1bihpLFtlLGFdLHMpO3JldHVybiBhLmRpc3Bvc2UoKSx1fSxlLnByb3RvdHlwZS5hdmdQb29sQmFja3Byb3A9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW5ldyBBdmdQb29sMkRCYWNrcHJvcFByb2dyYW0obiksbz10aGlzLm1ha2VPdXRwdXRBcnJheShyLm91dHB1dFNoYXBlLHQuZHR5cGUpO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4ocixbZV0sbyl9LGUucHJvdG90eXBlLmNhc3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gY2FzdFRlbnNvcihlLHQsdGhpcyl9LGUucHJvdG90eXBlLnJlc2hhcGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcmVzaGFwZVRlbnNvcihlLHQpfSxlLnByb3RvdHlwZS5yZXNpemVCaWxpbmVhcj1mdW5jdGlvbihlLHQsbixyKXt2YXIgbz1uZXcgUmVzaXplQmlsaW5lYXJQcm9ncmFtKGUuc2hhcGUsdCxuLHIpO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4obyxbZV0pfSxlLnByb3RvdHlwZS5yZXNpemVCaWxpbmVhckJhY2twcm9wPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uZXcgUmVzaXplQmlsaW5lYXJCYWNrcHJvcFByb2dyYW0oZSx0LG4pO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4ocixbZV0pfSxlLnByb3RvdHlwZS5yZXNpemVOZWFyZXN0TmVpZ2hib3I9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89bmV3IFJlc2l6ZU5lYXJlc3ROZWlnaGJvclByb2dyYW0oZS5zaGFwZSx0LG4scik7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bihvLFtlXSl9LGUucHJvdG90eXBlLnJlc2l6ZU5lYXJlc3ROZWlnaGJvckJhY2twcm9wPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uZXcgUmVzaXplTmVhcmVzdE5laWdib3JCYWNrcHJvcFByb2dyYW0oZSx0LG4pO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4ocixbZV0pfSxlLnByb3RvdHlwZS5tdWx0aW5vbWlhbD1mdW5jdGlvbihlLHQsbixyKXt2YXIgbz10P2U6c29mdG1heChlKSxhPW8uc2hhcGVbMF0saT1vLnNoYXBlWzFdLHM9bmV3IE11bHRpbm9taWFsUHJvZ3JhbShhLGksbiksdT10aGlzLm1ha2VPdXRwdXRBcnJheShzLm91dHB1dFNoYXBlLFwiaW50MzJcIiksbD1zLmdldEN1c3RvbVNldHVwRnVuYyhyKTtyZXR1cm4gdGhpcy5jb21waWxlQW5kUnVuKHMsW29dLHUsbCl9LGUucHJvdG90eXBlLm9uZUhvdD1mdW5jdGlvbihlLHQsbixyKXt2YXIgbz1uZXcgT25lSG90UHJvZ3JhbShlLnNpemUsdCxuLHIpO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4obyxbZV0pfSxlLnByb3RvdHlwZS5ub25NYXhTdXBwcmVzc2lvbj1mdW5jdGlvbihlLHQsbixyLG8pe3JldHVybiB3YXJuKFwidGYubm9uTWF4U3VwcHJlc3Npb24oKSBpbiB3ZWJnbCBsb2NrcyB0aGUgVUkgdGhyZWFkLiBDYWxsIHRmLm5vbk1heFN1cHByZXNzaW9uQXN5bmMoKSBpbnN0ZWFkXCIpLG5vbk1heFN1cHByZXNzaW9uSW1wbChlLmRhdGFTeW5jKCksdC5kYXRhU3luYygpLG4scixvKX0sZS5wcm90b3R5cGUuY3JvcEFuZFJlc2l6ZT1mdW5jdGlvbihlLHQsbixyLG8sYSl7dmFyIGk9bmV3IENyb3BBbmRSZXNpemVQcm9ncmFtKGUuc2hhcGUsdC5zaGFwZSxyLG8sYSk7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bihpLFtlLHQsbl0pfSxlLnByb3RvdHlwZS5kZXB0aFRvU3BhY2U9ZnVuY3Rpb24oZSx0LG4pe2Fzc2VydCh0PjEsXCJibG9ja1NpemUgc2hvdWxkIGJlID4gMSBmb3IgZGVwdGhUb1NwYWNlLCBidXQgd2FzOiBcIit0KTt2YXIgcj1lLnNoYXBlWzBdLG89KFwiTkhXQ1wiPT09bj9lLnNoYXBlWzFdOmUuc2hhcGVbMl0pKnQsYT0oXCJOSFdDXCI9PT1uP2Uuc2hhcGVbMl06ZS5zaGFwZVszXSkqdCxpPShcIk5IV0NcIj09PW4/ZS5zaGFwZVszXTplLnNoYXBlWzFdKS8odCp0KSxzPW5ldyBEZXB0aFRvU3BhY2VQcm9ncmFtKFwiTkhXQ1wiPT09bj9bcixvLGEsaV06W3IsaSxvLGFdLHQsbik7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bihzLFtlXSl9LGUucHJvdG90eXBlLnNwbGl0PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gc3BsaXQoZSx0LG4pfSxlLnByb3RvdHlwZS5zY2F0dGVyTkQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXByZXBhcmVBbmRWYWxpZGF0ZSQxKHQsZSxuKSxvPXJbMF0sYT1yWzFdLGk9clsyXSxzPXJbM10sdT1yWzRdLGw9W3UvaSxpXSxjPWUucmVzaGFwZShbYSxvXSkscD10LnJlc2hhcGUoW2EsaV0pO2lmKDA9PT11KXJldHVybiByZXNoYXBlVGVuc29yKHRlbnNvcihbXSksbik7dmFyIGQ9bmV3IFNjYXR0ZXJORFByb2dyYW0oYSxvLHMsbCk7cmV0dXJuIHRoaXMuY29tcGlsZUFuZFJ1bihkLFtwLGNdKS5yZXNoYXBlKG4pfSxlLnByb3RvdHlwZS5mZnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy50ZXhEYXRhLmdldChlLmRhdGFJZCksbj1uZXcgRkZUUHJvZ3JhbShDT01QTEVYX0ZGVC5SRUFMLGUuc2hhcGUpLHI9bmV3IEZGVFByb2dyYW0oQ09NUExFWF9GRlQuSU1BRyxlLnNoYXBlKSxvPVt0aGlzLm1ha2VDb21wbGV4Q29tcG9uZW50VGVuc29ySGFuZGxlKGUsdC5jb21wbGV4VGVuc29ycy5yZWFsKSx0aGlzLm1ha2VDb21wbGV4Q29tcG9uZW50VGVuc29ySGFuZGxlKGUsdC5jb21wbGV4VGVuc29ycy5pbWFnKV0sYT10aGlzLmNvbXBpbGVBbmRSdW4obixvKSxpPXRoaXMuY29tcGlsZUFuZFJ1bihyLG8pLHM9dGhpcy5jb21wbGV4KGEsaSkuYXMxRCgpO3JldHVybiBhLmRpc3Bvc2UoKSxpLmRpc3Bvc2UoKSxzfSxlLnByb3RvdHlwZS5nYXRoZXJORD1mdW5jdGlvbihlLHQpe3ZhciBuPXQuc2hhcGUscj1uW24ubGVuZ3RoLTFdLG89cHJlcGFyZUFuZFZhbGlkYXRlKGUsdCksYT1vWzBdLGk9b1sxXSxzPW9bMl0sdT1vWzNdLGw9dC5yZXNoYXBlKFtpLHJdKSxjPWUucmVzaGFwZShbZS5zaXplL3Msc10pLHA9bmV3IEdhdGhlck5EUHJvZ3JhbShyLHUsW2ksc10pO3JldHVybiB0aGlzLmNvbXBpbGVBbmRSdW4ocCxbYyxsXSkucmVzaGFwZShhKX0sZS5wcm90b3R5cGUubWFrZU91dHB1dEFycmF5PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIFRlbnNvci5tYWtlKGUse30sdCl9LGUucHJvdG90eXBlLm1ha2VQYWNrZWRUZW5zb3I9ZnVuY3Rpb24oZSl7dmFyIHQ9VGVuc29yLm1ha2UoZSx7fSk7cmV0dXJuIHRoaXMudGV4RGF0YS5nZXQodC5kYXRhSWQpLnVzYWdlPVRleHR1cmVVc2FnZS5QQUNLLHR9LGUucHJvdG90eXBlLmNvbXBpbGVBbmRSdW49ZnVuY3Rpb24oZSx0LG4scixvKXt2YXIgYT10aGlzO2lmKHZvaWQgMD09PW8mJihvPSEwKSxudWxsPT1uJiYobj10aGlzLm1ha2VPdXRwdXRBcnJheShlLm91dHB1dFNoYXBlLHRbMF0uZHR5cGUpKSwwPT09bi5zaXplKXJldHVybiB0aGlzLnRleERhdGEuZ2V0KG4uZGF0YUlkKS52YWx1ZXM9Z2V0VHlwZWRBcnJheUZyb21EVHlwZShuLmR0eXBlLDApLG47dmFyIGk9dC5tYXAoZnVuY3Rpb24oZSl7aWYoXCJjb21wbGV4NjRcIj09PWUuZHR5cGUpdGhyb3cgbmV3IEVycm9yKFwiR1BHUFVQcm9ncmFtIGRvZXMgbm90IHN1cHBvcnQgY29tcGxleDY0IGlucHV0LiBGb3IgY29tcGxleDY0IGR0eXBlcywgcGxlYXNlIHNlcGFyYXRlIHRoZSBwcm9ncmFtIGludG8gcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzLlwiKTt2YXIgdD1hLnRleERhdGEuZ2V0KGUuZGF0YUlkKTtyZXR1cm4gbnVsbD09dC50ZXh0dXJlJiZzaXplRnJvbVNoYXBlKGUuc2hhcGUpPD1FTlYuZ2V0KFwiV0VCR0xfU0laRV9VUExPQURfVU5JRk9STVwiKT97c2hhcGU6ZS5zaGFwZSx0ZXhEYXRhOm51bGwsaXNVbmlmb3JtOiEwLHVuaWZvcm1WYWx1ZXM6YS5yZWFkU3luYyhlLmRhdGFJZCl9OihhLnVwbG9hZFRvR1BVKGUuZGF0YUlkKSx7c2hhcGU6ZS5zaGFwZSx0ZXhEYXRhOnQsaXNVbmlmb3JtOiExfSl9KTt0aGlzLnVwbG9hZFRvR1BVKG4uZGF0YUlkKTt2YXIgcyx1PXtzaGFwZTpuLnNoYXBlLHRleERhdGE6dGhpcy50ZXhEYXRhLmdldChuLmRhdGFJZCksaXNVbmlmb3JtOiExfSxsPW1ha2VTaGFkZXJLZXkoZSxpLHUpLGM9dGhpcy5nZXRBbmRTYXZlQmluYXJ5KGwsZnVuY3Rpb24oKXtyZXR1cm4gY29tcGlsZVByb2dyYW0oYS5ncGdwdSxlLGksdSl9KSxwPW51bGwhPXRoaXMuYWN0aXZlVGltZXJzO2lmKHAmJihzPXRoaXMuc3RhcnRUaW1lcigpKSxydW5Qcm9ncmFtKGMsaSx1LHIpLEVOVi5nZXQoXCJXRUJHTF9QQUdJTkdfRU5BQkxFRFwiKSYmbyYmdGhpcy5udW1CeXRlc0luR1BVPnRoaXMuTlVNX0JZVEVTX0JFRk9SRV9QQUdJTkcpZm9yKHZhciBkPXRoaXMubnVtQnl0ZXNJbkdQVS10aGlzLk5VTV9CWVRFU19CRUZPUkVfUEFHSU5HO2Q+MCYmdGhpcy5scnVEYXRhR1BVLmxlbmd0aD4wOyl7dmFyIGg9dGhpcy5scnVEYXRhR1BVLnNoaWZ0KCksZj10aGlzLnRleERhdGEuZ2V0KGgpLG09Zi5zaGFwZSxnPWYuZHR5cGU7ZC09dGhpcy5jb21wdXRlQnl0ZXMobSxnKSx0aGlzLnJlYWQoaCl9cmV0dXJuIHAmJihzPXRoaXMuZW5kVGltZXIocyksdGhpcy5hY3RpdmVUaW1lcnMucHVzaCh0aGlzLmdldFF1ZXJ5VGltZShzKSkpLG59LGUucHJvdG90eXBlLmdldEFuZFNhdmVCaW5hcnk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSBpbiB0aGlzLmJpbmFyeUNhY2hlfHwodGhpcy5iaW5hcnlDYWNoZVtlXT10KCkpLHRoaXMuYmluYXJ5Q2FjaGVbZV19LGUucHJvdG90eXBlLmdldFRleHR1cmVNYW5hZ2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dHVyZU1hbmFnZXJ9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtpZighdGhpcy5kaXNwb3NlZCl7Zm9yKHZhciBlIGluIHRoaXMuYmluYXJ5Q2FjaGUpdGhpcy5ncGdwdS5kZWxldGVQcm9ncmFtKHRoaXMuYmluYXJ5Q2FjaGVbZV0ud2ViR0xQcm9ncmFtKTt0aGlzLnRleHR1cmVNYW5hZ2VyLmRpc3Bvc2UoKSx0aGlzLmNhbnZhcy5yZW1vdmUoKSxudWxsIT10aGlzLmZyb21QaXhlbHNDYW52YXMmJnRoaXMuZnJvbVBpeGVsc0NhbnZhcy5yZW1vdmUoKSx0aGlzLmdwZ3B1Q3JlYXRlZExvY2FsbHkmJnRoaXMuZ3BncHUuZGlzcG9zZSgpLHRoaXMuZGlzcG9zZWQ9ITB9fSxlLnByb3RvdHlwZS5mbG9hdFByZWNpc2lvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXtyZXR1cm4gZS5hYnMoc2NhbGFyKDFlLTgpKS5nZXQoKT4wPzMyOjE2fSl9LGUucHJvdG90eXBlLnVwbG9hZFRvR1BVPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMudGV4RGF0YS5nZXQoZSksbj10LnNoYXBlLHI9dC52YWx1ZXMsbz10LnRleHR1cmUsYT10LmR0eXBlLGk9dC51c2FnZTtpZihudWxsPT1vKXt2YXIgcyx1PW51bGwhPXRoaXMuYWN0aXZlVGltZXJzO3UmJihzPXBlcmZvcm1hbmNlLm5vdygpKTt2YXIgbD1nZXRUZXh0dXJlU2hhcGVGcm9tTG9naWNhbFNoYXBlKG4saSk7dC50ZXhTaGFwZT1sO3ZhciBjPXRoaXMuYWNxdWlyZVRleHR1cmUoZSxsLGkpO3QudGV4dHVyZT1jLG51bGwhPXImJih0aGlzLmdwZ3B1LnVwbG9hZE1hdHJpeFRvVGV4dHVyZShjLGxbMF0sbFsxXSx0eXBlZEFycmF5VG9GbG9hdDMyKHIsYSkpLHQudmFsdWVzPW51bGwsdSYmKHRoaXMudXBsb2FkV2FpdE1zKz1wZXJmb3JtYW5jZS5ub3coKS1zKSl9ZWxzZXtFTlYuZ2V0KFwiV0VCR0xfUEFHSU5HX0VOQUJMRURcIikmJnRoaXMubHJ1RGF0YUdQVS5pbmRleE9mKGUpPj0wJiYodGhpcy5scnVEYXRhR1BVLnNwbGljZSh0aGlzLmxydURhdGFHUFUuaW5kZXhPZihlKSwxKSx0aGlzLmxydURhdGFHUFUucHVzaChlKSl9fSxlLnByb3RvdHlwZS5jYWNoZU9uQ1BVPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5kZWxheWVkU3RvcmFnZSxyPXRoaXMudGV4RGF0YS5nZXQoZSksbz1yLnRleHR1cmUsYT1yLnRleFNoYXBlLGk9ci5kdHlwZSxzPXIudXNhZ2U7biYmbnVsbCE9byYmKHRoaXMucmVsZWFzZVRleHR1cmUoZSxvLGEscyksci50ZXh0dXJlPW51bGwsci50ZXhTaGFwZT1udWxsKSxyLnVzYWdlPVRleHR1cmVVc2FnZS5VUExPQUQsbnVsbCE9dCYmKHIudmFsdWVzPWZsb2F0MzJUb1R5cGVkQXJyYXkodCxpKSl9LGUucHJvdG90eXBlLnJlbGVhc2VUZXh0dXJlPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPXRoaXMudGV4RGF0YS5nZXQoZSksYT1vLnNoYXBlLGk9by5kdHlwZTtpZihFTlYuZ2V0KFwiV0VCR0xfUEFHSU5HX0VOQUJMRURcIikpe3ZhciBzPXRoaXMubHJ1RGF0YUdQVS5pbmRleE9mKGUpO3M+PTAmJnRoaXMubHJ1RGF0YUdQVS5zcGxpY2UocywxKX10aGlzLm51bUJ5dGVzSW5HUFUtPXRoaXMuY29tcHV0ZUJ5dGVzKGEsaSksdGhpcy50ZXh0dXJlTWFuYWdlci5yZWxlYXNlVGV4dHVyZSh0LG4scil9LGUucHJvdG90eXBlLmFjcXVpcmVUZXh0dXJlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLnRleERhdGEuZ2V0KGUpLG89ci5zaGFwZSxhPXIuZHR5cGU7cmV0dXJuIEVOVi5nZXQoXCJXRUJHTF9QQUdJTkdfRU5BQkxFRFwiKSYmdGhpcy5scnVEYXRhR1BVLnB1c2goZSksdGhpcy5udW1CeXRlc0luR1BVKz10aGlzLmNvbXB1dGVCeXRlcyhvLGEpLHRoaXMudGV4dHVyZU1hbmFnZXIuYWNxdWlyZVRleHR1cmUodCxuKX0sZS5wcm90b3R5cGUuY29tcHV0ZUJ5dGVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHNpemVGcm9tU2hhcGUoZSkqYnl0ZXNQZXJFbGVtZW50KHQpfSxlfSgpO2Z1bmN0aW9uIGZsb2F0MzJUb1R5cGVkQXJyYXkoZSx0KXtpZihcImZsb2F0MzJcIj09PXR8fFwiY29tcGxleDY0XCI9PT10KXJldHVybiBlO2lmKFwiaW50MzJcIj09PXR8fFwiYm9vbFwiPT09dCl7Zm9yKHZhciBuPVwiaW50MzJcIj09PXQ/bmV3IEludDMyQXJyYXkoZS5sZW5ndGgpOm5ldyBVaW50OEFycmF5KGUubGVuZ3RoKSxyPTA7cjxuLmxlbmd0aDsrK3IpbltyXT1NYXRoLnJvdW5kKGVbcl0pO3JldHVybiBufXRocm93IG5ldyBFcnJvcihcIlVua25vd24gZHR5cGUgXCIrdCl9ZnVuY3Rpb24gdHlwZWRBcnJheVRvRmxvYXQzMihlLHQpe3JldHVybiBlIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5P2U6bmV3IEZsb2F0MzJBcnJheShlKX1mdW5jdGlvbiBuZWdfKGUpe3ZhciB0PWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwibmVnXCIpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5uZWcodCl9LHskeDp0fSxmdW5jdGlvbihlKXtyZXR1cm57JHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5uZWcoKX19fSl9ZnVuY3Rpb24gY2VpbF8oZSl7dmFyIHQ9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJjZWlsXCIpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5jZWlsKHQpfSx7JHg6dH0sZnVuY3Rpb24oZSl7cmV0dXJueyR4OmZ1bmN0aW9uKCl7cmV0dXJuIHplcm9zTGlrZShlKX19fSl9ZnVuY3Rpb24gZmxvb3JfKGUpe3ZhciB0PWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwiZmxvb3JcIik7cmV0dXJuIEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmZsb29yKHQpfSx7JHg6dH0sZnVuY3Rpb24oZSl7cmV0dXJueyR4OmZ1bmN0aW9uKCl7cmV0dXJuIHplcm9zTGlrZShlKX19fSl9ZnVuY3Rpb24gc2lnbl8oZSl7dmFyIHQ9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJzaWduXCIpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5zaWduKHQpfSx7JHg6dH0sZnVuY3Rpb24oZSl7cmV0dXJueyR4OmZ1bmN0aW9uKCl7cmV0dXJuIHplcm9zTGlrZShlKX19fSl9ZnVuY3Rpb24gcm91bmRfKGUpe3ZhciB0PWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwicm91bmRcIik7cmV0dXJuIEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJvdW5kKHQpfSx7JHg6dH0sZnVuY3Rpb24oZSl7cmV0dXJueyR4OmZ1bmN0aW9uKCl7cmV0dXJuIHplcm9zTGlrZShlKX19fSl9ZnVuY3Rpb24gZXhwXyhlKXt2YXIgdD1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcImV4cFwiKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gbihlLmV4cCh0KSl9LHskeDp0fSxmdW5jdGlvbihlLHQpe3ZhciBuPXRbMF07cmV0dXJueyR4OmZ1bmN0aW9uKCl7cmV0dXJuIGUubXVsU3RyaWN0KG4pfX19KX1mdW5jdGlvbiBleHBtMV8oZSl7dmFyIHQ9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJleHBtMVwiKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZXhwbTEodCl9LHskeDp0fSxmdW5jdGlvbihlKXtyZXR1cm57JHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5tdWxTdHJpY3QodC5leHAoKSl9fX0pfWZ1bmN0aW9uIGxvZ18oZSl7dmFyIHQ9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJsb2dcIik7cmV0dXJuIEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmxvZyh0KX0seyR4OnR9LGZ1bmN0aW9uKGUpe3JldHVybnskeDpmdW5jdGlvbigpe3JldHVybiBlLmRpdlN0cmljdCh0LnRvRmxvYXQoKSl9fX0pfWZ1bmN0aW9uIGxvZzFwXyhlKXt2YXIgdD1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcImxvZzFwXCIpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5sb2cxcCh0KX0seyR4OnR9LGZ1bmN0aW9uKGUpe3JldHVybnskeDpmdW5jdGlvbigpe3JldHVybiBlLmRpdlN0cmljdCh0LmFkZChzY2FsYXIoMSkpKX19fSl9ZnVuY3Rpb24gc3FydF8oZSl7dmFyIHQ9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJzcXJ0XCIpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5zcXJ0KHQpfSx7JHg6dH0sZnVuY3Rpb24oZSl7cmV0dXJueyR4OmZ1bmN0aW9uKCl7cmV0dXJuIGUuZGl2U3RyaWN0KHQudG9GbG9hdCgpLnNxcnQoKS5tdWwoc2NhbGFyKDIpKSl9fX0pfWZ1bmN0aW9uIHJzcXJ0XyhlKXt2YXIgdD1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcInJzcXJ0XCIpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5yc3FydCh0KX0seyR4OnR9LGZ1bmN0aW9uKGUpe3JldHVybnskeDpmdW5jdGlvbigpe3JldHVybiBlLmRpdlN0cmljdCh0LnBvdyhzY2FsYXIoMS41KSkubXVsKHNjYWxhcigyKSkpLm5lZygpfX19KX1mdW5jdGlvbiBzcXVhcmVfKGUpe3ZhciB0PWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwic3F1YXJlXCIpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5zcXVhcmUodCl9LHskeDp0fSxmdW5jdGlvbihlKXtyZXR1cm57JHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5tdWxTdHJpY3QodC50b0Zsb2F0KCkubXVsKHNjYWxhcigyKSkpfX19KX1mdW5jdGlvbiByZWNpcHJvY2FsXyhlKXt2YXIgdD1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcInJlY2lwcm9jYWxcIik7cmV0dXJuIEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlY2lwcm9jYWwodCl9LHskeDp0fSxmdW5jdGlvbihlKXtyZXR1cm57JHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5kaXZTdHJpY3QodC5zcXVhcmUoKS5uZWcoKSl9fX0pfWZ1bmN0aW9uIGFic18oZSl7dmFyIHQ9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJhYnNcIik7cmV0dXJuIEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmFicyh0KX0seyR4OnR9LGZ1bmN0aW9uKGUpe3JldHVybnskeDpmdW5jdGlvbigpe3JldHVybiBlLm11bFN0cmljdCh0LnRvRmxvYXQoKS5zdGVwKC0xKSl9fX0pfWZ1bmN0aW9uIGNsaXBCeVZhbHVlXyhlLHQsbil7dmFyIHI9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJjbGlwQnlWYWx1ZVwiKTthc3NlcnQodDw9bixcIkVycm9yIGluIGNsaXA6IG1pbiAoXCIrdCtcIikgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbWF4IChcIituK1wiKS5cIik7cmV0dXJuIEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNsaXAocix0LG4pfSx7JHg6cn0sZnVuY3Rpb24oZSl7cmV0dXJueyR4OmZ1bmN0aW9uKCl7cmV0dXJuIGUud2hlcmUoci5ncmVhdGVyRXF1YWwoc2NhbGFyKHQpKS5sb2dpY2FsQW5kKHIubGVzc0VxdWFsKHNjYWxhcihuKSkpLHplcm9zTGlrZShlKSl9fX0pfWZ1bmN0aW9uIHNpZ21vaWRfKGUpe3ZhciB0PWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwic2lnbW9pZFwiKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gbihlLnNpZ21vaWQodCkpfSx7JHg6dH0sZnVuY3Rpb24oZSx0KXt2YXIgbj10WzBdO3JldHVybnskeDpmdW5jdGlvbigpe3JldHVybiBlLm11bFN0cmljdChuLm11bChzY2FsYXIoMSkuc3ViKG4pKSl9fX0pfWZ1bmN0aW9uIGxvZ1NpZ21vaWRfKGUpe3ZhciB0PWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwibG9nU2lnbW9pZFwiKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc29mdHBsdXModC5uZWcoKSkubmVnKCl9LHskeDp0fSxmdW5jdGlvbihlKXtyZXR1cm57JHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5tdWxTdHJpY3QodC5uZWcoKS5zaWdtb2lkKCkpfX19KX1mdW5jdGlvbiBzb2Z0cGx1c18oZSl7dmFyIHQ9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJzb2Z0cGx1c1wiKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc29mdHBsdXModCl9LHskeDp0fSxmdW5jdGlvbihlKXtyZXR1cm57JHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5tdWxTdHJpY3QodC5zaWdtb2lkKCkpfX19KX1mdW5jdGlvbiBzaW5fKGUpe3ZhciB0PWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwic2luXCIpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5zaW4odCl9LHskeDp0fSxmdW5jdGlvbihlKXtyZXR1cm57JHg6ZnVuY3Rpb24oKXtyZXR1cm4gdC50b0Zsb2F0KCkuY29zKCkubXVsU3RyaWN0KGUpfX19KX1mdW5jdGlvbiBjb3NfKGUpe3ZhciB0PWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwiY29zXCIpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5jb3ModCl9LHskeDp0fSxmdW5jdGlvbihlKXtyZXR1cm57JHg6ZnVuY3Rpb24oKXtyZXR1cm4gdC50b0Zsb2F0KCkuc2luKCkubmVnKCkubXVsU3RyaWN0KGUpfX19KX1mdW5jdGlvbiB0YW5fKGUpe3ZhciB0PWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwidGFuXCIpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS50YW4odCl9LHskeDp0fSxmdW5jdGlvbihlKXtyZXR1cm57JHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5kaXZTdHJpY3QodC5jb3MoKS5zcXVhcmUoKSl9fX0pfWZ1bmN0aW9uIGFzaW5fKGUpe3ZhciB0PWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwiYXNpblwiKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXNpbih0KX0seyR4OnR9LGZ1bmN0aW9uKGUpe3JldHVybnskeDpmdW5jdGlvbigpe3JldHVybiBlLmRpdlN0cmljdChzY2FsYXIoMSkuc3ViKHQudG9GbG9hdCgpLnNxdWFyZSgpKS5zcXJ0KCkpfX19KX1mdW5jdGlvbiBhY29zXyhlKXt2YXIgdD1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcImFjb3NcIik7cmV0dXJuIEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmFjb3ModCl9LHskeDp0fSxmdW5jdGlvbihlKXtyZXR1cm57JHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5kaXZTdHJpY3Qoc2NhbGFyKDEpLnN1Yih0LnRvRmxvYXQoKS5zcXVhcmUoKSkuc3FydCgpKS5uZWcoKX19fSl9ZnVuY3Rpb24gYXRhbl8oZSl7dmFyIHQ9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJhdGFuXCIpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5hdGFuKHQpfSx7JHg6dH0sZnVuY3Rpb24oZSl7cmV0dXJueyR4OmZ1bmN0aW9uKCl7cmV0dXJuIGUuZGl2U3RyaWN0KHNjYWxhcigxKS5hZGQodC50b0Zsb2F0KCkuc3F1YXJlKCkpKX19fSl9ZnVuY3Rpb24gc2luaF8oZSl7dmFyIHQ9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJzaW5oXCIpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5zaW5oKHQpfSx7JHg6dH0sZnVuY3Rpb24oZSl7cmV0dXJueyR4OmZ1bmN0aW9uKCl7cmV0dXJuIHQudG9GbG9hdCgpLmNvc2goKS5tdWxTdHJpY3QoZSl9fX0pfWZ1bmN0aW9uIGNvc2hfKGUpe3ZhciB0PWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwiY29zaFwiKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29zaCh0KX0seyR4OnR9LGZ1bmN0aW9uKGUpe3JldHVybnskeDpmdW5jdGlvbigpe3JldHVybiB0LnRvRmxvYXQoKS5zaW5oKCkubXVsU3RyaWN0KGUpfX19KX1mdW5jdGlvbiB0YW5oXyhlKXt2YXIgdD1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcInRhbmhcIik7cmV0dXJuIEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIG4oZS50YW5oKHQpKX0seyR4OnR9LGZ1bmN0aW9uKGUsdCl7dmFyIG49dFswXTtyZXR1cm57JHg6ZnVuY3Rpb24oKXtyZXR1cm4gc2NhbGFyKDEpLnN1YihuLnNxdWFyZSgpKS5tdWxTdHJpY3QoZSl9fX0pfWZ1bmN0aW9uIGFzaW5oXyhlKXt2YXIgdD1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcImFzaW5oXCIpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5hc2luaCh0KX0seyR4OnR9LGZ1bmN0aW9uKGUpe3JldHVybnskeDpmdW5jdGlvbigpe3JldHVybiBlLmRpdlN0cmljdChzY2FsYXIoMSkuYWRkKHQudG9GbG9hdCgpLnNxdWFyZSgpKS5zcXJ0KCkpfX19KX1mdW5jdGlvbiBhY29zaF8oZSl7dmFyIHQ9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJhY29zaFwiKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYWNvc2godCl9LHskeDp0fSxmdW5jdGlvbihlKXtyZXR1cm57JHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5kaXZTdHJpY3QodC50b0Zsb2F0KCkuc3F1YXJlKCkuc3ViKHNjYWxhcigxKSkuc3FydCgpKX19fSl9ZnVuY3Rpb24gYXRhbmhfKGUpe3ZhciB0PWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwiYXRhbmhcIik7cmV0dXJuIEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmF0YW5oKHQpfSx7JHg6dH0sZnVuY3Rpb24oZSl7cmV0dXJueyR4OmZ1bmN0aW9uKCl7cmV0dXJuIGUuZGl2U3RyaWN0KHNjYWxhcigxKS5zdWIodC50b0Zsb2F0KCkuc3F1YXJlKCkpKX19fSl9ZnVuY3Rpb24gZXJmXyhlKXt2YXIgdD1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcImVyZlwiKTthc3NlcnQoXCJpbnQzMlwiPT09dC5kdHlwZXx8XCJmbG9hdDMyXCI9PT10LmR0eXBlLFwiSW5wdXQgZHR5cGUgbXVzdCBiZSBgaW50MzJgIG9yIGBmbG9hdDMyYC5cIiksXCJpbnQzMlwiPT09dC5kdHlwZSYmKHQ9dC50b0Zsb2F0KCkpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5lcmYodCl9LHskeDp0fSxmdW5jdGlvbihlKXtyZXR1cm57JHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5tdWxTdHJpY3Qoc2NhbGFyKDIvTWF0aC5zcXJ0KE1hdGguUEkpKS5tdWwodC5zcXVhcmUoKS5uZWcoKS5leHAoKSkpfX19KX1mdW5jdGlvbiBzdGVwXyhlLHQpe3ZvaWQgMD09PXQmJih0PTApO3ZhciBuPWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwic3RlcFwiKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3RlcChuLHQpfSx7JHg6bn0sZnVuY3Rpb24oZSl7cmV0dXJueyR4OmZ1bmN0aW9uKCl7cmV0dXJuIHplcm9zTGlrZShlKX19fSl9RU5WLmdldChcIklTX0JST1dTRVJcIikmJkVOVi5yZWdpc3RlckJhY2tlbmQoXCJ3ZWJnbFwiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNYXRoQmFja2VuZFdlYkdMfSwyLHNldFRlbnNvclRyYWNrZXIpO3ZhciBhYnM9b3Aoe2Fic186YWJzX30pLGFjb3M9b3Aoe2Fjb3NfOmFjb3NffSksYWNvc2g9b3Aoe2Fjb3NoXzphY29zaF99KSxhc2luPW9wKHthc2luXzphc2luX30pLGFzaW5oPW9wKHthc2luaF86YXNpbmhffSksYXRhbj1vcCh7YXRhbl86YXRhbl99KSxhdGFuaD1vcCh7YXRhbmhfOmF0YW5oX30pLGNlaWw9b3Aoe2NlaWxfOmNlaWxffSksY2xpcEJ5VmFsdWU9b3Aoe2NsaXBCeVZhbHVlXzpjbGlwQnlWYWx1ZV99KSxjb3M9b3Aoe2Nvc186Y29zX30pLGNvc2g9b3Aoe2Nvc2hfOmNvc2hffSksZXJmPW9wKHtlcmZfOmVyZl99KSxleHA9b3Aoe2V4cF86ZXhwX30pLGV4cG0xPW9wKHtleHBtMV86ZXhwbTFffSksZmxvb3I9b3Aoe2Zsb29yXzpmbG9vcl99KSxsb2ckMT1vcCh7bG9nXzpsb2dffSksbG9nMXA9b3Aoe2xvZzFwXzpsb2cxcF99KSxsb2dTaWdtb2lkPW9wKHtsb2dTaWdtb2lkXzpsb2dTaWdtb2lkX30pLG5lZz1vcCh7bmVnXzpuZWdffSkscmVjaXByb2NhbD1vcCh7cmVjaXByb2NhbF86cmVjaXByb2NhbF99KSxyb3VuZD1vcCh7cm91bmRfOnJvdW5kX30pLHJzcXJ0PW9wKHtyc3FydF86cnNxcnRffSksc2lnbW9pZD1vcCh7c2lnbW9pZF86c2lnbW9pZF99KSxzaWduPW9wKHtzaWduXzpzaWduX30pLHNpbj1vcCh7c2luXzpzaW5ffSksc2luaD1vcCh7c2luaF86c2luaF99KSxzb2Z0cGx1cz1vcCh7c29mdHBsdXNfOnNvZnRwbHVzX30pLHNxcnQ9b3Aoe3NxcnRfOnNxcnRffSksc3F1YXJlPW9wKHtzcXVhcmVfOnNxdWFyZV99KSxzdGVwPW9wKHtzdGVwXzpzdGVwX30pLHRhbj1vcCh7dGFuXzp0YW5ffSksdGFuaCQxPW9wKHt0YW5oXzp0YW5oX30pO2Z1bmN0aW9uIGJhdGNoTm9ybWFsaXphdGlvbjJkXyhlLHQsbixyLG8sYSl7dm9pZCAwPT09ciYmKHI9LjAwMSk7dmFyIGkscyx1PWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwiYmF0Y2hOb3JtYWxpemF0aW9uXCIpLGw9Y29udmVydFRvVGVuc29yKHQsXCJtZWFuXCIsXCJiYXRjaE5vcm1hbGl6YXRpb25cIiksYz1jb252ZXJ0VG9UZW5zb3IobixcInZhcmlhbmNlXCIsXCJiYXRjaE5vcm1hbGl6YXRpb25cIik7cmV0dXJuIG51bGwhPW8mJihpPWNvbnZlcnRUb1RlbnNvcihvLFwic2NhbGVcIixcImJhdGNoTm9ybWFsaXphdGlvblwiKSksbnVsbCE9YSYmKHM9Y29udmVydFRvVGVuc29yKGEsXCJvZmZzZXRcIixcImJhdGNoTm9ybWFsaXphdGlvblwiKSksYXNzZXJ0KDI9PT11LnJhbmssXCJFcnJvciBpbiBiYXRjaE5vcm1hbGl6YXRpb24zRDogeCBtdXN0IGJlIHJhbmsgMyBidXQgZ290IHJhbmsgXCIrdS5yYW5rK1wiLlwiKSxhc3NlcnQoMj09PWwucmFua3x8MT09PWwucmFuayxcIkVycm9yIGluIGJhdGNoTm9ybWFsaXphdGlvbjJEOiBtZWFuIG11c3QgYmUgcmFuayAyIG9yIHJhbmsgMSBidXQgZ290IHJhbmsgXCIrbC5yYW5rK1wiLlwiKSxhc3NlcnQoMj09PWMucmFua3x8MT09PWMucmFuayxcIkVycm9yIGluIGJhdGNoTm9ybWFsaXphdGlvbjJEOiB2YXJpYW5jZSBtdXN0IGJlIHJhbmsgMiBvciByYW5rIDEgYnV0IGdvdCByYW5rIFwiK2MucmFuaytcIi5cIiksbnVsbCE9aSYmYXNzZXJ0KDI9PT1pLnJhbmt8fDE9PT1pLnJhbmssXCJFcnJvciBpbiBiYXRjaE5vcm1hbGl6YXRpb24yRDogc2NhbGUgbXVzdCBiZSByYW5rIDIgb3IgcmFuayAxIGJ1dCBnb3QgcmFuayBcIitpLnJhbmsrXCIuXCIpLG51bGwhPXMmJmFzc2VydCgyPT09cy5yYW5rfHwxPT09cy5yYW5rLFwiRXJyb3IgaW4gYmF0Y2hOb3JtYWxpemF0aW9uMkQ6IG9mZnNldCBtdXN0IGJlIHJhbmsgMiBvciByYW5rIDEgYnV0IGdvdCByYW5rIFwiK3MucmFuaytcIi5cIiksYmF0Y2hOb3JtYWxpemF0aW9uKHUsbCxjLHIsaSxzKX1mdW5jdGlvbiBiYXRjaE5vcm1hbGl6YXRpb24zZF8oZSx0LG4scixvLGEpe3ZvaWQgMD09PXImJihyPS4wMDEpO3ZhciBpLHMsdT1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcImJhdGNoTm9ybWFsaXphdGlvblwiKSxsPWNvbnZlcnRUb1RlbnNvcih0LFwibWVhblwiLFwiYmF0Y2hOb3JtYWxpemF0aW9uXCIpLGM9Y29udmVydFRvVGVuc29yKG4sXCJ2YXJpYW5jZVwiLFwiYmF0Y2hOb3JtYWxpemF0aW9uXCIpO3JldHVybiBudWxsIT1vJiYoaT1jb252ZXJ0VG9UZW5zb3IobyxcInNjYWxlXCIsXCJiYXRjaE5vcm1hbGl6YXRpb25cIikpLG51bGwhPWEmJihzPWNvbnZlcnRUb1RlbnNvcihhLFwib2Zmc2V0XCIsXCJiYXRjaE5vcm1hbGl6YXRpb25cIikpLGFzc2VydCgzPT09dS5yYW5rLFwiRXJyb3IgaW4gYmF0Y2hOb3JtYWxpemF0aW9uM0Q6IHggbXVzdCBiZSByYW5rIDMgYnV0IGdvdCByYW5rIFwiK3UucmFuaytcIi5cIiksYXNzZXJ0KDM9PT1sLnJhbmt8fDE9PT1sLnJhbmssXCJFcnJvciBpbiBiYXRjaE5vcm1hbGl6YXRpb24zRDogbWVhbiBtdXN0IGJlIHJhbmsgMyBvciByYW5rIDEgYnV0IGdvdCByYW5rIFwiK2wucmFuaytcIi5cIiksYXNzZXJ0KDM9PT1jLnJhbmt8fDE9PT1jLnJhbmssXCJFcnJvciBpbiBiYXRjaE5vcm1hbGl6YXRpb24zRDogdmFyaWFuY2UgbXVzdCBiZSByYW5rIDMgb3IgcmFuayAxIGJ1dCBnb3QgcmFuayBcIitjLnJhbmsrXCIuXCIpLG51bGwhPWkmJmFzc2VydCgzPT09aS5yYW5rfHwxPT09aS5yYW5rLFwiRXJyb3IgaW4gYmF0Y2hOb3JtYWxpemF0aW9uM0Q6IHNjYWxlIG11c3QgYmUgcmFuayAzIG9yIHJhbmsgMSBidXQgZ290IHJhbmsgXCIraS5yYW5rK1wiLlwiKSxudWxsIT1zJiZhc3NlcnQoMz09PXMucmFua3x8MT09PXMucmFuayxcIkVycm9yIGluIGJhdGNoTm9ybWFsaXphdGlvbjNEOiBvZmZzZXQgbXVzdCBiZSByYW5rIDMgb3IgcmFuayAxIGJ1dCBnb3QgcmFuayBcIitzLnJhbmsrXCIuXCIpLGJhdGNoTm9ybWFsaXphdGlvbih1LGwsYyxyLGkscyl9ZnVuY3Rpb24gYmF0Y2hOb3JtYWxpemF0aW9uNGRfKGUsdCxuLHIsbyxhKXt2b2lkIDA9PT1yJiYocj0uMDAxKTt2YXIgaSxzLHU9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJiYXRjaE5vcm1hbGl6YXRpb25cIiksbD1jb252ZXJ0VG9UZW5zb3IodCxcIm1lYW5cIixcImJhdGNoTm9ybWFsaXphdGlvblwiKSxjPWNvbnZlcnRUb1RlbnNvcihuLFwidmFyaWFuY2VcIixcImJhdGNoTm9ybWFsaXphdGlvblwiKTtyZXR1cm4gbnVsbCE9byYmKGk9Y29udmVydFRvVGVuc29yKG8sXCJzY2FsZVwiLFwiYmF0Y2hOb3JtYWxpemF0aW9uXCIpKSxudWxsIT1hJiYocz1jb252ZXJ0VG9UZW5zb3IoYSxcIm9mZnNldFwiLFwiYmF0Y2hOb3JtYWxpemF0aW9uXCIpKSxhc3NlcnQoND09PXUucmFuayxcIkVycm9yIGluIGJhdGNoTm9ybWFsaXphdGlvbjREOiB4IG11c3QgYmUgcmFuayA0IGJ1dCBnb3QgcmFuayBcIit1LnJhbmsrXCIuXCIpLGFzc2VydCg0PT09bC5yYW5rfHwxPT09bC5yYW5rLFwiRXJyb3IgaW4gYmF0Y2hOb3JtYWxpemF0aW9uNEQ6IG1lYW4gbXVzdCBiZSByYW5rIDQgb3IgcmFuayAxIGJ1dCBnb3QgcmFuayBcIitsLnJhbmsrXCIuXCIpLGFzc2VydCg0PT09Yy5yYW5rfHwxPT09Yy5yYW5rLFwiRXJyb3IgaW4gYmF0Y2hOb3JtYWxpemF0aW9uNEQ6IHZhcmlhbmNlIG11c3QgYmUgcmFuayA0IG9yIHJhbmsgMSBidXQgZ290IHJhbmsgXCIrYy5yYW5rK1wiLlwiKSxudWxsIT1pJiZhc3NlcnQoND09PWkucmFua3x8MT09PWkucmFuayxcIkVycm9yIGluIGJhdGNoTm9ybWFsaXphdGlvbjREOiBzY2FsZSBtdXN0IGJlIHJhbmsgNCBvciByYW5rIDEgYnV0IGdvdCByYW5rIFwiK2kucmFuaytcIi5cIiksbnVsbCE9cyYmYXNzZXJ0KDQ9PT1zLnJhbmt8fDE9PT1zLnJhbmssXCJFcnJvciBpbiBiYXRjaE5vcm1hbGl6YXRpb240RDogb2Zmc2V0IG11c3QgYmUgcmFuayA0IG9yIHJhbmsgMSBidXQgZ290IHJhbmsgXCIrcy5yYW5rK1wiLlwiKSxiYXRjaE5vcm1hbGl6YXRpb24odSxsLGMscixpLHMpfWZ1bmN0aW9uIGJhdGNoTm9ybWFsaXphdGlvbl8oZSx0LG4scixvLGEpe3ZvaWQgMD09PXImJihyPS4wMDEpO3ZhciBpLHMsdSxsPWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwiYmF0Y2hOb3JtYWxpemF0aW9uXCIpLGM9Y29udmVydFRvVGVuc29yKHQsXCJtZWFuXCIsXCJiYXRjaE5vcm1hbGl6YXRpb25cIikscD1jb252ZXJ0VG9UZW5zb3IobixcInZhcmlhbmNlXCIsXCJiYXRjaE5vcm1hbGl6YXRpb25cIik7bnVsbCE9byYmKGk9Y29udmVydFRvVGVuc29yKG8sXCJzY2FsZVwiLFwiYmF0Y2hOb3JtYWxpemF0aW9uXCIpKSxudWxsIT1hJiYocz1jb252ZXJ0VG9UZW5zb3IoYSxcIm9mZnNldFwiLFwiYmF0Y2hOb3JtYWxpemF0aW9uXCIpKSxhc3NlcnQoYy5yYW5rPT09cC5yYW5rLFwiQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCB2YXJpYW5jZSB0byBoYXZlIGVxdWFsIHJhbmtzLlwiKSxhc3NlcnQobnVsbD09c3x8Yy5yYW5rPT09cy5yYW5rLFwiQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCBvZmZzZXQgdG8gaGF2ZSBlcXVhbCByYW5rcy5cIiksYXNzZXJ0KG51bGw9PWl8fGMucmFuaz09PWkucmFuayxcIkJhdGNoIG5vcm1hbGl6YXRpb24gZ3JhZGllbnQgcmVxdWlyZXMgbWVhbiBhbmQgc2NhbGUgdG8gaGF2ZSBlcXVhbCByYW5rcy5cIiksdT0wPT09bC5yYW5rfHwxPT09bC5yYW5rP2wuYXM0RCgxLDEsMSxsLnNpemUpOjI9PT1sLnJhbms/bC5hczREKDEsMSxsLnNoYXBlWzBdLGwuc2hhcGVbMV0pOjM9PT1sLnJhbms/bC5hczREKDEsbC5zaGFwZVswXSxsLnNoYXBlWzFdLGwuc2hhcGVbMl0pOmw7cmV0dXJuIEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmJhdGNoTm9ybWFsaXphdGlvbih1LGJhdGNobm9ybVJlc2hhcGU0RChjKSxiYXRjaG5vcm1SZXNoYXBlNEQocCkscixiYXRjaG5vcm1SZXNoYXBlNEQoaSksYmF0Y2hub3JtUmVzaGFwZTREKHMpKX0seyR4OmwsJG1lYW46YywkdmFyaWFuY2U6cCwkc2NhbGU6aSwkb2Zmc2V0OnN9LGZ1bmN0aW9uKGUpe3ZhciB0PW51bGw9PWk/c2NhbGFyKDEpOmksbj1nZXRSZWR1Y3Rpb25BeGVzKGMuc2hhcGUsdS5zaGFwZSksbz1bXTtpZigxPT09Yy5yYW5rKXtmb3IodmFyIGE9MDthPHUuc2hhcGUubGVuZ3RoLTE7KythKW8ucHVzaCh1LnNoYXBlW2FdKTtvLnB1c2goMSl9dmFyIHM9bC5zdWIoYyksZD1lLm11bCh0KSxoPXJzcXJ0KHAuYWRkKHNjYWxhcihyKSkpLGY9aC5tdWwoaCkubXVsKGgpLm11bChzY2FsYXIoLS41KSk7cmV0dXJueyR4OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PT1jLnJhbms/ZS5tdWwodGlsZShoLmFzNEQoMSwxLDEsYy5zaGFwZVswXSksbykpLm11bCh0KS5yZXNoYXBlKGwuc2hhcGUpOmUubXVsKGgpLm11bCh0KS5yZXNoYXBlKGwuc2hhcGUpfSwkbWVhbjpmdW5jdGlvbigpe3ZhciBlPWgubXVsKHNjYWxhcigtMSkpLm11bChkKTtyZXR1cm4gMT09PWMucmFuayYmKGU9ZS5zdW0obikpLGUucmVzaGFwZShjLnNoYXBlKX0sJHZhcmlhbmNlOmZ1bmN0aW9uKCl7dmFyIGU9Zi5tdWwocykubXVsKGQpO3JldHVybiAxPT09Yy5yYW5rJiYoZT1lLnN1bShuKSksZS5yZXNoYXBlKGMuc2hhcGUpfSwkc2NhbGU6ZnVuY3Rpb24oKXt2YXIgdD1zLm11bChoKSxyPWUubXVsKHQpO3JldHVybiAxPT09Yy5yYW5rJiYocj1yLnN1bShuKSksci5yZXNoYXBlKGMuc2hhcGUpfSwkb2Zmc2V0OmZ1bmN0aW9uKCl7dmFyIHQ9ZTtyZXR1cm4gMT09PWMucmFuayYmKHQ9dC5zdW0obikpLHQucmVzaGFwZShjLnNoYXBlKX19fSkucmVzaGFwZShsLnNoYXBlKX1mdW5jdGlvbiBiYXRjaG5vcm1SZXNoYXBlNEQoZSl7cmV0dXJuIG51bGw9PWU/bnVsbDowPT09ZS5yYW5rP2UuYXMxRCgpOjE9PT1lLnJhbms/ZToyPT09ZS5yYW5rP2UuYXM0RCgxLDEsZS5zaGFwZVswXSxlLnNoYXBlWzFdKTozPT09ZS5yYW5rP2UuYXM0RCgxLGUuc2hhcGVbMF0sZS5zaGFwZVsxXSxlLnNoYXBlWzJdKTplfXZhciBiYXRjaE5vcm1hbGl6YXRpb24yZD1vcCh7YmF0Y2hOb3JtYWxpemF0aW9uMmRfOmJhdGNoTm9ybWFsaXphdGlvbjJkX30pLGJhdGNoTm9ybWFsaXphdGlvbjNkPW9wKHtiYXRjaE5vcm1hbGl6YXRpb24zZF86YmF0Y2hOb3JtYWxpemF0aW9uM2RffSksYmF0Y2hOb3JtYWxpemF0aW9uNGQ9b3Aoe2JhdGNoTm9ybWFsaXphdGlvbjRkXzpiYXRjaE5vcm1hbGl6YXRpb240ZF99KSxiYXRjaE5vcm1hbGl6YXRpb249b3Aoe2JhdGNoTm9ybWFsaXphdGlvbl86YmF0Y2hOb3JtYWxpemF0aW9uX30pO2Z1bmN0aW9uIGNvbXB1dGVQb29sMkRJbmZvKGUsdCxuLHIsbyxhKXt2b2lkIDA9PT1hJiYoYT1cImNoYW5uZWxzTGFzdFwiKTt2YXIgaSxzPXBhcnNlVHVwbGVQYXJhbSh0KSx1PXNbMF0sbD1zWzFdO2lmKFwiY2hhbm5lbHNMYXN0XCI9PT1hKWk9W3UsbCxlWzNdLGVbM11dO2Vsc2V7aWYoXCJjaGFubmVsc0ZpcnN0XCIhPT1hKXRocm93IG5ldyBFcnJvcihcIlVua25vd24gZGF0YUZvcm1hdCBcIithKTtpPVt1LGwsZVsxXSxlWzFdXX1yZXR1cm4gY29tcHV0ZUNvbnYyREluZm8oZSxpLG4sMSxyLG8sITEsYSl9ZnVuY3Rpb24gY29tcHV0ZUNvbnYyREluZm8oZSx0LG4scixvLGEsaSxzKXt2b2lkIDA9PT1pJiYoaT0hMSksdm9pZCAwPT09cyYmKHM9XCJjaGFubmVsc0xhc3RcIik7dmFyIHU9Wy0xLC0xLC0xLC0xXSxsPXVbMF0sYz11WzFdLHA9dVsyXSxkPXVbM107aWYoXCJjaGFubmVsc0xhc3RcIj09PXMpbD1lWzBdLGM9ZVsxXSxwPWVbMl0sZD1lWzNdO2Vsc2V7aWYoXCJjaGFubmVsc0ZpcnN0XCIhPT1zKXRocm93IG5ldyBFcnJvcihcIlVua25vd24gZGF0YUZvcm1hdCBcIitzKTtsPWVbMF0sZD1lWzFdLGM9ZVsyXSxwPWVbM119dmFyIGgsZj10WzBdLG09dFsxXSxnPXRbM10sdj1wYXJzZVR1cGxlUGFyYW0obikseD12WzBdLHk9dlsxXSxUPXBhcnNlVHVwbGVQYXJhbShyKSxTPVRbMF0sYj1UWzFdLEU9Z2V0UGFkQW5kT3V0SW5mbyhvLGMscCx4LHksZ2V0RWZmZWN0aXZlRmlsdGVyU2l6ZShmLFMpLGdldEVmZmVjdGl2ZUZpbHRlclNpemUobSxiKSxhKSx3PUUucGFkSW5mbyxBPUUub3V0SGVpZ2h0LEM9RS5vdXRXaWR0aCxfPWk/ZypkOmc7cmV0dXJuXCJjaGFubmVsc0ZpcnN0XCI9PT1zP2g9W2wsXyxBLENdOlwiY2hhbm5lbHNMYXN0XCI9PT1zJiYoaD1bbCxBLEMsX10pLHtiYXRjaFNpemU6bCxkYXRhRm9ybWF0OnMsaW5IZWlnaHQ6YyxpbldpZHRoOnAsaW5DaGFubmVsczpkLG91dEhlaWdodDpBLG91dFdpZHRoOkMsb3V0Q2hhbm5lbHM6XyxwYWRJbmZvOncsc3RyaWRlSGVpZ2h0Ongsc3RyaWRlV2lkdGg6eSxmaWx0ZXJIZWlnaHQ6ZixmaWx0ZXJXaWR0aDptLGRpbGF0aW9uSGVpZ2h0OlMsZGlsYXRpb25XaWR0aDpiLGluU2hhcGU6ZSxvdXRTaGFwZTpoLGZpbHRlclNoYXBlOnR9fWZ1bmN0aW9uIGNvbXB1dGVPdXRwdXRTaGFwZTNEKGUsdCxuLHIsbyxhKXtudWxsPT1vJiYobz1jb21wdXRlRGVmYXVsdFBhZChlLHQscikpO3ZhciBpPWVbMF0scz1lWzFdLHU9Y29uZGl0aW9uYWxSb3VuZCgoaS10KzIqbykvcisxLGEpO2Fzc2VydChpc0ludCh1KSxcIlRoZSBvdXRwdXQgIyBvZiByb3dzIChcIit1K1wiKSBtdXN0IGJlIGFuIGludGVnZXIuIENoYW5nZSB0aGUgc3RyaWRlIGFuZC9vciB6ZXJvIHBhZCBwYXJhbWV0ZXJzXCIpO3ZhciBsPWNvbmRpdGlvbmFsUm91bmQoKHMtdCsyKm8pL3IrMSxhKTtyZXR1cm4gYXNzZXJ0KGlzSW50KGwpLFwiVGhlIG91dHB1dCAjIG9mIGNvbHVtbnMgKFwiK2wrXCIpIG11c3QgYmUgYW4gaW50ZWdlci4gQ2hhbmdlIHRoZSBzdHJpZGUgYW5kL29yIHplcm8gcGFkIHBhcmFtZXRlcnNcIiksW3UsbCxuXX1mdW5jdGlvbiBjb21wdXRlRGVmYXVsdFBhZChlLHQsbixyKXt2b2lkIDA9PT1yJiYocj0xKTt2YXIgbz1nZXRFZmZlY3RpdmVGaWx0ZXJTaXplKHQscik7cmV0dXJuIE1hdGguZmxvb3IoKGVbMF0qKG4tMSktbitvKS8yKX1mdW5jdGlvbiBwYXJzZVR1cGxlUGFyYW0oZSl7cmV0dXJuXCJudW1iZXJcIj09dHlwZW9mIGU/W2UsZV06ZX1mdW5jdGlvbiBnZXRFZmZlY3RpdmVGaWx0ZXJTaXplKGUsdCl7cmV0dXJuIHQ8PTE/ZTplKyhlLTEpKih0LTEpfWZ1bmN0aW9uIGdldFBhZEFuZE91dEluZm8oZSx0LG4scixvLGEsaSxzKXt2YXIgdSxsLGM7aWYoXCJudW1iZXJcIj09dHlwZW9mIGUpe3U9e3RvcDplLGJvdHRvbTplLGxlZnQ6ZSxyaWdodDplLHR5cGU6MD09PWU/XCJWQUxJRFwiOlwiTlVNQkVSXCJ9O3ZhciBwPWNvbXB1dGVPdXRwdXRTaGFwZTNEKFt0LG4sMV0sYSwxLHIsZSxzKTtsPXBbMF0sYz1wWzFdfWVsc2UgaWYoXCJzYW1lXCI9PT1lKXt2YXIgZD0oKGw9TWF0aC5jZWlsKHQvcikpLTEpKnIrYS10LGg9KChjPU1hdGguY2VpbChuL28pKS0xKSpvK2ktbixmPU1hdGguZmxvb3IoZC8yKSxtPWQtZixnPU1hdGguZmxvb3IoaC8yKTt1PXt0b3A6Zixib3R0b206bSxsZWZ0OmcscmlnaHQ6aC1nLHR5cGU6XCJTQU1FXCJ9fWVsc2V7aWYoXCJ2YWxpZFwiIT09ZSl0aHJvdyBFcnJvcihcIlVua25vd24gcGFkZGluZyBwYXJhbWV0ZXI6IFwiK2UpO3U9e3RvcDowLGJvdHRvbTowLGxlZnQ6MCxyaWdodDowLHR5cGU6XCJWQUxJRFwifSxsPU1hdGguY2VpbCgodC1hKzEpL3IpLGM9TWF0aC5jZWlsKChuLWkrMSkvbyl9cmV0dXJue3BhZEluZm86dSxvdXRIZWlnaHQ6bCxvdXRXaWR0aDpjfX1mdW5jdGlvbiBjb25kaXRpb25hbFJvdW5kKGUsdCl7aWYoIXQpcmV0dXJuIGU7c3dpdGNoKHQpe2Nhc2VcInJvdW5kXCI6cmV0dXJuIE1hdGgucm91bmQoZSk7Y2FzZVwiY2VpbFwiOnJldHVybiBNYXRoLmNlaWwoZSk7Y2FzZVwiZmxvb3JcIjpyZXR1cm4gTWF0aC5mbG9vcihlKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihcIlVua25vd24gcm91bmRpbmdNb2RlIFwiK3QpfX1mdW5jdGlvbiBtYXRNdWxfKGUsdCxuLHIpe3ZvaWQgMD09PW4mJihuPSExKSx2b2lkIDA9PT1yJiYocj0hMSk7dmFyIG89Y29udmVydFRvVGVuc29yKGUsXCJhXCIsXCJtYXRNdWxcIiksYT1jb252ZXJ0VG9UZW5zb3IodCxcImJcIixcIm1hdE11bFwiKSxpPW4/by5zaGFwZVtvLnJhbmstMl06by5zaGFwZVtvLnJhbmstMV0scz1yP2Euc2hhcGVbYS5yYW5rLTFdOmEuc2hhcGVbYS5yYW5rLTJdLHU9bj9vLnNoYXBlW28ucmFuay0xXTpvLnNoYXBlW28ucmFuay0yXSxsPXI/YS5zaGFwZVthLnJhbmstMl06YS5zaGFwZVthLnJhbmstMV0sYz1vLnNoYXBlLnNsaWNlKDAsLTIpLHA9YS5zaGFwZS5zbGljZSgwLC0yKSxkPXNpemVGcm9tU2hhcGUoYyksaD1zaXplRnJvbVNoYXBlKHApO2Fzc2VydChvLnJhbms+PTImJmEucmFuaz49MiYmby5yYW5rPT09YS5yYW5rLFwiRXJyb3IgaW4gbWF0TXVsOiBpbnB1dHMgbXVzdCBoYXZlIHRoZSBzYW1lIHJhbmsgb2YgYXQgbGVhc3QgMiwgZ290IHJhbmtzIFwiK28ucmFuaytcIiBhbmQgXCIrYS5yYW5rK1wiLlwiKSxhc3NlcnQoYXJyYXlzRXF1YWwoYyxwKSxcIkVycm9yIGluIG1hdE11bDogb3V0ZXIgZGltZW5zaW9ucyAoXCIrYytcIikgYW5kIChcIitwK1wiKSBvZiBUZW5zb3JzIHdpdGggc2hhcGVzIFwiK28uc2hhcGUrXCIgYW5kIFwiK2Euc2hhcGUrXCIgbXVzdCBtYXRjaC5cIiksYXNzZXJ0KGk9PT1zLFwiRXJyb3IgaW4gbWF0TXVsOiBpbm5lciBzaGFwZXMgKFwiK2krXCIpIGFuZCAoXCIrcytcIikgb2YgVGVuc29ycyB3aXRoIHNoYXBlcyBcIitvLnNoYXBlK1wiIGFuZCBcIithLnNoYXBlK1wiIGFuZCB0cmFuc3Bvc2VBPVwiK24rXCIgYW5kIHRyYW5zcG9zZUI9XCIrcitcIiBtdXN0IG1hdGNoLlwiKTt2YXIgZj1vLnNoYXBlLnNsaWNlKDAsLTIpLmNvbmNhdChbdSxsXSksbT1uP28uYXMzRChkLGksdSk6by5hczNEKGQsdSxpKSxnPXI/YS5hczNEKGgsbCxzKTphLmFzM0QoaCxzLGwpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5iYXRjaE1hdE11bChtLGcsbixyKX0seyRhOm0sJGI6Z30sZnVuY3Rpb24oZSl7cmV0dXJuIG58fHI/IW4mJnI/eyRhOmZ1bmN0aW9uKCl7cmV0dXJuIGUubWF0TXVsKGcudG9GbG9hdCgpLCExLCExKX0sJGI6ZnVuY3Rpb24oKXtyZXR1cm4gZS5tYXRNdWwobS50b0Zsb2F0KCksITAsITEpfX06biYmIXI/eyRhOmZ1bmN0aW9uKCl7cmV0dXJuIGcudG9GbG9hdCgpLm1hdE11bChlLCExLCEwKX0sJGI6ZnVuY3Rpb24oKXtyZXR1cm4gbS50b0Zsb2F0KCkubWF0TXVsKGUsITEsITEpfX06eyRhOmZ1bmN0aW9uKCl7cmV0dXJuIGcudG9GbG9hdCgpLm1hdE11bChlLCEwLCEwKX0sJGI6ZnVuY3Rpb24oKXtyZXR1cm4gZS5tYXRNdWwobS50b0Zsb2F0KCksITAsITApfX06eyRhOmZ1bmN0aW9uKCl7cmV0dXJuIGUubWF0TXVsKGcudG9GbG9hdCgpLCExLCEwKX0sJGI6ZnVuY3Rpb24oKXtyZXR1cm4gbS50b0Zsb2F0KCkubWF0TXVsKGUsITAsITEpfX19KS5yZXNoYXBlKGYpfWZ1bmN0aW9uIG91dGVyUHJvZHVjdF8oZSx0KXt2YXIgbj1jb252ZXJ0VG9UZW5zb3IoZSxcInYxXCIsXCJvdXRlclByb2R1Y3RcIikscj1jb252ZXJ0VG9UZW5zb3IodCxcInYyXCIsXCJvdXRlclByb2R1Y3RcIik7cmV0dXJuIGFzc2VydCgxPT09bi5yYW5rJiYxPT09ci5yYW5rLFwiRXJyb3IgaW4gb3V0ZXJQcm9kdWN0OiBpbnB1dHMgbXVzdCBiZSByYW5rIDEsIGJ1dCBnb3QgcmFua3MgXCIrbi5yYW5rK1wiIGFuZCBcIityLnJhbmsrXCIuXCIpLG4uYXMyRCgtMSwxKS5tYXRNdWwoci5hczJEKDEsLTEpKX1mdW5jdGlvbiBkb3RfKGUsdCl7dmFyIG49Y29udmVydFRvVGVuc29yKGUsXCJ0MVwiLFwiZG90XCIpLHI9Y29udmVydFRvVGVuc29yKHQsXCJ0MlwiLFwiZG90XCIpO2Fzc2VydCghKDEhPT1uLnJhbmsmJjIhPT1uLnJhbmt8fDEhPT1yLnJhbmsmJjIhPT1yLnJhbmspLFwiRXJyb3IgaW4gZG90OiBpbnB1dHMgbXVzdCBhbGwgYmUgcmFuayAxIG9yIDIsIGJ1dCBnb3QgcmFua3MgXCIrbi5yYW5rK1wiIGFuZCBcIityLnJhbmsrXCIuXCIpO3ZhciBvPTE9PT1uLnJhbms/bi5zaXplOm4uc2hhcGVbMV0sYT0xPT09ci5yYW5rP3Iuc2l6ZTpyLnNoYXBlWzBdO3JldHVybiBhc3NlcnQobz09PWEsXCJFcnJvciBpbiBkb3Q6IGlubmVyIGRpbWVuc2lvbnMgb2YgaW5wdXRzIG11c3QgbWF0Y2gsIGJ1dCBnb3QgXCIrbytcIiBhbmQgXCIrYStcIi5cIiksMT09PW4ucmFuayYmMT09PXIucmFuaz9uLmFzMkQoMSwtMSkubWF0TXVsKHIuYXMyRCgtMSwxKSkuYXNTY2FsYXIoKToxPT09bi5yYW5rJiYyPT09ci5yYW5rP24uYXMyRCgxLC0xKS5tYXRNdWwoci5hczJEKHIuc2hhcGVbMF0sci5zaGFwZVsxXSkpLmFzMUQoKToyPT09bi5yYW5rJiYxPT09ci5yYW5rP24ubWF0TXVsKHIuYXMyRCgtMSwxKSkuYXMxRCgpOm4ubWF0TXVsKHIuYXMyRChyLnNoYXBlWzBdLHIuc2hhcGVbMV0pKX12YXIgbWF0TXVsPW9wKHttYXRNdWxfOm1hdE11bF99KSxkb3Q9b3Aoe2RvdF86ZG90X30pLG91dGVyUHJvZHVjdD1vcCh7b3V0ZXJQcm9kdWN0XzpvdXRlclByb2R1Y3RffSk7ZnVuY3Rpb24gY29udjFkXyhlLHQsbixyLG8sYSxpKXt2b2lkIDA9PT1vJiYobz1cIk5XQ1wiKSx2b2lkIDA9PT1hJiYoYT0xKTt2YXIgcz1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcImNvbnYxZFwiKSx1PWNvbnZlcnRUb1RlbnNvcih0LFwiZmlsdGVyXCIsXCJjb252MWRcIiksbD1zLGM9ITE7Mj09PXMucmFuayYmKGM9ITAsbD1zLmFzM0QoMSxzLnNoYXBlWzBdLHMuc2hhcGVbMV0pKSxhc3NlcnQoMz09PWwucmFuayxcIkVycm9yIGluIGNvbnYxZDogaW5wdXQgbXVzdCBiZSByYW5rIDMsIGJ1dCBnb3QgcmFuayBcIitsLnJhbmsrXCIuXCIpLGFzc2VydCgzPT09dS5yYW5rLFwiRXJyb3IgaW4gY29udjFkOiBmaWx0ZXIgbXVzdCBiZSByYW5rIDMsIGJ1dCBnb3QgcmFuayBcIit1LnJhbmsrXCIuXCIpLG51bGwhPWkmJmFzc2VydChpc0ludChyKSxcIkVycm9yIGluIGNvbnYxZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBkaW1Sb3VuZGluZ01vZGUgXCIraStcIiBidXQgZ290IHBhZCBcIityK1wiLlwiKSxhc3NlcnQobC5zaGFwZVsyXT09PXUuc2hhcGVbMV0sXCJFcnJvciBpbiBjb252MWQ6IGRlcHRoIG9mIGlucHV0IChcIitsLnNoYXBlWzJdK1wiKSBtdXN0IG1hdGNoIGlucHV0IGRlcHRoIGZvciBmaWx0ZXIgXCIrdS5zaGFwZVsxXStcIi5cIiksYXNzZXJ0KGVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShuLGEpLFwiRXJyb3IgaW4gY29udjFEOiBFaXRoZXIgc3RyaWRlIG9yIGRpbGF0aW9uIG11c3QgYmUgMS4gR290IHN0cmlkZSBcIituK1wiIGFuZCBkaWxhdGlvbiAnXCIrYStcIidcIiksYXNzZXJ0KFwiTldDXCI9PT1vLFwiRXJyb3IgaW4gY29udjFkOiBnb3QgZGF0YUZvcm1hdCBvZiBcIitvK1wiIGJ1dCBvbmx5IE5XQyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlwiKTt2YXIgcD11LmFzNEQoMSx1LnNoYXBlWzBdLHUuc2hhcGVbMV0sdS5zaGFwZVsyXSksZD1sLmFzNEQobC5zaGFwZVswXSwxLGwuc2hhcGVbMV0sbC5zaGFwZVsyXSksaD1jb252MmQoZCxwLFsxLG5dLHIsXCJOSFdDXCIsWzEsYV0saSk7cmV0dXJuIGM/aC5hczJEKGguc2hhcGVbMl0saC5zaGFwZVszXSk6aC5hczNEKGguc2hhcGVbMF0saC5zaGFwZVsyXSxoLnNoYXBlWzNdKX1mdW5jdGlvbiBjb252MmRfKGUsdCxuLHIsbyxhLGkpe3ZvaWQgMD09PW8mJihvPVwiTkhXQ1wiKSx2b2lkIDA9PT1hJiYoYT1bMSwxXSk7dmFyIHM9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJjb252MmRcIiksdT1jb252ZXJ0VG9UZW5zb3IodCxcImZpbHRlclwiLFwiY29udjJkXCIpLGw9cyxjPSExOzM9PT1zLnJhbmsmJihjPSEwLGw9cy5hczREKDEscy5zaGFwZVswXSxzLnNoYXBlWzFdLHMuc2hhcGVbMl0pKSxhc3NlcnQoND09PWwucmFuayxcIkVycm9yIGluIGNvbnYyZDogaW5wdXQgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgcmFuayBcIitsLnJhbmsrXCIuXCIpLGFzc2VydCg0PT09dS5yYW5rLFwiRXJyb3IgaW4gY29udjJkOiBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgcmFuayBcIit1LnJhbmsrXCIuXCIpLG51bGwhPWkmJmFzc2VydChpc0ludChyKSxcIkVycm9yIGluIGNvbnYyZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBkaW1Sb3VuZGluZ01vZGUgXCIraStcIiBidXQgZ290IHBhZCBcIityK1wiLlwiKSxhc3NlcnQobC5zaGFwZVszXT09PXUuc2hhcGVbMl0sXCJFcnJvciBpbiBjb252MmQ6IGRlcHRoIG9mIGlucHV0IChcIitsLnNoYXBlWzNdK1wiKSBtdXN0IG1hdGNoIGlucHV0IGRlcHRoIGZvciBmaWx0ZXIgXCIrdS5zaGFwZVsyXStcIi5cIiksYXNzZXJ0KGVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShuLGEpLFwiRXJyb3IgaW4gY29udjJEOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAxLiBHb3Qgc3RyaWRlcyBcIituK1wiIGFuZCBkaWxhdGlvbnMgJ1wiK2ErXCInXCIpLGFzc2VydChcIk5IV0NcIj09PW8sXCJFcnJvciBpbiBjb252MmQ6IGdvdCBkYXRhRm9ybWF0IG9mIFwiK28rXCIgYnV0IG9ubHkgTkhXQyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlwiKTt2YXIgcCxkPWNvbXB1dGVDb252MkRJbmZvKGwuc2hhcGUsdS5zaGFwZSxuLGEscixpKTtpZigxIT09ZC5maWx0ZXJIZWlnaHR8fDEhPT1kLmZpbHRlcldpZHRofHwxIT09ZC5kaWxhdGlvbkhlaWdodHx8MSE9PWQuZGlsYXRpb25XaWR0aHx8MSE9PWQuc3RyaWRlSGVpZ2h0fHwxIT09ZC5zdHJpZGVXaWR0aHx8XCJTQU1FXCIhPT1kLnBhZEluZm8udHlwZSYmXCJWQUxJRFwiIT09ZC5wYWRJbmZvLnR5cGUpe3A9RU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29udjJkKGwsdSxkKX0se3g6bCwkZmlsdGVyOnV9LGZ1bmN0aW9uKGUpe3JldHVybiBhc3NlcnQodHVwbGVWYWx1ZXNBcmVPbmUoYSksXCJFcnJvciBpbiBncmFkaWVudCBvZiBjb252MkQ6IGRpbGF0aW9uIHJhdGVzIGdyZWF0ZXIgdGhhbiAxIGFyZSBub3R5ZXQgc3VwcG9ydGVkIGluIGdyYWRpZW50cy4gR290IGRpbGF0aW9ucyAnXCIrYStcIidcIikse3g6ZnVuY3Rpb24oKXtyZXR1cm4gY29udjJkRGVySW5wdXRfKGwuc2hhcGUsZSx1LG4scil9LCRmaWx0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gY29udjJkRGVyRmlsdGVyXyhsLGUsdS5zaGFwZSxuLHIpfX19KX1lbHNle3ZhciBoPWwucmVzaGFwZShbLTEsZC5pbkNoYW5uZWxzXSksZj11LnJlc2hhcGUoW2QuaW5DaGFubmVscyxkLm91dENoYW5uZWxzXSk7cD1tYXRNdWwoaCxmKS5yZXNoYXBlKGQub3V0U2hhcGUpfXJldHVybiBjP3AuYXMzRChwLnNoYXBlWzFdLHAuc2hhcGVbMl0scC5zaGFwZVszXSk6cH1mdW5jdGlvbiBjb252MmREZXJJbnB1dF8oZSx0LG4scixvLGEpe2Fzc2VydChlLmxlbmd0aD09PXQucmFuayxcIkxlbmd0aCBvZiBpblNoYXBlIChcIitlLmxlbmd0aCtcIikgYW5kIHJhbmsgb2YgZHkgKFwiK3QucmFuaytcIikgbXVzdCBtYXRjaFwiKTt2YXIgaT1lLHM9dCx1PSExOzM9PT10LnJhbmsmJih1PSEwLHM9dC5hczREKDEsdC5zaGFwZVswXSx0LnNoYXBlWzFdLHQuc2hhcGVbMl0pLGk9WzEsZVswXSxlWzFdLGVbMl1dKTt2YXIgbD1pWzNdLGM9cy5zaGFwZVszXTthc3NlcnQoND09PWkubGVuZ3RoLFwiRXJyb3IgaW4gY29udjJkRGVySW5wdXQ6IGluU2hhcGUgbXVzdCBiZSBsZW5ndGggNCwgYnV0IGdvdCBsZW5ndGggXCIraS5sZW5ndGgrXCIuXCIpLGFzc2VydCg0PT09cy5yYW5rLFwiRXJyb3IgaW4gY29udjJkRGVySW5wdXQ6IGR5IG11c3QgYmUgcmFuayA0LCBidXQgZ290IHJhbmsgXCIrcy5yYW5rKSxhc3NlcnQoND09PW4ucmFuayxcIkVycm9yIGluIGNvbnYyZERlcklucHV0OiBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgcmFuayBcIituLnJhbmspLGFzc2VydChsPT09bi5zaGFwZVsyXSxcIkVycm9yIGluIGNvbnYyZERlcklucHV0OiBkZXB0aCBvZiBpbnB1dCAoXCIrbCtcIikgbXVzdCBtYXRjaCBpbnB1dCBkZXB0aCBmb3IgZmlsdGVyIFwiK24uc2hhcGVbMl0rXCIuXCIpLGFzc2VydChjPT09bi5zaGFwZVszXSxcIkVycm9yIGluIGNvbnYyZERlcklucHV0OiBkZXB0aCBvZiBvdXRwdXQgKFwiK2MrXCIpIG11c3QgbWF0Y2ggb3V0cHV0IGRlcHRoIGZvciBmaWx0ZXIgXCIrbi5zaGFwZVszXStcIi5cIiksbnVsbCE9YSYmYXNzZXJ0KGlzSW50KG8pLFwiRXJyb3IgaW4gY29udjJkRGVySW5wdXQ6IHBhZCBtdXN0IGJlIGFuIGludGVnZXIgd2hlbiB1c2luZywgZGltUm91bmRpbmdNb2RlIFwiK2ErXCIgYnV0IGdvdCBwYWQgXCIrbytcIi5cIik7dmFyIHA9Y29tcHV0ZUNvbnYyREluZm8oaSxuLnNoYXBlLHIsMSxvLGEpLGQ9RU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29udjJkRGVySW5wdXQocyxuLHApfSx7ZHk0RDpzfSk7cmV0dXJuIHU/ZC5hczNEKGQuc2hhcGVbMV0sZC5zaGFwZVsyXSxkLnNoYXBlWzNdKTpkfWZ1bmN0aW9uIGNvbnYyZERlckZpbHRlcl8oZSx0LG4scixvLGEpe3ZhciBpPWU7Mz09PWUucmFuayYmKGk9ZS5hczREKDEsZS5zaGFwZVswXSxlLnNoYXBlWzFdLGUuc2hhcGVbMl0pKTt2YXIgcz10OzM9PT1zLnJhbmsmJihzPXQuYXM0RCgxLHQuc2hhcGVbMF0sdC5zaGFwZVsxXSx0LnNoYXBlWzJdKSksYXNzZXJ0KDQ9PT1pLnJhbmssXCJFcnJvciBpbiBjb252MmREZXJGaWx0ZXI6IGlucHV0IG11c3QgYmUgcmFuayA0LCBidXQgZ290IHNoYXBlIFwiK2kuc2hhcGUrXCIuXCIpLGFzc2VydCg0PT09cy5yYW5rLFwiRXJyb3IgaW4gY29udjJkRGVyRmlsdGVyOiBkeSBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBzaGFwZSBcIitzLnNoYXBlK1wiLlwiKSxhc3NlcnQoND09PW4ubGVuZ3RoLFwiRXJyb3IgaW4gY29udjJkRGVyRmlsdGVyOiBmaWx0ZXJTaGFwZSBtdXN0IGJlIGxlbmd0aCA0LCBidXQgZ290IFwiK24rXCIuXCIpLGFzc2VydChpLnNoYXBlWzNdPT09blsyXSxcIkVycm9yIGluIGNvbnYyZERlckZpbHRlcjogZGVwdGggb2YgaW5wdXQgXCIraS5zaGFwZVszXStcIikgbXVzdCBtYXRjaCBpbnB1dCBkZXB0aCBpbiBmaWx0ZXIgKFwiK25bMl0rXCIuXCIpLGFzc2VydChzLnNoYXBlWzNdPT09blszXSxcIkVycm9yIGluIGNvbnYyZERlckZpbHRlcjogZGVwdGggb2YgZHkgKFwiK3Muc2hhcGVbM10rXCIpIG11c3QgbWF0Y2ggb3V0cHV0IGRlcHRoIGZvciBmaWx0ZXIgKFwiK25bM10rXCIpLlwiKSxudWxsIT1hJiZhc3NlcnQoaXNJbnQobyksXCJFcnJvciBpbiBjb252MmREZXJGaWx0ZXI6IHBhZCBtdXN0IGJlIGFuIGludGVnZXIgd2hlbiB1c2luZywgZGltUm91bmRpbmdNb2RlIFwiK2ErXCIgYnV0IGdvdCBwYWQgXCIrbytcIi5cIik7dmFyIHU9Y29tcHV0ZUNvbnYyREluZm8oaS5zaGFwZSxuLHIsMSxvLGEpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5jb252MmREZXJGaWx0ZXIoaSxzLHUpfSx7eDREOmksZHk0RDpzfSl9ZnVuY3Rpb24gY29udjJkVHJhbnNwb3NlXyhlLHQsbixyLG8sYSl7cmV0dXJuIGNvbnYyZERlcklucHV0XyhuLGNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwiY29udjJkVHJhbnNwb3NlXCIpLGNvbnZlcnRUb1RlbnNvcih0LFwiZmlsdGVyXCIsXCJjb252MmRUcmFuc3Bvc2VcIikscixvLGEpfWZ1bmN0aW9uIGRlcHRod2lzZUNvbnYyZF8oZSx0LG4scixvLGEsaSl7dm9pZCAwPT09byYmKG89XCJOSFdDXCIpLHZvaWQgMD09PWEmJihhPVsxLDFdKTt2YXIgcz1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcImRlcHRod2lzZUNvbnYyZFwiKSx1PWNvbnZlcnRUb1RlbnNvcih0LFwiZmlsdGVyXCIsXCJkZXB0aHdpc2VDb252MmRcIiksbD1zLGM9ITE7Mz09PXMucmFuayYmKGM9ITAsbD1zLmFzNEQoMSxzLnNoYXBlWzBdLHMuc2hhcGVbMV0scy5zaGFwZVsyXSkpLGFzc2VydCg0PT09bC5yYW5rLFwiRXJyb3IgaW4gZGVwdGh3aXNlQ29udjJkOiBpbnB1dCBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCByYW5rIFwiK2wucmFuaytcIi5cIiksYXNzZXJ0KDQ9PT11LnJhbmssXCJFcnJvciBpbiBkZXB0aHdpc2VDb252MmQ6IGZpbHRlciBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCByYW5rIFwiK3UucmFuaytcIi5cIiksYXNzZXJ0KGwuc2hhcGVbM109PT11LnNoYXBlWzJdLFwiRXJyb3IgaW4gZGVwdGh3aXNlQ29udjJkOiBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMgKFwiK2wuc2hhcGVbM10rXCIpIG11c3QgbWF0Y2ggdGhlIGluQ2hhbm5lbHMgZGltZW5zaW9uIGluIGZpbHRlciBcIit1LnNoYXBlWzJdK1wiLlwiKSxudWxsPT1hJiYoYT1bMSwxXSksYXNzZXJ0KGVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShuLGEpLFwiRXJyb3IgaW4gZGVwdGh3aXNlQ29udjJkOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAxLiBHb3Qgc3RyaWRlcyBcIituK1wiIGFuZCBkaWxhdGlvbnMgJ1wiK2ErXCInXCIpLG51bGwhPWkmJmFzc2VydChpc0ludChyKSxcIkVycm9yIGluIGRlcHRod2lzZUNvbnYyZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBkaW1Sb3VuZGluZ01vZGUgXCIraStcIiBidXQgZ290IHBhZCBcIityK1wiLlwiKTt2YXIgcD1jb21wdXRlQ29udjJESW5mbyhsLnNoYXBlLHUuc2hhcGUsbixhLHIsaSwhMCksZD1FTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5kZXB0aHdpc2VDb252MkQobCx1LHApfSx7eDpsLCRmaWx0ZXI6dX0sZnVuY3Rpb24oZSl7cmV0dXJuIGFzc2VydCh0dXBsZVZhbHVlc0FyZU9uZShhKSxcIkVycm9yIGluIGdyYWRpZW50IG9mIGRlcHRod2lzZUNvbnYyZDogZGlsYXRpb24gcmF0ZXMgZ3JlYXRlciB0aGFuIDEgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLiBHb3QgZGlsYXRpb25zICdcIithK1wiJ1wiKSx7eDpmdW5jdGlvbigpe3JldHVybiBkZXB0aHdpc2VDb252MmREZXJJbnB1dChsLnNoYXBlLGUsdSxwKX0sJGZpbHRlcjpmdW5jdGlvbigpe3JldHVybiBkZXB0aHdpc2VDb252MmREZXJGaWx0ZXIobCxlLHUuc2hhcGUscCl9fX0pO3JldHVybiBjP2QuYXMzRChkLnNoYXBlWzFdLGQuc2hhcGVbMl0sZC5zaGFwZVszXSk6ZH1mdW5jdGlvbiBzZXBhcmFibGVDb252MmRfKGUsdCxuLHIsbyxhLGkpe3ZvaWQgMD09PWEmJihhPVsxLDFdKSx2b2lkIDA9PT1pJiYoaT1cIk5IV0NcIik7dmFyIHM9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJzZXBhcmFibGVDb252MmRcIiksdT1jb252ZXJ0VG9UZW5zb3IodCxcImRlcHRod2lzZUZpbHRlclwiLFwic2VwYXJhYmxlQ29udjJkXCIpLGw9Y29udmVydFRvVGVuc29yKG4sXCJwb2ludHdpc2VGaWx0ZXJcIixcInNlcGFyYWJsZUNvbnYyZFwiKSxjPXMscD0hMTtpZigzPT09cy5yYW5rJiYocD0hMCxjPXMuYXM0RCgxLHMuc2hhcGVbMF0scy5zaGFwZVsxXSxzLnNoYXBlWzJdKSksXCJOQ0hXXCI9PT1pKXRocm93IG5ldyBFcnJvcihcInNlcGFyYWJsZUNvbnYyZCBjdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydCBkYXRhRm9ybWF0IE5DSFc7IG9ubHkgTkhXQyBpcyBzdXBwb3J0ZWRcIik7YXNzZXJ0KDQ9PT1jLnJhbmssXCJFcnJvciBpbiBzZXBhcmFibGVDb252MmQ6IGlucHV0IG11c3QgYmUgcmFuayA0LCBidXQgZ290IHJhbmsgXCIrYy5yYW5rK1wiLlwiKSxhc3NlcnQoND09PXUucmFuayxcIkVycm9yIGluIHNlcGFyYWJsZUNvbnYyZDogZGVwdGh3aXNlIGZpbHRlciBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCByYW5rIFwiK3UucmFuaytcIi5cIiksYXNzZXJ0KDQ9PT1sLnJhbmssXCJFcnJvciBpbiBzZXBhcmFibGVDb252MmQ6IHBvaW50d2lzZSBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgcmFuayBcIit1LnJhbmsrXCIuXCIpLGFzc2VydCgxPT09bC5zaGFwZVswXSxcIkVycm9yIGluIHNlcGFyYWJsZUNvbnYyZDogdGhlIGZpcnN0IGRpbWVuc2lvbiBvZiBwb2ludHdpc2UgZmlsdGVyICBtdXN0IGJlIDEsIGJ1dCBnb3QgXCIrbC5zaGFwZVswXStcIi5cIiksYXNzZXJ0KDE9PT1sLnNoYXBlWzFdLFwiRXJyb3IgaW4gc2VwYXJhYmxlQ29udjJkOiB0aGUgc2Vjb25kIGRpbWVuc2lvbiBvZiBwb2ludHdpc2UgZmlsdGVyICBtdXN0IGJlIDEsIGJ1dCBnb3QgXCIrbC5zaGFwZVsxXStcIi5cIik7dmFyIGQ9dS5zaGFwZVsyXSxoPXUuc2hhcGVbM107YXNzZXJ0KGwuc2hhcGVbMl09PT1kKmgsXCJFcnJvciBpbiBzZXBhcmFibGVDb252MmQ6IHRoZSB0aGlyZCBkaW1lbnNpb24gb2YgcG9pbnR3aXNlIGZpbHRlciBtdXN0IGJlIFwiK2QqaCtcIiwgYnV0IGdvdCBcIitsLnNoYXBlWzJdK1wiLlwiKTt2YXIgZj1kZXB0aHdpc2VDb252MmQoYyx1LHIsbyxpLGEpLG09Y29udjJkKGYsbCwxLFwidmFsaWRcIixpKTtyZXR1cm4gcD9tLmFzM0QobS5zaGFwZVsxXSxtLnNoYXBlWzJdLG0uc2hhcGVbM10pOm19ZnVuY3Rpb24gcGFyc2VUdXBsZVBhcmFtJDEoZSl7cmV0dXJuXCJudW1iZXJcIj09dHlwZW9mIGU/W2UsZV06ZX1mdW5jdGlvbiB0dXBsZVZhbHVlc0FyZU9uZShlKXt2YXIgdD1wYXJzZVR1cGxlUGFyYW0kMShlKSxuPXRbMF0scj10WzFdO3JldHVybiAxPT09biYmMT09PXJ9ZnVuY3Rpb24gZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKGUsdCl7cmV0dXJuIHR1cGxlVmFsdWVzQXJlT25lKGUpfHx0dXBsZVZhbHVlc0FyZU9uZSh0KX1mdW5jdGlvbiBkZXB0aHdpc2VDb252MmREZXJJbnB1dChlLHQsbixyKXt2YXIgbz10LGE9ITE7Mz09PXQucmFuayYmKGE9ITAsbz10LmFzNEQoMSx0LnNoYXBlWzBdLHQuc2hhcGVbMV0sdC5zaGFwZVsyXSkpO3ZhciBpPUVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmRlcHRod2lzZUNvbnYyRERlcklucHV0KG8sbixyKX0se2R5NEQ6b30pO3JldHVybiBhP2kuYXMzRChpLnNoYXBlWzFdLGkuc2hhcGVbMl0saS5zaGFwZVszXSk6aX1mdW5jdGlvbiBkZXB0aHdpc2VDb252MmREZXJGaWx0ZXIoZSx0LG4scil7dmFyIG89ZTszPT09ZS5yYW5rJiYobz1lLmFzNEQoMSxlLnNoYXBlWzBdLGUuc2hhcGVbMV0sZS5zaGFwZVsyXSkpO3ZhciBhPXQ7cmV0dXJuIDM9PT1hLnJhbmsmJihhPXQuYXM0RCgxLHQuc2hhcGVbMF0sdC5zaGFwZVsxXSx0LnNoYXBlWzJdKSksRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGVwdGh3aXNlQ29udjJERGVyRmlsdGVyKG8sYSxyKX0se3g0RDpvLGR5NEQ6YX0pfXZhciBjb252MWQ9b3Aoe2NvbnYxZF86Y29udjFkX30pLGNvbnYyZD1vcCh7Y29udjJkXzpjb252MmRffSksZGVwdGh3aXNlQ29udjJkPW9wKHtkZXB0aHdpc2VDb252MmRfOmRlcHRod2lzZUNvbnYyZF99KSxzZXBhcmFibGVDb252MmQ9b3Aoe3NlcGFyYWJsZUNvbnYyZF86c2VwYXJhYmxlQ29udjJkX30pLGNvbnYyZFRyYW5zcG9zZT1vcCh7Y29udjJkVHJhbnNwb3NlXzpjb252MmRUcmFuc3Bvc2VffSk7ZnVuY3Rpb24gcmV2ZXJzZTFkXyhlKXt2YXIgdD1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcInJldmVyc2VcIik7cmV0dXJuIGFzc2VydCgxPT09dC5yYW5rLFwiRXJyb3IgaW4gcmV2ZXJzZTFEOiB4IG11c3QgYmUgcmFuayAxIGJ1dCBnb3RcXG4gICAgICAgICAgICAgcmFuayBcIit0LnJhbmsrXCIuXCIpLHJldmVyc2UodCwwKX1mdW5jdGlvbiByZXZlcnNlMmRfKGUsdCl7dmFyIG49Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJyZXZlcnNlXCIpO3JldHVybiBhc3NlcnQoMj09PW4ucmFuayxcIkVycm9yIGluIHJldmVyc2UyRDogeCBtdXN0IGJlIHJhbmsgMiBidXQgZ290XFxuICAgICAgICAgICAgIHJhbmsgXCIrbi5yYW5rK1wiLlwiKSxyZXZlcnNlKG4sdCl9ZnVuY3Rpb24gcmV2ZXJzZTNkXyhlLHQpe3ZhciBuPWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwicmV2ZXJzZVwiKTtyZXR1cm4gYXNzZXJ0KDM9PT1uLnJhbmssXCJFcnJvciBpbiByZXZlcnNlM0Q6IHggbXVzdCBiZSByYW5rIDMgYnV0IGdvdFxcbiAgICAgICAgICAgICByYW5rIFwiK24ucmFuaytcIi5cIikscmV2ZXJzZShuLHQpfWZ1bmN0aW9uIHJldmVyc2U0ZF8oZSx0KXt2YXIgbj1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcInJldmVyc2VcIik7cmV0dXJuIGFzc2VydCg0PT09bi5yYW5rLFwiRXJyb3IgaW4gcmV2ZXJzZTREOiB4IG11c3QgYmUgcmFuayA0IGJ1dCBnb3RcXG4gICAgICAgICAgICAgcmFuayBcIituLnJhbmsrXCIuXCIpLHJldmVyc2Uobix0KX1mdW5jdGlvbiByZXZlcnNlXyhlLHQpe3ZhciBuPWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwicmV2ZXJzZVwiKTtpZigwPT09bi5yYW5rKXJldHVybiBuLmNsb25lKCk7dmFyIHI9cGFyc2VBeGlzUGFyYW0odCxuLnNoYXBlKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmV2ZXJzZShuLHIpfSx7JHg6bn0sZnVuY3Rpb24oZSl7cmV0dXJueyR4OmZ1bmN0aW9uKCl7cmV0dXJuIGUucmV2ZXJzZShyKX19fSkucmVzaGFwZUFzKG4pfXZhciByZXZlcnNlPW9wKHtyZXZlcnNlXzpyZXZlcnNlX30pLHJldmVyc2UxZD1vcCh7cmV2ZXJzZTFkXzpyZXZlcnNlMWRffSkscmV2ZXJzZTJkPW9wKHtyZXZlcnNlMmRfOnJldmVyc2UyZF99KSxyZXZlcnNlM2Q9b3Aoe3JldmVyc2UzZF86cmV2ZXJzZTNkX30pLHJldmVyc2U0ZD1vcCh7cmV2ZXJzZTRkXzpyZXZlcnNlNGRffSk7ZnVuY3Rpb24gbWF4UG9vbF8oZSx0LG4scixvKXt2YXIgYT1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcIm1heFBvb2xcIiksaT1hLHM9ITE7Mz09PWEucmFuayYmKHM9ITAsaT1hLmFzNEQoMSxhLnNoYXBlWzBdLGEuc2hhcGVbMV0sYS5zaGFwZVsyXSkpLGFzc2VydCg0PT09aS5yYW5rLFwiRXJyb3IgaW4gbWF4UG9vbDogaW5wdXQgbXVzdCBiZSByYW5rIDQgYnV0IGdvdCByYW5rIFwiK2kucmFuaytcIi5cIiksbnVsbCE9byYmYXNzZXJ0KGlzSW50KHIpLFwiRXJyb3IgaW4gbWF4UG9vbDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBkaW1Sb3VuZGluZ01vZGUgXCIrbytcIiBidXQgZ290IHBhZCBcIityK1wiLlwiKTt2YXIgdT1jb21wdXRlUG9vbDJESW5mbyhpLnNoYXBlLHQsbixyLG8pLGw9RU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdChlLm1heFBvb2woaSx1KSl9LHt4Oml9LGZ1bmN0aW9uKGUsbyl7dmFyIGE9b1swXTtyZXR1cm57eDpmdW5jdGlvbigpe3JldHVybiBtYXhQb29sQmFja3Byb3AoZSxpLGEsdCxuLHIpfX19KTtyZXR1cm4gcz9sLmFzM0QobC5zaGFwZVsxXSxsLnNoYXBlWzJdLGwuc2hhcGVbM10pOmx9ZnVuY3Rpb24gYXZnUG9vbF8oZSx0LG4scixvKXt2YXIgYT1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcImF2Z1Bvb2xcIik7YXNzZXJ0KFwiZmxvYXQzMlwiPT09YS5kdHlwZSxcIlRoZSBpbnB1dCBkdHlwZSB0byBhdmdQb29sIG11c3QgYmUgZmxvYXQzMlwiKTt2YXIgaT1hLHM9ITE7Mz09PWEucmFuayYmKHM9ITAsaT1hLmFzNEQoMSxhLnNoYXBlWzBdLGEuc2hhcGVbMV0sYS5zaGFwZVsyXSkpLGFzc2VydCg0PT09aS5yYW5rLFwiRXJyb3IgaW4gYXZnUG9vbDogeCBtdXN0IGJlIHJhbmsgNCBidXQgZ290IHJhbmsgXCIraS5yYW5rK1wiLlwiKSxudWxsIT1vJiZhc3NlcnQoaXNJbnQociksXCJFcnJvciBpbiBhdmdQb29sOiBwYWQgbXVzdCBiZSBhbiBpbnRlZ2VyIHdoZW4gdXNpbmcsIGRpbVJvdW5kaW5nTW9kZSBcIitvK1wiIGJ1dCBnb3QgcGFkIFwiK3IrXCIuXCIpO3ZhciB1PWNvbXB1dGVQb29sMkRJbmZvKGkuc2hhcGUsdCxuLHIpLGw9RU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXZnUG9vbChpLHUpfSx7eDppfSxmdW5jdGlvbihlKXtyZXR1cm57eDpmdW5jdGlvbigpe3JldHVybiBhdmdQb29sQmFja3Byb3AoZSxpLHQsbixyKX19fSk7cmV0dXJuIGw9bC5jYXN0KGEuZHR5cGUpLHM/bC5hczNEKGwuc2hhcGVbMV0sbC5zaGFwZVsyXSxsLnNoYXBlWzNdKTpsfWZ1bmN0aW9uIG1heFBvb2xCYWNrcHJvcChlLHQsbixyLG8sYSxpKXt2YXIgcz1jb252ZXJ0VG9UZW5zb3IoZSxcImR5XCIsXCJtYXhQb29sQmFja3Byb3BcIiksdT1jb252ZXJ0VG9UZW5zb3IodCxcImlucHV0XCIsXCJtYXhQb29sQmFja3Byb3BcIiksbD1jb252ZXJ0VG9UZW5zb3IobixcIm91dHB1dFwiLFwibWF4UG9vbEJhY2twcm9wXCIpO2Fzc2VydCh1LnJhbms9PT1zLnJhbmssXCJSYW5rIG9mIGlucHV0IChcIit1LnJhbmsrXCIpIGRvZXMgbm90IG1hdGNoIHJhbmsgb2YgZHkgKFwiK3MucmFuaytcIilcIiksYXNzZXJ0KDQ9PT1zLnJhbmssXCJFcnJvciBpbiBtYXhQb29sQmFja3Byb3A6IGR5IG11c3QgYmUgcmFuayA0IGJ1dCBnb3QgcmFuayBcIitzLnJhbmsrXCIuXCIpLGFzc2VydCg0PT09dS5yYW5rLFwiRXJyb3IgaW4gbWF4UG9vbEJhY2twcm9wOiBpbnB1dCBtdXN0IGJlIHJhbmsgNCBidXQgZ290IHJhbmsgXCIrdS5yYW5rK1wiLlwiKSxudWxsIT1pJiZhc3NlcnQoaXNJbnQoYSksXCJFcnJvciBpbiBtYXhQb29sQmFja3Byb3A6IHBhZCBtdXN0IGJlIGFuIGludGVnZXIgd2hlbiB1c2luZywgZGltUm91bmRpbmdNb2RlIFwiK2krXCIgYnV0IGdvdCBwYWQgXCIrYStcIi5cIik7dmFyIGM9Y29tcHV0ZVBvb2wyREluZm8odS5zaGFwZSxyLG8sYSxpKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUubWF4UG9vbEJhY2twcm9wKHMsdSxsLGMpfSx7JGR5OnMsJGlucHV0OnV9KX1mdW5jdGlvbiBhdmdQb29sQmFja3Byb3AoZSx0LG4scixvKXt2YXIgYT1jb252ZXJ0VG9UZW5zb3IoZSxcImR5XCIsXCJhdmdQb29sQmFja3Byb3BcIiksaT1jb252ZXJ0VG9UZW5zb3IodCxcImlucHV0XCIsXCJhdmdQb29sQmFja3Byb3BcIik7YXNzZXJ0KGkucmFuaz09PWEucmFuayxcIlJhbmsgb2YgaW5wdXQgKFwiK2kucmFuaytcIikgZG9lcyBub3QgbWF0Y2ggcmFuayBvZiBkeSAoXCIrYS5yYW5rK1wiKVwiKTt2YXIgcz1pLHU9YSxsPSExOzM9PT1pLnJhbmsmJihsPSEwLHM9aS5hczREKDEsaS5zaGFwZVswXSxpLnNoYXBlWzFdLGkuc2hhcGVbMl0pLHU9YS5hczREKDEsYS5zaGFwZVswXSxhLnNoYXBlWzFdLGEuc2hhcGVbMl0pKSxhc3NlcnQoND09PXUucmFuayxcIkVycm9yIGluIGF2Z1Bvb2xCYWNrcHJvcDogZHkgbXVzdCBiZSByYW5rIDQgYnV0IGdvdCByYW5rIFwiK3UucmFuaytcIi5cIiksYXNzZXJ0KDQ9PT1zLnJhbmssXCJFcnJvciBpbiBhdmdQb29sQmFja3Byb3A6IGlucHV0IG11c3QgYmUgcmFuayA0IGJ1dCBnb3QgcmFuayBcIitzLnJhbmsrXCIuXCIpO3ZhciBjPWNvbXB1dGVQb29sMkRJbmZvKHMuc2hhcGUsbixyLG8pLHA9RU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXZnUG9vbEJhY2twcm9wKHUscyxjKX0se2R5NEQ6dSxpbnB1dDREOnN9KTtyZXR1cm4gbD9wLmFzM0QocC5zaGFwZVsxXSxwLnNoYXBlWzJdLHAuc2hhcGVbM10pOnB9dmFyIG1heFBvb2w9b3Aoe21heFBvb2xfOm1heFBvb2xffSksYXZnUG9vbD1vcCh7YXZnUG9vbF86YXZnUG9vbF99KTtmdW5jdGlvbiBzbGljZTFkXyhlLHQsbil7dmFyIHI9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJzbGljZTFkXCIpO3JldHVybiBhc3NlcnQoMT09PXIucmFuayxcInNsaWNlMWQgZXhwZWN0cyBhIHJhbmstMSB0ZW5zb3IsIGJ1dCBnb3QgYSByYW5rLVwiK3IucmFuaytcIiB0ZW5zb3JcIiksc2xpY2UocixbdF0sW25dKX1mdW5jdGlvbiBzbGljZTJkXyhlLHQsbil7dmFyIHI9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJzbGljZTJkXCIpO3JldHVybiBhc3NlcnQoMj09PXIucmFuayxcInNsaWNlMmQgZXhwZWN0cyBhIHJhbmstMiB0ZW5zb3IsIGJ1dCBnb3QgYSByYW5rLVwiK3IucmFuaytcIiB0ZW5zb3JcIiksc2xpY2Uocix0LG4pfWZ1bmN0aW9uIHNsaWNlM2RfKGUsdCxuKXt2YXIgcj1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcInNsaWNlM2RcIik7cmV0dXJuIGFzc2VydCgzPT09ci5yYW5rLFwic2xpY2UzZCBleHBlY3RzIGEgcmFuay0zIHRlbnNvciwgYnV0IGdvdCBhIHJhbmstXCIrci5yYW5rK1wiIHRlbnNvclwiKSxzbGljZShyLHQsbil9ZnVuY3Rpb24gc2xpY2U0ZF8oZSx0LG4pe3ZhciByPWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwic2xpY2U0ZFwiKTtyZXR1cm4gYXNzZXJ0KDQ9PT1yLnJhbmssXCJzbGljZTRkIGV4cGVjdHMgYSByYW5rLTQgdGVuc29yLCBidXQgZ290IGEgcmFuay1cIityLnJhbmsrXCIgdGVuc29yXCIpLHNsaWNlKHIsdCxuKX1mdW5jdGlvbiBzbGljZV8oZSx0LG4pe3ZhciByLG8sYT1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcInNsaWNlXCIpO2lmKDA9PT1hLnJhbmspdGhyb3cgbmV3IEVycm9yKFwiU2xpY2luZyBzY2FsYXIgaXMgbm90IHBvc3NpYmxlXCIpO3I9XCJudW1iZXJcIj09dHlwZW9mIHQ/W3RdLmNvbmNhdChuZXcgQXJyYXkoYS5yYW5rLTEpLmZpbGwoMCkpOnQubGVuZ3RoPGEucmFuaz90LmNvbmNhdChuZXcgQXJyYXkoYS5yYW5rLXQubGVuZ3RoKS5maWxsKDApKTp0LnNsaWNlKCksbz0obz1udWxsPT1uP25ldyBBcnJheShhLnJhbmspLmZpbGwoLTEpOlwibnVtYmVyXCI9PXR5cGVvZiBuP1tuXS5jb25jYXQobmV3IEFycmF5KGEucmFuay0xKS5maWxsKC0xKSk6bi5sZW5ndGg8YS5yYW5rP24uY29uY2F0KG5ldyBBcnJheShhLnJhbmstbi5sZW5ndGgpLmZpbGwoLTEpKTpuKS5tYXAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT49MD9lOihhc3NlcnQoLTE9PT1lLFwiQmFkIHZhbHVlIGluIHNpemVcIiksYS5zaGFwZVt0XS1yW3RdKX0pLGFzc2VydFBhcmFtc1ZhbGlkKGEscixvKTt2YXIgaT1hLnNoYXBlO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5zbGljZShhLHIsbyl9LHskeDphfSxmdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5yYW5rO24rKyl0LnB1c2goW3Jbbl0saVtuXS1yW25dLW9bbl1dKTtyZXR1cm57JHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5wYWQodCl9fX0pfXZhciBzbGljZT1vcCh7c2xpY2VfOnNsaWNlX30pLHNsaWNlMWQ9b3Aoe3NsaWNlMWRfOnNsaWNlMWRffSksc2xpY2UyZD1vcCh7c2xpY2UyZF86c2xpY2UyZF99KSxzbGljZTNkPW9wKHtzbGljZTNkXzpzbGljZTNkX30pLHNsaWNlNGQ9b3Aoe3NsaWNlNGRfOnNsaWNlNGRffSk7ZnVuY3Rpb24gbG9nU3VtRXhwXyhlLHQsbil7dm9pZCAwPT09dCYmKHQ9bnVsbCksdm9pZCAwPT09biYmKG49ITEpO3ZhciByPWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwibG9nU3VtRXhwXCIpLG89cGFyc2VBeGlzUGFyYW0odCxyLnNoYXBlKSxhPXIubWF4KG8sITApLGk9ci5zdWIoYSkuZXhwKCkuc3VtKG8pLmxvZygpLHM9YS5yZXNoYXBlKGkuc2hhcGUpLmFkZChpKTtpZihuKXt2YXIgdT1leHBhbmRTaGFwZVRvS2VlcERpbShzLnNoYXBlLG8pO3JldHVybiBzLnJlc2hhcGUodSl9cmV0dXJuIHN9ZnVuY3Rpb24gc3VtXyhlLHQsbil7dm9pZCAwPT09dCYmKHQ9bnVsbCksdm9pZCAwPT09biYmKG49ITEpO3ZhciByPWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwic3VtXCIpO1wiYm9vbFwiPT09ci5kdHlwZSYmKHI9ci50b0ludCgpKTt2YXIgbz1wYXJzZUF4aXNQYXJhbSh0LHIuc2hhcGUpO3JldHVybiBjdXN0b21HcmFkKGZ1bmN0aW9uKGUpe3ZhciB0PWdldEF4ZXNQZXJtdXRhdGlvbihvLGUucmFuaykscj1vLGE9ZTtudWxsIT10JiYoYT1lLnRyYW5zcG9zZSh0KSxyPWdldElubmVyTW9zdEF4ZXMoci5sZW5ndGgsZS5yYW5rKSk7dmFyIGk9RU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3VtKGEscil9LHtwZXJtdXRlZFg6YX0pO2lmKG4pe3ZhciBzPWV4cGFuZFNoYXBlVG9LZWVwRGltKGkuc2hhcGUsbyk7aT1pLnJlc2hhcGUocyl9cmV0dXJue3ZhbHVlOmksZ3JhZEZ1bmM6ZnVuY3Rpb24odCl7dmFyIG49ZS5zaGFwZS5zbGljZSgpO3JldHVybiBvLmZvckVhY2goZnVuY3Rpb24oZSl7bltlXT0xfSksdC5yZXNoYXBlKG4pLm11bChvbmVzJDEoZS5zaGFwZSxcImZsb2F0MzJcIikpfX19KShyKX1mdW5jdGlvbiBwcm9kXyhlLHQsbil7dm9pZCAwPT09dCYmKHQ9bnVsbCksdm9pZCAwPT09biYmKG49ITEpO3ZhciByPWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwicHJvZFwiKTtcImJvb2xcIj09PXIuZHR5cGUmJihyPXIudG9JbnQoKSk7dmFyIG89cGFyc2VBeGlzUGFyYW0odCxyLnNoYXBlKSxhPWdldEF4ZXNQZXJtdXRhdGlvbihvLHIucmFuayksaT1vLHM9cjtudWxsIT1hJiYocz1yLnRyYW5zcG9zZShhKSxpPWdldElubmVyTW9zdEF4ZXMoaS5sZW5ndGgsci5yYW5rKSk7dmFyIHU9RU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUucHJvZChzLGkpfSx7cGVybXV0ZWRYOnN9KTtpZihuKXt2YXIgbD1leHBhbmRTaGFwZVRvS2VlcERpbSh1LnNoYXBlLG8pO3U9dS5yZXNoYXBlKGwpfXJldHVybiB1fWZ1bmN0aW9uIG1lYW5fKGUsdCxuKXt2b2lkIDA9PT10JiYodD1udWxsKSx2b2lkIDA9PT1uJiYobj0hMSk7dmFyIHI9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJtZWFuXCIpLG89cGFyc2VBeGlzUGFyYW0odCxyLnNoYXBlKSxhPXNpemVGcm9tU2hhcGUoY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhyLnNoYXBlLG8pWzFdKTtyZXR1cm4gY3VzdG9tR3JhZChmdW5jdGlvbihlKXt2YXIgcj1zY2FsYXIoYSk7cmV0dXJue3ZhbHVlOihyLmR0eXBlPT09ZS5kdHlwZT9lOmUuY2FzdChyLmR0eXBlKSkuZGl2KHIpLnN1bSh0LG4pLGdyYWRGdW5jOmZ1bmN0aW9uKHQpe3ZhciBuPWUuc2hhcGUuc2xpY2UoKTtyZXR1cm4gby5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZV09MX0pLHQucmVzaGFwZShuKS5tdWwob25lcyQxKGUuc2hhcGUsXCJmbG9hdDMyXCIpKS5kaXYocil9fX0pKHIpfWZ1bmN0aW9uIGdyYWRGb3JNaW5BbmRNYXgoZSx0LG4scixvKXt2YXIgYT10WzBdO3JldHVybiBhLnJhbms8bi5yYW5rJiYoYT1hLnJlc2hhcGUoZXhwYW5kU2hhcGVUb0tlZXBEaW0oYS5zaGFwZSxyKSkpLGUucmFuazxuLnJhbmsmJihlPWUucmVzaGFwZShleHBhbmRTaGFwZVRvS2VlcERpbShlLnNoYXBlLHIpKSkseyR4OmZ1bmN0aW9uKCl7dmFyIHQ9ZS5tdWwobi5lcXVhbChhKS5jYXN0KGUuZHR5cGUpKTtyZXR1cm4gbnVsbD09bz90OnQudHJhbnNwb3NlKG8pfX19ZnVuY3Rpb24gbWluXyhlLHQsbil7dm9pZCAwPT09dCYmKHQ9bnVsbCksdm9pZCAwPT09biYmKG49ITEpO3ZhciByPWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwibWluXCIpLG89cixhPXBhcnNlQXhpc1BhcmFtKHQsci5zaGFwZSksaT1hLHM9Z2V0QXhlc1Blcm11dGF0aW9uKGksci5yYW5rKTtudWxsIT1zJiYocj1yLnRyYW5zcG9zZShzKSxpPWdldElubmVyTW9zdEF4ZXMoaS5sZW5ndGgsci5yYW5rKSk7dmFyIHU9RU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdChlLm1pbihyLGkpKX0seyR4OnJ9LGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGdyYWRGb3JNaW5BbmRNYXgoZSx0LG8sYSxzKX0pO2lmKG4pe3ZhciBsPWV4cGFuZFNoYXBlVG9LZWVwRGltKHUuc2hhcGUsYSk7dT11LnJlc2hhcGUobCl9cmV0dXJuIHV9ZnVuY3Rpb24gbWF4XyhlLHQsbil7dm9pZCAwPT09dCYmKHQ9bnVsbCksdm9pZCAwPT09biYmKG49ITEpO3ZhciByPWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwibWF4XCIpLG89cixhPXBhcnNlQXhpc1BhcmFtKHQsci5zaGFwZSksaT1hLHM9Z2V0QXhlc1Blcm11dGF0aW9uKGksci5yYW5rKTtudWxsIT1zJiYocj1yLnRyYW5zcG9zZShzKSxpPWdldElubmVyTW9zdEF4ZXMoaS5sZW5ndGgsci5yYW5rKSk7dmFyIHU9RU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdChlLm1heChyLGkpKX0seyR4OnJ9LGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGdyYWRGb3JNaW5BbmRNYXgoZSx0LG8sYSxzKX0pO2lmKG4pe3ZhciBsPWV4cGFuZFNoYXBlVG9LZWVwRGltKHUuc2hhcGUsYSk7dT11LnJlc2hhcGUobCl9cmV0dXJuIHV9ZnVuY3Rpb24gYXJnTWluXyhlLHQpe3ZvaWQgMD09PXQmJih0PTApO3ZhciBuPWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwiYXJnTWluXCIpO251bGw9PXQmJih0PTApO3ZhciByPXBhcnNlQXhpc1BhcmFtKHQsbi5zaGFwZSksbz1nZXRBeGVzUGVybXV0YXRpb24ocixuLnJhbmspO251bGwhPW8mJihuPW4udHJhbnNwb3NlKG8pLHI9Z2V0SW5uZXJNb3N0QXhlcyhyLmxlbmd0aCxuLnJhbmspKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXJnTWluKG4sclswXSl9LHskeDpufSxmdW5jdGlvbihlKXtyZXR1cm57JHg6ZnVuY3Rpb24oKXtyZXR1cm4gemVyb3NMaWtlKG4pfX19KX1mdW5jdGlvbiBhcmdNYXhfKGUsdCl7dm9pZCAwPT09dCYmKHQ9MCk7dmFyIG49Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJhcmdNYXhcIik7bnVsbD09dCYmKHQ9MCk7dmFyIHI9cGFyc2VBeGlzUGFyYW0odCxuLnNoYXBlKSxvPWdldEF4ZXNQZXJtdXRhdGlvbihyLG4ucmFuayk7bnVsbCE9byYmKG49bi50cmFuc3Bvc2Uobykscj1nZXRJbm5lck1vc3RBeGVzKHIubGVuZ3RoLG4ucmFuaykpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5hcmdNYXgobixyWzBdKX0seyR4Om59LGZ1bmN0aW9uKGUpe3JldHVybnskeDpmdW5jdGlvbigpe3JldHVybiB6ZXJvc0xpa2Uobil9fX0pfWZ1bmN0aW9uIGFsbF8oZSx0LG4pe3ZvaWQgMD09PXQmJih0PW51bGwpLHZvaWQgMD09PW4mJihuPSExKTt2YXIgcj1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcImFsbFwiLFwiYm9vbFwiKTthc3NlcnQoXCJib29sXCI9PT1yLmR0eXBlLFwiRXJyb3IgVGVuc29yIG11c3QgYmUgb2YgdHlwZSBib29sLiBHb3Q6IFwiK3IuZHR5cGUpO3ZhciBvPXBhcnNlQXhpc1BhcmFtKHQsci5zaGFwZSksYT1vLGk9Z2V0QXhlc1Blcm11dGF0aW9uKGEsci5yYW5rKTtudWxsIT1pJiYocj1yLnRyYW5zcG9zZShpKSxhPWdldElubmVyTW9zdEF4ZXMoYS5sZW5ndGgsci5yYW5rKSk7dmFyIHM9RU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYWxsKHIsYSl9LHskeDpyfSk7aWYobil7dmFyIHU9ZXhwYW5kU2hhcGVUb0tlZXBEaW0ocy5zaGFwZSxvKTtyZXR1cm4gcy5yZXNoYXBlKHUpfXJldHVybiBzfWZ1bmN0aW9uIGFueV8oZSx0LG4pe3ZvaWQgMD09PXQmJih0PW51bGwpLHZvaWQgMD09PW4mJihuPSExKTt2YXIgcj1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcImFueVwiLFwiYm9vbFwiKTthc3NlcnQoXCJib29sXCI9PT1yLmR0eXBlLFwiRXJyb3IgVGVuc29yIG11c3QgYmUgb2YgdHlwZSBib29sLiBHb3Q6IFwiK3IuZHR5cGUpO3ZhciBvPXBhcnNlQXhpc1BhcmFtKHQsci5zaGFwZSksYT1vLGk9Z2V0QXhlc1Blcm11dGF0aW9uKGEsci5yYW5rKTtudWxsIT1pJiYocj1yLnRyYW5zcG9zZShpKSxhPWdldElubmVyTW9zdEF4ZXMoYS5sZW5ndGgsci5yYW5rKSk7dmFyIHM9RU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYW55KHIsYSl9LHskeDpyfSk7aWYobil7dmFyIHU9ZXhwYW5kU2hhcGVUb0tlZXBEaW0ocy5zaGFwZSxvKTtyZXR1cm4gcy5yZXNoYXBlKHUpfXJldHVybiBzfWZ1bmN0aW9uIG1vbWVudHNfKGUsdCxuKXt2b2lkIDA9PT10JiYodD1udWxsKSx2b2lkIDA9PT1uJiYobj0hMSk7dmFyIHI9cGFyc2VBeGlzUGFyYW0odCwoZT1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcIm1vbWVudHNcIikpLnNoYXBlKSxvPWUubWVhbihyLG4pLGE9by5zaGFwZTtyZXR1cm4gbnx8KGE9ZXhwYW5kU2hhcGVUb0tlZXBEaW0oby5zaGFwZSxyKSkse21lYW46byx2YXJpYW5jZTplLnRvRmxvYXQoKS5zdWIoby5yZXNoYXBlKGEpKS5zcXVhcmUoKS5tZWFuKHIsbil9fXZhciBhbGw9b3Aoe2FsbF86YWxsX30pLGFueT1vcCh7YW55XzphbnlffSksYXJnTWF4PW9wKHthcmdNYXhfOmFyZ01heF99KSxhcmdNaW49b3Aoe2FyZ01pbl86YXJnTWluX30pLGxvZ1N1bUV4cD1vcCh7bG9nU3VtRXhwXzpsb2dTdW1FeHBffSksbWF4PW9wKHttYXhfOm1heF99KSxtZWFuPW9wKHttZWFuXzptZWFuX30pLG1pbj1vcCh7bWluXzptaW5ffSksbW9tZW50cz1vcCh7bW9tZW50c186bW9tZW50c199KSxzdW09b3Aoe3N1bV86c3VtX30pLHByb2Q9b3Aoe3Byb2RfOnByb2RffSk7ZnVuY3Rpb24gbm90RXF1YWxfKGUsdCl7dmFyIG49Y29udmVydFRvVGVuc29yKGUsXCJhXCIsXCJub3RFcXVhbFwiKSxyPWNvbnZlcnRUb1RlbnNvcih0LFwiYlwiLFwibm90RXF1YWxcIik7cmV0dXJuIGFzc2VydFR5cGVzTWF0Y2gobixyKSxhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShuLnNoYXBlLHIuc2hhcGUpLEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLm5vdEVxdWFsKG4scil9LHskYTpuLCRiOnJ9KX1mdW5jdGlvbiBub3RFcXVhbFN0cmljdF8oZSx0KXt2YXIgbj1jb252ZXJ0VG9UZW5zb3IoZSxcImFcIixcIm5vdEVxdWFsU3RyaWN0XCIpLHI9Y29udmVydFRvVGVuc29yKHQsXCJiXCIsXCJub3RFcXVhbFN0cmljdFwiKTtyZXR1cm4gYXNzZXJ0U2hhcGVzTWF0Y2gobi5zaGFwZSxyLnNoYXBlLFwiRXJyb3IgaW4gbm90RXF1YWxTdHJpY3Q6IFwiKSxuLm5vdEVxdWFsKHIpfWZ1bmN0aW9uIGxlc3NfKGUsdCl7dmFyIG49Y29udmVydFRvVGVuc29yKGUsXCJhXCIsXCJsZXNzXCIpLHI9Y29udmVydFRvVGVuc29yKHQsXCJiXCIsXCJsZXNzXCIpO3JldHVybiBhc3NlcnRUeXBlc01hdGNoKG4sciksYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUobi5zaGFwZSxyLnNoYXBlKSxFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5sZXNzKG4scil9LHskYTpuLCRiOnJ9KX1mdW5jdGlvbiBsZXNzU3RyaWN0XyhlLHQpe3ZhciBuPWNvbnZlcnRUb1RlbnNvcihlLFwiYVwiLFwibGVzc1N0cmljdFwiKSxyPWNvbnZlcnRUb1RlbnNvcih0LFwiYlwiLFwibGVzc1N0cmljdFwiKTtyZXR1cm4gYXNzZXJ0U2hhcGVzTWF0Y2gobi5zaGFwZSxyLnNoYXBlLFwiRXJyb3IgaW4gbGVzc1N0cmljdDogXCIpLG4ubGVzcyhyKX1mdW5jdGlvbiBlcXVhbF8oZSx0KXt2YXIgbj1jb252ZXJ0VG9UZW5zb3IoZSxcImFcIixcImVxdWFsXCIpLHI9Y29udmVydFRvVGVuc29yKHQsXCJiXCIsXCJlcXVhbFwiKTtyZXR1cm4gYXNzZXJ0VHlwZXNNYXRjaChuLHIpLGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKG4uc2hhcGUsci5zaGFwZSksRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZXF1YWwobixyKX0seyRhOm4sJGI6cn0pfWZ1bmN0aW9uIGVxdWFsU3RyaWN0XyhlLHQpe3ZhciBuPWNvbnZlcnRUb1RlbnNvcihlLFwiYVwiLFwiZXF1YWxTdHJpY3RcIikscj1jb252ZXJ0VG9UZW5zb3IodCxcImJcIixcImVxdWFsU3RyaWN0XCIpO3JldHVybiBhc3NlcnRTaGFwZXNNYXRjaChuLnNoYXBlLHIuc2hhcGUsXCJFcnJvciBpbiBlcXVhbFN0cmljdDogXCIpLG4uZXF1YWwocil9ZnVuY3Rpb24gbGVzc0VxdWFsXyhlLHQpe3ZhciBuPWNvbnZlcnRUb1RlbnNvcihlLFwiYVwiLFwibGVzc0VxdWFsXCIpLHI9Y29udmVydFRvVGVuc29yKHQsXCJiXCIsXCJsZXNzRXF1YWxcIik7cmV0dXJuIGFzc2VydFR5cGVzTWF0Y2gobixyKSxhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShuLnNoYXBlLHIuc2hhcGUpLEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmxlc3NFcXVhbChuLHIpfSx7JGE6biwkYjpyfSl9ZnVuY3Rpb24gbGVzc0VxdWFsU3RyaWN0XyhlLHQpe3ZhciBuPWNvbnZlcnRUb1RlbnNvcihlLFwiYVwiLFwibGVzc0VxdWFsU3RyaWN0XCIpLHI9Y29udmVydFRvVGVuc29yKHQsXCJiXCIsXCJsZXNzRXF1YWxTdHJpY3RcIik7cmV0dXJuIGFzc2VydFNoYXBlc01hdGNoKG4uc2hhcGUsci5zaGFwZSxcIkVycm9yIGluIGxlc3NFcXVhbFN0cmljdDogXCIpLG4ubGVzc0VxdWFsKHIpfWZ1bmN0aW9uIGdyZWF0ZXJfKGUsdCl7dmFyIG49Y29udmVydFRvVGVuc29yKGUsXCJhXCIsXCJncmVhdGVyXCIpLHI9Y29udmVydFRvVGVuc29yKHQsXCJiXCIsXCJncmVhdGVyXCIpO3JldHVybiBhc3NlcnRUeXBlc01hdGNoKG4sciksYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUobi5zaGFwZSxyLnNoYXBlKSxFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5ncmVhdGVyKG4scil9LHskYTpuLCRiOnJ9KX1mdW5jdGlvbiBncmVhdGVyU3RyaWN0XyhlLHQpe3ZhciBuPWNvbnZlcnRUb1RlbnNvcihlLFwiYVwiLFwiZ3JlYXRlclN0cmljdFwiKSxyPWNvbnZlcnRUb1RlbnNvcih0LFwiYlwiLFwiZ3JlYXRlclN0cmljdFwiKTtyZXR1cm4gYXNzZXJ0U2hhcGVzTWF0Y2gobi5zaGFwZSxyLnNoYXBlLFwiRXJyb3IgaW4gZ3JlYXRlclN0cmljdDogXCIpLG4uZ3JlYXRlcihyKX1mdW5jdGlvbiBncmVhdGVyRXF1YWxfKGUsdCl7dmFyIG49Y29udmVydFRvVGVuc29yKGUsXCJhXCIsXCJncmVhdGVyRXF1YWxcIikscj1jb252ZXJ0VG9UZW5zb3IodCxcImJcIixcImdyZWF0ZXJFcXVhbFwiKTthc3NlcnRUeXBlc01hdGNoKG4sciksYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUobi5zaGFwZSxyLnNoYXBlKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ3JlYXRlckVxdWFsKG4scil9LHskYTpuLCRiOnJ9LGZ1bmN0aW9uKGUpe3JldHVybnskYTpmdW5jdGlvbigpe3JldHVybiB6ZXJvc0xpa2Uobil9LCRiOmZ1bmN0aW9uKCl7cmV0dXJuIHplcm9zTGlrZShyKX19fSl9ZnVuY3Rpb24gZ3JlYXRlckVxdWFsU3RyaWN0XyhlLHQpe3ZhciBuPWNvbnZlcnRUb1RlbnNvcihlLFwiYVwiLFwiZ3JlYXRlckVxdWFsU3RyaWN0XCIpLHI9Y29udmVydFRvVGVuc29yKHQsXCJiXCIsXCJncmVhdGVyRXF1YWxTdHJpY3RcIik7cmV0dXJuIGFzc2VydFNoYXBlc01hdGNoKG4uc2hhcGUsci5zaGFwZSxcIkVycm9yIGluIGdyZWF0ZXJFcXVhbFN0cmljdDogXCIpLG4uZ3JlYXRlckVxdWFsKHIpfXZhciBlcXVhbD1vcCh7ZXF1YWxfOmVxdWFsX30pLGVxdWFsU3RyaWN0PW9wKHtlcXVhbFN0cmljdF86ZXF1YWxTdHJpY3RffSksZ3JlYXRlcj1vcCh7Z3JlYXRlcl86Z3JlYXRlcl99KSxncmVhdGVyRXF1YWw9b3Aoe2dyZWF0ZXJFcXVhbF86Z3JlYXRlckVxdWFsX30pLGdyZWF0ZXJFcXVhbFN0cmljdD1vcCh7Z3JlYXRlckVxdWFsU3RyaWN0XzpncmVhdGVyRXF1YWxTdHJpY3RffSksZ3JlYXRlclN0cmljdD1vcCh7Z3JlYXRlclN0cmljdF86Z3JlYXRlclN0cmljdF99KSxsZXNzPW9wKHtsZXNzXzpsZXNzX30pLGxlc3NFcXVhbD1vcCh7bGVzc0VxdWFsXzpsZXNzRXF1YWxffSksbGVzc0VxdWFsU3RyaWN0PW9wKHtsZXNzRXF1YWxTdHJpY3RfOmxlc3NFcXVhbFN0cmljdF99KSxsZXNzU3RyaWN0PW9wKHtsZXNzU3RyaWN0XzpsZXNzU3RyaWN0X30pLG5vdEVxdWFsPW9wKHtub3RFcXVhbF86bm90RXF1YWxffSksbm90RXF1YWxTdHJpY3Q9b3Aoe25vdEVxdWFsU3RyaWN0Xzpub3RFcXVhbFN0cmljdF99KTtmdW5jdGlvbiBhZGRfKGUsdCl7dmFyIG49Y29udmVydFRvVGVuc29yKGUsXCJhXCIsXCJhZGRcIikscj1jb252ZXJ0VG9UZW5zb3IodCxcImJcIixcImFkZFwiKTthc3NlcnRUeXBlc01hdGNoKG4scik7dmFyIG89YXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUobi5zaGFwZSxyLnNoYXBlKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYWRkKG4scil9LHskYTpuLCRiOnJ9LGZ1bmN0aW9uKGUpe3JldHVybnskYTpmdW5jdGlvbigpe3ZhciB0PWUscj1nZXRSZWR1Y3Rpb25BeGVzKG4uc2hhcGUsbyk7cmV0dXJuIHIubGVuZ3RoPjAmJih0PXQuc3VtKHIpKSx0LnJlc2hhcGUobi5zaGFwZSl9LCRiOmZ1bmN0aW9uKCl7dmFyIHQ9ZSxuPWdldFJlZHVjdGlvbkF4ZXMoci5zaGFwZSxvKTtyZXR1cm4gbi5sZW5ndGg+MCYmKHQ9dC5zdW0obikpLHQucmVzaGFwZShyLnNoYXBlKX19fSl9ZnVuY3Rpb24gYWRkTl8oZSl7YXNzZXJ0KEFycmF5LmlzQXJyYXkoZSksZnVuY3Rpb24oKXtyZXR1cm5cIlRoZSBhcmd1bWVudCBwYXNzZWQgdG8gdGYuYWRkTigpIG11c3QgYmUgYSBsaXN0IG9mIHRlbnNvcnNcIn0pLGFzc2VydChlLmxlbmd0aD49MSxmdW5jdGlvbigpe3JldHVyblwiTXVzdCBwYXNzIGF0IGxlYXN0IG9uZSB0ZW5zb3IgdG8gdGYuYWRkTigpLCBidXQgZ290IFwiK2UubGVuZ3RofSk7dmFyIHQ9ZS5tYXAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gY29udmVydFRvVGVuc29yKGUsXCJ0ZW5zb3JzXCIrdCxcImFkZE5cIil9KSxuPXRbMF07dC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKGUuZHR5cGUhPT1uLmR0eXBlKXRocm93IG5ldyBFcnJvcihcIkFsbCB0ZW5zb3JzIHBhc3NlZCB0byB0Zi5hZGROKCkgbXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlXCIpfSksdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKCFhcnJheXNFcXVhbChlLnNoYXBlLG4uc2hhcGUpKXRocm93IG5ldyBFcnJvcihcIkFsbCB0ZW5zb3JzIHBhc3NlZCB0byB0Zi5hZGROKCkgbXVzdCBoYXZlIHRoZSBzYW1lIHNoYXBlXCIpfSk7dmFyIHI9dDtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYWRkTih0KX0scixmdW5jdGlvbihlKXt2YXIgbj17fTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQscil7bltyXT1mdW5jdGlvbigpe3JldHVybiBlLmNsb25lKCl9fSksbn0pfWZ1bmN0aW9uIGFkZFN0cmljdF8oZSx0KXtyZXR1cm4gYXNzZXJ0U2hhcGVzTWF0Y2goZS5zaGFwZSx0LnNoYXBlLFwiRXJyb3IgaW4gYWRkU3RyaWN0OiBcIiksZS5hZGQodCl9ZnVuY3Rpb24gc3ViXyhlLHQpe3ZhciBuPWNvbnZlcnRUb1RlbnNvcihlLFwiYVwiLFwic3ViXCIpLHI9Y29udmVydFRvVGVuc29yKHQsXCJiXCIsXCJzdWJcIik7YXNzZXJ0VHlwZXNNYXRjaChuLHIpO3ZhciBvPWFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKG4uc2hhcGUsci5zaGFwZSk7cmV0dXJuIEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLnN1YnRyYWN0KG4scil9LHskYTpuLCRiOnJ9LGZ1bmN0aW9uKGUpe3JldHVybnskYTpmdW5jdGlvbigpe3ZhciB0PWUscj1nZXRSZWR1Y3Rpb25BeGVzKG4uc2hhcGUsbyk7cmV0dXJuIHIubGVuZ3RoPjAmJih0PXQuc3VtKHIpKSx0LnJlc2hhcGUobi5zaGFwZSl9LCRiOmZ1bmN0aW9uKCl7dmFyIHQ9ZSxuPWdldFJlZHVjdGlvbkF4ZXMoci5zaGFwZSxvKTtyZXR1cm4gbi5sZW5ndGg+MCYmKHQ9dC5zdW0obikpLHQubmVnKCkucmVzaGFwZShyLnNoYXBlKX19fSl9ZnVuY3Rpb24gc3ViU3RyaWN0XyhlLHQpe3JldHVybiBhc3NlcnRTaGFwZXNNYXRjaChlLnNoYXBlLHQuc2hhcGUsXCJFcnJvciBpbiBzdWJTdHJpY3Q6IFwiKSxlLnN1Yih0KX1mdW5jdGlvbiBwb3dfKGUsdCl7dmFyIG49Y29udmVydFRvVGVuc29yKGUsXCJiYXNlXCIsXCJwb3dcIikscj1jb252ZXJ0VG9UZW5zb3IodCxcImV4cFwiLFwicG93XCIpLG89YXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUobi5zaGFwZSxyLnNoYXBlKTtlPW4uY2FzdCh1cGNhc3RUeXBlKG4uZHR5cGUsci5kdHlwZSkpLHQ9ci5jYXN0KHVwY2FzdFR5cGUobi5kdHlwZSxyLmR0eXBlKSk7cmV0dXJuIEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQoZS5wb3cobixyKSl9LHskYmFzZTpuLCRleHA6cn0sZnVuY3Rpb24oZSx0KXt2YXIgYT10WzBdO3JldHVybnskYmFzZTpmdW5jdGlvbigpe3ZhciB0PWUubXVsKHIudG9GbG9hdCgpLm11bChhLmRpdihuKSkpLGk9Z2V0UmVkdWN0aW9uQXhlcyhuLnNoYXBlLG8pO3JldHVybiBpLmxlbmd0aD4wJiYodD10LnN1bShpKSksdC5yZXNoYXBlKG4uc2hhcGUpfSwkZXhwOmZ1bmN0aW9uKCl7dmFyIHQ9ZS5tdWwoYS5tdWwobi5sb2coKSkudG9GbG9hdCgpKSxpPWdldFJlZHVjdGlvbkF4ZXMoci5zaGFwZSxvKTtyZXR1cm4gaS5sZW5ndGg+MCYmKHQ9dC5zdW0oaSkpLHQucmVzaGFwZShyLnNoYXBlKX19fSl9ZnVuY3Rpb24gcG93U3RyaWN0XyhlLHQpe3JldHVybiBhc3NlcnRTaGFwZXNNYXRjaChlLnNoYXBlLHQuc2hhcGUsXCJFcnJvciBpbiBwb3dTdHJpY3Q6IFwiKSxlLnBvdyh0KX1mdW5jdGlvbiBtdWxfKGUsdCl7dmFyIG49Y29udmVydFRvVGVuc29yKGUsXCJhXCIsXCJtdWxcIikscj1jb252ZXJ0VG9UZW5zb3IodCxcImJcIixcIm11bFwiKTthc3NlcnRUeXBlc01hdGNoKG4scik7dmFyIG89YXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUobi5zaGFwZSxyLnNoYXBlKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUubXVsdGlwbHkobixyKX0seyRhOm4sJGI6cn0sZnVuY3Rpb24oZSl7cmV0dXJueyRhOmZ1bmN0aW9uKCl7dmFyIHQ9ZS5tdWwoci50b0Zsb2F0KCkpLGE9Z2V0UmVkdWN0aW9uQXhlcyhuLnNoYXBlLG8pO3JldHVybiBhLmxlbmd0aD4wP3Quc3VtKGEpLnJlc2hhcGUobi5zaGFwZSk6dH0sJGI6ZnVuY3Rpb24oKXt2YXIgdD1lLm11bChuLnRvRmxvYXQoKSksYT1nZXRSZWR1Y3Rpb25BeGVzKHIuc2hhcGUsbyk7cmV0dXJuIGEubGVuZ3RoPjA/dC5zdW0oYSkucmVzaGFwZShyLnNoYXBlKTp0fX19KX1mdW5jdGlvbiBtdWxTdHJpY3RfKGUsdCl7cmV0dXJuIGFzc2VydFNoYXBlc01hdGNoKGUuc2hhcGUsdC5zaGFwZSxcIkVycm9yIGluIG11bHRpcGx5U3RyaWN0OiBcIiksZS5tdWwodCl9ZnVuY3Rpb24gZGl2XyhlLHQpe3ZhciBuLHI9Y29udmVydFRvVGVuc29yKGUsXCJhXCIsXCJkaXZcIiksbz1jb252ZXJ0VG9UZW5zb3IodCxcImJcIixcImRpdlwiKTtpZihhc3NlcnRUeXBlc01hdGNoKHIsbyksXCJpbnQzMlwiPT09ci5kdHlwZSYmXCJpbnQzMlwiPT09by5kdHlwZSlyZXR1cm4gZmxvb3JEaXYocixvKTtuPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlYWxEaXZpZGUocixvKX07dmFyIGE9YXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoci5zaGFwZSxvLnNoYXBlKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwobix7JGE6ciwkYjpvfSxmdW5jdGlvbihlKXtyZXR1cm57JGE6ZnVuY3Rpb24oKXt2YXIgdD1lLmRpdihvLnRvRmxvYXQoKSksbj1nZXRSZWR1Y3Rpb25BeGVzKHIuc2hhcGUsYSk7cmV0dXJuIG4ubGVuZ3RoPjA/dC5zdW0obikucmVzaGFwZShyLnNoYXBlKTp0fSwkYjpmdW5jdGlvbigpe3ZhciB0PWUubXVsKHIudG9GbG9hdCgpKSxuPWdldFJlZHVjdGlvbkF4ZXMoby5zaGFwZSxhKTtuLmxlbmd0aD4wJiYodD10LnN1bShuKS5yZXNoYXBlKG8uc2hhcGUpKTt2YXIgaT1vLnNxdWFyZSgpO3JldHVybiB0LmRpdihpLnRvRmxvYXQoKSkubmVnKCl9fX0pfWZ1bmN0aW9uIGZsb29yRGl2XyhlLHQpe3ZhciBuPWNvbnZlcnRUb1RlbnNvcihlLFwiYVwiLFwiZmxvb3JEaXZcIikscj1jb252ZXJ0VG9UZW5zb3IodCxcImJcIixcImZsb29yRGl2XCIpO2Fzc2VydFR5cGVzTWF0Y2gobixyKTt2YXIgbz1hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShuLnNoYXBlLHIuc2hhcGUpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5mbG9vckRpdihuLHIpfSx7JGE6biwkYjpyfSxmdW5jdGlvbihlKXtyZXR1cm57JGE6ZnVuY3Rpb24oKXt2YXIgdD1lLmRpdihyLnRvRmxvYXQoKSksYT1nZXRSZWR1Y3Rpb25BeGVzKG4uc2hhcGUsbyk7cmV0dXJuIGEubGVuZ3RoPjA/dC5zdW0oYSkucmVzaGFwZShuLnNoYXBlKTp0fSwkYjpmdW5jdGlvbigpe3ZhciB0PWUubXVsKG4udG9GbG9hdCgpKSxhPWdldFJlZHVjdGlvbkF4ZXMoci5zaGFwZSxvKTthLmxlbmd0aD4wJiYodD10LnN1bShhKS5yZXNoYXBlKHIuc2hhcGUpKTt2YXIgaT1yLnNxdWFyZSgpO3JldHVybiB0LmRpdihpLnRvRmxvYXQoKSkubmVnKCl9fX0pfWZ1bmN0aW9uIGRpdlN0cmljdF8oZSx0KXtyZXR1cm4gYXNzZXJ0U2hhcGVzTWF0Y2goZS5zaGFwZSx0LnNoYXBlLFwiRXJyb3IgaW4gZGl2aWRlU3RyaWN0OiBcIiksZS5kaXYodCl9ZnVuY3Rpb24gbW9kXyhlLHQpe3ZhciBuPWNvbnZlcnRUb1RlbnNvcihlLFwiYVwiLFwibW9kXCIpLHI9Y29udmVydFRvVGVuc29yKHQsXCJiXCIsXCJtb2RcIik7YXNzZXJ0VHlwZXNNYXRjaChuLHIpO3ZhciBvPWFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKG4uc2hhcGUsci5zaGFwZSk7cmV0dXJuIEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLm1vZChuLHIpfSx7JGE6biwkYjpyfSxmdW5jdGlvbihlKXtyZXR1cm57JGE6ZnVuY3Rpb24oKXt2YXIgdD1nZXRSZWR1Y3Rpb25BeGVzKG4uc2hhcGUsbyk7cmV0dXJuIHQubGVuZ3RoPjA/ZS5zdW0odCkucmVzaGFwZShuLnNoYXBlKTplfSwkYjpmdW5jdGlvbigpe3ZhciB0PWUubXVsKG4uZGl2KHIpLmZsb29yKCkubmVnKCkpLGE9Z2V0UmVkdWN0aW9uQXhlcyhyLnNoYXBlLG8pO3JldHVybiBhLmxlbmd0aD4wP3Quc3VtKGEpLnJlc2hhcGUoci5zaGFwZSk6dH19fSl9ZnVuY3Rpb24gbW9kU3RyaWN0XyhlLHQpe3JldHVybiBhc3NlcnRTaGFwZXNNYXRjaChlLnNoYXBlLHQuc2hhcGUsXCJFcnJvciBpbiBtb2RTdHJpY3Q6IFwiKSxlLm1vZCh0KX1mdW5jdGlvbiBtaW5pbXVtXyhlLHQpe3ZhciBuPWNvbnZlcnRUb1RlbnNvcihlLFwiYVwiLFwibWluaW11bVwiKSxyPWNvbnZlcnRUb1RlbnNvcih0LFwiYlwiLFwibWluaW11bVwiKTthc3NlcnRUeXBlc01hdGNoKG4sciksXCJib29sXCI9PT1uLmR0eXBlJiYobj1uLnRvSW50KCkpLFwiYm9vbFwiPT09ci5kdHlwZSYmKHI9ci50b0ludCgpKSxhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShuLnNoYXBlLHIuc2hhcGUpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5taW5pbXVtKG4scil9LHskYTpuLCRiOnJ9LGZ1bmN0aW9uKGUpe3JldHVybnskYTpmdW5jdGlvbigpe3JldHVybiBlLm11bChuLmxlc3NFcXVhbChyKS50b0Zsb2F0KCkpfSwkYjpmdW5jdGlvbigpe3JldHVybiBlLm11bChuLmdyZWF0ZXIocikudG9GbG9hdCgpKX19fSl9ZnVuY3Rpb24gbWluaW11bVN0cmljdF8oZSx0KXtyZXR1cm4gYXNzZXJ0U2hhcGVzTWF0Y2goZS5zaGFwZSx0LnNoYXBlLFwiRXJyb3IgaW4gbWluaW11bVN0cmljdDogXCIpLGUubWluaW11bSh0KX1mdW5jdGlvbiBtYXhpbXVtXyhlLHQpe3ZhciBuPWNvbnZlcnRUb1RlbnNvcihlLFwiYVwiLFwibWF4aW11bVwiKSxyPWNvbnZlcnRUb1RlbnNvcih0LFwiYlwiLFwibWF4aW11bVwiKTthc3NlcnRUeXBlc01hdGNoKG4sciksXCJib29sXCI9PT1uLmR0eXBlJiYobj1uLnRvSW50KCkpLFwiYm9vbFwiPT09ci5kdHlwZSYmKHI9ci50b0ludCgpKSxhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShuLnNoYXBlLHIuc2hhcGUpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5tYXhpbXVtKG4scil9LHskYTpuLCRiOnJ9LGZ1bmN0aW9uKGUpe3JldHVybnskYTpmdW5jdGlvbigpe3JldHVybiBlLm11bChuLmdyZWF0ZXJFcXVhbChyKS50b0Zsb2F0KCkpfSwkYjpmdW5jdGlvbigpe3JldHVybiBlLm11bChuLmxlc3MocikudG9GbG9hdCgpKX19fSl9ZnVuY3Rpb24gbWF4aW11bVN0cmljdF8oZSx0KXtyZXR1cm4gYXNzZXJ0U2hhcGVzTWF0Y2goZS5zaGFwZSx0LnNoYXBlLFwiRXJyb3IgaW4gbWF4aW11bVN0cmljdDogXCIpLGUubWF4aW11bSh0KX1mdW5jdGlvbiBzcXVhcmVkRGlmZmVyZW5jZV8oZSx0KXt2YXIgbj1jb252ZXJ0VG9UZW5zb3IoZSxcImFcIixcInNxdWFyZWREaWZmZXJlbmNlXCIpLHI9Y29udmVydFRvVGVuc29yKHQsXCJiXCIsXCJzcXVhcmVkRGlmZmVyZW5jZVwiKTthc3NlcnRUeXBlc01hdGNoKG4sciksYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUobi5zaGFwZSxyLnNoYXBlKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3F1YXJlZERpZmZlcmVuY2UobixyKX0seyRhOm4sJGI6cn0sZnVuY3Rpb24oZSl7dmFyIHQ9c2NhbGFyKDIpO3JldHVybnskYTpmdW5jdGlvbigpe3JldHVybiBlLm11bChuLnN1YihyKS5tdWwodCkpfSwkYjpmdW5jdGlvbigpe3JldHVybiBlLm11bChyLnN1YihuKS5tdWwodCkpfX19KX1mdW5jdGlvbiBzcXVhcmVkRGlmZmVyZW5jZVN0cmljdF8oZSx0KXtyZXR1cm4gYXNzZXJ0U2hhcGVzTWF0Y2goZS5zaGFwZSx0LnNoYXBlLFwiRXJyb3IgaW4gc3F1YXJlZERpZmZlcmVuY2VTdHJpY3Q6IFwiKSxlLnNxdWFyZWREaWZmZXJlbmNlKHQpfWZ1bmN0aW9uIGF0YW4yXyhlLHQpe3ZhciBuPWNvbnZlcnRUb1RlbnNvcihlLFwiYVwiLFwiYXRhbjJcIikscj1jb252ZXJ0VG9UZW5zb3IodCxcImJcIixcImF0YW4yXCIpO2Fzc2VydFR5cGVzTWF0Y2gobixyKTt2YXIgbz1hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShuLnNoYXBlLHIuc2hhcGUpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5hdGFuMihuLHIpfSx7JGE6biwkYjpyfSxmdW5jdGlvbihlKXtyZXR1cm57JGE6ZnVuY3Rpb24oKXt2YXIgdD1hZGQobi5zcXVhcmUoKSxyLnNxdWFyZSgpKSxhPWUubXVsKHIuZGl2KHQpKSxpPWdldFJlZHVjdGlvbkF4ZXMobi5zaGFwZSxvKTtyZXR1cm4gaS5sZW5ndGg+MCYmKGE9YS5zdW0oaSkpLGEucmVzaGFwZShuLnNoYXBlKX0sJGI6ZnVuY3Rpb24oKXt2YXIgdD1hZGQobi5zcXVhcmUoKSxyLnNxdWFyZSgpKSxhPW5lZyhlLm11bChuLmRpdih0KSkpLGk9Z2V0UmVkdWN0aW9uQXhlcyhyLnNoYXBlLG8pO3JldHVybiBpLmxlbmd0aD4wJiYoYT1hLnN1bShpKSksYS5yZXNoYXBlKHIuc2hhcGUpfX19KX12YXIgYWRkPW9wKHthZGRfOmFkZF99KSxhZGROPW9wKHthZGROXzphZGROX30pLGFkZFN0cmljdD1vcCh7YWRkU3RyaWN0XzphZGRTdHJpY3RffSksYXRhbjI9b3Aoe2F0YW4yXzphdGFuMl99KSxkaXY9b3Aoe2Rpdl86ZGl2X30pLGRpdlN0cmljdD1vcCh7ZGl2U3RyaWN0XzpkaXZTdHJpY3RffSksZmxvb3JEaXY9b3Aoe2Zsb29yRGl2XzpmbG9vckRpdl99KSxtYXhpbXVtPW9wKHttYXhpbXVtXzptYXhpbXVtX30pLG1heGltdW1TdHJpY3Q9b3Aoe21heGltdW1TdHJpY3RfOm1heGltdW1TdHJpY3RffSksbWluaW11bT1vcCh7bWluaW11bV86bWluaW11bV99KSxtaW5pbXVtU3RyaWN0PW9wKHttaW5pbXVtU3RyaWN0XzptaW5pbXVtU3RyaWN0X30pLG1vZD1vcCh7bW9kXzptb2RffSksbW9kU3RyaWN0PW9wKHttb2RTdHJpY3RfOm1vZFN0cmljdF99KSxtdWw9b3Aoe211bF86bXVsX30pLG11bFN0cmljdD1vcCh7bXVsU3RyaWN0XzptdWxTdHJpY3RffSkscG93PW9wKHtwb3dfOnBvd199KSxwb3dTdHJpY3Q9b3Aoe3Bvd1N0cmljdF86cG93U3RyaWN0X30pLHNxdWFyZWREaWZmZXJlbmNlPW9wKHtzcXVhcmVkRGlmZmVyZW5jZV86c3F1YXJlZERpZmZlcmVuY2VffSksc3F1YXJlZERpZmZlcmVuY2VTdHJpY3Q9b3Aoe3NxdWFyZWREaWZmZXJlbmNlU3RyaWN0XzpzcXVhcmVkRGlmZmVyZW5jZVN0cmljdF99KSxzdWI9b3Aoe3N1Yl86c3ViX30pLHN1YlN0cmljdD1vcCh7c3ViU3RyaWN0XzpzdWJTdHJpY3RffSk7ZnVuY3Rpb24gbG9naWNhbE5vdF8oZSl7dmFyIHQ9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJsb2dpY2FsTm90XCIsXCJib29sXCIpO3JldHVybiBhc3NlcnQoXCJib29sXCI9PT10LmR0eXBlLFwiRXJyb3IgQXJyYXkgbXVzdCBiZSBvZiB0eXBlIGJvb2wuXCIpLEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmxvZ2ljYWxOb3QodCl9LHskeDp0fSl9ZnVuY3Rpb24gbG9naWNhbEFuZF8oZSx0KXt2YXIgbj1jb252ZXJ0VG9UZW5zb3IoZSxcImFcIixcImxvZ2ljYWxBbmRcIixcImJvb2xcIikscj1jb252ZXJ0VG9UZW5zb3IodCxcImJcIixcImxvZ2ljYWxBbmRcIixcImJvb2xcIik7cmV0dXJuIGFzc2VydChcImJvb2xcIj09PW4uZHR5cGUmJlwiYm9vbFwiPT09ci5kdHlwZSxcIkVycm9yIEFycmF5IG11c3QgYmUgb2YgdHlwZSBib29sLlwiKSxhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShuLnNoYXBlLHIuc2hhcGUpLEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmxvZ2ljYWxBbmQobixyKX0seyRhOm4sJGI6cn0pfWZ1bmN0aW9uIGxvZ2ljYWxPcl8oZSx0KXt2YXIgbj1jb252ZXJ0VG9UZW5zb3IoZSxcImFcIixcImxvZ2ljYWxPclwiLFwiYm9vbFwiKSxyPWNvbnZlcnRUb1RlbnNvcih0LFwiYlwiLFwibG9naWNhbE9yXCIsXCJib29sXCIpO3JldHVybiBhc3NlcnQoXCJib29sXCI9PT1uLmR0eXBlJiZcImJvb2xcIj09PXIuZHR5cGUsXCJFcnJvciBBcnJheSBtdXN0IGJlIG9mIHR5cGUgYm9vbC5cIiksYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUobi5zaGFwZSxyLnNoYXBlKSxFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5sb2dpY2FsT3IobixyKX0seyRhOm4sJGI6cn0pfWZ1bmN0aW9uIGxvZ2ljYWxYb3JfKGUsdCl7dmFyIG49Y29udmVydFRvVGVuc29yKGUsXCJhXCIsXCJsb2dpY2FsWG9yXCIsXCJib29sXCIpLHI9Y29udmVydFRvVGVuc29yKHQsXCJiXCIsXCJsb2dpY2FsWG9yXCIsXCJib29sXCIpO3JldHVybiBhc3NlcnQoXCJib29sXCI9PT1uLmR0eXBlJiZcImJvb2xcIj09PXIuZHR5cGUsXCJFcnJvciBBcnJheSBtdXN0IGJlIG9mIHR5cGUgYm9vbC5cIiksYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUobi5zaGFwZSxyLnNoYXBlKSxsb2dpY2FsT3IoZSx0KS5sb2dpY2FsQW5kKGxvZ2ljYWxBbmQoZSx0KS5sb2dpY2FsTm90KCkpfWZ1bmN0aW9uIHdoZXJlXyhlLHQsbil7dmFyIHI9Y29udmVydFRvVGVuc29yKHQsXCJhXCIsXCJ3aGVyZVwiKSxvPWNvbnZlcnRUb1RlbnNvcihuLFwiYlwiLFwid2hlcmVcIiksYT1jb252ZXJ0VG9UZW5zb3IoZSxcImNvbmRpdGlvblwiLFwid2hlcmVcIixcImJvb2xcIik7YXNzZXJ0KFwiYm9vbFwiPT09YS5kdHlwZSxcIkVycm9yIENvbmRpdGlvbiBtdXN0IGJlIG9mIHR5cGUgYm9vbC5cIiksYXNzZXJ0U2hhcGVzTWF0Y2goci5zaGFwZSxvLnNoYXBlLFwiRXJyb3IgaW4gd2hlcmU6IFwiKSwxPT09YS5yYW5rP2Fzc2VydChhLnNoYXBlWzBdPT09ci5zaGFwZVswXSxcIlRoZSBmaXJzdCBkaW1lbnNpb24gb2YgYGFgIG11c3QgbWF0Y2ggdGhlIHNpemUgb2YgYGNvbmRpdGlvbmAuXCIpOmFzc2VydFNoYXBlc01hdGNoKGEuc2hhcGUsby5zaGFwZSxcIkVycm9yIGluIHdoZXJlOiBcIik7cmV0dXJuIEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNlbGVjdChhLHIsbyl9LHskY29uZGl0aW9uOmEsJGE6ciwkYjpvfSxmdW5jdGlvbihlKXtyZXR1cm57JGNvbmRpdGlvbjpmdW5jdGlvbigpe3JldHVybiB6ZXJvc0xpa2UoYSl9LCRhOmZ1bmN0aW9uKCl7cmV0dXJuIGUubXVsKGEuY2FzdChyLmR0eXBlKSl9LCRiOmZ1bmN0aW9uKCl7cmV0dXJuIGUubXVsKGEubG9naWNhbE5vdCgpLmNhc3Qoby5kdHlwZSkpfX19KX1mdW5jdGlvbiB3aGVyZUFzeW5jXyhlKXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciB0LG4scjtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihvKXtzd2l0Y2goby5sYWJlbCl7Y2FzZSAwOnJldHVybiBhc3NlcnQoXCJib29sXCI9PT0odD1jb252ZXJ0VG9UZW5zb3IoZSxcImNvbmRpdGlvblwiLFwid2hlcmVcIixcImJvb2xcIikpLmR0eXBlLFwiQ29uZGl0aW9uIG11c3QgYmUgb2YgdHlwZSBib29sLlwiKSxbNCx0LmRhdGEoKV07Y2FzZSAxOnJldHVybiBuPW8uc2VudCgpLHI9d2hlcmVJbXBsKHQuc2hhcGUsbiksZSE9PXQmJnQuZGlzcG9zZSgpLFsyLHJdfX0pfSl9dmFyIGxvZ2ljYWxBbmQ9b3Aoe2xvZ2ljYWxBbmRfOmxvZ2ljYWxBbmRffSksbG9naWNhbE5vdD1vcCh7bG9naWNhbE5vdF86bG9naWNhbE5vdF99KSxsb2dpY2FsT3I9b3Aoe2xvZ2ljYWxPcl86bG9naWNhbE9yX30pLGxvZ2ljYWxYb3I9b3Aoe2xvZ2ljYWxYb3JfOmxvZ2ljYWxYb3JffSksd2hlcmU9b3Aoe3doZXJlXzp3aGVyZV99KSx3aGVyZUFzeW5jPXdoZXJlQXN5bmNfO2Z1bmN0aW9uIHJlbHVfKGUpe3ZhciB0PWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwicmVsdVwiKTtpZihcImJvb2xcIj09PXQuZHR5cGUpcmV0dXJuIHQudG9JbnQoKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVsdSh0KX0seyR4OnR9LGZ1bmN0aW9uKGUpe3ZhciBuPXQuc3RlcCgpO3JldHVybnskeDpmdW5jdGlvbigpe3JldHVybiBlLm11bFN0cmljdChuLnRvRmxvYXQoKSl9fX0pfWZ1bmN0aW9uIGVsdV8oZSl7dmFyIHQ9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJlbHVcIik7cmV0dXJuIEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIG4oZS5lbHUodCkpfSx7JHg6dH0sZnVuY3Rpb24oZSx0KXt2YXIgbj10WzBdO3JldHVybnskeDpmdW5jdGlvbigpe3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbih0KXtyZXR1cm4gdC5lbHVEZXIoZSxuKX0se2R5OmUseTpufSl9fX0pfWZ1bmN0aW9uIHNlbHVfKGUpe3ZhciB0PWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwic2VsdVwiKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2VsdSh0KX0seyR4OnR9LGZ1bmN0aW9uKGUpe3JldHVybnskeDpmdW5jdGlvbigpe3ZhciBuPXQuZ3JlYXRlcihzY2FsYXIoMCkpLHI9c2NhbGFyKFNFTFVfU0NBTEVBTFBIQSksbz1zY2FsYXIoU0VMVV9TQ0FMRSksYT1lLm11bChvKSxpPWUubXVsKHIpLm11bCh0LnRvRmxvYXQoKS5leHAoKSk7cmV0dXJuIHdoZXJlKG4sYSxpKX19fSl9ZnVuY3Rpb24gbGVha3lSZWx1XyhlLHQpe3ZvaWQgMD09PXQmJih0PS4yKTt2YXIgbj1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcImxlYWt5UmVsdVwiKTtyZXR1cm4gbWF4aW11bShzY2FsYXIodCkubXVsKG4pLG4pfWZ1bmN0aW9uIHByZWx1XyhlLHQpe3ZhciBuPWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwicHJlbHVcIikscj1jb252ZXJ0VG9UZW5zb3IodCxcImFscGhhXCIsXCJwcmVsdVwiKSxvPXNjYWxhcigwKTtyZXR1cm4gbWF4aW11bShvLG4pLmFkZChyLm11bChtaW5pbXVtKG8sbikpKX12YXIgZWx1PW9wKHtlbHVfOmVsdV99KSxsZWFreVJlbHU9b3Aoe2xlYWt5UmVsdV86bGVha3lSZWx1X30pLHByZWx1PW9wKHtwcmVsdV86cHJlbHVffSkscmVsdT1vcCh7cmVsdV86cmVsdV99KSxzZWx1PW9wKHtzZWx1XzpzZWx1X30pO2Z1bmN0aW9uIHRyYW5zcG9zZV8oZSx0KXt2YXIgbj1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcInRyYW5zcG9zZVwiKTtpZihudWxsPT10JiYodD1uLnNoYXBlLm1hcChmdW5jdGlvbihlLHQpe3JldHVybiB0fSkucmV2ZXJzZSgpKSxhc3NlcnQobi5yYW5rPT09dC5sZW5ndGgsXCJFcnJvciBpbiB0cmFuc3Bvc2U6IHJhbmsgb2YgaW5wdXQgXCIrbi5yYW5rK1wiIG11c3QgbWF0Y2ggbGVuZ3RoIG9mIHBlcm0gXCIrdCtcIi5cIiksdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Fzc2VydChlPj0wJiZlPG4ucmFuayxcIkFsbCBlbnRyaWVzIGluICdwZXJtJyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgXCIrKG4ucmFuay0xKStcIiBidXQgZ290IFwiK3QpfSksbi5yYW5rPD0xKXJldHVybiBuLmNsb25lKCk7cmV0dXJuIEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRyYW5zcG9zZShuLHQpfSx7JHg6bn0sZnVuY3Rpb24oZSl7dmFyIG49Z2V0VW5kb0F4ZXNQZXJtdXRhdGlvbih0KTtyZXR1cm57JHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS50cmFuc3Bvc2Uobil9fX0pfXZhciB0cmFuc3Bvc2U9b3Aoe3RyYW5zcG9zZV86dHJhbnNwb3NlX30pO2Z1bmN0aW9uIGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uXyhlLHQsbixyLG8pe3ZvaWQgMD09PXQmJih0PTUpLHZvaWQgMD09PW4mJihuPTEpLHZvaWQgMD09PXImJihyPTEpLHZvaWQgMD09PW8mJihvPS41KTt2YXIgYT1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcImxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uXCIpO2Fzc2VydCg0PT09YS5yYW5rfHwzPT09YS5yYW5rLFwiRXJyb3IgaW4gbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb246IHggbXVzdCBiZSByYW5rIDMgb3IgNCBidXQgZ290XFxuICAgICAgICAgICAgICAgcmFuayBcIithLnJhbmsrXCIuXCIpLGFzc2VydChpc0ludCh0KSxcIkVycm9yIGluIGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uOiBkZXB0aFJhZGl1cyBtdXN0IGJlIGFuIGludGVnZXJcXG4gICAgICAgICAgICAgICAgICAgICBidXQgZ290IGRlcHRoUmFkaXVzIFwiK3QrXCIuXCIpO3ZhciBpPWEscz0hMTszPT09YS5yYW5rJiYocz0hMCxpPWEuYXM0RCgxLGEuc2hhcGVbMF0sYS5zaGFwZVsxXSxhLnNoYXBlWzJdKSk7dmFyIHU9RU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSxhKXtyZXR1cm4gYShlLmxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uNEQoaSx0LG4scixvKSl9LHt4NEQ6aX0sZnVuY3Rpb24oZSxhKXt2YXIgcz1hWzBdO3JldHVybnt4NEQ6ZnVuY3Rpb24oKXtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oYSl7cmV0dXJuIGEuTFJOR3JhZChlLGkscyx0LG4scixvKX0se30pfX19KTtyZXR1cm4gcz91LmFzM0QodS5zaGFwZVsxXSx1LnNoYXBlWzJdLHUuc2hhcGVbM10pOnV9dmFyIGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uPW9wKHtsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbl86bG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25ffSk7ZnVuY3Rpb24gbm9ybV8oZSx0LG4scil7dm9pZCAwPT09dCYmKHQ9XCJldWNsaWRlYW5cIiksdm9pZCAwPT09biYmKG49bnVsbCksdm9pZCAwPT09ciYmKHI9ITEpO3ZhciBvPW5vcm1JbXBsKGU9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJub3JtXCIpLHQsbiksYT1vLnNoYXBlO2lmKHIpe3ZhciBpPXBhcnNlQXhpc1BhcmFtKG4sZS5zaGFwZSk7YT1leHBhbmRTaGFwZVRvS2VlcERpbShvLnNoYXBlLGkpfXJldHVybiBvLnJlc2hhcGUoYSl9ZnVuY3Rpb24gbm9ybUltcGwoZSx0LG4pe2lmKHZvaWQgMD09PW4mJihuPW51bGwpLDA9PT1lLnJhbmspcmV0dXJuIGUuYWJzKCk7aWYoMSE9PWUucmFuayYmbnVsbD09PW4pcmV0dXJuIG5vcm1JbXBsKGUucmVzaGFwZShbLTFdKSx0LG4pO2lmKDE9PT1lLnJhbmt8fFwibnVtYmVyXCI9PXR5cGVvZiBufHxuIGluc3RhbmNlb2YgQXJyYXkmJjE9PT1uLmxlbmd0aCl7aWYoMT09PXQpcmV0dXJuIGUuYWJzKCkuc3VtKG4pO2lmKHQ9PT0xLzApcmV0dXJuIGUuYWJzKCkubWF4KG4pO2lmKHQ9PT0tMS8wKXJldHVybiBlLmFicygpLm1pbihuKTtpZihcImV1Y2xpZGVhblwiPT09dHx8Mj09PXQpcmV0dXJuIGUuYWJzKCkucG93KHNjYWxhcigyLFwiaW50MzJcIikpLnN1bShuKS5zcXJ0KCk7dGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgaW4gbm9ybTogaW52YWxpZCBvcmQgdmFsdWU6IFwiK3QpfWlmKG4gaW5zdGFuY2VvZiBBcnJheSYmMj09PW4ubGVuZ3RoKXtpZigxPT09dClyZXR1cm4gZS5hYnMoKS5zdW0oblswXSkubWF4KG5bMV0tMSk7aWYodD09PTEvMClyZXR1cm4gZS5hYnMoKS5zdW0oblsxXSkubWF4KG5bMF0pO2lmKHQ9PT0tMS8wKXJldHVybiBlLmFicygpLnN1bShuWzFdKS5taW4oblswXSk7aWYoXCJmcm9cIj09PXR8fFwiZXVjbGlkZWFuXCI9PT10KXJldHVybiBlLnNxdWFyZSgpLnN1bShuKS5zcXJ0KCk7dGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgaW4gbm9ybTogaW52YWxpZCBvcmQgdmFsdWU6IFwiK3QpfXRocm93IG5ldyBFcnJvcihcIkVycm9yIGluIG5vcm06IGludmFsaWQgYXhpczogXCIrbil9dmFyIG5vcm09b3Aoe25vcm1fOm5vcm1ffSk7ZnVuY3Rpb24gdW5zb3J0ZWRTZWdtZW50U3VtXyhlLHQsbil7dmFyIHI9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJ1bnNvcnRlZFNlZ21lbnRTdW1cIiksbz1jb252ZXJ0VG9UZW5zb3IodCxcInNlZ21lbnRJZHNcIixcInVuc29ydGVkU2VnbWVudFN1bVwiLFwiaW50MzJcIik7YXNzZXJ0KFwiaW50MzJcIj09PW8uZHR5cGUsXCJzZWdtZW50SWRzIG11c3QgYmUgb2YgZHR5cGUgYGludDMyYFwiKSxhc3NlcnQoaXNJbnQobiksXCJudW1TZWdtZW50cyBtdXN0IGJlIG9mIGR0eXBlIGludFwiKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUudW5zb3J0ZWRTZWdtZW50U3VtKHIsbyxuKX0seyR4OnJ9LGZ1bmN0aW9uKGUpe3JldHVybnskeDpmdW5jdGlvbigpe3JldHVybiBnYXRoZXJEcm9wTmVnYXRpdmVzKGUsbyl9fX0pfWZ1bmN0aW9uIGdhdGhlcl8oZSx0LG4pe3ZvaWQgMD09PW4mJihuPTApO3ZhciByPWNvbnZlcnRUb1RlbnNvcihlLFwieFwiLFwiZ2F0aGVyXCIpLG89Y29udmVydFRvVGVuc29yKHQsXCJpbmRpY2VzXCIsXCJnYXRoZXJcIixcImludDMyXCIpO2Fzc2VydChcImludDMyXCI9PT1vLmR0eXBlLFwiSW5kaWNlcyBtdXN0IGJlIG9mIGR0eXBlIGBpbnQzMmBcIiksbj1wYXJzZUF4aXNQYXJhbShuLHIuc2hhcGUpWzBdO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5nYXRoZXIocixvLG4pfSx7JHg6cn0sZnVuY3Rpb24oZSl7cmV0dXJueyR4OmZ1bmN0aW9uKCl7aWYoMD09PW4pcmV0dXJuIHVuc29ydGVkU2VnbWVudFN1bShlLG8sci5zaGFwZVtuXSk7dmFyIHQ9ci5zaGFwZSxhPW8uc2l6ZSxpPXQuc2xpY2UoMCxuKSxzPWkubGVuZ3RoLHU9dC5zbGljZShuLHQubGVuZ3RoKS5zbGljZSgxKSxsPXUubGVuZ3RoLGM9YXJyYXlSYW5nZSgwLHMpLHA9YXJyYXlSYW5nZShzKzEscysxK2wpLGQ9YXJyYXlDb25jYXQoW2ksW2FdLHVdKSxoPWUucmVzaGFwZShkKSxmPW8ucmVzaGFwZShbYV0pLG09YXJyYXlDb25jYXQoW1tzXSxjLHBdKSxnPWgudHJhbnNwb3NlKG0pLHY9dW5zb3J0ZWRTZWdtZW50U3VtKGcsZixyLnNoYXBlW25dKSx4PWdldFVuZG9BeGVzUGVybXV0YXRpb24obSk7cmV0dXJuIHY9di50cmFuc3Bvc2UoeCl9fX0pfWZ1bmN0aW9uIGFycmF5UmFuZ2UoZSx0KXtmb3IodmFyIG49W10scj1lO3I8dDsrK3Ipbi5wdXNoKHIpO3JldHVybiBufWZ1bmN0aW9uIGFycmF5Q29uY2F0KGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDsrK24pZm9yKHZhciByPTA7cjxlW25dLmxlbmd0aDsrK3IpdC5wdXNoKGVbbl1bcl0pO3JldHVybiB0fWZ1bmN0aW9uIGdhdGhlckRyb3BOZWdhdGl2ZXMoZSx0KXtmb3IodmFyIG49bWF4aW11bSh0LHplcm9zTGlrZSh0KSkscj1nYXRoZXIoZSxuKSxvPWdyZWF0ZXJFcXVhbCh0LHNjYWxhcigwLFwiaW50MzJcIikpLGE9ci5yYW5rLW8ucmFuayxpPTA7aTxhOysraSlvPWV4cGFuZERpbXMobyxpKzEpO289bG9naWNhbEFuZChvLG9uZXMkMShyLnNoYXBlLFwiYm9vbFwiKSk7dmFyIHM9emVyb3NMaWtlKHIpO3JldHVybiB3aGVyZShvLHIscyl9dmFyIGdhdGhlcj1vcCh7Z2F0aGVyXzpnYXRoZXJffSksdW5zb3J0ZWRTZWdtZW50U3VtPW9wKHt1bnNvcnRlZFNlZ21lbnRTdW1fOnVuc29ydGVkU2VnbWVudFN1bV99KTtmdW5jdGlvbiBtdWx0aVJOTkNlbGxfKGUsdCxuLHIpe2Zvcih2YXIgbz1jb252ZXJ0VG9UZW5zb3IodCxcImRhdGFcIixcIm11bHRpUk5OQ2VsbFwiKSxhPWNvbnZlcnRUb1RlbnNvckFycmF5KG4sXCJjXCIsXCJtdWx0aVJOTkNlbGxcIiksaT1jb252ZXJ0VG9UZW5zb3JBcnJheShyLFwiaFwiLFwibXVsdGlSTk5DZWxsXCIpLHM9byx1PVtdLGw9MDtsPGUubGVuZ3RoO2wrKyl7dmFyIGM9ZVtsXShzLGFbbF0saVtsXSk7dS5wdXNoKGNbMF0pLHUucHVzaChjWzFdKSxzPWNbMV19dmFyIHA9W10sZD1bXTtmb3IobD0wO2w8dS5sZW5ndGg7bCs9MilwLnB1c2godVtsXSksZC5wdXNoKHVbbCsxXSk7cmV0dXJuW3AsZF19ZnVuY3Rpb24gYmFzaWNMU1RNQ2VsbF8oZSx0LG4scixvLGEpe3ZhciBpPWNvbnZlcnRUb1RlbnNvcihlLFwiZm9yZ2V0Qmlhc1wiLFwiYmFzaWNMU1RNQ2VsbFwiKSxzPWNvbnZlcnRUb1RlbnNvcih0LFwibHN0bUtlcm5lbFwiLFwiYmFzaWNMU1RNQ2VsbFwiKSx1PWNvbnZlcnRUb1RlbnNvcihuLFwibHN0bUJpYXNcIixcImJhc2ljTFNUTUNlbGxcIiksbD1jb252ZXJ0VG9UZW5zb3IocixcImRhdGFcIixcImJhc2ljTFNUTUNlbGxcIiksYz1jb252ZXJ0VG9UZW5zb3IobyxcImNcIixcImJhc2ljTFNUTUNlbGxcIikscD1jb252ZXJ0VG9UZW5zb3IoYSxcImhcIixcImJhc2ljTFNUTUNlbGxcIiksZD1sLmNvbmNhdChwLDEpLm1hdE11bChzKS5hZGQodSksaD1kLnNoYXBlWzBdLGY9ZC5zaGFwZVsxXS80LG09W2gsZl0sZz1kLnNsaWNlKFswLDBdLG0pLHY9ZC5zbGljZShbMCxmXSxtKSx4PWQuc2xpY2UoWzAsMipmXSxtKSx5PWQuc2xpY2UoWzAsMypmXSxtKSxUPWcuc2lnbW9pZCgpLm11bFN0cmljdCh2LnRhbmgoKSkuYWRkU3RyaWN0KGMubXVsU3RyaWN0KGkuYWRkKHgpLnNpZ21vaWQoKSkpO3JldHVybltULFQudGFuaCgpLm11bFN0cmljdCh5LnNpZ21vaWQoKSldfXZhciBiYXNpY0xTVE1DZWxsPW9wKHtiYXNpY0xTVE1DZWxsXzpiYXNpY0xTVE1DZWxsX30pLG11bHRpUk5OQ2VsbD1vcCh7bXVsdGlSTk5DZWxsXzptdWx0aVJOTkNlbGxffSk7ZnVuY3Rpb24gbW92aW5nQXZlcmFnZV8oZSx0LG4scixvKXt2b2lkIDA9PT1vJiYobz0hMCk7dmFyIGE9Y29udmVydFRvVGVuc29yKGUsXCJ2XCIsXCJtb3ZpbmdBdmVyYWdlXCIpLGk9Y29udmVydFRvVGVuc29yKHQsXCJ4XCIsXCJtb3ZpbmdBdmVyYWdlXCIpLHM9Y29udmVydFRvVGVuc29yKG4sXCJkZWNheVwiLFwibW92aW5nQXZlcmFnZVwiKTthc3NlcnRUeXBlc01hdGNoKGEsaSksYXNzZXJ0KGFycmF5c0VxdWFsKGEuc2hhcGUsaS5zaGFwZSksXCJTaGFwZSBtaXNtYXRjaCBpbiB2IGFuZCB4XCIpO3ZhciB1PXNjYWxhcigxKSxsPXUuc3ViKHMpLGM9aS5zdWIoYSkubXVsKGwpO2lmKG8pe2Fzc2VydChudWxsIT1yLFwiV2hlbiB1c2luZyB6ZXJvRGViaWFzOiB0cnVlLCBzdGVwIGlzIHJlcXVpcmVkLlwiKTt2YXIgcD1jb252ZXJ0VG9UZW5zb3IocixcInN0ZXBcIixcIm1vdmluZ0F2ZXJhZ2VcIik7Yz1jLmRpdih1LnN1Yihwb3cocyxwKSkpfXJldHVybiBhLmFkZChjKX12YXIgbW92aW5nQXZlcmFnZT1vcCh7bW92aW5nQXZlcmFnZV86bW92aW5nQXZlcmFnZV99KTtmdW5jdGlvbiBzdHJpZGVkU2xpY2VfKGUsdCxuLHIsbyxhLGkscyx1KXtpZih2b2lkIDA9PT1vJiYobz0wKSx2b2lkIDA9PT1hJiYoYT0wKSx2b2lkIDA9PT1pJiYoaT0wKSx2b2lkIDA9PT1zJiYocz0wKSx2b2lkIDA9PT11JiYodT0wKSwwIT09aSl0aHJvdyBuZXcgRXJyb3IoXCJlbGxpcHNpcyBtYXNrIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCIpO2lmKDAhPT1zKXRocm93IG5ldyBFcnJvcihcIm5ldyBheGlzIG1hc2sgaXMgbm90IHlldCBzdXBwb3J0ZWRcIik7dmFyIGw9Y29udmVydFRvVGVuc29yKGUsXCJ4XCIsXCJzdHJpZGVkU2xpY2VcIik7cmV0dXJuIEVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUpe3JldHVybiBlLnN0cmlkZWRTbGljZShsLHQsbixyLG8sYSxpLHMsdSl9LHskeDpsfSl9dmFyIHN0cmlkZWRTbGljZT1vcCh7c3RyaWRlZFNsaWNlXzpzdHJpZGVkU2xpY2VffSk7ZnVuY3Rpb24gdG9wa18oZSx0LG4pe3ZvaWQgMD09PXQmJih0PTEpLHZvaWQgMD09PW4mJihuPSEwKTt2YXIgcj1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcInRvcGtcIik7aWYoMD09PXIucmFuayl0aHJvdyBuZXcgRXJyb3IoXCJ0b3BrKCkgZXhwZWN0cyB0aGUgaW5wdXQgdG8gYmUgb2YgcmFuayAxIG9yIGhpZ2hlclwiKTt2YXIgbz1yLnNoYXBlW3Iuc2hhcGUubGVuZ3RoLTFdO2lmKHQ+byl0aHJvdyBuZXcgRXJyb3IoXCInaycgcGFzc2VkIHRvIHRvcGsoKSBtdXN0IGJlIDw9IHRoZSBsYXN0IGRpbWVuc2lvbiAoXCIrbytcIikgYnV0IGdvdCBcIit0KTt2YXIgYT1FTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS50b3BrKHIsdCxuKX0seyR4OnJ9KTtyZXR1cm57dmFsdWVzOmFbMF0saW5kaWNlczphWzFdfX12YXIgdG9waz1vcCh7dG9wa186dG9wa199KTtmdW5jdGlvbiBzY2F0dGVyTkRfKGUsdCxuKXt2YXIgcj1jb252ZXJ0VG9UZW5zb3IoZSxcImluZGljZXNcIixcInNjYXR0ZXJORFwiLFwiaW50MzJcIiksbz1jb252ZXJ0VG9UZW5zb3IodCxcInVwZGF0ZXNcIixcInNjYXR0ZXJORFwiKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2NhdHRlck5EKHIsbyxuKX0seyRpbmRpY2VzOnIsJHVwZGF0ZXM6b30pfXZhciBzY2F0dGVyTkQ9b3Aoe3NjYXR0ZXJORF86c2NhdHRlck5EX30pO2Z1bmN0aW9uIGZmdF8oZSl7cmV0dXJuIGFzc2VydChcImNvbXBsZXg2NFwiPT09ZS5kdHlwZSxcImR0eXBlIG11c3QgYmUgY29tcGxleDY0XCIpLGFzc2VydCgxPT09ZS5yYW5rLFwiaW5wdXQgcmFuayBtdXN0IGJlIDFcIiksRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZmZ0KGUpfSx7aW5wdXQ6ZX0pfXZhciBmZnQ9b3Aoe2ZmdF86ZmZ0X30pLHNwZWN0cmFsX29wcz1PYmplY3QuZnJlZXplKHtmZnQ6ZmZ0fSk7ZnVuY3Rpb24gZ2F0aGVyTkRfKGUsdCl7dmFyIG49Y29udmVydFRvVGVuc29yKHQsXCJpbmRpY2VzXCIsXCJnYXRoZXJORFwiLFwiaW50MzJcIikscj1jb252ZXJ0VG9UZW5zb3IoZSxcInhcIixcImdhdGhlck5EXCIpO3JldHVybiBFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5nYXRoZXJORChyLG4pfSx7JHg6ciwkaW5kaWNlczpufSl9dmFyIFJlZHVjdGlvbixnYXRoZXJORD1vcCh7Z2F0aGVyTkRfOmdhdGhlck5EX30pO2Z1bmN0aW9uIGNvbXB1dGVXZWlnaHRlZExvc3NfKGUsdCxuKXt2b2lkIDA9PT1uJiYobj1SZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUyk7dmFyIHI9Y29udmVydFRvVGVuc29yKGUsXCJsb3NzZXNcIixcImNvbXB1dGVXZWlnaHRlZExvc3NcIiksbz1udWxsO251bGwhPXQmJihvPWNvbnZlcnRUb1RlbnNvcih0LFwid2VpZ2h0c1wiLFwiY29tcHV0ZVdlaWdodGVkTG9zc1wiKSk7dmFyIGE9bnVsbD09bz9yOnIubXVsKG8pO2lmKG49PT1SZWR1Y3Rpb24uTk9ORSlyZXR1cm4gYTtpZihuPT09UmVkdWN0aW9uLlNVTSlyZXR1cm4gYS5zdW0oKTtpZihuPT09UmVkdWN0aW9uLk1FQU4pe2lmKG51bGw9PW8pcmV0dXJuIGEubWVhbigpO3ZhciBpPXNpemVGcm9tU2hhcGUoci5zaGFwZSkvc2l6ZUZyb21TaGFwZShvLnNoYXBlKSxzPWEuc3VtKCkuZGl2KG8uc3VtKCkpO3JldHVybiBpPjE/cy5kaXYoc2NhbGFyKGkpKTpzfWlmKG49PT1SZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUyl7aWYobnVsbD09bylyZXR1cm4gYS5zdW0oKS5kaXYoc2NhbGFyKHIuc2l6ZSkpO3ZhciB1PW8ubXVsKG9uZXMkMShyLnNoYXBlKSkubm90RXF1YWwoc2NhbGFyKDApKS5zdW0oKS50b0Zsb2F0KCk7cmV0dXJuIGEuc3VtKCkuZGl2KHUpfXRocm93IEVycm9yKFwiVW5rbm93biByZWR1Y3Rpb246IFwiK24pfWZ1bmN0aW9uIGFic29sdXRlRGlmZmVyZW5jZV8oZSx0LG4scil7dm9pZCAwPT09ciYmKHI9UmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpO3ZhciBvPWNvbnZlcnRUb1RlbnNvcihlLFwibGFiZWxzXCIsXCJhYnNvbHV0ZURpZmZlcmVuY2VcIiksYT1jb252ZXJ0VG9UZW5zb3IodCxcInByZWRpY3Rpb25zXCIsXCJhYnNvbHV0ZURpZmZlcmVuY2VcIiksaT1udWxsO251bGwhPW4mJihpPWNvbnZlcnRUb1RlbnNvcihuLFwid2VpZ2h0c1wiLFwiYWJzb2x1dGVEaWZmZXJlbmNlXCIpKSxhc3NlcnRTaGFwZXNNYXRjaChvLnNoYXBlLGEuc2hhcGUsXCJFcnJvciBpbiBhYnNvbHV0ZURpZmZlcmVuY2U6IFwiKTt2YXIgcz1vLnN1YihhKS5hYnMoKTtyZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhzLGkscil9ZnVuY3Rpb24gbWVhblNxdWFyZWRFcnJvcl8oZSx0LG4scil7dm9pZCAwPT09ciYmKHI9UmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpO3ZhciBvPWNvbnZlcnRUb1RlbnNvcihlLFwibGFiZWxzXCIsXCJtZWFuU3F1YXJlZEVycm9yXCIpLGE9Y29udmVydFRvVGVuc29yKHQsXCJwcmVkaWN0aW9uc1wiLFwibWVhblNxdWFyZWRFcnJvclwiKSxpPW51bGw7bnVsbCE9biYmKGk9Y29udmVydFRvVGVuc29yKG4sXCJ3ZWlnaHRzXCIsXCJtZWFuU3F1YXJlZEVycm9yXCIpKSxhc3NlcnRTaGFwZXNNYXRjaChvLnNoYXBlLGEuc2hhcGUsXCJFcnJvciBpbiBtZWFuU3F1YXJlZEVycm9yOiBcIik7dmFyIHM9by5zcXVhcmVkRGlmZmVyZW5jZShhKTtyZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhzLGkscil9ZnVuY3Rpb24gY29zaW5lRGlzdGFuY2VfKGUsdCxuLHIsbyl7dm9pZCAwPT09byYmKG89UmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpO3ZhciBhPWNvbnZlcnRUb1RlbnNvcihlLFwibGFiZWxzXCIsXCJjb3NpbmVEaXN0YW5jZVwiKSxpPWNvbnZlcnRUb1RlbnNvcih0LFwicHJlZGljdGlvbnNcIixcImNvc2luZURpc3RhbmNlXCIpLHM9bnVsbDtudWxsIT1yJiYocz1jb252ZXJ0VG9UZW5zb3IocixcIndlaWdodHNcIixcImNvc2luZURpc3RhbmNlXCIpKSxhc3NlcnRTaGFwZXNNYXRjaChhLnNoYXBlLGkuc2hhcGUsXCJFcnJvciBpbiBjb3NpbmVEaXN0YW5jZTogXCIpO3ZhciB1PXNjYWxhcigxKS5zdWIoYS5tdWwoaSkuc3VtKG4sITApKTtyZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyh1LHMsbyl9ZnVuY3Rpb24gaGluZ2VMb3NzXyhlLHQsbixyKXt2b2lkIDA9PT1yJiYocj1SZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUyk7dmFyIG89Y29udmVydFRvVGVuc29yKGUsXCJsYWJlbHNcIixcImhpbmdlTG9zc1wiKSxhPWNvbnZlcnRUb1RlbnNvcih0LFwicHJlZGljdGlvbnNcIixcImhpbmdlTG9zc1wiKSxpPW51bGw7bnVsbCE9biYmKGk9Y29udmVydFRvVGVuc29yKG4sXCJ3ZWlnaHRzXCIsXCJoaW5nZUxvc3NcIikpLGFzc2VydFNoYXBlc01hdGNoKG8uc2hhcGUsYS5zaGFwZSxcIkVycm9yIGluIGhpbmdlTG9zczogXCIpO3ZhciBzPXNjYWxhcigxKTtvPXNjYWxhcigyKS5tdWwobykuc3ViKHMpO3ZhciB1PXMuc3ViKG8ubXVsKGEpKS5yZWx1KCk7cmV0dXJuIGNvbXB1dGVXZWlnaHRlZExvc3ModSxpLHIpfWZ1bmN0aW9uIGxvZ0xvc3NfKGUsdCxuLHIsbyl7dm9pZCAwPT09ciYmKHI9MWUtNyksdm9pZCAwPT09byYmKG89UmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpO3ZhciBhPWNvbnZlcnRUb1RlbnNvcihlLFwibGFiZWxzXCIsXCJsb2dMb3NzXCIpLGk9Y29udmVydFRvVGVuc29yKHQsXCJwcmVkaWN0aW9uc1wiLFwibG9nTG9zc1wiKSxzPW51bGw7bnVsbCE9biYmKHM9Y29udmVydFRvVGVuc29yKG4sXCJ3ZWlnaHRzXCIsXCJsb2dMb3NzXCIpKSxhc3NlcnRTaGFwZXNNYXRjaChhLnNoYXBlLGkuc2hhcGUsXCJFcnJvciBpbiBsb2dMb3NzOiBcIik7dmFyIHU9c2NhbGFyKDEpLGw9c2NhbGFyKHIpLGM9YS5tdWwoaS5hZGQobCkubG9nKCkpLm5lZygpLnN1Yih1LnN1YihhKS5tdWwodS5zdWIoaSkuYWRkKGwpLmxvZygpKSk7cmV0dXJuIGNvbXB1dGVXZWlnaHRlZExvc3MoYyxzLG8pfWZ1bmN0aW9uIHNpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzXyhlLHQpe3ZhciBuPWNvbnZlcnRUb1RlbnNvcihlLFwibGFiZWxzXCIsXCJzaWdtb2lkQ3Jvc3NFbnRyb3B5V2l0aExvZ2l0c1wiKSxyPWNvbnZlcnRUb1RlbnNvcih0LFwibG9naXRzXCIsXCJzaWdtb2lkQ3Jvc3NFbnRyb3B5V2l0aExvZ2l0c1wiKTthc3NlcnRTaGFwZXNNYXRjaChuLnNoYXBlLHIuc2hhcGUsXCJFcnJvciBpbiBzaWdtb2lkQ3Jvc3NFbnRyb3B5V2l0aExvZ2l0czogXCIpO3ZhciBvPXIucmVsdSgpLGE9ci5tdWwobiksaT1yLmFicygpLm5lZygpLmV4cCgpLmxvZzFwKCk7cmV0dXJuIG8uc3ViKGEpLmFkZChpKX1mdW5jdGlvbiBzaWdtb2lkQ3Jvc3NFbnRyb3B5XyhlLHQsbixyLG8pe3ZvaWQgMD09PXImJihyPTApLHZvaWQgMD09PW8mJihvPVJlZHVjdGlvbi5TVU1fQllfTk9OWkVST19XRUlHSFRTKTt2YXIgYT1jb252ZXJ0VG9UZW5zb3IoZSxcIm11bHRpQ2xhc3NMYWJlbHNcIixcInNpZ21vaWRDcm9zc0VudHJvcHlcIiksaT1jb252ZXJ0VG9UZW5zb3IodCxcImxvZ2l0c1wiLFwic2lnbW9pZENyb3NzRW50cm9weVwiKSxzPW51bGw7aWYobnVsbCE9biYmKHM9Y29udmVydFRvVGVuc29yKG4sXCJ3ZWlnaHRzXCIsXCJzaWdtb2lkQ3Jvc3NFbnRyb3B5XCIpKSxhc3NlcnRTaGFwZXNNYXRjaChhLnNoYXBlLGkuc2hhcGUsXCJFcnJvciBpbiBzaWdtb2lkQ3Jvc3NFbnRyb3B5OiBcIikscj4wKXt2YXIgdT1zY2FsYXIociksbD1zY2FsYXIoMSksYz1zY2FsYXIoLjUpO2E9YS5tdWwobC5zdWIodSkpLmFkZChjLm11bCh1KSl9dmFyIHA9c2lnbW9pZENyb3NzRW50cm9weVdpdGhMb2dpdHNfKGEsaSk7cmV0dXJuIGNvbXB1dGVXZWlnaHRlZExvc3MocCxzLG8pfWZ1bmN0aW9uIGh1YmVyTG9zc18oZSx0LG4scixvKXt2b2lkIDA9PT1yJiYocj0xKSx2b2lkIDA9PT1vJiYobz1SZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUyk7dmFyIGE9Y29udmVydFRvVGVuc29yKGUsXCJsYWJlbHNcIixcImh1YmVyTG9zc1wiKSxpPWNvbnZlcnRUb1RlbnNvcih0LFwicHJlZGljdGlvbnNcIixcImh1YmVyTG9zc1wiKSxzPW51bGw7bnVsbCE9biYmKHM9Y29udmVydFRvVGVuc29yKG4sXCJ3ZWlnaHRzXCIsXCJodWJlckxvc3NcIikpLGFzc2VydFNoYXBlc01hdGNoKGEuc2hhcGUsaS5zaGFwZSxcIkVycm9yIGluIGh1YmVyTG9zczogXCIpO3ZhciB1PXNjYWxhcihyKSxsPWkuc3ViKGEpLmFicygpLGM9bWluaW11bShsLHUpLHA9bC5zdWIoYyksZD1zY2FsYXIoLjUpLm11bChjLnNxdWFyZSgpKS5hZGQodS5tdWwocCkpO3JldHVybiBjb21wdXRlV2VpZ2h0ZWRMb3NzKGQscyxvKX1mdW5jdGlvbiBzb2Z0bWF4Q3Jvc3NFbnRyb3B5V2l0aExvZ2l0c18oZSx0LG4pe2lmKHZvaWQgMD09PW4mJihuPS0xKSwtMT09PW4mJihuPXQucmFuay0xKSxuIT09dC5yYW5rLTEpdGhyb3cgRXJyb3IoXCJTb2Z0bWF4IGNyb3NzIGVudHJvcHkgYWxvbmcgYSBub24tbGFzdCBkaW1lbnNpb24gaXMgbm90IHlldCBzdXBwb3J0ZWQuIExhYmVscyAvIGxvZ2l0cyB3YXMgcmFuayBcIit0LnJhbmsrXCIgYW5kIGRpbSB3YXMgXCIrbik7cmV0dXJuIGN1c3RvbUdyYWQoZnVuY3Rpb24oZSx0KXt2YXIgcj10LmxvZ1N1bUV4cChbbl0sITApLG89dC50b0Zsb2F0KCkuc3ViKHIpO3JldHVybnt2YWx1ZTpvLm11bChlKS5uZWcoKS5zdW0oW25dKSxncmFkRnVuYzpmdW5jdGlvbih0KXt2YXIgcj1leHBhbmRTaGFwZVRvS2VlcERpbSh0LnNoYXBlLFtuXSk7cmV0dXJuW3QucmVzaGFwZShyKS5tdWwoZS50b0Zsb2F0KCkuc3ViKG8uZXhwKCkpKSx0LnJlc2hhcGUocikubXVsKG8uZXhwKCkuc3ViKGUudG9GbG9hdCgpKSldfX19KShlLHQpfWZ1bmN0aW9uIHNvZnRtYXhDcm9zc0VudHJvcHlfKGUsdCxuLHIsbyl7dm9pZCAwPT09ciYmKHI9MCksdm9pZCAwPT09byYmKG89UmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpO3ZhciBhPWNvbnZlcnRUb1RlbnNvcihlLFwib25laG90TGFiZWxzXCIsXCJzb2Z0bWF4Q3Jvc3NFbnRyb3B5XCIpLGk9Y29udmVydFRvVGVuc29yKHQsXCJsb2dpdHNcIixcInNvZnRtYXhDcm9zc0VudHJvcHlcIikscz1udWxsO2lmKG51bGwhPW4mJihzPWNvbnZlcnRUb1RlbnNvcihuLFwid2VpZ2h0c1wiLFwic29mdG1heENyb3NzRW50cm9weVwiKSksYXNzZXJ0U2hhcGVzTWF0Y2goYS5zaGFwZSxpLnNoYXBlLFwiRXJyb3IgaW4gc29mdG1heENyb3NzRW50cm9weTogXCIpLHI+MCl7dmFyIHU9c2NhbGFyKHIpLGw9c2NhbGFyKDEpLGM9c2NhbGFyKGEuc2hhcGVbMV0pO2E9YS5tdWwobC5zdWIodSkpLmFkZCh1LmRpdihjKSl9dmFyIHA9c29mdG1heENyb3NzRW50cm9weVdpdGhMb2dpdHNfKGEsaSk7cmV0dXJuIGNvbXB1dGVXZWlnaHRlZExvc3MocCxzLG8pfSFmdW5jdGlvbihlKXtlW2UuTk9ORT0wXT1cIk5PTkVcIixlW2UuTUVBTj0xXT1cIk1FQU5cIixlW2UuU1VNPTJdPVwiU1VNXCIsZVtlLlNVTV9CWV9OT05aRVJPX1dFSUdIVFM9M109XCJTVU1fQllfTk9OWkVST19XRUlHSFRTXCJ9KFJlZHVjdGlvbnx8KFJlZHVjdGlvbj17fSkpO3ZhciBhYnNvbHV0ZURpZmZlcmVuY2U9b3Aoe2Fic29sdXRlRGlmZmVyZW5jZV86YWJzb2x1dGVEaWZmZXJlbmNlX30pLGNvbXB1dGVXZWlnaHRlZExvc3M9b3Aoe2NvbXB1dGVXZWlnaHRlZExvc3NfOmNvbXB1dGVXZWlnaHRlZExvc3NffSksY29zaW5lRGlzdGFuY2U9b3Aoe2Nvc2luZURpc3RhbmNlXzpjb3NpbmVEaXN0YW5jZV99KSxoaW5nZUxvc3M9b3Aoe2hpbmdlTG9zc186aGluZ2VMb3NzX30pLGh1YmVyTG9zcz1vcCh7aHViZXJMb3NzXzpodWJlckxvc3NffSksbG9nTG9zcz1vcCh7bG9nTG9zc186bG9nTG9zc199KSxtZWFuU3F1YXJlZEVycm9yPW9wKHttZWFuU3F1YXJlZEVycm9yXzptZWFuU3F1YXJlZEVycm9yX30pLHNpZ21vaWRDcm9zc0VudHJvcHk9b3Aoe3NpZ21vaWRDcm9zc0VudHJvcHlfOnNpZ21vaWRDcm9zc0VudHJvcHlffSksc29mdG1heENyb3NzRW50cm9weT1vcCh7c29mdG1heENyb3NzRW50cm9weV86c29mdG1heENyb3NzRW50cm9weV99KSxsb3NzX29wcz1PYmplY3QuZnJlZXplKHtnZXQgUmVkdWN0aW9uKCl7cmV0dXJuIFJlZHVjdGlvbn0sYWJzb2x1dGVEaWZmZXJlbmNlOmFic29sdXRlRGlmZmVyZW5jZSxjb21wdXRlV2VpZ2h0ZWRMb3NzOmNvbXB1dGVXZWlnaHRlZExvc3MsY29zaW5lRGlzdGFuY2U6Y29zaW5lRGlzdGFuY2UsaGluZ2VMb3NzOmhpbmdlTG9zcyxodWJlckxvc3M6aHViZXJMb3NzLGxvZ0xvc3M6bG9nTG9zcyxtZWFuU3F1YXJlZEVycm9yOm1lYW5TcXVhcmVkRXJyb3Isc2lnbW9pZENyb3NzRW50cm9weTpzaWdtb2lkQ3Jvc3NFbnRyb3B5LHNvZnRtYXhDcm9zc0VudHJvcHk6c29mdG1heENyb3NzRW50cm9weX0pO2Z1bmN0aW9uIGdyYW1TY2htaWR0XyhlKXt2YXIgdDtpZihBcnJheS5pc0FycmF5KGUpKXt0PSExLGFzc2VydChudWxsIT1lJiZlLmxlbmd0aD4wLFwiR3JhbS1TY2htaWR0IHByb2Nlc3M6IGlucHV0IG11c3Qgbm90IGJlIG51bGwsIHVuZGVmaW5lZCwgb3IgZW1wdHlcIik7Zm9yKHZhciBuPWVbMF0uc2hhcGVbMF0scj0xO3I8ZS5sZW5ndGg7KytyKWFzc2VydChlW3JdLnNoYXBlWzBdPT09bixcIkdyYW0tU2NobWlkdDogTm9uLXVuaXF1ZSBsZW5ndGhzIGZvdW5kIGluIHRoZSBpbnB1dCB2ZWN0b3JzOiAoXCIrZVtyXS5zaGFwZVswXStcIiB2cy4gXCIrbitcIilcIil9ZWxzZSB0PSEwLGU9c3BsaXQkMShlLGUuc2hhcGVbMF0sMCkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBzcXVlZXplKGUsWzBdKX0pO2Fzc2VydChlLmxlbmd0aDw9ZVswXS5zaGFwZVswXSxcIkdyYW0tU2NobWlkdDogTnVtYmVyIG9mIHZlY3RvcnMgKFwiK2UubGVuZ3RoK1wiKSBleGNlZWRzIG51bWJlciBvZiBkaW1lbnNpb25zIChcIitlWzBdLnNoYXBlWzBdK1wiKS5cIik7dmFyIG89W10sYT1lLGk9ZnVuY3Rpb24oZSl7by5wdXNoKEVOVi5lbmdpbmUudGlkeShmdW5jdGlvbigpe3ZhciB0PWFbZV07aWYoZT4wKWZvcih2YXIgbj0wO248ZTsrK24pe3ZhciByPXN1bShvW25dLm11bFN0cmljdCh0KSkubXVsKG9bbl0pO3Q9dC5zdWIocil9cmV0dXJuIHQuZGl2KG5vcm0odCxcImV1Y2xpZGVhblwiKSl9KSl9O2ZvcihyPTA7cjxlLmxlbmd0aDsrK3IpaShyKTtyZXR1cm4gdD9zdGFjayhvLDApOm99ZnVuY3Rpb24gcXJfKGUsdCl7aWYodm9pZCAwPT09dCYmKHQ9ITEpLGUucmFuazwyKXRocm93IG5ldyBFcnJvcihcInFyKCkgcmVxdWlyZXMgaW5wdXQgdGVuc29yIHRvIGhhdmUgYSByYW5rID49IDIsIGJ1dCBnb3QgcmFuayBcIitlLnJhbmspO2lmKDI9PT1lLnJhbmspcmV0dXJuIHFyMmQoZSx0KTt2YXIgbj1lLnNoYXBlLnNsaWNlKDAsZS5zaGFwZS5sZW5ndGgtMikucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUqdH0pLHI9W10sbz1bXTtyZXR1cm4gdW5zdGFjayhlLnJlc2hhcGUoW24sZS5zaGFwZVtlLnNoYXBlLmxlbmd0aC0yXSxlLnNoYXBlW2Uuc2hhcGUubGVuZ3RoLTFdXSksMCkuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgbj1xcjJkKGUsdCksYT1uWzBdLGk9blsxXTtyLnB1c2goYSksby5wdXNoKGkpfSksW3N0YWNrKHIsMCkucmVzaGFwZShlLnNoYXBlKSxzdGFjayhvLDApLnJlc2hhcGUoZS5zaGFwZSldfWZ1bmN0aW9uIHFyMmQoZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9ITEpLEVOVi5lbmdpbmUudGlkeShmdW5jdGlvbigpe2lmKDIhPT1lLnNoYXBlLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJxcjJkKCkgcmVxdWlyZXMgYSAyRCBUZW5zb3IsIGJ1dCBnb3QgYSBcIitlLnNoYXBlLmxlbmd0aCtcIkQgVGVuc29yLlwiKTtmb3IodmFyIG49ZS5zaGFwZVswXSxyPWUuc2hhcGVbMV0sbz1leWUobiksYT1lLmNsb25lKCksaT10ZW5zb3IyZChbWzFdXSxbMSwxXSkscz1pLmNsb25lKCksdT1uPj1yP3I6bixsPWZ1bmN0aW9uKGUpe3ZhciB0LHU9YSxsPXMsYz1vO3Q9RU5WLmVuZ2luZS50aWR5KGZ1bmN0aW9uKCl7dmFyIHQ9YS5zbGljZShbZSxlXSxbbi1lLDFdKSx1PXQubm9ybSgpLGw9YS5zbGljZShbZSxlXSxbMSwxXSksYz1sLnNpZ24oKS5uZWcoKSxwPWwuc3ViKGMubXVsKHUpKSxkPXQuZGl2KHApO3M9MT09PWQuc2hhcGVbMF0/aS5jbG9uZSgpOmkuY29uY2F0KGQuc2xpY2UoWzEsMF0sW2Quc2hhcGVbMF0tMSxkLnNoYXBlWzFdXSksMCk7dmFyIGg9Yy5tYXRNdWwocCkuZGl2KHUpLm5lZygpLGY9YS5zbGljZShbZSwwXSxbbi1lLHJdKSxtPWgubXVsKHMpO2E9MD09PWU/Zi5zdWIobS5tYXRNdWwocy50cmFuc3Bvc2UoKS5tYXRNdWwoZikpKTphLnNsaWNlKFswLDBdLFtlLHJdKS5jb25jYXQoZi5zdWIobS5tYXRNdWwocy50cmFuc3Bvc2UoKS5tYXRNdWwoZikpKSwwKTt2YXIgZz1vLnNsaWNlKFswLGVdLFtuLG8uc2hhcGVbMV0tZV0pO3JldHVybiBvPTA9PT1lP2cuc3ViKGcubWF0TXVsKHMpLm1hdE11bChtLnRyYW5zcG9zZSgpKSk6by5zbGljZShbMCwwXSxbbixlXSkuY29uY2F0KGcuc3ViKGcubWF0TXVsKHMpLm1hdE11bChtLnRyYW5zcG9zZSgpKSksMSksW3MsYSxvXX0pLHM9dFswXSxhPXRbMV0sbz10WzJdLGRpc3Bvc2UoW3UsbCxjXSl9LGM9MDtjPHU7KytjKWwoYyk7cmV0dXJuIXQmJm4+ciYmKG89by5zbGljZShbMCwwXSxbbixyXSksYT1hLnNsaWNlKFswLDBdLFtyLHJdKSksW28sYV19KX12YXIgZ3JhbVNjaG1pZHQ9b3Aoe2dyYW1TY2htaWR0XzpncmFtU2NobWlkdF99KSxxcj1vcCh7cXJfOnFyX30pLGxpbmFsZ19vcHM9T2JqZWN0LmZyZWV6ZSh7Z3JhbVNjaG1pZHQ6Z3JhbVNjaG1pZHQscXI6cXJ9KTtmdW5jdGlvbiByZXNpemVCaWxpbmVhcl8oZSx0LG4pe3ZvaWQgMD09PW4mJihuPSExKTt2YXIgcj1jb252ZXJ0VG9UZW5zb3IoZSxcImltYWdlc1wiLFwicmVzaXplQmlsaW5lYXJcIik7YXNzZXJ0KDM9PT1yLnJhbmt8fDQ9PT1yLnJhbmssXCJFcnJvciBpbiByZXNpemVCaWxpbmVhcjogeCBtdXN0IGJlIHJhbmsgMyBvciA0LCBidXQgZ290IHJhbmsgXCIrci5yYW5rK1wiLlwiKSxhc3NlcnQoMj09PXQubGVuZ3RoLFwiRXJyb3IgaW4gcmVzaXplQmlsaW5lYXI6IG5ldyBzaGFwZSBtdXN0IDJELCBidXQgZ290IHNoYXBlIFwiK3QrXCIuXCIpO3ZhciBvPXIsYT0hMTszPT09ci5yYW5rJiYoYT0hMCxvPXIuYXM0RCgxLHIuc2hhcGVbMF0sci5zaGFwZVsxXSxyLnNoYXBlWzJdKSk7dmFyIGk9dFswXSxzPXRbMV0sdT1FTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlLHQpe3JldHVybiBlLnJlc2l6ZUJpbGluZWFyKG8saSxzLG4pfSx7YmF0Y2hJbWFnZXM6b30sZnVuY3Rpb24oZSx0KXtyZXR1cm57YmF0Y2hJbWFnZXM6ZnVuY3Rpb24oKXtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24odCl7cmV0dXJuIHQucmVzaXplQmlsaW5lYXJCYWNrcHJvcChlLG8sbil9LHt9KX19fSk7cmV0dXJuIGE/dS5hczNEKHUuc2hhcGVbMV0sdS5zaGFwZVsyXSx1LnNoYXBlWzNdKTp1fWZ1bmN0aW9uIHJlc2l6ZU5lYXJlc3ROZWlnaGJvcl8oZSx0LG4pe3ZvaWQgMD09PW4mJihuPSExKTt2YXIgcj1jb252ZXJ0VG9UZW5zb3IoZSxcImltYWdlc1wiLFwicmVzaXplTmVhcmVzdE5laWdoYm9yXCIpO2Fzc2VydCgzPT09ci5yYW5rfHw0PT09ci5yYW5rLFwiRXJyb3IgaW4gcmVzaXplTmVhcmVzdE5laWdoYm9yOiB4IG11c3QgYmUgcmFuayAzIG9yIDQsIGJ1dCBnb3QgcmFuayBcIityLnJhbmsrXCIuXCIpLGFzc2VydCgyPT09dC5sZW5ndGgsXCJFcnJvciBpbiByZXNpemVOZWFyZXN0TmVpZ2hib3I6IG5ldyBzaGFwZSBtdXN0IDJELCBidXQgZ290IHNoYXBlIFwiK3QrXCIuXCIpLGFzc2VydChcImZsb2F0MzJcIj09PXIuZHR5cGV8fFwiaW50MzJcIj09PXIuZHR5cGUsXCJgaW1hZ2VzYCBtdXN0IGhhdmUgYGludDMyYCBvciBgZmxvYXQzMmAgYXMgZHR5cGVcIik7dmFyIG89cixhPSExOzM9PT1yLnJhbmsmJihhPSEwLG89ci5hczREKDEsci5zaGFwZVswXSxyLnNoYXBlWzFdLHIuc2hhcGVbMl0pKTt2YXIgaT10WzBdLHM9dFsxXSx1PUVOVi5lbmdpbmUucnVuS2VybmVsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucmVzaXplTmVhcmVzdE5laWdoYm9yKG8saSxzLG4pfSx7YmF0Y2hJbWFnZXM6b30sZnVuY3Rpb24oZSx0KXtyZXR1cm57YmF0Y2hJbWFnZXM6ZnVuY3Rpb24oKXtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24odCl7cmV0dXJuIHQucmVzaXplTmVhcmVzdE5laWdoYm9yQmFja3Byb3AoZSxvLG4pfSx7fSl9fX0pO3JldHVybiBhP3UuYXMzRCh1LnNoYXBlWzFdLHUuc2hhcGVbMl0sdS5zaGFwZVszXSk6dX1mdW5jdGlvbiBub25NYXhTdXBwcmVzc2lvbl8oZSx0LG4scixvKXt2b2lkIDA9PT1yJiYocj0uNSksdm9pZCAwPT09byYmKG89TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKTt2YXIgYT1jb252ZXJ0VG9UZW5zb3IoZSxcImJveGVzXCIsXCJub25NYXhTdXBwcmVzc2lvblwiKSxpPWNvbnZlcnRUb1RlbnNvcih0LFwic2NvcmVzXCIsXCJub25NYXhTdXBwcmVzc2lvblwiKSxzPW5vbk1heFN1cHBTYW5pdHlDaGVjayhhLGksbixyLG8pO3JldHVybiBuPXMubWF4T3V0cHV0U2l6ZSxyPXMuaW91VGhyZXNob2xkLG89cy5zY29yZVRocmVzaG9sZCxFTlYuZW5naW5lLnJ1bktlcm5lbChmdW5jdGlvbihlKXtyZXR1cm4gZS5ub25NYXhTdXBwcmVzc2lvbihhLGksbixyLG8pfSx7JGJveGVzOmF9KX1mdW5jdGlvbiBub25NYXhTdXBwcmVzc2lvbkFzeW5jXyhlLHQsbixyLG8pe3JldHVybiB2b2lkIDA9PT1yJiYocj0uNSksdm9pZCAwPT09byYmKG89TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKSxfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIGEsaSxzLHUsbCxjO3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKHApe3N3aXRjaChwLmxhYmVsKXtjYXNlIDA6cmV0dXJuIGE9Y29udmVydFRvVGVuc29yKGUsXCJib3hlc1wiLFwibm9uTWF4U3VwcHJlc3Npb25Bc3luY1wiKSxpPWNvbnZlcnRUb1RlbnNvcih0LFwic2NvcmVzXCIsXCJub25NYXhTdXBwcmVzc2lvbkFzeW5jXCIpLHM9bm9uTWF4U3VwcFNhbml0eUNoZWNrKGEsaSxuLHIsbyksbj1zLm1heE91dHB1dFNpemUscj1zLmlvdVRocmVzaG9sZCxvPXMuc2NvcmVUaHJlc2hvbGQsWzQsYS5kYXRhKCldO2Nhc2UgMTpyZXR1cm4gdT1wLnNlbnQoKSxbNCxpLmRhdGEoKV07Y2FzZSAyOnJldHVybiBsPXAuc2VudCgpLGM9bm9uTWF4U3VwcHJlc3Npb25JbXBsKHUsbCxuLHIsbyksYSE9PWUmJmEuZGlzcG9zZSgpLGkhPT10JiZpLmRpc3Bvc2UoKSxbMixjXX19KX0pfWZ1bmN0aW9uIG5vbk1heFN1cHBTYW5pdHlDaGVjayhlLHQsbixyLG8pe251bGw9PXImJihyPS41KSxudWxsPT1vJiYobz1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpO3ZhciBhPWUuc2hhcGVbMF07cmV0dXJuIG49TWF0aC5taW4obixhKSxhc3NlcnQoMDw9ciYmcjw9MSxcImlvdVRocmVzaG9sZCBtdXN0IGJlIGluIFswLCAxXSwgYnV0IHdhcyAnXCIrcitcIidcIiksYXNzZXJ0KDI9PT1lLnJhbmssXCJib3hlcyBtdXN0IGJlIGEgMkQgdGVuc29yLCBidXQgd2FzIG9mIHJhbmsgJ1wiK2UucmFuaytcIidcIiksYXNzZXJ0KDQ9PT1lLnNoYXBlWzFdLFwiYm94ZXMgbXVzdCBoYXZlIDQgY29sdW1ucywgYnV0IDJuZCBkaW1lbnNpb24gd2FzIFwiK2Uuc2hhcGVbMV0pLGFzc2VydCgxPT09dC5yYW5rLFwic2NvcmVzIG11c3QgYmUgYSAxRCB0ZW5zb3JcIiksYXNzZXJ0KHQuc2hhcGVbMF09PT1hLFwic2NvcmVzIGhhcyBpbmNvbXBhdGlibGUgc2hhcGUgd2l0aCBib3hlcy4gRXhwZWN0ZWQgXCIrYStcIiwgYnV0IHdhcyBcIit0LnNoYXBlWzBdKSx7bWF4T3V0cHV0U2l6ZTpuLGlvdVRocmVzaG9sZDpyLHNjb3JlVGhyZXNob2xkOm99fWZ1bmN0aW9uIGNyb3BBbmRSZXNpemVfKGUsdCxuLHIsbyxhKXt2YXIgaT1jb252ZXJ0VG9UZW5zb3IoZSxcImltYWdlXCIsXCJjcm9wQW5kUmVzaXplXCIsXCJmbG9hdDMyXCIpLHM9Y29udmVydFRvVGVuc29yKHQsXCJib3hlc1wiLFwiY3JvcEFuZFJlc2l6ZVwiLFwiZmxvYXQzMlwiKSx1PWNvbnZlcnRUb1RlbnNvcihuLFwiYm94SW5kXCIsXCJjcm9wQW5kUmVzaXplXCIsXCJpbnQzMlwiKTtvPW98fFwiYmlsaW5lYXJcIixhPWF8fDA7dmFyIGw9cy5zaGFwZVswXTthc3NlcnQoND09PWkucmFuayxcIkVycm9yIGluIGNyb3BBbmRSZXNpemU6IGltYWdlIG11c3QgYmUgcmFuayA0LGJ1dCBnb3QgcmFuayBcIitpLnJhbmsrXCIuXCIpLGFzc2VydCgyPT09cy5yYW5rJiY0PT09cy5zaGFwZVsxXSxcIkVycm9yIGluIGNyb3BBbmRSZXNpemU6IGJveGVzIG11c3QgYmUgaGF2ZSBzaXplIFtcIitsK1wiLDRdIGJ1dCBoYWQgc2hhcGUgXCIrcy5zaGFwZStcIi5cIiksYXNzZXJ0KDE9PT11LnJhbmsmJnUuc2hhcGVbMF09PT1sLFwiRXJyb3IgaW4gY3JvcEFuZFJlc2l6ZTogYm94SW5kIG11c3QgYmUgaGF2ZSBzaXplIFtcIitsK1wiXSBidXQgaGFkIHNoYXBlIFwiK3Muc2hhcGUrXCIuXCIpLGFzc2VydChcImludDMyXCI9PT11LmR0eXBlLFwiRXJyb3IgaW4gY3JvcEFuZFJlc2l6ZTogYm94SW5kIG11c3QgYmUgb2YgZHR5cGUgaW50MzIsIGJ1dCBnb3QgZHR5cGUgXCIrdS5kdHlwZStcIi5cIiksYXNzZXJ0KDI9PT1yLmxlbmd0aCxcIkVycm9yIGluIGNyb3BBbmRSZXNpemU6IGNyb3BTaXplIG11c3QgYmUgb2YgbGVuZ3RoIDIsIGJ1dCBnb3QgbGVuZ3RoIFwiK3IubGVuZ3RoK1wiLlwiKSxhc3NlcnQoclswXT49MSYmclsxXT49MSxcImNyb3BTaXplIG11c3QgYmUgYXRsZWFzdCBbMSwxXSwgYnV0IHdhcyBcIityKSxhc3NlcnQoXCJiaWxpbmVhclwiPT09b3x8XCJuZWFyZXN0XCI9PT1vLFwibWV0aG9kIG11c3QgYmUgYmlsaW5lYXIgb3IgbmVhcmVzdCwgYnV0IHdhcyBcIitvKTtyZXR1cm4gRU5WLmVuZ2luZS5ydW5LZXJuZWwoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jcm9wQW5kUmVzaXplKGkscyx1LHIsbyxhKX0seyRpbWFnZTppLCRib3hlczpzfSl9dmFyIHJlc2l6ZUJpbGluZWFyPW9wKHtyZXNpemVCaWxpbmVhcl86cmVzaXplQmlsaW5lYXJffSkscmVzaXplTmVhcmVzdE5laWdoYm9yPW9wKHtyZXNpemVOZWFyZXN0TmVpZ2hib3JfOnJlc2l6ZU5lYXJlc3ROZWlnaGJvcl99KSxub25NYXhTdXBwcmVzc2lvbj1vcCh7bm9uTWF4U3VwcHJlc3Npb25fOm5vbk1heFN1cHByZXNzaW9uX30pLG5vbk1heFN1cHByZXNzaW9uQXN5bmM9bm9uTWF4U3VwcHJlc3Npb25Bc3luY18sY3JvcEFuZFJlc2l6ZT1jcm9wQW5kUmVzaXplXyxpbWFnZV9vcHM9T2JqZWN0LmZyZWV6ZSh7cmVzaXplQmlsaW5lYXI6cmVzaXplQmlsaW5lYXIscmVzaXplTmVhcmVzdE5laWdoYm9yOnJlc2l6ZU5lYXJlc3ROZWlnaGJvcixub25NYXhTdXBwcmVzc2lvbjpub25NYXhTdXBwcmVzc2lvbixub25NYXhTdXBwcmVzc2lvbkFzeW5jOm5vbk1heFN1cHByZXNzaW9uQXN5bmMsY3JvcEFuZFJlc2l6ZTpjcm9wQW5kUmVzaXplfSksb3BzPU9iamVjdC5mcmVlemUoe2ltYWdlOmltYWdlX29wcyxsaW5hbGc6bGluYWxnX29wcyxsb3NzZXM6bG9zc19vcHMsc3BlY3RyYWw6c3BlY3RyYWxfb3BzLG9wOm9wLGJhdGNoTm9ybWFsaXphdGlvbjJkOmJhdGNoTm9ybWFsaXphdGlvbjJkLGJhdGNoTm9ybWFsaXphdGlvbjNkOmJhdGNoTm9ybWFsaXphdGlvbjNkLGJhdGNoTm9ybWFsaXphdGlvbjRkOmJhdGNoTm9ybWFsaXphdGlvbjRkLGJhdGNoTm9ybWFsaXphdGlvbjpiYXRjaE5vcm1hbGl6YXRpb24sY29tcGxleDpjb21wbGV4LHJlYWw6cmVhbCxpbWFnOmltYWcsY29uY2F0OmNvbmNhdCxjb25jYXQxZDpjb25jYXQxZCxjb25jYXQyZDpjb25jYXQyZCxjb25jYXQzZDpjb25jYXQzZCxjb25jYXQ0ZDpjb25jYXQ0ZCxzcGxpdDpzcGxpdCQxLGNvbnYxZDpjb252MWQsY29udjJkOmNvbnYyZCxkZXB0aHdpc2VDb252MmQ6ZGVwdGh3aXNlQ29udjJkLHNlcGFyYWJsZUNvbnYyZDpzZXBhcmFibGVDb252MmQsY29udjJkVHJhbnNwb3NlOmNvbnYyZFRyYW5zcG9zZSxtYXRNdWw6bWF0TXVsLGRvdDpkb3Qsb3V0ZXJQcm9kdWN0Om91dGVyUHJvZHVjdCxyZXZlcnNlOnJldmVyc2UscmV2ZXJzZTFkOnJldmVyc2UxZCxyZXZlcnNlMmQ6cmV2ZXJzZTJkLHJldmVyc2UzZDpyZXZlcnNlM2QscmV2ZXJzZTRkOnJldmVyc2U0ZCxtYXhQb29sOm1heFBvb2wsYXZnUG9vbDphdmdQb29sLHNsaWNlOnNsaWNlLHNsaWNlMWQ6c2xpY2UxZCxzbGljZTJkOnNsaWNlMmQsc2xpY2UzZDpzbGljZTNkLHNsaWNlNGQ6c2xpY2U0ZCxhYnM6YWJzLGFjb3M6YWNvcyxhY29zaDphY29zaCxhc2luOmFzaW4sYXNpbmg6YXNpbmgsYXRhbjphdGFuLGF0YW5oOmF0YW5oLGNlaWw6Y2VpbCxjbGlwQnlWYWx1ZTpjbGlwQnlWYWx1ZSxjb3M6Y29zLGNvc2g6Y29zaCxlcmY6ZXJmLGV4cDpleHAsZXhwbTE6ZXhwbTEsZmxvb3I6Zmxvb3IsbG9nOmxvZyQxLGxvZzFwOmxvZzFwLGxvZ1NpZ21vaWQ6bG9nU2lnbW9pZCxuZWc6bmVnLHJlY2lwcm9jYWw6cmVjaXByb2NhbCxyb3VuZDpyb3VuZCxyc3FydDpyc3FydCxzaWdtb2lkOnNpZ21vaWQsc2lnbjpzaWduLHNpbjpzaW4sc2luaDpzaW5oLHNvZnRwbHVzOnNvZnRwbHVzLHNxcnQ6c3FydCxzcXVhcmU6c3F1YXJlLHN0ZXA6c3RlcCx0YW46dGFuLHRhbmg6dGFuaCQxLGFsbDphbGwsYW55OmFueSxhcmdNYXg6YXJnTWF4LGFyZ01pbjphcmdNaW4sbG9nU3VtRXhwOmxvZ1N1bUV4cCxtYXg6bWF4LG1lYW46bWVhbixtaW46bWluLG1vbWVudHM6bW9tZW50cyxzdW06c3VtLHByb2Q6cHJvZCxlcXVhbDplcXVhbCxlcXVhbFN0cmljdDplcXVhbFN0cmljdCxncmVhdGVyOmdyZWF0ZXIsZ3JlYXRlckVxdWFsOmdyZWF0ZXJFcXVhbCxncmVhdGVyRXF1YWxTdHJpY3Q6Z3JlYXRlckVxdWFsU3RyaWN0LGdyZWF0ZXJTdHJpY3Q6Z3JlYXRlclN0cmljdCxsZXNzOmxlc3MsbGVzc0VxdWFsOmxlc3NFcXVhbCxsZXNzRXF1YWxTdHJpY3Q6bGVzc0VxdWFsU3RyaWN0LGxlc3NTdHJpY3Q6bGVzc1N0cmljdCxub3RFcXVhbDpub3RFcXVhbCxub3RFcXVhbFN0cmljdDpub3RFcXVhbFN0cmljdCxhZGQ6YWRkLGFkZE46YWRkTixhZGRTdHJpY3Q6YWRkU3RyaWN0LGF0YW4yOmF0YW4yLGRpdjpkaXYsZGl2U3RyaWN0OmRpdlN0cmljdCxmbG9vckRpdjpmbG9vckRpdixtYXhpbXVtOm1heGltdW0sbWF4aW11bVN0cmljdDptYXhpbXVtU3RyaWN0LG1pbmltdW06bWluaW11bSxtaW5pbXVtU3RyaWN0Om1pbmltdW1TdHJpY3QsbW9kOm1vZCxtb2RTdHJpY3Q6bW9kU3RyaWN0LG11bDptdWwsbXVsU3RyaWN0Om11bFN0cmljdCxwb3c6cG93LHBvd1N0cmljdDpwb3dTdHJpY3Qsc3F1YXJlZERpZmZlcmVuY2U6c3F1YXJlZERpZmZlcmVuY2Usc3F1YXJlZERpZmZlcmVuY2VTdHJpY3Q6c3F1YXJlZERpZmZlcmVuY2VTdHJpY3Qsc3ViOnN1YixzdWJTdHJpY3Q6c3ViU3RyaWN0LGVsdTplbHUsbGVha3lSZWx1OmxlYWt5UmVsdSxwcmVsdTpwcmVsdSxyZWx1OnJlbHUsc2VsdTpzZWx1LGxvZ2ljYWxBbmQ6bG9naWNhbEFuZCxsb2dpY2FsTm90OmxvZ2ljYWxOb3QsbG9naWNhbE9yOmxvZ2ljYWxPcixsb2dpY2FsWG9yOmxvZ2ljYWxYb3Isd2hlcmU6d2hlcmUsd2hlcmVBc3luYzp3aGVyZUFzeW5jLGJ1ZmZlcjpidWZmZXIsdG9QaXhlbHM6dG9QaXhlbHMscHJpbnQ6cHJpbnQsYmF0Y2hUb1NwYWNlTkQ6YmF0Y2hUb1NwYWNlTkQsY2FzdDpjYXN0LGNsb25lOmNsb25lLGN1bXN1bTpjdW1zdW0sZGVwdGhUb1NwYWNlOmRlcHRoVG9TcGFjZSxleHBhbmREaW1zOmV4cGFuZERpbXMsZXllOmV5ZSxmcm9tUGl4ZWxzOmZyb21QaXhlbHMsbXVsdGlub21pYWw6bXVsdGlub21pYWwsb25lSG90Om9uZUhvdCxwYWQ6cGFkLHBhZDFkOnBhZDFkLHBhZDJkOnBhZDJkLHBhZDNkOnBhZDNkLHBhZDRkOnBhZDRkLHJhbmQ6cmFuZCxyYW5kb21Ob3JtYWw6cmFuZG9tTm9ybWFsLHJhbmRvbVVuaWZvcm06cmFuZG9tVW5pZm9ybSxyZXNoYXBlOnJlc2hhcGUsc3BhY2VUb0JhdGNoTkQ6c3BhY2VUb0JhdGNoTkQsc3F1ZWV6ZTpzcXVlZXplLHN0YWNrOnN0YWNrLHRpbGU6dGlsZSx0cnVuY2F0ZWROb3JtYWw6dHJ1bmNhdGVkTm9ybWFsLHVuc3RhY2s6dW5zdGFjayxmaWxsOmZpbGwsbGluc3BhY2U6bGluc3BhY2Usb25lczpvbmVzJDEscmFuZ2U6cmFuZ2Usc2NhbGFyOnNjYWxhcix0ZW5zb3I6dGVuc29yLHRlbnNvcjFkOnRlbnNvcjFkLHRlbnNvcjJkOnRlbnNvcjJkLHRlbnNvcjNkOnRlbnNvcjNkLHRlbnNvcjRkOnRlbnNvcjRkLHRlbnNvcjVkOnRlbnNvcjVkLHRlbnNvcjZkOnRlbnNvcjZkLHplcm9zOnplcm9zLG9uZXNMaWtlOm9uZXNMaWtlLHplcm9zTGlrZTp6ZXJvc0xpa2UsdHJhbnNwb3NlOnRyYW5zcG9zZSxzb2Z0bWF4OnNvZnRtYXgsbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb246bG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb24sbm9ybTpub3JtLGdhdGhlcjpnYXRoZXIsdW5zb3J0ZWRTZWdtZW50U3VtOnVuc29ydGVkU2VnbWVudFN1bSxiYXNpY0xTVE1DZWxsOmJhc2ljTFNUTUNlbGwsbXVsdGlSTk5DZWxsOm11bHRpUk5OQ2VsbCxtb3ZpbmdBdmVyYWdlOm1vdmluZ0F2ZXJhZ2Usc3RyaWRlZFNsaWNlOnN0cmlkZWRTbGljZSx0b3BrOnRvcGssc2NhdHRlck5EOnNjYXR0ZXJORCxmZnQ6ZmZ0LGdhdGhlck5EOmdhdGhlck5EfSksTWF0aEJhY2tlbmRDUFU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dGhpcy5ibG9ja1NpemU9NDgsdGhpcy5maXJzdFVzZT0hMCxFTlYuZ2V0KFwiSVNfQlJPV1NFUlwiKSYmKHRoaXMuY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIikpfXJldHVybiBlLnByb3RvdHlwZS5zZXREYXRhTW92ZXI9ZnVuY3Rpb24oZSl7dGhpcy5kYXRhPW5ldyBEYXRhU3RvcmFnZShlKX0sZS5wcm90b3R5cGUucmVnaXN0ZXI9ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuZmlyc3RVc2UmJih0aGlzLmZpcnN0VXNlPSExLEVOVi5nZXQoXCJJU19OT0RFXCIpJiZ3YXJuKFwiXFxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbkhpIHRoZXJlIPCfkYsuIExvb2tzIGxpa2UgeW91IGFyZSBydW5uaW5nIFRlbnNvckZsb3cuanMgaW4gTm9kZS5qcy4gVG8gc3BlZWQgdGhpbmdzIHVwIGRyYW1hdGljYWxseSwgaW5zdGFsbCBvdXIgbm9kZSBiYWNrZW5kLCB3aGljaCBiaW5kcyB0byBUZW5zb3JGbG93IEMrKywgYnkgcnVubmluZyBucG0gaSBAdGVuc29yZmxvdy90ZmpzLW5vZGUsIG9yIG5wbSBpIEB0ZW5zb3JmbG93L3RmanMtbm9kZS1ncHUgaWYgeW91IGhhdmUgQ1VEQS4gVGhlbiBjYWxsIHJlcXVpcmUoJ0B0ZW5zb3JmbG93L3RmanMtbm9kZScpOyAoLWdwdSBzdWZmaXggZm9yIENVREEpIGF0IHRoZSBzdGFydCBvZiB5b3VyIHByb2dyYW0uIFZpc2l0IGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMtbm9kZSBmb3IgbW9yZSBkZXRhaWxzLlxcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG5cIikpLHRoaXMuZGF0YS5oYXMoZSkpdGhyb3cgbmV3IEVycm9yKFwiRGF0YSBidWZmZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkXCIpO3RoaXMuZGF0YS5zZXQoZSx7ZHR5cGU6bn0pfSxlLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQpe2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKFwiTWF0aEJhY2tlbmRDUFUud3JpdGUoKTogdmFsdWVzIGNhbiBub3QgYmUgbnVsbFwiKTt0aGlzLmRhdGEuZ2V0KGUpLnZhbHVlcz10fSxlLnByb3RvdHlwZS5mcm9tUGl4ZWxzPWZ1bmN0aW9uKGUsdCl7aWYobnVsbD09ZSl0aHJvdyBuZXcgRXJyb3IoXCJwaXhlbHMgcGFzc2VkIHRvIHRmLmZyb21QaXhlbHMoKSBjYW4gbm90IGJlIG51bGxcIik7dmFyIG4scjtpZihFTlYuZ2V0KFwiSVNfTk9ERVwiKSYmbnVsbD09ZS5nZXRDb250ZXh0KXRocm93IG5ldyBFcnJvcihcIldoZW4gcnVubmluZyBpbiBub2RlLCBwaXhlbHMgbXVzdCBiZSBhbiBIVE1MQ2FudmFzRWxlbWVudCBsaWtlIHRoZSBvbmUgcmV0dXJuZWQgYnkgdGhlIGBjYW52YXNgIG5wbSBwYWNrYWdlXCIpO2lmKG51bGwhPWUuZ2V0Q29udGV4dCluPWUuZ2V0Q29udGV4dChcIjJkXCIpLmdldEltYWdlRGF0YSgwLDAsZS53aWR0aCxlLmhlaWdodCkuZGF0YTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBJbWFnZURhdGEpbj1lLmRhdGE7ZWxzZXtpZighKGUgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHxlIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCkpdGhyb3cgbmV3IEVycm9yKFwicGl4ZWxzIHBhc3NlZCB0byB0Zi5mcm9tUGl4ZWxzKCkgbXVzdCBiZSBlaXRoZXIgYW4gSFRNTFZpZGVvRWxlbWVudCwgSFRNTEltYWdlRWxlbWVudCwgSFRNTENhbnZhc0VsZW1lbnQgb3IgSW1hZ2VEYXRhLCBidXQgd2FzIFwiK2UuY29uc3RydWN0b3IubmFtZSk7aWYobnVsbD09dGhpcy5jYW52YXMpdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgcmVhZCBwaXhlbHMgZnJvbSBIVE1MSW1hZ2VFbGVtZW50IG91dHNpZGUgdGhlIGJyb3dzZXIuXCIpO3RoaXMuY2FudmFzLndpZHRoPWUud2lkdGgsdGhpcy5jYW52YXMuaGVpZ2h0PWUuaGVpZ2h0LHRoaXMuY2FudmFzLmdldENvbnRleHQoXCIyZFwiKS5kcmF3SW1hZ2UoZSwwLDAsZS53aWR0aCxlLmhlaWdodCksbj10aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIikuZ2V0SW1hZ2VEYXRhKDAsMCxlLndpZHRoLGUuaGVpZ2h0KS5kYXRhfWlmKDQ9PT10KXI9bmV3IEludDMyQXJyYXkobik7ZWxzZXt2YXIgbz1lLndpZHRoKmUuaGVpZ2h0O3I9bmV3IEludDMyQXJyYXkobyp0KTtmb3IodmFyIGE9MDthPG87YSsrKWZvcih2YXIgaT0wO2k8dDsrK2kpclthKnQraV09bls0KmEraV19cmV0dXJuIHRlbnNvcjNkKHIsW2UuaGVpZ2h0LGUud2lkdGgsdF0sXCJpbnQzMlwiKX0sZS5wcm90b3R5cGUucmVhZD1mdW5jdGlvbihlKXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKHQpe3JldHVyblsyLHRoaXMucmVhZFN5bmMoZSldfSl9KX0sZS5wcm90b3R5cGUucmVhZFN5bmM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5kYXRhLmdldChlKSxuPXQuZHR5cGUscj10LmNvbXBsZXhUZW5zb3JzO3JldHVyblwiY29tcGxleDY0XCI9PT1uP21lcmdlUmVhbEFuZEltYWdBcnJheXMoci5yZWFsLmRhdGFTeW5jKCksci5pbWFnLmRhdGFTeW5jKCkpOnRoaXMuZGF0YS5nZXQoZSkudmFsdWVzfSxlLnByb3RvdHlwZS5kaXNwb3NlRGF0YT1mdW5jdGlvbihlKXtpZih0aGlzLmRhdGEuaGFzKGUpKXt2YXIgdD10aGlzLmRhdGEuZ2V0KGUpLmNvbXBsZXhUZW5zb3JzO251bGwhPXQmJih0LnJlYWwuZGlzcG9zZSgpLHQuaW1hZy5kaXNwb3NlKCkpLHRoaXMuZGF0YS5kZWxldGUoZSl9fSxlLnByb3RvdHlwZS50aW1lPWZ1bmN0aW9uKGUpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24obil7cmV0dXJuIHQ9bm93KCksZSgpLFsyLHtrZXJuZWxNczpub3coKS10fV19KX0pfSxlLnByb3RvdHlwZS5tZW1vcnk9ZnVuY3Rpb24oKXtyZXR1cm57dW5yZWxpYWJsZTohMH19LGUucHJvdG90eXBlLmNvbXBsZXg9ZnVuY3Rpb24oZSx0KXt2YXIgbj1UZW5zb3IubWFrZShlLnNoYXBlLHt9LFwiY29tcGxleDY0XCIpO3JldHVybiB0aGlzLmRhdGEuZ2V0KG4uZGF0YUlkKS5jb21wbGV4VGVuc29ycz17cmVhbDpFTlYuZW5naW5lLmtlZXAoZS5jbG9uZSgpKSxpbWFnOkVOVi5lbmdpbmUua2VlcCh0LmNsb25lKCkpfSxufSxlLnByb3RvdHlwZS5yZWFsPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmRhdGEuZ2V0KGUuZGF0YUlkKS5jb21wbGV4VGVuc29ycy5yZWFsLmNsb25lKCl9LGUucHJvdG90eXBlLmltYWc9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZGF0YS5nZXQoZS5kYXRhSWQpLmNvbXBsZXhUZW5zb3JzLmltYWcuY2xvbmUoKX0sZS5wcm90b3R5cGUuYXNzZXJ0Tm90Q29tcGxleD1mdW5jdGlvbihlLHQpe0FycmF5LmlzQXJyYXkoZSl8fChlPVtlXSksZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe251bGwhPWUmJmFzc2VydChcImNvbXBsZXg2NFwiIT09ZS5kdHlwZSx0K1wiIGRvZXMgbm90IHN1cHBvcnQgY29tcGxleDY0IHRlbnNvcnMuXCIpfSl9LGUucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcInNsaWNlXCIpO2Zvcih2YXIgcj1idWZmZXIobixlLmR0eXBlKSxvPTA7bzxyLnNpemU7KytvKXt2YXIgYT1yLmluZGV4VG9Mb2MobyksaT1hLm1hcChmdW5jdGlvbihlLG4pe3JldHVybiBlK3Rbbl19KTtyLnNldC5hcHBseShyLFtlLmdldC5hcHBseShlLGkpXS5jb25jYXQoYSkpfXJldHVybiByLnRvVGVuc29yKCl9LGUucHJvdG90eXBlLnN0cmlkZWRTbGljZT1mdW5jdGlvbihlLHQsbixyLG8sYSxpLHMsdSl7dGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJzdHJpZGVkU2xpY2VcIik7dmFyIGw9Z2V0U3RyaWRlZFNsaWNlZEluZm8oZS5zaGFwZSx0LG4scixvLGEsaSxzLHUpLGM9bFswXSxwPWxbMV0sZD1sWzJdLGg9cC5maWx0ZXIoZnVuY3Rpb24oZSx0KXtyZXR1cm4tMT09PWQuaW5kZXhPZih0KX0pO2lmKGguc29tZShmdW5jdGlvbihlKXtyZXR1cm4gMD09PWV9KSlyZXR1cm4gdGVuc29yKFtdLGgpO2Zvcih2YXIgZj1idWZmZXIocCxlLmR0eXBlKSxtPTA7bTxmLnNpemU7bSsrKXtmb3IodmFyIGc9Zi5pbmRleFRvTG9jKG0pLHY9bmV3IEFycmF5KGcubGVuZ3RoKSx4PTA7eDx2Lmxlbmd0aDt4Kyspdlt4XT1nW3hdKnJbeF0rY1t4XTtmLnNldC5hcHBseShmLFtlLmdldC5hcHBseShlLHYpXS5jb25jYXQoZykpfXJldHVybiBmLnRvVGVuc29yKCkucmVzaGFwZShoKX0sZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbihlLHQpe3RoaXMuYXNzZXJ0Tm90Q29tcGxleChlLFwicmV2ZXJzZVwiKTtmb3IodmFyIG49YnVmZmVyKGUuc2hhcGUsZS5kdHlwZSkscj1lLmJ1ZmZlcigpLG89ZnVuY3Rpb24obyl7dmFyIGE9bi5pbmRleFRvTG9jKG8pLGk9YS5zbGljZSgpO3QuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gaVt0XT1lLnNoYXBlW3RdLTEtaVt0XX0pLG4uc2V0LmFwcGx5KG4sW3IuZ2V0LmFwcGx5KHIsaSldLmNvbmNhdChhKSl9LGE9MDthPG4uc2l6ZTthKyspbyhhKTtyZXR1cm4gbi50b1RlbnNvcigpfSxlLnByb3RvdHlwZS5jb25jYXQ9ZnVuY3Rpb24oZSx0KXt0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcImNvbmNhdFwiKTt2YXIgbj1lLm1hcChmdW5jdGlvbihlKXt2YXIgbj1zaXplRnJvbVNoYXBlKGUuc2hhcGUuc2xpY2UodCkpO3JldHVybiBlLmFzMkQoLTEsbil9KSxyPWNvbXB1dGVPdXRTaGFwZShuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5zaGFwZX0pLDEpLG89YnVmZmVyKHIsZVswXS5kdHlwZSkudmFsdWVzO2lmKDE9PT1uWzBdLnNoYXBlWzBdKXt2YXIgYT0wO24uZm9yRWFjaChmdW5jdGlvbihlKXtvLnNldChlLmRhdGFTeW5jKCksYSksYSs9ZS5zaXplfSl9ZWxzZXt2YXIgaT0wO24uZm9yRWFjaChmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5kYXRhU3luYygpLG49MCxhPTA7YTxlLnNoYXBlWzBdOysrYSlmb3IodmFyIHM9YSpyWzFdK2ksdT0wO3U8ZS5zaGFwZVsxXTsrK3Upb1tzK3VdPXRbbisrXTtpKz1lLnNoYXBlWzFdfSl9dmFyIHM9Y29tcHV0ZU91dFNoYXBlKGUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNoYXBlfSksdCk7cmV0dXJuIHRlbnNvcihvLHMsZVswXS5kdHlwZSl9LGUucHJvdG90eXBlLm5lZz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJuZWdcIiksdGhpcy5tdWx0aXBseShzY2FsYXIoLTEpLGUpfSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm5cImNvbXBsZXg2NFwiPT09ZS5kdHlwZXx8XCJjb21wbGV4NjRcIj09PXQuZHR5cGU/dGhpcy5icm9hZGNhc3RlZEJpbmFyeUNvbXBsZXhPcChlLmNhc3QoXCJjb21wbGV4NjRcIiksdC5jYXN0KFwiY29tcGxleDY0XCIpLGZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybntyZWFsOmUrbixpbWFnOnQrcn19KTp0aGlzLmJyb2FkY2FzdGVkQmluYXJ5T3AoZSx0LHVwY2FzdFR5cGUoZS5kdHlwZSx0LmR0eXBlKSxmdW5jdGlvbihlLHQpe3JldHVybiBlK3R9KX0sZS5wcm90b3R5cGUuYWRkTj1mdW5jdGlvbihlKXt0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcImFkZE5cIik7Zm9yKHZhciB0PWUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmRhdGFTeW5jKCl9KSxuPWJ1ZmZlcihlWzBdLnNoYXBlLGVbMF0uZHR5cGUpLHI9bi52YWx1ZXMsbz0wO288ZS5sZW5ndGg7bysrKWZvcih2YXIgYT10W29dLGk9MDtpPHIubGVuZ3RoO2krKylyW2ldKz1hW2ldO3JldHVybiBuLnRvVGVuc29yKCl9LGUucHJvdG90eXBlLnN1YnRyYWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuXCJjb21wbGV4NjRcIj09PWUuZHR5cGV8fFwiY29tcGxleDY0XCI9PT10LmR0eXBlP3RoaXMuYnJvYWRjYXN0ZWRCaW5hcnlDb21wbGV4T3AoZS5jYXN0KFwiY29tcGxleDY0XCIpLHQuY2FzdChcImNvbXBsZXg2NFwiKSxmdW5jdGlvbihlLHQsbixyKXtyZXR1cm57cmVhbDplLW4saW1hZzp0LXJ9fSk6dGhpcy5icm9hZGNhc3RlZEJpbmFyeU9wKGUsdCx1cGNhc3RUeXBlKGUuZHR5cGUsdC5kdHlwZSksZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS10fSl9LGUucHJvdG90eXBlLnBvdz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmFzc2VydE5vdENvbXBsZXgoW2UsdF0sXCJwb3dcIiksdGhpcy5icm9hZGNhc3RlZEJpbmFyeU9wKGUsdCxlLmR0eXBlLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIE1hdGgucG93KGUsdCl9KX0sZS5wcm90b3R5cGUuYmF0Y2hNYXRNdWw9ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5hc3NlcnROb3RDb21wbGV4KFtlLHRdLFwibWF0TXVsXCIpO2Zvcih2YXIgbz1uP2Uuc2hhcGVbMV06ZS5zaGFwZVsyXSxhPW4/ZS5zaGFwZVsyXTplLnNoYXBlWzFdLGk9cj90LnNoYXBlWzFdOnQuc2hhcGVbMl0scz1lLnNoYXBlWzBdLHU9ZS5kYXRhU3luYygpLGw9dC5kYXRhU3luYygpLGM9bj9bZS5zdHJpZGVzWzBdLDEsZS5zdHJpZGVzWzFdXTpbZS5zdHJpZGVzWzBdLGUuc3RyaWRlc1sxXSwxXSxwPWNbMF0sZD1jWzFdLGg9Y1syXSxmPXI/WzEsdC5zdHJpZGVzWzFdLHQuc3RyaWRlc1swXV06W3Quc3RyaWRlc1sxXSwxLHQuc3RyaWRlc1swXV0sbT1mWzBdLGc9ZlsxXSx2PWZbMl0seD1hKmkseT1uZXcgRmxvYXQzMkFycmF5KHMqeCksVD10aGlzLmJsb2NrU2l6ZSxTPTA7UzxzO1MrKylmb3IodmFyIGI9MDtiPGE7Yis9VClmb3IodmFyIEU9MDtFPGk7RSs9VClmb3IodmFyIHc9MDt3PG87dys9VClmb3IodmFyIEE9TWF0aC5taW4oYitULGEpLEM9TWF0aC5taW4oRStULGkpLF89TWF0aC5taW4odytULG8pLFI9YjtSPEE7UisrKWZvcih2YXIgTj1FO048QztOKyspe2Zvcih2YXIgaz0wLEk9dztJPF87SSsrKWsrPXVbUypwK1IqZCtJKmhdKmxbSSptK04qZytTKnZdO3lbUyp4KyhSKmkrTildKz1rfXJldHVybiB0ZW5zb3IzZCh5LFtzLGEsaV0pfSxlLnByb3RvdHlwZS5tdWx0aXBseT1mdW5jdGlvbihlLHQpe3JldHVyblwiY29tcGxleDY0XCI9PT1lLmR0eXBlfHxcImNvbXBsZXg2NFwiPT09dC5kdHlwZT90aGlzLmJyb2FkY2FzdGVkQmluYXJ5Q29tcGxleE9wKGUuY2FzdChcImNvbXBsZXg2NFwiKSx0LmNhc3QoXCJjb21wbGV4NjRcIiksZnVuY3Rpb24oZSx0LG4scil7cmV0dXJue3JlYWw6ZSpuLXQqcixpbWFnOmUqcit0Km59fSk6dGhpcy5icm9hZGNhc3RlZEJpbmFyeU9wKGUsdCx1cGNhc3RUeXBlKGUuZHR5cGUsdC5kdHlwZSksZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSp0fSl9LGUucHJvdG90eXBlLnJlYWxEaXZpZGU9ZnVuY3Rpb24oZSx0KXt0aGlzLmFzc2VydE5vdENvbXBsZXgoW2UsdF0sXCJyZWFsRGl2aWRlXCIpO3JldHVybiB0aGlzLmJyb2FkY2FzdGVkQmluYXJ5T3AoZSx0LFwiZmxvYXQzMlwiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUvdH0pfSxlLnByb3RvdHlwZS5mbG9vckRpdj1mdW5jdGlvbihlLHQpe3RoaXMuYXNzZXJ0Tm90Q29tcGxleChbZSx0XSxcImZsb29yRGl2XCIpO3JldHVybiB0aGlzLmJyb2FkY2FzdGVkQmluYXJ5T3AoZSx0LFwiaW50MzJcIixmdW5jdGlvbihlLHQpe3JldHVybiBNYXRoLmZsb29yKGUvdCl9KX0sZS5wcm90b3R5cGUuc3VtPWZ1bmN0aW9uKGUsdCl7dGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJzdW1cIiksYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoXCJzdW1cIix0LGUucmFuayk7Zm9yKHZhciBuPWNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoZS5zaGFwZSx0KSxyPW5bMF0sbz1uWzFdLGE9emVyb3Mocix1cGNhc3RUeXBlKGUuZHR5cGUsXCJpbnQzMlwiKSksaT1zaXplRnJvbVNoYXBlKG8pLHM9YS5kYXRhU3luYygpLHU9ZS5kYXRhU3luYygpLGw9MDtsPHMubGVuZ3RoOysrbCl7Zm9yKHZhciBjPWwqaSxwPTAsZD0wO2Q8aTsrK2QpcCs9dVtjK2RdO3NbbF09cH1yZXR1cm4gYX0sZS5wcm90b3R5cGUucHJvZD1mdW5jdGlvbihlLHQpe3RoaXMuYXNzZXJ0Tm90Q29tcGxleChlLFwic3VtXCIpO2Zvcih2YXIgbj1jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKGUuc2hhcGUsdCkscj1uWzBdLG89blsxXSxhPXplcm9zKHIsdXBjYXN0VHlwZShlLmR0eXBlLFwiaW50MzJcIikpLGk9c2l6ZUZyb21TaGFwZShvKSxzPWEuZGF0YVN5bmMoKSx1PWUuZGF0YVN5bmMoKSxsPTA7bDxzLmxlbmd0aDsrK2wpe2Zvcih2YXIgYz1sKmkscD0xLGQ9MDtkPGk7KytkKXAqPXVbYytkXTtzW2xdPXB9cmV0dXJuIGF9LGUucHJvdG90eXBlLnVuc29ydGVkU2VnbWVudFN1bT1mdW5jdGlvbihlLHQsbil7dGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJ1bnNvcnRlZFNlZ21lbnRTdW1cIik7Zm9yKHZhciByPVtdLG89ZS5yYW5rLXQucmFuayxhPTA7YTxvOysrYSl0PXQuZXhwYW5kRGltcyhhKzEpO2ZvcihhPTA7YTxuOysrYSl7dmFyIGk9c2NhbGFyKGEsXCJpbnQzMlwiKSxzPWVxdWFsKGksdCkuYXNUeXBlKFwiZmxvYXQzMlwiKS5tdWwoZSkuc3VtKDApO3IucHVzaChzKX1yZXR1cm4gc3RhY2socil9LGUucHJvdG90eXBlLmFyZ01pbj1mdW5jdGlvbihlLHQpe3RoaXMuYXNzZXJ0Tm90Q29tcGxleChlLFwiYXJnTWluXCIpO3ZhciBuPVt0XTthc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcyhcImFyZ01pblwiLG4sZS5yYW5rKTtmb3IodmFyIHI9Y29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhlLnNoYXBlLG4pLG89clswXSxhPXJbMV0saT16ZXJvcyhvLFwiaW50MzJcIikscz1zaXplRnJvbVNoYXBlKGEpLHU9aS5kYXRhU3luYygpLGw9ZS5kYXRhU3luYygpLGM9MDtjPHUubGVuZ3RoOysrYyl7Zm9yKHZhciBwPWMqcyxkPWxbcF0saD0wLGY9MDtmPHM7KytmKXt2YXIgbT1sW3ArZl07bTxkJiYoZD1tLGg9Zil9dVtjXT1ofXJldHVybiBpfSxlLnByb3RvdHlwZS5hcmdNYXg9ZnVuY3Rpb24oZSx0KXt0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcImFyZ01heFwiKTt2YXIgbj1bdF07YXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoXCJhcmdNYXhcIixuLGUucmFuayk7Zm9yKHZhciByPWNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoZS5zaGFwZSxuKSxvPXJbMF0sYT1yWzFdLGk9emVyb3MobyxcImludDMyXCIpLHM9c2l6ZUZyb21TaGFwZShhKSx1PWkuZGF0YVN5bmMoKSxsPWUuZGF0YVN5bmMoKSxjPTA7Yzx1Lmxlbmd0aDsrK2Mpe2Zvcih2YXIgcD1jKnMsZD1sW3BdLGg9MCxmPTA7ZjxzOysrZil7dmFyIG09bFtwK2ZdO20+ZCYmKGQ9bSxoPWYpfXVbY109aH1yZXR1cm4gaX0sZS5wcm90b3R5cGUuY3Vtc3VtPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKHRoaXMuYXNzZXJ0Tm90Q29tcGxleChlLFwiY3Vtc3VtXCIpLHQhPT1lLnJhbmstMSl0aHJvdyBuZXcgRXJyb3IoXCJiYWNrZW5kLmN1bXN1bSBpbiBDUFUgZXhwZWN0cyBhbiBpbm5lci1tb3N0IGF4aXM9XCIrKGUucmFuay0xKStcIiBidXQgZ290IGF4aXM9XCIrdCk7Zm9yKHZhciBvPXVwY2FzdFR5cGUoZS5kdHlwZSxcImludDMyXCIpLGE9emVyb3MoZS5zaGFwZSxvKSxpPWEuZGF0YVN5bmMoKSxzPWUuZGF0YVN5bmMoKSx1PWUuc2hhcGVbZS5yYW5rLTFdLGw9cj9mdW5jdGlvbihlLHQpe3JldHVybiBlK3UtdC0xfTpmdW5jdGlvbihlLHQpe3JldHVybiBlK3R9LGM9MDtjPHMubGVuZ3RoO2MrPXUpZm9yKHZhciBwPTA7cDx1O3ArKyl7dmFyIGQ9bChjLHApO2lmKDA9PT1wKWlbZF09bj8wOnNbZF07ZWxzZXt2YXIgaD1sKGMscC0xKTtpW2RdPW4/c1toXStpW2hdOnNbZF0raVtoXX19cmV0dXJuIGF9LGUucHJvdG90eXBlLmVxdWFsPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYXNzZXJ0Tm90Q29tcGxleChbZSx0XSxcImVxdWFsXCIpLHRoaXMuYnJvYWRjYXN0ZWRCaW5hcnlPcChlLHQsXCJib29sXCIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PXQ/MTowfSl9LGUucHJvdG90eXBlLm5vdEVxdWFsPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYXNzZXJ0Tm90Q29tcGxleChbZSx0XSxcIm5vdEVxdWFsXCIpLHRoaXMuYnJvYWRjYXN0ZWRCaW5hcnlPcChlLHQsXCJib29sXCIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSE9PXQ/MTowfSl9LGUucHJvdG90eXBlLmxlc3M9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5hc3NlcnROb3RDb21wbGV4KFtlLHRdLFwibGVzc1wiKSx0aGlzLmJyb2FkY2FzdGVkQmluYXJ5T3AoZSx0LFwiYm9vbFwiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU8dD8xOjB9KX0sZS5wcm90b3R5cGUubGVzc0VxdWFsPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYXNzZXJ0Tm90Q29tcGxleChbZSx0XSxcImxlc3NFcXVhbFwiKSx0aGlzLmJyb2FkY2FzdGVkQmluYXJ5T3AoZSx0LFwiYm9vbFwiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU8PXQ/MTowfSl9LGUucHJvdG90eXBlLmdyZWF0ZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5hc3NlcnROb3RDb21wbGV4KFtlLHRdLFwiZ3JlYXRlclwiKSx0aGlzLmJyb2FkY2FzdGVkQmluYXJ5T3AoZSx0LFwiYm9vbFwiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU+dD8xOjB9KX0sZS5wcm90b3R5cGUuZ3JlYXRlckVxdWFsPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYXNzZXJ0Tm90Q29tcGxleChbZSx0XSxcImdyZWF0ZXJFcXVhbFwiKSx0aGlzLmJyb2FkY2FzdGVkQmluYXJ5T3AoZSx0LFwiYm9vbFwiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU+PXQ/MTowfSl9LGUucHJvdG90eXBlLmxvZ2ljYWxOb3Q9ZnVuY3Rpb24oZSl7dGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJsb2dpY2FsTm90XCIpO2Zvcih2YXIgdD1lLmRhdGFTeW5jKCksbj1uZXcgSW50MzJBcnJheSh0Lmxlbmd0aCkscj0wO3I8dC5sZW5ndGg7KytyKW5bcl09dFtyXT8wOjE7cmV0dXJuIFRlbnNvci5tYWtlKGUuc2hhcGUse3ZhbHVlczpufSxcImJvb2xcIil9LGUucHJvdG90eXBlLmxvZ2ljYWxBbmQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5hc3NlcnROb3RDb21wbGV4KFtlLHRdLFwibG9naWNhbEFuZFwiKSx0aGlzLmJyb2FkY2FzdGVkQmluYXJ5T3AoZSx0LFwiYm9vbFwiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJnR9KX0sZS5wcm90b3R5cGUubG9naWNhbE9yPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYXNzZXJ0Tm90Q29tcGxleChbZSx0XSxcImxvZ2ljYWxPclwiKSx0aGlzLmJyb2FkY2FzdGVkQmluYXJ5T3AoZSx0LFwiYm9vbFwiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGV8fHR9KX0sZS5wcm90b3R5cGUuc2VsZWN0PWZ1bmN0aW9uKGUsdCxuKXt0aGlzLmFzc2VydE5vdENvbXBsZXgoW2UsdCxuXSxcInNlbGVjdFwiKTtmb3IodmFyIHI9ZS5kYXRhU3luYygpLG89dC5kYXRhU3luYygpLGE9bi5kYXRhU3luYygpLGk9emVyb3ModC5zaGFwZSx1cGNhc3RUeXBlKHQuZHR5cGUsbi5kdHlwZSkpLHM9aS5kYXRhU3luYygpLHU9MCxsPTA9PT1lLnJhbmt8fGUucmFuaz4xfHwxPT09dC5yYW5rPzE6dC5zaGFwZVsxXSxjPTA7YzxyLmxlbmd0aDtjKyspZm9yKHZhciBwPTA7cDxsO3ArKykxPT09cltjXT9zW3UrK109b1tjXTpzW3UrK109YVtjXTtyZXR1cm4gaX0sZS5wcm90b3R5cGUud2hlcmU9ZnVuY3Rpb24oZSl7dGhpcy5hc3NlcnROb3RDb21wbGV4KFtlXSxcIndoZXJlXCIpO3ZhciB0PWUuZGF0YVN5bmMoKTtyZXR1cm4gd2hlcmVJbXBsKGUuc2hhcGUsdCl9LGUucHJvdG90eXBlLnRvcGs9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcInRvcGtcIiksdG9wa0ltcGwoZS5kYXRhU3luYygpLGUuc2hhcGUsZS5kdHlwZSx0LG4pfSxlLnByb3RvdHlwZS5taW49ZnVuY3Rpb24oZSx0KXt0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcIm1pblwiKSxhc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcyhcIm1pblwiLHQsZS5yYW5rKTtmb3IodmFyIG49Y29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhlLnNoYXBlLHQpLHI9blswXSxvPW5bMV0sYT16ZXJvcyhyLGUuZHR5cGUpLGk9c2l6ZUZyb21TaGFwZShvKSxzPWEuZGF0YVN5bmMoKSx1PWUuZGF0YVN5bmMoKSxsPTA7bDxzLmxlbmd0aDsrK2wpe2Zvcih2YXIgYz1sKmkscD11W2NdLGQ9MDtkPGk7KytkKXt2YXIgaD11W2MrZF07aDxwJiYocD1oKX1zW2xdPXB9cmV0dXJuIGF9LGUucHJvdG90eXBlLm1pbmltdW09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5hc3NlcnROb3RDb21wbGV4KFtlLHRdLFwibWluaW11bVwiKSx0aGlzLmJyb2FkY2FzdGVkQmluYXJ5T3AoZSx0LGUuZHR5cGUsZnVuY3Rpb24oZSx0KXtyZXR1cm4gTWF0aC5taW4oZSx0KX0pfSxlLnByb3RvdHlwZS5tb2Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5hc3NlcnROb3RDb21wbGV4KFtlLHRdLFwibW9kXCIpLHRoaXMuYnJvYWRjYXN0ZWRCaW5hcnlPcChlLHQsZS5kdHlwZSxmdW5jdGlvbihlLHQpe3ZhciBuPWUldDtyZXR1cm4gZTwwJiZ0PDB8fGU+PTAmJnQ+PTA/bjoobit0KSV0fSl9LGUucHJvdG90eXBlLm1heD1mdW5jdGlvbihlLHQpe3RoaXMuYXNzZXJ0Tm90Q29tcGxleChlLFwibWF4XCIpLGFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKFwibWF4XCIsdCxlLnJhbmspO2Zvcih2YXIgbj1jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKGUuc2hhcGUsdCkscj1uWzBdLG89blsxXSxhPXplcm9zKHIsZS5kdHlwZSksaT1zaXplRnJvbVNoYXBlKG8pLHM9YS5kYXRhU3luYygpLHU9ZS5kYXRhU3luYygpLGw9MDtsPHMubGVuZ3RoOysrbCl7Zm9yKHZhciBjPWwqaSxwPXVbY10sZD0wO2Q8aTsrK2Qpe3ZhciBoPXVbYytkXTtoPnAmJihwPWgpfXNbbF09cH1yZXR1cm4gYX0sZS5wcm90b3R5cGUubWF4aW11bT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmFzc2VydE5vdENvbXBsZXgoW2UsdF0sXCJtYXhpbXVtXCIpLHRoaXMuYnJvYWRjYXN0ZWRCaW5hcnlPcChlLHQsZS5kdHlwZSxmdW5jdGlvbihlLHQpe3JldHVybiBNYXRoLm1heChlLHQpfSl9LGUucHJvdG90eXBlLmFsbD1mdW5jdGlvbihlLHQpe3RoaXMuYXNzZXJ0Tm90Q29tcGxleChlLFwiYWxsXCIpLGFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKFwiYWxsXCIsdCxlLnJhbmspO2Zvcih2YXIgbj1jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKGUuc2hhcGUsdCkscj1uWzBdLG89blsxXSxhPXplcm9zKHIsZS5kdHlwZSksaT1zaXplRnJvbVNoYXBlKG8pLHM9YS5kYXRhU3luYygpLHU9ZS5kYXRhU3luYygpLGw9MDtsPHMubGVuZ3RoOysrbCl7Zm9yKHZhciBjPWwqaSxwPXVbY10sZD0wO2Q8aTsrK2Qpe3ZhciBoPXVbYytkXTtwPXAmJmh9c1tsXT1wfXJldHVybiBhfSxlLnByb3RvdHlwZS5hbnk9ZnVuY3Rpb24oZSx0KXt0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcImFueVwiKSxhc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcyhcImFueVwiLHQsZS5yYW5rKTtmb3IodmFyIG49Y29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhlLnNoYXBlLHQpLHI9blswXSxvPW5bMV0sYT16ZXJvcyhyLGUuZHR5cGUpLGk9c2l6ZUZyb21TaGFwZShvKSxzPWEuZGF0YVN5bmMoKSx1PWUuZGF0YVN5bmMoKSxsPTA7bDxzLmxlbmd0aDsrK2wpe2Zvcih2YXIgYz1sKmkscD11W2NdLGQ9MDtkPGk7KytkKXt2YXIgaD11W2MrZF07cD1wfHxofXNbbF09cH1yZXR1cm4gYX0sZS5wcm90b3R5cGUuc3F1YXJlZERpZmZlcmVuY2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5hc3NlcnROb3RDb21wbGV4KFtlLHRdLFwic3F1YXJlZERpZmZlcmVuY2VcIiksdGhpcy5icm9hZGNhc3RlZEJpbmFyeU9wKGUsdCxlLmR0eXBlLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS10O3JldHVybiBuKm59KX0sZS5wcm90b3R5cGUuY2VpbD1mdW5jdGlvbihlKXt0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcImNlaWxcIik7Zm9yKHZhciB0PWUuZGF0YVN5bmMoKSxuPW5ldyBGbG9hdDMyQXJyYXkodC5sZW5ndGgpLHI9MDtyPHQubGVuZ3RoOysrciluW3JdPU1hdGguY2VpbCh0W3JdKTtyZXR1cm4gVGVuc29yLm1ha2UoZS5zaGFwZSx7dmFsdWVzOm59KX0sZS5wcm90b3R5cGUuZmxvb3I9ZnVuY3Rpb24oZSl7dGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJmbG9vclwiKTtmb3IodmFyIHQ9ZS5kYXRhU3luYygpLG49bmV3IEZsb2F0MzJBcnJheSh0Lmxlbmd0aCkscj0wO3I8dC5sZW5ndGg7KytyKW5bcl09TWF0aC5mbG9vcih0W3JdKTtyZXR1cm4gVGVuc29yLm1ha2UoZS5zaGFwZSx7dmFsdWVzOm59KX0sZS5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbihlKXt0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcInhcIik7Zm9yKHZhciB0PWUuZGF0YVN5bmMoKSxuPW5ldyBGbG9hdDMyQXJyYXkodC5sZW5ndGgpLHI9MDtyPHQubGVuZ3RoOysrcil0W3JdPDA/bltyXT0tMTp0W3JdPjA/bltyXT0xOm5bcl09MDtyZXR1cm4gVGVuc29yLm1ha2UoZS5zaGFwZSx7dmFsdWVzOm59KX0sZS5wcm90b3R5cGUucm91bmQ9ZnVuY3Rpb24oZSl7dGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJyb3VuZFwiKTtmb3IodmFyIHQ9ZS5kYXRhU3luYygpLG49bmV3IEZsb2F0MzJBcnJheSh0Lmxlbmd0aCkscj0wO3I8dC5sZW5ndGg7KytyKXt2YXIgbz1NYXRoLmZsb29yKHRbcl0pO3Rbcl0tbzwuNT9uW3JdPU1hdGguZmxvb3IodFtyXSk6dFtyXS1vPi41P25bcl09TWF0aC5jZWlsKHRbcl0pOm5bcl09byUyPT0wP286bysxfXJldHVybiBUZW5zb3IubWFrZShlLnNoYXBlLHt2YWx1ZXM6bn0pfSxlLnByb3RvdHlwZS5leHA9ZnVuY3Rpb24oZSl7dGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJleHBcIik7Zm9yKHZhciB0PWUuZGF0YVN5bmMoKSxuPW5ldyBGbG9hdDMyQXJyYXkodC5sZW5ndGgpLHI9MDtyPHQubGVuZ3RoOysrciluW3JdPU1hdGguZXhwKHRbcl0pO3JldHVybiBUZW5zb3IubWFrZShlLnNoYXBlLHt2YWx1ZXM6bn0pfSxlLnByb3RvdHlwZS5leHBtMT1mdW5jdGlvbihlKXt0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcImV4cG0xXCIpO2Zvcih2YXIgdD1lLmRhdGFTeW5jKCksbj1uZXcgRmxvYXQzMkFycmF5KHQubGVuZ3RoKSxyPTA7cjx0Lmxlbmd0aDsrK3IpbltyXT1NYXRoLmV4cG0xKHRbcl0pO3JldHVybiBUZW5zb3IubWFrZShlLnNoYXBlLHt2YWx1ZXM6bn0pfSxlLnByb3RvdHlwZS5sb2c9ZnVuY3Rpb24oZSl7dGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJsb2dcIik7Zm9yKHZhciB0PWUuZGF0YVN5bmMoKSxuPW5ldyBGbG9hdDMyQXJyYXkodC5sZW5ndGgpLHI9MDtyPHQubGVuZ3RoOysrcil7dmFyIG89dFtyXTtuW3JdPU1hdGgubG9nKG8pfXJldHVybiBUZW5zb3IubWFrZShlLnNoYXBlLHt2YWx1ZXM6bn0pfSxlLnByb3RvdHlwZS5sb2cxcD1mdW5jdGlvbihlKXt0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcImxvZzFwXCIpO2Zvcih2YXIgdD1lLmRhdGFTeW5jKCksbj1uZXcgRmxvYXQzMkFycmF5KHQubGVuZ3RoKSxyPTA7cjx0Lmxlbmd0aDsrK3Ipe3ZhciBvPXRbcl07bltyXT1NYXRoLmxvZzFwKG8pfXJldHVybiBUZW5zb3IubWFrZShlLnNoYXBlLHt2YWx1ZXM6bn0pfSxlLnByb3RvdHlwZS5zcXJ0PWZ1bmN0aW9uKGUpe3RoaXMuYXNzZXJ0Tm90Q29tcGxleChlLFwic3FydFwiKTtmb3IodmFyIHQ9ZS5kYXRhU3luYygpLG49bmV3IEZsb2F0MzJBcnJheSh0Lmxlbmd0aCkscj0wO3I8dC5sZW5ndGg7KytyKXt2YXIgbz10W3JdO25bcl09TWF0aC5zcXJ0KG8pfXJldHVybiBUZW5zb3IubWFrZShlLnNoYXBlLHt2YWx1ZXM6bn0pfSxlLnByb3RvdHlwZS5yc3FydD1mdW5jdGlvbihlKXt0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcInJzcXJ0XCIpO2Zvcih2YXIgdD1lLmRhdGFTeW5jKCksbj1uZXcgRmxvYXQzMkFycmF5KHQubGVuZ3RoKSxyPTA7cjx0Lmxlbmd0aDsrK3Ipe3ZhciBvPXRbcl07bltyXT0xL01hdGguc3FydChvKX1yZXR1cm4gVGVuc29yLm1ha2UoZS5zaGFwZSx7dmFsdWVzOm59KX0sZS5wcm90b3R5cGUuc3F1YXJlPWZ1bmN0aW9uKGUpe3RoaXMuYXNzZXJ0Tm90Q29tcGxleChlLFwic3F1YXJlXCIpO2Zvcih2YXIgdD1lLmRhdGFTeW5jKCksbj1uZXcgRmxvYXQzMkFycmF5KHQubGVuZ3RoKSxyPTA7cjx0Lmxlbmd0aDsrK3Ipe3ZhciBvPXRbcl07bltyXT1vKm99cmV0dXJuIFRlbnNvci5tYWtlKGUuc2hhcGUse3ZhbHVlczpufSl9LGUucHJvdG90eXBlLnJlY2lwcm9jYWw9ZnVuY3Rpb24oZSl7dGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJyZWNpcHJvY2FsXCIpO2Zvcih2YXIgdD1lLmRhdGFTeW5jKCksbj1uZXcgRmxvYXQzMkFycmF5KHQubGVuZ3RoKSxyPTA7cjx0Lmxlbmd0aDsrK3IpbltyXT0xL3Rbcl07cmV0dXJuIFRlbnNvci5tYWtlKGUuc2hhcGUse3ZhbHVlczpufSl9LGUucHJvdG90eXBlLnJlbHU9ZnVuY3Rpb24oZSl7dGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJyZWx1XCIpO2Zvcih2YXIgdD16ZXJvcyhlLnNoYXBlLGUuZHR5cGUpLG49dC5kYXRhU3luYygpLHI9ZS5kYXRhU3luYygpLG89MDtvPHIubGVuZ3RoOysrbyluW29dPU1hdGgubWF4KDAscltvXSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmVsdT1mdW5jdGlvbihlKXt0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcImVsdVwiKTtmb3IodmFyIHQ9bmV3IEZsb2F0MzJBcnJheShlLnNpemUpLG49ZS5kYXRhU3luYygpLHI9MDtyPG4ubGVuZ3RoOysrcil7dmFyIG89bltyXTt0W3JdPW8+PTA/bzpNYXRoLmV4cChvKS0xfXJldHVybiBUZW5zb3IubWFrZShlLnNoYXBlLHt2YWx1ZXM6dH0pfSxlLnByb3RvdHlwZS5lbHVEZXI9ZnVuY3Rpb24oZSx0KXt0aGlzLmFzc2VydE5vdENvbXBsZXgoW2UsdF0sXCJlbHVEZXJcIik7Zm9yKHZhciBuPW5ldyBGbG9hdDMyQXJyYXkodC5zaXplKSxyPXQuZGF0YVN5bmMoKSxvPWUuZGF0YVN5bmMoKSxhPTA7YTxyLmxlbmd0aDsrK2Epe3ZhciBpPXJbYV07blthXT1pPj0xP29bYV06b1thXSooaSsxKX1yZXR1cm4gVGVuc29yLm1ha2UodC5zaGFwZSx7dmFsdWVzOm59KX0sZS5wcm90b3R5cGUuc2VsdT1mdW5jdGlvbihlKXt0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcInNlbHVcIik7Zm9yKHZhciB0PVNFTFVfU0NBTEVBTFBIQSxuPVNFTFVfU0NBTEUscj1uZXcgRmxvYXQzMkFycmF5KGUuc2l6ZSksbz1lLmRhdGFTeW5jKCksYT0wO2E8by5sZW5ndGg7KythKXt2YXIgaT1vW2FdO3JbYV09aT49MD9uKmk6dCooTWF0aC5leHAoaSktMSl9cmV0dXJuIFRlbnNvci5tYWtlKGUuc2hhcGUse3ZhbHVlczpyfSl9LGUucHJvdG90eXBlLmNsaXA9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuYXNzZXJ0Tm90Q29tcGxleChlLFwiY2xpcFwiKTtmb3IodmFyIHI9bmV3IEZsb2F0MzJBcnJheShlLnNpemUpLG89ZS5kYXRhU3luYygpLGE9MDthPG8ubGVuZ3RoOysrYSl7dmFyIGk9b1thXTtyW2FdPWk+bj9uOmk8dD90Oml9cmV0dXJuIFRlbnNvci5tYWtlKGUuc2hhcGUse3ZhbHVlczpyfSl9LGUucHJvdG90eXBlLmFicz1mdW5jdGlvbihlKXt0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcImFic1wiKTtmb3IodmFyIHQ9bmV3IEZsb2F0MzJBcnJheShlLnNpemUpLG49ZS5kYXRhU3luYygpLHI9MDtyPG4ubGVuZ3RoOysrcil0W3JdPU1hdGguYWJzKG5bcl0pO3JldHVybiBUZW5zb3IubWFrZShlLnNoYXBlLHt2YWx1ZXM6dH0pfSxlLnByb3RvdHlwZS5pbnQ9ZnVuY3Rpb24oZSl7dGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJpbnRcIik7Zm9yKHZhciB0PW5ldyBJbnQzMkFycmF5KGUuc2l6ZSksbj1lLmRhdGFTeW5jKCkscj0wO3I8bi5sZW5ndGg7KytyKXRbcl09bltyXTtyZXR1cm4gVGVuc29yLm1ha2UoZS5zaGFwZSx7dmFsdWVzOnR9LFwiaW50MzJcIil9LGUucHJvdG90eXBlLnNpZ21vaWQ9ZnVuY3Rpb24oZSl7dGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJzaWdtb2lkXCIpO2Zvcih2YXIgdD1uZXcgRmxvYXQzMkFycmF5KGUuc2l6ZSksbj1lLmRhdGFTeW5jKCkscj0wO3I8bi5sZW5ndGg7KytyKXRbcl09MS8oMStNYXRoLmV4cCgtbltyXSkpO3JldHVybiBUZW5zb3IubWFrZShlLnNoYXBlLHt2YWx1ZXM6dH0pfSxlLnByb3RvdHlwZS5zb2Z0cGx1cz1mdW5jdGlvbihlKXt0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcInNvZnRwbHVzXCIpO2Zvcih2YXIgdD1NYXRoLmxvZygxLjE5MjA5Mjg5NTUwNzgxMjVlLTcpKzIsbj1uZXcgRmxvYXQzMkFycmF5KGUuc2l6ZSkscj1lLmRhdGFTeW5jKCksbz0wO288ci5sZW5ndGg7KytvKXt2YXIgYT1yW29dPi10LGk9cltvXTx0LHM9TWF0aC5leHAocltvXSksdT12b2lkIDA7dT1pP3M6YT9yW29dOk1hdGgubG9nKDErcyksbltvXT11fXJldHVybiBUZW5zb3IubWFrZShlLnNoYXBlLHt2YWx1ZXM6bn0pfSxlLnByb3RvdHlwZS5zaW49ZnVuY3Rpb24oZSl7dGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJzaW5cIik7Zm9yKHZhciB0PW5ldyBGbG9hdDMyQXJyYXkoZS5zaXplKSxuPWUuZGF0YVN5bmMoKSxyPTA7cjxuLmxlbmd0aDsrK3IpdFtyXT1NYXRoLnNpbihuW3JdKTtyZXR1cm4gVGVuc29yLm1ha2UoZS5zaGFwZSx7dmFsdWVzOnR9KX0sZS5wcm90b3R5cGUuY29zPWZ1bmN0aW9uKGUpe3RoaXMuYXNzZXJ0Tm90Q29tcGxleChlLFwiY29zXCIpO2Zvcih2YXIgdD1uZXcgRmxvYXQzMkFycmF5KGUuc2l6ZSksbj1lLmRhdGFTeW5jKCkscj0wO3I8bi5sZW5ndGg7KytyKXRbcl09TWF0aC5jb3MobltyXSk7cmV0dXJuIFRlbnNvci5tYWtlKGUuc2hhcGUse3ZhbHVlczp0fSl9LGUucHJvdG90eXBlLnRhbj1mdW5jdGlvbihlKXt0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcInRhblwiKTtmb3IodmFyIHQ9bmV3IEZsb2F0MzJBcnJheShlLnNpemUpLG49ZS5kYXRhU3luYygpLHI9MDtyPG4ubGVuZ3RoOysrcil0W3JdPU1hdGgudGFuKG5bcl0pO3JldHVybiBUZW5zb3IubWFrZShlLnNoYXBlLHt2YWx1ZXM6dH0pfSxlLnByb3RvdHlwZS5hc2luPWZ1bmN0aW9uKGUpe3RoaXMuYXNzZXJ0Tm90Q29tcGxleChlLFwiYXNpblwiKTtmb3IodmFyIHQ9bmV3IEZsb2F0MzJBcnJheShlLnNpemUpLG49ZS5kYXRhU3luYygpLHI9MDtyPG4ubGVuZ3RoOysrcil0W3JdPU1hdGguYXNpbihuW3JdKTtyZXR1cm4gVGVuc29yLm1ha2UoZS5zaGFwZSx7dmFsdWVzOnR9KX0sZS5wcm90b3R5cGUuYWNvcz1mdW5jdGlvbihlKXt0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcImFjb3NcIik7Zm9yKHZhciB0PW5ldyBGbG9hdDMyQXJyYXkoZS5zaXplKSxuPWUuZGF0YVN5bmMoKSxyPTA7cjxuLmxlbmd0aDsrK3IpdFtyXT1NYXRoLmFjb3MobltyXSk7cmV0dXJuIFRlbnNvci5tYWtlKGUuc2hhcGUse3ZhbHVlczp0fSl9LGUucHJvdG90eXBlLmF0YW49ZnVuY3Rpb24oZSl7dGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJhdGFuXCIpO2Zvcih2YXIgdD1uZXcgRmxvYXQzMkFycmF5KGUuc2l6ZSksbj1lLmRhdGFTeW5jKCkscj0wO3I8bi5sZW5ndGg7KytyKXRbcl09TWF0aC5hdGFuKG5bcl0pO3JldHVybiBUZW5zb3IubWFrZShlLnNoYXBlLHt2YWx1ZXM6dH0pfSxlLnByb3RvdHlwZS5hdGFuMj1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmFzc2VydE5vdENvbXBsZXgoW2UsdF0sXCJhdGFuMlwiKSx0aGlzLmJyb2FkY2FzdGVkQmluYXJ5T3AoZSx0LGUuZHR5cGUsZnVuY3Rpb24oZSx0KXtyZXR1cm4gTWF0aC5hdGFuMihlLHQpfSl9LGUucHJvdG90eXBlLnNpbmg9ZnVuY3Rpb24oZSl7dGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJzaW5oXCIpO2Zvcih2YXIgdD1uZXcgRmxvYXQzMkFycmF5KGUuc2l6ZSksbj1lLmRhdGFTeW5jKCkscj0wO3I8bi5sZW5ndGg7KytyKXRbcl09TWF0aC5zaW5oKG5bcl0pO3JldHVybiBUZW5zb3IubWFrZShlLnNoYXBlLHt2YWx1ZXM6dH0pfSxlLnByb3RvdHlwZS5jb3NoPWZ1bmN0aW9uKGUpe3RoaXMuYXNzZXJ0Tm90Q29tcGxleChlLFwiY29zaFwiKTtmb3IodmFyIHQ9bmV3IEZsb2F0MzJBcnJheShlLnNpemUpLG49ZS5kYXRhU3luYygpLHI9MDtyPG4ubGVuZ3RoOysrcil0W3JdPU1hdGguY29zaChuW3JdKTtyZXR1cm4gVGVuc29yLm1ha2UoZS5zaGFwZSx7dmFsdWVzOnR9KX0sZS5wcm90b3R5cGUudGFuaD1mdW5jdGlvbihlKXt0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcInRhbmhcIik7Zm9yKHZhciB0PW5ldyBGbG9hdDMyQXJyYXkoZS5zaXplKSxuPWUuZGF0YVN5bmMoKSxyPTA7cjxuLmxlbmd0aDsrK3IpdFtyXT10YW5oKG5bcl0pO3JldHVybiBUZW5zb3IubWFrZShlLnNoYXBlLHt2YWx1ZXM6dH0pfSxlLnByb3RvdHlwZS5hc2luaD1mdW5jdGlvbihlKXt0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcImFzaW5oXCIpO2Zvcih2YXIgdD1uZXcgRmxvYXQzMkFycmF5KGUuc2l6ZSksbj1lLmRhdGFTeW5jKCkscj0wO3I8bi5sZW5ndGg7KytyKXRbcl09TWF0aC5hc2luaChuW3JdKTtyZXR1cm4gVGVuc29yLm1ha2UoZS5zaGFwZSx7dmFsdWVzOnR9KX0sZS5wcm90b3R5cGUuYWNvc2g9ZnVuY3Rpb24oZSl7dGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJhY29zaFwiKTtmb3IodmFyIHQ9bmV3IEZsb2F0MzJBcnJheShlLnNpemUpLG49ZS5kYXRhU3luYygpLHI9MDtyPG4ubGVuZ3RoOysrcil0W3JdPU1hdGguYWNvc2gobltyXSk7cmV0dXJuIFRlbnNvci5tYWtlKGUuc2hhcGUse3ZhbHVlczp0fSl9LGUucHJvdG90eXBlLmF0YW5oPWZ1bmN0aW9uKGUpe3RoaXMuYXNzZXJ0Tm90Q29tcGxleChlLFwiYXRhbmhcIik7Zm9yKHZhciB0PW5ldyBGbG9hdDMyQXJyYXkoZS5zaXplKSxuPWUuZGF0YVN5bmMoKSxyPTA7cjxuLmxlbmd0aDsrK3IpdFtyXT1NYXRoLmF0YW5oKG5bcl0pO3JldHVybiBUZW5zb3IubWFrZShlLnNoYXBlLHt2YWx1ZXM6dH0pfSxlLnByb3RvdHlwZS5lcmY9ZnVuY3Rpb24oZSl7dGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJlcmZcIik7Zm9yKHZhciB0PW5ldyBGbG9hdDMyQXJyYXkoZS5zaXplKSxuPWUuZGF0YVN5bmMoKSxyPUVSRl9QLG89RVJGX0ExLGE9RVJGX0EyLGk9RVJGX0EzLHM9RVJGX0E0LHU9RVJGX0E1LGw9MDtsPG4ubGVuZ3RoOysrbCl7dmFyIGM9bltsXSxwPTEvKDErcipjKTt0W2xdPTEtKCgoKHUqcCtzKSpwK2kpKnArYSkqcCtvKSpwKk1hdGguZXhwKC1jKmMpfXJldHVybiBUZW5zb3IubWFrZShlLnNoYXBlLHt2YWx1ZXM6dH0pfSxlLnByb3RvdHlwZS5zdGVwPWZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09dCYmKHQ9MCksdGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJzdGVwXCIpO2Zvcih2YXIgbj1uZXcgRmxvYXQzMkFycmF5KGUuc2l6ZSkscj1lLmRhdGFTeW5jKCksbz0wO288ci5sZW5ndGg7KytvKXt2YXIgYT1yW29dO2lzTmFOKGEpP25bb109TmFOOm5bb109YT4wPzE6dH1yZXR1cm4gVGVuc29yLm1ha2UoZS5zaGFwZSx7dmFsdWVzOm59KX0sZS5wcm90b3R5cGUuY29udjJkPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLmFzc2VydE5vdENvbXBsZXgoW2UsdF0sXCJjb252MmRcIik7Zm9yKHZhciByPW4uZmlsdGVySGVpZ2h0LG89bi5maWx0ZXJXaWR0aCxhPW4uZGlsYXRpb25IZWlnaHQsaT1uLmRpbGF0aW9uV2lkdGgscz1uLnBhZEluZm8ubGVmdCx1PW4ucGFkSW5mby50b3AsbD1idWZmZXIobi5vdXRTaGFwZSxlLmR0eXBlKSxjPWUuZGF0YVN5bmMoKSxwPXQuZGF0YVN5bmMoKSxkPWwudmFsdWVzLGg9MDtoPG4uYmF0Y2hTaXplOysraClmb3IodmFyIGY9aCplLnN0cmlkZXNbMF0sbT1oKmwuc3RyaWRlc1swXSxnPTA7ZzxuLm91dEhlaWdodDsrK2cpZm9yKHZhciB2PW0rZypsLnN0cmlkZXNbMV0seD1nKm4uc3RyaWRlSGVpZ2h0LXMseT0wO3k8cjt5Kyspe3ZhciBUPXgreSphO2lmKCEoVDwwfHxUPj1uLmluSGVpZ2h0KSlmb3IodmFyIFM9eSp0LnN0cmlkZXNbMF0sYj1mK1QqZS5zdHJpZGVzWzFdLEU9MDtFPG4ub3V0V2lkdGg7KytFKWZvcih2YXIgdz12K0Uqbi5vdXRDaGFubmVscyxBPUUqbi5zdHJpZGVXaWR0aC11LEM9MDtDPG87QysrKXt2YXIgXz1BK0MqaTtpZighKF88MHx8Xz49bi5pbldpZHRoKSlmb3IodmFyIFI9UytDKnQuc3RyaWRlc1sxXSxOPWIrXypuLmluQ2hhbm5lbHMsaz1SLEk9MDtJPG4uaW5DaGFubmVsczsrK0kpe2Zvcih2YXIgRD1jW04rSV0sTT0wO008bi5vdXRDaGFubmVsczsrK00pZFt3K01dKz1EKnBbaytNXTtrKz1uLm91dENoYW5uZWxzfX19cmV0dXJuIGwudG9UZW5zb3IoKX0sZS5wcm90b3R5cGUuY29udjJkRGVySW5wdXQ9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuYXNzZXJ0Tm90Q29tcGxleChbZSx0XSxcImNvbnYyZERlcklucHV0XCIpO2Zvcih2YXIgcj1idWZmZXIobi5pblNoYXBlLFwiZmxvYXQzMlwiKSxvPXIudmFsdWVzLGE9ci5zdHJpZGVzLGk9YVswXSxzPWFbMV0sdT1hWzJdLGw9ZS5kYXRhU3luYygpLGM9ZS5zdHJpZGVzLHA9Y1swXSxkPWNbMV0saD1jWzJdLGY9dC5kYXRhU3luYygpLG09dC5zdHJpZGVzLGc9bVswXSx2PW1bMV0seD1tWzJdLHk9bi5iYXRjaFNpemUsVD1uLmZpbHRlckhlaWdodCxTPW4uZmlsdGVyV2lkdGgsYj1uLmluQ2hhbm5lbHMsRT1uLmluSGVpZ2h0LHc9bi5pbldpZHRoLEE9bi5vdXRDaGFubmVscyxDPW4ub3V0SGVpZ2h0LF89bi5vdXRXaWR0aCxSPW4uc3RyaWRlSGVpZ2h0LE49bi5zdHJpZGVXaWR0aCxrPVQtMS1uLnBhZEluZm8udG9wLEk9Uy0xLW4ucGFkSW5mby5sZWZ0LEQ9MDtEPHk7KytEKWZvcih2YXIgTT0wO008YjsrK00pZm9yKHZhciBPPTA7TzxFOysrTylmb3IodmFyIFA9Ty1rLEY9TWF0aC5tYXgoMCxNYXRoLmNlaWwoUC9SKSksTD1NYXRoLm1pbihDLChUK1ApL1IpLEI9MDtCPHc7KytCKXtmb3IodmFyIFU9Qi1JLHo9TWF0aC5tYXgoMCxNYXRoLmNlaWwoVS9OKSksVj1NYXRoLm1pbihfLChTK1UpL04pLEc9MCxIPUY7SDxMOysrSClmb3IodmFyIFc9SCpSLVAscT16O3E8VjsrK3EpZm9yKHZhciAkPXAqRCtkKkgraCpxLFg9ZyooVC0xLVcpK3YqKFMtMS0ocSpOLVUpKSt4Kk0sSz0wO0s8QTsrK0spe0crPWxbJCtLXSpmW1grS119b1tpKkQrcypPK3UqQitNXT1HfXJldHVybiByLnRvVGVuc29yKCl9LGUucHJvdG90eXBlLmNvbnYyZERlckZpbHRlcj1mdW5jdGlvbihlLHQsbil7dGhpcy5hc3NlcnROb3RDb21wbGV4KFtlLHRdLFwiY29udjJkRGVyRmlsdGVyXCIpO2Zvcih2YXIgcj1uLnN0cmlkZUhlaWdodCxvPW4uc3RyaWRlV2lkdGgsYT1uLmZpbHRlckhlaWdodCxpPW4uZmlsdGVyV2lkdGgscz1idWZmZXIobi5maWx0ZXJTaGFwZSxcImZsb2F0MzJcIiksdT1uLnBhZEluZm8ubGVmdCxsPW4ucGFkSW5mby50b3AsYz0wO2M8YTsrK2MpZm9yKHZhciBwPU1hdGgubWF4KDAsTWF0aC5jZWlsKChsLWMpL3IpKSxkPU1hdGgubWluKG4ub3V0SGVpZ2h0LChuLmluSGVpZ2h0K2wtYykvciksaD0wO2g8aTsrK2gpZm9yKHZhciBmPU1hdGgubWF4KDAsTWF0aC5jZWlsKCh1LWgpL28pKSxtPU1hdGgubWluKG4ub3V0V2lkdGgsKG4uaW5XaWR0aCt1LWgpL28pLGc9MDtnPG4uaW5DaGFubmVsczsrK2cpZm9yKHZhciB2PTA7djxuLm91dENoYW5uZWxzOysrdil7Zm9yKHZhciB4PTAseT0wO3k8bi5iYXRjaFNpemU7Kyt5KWZvcih2YXIgVD1wO1Q8ZDsrK1QpZm9yKHZhciBTPWMrVCpyLWwsYj1mO2I8bTsrK2Ipe3ZhciBFPWgrYipvLXU7eCs9ZS5nZXQoeSxTLEUsZykqdC5nZXQoeSxULGIsdil9cy5zZXQoeCxjLGgsZyx2KX1yZXR1cm4gcy50b1RlbnNvcigpfSxlLnByb3RvdHlwZS5kZXB0aHdpc2VDb252MkQ9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuYXNzZXJ0Tm90Q29tcGxleChbZSx0XSxcImRlcHRod2lzZUNvbnYyRFwiKTtmb3IodmFyIHI9bi5maWx0ZXJIZWlnaHQsbz1uLmZpbHRlcldpZHRoLGE9bi5kaWxhdGlvbkhlaWdodCxpPW4uZGlsYXRpb25XaWR0aCxzPW4ucGFkSW5mby5sZWZ0LHU9bi5wYWRJbmZvLnRvcCxsPW4ub3V0Q2hhbm5lbHMvbi5pbkNoYW5uZWxzLGM9YnVmZmVyKG4ub3V0U2hhcGUsZS5kdHlwZSkscD1lLmRhdGFTeW5jKCksZD10LmRhdGFTeW5jKCksaD1jLnZhbHVlcyxmPTA7ZjxuLmJhdGNoU2l6ZTsrK2YpZm9yKHZhciBtPWYqZS5zdHJpZGVzWzBdLGc9ZipjLnN0cmlkZXNbMF0sdj0wO3Y8bi5vdXRIZWlnaHQ7Kyt2KWZvcih2YXIgeD1nK3YqYy5zdHJpZGVzWzFdLHk9dipuLnN0cmlkZUhlaWdodC1zLFQ9MDtUPHI7KytUKXt2YXIgUz15K1QqYTtpZighKFM8MHx8Uz49bi5pbkhlaWdodCkpZm9yKHZhciBiPVQqdC5zdHJpZGVzWzBdLEU9bStTKmUuc3RyaWRlc1sxXSx3PTA7dzxuLm91dFdpZHRoOysrdylmb3IodmFyIEE9eCt3KmMuc3RyaWRlc1syXSxDPXcqbi5zdHJpZGVXaWR0aC11LF89MDtfPG87KytfKXt2YXIgUj1DK18qaTtpZighKFI8MHx8Uj49bi5pbldpZHRoKSlmb3IodmFyIE49YitfKnQuc3RyaWRlc1sxXSxrPUUrUipuLmluQ2hhbm5lbHMsST1BLEQ9TixNPTA7TTxuLmluQ2hhbm5lbHM7KytNKXtmb3IodmFyIE89cFtrK01dLFA9MDtQPGw7KytQKWhbSStQXSs9TypkW0QrUF07SSs9bCxEKz1sfX19cmV0dXJuIGMudG9UZW5zb3IoKX0sZS5wcm90b3R5cGUuZGVwdGh3aXNlQ29udjJERGVySW5wdXQ9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuYXNzZXJ0Tm90Q29tcGxleChbZSx0XSxcImRlcHRod2lzZUNvbnYyRERlcklucHV0XCIpO2Zvcih2YXIgcj1idWZmZXIobi5pblNoYXBlLFwiZmxvYXQzMlwiKSxvPXIudmFsdWVzLGE9ci5zdHJpZGVzLGk9YVswXSxzPWFbMV0sdT1hWzJdLGw9ZS5kYXRhU3luYygpLGM9ZS5zdHJpZGVzLHA9Y1swXSxkPWNbMV0saD1jWzJdLGY9dC5kYXRhU3luYygpLG09dC5zdHJpZGVzLGc9bVswXSx2PW1bMV0seD1tWzJdLHk9bi5iYXRjaFNpemUsVD1uLmZpbHRlckhlaWdodCxTPW4uZmlsdGVyV2lkdGgsYj1uLmluQ2hhbm5lbHMsRT1uLmluSGVpZ2h0LHc9bi5pbldpZHRoLEE9bi5vdXRDaGFubmVscyxDPW4ub3V0SGVpZ2h0LF89bi5vdXRXaWR0aCxSPW4uc3RyaWRlSGVpZ2h0LE49bi5zdHJpZGVXaWR0aCxrPVQtMS1uLnBhZEluZm8udG9wLEk9Uy0xLW4ucGFkSW5mby5sZWZ0LEQ9QS9iLE09MDtNPHk7KytNKWZvcih2YXIgTz0wO088YjsrK08pZm9yKHZhciBQPTA7UDxFOysrUClmb3IodmFyIEY9UC1rLEw9TWF0aC5tYXgoMCxNYXRoLmNlaWwoRi9SKSksQj1NYXRoLm1pbihDLChUK0YpL1IpLFU9MDtVPHc7KytVKXtmb3IodmFyIHo9VS1JLFY9TWF0aC5tYXgoMCxNYXRoLmNlaWwoei9OKSksRz1NYXRoLm1pbihfLChTK3opL04pLEg9MCxXPUw7VzxCOysrVylmb3IodmFyIHE9VypSLUYsJD1WOyQ8RzsrKyQpZm9yKHZhciBYPXAqTStkKlcraCokLEs9ZyooVC0xLXEpK3YqKFMtMS0oJCpOLXopKSt4Kk8saj0wO2o8RDsrK2ope0grPWxbWCsoTypEK2opXSpmW0sral19b1tpKk0rcypQK3UqVStPXT1IfXJldHVybiByLnRvVGVuc29yKCl9LGUucHJvdG90eXBlLmRlcHRod2lzZUNvbnYyRERlckZpbHRlcj1mdW5jdGlvbihlLHQsbil7dGhpcy5hc3NlcnROb3RDb21wbGV4KFtlLHRdLFwiZGVwdGh3aXNlQ29udjJERGVyRmlsdGVyXCIpO2Zvcih2YXIgcj1uLnN0cmlkZUhlaWdodCxvPW4uc3RyaWRlV2lkdGgsYT1uLmZpbHRlckhlaWdodCxpPW4uZmlsdGVyV2lkdGgscz1idWZmZXIobi5maWx0ZXJTaGFwZSxcImZsb2F0MzJcIiksdT1uLnBhZEluZm8ubGVmdCxsPW4ucGFkSW5mby50b3AsYz1uLm91dENoYW5uZWxzL24uaW5DaGFubmVscyxwPTA7cDxhOysrcClmb3IodmFyIGQ9TWF0aC5tYXgoMCxNYXRoLmNlaWwoKGwtcCkvcikpLGg9TWF0aC5taW4obi5vdXRIZWlnaHQsKG4uaW5IZWlnaHQrbC1wKS9yKSxmPTA7ZjxpOysrZilmb3IodmFyIG09TWF0aC5tYXgoMCxNYXRoLmNlaWwoKHUtZikvbykpLGc9TWF0aC5taW4obi5vdXRXaWR0aCwobi5pbldpZHRoK3UtZikvbyksdj0wO3Y8bi5vdXRDaGFubmVsczsrK3Ype2Zvcih2YXIgeD1NYXRoLnRydW5jKHYvYykseT12JWMsVD0wLFM9MDtTPG4uYmF0Y2hTaXplOysrUylmb3IodmFyIGI9ZDtiPGg7KytiKWZvcih2YXIgRT1wK2Iqci1sLHc9bTt3PGc7Kyt3KXt2YXIgQT1mK3cqby11O1QrPWUuZ2V0KFMsRSxBLHgpKnQuZ2V0KFMsYix3LHYpfXMuc2V0KFQscCxmLHgseSl9cmV0dXJuIHMudG9UZW5zb3IoKX0sZS5wcm90b3R5cGUudGlsZT1mdW5jdGlvbihlLHQpe3RoaXMuYXNzZXJ0Tm90Q29tcGxleChlLFwidGlsZVwiKTtmb3IodmFyIG49bmV3IEFycmF5KGUucmFuaykscj0wO3I8bi5sZW5ndGg7cisrKW5bcl09ZS5zaGFwZVtyXSp0W3JdO3ZhciBvPWJ1ZmZlcihuLGUuZHR5cGUpLGE9ZS5idWZmZXIoKTtmb3Iocj0wO3I8by52YWx1ZXMubGVuZ3RoOysrcil7Zm9yKHZhciBpPW8uaW5kZXhUb0xvYyhyKSxzPW5ldyBBcnJheShlLnJhbmspLHU9MDt1PHMubGVuZ3RoO3UrKylzW3VdPWlbdV0lZS5zaGFwZVt1XTt2YXIgbD1hLmxvY1RvSW5kZXgocyk7by52YWx1ZXNbcl09YS52YWx1ZXNbbF19cmV0dXJuIG8udG9UZW5zb3IoKX0sZS5wcm90b3R5cGUucGFkPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcInBhZFwiKTt2YXIgcj10Lm1hcChmdW5jdGlvbih0LG4pe3JldHVybiB0WzBdK2Uuc2hhcGVbbl0rdFsxXX0pLG89dC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF19KSxhPWUuYnVmZmVyKCksaT1idWZmZXIocixlLmR0eXBlKTswIT09biYmaS52YWx1ZXMuZmlsbChuKTtmb3IodmFyIHM9MDtzPGUuc2l6ZTtzKyspe3ZhciB1PWEuaW5kZXhUb0xvYyhzKSxsPXUubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUrb1t0XX0pO2kuc2V0LmFwcGx5KGksW2UuZ2V0LmFwcGx5KGUsdSldLmNvbmNhdChsKSl9cmV0dXJuIGkudG9UZW5zb3IoKX0sZS5wcm90b3R5cGUudHJhbnNwb3NlPWZ1bmN0aW9uKGUsdCl7dGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJ0cmFuc3Bvc2VcIik7Zm9yKHZhciBuPW5ldyBBcnJheShlLnJhbmspLHI9MDtyPG4ubGVuZ3RoO3IrKyluW3JdPWUuc2hhcGVbdFtyXV07dmFyIG89ZS5kYXRhU3luYygpLGE9YnVmZmVyKG4sZS5kdHlwZSksaT1lLmJ1ZmZlcigpO2ZvcihyPTA7cjxlLnNpemU7KytyKXtmb3IodmFyIHM9aS5pbmRleFRvTG9jKHIpLHU9bmV3IEFycmF5KHMubGVuZ3RoKSxsPTA7bDx1Lmxlbmd0aDtsKyspdVtsXT1zW3RbbF1dO3ZhciBjPWEubG9jVG9JbmRleCh1KTthLnZhbHVlc1tjXT1vW3JdfXJldHVybiBhLnRvVGVuc29yKCl9LGUucHJvdG90eXBlLmdhdGhlcj1mdW5jdGlvbihlLHQsbil7dGhpcy5hc3NlcnROb3RDb21wbGV4KFtlLHRdLFwiZ2F0aGVyXCIpO3ZhciByPWUuc2hhcGUuc2xpY2UoKSxvPXQuZGF0YVN5bmMoKTtyW25dPW8ubGVuZ3RoO2Zvcih2YXIgYT1idWZmZXIocixlLmR0eXBlKSxpPWUuYnVmZmVyKCkscz0wO3M8YS5zaXplOysrcyl7dmFyIHU9YS5pbmRleFRvTG9jKHMpLGw9dS5zbGljZSgpO2xbbl09b1t1W25dXTt2YXIgYz1pLmxvY1RvSW5kZXgobCk7YS52YWx1ZXNbc109aS52YWx1ZXNbY119cmV0dXJuIGEudG9UZW5zb3IoKX0sZS5wcm90b3R5cGUuYmF0Y2hUb1NwYWNlTkQ9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuYXNzZXJ0Tm90Q29tcGxleChbZV0sXCJiYXRjaFRvU3BhY2VORFwiKTt2YXIgcj10LnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlKnR9KSxvPWdldFJlc2hhcGVkKGUuc2hhcGUsdCxyKSxhPWdldFBlcm11dGVkKG8ubGVuZ3RoLHQubGVuZ3RoKSxpPWdldFJlc2hhcGVkUGVybXV0ZWQoZS5zaGFwZSx0LHIpLHM9Z2V0U2xpY2VCZWdpbkNvb3JkcyhuLHQubGVuZ3RoKSx1PWdldFNsaWNlU2l6ZShpLG4sdC5sZW5ndGgpO3JldHVybiBlLnJlc2hhcGUobykudHJhbnNwb3NlKGEpLnJlc2hhcGUoaSkuc2xpY2Uocyx1KX0sZS5wcm90b3R5cGUuc3BhY2VUb0JhdGNoTkQ9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuYXNzZXJ0Tm90Q29tcGxleChbZV0sXCJzcGFjZVRvQmF0Y2hORFwiKTt2YXIgcj10LnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlKnR9KSxvPVtbMCwwXV07by5wdXNoLmFwcGx5KG8sbik7Zm9yKHZhciBhPTErdC5sZW5ndGg7YTxlLnNoYXBlLmxlbmd0aDsrK2Epby5wdXNoKFswLDBdKTt2YXIgaT1lLnBhZChvKSxzPWdldFJlc2hhcGVkKGkuc2hhcGUsdCxyLCExKSx1PWdldFBlcm11dGVkKHMubGVuZ3RoLHQubGVuZ3RoLCExKSxsPWdldFJlc2hhcGVkUGVybXV0ZWQoaS5zaGFwZSx0LHIsITEpO3JldHVybiBpLnJlc2hhcGUocykudHJhbnNwb3NlKHUpLnJlc2hhcGUobCl9LGUucHJvdG90eXBlLnBvb2w9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuYXNzZXJ0Tm90Q29tcGxleChlLFwicG9vbFwiKTtmb3IodmFyIHI9dC5zdHJpZGVIZWlnaHQsbz10LnN0cmlkZVdpZHRoLGE9dC5maWx0ZXJIZWlnaHQsaT10LmZpbHRlcldpZHRoLHM9YnVmZmVyKHQub3V0U2hhcGUsXCJmbG9hdDMyXCIpLHU9dC5wYWRJbmZvLnRvcCxsPXQucGFkSW5mby5sZWZ0LGM9XCJtYXhcIj09PW4/TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZOk51bWJlci5QT1NJVElWRV9JTkZJTklUWSxwPTA7cDx0LmJhdGNoU2l6ZTsrK3ApZm9yKHZhciBkPTA7ZDx0LmluQ2hhbm5lbHM7KytkKWZvcih2YXIgaD0wO2g8dC5vdXRIZWlnaHQ7KytoKWZvcih2YXIgZj1oKnItdSxtPU1hdGgubWF4KDAsZiksZz1NYXRoLm1pbih0LmluSGVpZ2h0LGErZiksdj0wO3Y8dC5vdXRXaWR0aDsrK3Ype2Zvcih2YXIgeD12Km8tbCx5PU1hdGgubWF4KDAseCksVD1NYXRoLm1pbih0LmluV2lkdGgsaSt4KSxTPWMsYj0wLEU9MCx3PW07dzxnOysrdyl7Zm9yKHZhciBBPXk7QTxUOysrQSl7dmFyIEM9ZS5nZXQocCx3LEEsZCk7XCJtYXhcIj09PW4mJkM+Uz9TPUM6XCJhdmdcIj09PW4mJihiKz1DLEUrKyl9aWYoaXNOYU4oUykpYnJlYWt9cy5zZXQoXCJhdmdcIj09PW4/Yi9FOlMscCxoLHYsZCl9cmV0dXJuIHMudG9UZW5zb3IoKX0sZS5wcm90b3R5cGUubWF4UG9vbD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnBvb2woZSx0LFwibWF4XCIpfSxlLnByb3RvdHlwZS5tYXhQb29sUG9zaXRpb25zPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWJ1ZmZlcih0Lm91dFNoYXBlLFwiaW50MzJcIikscj10LnN0cmlkZUhlaWdodCxvPXQuc3RyaWRlV2lkdGgsYT10LmZpbHRlckhlaWdodCxpPXQuZmlsdGVyV2lkdGgscz10LnBhZEluZm8udG9wLHU9dC5wYWRJbmZvLmxlZnQsbD0wO2w8dC5iYXRjaFNpemU7KytsKWZvcih2YXIgYz0wO2M8dC5pbkNoYW5uZWxzOysrYylmb3IodmFyIHA9MDtwPHQub3V0SGVpZ2h0OysrcClmb3IodmFyIGQ9cCpyLXMsaD1NYXRoLm1heCgwLGQpLGY9TWF0aC5taW4odC5pbkhlaWdodCxhK2QpLG09MDttPHQub3V0V2lkdGg7KyttKXtmb3IodmFyIGc9bSpvLXUsdj1NYXRoLm1heCgwLGcpLHg9TWF0aC5taW4odC5pbldpZHRoLGkrZykseT1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksVD0tMSxTPWg7UzxmOysrUylmb3IodmFyIGI9Uy1kLEU9djtFPHg7KytFKXt2YXIgdz1FLWcsQT1lLmdldChsLFMsRSxjKTtBPnkmJih5PUEsVD1iKmkrdyl9bi5zZXQoVCxsLHAsbSxjKX1yZXR1cm4gbi50b1RlbnNvcigpfSxlLnByb3RvdHlwZS5tYXhQb29sQmFja3Byb3A9ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5hc3NlcnROb3RDb21wbGV4KFt0LG5dLFwibWF4UG9vbEJhY2twcm9wXCIpO2Zvcih2YXIgbz10aGlzLm1heFBvb2xQb3NpdGlvbnModCxyKSxhPXIuc3RyaWRlSGVpZ2h0LGk9ci5zdHJpZGVXaWR0aCxzPXIuZmlsdGVySGVpZ2h0LHU9ci5maWx0ZXJXaWR0aCxsPXUtMS1yLnBhZEluZm8ubGVmdCxjPXMtMS1yLnBhZEluZm8udG9wLHA9YnVmZmVyKHQuc2hhcGUsXCJmbG9hdDMyXCIpLGQ9MDtkPHIuYmF0Y2hTaXplOysrZClmb3IodmFyIGg9MDtoPHIuaW5DaGFubmVsczsrK2gpZm9yKHZhciBmPTA7ZjxyLmluSGVpZ2h0OysrZilmb3IodmFyIG09MDttPHIuaW5XaWR0aDsrK20pe2Zvcih2YXIgZz1mLWMsdj1tLWwseD0wLHk9MDt5PHM7Kyt5KXt2YXIgVD0oZyt5KS9hO2lmKCEoVDwwfHxUPj1yLm91dEhlaWdodHx8TWF0aC5mbG9vcihUKSE9PVQpKWZvcih2YXIgUz0wO1M8dTsrK1Mpe3ZhciBiPSh2K1MpL2k7aWYoIShiPDB8fGI+PXIub3V0V2lkdGh8fE1hdGguZmxvb3IoYikhPT1iKSl7dmFyIEU9cyp1LTEtby5nZXQoZCxULGIsaCk9PT15KnUrUz8xOjA7aWYoMCE9PUUpeCs9ZS5nZXQoZCxULGIsaCkqRX19fXAuc2V0KHgsZCxmLG0saCl9cmV0dXJuIHAudG9UZW5zb3IoKX0sZS5wcm90b3R5cGUuYXZnUG9vbEJhY2twcm9wPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLmFzc2VydE5vdENvbXBsZXgoW2UsdF0sXCJhdmdQb29sQmFja3Byb3BcIik7Zm9yKHZhciByPW4uc3RyaWRlSGVpZ2h0LG89bi5zdHJpZGVXaWR0aCxhPW4uZmlsdGVySGVpZ2h0LGk9bi5maWx0ZXJXaWR0aCxzPWktMS1uLnBhZEluZm8ubGVmdCx1PWEtMS1uLnBhZEluZm8udG9wLGw9YnVmZmVyKHQuc2hhcGUsXCJmbG9hdDMyXCIpLGM9MS8oYSppKSxwPTA7cDxuLmJhdGNoU2l6ZTsrK3ApZm9yKHZhciBkPTA7ZDxuLmluQ2hhbm5lbHM7KytkKWZvcih2YXIgaD0wO2g8bi5pbkhlaWdodDsrK2gpZm9yKHZhciBmPTA7ZjxuLmluV2lkdGg7KytmKXtmb3IodmFyIG09aC11LGc9Zi1zLHY9MCx4PTA7eDxhOysreCl7dmFyIHk9KG0reCkvcjtpZighKHk8MHx8eT49bi5vdXRIZWlnaHR8fE1hdGguZmxvb3IoeSkhPT15KSlmb3IodmFyIFQ9MDtUPGk7KytUKXt2YXIgUz0oZytUKS9vO2lmKCEoUzwwfHxTPj1uLm91dFdpZHRofHxNYXRoLmZsb29yKFMpIT09Uykpdis9ZS5nZXQocCx5LFMsZCl9fWwuc2V0KHYqYyxwLGgsZixkKX1yZXR1cm4gbC50b1RlbnNvcigpfSxlLnByb3RvdHlwZS5jYXN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGNhc3RUZW5zb3IoZSx0LHRoaXMpfSxlLnByb3RvdHlwZS5yZXNoYXBlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHJlc2hhcGVUZW5zb3IoZSx0KX0sZS5wcm90b3R5cGUuYXZnUG9vbD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcImF2Z1Bvb2xcIiksdGhpcy5wb29sKGUsdCxcImF2Z1wiKS50b0Zsb2F0KCl9LGUucHJvdG90eXBlLnJlc2l6ZUJpbGluZWFyPWZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMuYXNzZXJ0Tm90Q29tcGxleChlLFwicmVzaXplQmlsaW5lYXJcIik7Zm9yKHZhciBvPWUuc2hhcGUsYT1vWzBdLGk9b1sxXSxzPW9bMl0sdT1vWzNdLGw9ZS5kYXRhU3luYygpLGM9bmV3IEZsb2F0MzJBcnJheShzaXplRnJvbVNoYXBlKFthLHQsbix1XSkpLHA9W3ImJnQ+MT9pLTE6aSxyJiZuPjE/cy0xOnNdLGQ9W3ImJnQ+MT90LTE6dCxyJiZuPjE/bi0xOm5dLGg9MCxmPXBbMF0vZFswXSxtPXBbMV0vZFsxXSxnPTA7ZzxhO2crKylmb3IodmFyIHY9MDt2PHQ7disrKWZvcih2YXIgeD1mKnYseT1NYXRoLmZsb29yKHgpLFQ9eC15LFM9TWF0aC5taW4oaS0xLE1hdGguY2VpbCh4KSksYj1nKmUuc3RyaWRlc1swXSt5KmUuc3RyaWRlc1sxXSxFPWcqZS5zdHJpZGVzWzBdK1MqZS5zdHJpZGVzWzFdLHc9MDt3PG47dysrKWZvcih2YXIgQT1tKncsQz1NYXRoLmZsb29yKEEpLF89QS1DLFI9TWF0aC5taW4ocy0xLE1hdGguY2VpbChBKSksTj1iK0MqZS5zdHJpZGVzWzJdLGs9RStDKmUuc3RyaWRlc1syXSxJPWIrICtSKmUuc3RyaWRlc1syXSxEPUUrUiplLnN0cmlkZXNbMl0sTT0wO008dTtNKyspe3ZhciBPPWxbTitNXSxQPWxbaytNXSxGPU8rKGxbSStNXS1PKSpfLEw9RisoUCsobFtEK01dLVApKl8tRikqVDtjW2grK109TH1yZXR1cm4gdGVuc29yKGMsW2EsdCxuLHVdKX0sZS5wcm90b3R5cGUucmVzaXplQmlsaW5lYXJCYWNrcHJvcD1mdW5jdGlvbihlLHQsbil7dGhpcy5hc3NlcnROb3RDb21wbGV4KFtlLHRdLFwicmVzaXplQmlsaW5lYXJCYWNrcHJvcFwiKTtmb3IodmFyIHI9dC5zaGFwZSxvPXJbMF0sYT1yWzFdLGk9clsyXSxzPXJbM10sdT1lLnNoYXBlLGw9dVsxXSxjPXVbMl0scD1uZXcgRmxvYXQzMkFycmF5KG8qYSppKnMpLGQ9W24mJmw+MT9hLTE6YSxuJiZjPjE/aS0xOmldLGg9W24mJmw+MT9sLTE6bCxuJiZjPjE/Yy0xOmNdLGY9ZFswXS9oWzBdLG09ZFsxXS9oWzFdLGc9ZS5kYXRhU3luYygpLHY9MCx4PTA7eDxvO3grKylmb3IodmFyIHk9eCp0LnN0cmlkZXNbMF0sVD0wO1Q8bDtUKyspZm9yKHZhciBTPVQqZixiPU1hdGguZmxvb3IoUyksRT1NYXRoLm1pbihNYXRoLmNlaWwoUyksYS0xKSx3PXkrYip0LnN0cmlkZXNbMV0sQT15K0UqdC5zdHJpZGVzWzFdLEM9Uy1iLF89MS1DLFI9MDtSPGM7UisrKWZvcih2YXIgTj1SKm0saz1NYXRoLmZsb29yKE4pLEk9TWF0aC5taW4oTWF0aC5jZWlsKE4pLGktMSksRD1OLWssTT0xLUQsTz13K2sqdC5zdHJpZGVzWzJdLFA9dytJKnQuc3RyaWRlc1syXSxGPUErayp0LnN0cmlkZXNbMl0sTD1BK0kqdC5zdHJpZGVzWzJdLEI9XypNLFU9XypELHo9QypNLFY9QypELEc9MDtHPHM7RysrKXt2YXIgSD1nW3YrK107cFtPK0ddKz1IKkIscFtQK0ddKz1IKlUscFtGK0ddKz1IKnoscFtMK0ddKz1IKlZ9cmV0dXJuIHRlbnNvcjRkKHAsW28saSxhLHNdLHQuZHR5cGUpfSxlLnByb3RvdHlwZS5yZXNpemVOZWFyZXN0TmVpZ2hib3I9ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJyZXNpemVOZWFyZXN0TmVpZ2hib3JcIik7Zm9yKHZhciBvPWUuc2hhcGUsYT1vWzBdLGk9b1sxXSxzPW9bMl0sdT1vWzNdLGw9YnVmZmVyKFthLHQsbix1XSxlLmR0eXBlKSxjPVtyJiZ0PjE/aS0xOmksciYmbj4xP3MtMTpzXSxwPVtyJiZ0PjE/dC0xOnQsciYmbj4xP24tMTpuXSxkPTA7ZDxhO2QrKylmb3IodmFyIGg9MDtoPHQ7aCsrKWZvcih2YXIgZj0wO2Y8bjtmKyspZm9yKHZhciBtPTA7bTx1O20rKyl7dmFyIGc9Y1swXSpoL3BbMF0sdj1jWzFdKmYvcFsxXSx4PU1hdGgubWluKGktMSxyP01hdGgucm91bmQoZyk6TWF0aC5mbG9vcihnKSkseT1NYXRoLm1pbihzLTEscj9NYXRoLnJvdW5kKHYpOk1hdGguZmxvb3IodikpLFQ9ZS5nZXQoZCx4LHksbSk7bC5zZXQoVCxkLGgsZixtKX1yZXR1cm4gbC50b1RlbnNvcigpfSxlLnByb3RvdHlwZS5yZXNpemVOZWFyZXN0TmVpZ2hib3JCYWNrcHJvcD1mdW5jdGlvbihlLHQsbil7dGhpcy5hc3NlcnROb3RDb21wbGV4KFtlLHRdLFwicmVzaXplTmVhcmVzdE5laWdoYm9yQmFja3Byb3BcIik7Zm9yKHZhciByPXQuc2hhcGUsbz1yWzBdLGE9clsxXSxpPXJbMl0scz1yWzNdLHU9ZS5zaGFwZSxsPXVbMV0sYz11WzJdLHA9YnVmZmVyKFtvLGEsaSxzXSx0LmR0eXBlKSxkPVtuJiZsPjE/YS0xOmEsbiYmYz4xP2ktMTppXSxoPVtuJiZsPjE/bC0xOmwsbiYmYz4xP2MtMTpjXSxmPTEvKGRbMF0vaFswXSksbT0xLyhkWzFdL2hbMV0pLGc9MipNYXRoLmNlaWwoZikrMix2PTIqTWF0aC5jZWlsKG0pKzIseD0wO3g8bzt4KyspZm9yKHZhciB5PTA7eTxhO3krKylmb3IodmFyIFQ9MDtUPGk7VCsrKWZvcih2YXIgUz1NYXRoLmZsb29yKHkqZiksYj1NYXRoLmZsb29yKFMtZy8yKSxFPU1hdGguZmxvb3IoVCptKSx3PU1hdGguZmxvb3IoRS12LzIpLEE9MDtBPHM7QSsrKXtmb3IodmFyIEM9MCxfPTA7XzxnO18rKyl7dmFyIFI9XytiO2lmKCEoUjwwfHxSPj1sKSlmb3IodmFyIE49MDtOPHY7TisrKXt2YXIgaz1OK3c7aWYoIShrPDB8fGs+PWMpKXt2YXIgST1kWzBdKihSL2hbMF0pLEQ9ZFsxXSooay9oWzFdKSxNPU1hdGgubWluKGEtMSxuP01hdGgucm91bmQoSSk6TWF0aC5mbG9vcihJKSksTz1NYXRoLm1pbihpLTEsbj9NYXRoLnJvdW5kKEQpOk1hdGguZmxvb3IoRCkpO3k9PT1NJiZUPT09TyYmKEMrPWUuZ2V0KHgsUixrLEEpKX19fXAuc2V0KEMseCx5LFQsQSl9cmV0dXJuIHAudG9UZW5zb3IoKX0sZS5wcm90b3R5cGUuYmF0Y2hOb3JtYWxpemF0aW9uPWZ1bmN0aW9uKGUsdCxuLHIsbyxhKXt0aGlzLmFzc2VydE5vdENvbXBsZXgoW2UsdCxuLG8sYV0sXCJiYXRjaE5vcm1hbGl6YXRpb25cIik7Zm9yKHZhciBpPWUuZGF0YVN5bmMoKSxzPXQuZGF0YVN5bmMoKSx1PW4uZGF0YVN5bmMoKSxsPW8/by5kYXRhU3luYygpOm5ldyBGbG9hdDMyQXJyYXkoWzFdKSxjPWE/YS5kYXRhU3luYygpOm5ldyBGbG9hdDMyQXJyYXkoWzBdKSxwPW5ldyBGbG9hdDMyQXJyYXkoaS5sZW5ndGgpLGQ9Yy5sZW5ndGgsaD1sLmxlbmd0aCxmPXUubGVuZ3RoLG09cy5sZW5ndGgsZz0wLHY9MCx4PTAseT0wLFQ9MDtUPGkubGVuZ3RoOysrVClwW1RdPWNbZysrXSsoaVtUXS1zW3YrK10pKmxbeCsrXS9NYXRoLnNxcnQodVt5KytdK3IpLGc+PWQmJihnPTApLHY+PW0mJih2PTApLHg+PWgmJih4PTApLHk+PWYmJih5PTApO3JldHVybiB0ZW5zb3I0ZChwLGUuc2hhcGUpfSxlLnByb3RvdHlwZS5sb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbjREPWZ1bmN0aW9uKGUsdCxuLHIsbyl7dGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbjREXCIpO3ZhciBhPWUuc2hhcGVbM10saT1hLTEscz1lLmRhdGFTeW5jKCksdT1zaXplRnJvbVNoYXBlKGUuc2hhcGUpLGw9bmV3IEZsb2F0MzJBcnJheSh1KTtmdW5jdGlvbiBjKGUpe2Zvcih2YXIgbj1lJWEscj1lLW4rTWF0aC5tYXgoMCxuLXQpLG89ZS1uK01hdGgubWluKG4rdCxpKSx1PTA7cjw9bztyKyspe3ZhciBsPXNbcl07dSs9bCpsfXJldHVybiB1fWZvcih2YXIgcD0wO3A8dTtwKyspe3ZhciBkPWMocCksaD1zW3BdKk1hdGgucG93KG4rcipkLC1vKTtsW3BdPWh9cmV0dXJuIHRlbnNvcjRkKGwsZS5zaGFwZSl9LGUucHJvdG90eXBlLkxSTkdyYWQ9ZnVuY3Rpb24oZSx0LG4scixvLGEsaSl7dGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJMUk5HcmFkXCIpO2Zvcih2YXIgcz1lLnNoYXBlWzNdLHU9ZS5kYXRhU3luYygpLGw9dC5kYXRhU3luYygpLGM9bi5kYXRhU3luYygpLHA9bmV3IEZsb2F0MzJBcnJheShzaXplRnJvbVNoYXBlKGUuc2hhcGUpKSxkPXNpemVGcm9tU2hhcGUoZS5zaGFwZSksaD0wO2g8ZDtoKyspe2Zvcih2YXIgZj1oJXMsbT1oLWYrTWF0aC5tYXgoMCxmLXIpLGc9aC1mK01hdGgubWluKHMsZityKzEpLHY9MCx4PW07eDxnO3grKyl2Kz1NYXRoLnBvdyhsW3hdLDIpO3Y9YSp2K287Zm9yKHg9bTt4PGc7eCsrKXt2YXIgeT0tMiphKmkqbFt4XSpjW2hdL3Y7aD09PXgmJih5Kz1NYXRoLnBvdyh2LC1pKSkseSo9dVtoXSxwW3hdKz15fX1yZXR1cm4gdGVuc29yNGQocCxlLnNoYXBlKX0sZS5wcm90b3R5cGUubXVsdGlub21pYWw9ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJtdWx0aW5vbWlhbFwiKTtmb3IodmFyIG89dD9lOnNvZnRtYXgoZSksYT1vLnNoYXBlWzBdLGk9by5zaGFwZVsxXSxzPXplcm9zKFthLG5dLFwiaW50MzJcIiksdT1zLmRhdGFTeW5jKCksbD1vLmRhdGFTeW5jKCksYz0wO2M8YTsrK2Mpe3ZhciBwPWMqaSxkPW5ldyBGbG9hdDMyQXJyYXkoaS0xKTtkWzBdPWxbcF07Zm9yKHZhciBoPTE7aDxkLmxlbmd0aDsrK2gpZFtoXT1kW2gtMV0rbFtwK2hdO2Zvcih2YXIgZj1zZWVkcmFuZG9tXzEoci50b1N0cmluZygpKSxtPWMqbixnPTA7ZzxuOysrZyl7dmFyIHY9ZigpO3VbbStnXT1kLmxlbmd0aDtmb3IodmFyIHg9MDt4PGQubGVuZ3RoO3grKylpZih2PGRbeF0pe3VbbStnXT14O2JyZWFrfX19cmV0dXJuIHN9LGUucHJvdG90eXBlLm9uZUhvdD1mdW5jdGlvbihlLHQsbixyKXt0aGlzLmFzc2VydE5vdENvbXBsZXgoZSxcIm9uZUhvdFwiKTt2YXIgbz1uZXcgRmxvYXQzMkFycmF5KGUuc2l6ZSp0KTtvLmZpbGwocik7Zm9yKHZhciBhPTA7YTxlLnNpemU7KythKWUuZ2V0KGEpPj0wJiZlLmdldChhKTx0JiYob1thKnQrZS5nZXQoYSldPW4pO3JldHVybiB0ZW5zb3IyZChvLFtlLnNpemUsdF0sXCJpbnQzMlwiKX0sZS5wcm90b3R5cGUubm9uTWF4U3VwcHJlc3Npb249ZnVuY3Rpb24oZSx0LG4scixvKXtyZXR1cm4gdGhpcy5hc3NlcnROb3RDb21wbGV4KGUsXCJub25NYXhTdXBwcmVzc2lvblwiKSxub25NYXhTdXBwcmVzc2lvbkltcGwoZS5kYXRhU3luYygpLHQuZGF0YVN5bmMoKSxuLHIsbyl9LGUucHJvdG90eXBlLmZmdD1mdW5jdGlvbihlKXthc3NlcnQoZS5zaGFwZS5sZW5ndGg+MCxcImlucHV0IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcmFuay5cIik7dmFyIHQ9ZS5zaGFwZVswXTtpZih0aGlzLmlzX2V4cG9uZW50X29mXzIodCkpcmV0dXJuIHRoaXMuZmZ0UmFkaXgyKGUsdCk7dmFyIG49ZS5kYXRhU3luYygpLHI9c3BsaXRSZWFsQW5kSW1hZ0FycmF5cyh0aGlzLmZvdXJpZXJUcmFuc2Zvcm1CeU1hdG11bChuLHQpKTtyZXR1cm4gY29tcGxleChyLnJlYWwsci5pbWFnKS5hczFEKCl9LGUucHJvdG90eXBlLmlzX2V4cG9uZW50X29mXzI9ZnVuY3Rpb24oZSl7cmV0dXJuIDA9PShlJmUtMSl9LGUucHJvdG90eXBlLmZmdFJhZGl4Mj1mdW5jdGlvbihlLHQpe2lmKDE9PT10KXJldHVybiBlO3ZhciBuPWUuZGF0YVN5bmMoKSxyPXQvMixvPWNvbXBsZXhXaXRoRXZlbkluZGV4KG4pLGE9Y29tcGxleChvLnJlYWwsby5pbWFnKS5hczFEKCksaT1jb21wbGV4V2l0aE9kZEluZGV4KG4pLHM9Y29tcGxleChpLnJlYWwsaS5pbWFnKS5hczFEKCk7YT10aGlzLmZmdFJhZGl4MihhLHIpLHM9dGhpcy5mZnRSYWRpeDIocyxyKTt2YXIgdT1leHBvbmVudHModCksbD1jb21wbGV4KHUucmVhbCx1LmltYWcpLm11bChzKSxjPWEuYWRkKGwpLHA9YS5zdWIobCksZD1yZWFsKGMpLmNvbmNhdChyZWFsKHApKSxoPWltYWcoYykuY29uY2F0KGltYWcocCkpO3JldHVybiBjb21wbGV4KGQsaCkuYXMxRCgpfSxlLnByb3RvdHlwZS5mb3VyaWVyVHJhbnNmb3JtQnlNYXRtdWw9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49bmV3IEZsb2F0MzJBcnJheSgyKnQpLHI9MDtyPHQ7cisrKXtmb3IodmFyIG89MCxhPTAsaT0wO2k8dDtpKyspe3ZhciBzPWV4cG9uZW50KHIqaSx0KSx1PWdldENvbXBsZXhXaXRoSW5kZXgoZSxpKTtvKz11LnJlYWwqcy5yZWFsLXUuaW1hZypzLmltYWcsYSs9dS5yZWFsKnMuaW1hZyt1LmltYWcqcy5yZWFsfWFzc2lnblRvVHlwZWRBcnJheShuLG8sYSxyKX1yZXR1cm4gbn0sZS5wcm90b3R5cGUuZGVwdGhUb1NwYWNlPWZ1bmN0aW9uKGUsdCxuKXthc3NlcnQoXCJOSFdDXCI9PT1uLFwiT25seSBOSFdDIGRhdGFGb3JtYXQgc3VwcG9ydGVkIG9uIENQVSBmb3IgZGVwdGhUb1NwYWNlLiBHb3QgXCIrbiksYXNzZXJ0KHQ+MSxcImJsb2NrU2l6ZSBzaG91bGQgYmUgPiAxIGZvciBkZXB0aFRvU3BhY2UsIGJ1dCB3YXM6IFwiK3QpO2Zvcih2YXIgcj1lLnNoYXBlWzBdLG89ZS5zaGFwZVsxXSxhPWUuc2hhcGVbMl0saT1lLnNoYXBlWzNdLHM9byp0LHU9YSp0LGw9aS8odCp0KSxjPWUuZGF0YVN5bmMoKSxwPW5ldyBGbG9hdDMyQXJyYXkocipzKnUqbCksZD0wLGg9MDtoPHI7KytoKWZvcih2YXIgZj0wO2Y8czsrK2YpZm9yKHZhciBtPU1hdGguZmxvb3IoZi90KSxnPWYldCx2PTA7djx1Oysrdilmb3IodmFyIHg9TWF0aC5mbG9vcih2L3QpLHk9KGcqdCt2JXQpKmwsVD0wO1Q8bDsrK1Qpe3ZhciBTPVQreStpKih4K2EqKG0rbypoKSk7cFtkKytdPWNbU119cmV0dXJuIHRlbnNvcjRkKHAsW3Iscyx1LGxdKX0sZS5wcm90b3R5cGUuYnJvYWRjYXN0ZWRCaW5hcnlPcD1mdW5jdGlvbihlLHQsbixyKXt2YXIgbz1hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShlLnNoYXBlLHQuc2hhcGUpLGE9YnVmZmVyKG8sbiksaT1lLmRhdGFTeW5jKCkscz10LmRhdGFTeW5jKCksdT1nZXRCcm9hZGNhc3REaW1zKGUuc2hhcGUsbyksbD1nZXRCcm9hZGNhc3REaW1zKHQuc2hhcGUsbyksYz1hLnZhbHVlcztpZih1Lmxlbmd0aCtsLmxlbmd0aD09PTApZm9yKHZhciBwPTA7cDxjLmxlbmd0aDsrK3ApY1twXT1yKGlbcCVpLmxlbmd0aF0sc1twJXMubGVuZ3RoXSk7ZWxzZXt2YXIgZD1lLmJ1ZmZlcigpLGg9dC5idWZmZXIoKSxmPWZ1bmN0aW9uKG4pe3ZhciBvPWEuaW5kZXhUb0xvYyhuKSxwPW8uc2xpY2UoLWUucmFuayk7dS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBwW2VdPTB9KTt2YXIgZj1kLmxvY1RvSW5kZXgocCksbT1vLnNsaWNlKC10LnJhbmspO2wuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gbVtlXT0wfSk7dmFyIGc9aC5sb2NUb0luZGV4KG0pO2Nbbl09cihpW2ZdLHNbZ10pfTtmb3IocD0wO3A8Yy5sZW5ndGg7KytwKWYocCl9cmV0dXJuIGEudG9UZW5zb3IoKX0sZS5wcm90b3R5cGUuYnJvYWRjYXN0ZWRCaW5hcnlDb21wbGV4T3A9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKGUuc2hhcGUsdC5zaGFwZSksbz1idWZmZXIocixcImZsb2F0MzJcIiksYT1idWZmZXIocixcImZsb2F0MzJcIiksaT1lLmRhdGFTeW5jKCkscz10LmRhdGFTeW5jKCksdT1nZXRCcm9hZGNhc3REaW1zKGUuc2hhcGUsciksbD1nZXRCcm9hZGNhc3REaW1zKHQuc2hhcGUsciksYz1vLnZhbHVlcyxwPWEudmFsdWVzO2lmKHUubGVuZ3RoK2wubGVuZ3RoPT09MClmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGg9ZCVpLmxlbmd0aCxmPWQlcy5sZW5ndGgsbT1uKGlbMipoXSxpWzIqaCsxXSxzWzIqZl0sc1syKmYrMV0pO2NbZF09bS5yZWFsLHBbZF09bS5pbWFnfWVsc2V7dmFyIGc9dGhpcy5kYXRhLmdldChlLmRhdGFJZCkuY29tcGxleFRlbnNvcnMucmVhbC5idWZmZXIoKSx2PXRoaXMuZGF0YS5nZXQodC5kYXRhSWQpLmNvbXBsZXhUZW5zb3JzLnJlYWwuYnVmZmVyKCkseD1mdW5jdGlvbihyKXt2YXIgYT1vLmluZGV4VG9Mb2MociksZD1hLnNsaWNlKC1lLnJhbmspO3UuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gZFtlXT0wfSk7dmFyIGg9Zy5sb2NUb0luZGV4KGQpLGY9YS5zbGljZSgtdC5yYW5rKTtsLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGZbZV09MH0pO3ZhciBtPXYubG9jVG9JbmRleChmKSx4PW4oaVsyKmhdLGlbMipoKzFdLHNbMiptXSxzWzIqbSsxXSk7Y1tyXT14LnJlYWwscFtyXT14LmltYWd9O2ZvcihkPTA7ZDxjLmxlbmd0aDtkKyspeChkKX1yZXR1cm4gdGhpcy5jb21wbGV4KG8udG9UZW5zb3IoKSxhLnRvVGVuc29yKCkpfSxlLnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHNwbGl0KGUsdCxuKX0sZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe30sZS5wcm90b3R5cGUuZmxvYXRQcmVjaXNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMzJ9LGUucHJvdG90eXBlLmNyb3BBbmRSZXNpemU9ZnVuY3Rpb24oZSx0LG4scixvLGEpe2Zvcih2YXIgaT1lLnNoYXBlLHM9aVswXSx1PWlbMV0sbD1pWzJdLGM9aVszXSxwPXQuc2hhcGVbMF0sZD1yWzBdLGg9clsxXSxmPWJ1ZmZlcihbcCxkLGgsY10pLG09dC5kYXRhU3luYygpLGc9bi5kYXRhU3luYygpLHY9ZS5kYXRhU3luYygpLHg9ZS5zdHJpZGVzLHk9Zi5zdHJpZGVzLFQ9MDtUPHA7VCsrKXt2YXIgUz00KlQsYj1tW1NdLEU9bVtTKzFdLHc9bVtTKzJdLEE9bVtTKzNdLEM9Z1tUXTtpZighKEM+PXMpKWZvcih2YXIgXz1kPjE/KHctYikqKHUtMSkvKGQtMSk6MCxSPWg+MT8oQS1FKSoobC0xKS8oaC0xKTowLE49MDtOPGQ7TisrKXt2YXIgaz1kPjE/YioodS0xKStOKl86LjUqKGIrdykqKHUtMSk7aWYoazwwfHxrPnUtMSlmb3IodmFyIEk9MDtJPGg7SSsrKWZvcih2YXIgRD0wO0Q8YztEKyspe3ZhciBNPUQrSSp5WzJdK04qeVsxXStUKnlbMF07Zi52YWx1ZXNbTV09YX1lbHNlIGlmKFwiYmlsaW5lYXJcIj09PW8pe3ZhciBPPU1hdGguZmxvb3IoayksUD1NYXRoLmNlaWwoayksRj1rLU87Zm9yKEk9MDtJPGg7SSsrKXtpZigocT1oPjE/RSoobC0xKStJKlI6LjUqKEUrQSkqKGwtMSkpPDB8fHE+bC0xKWZvcihEPTA7RDxjO0QrKyl7TT1EK0kqeVsyXStOKnlbMV0rVCp5WzBdO2YudmFsdWVzW01dPWF9ZWxzZXt2YXIgTD1NYXRoLmZsb29yKHEpLEI9TWF0aC5jZWlsKHEpLFU9cS1MO2ZvcihEPTA7RDxjO0QrKyl7dmFyIHo9dltNPUQrTCp4WzJdK08qeFsxXStDKnhbMF1dLFY9dltNPUQrQip4WzJdK08qeFsxXStDKnhbMF1dLEc9dltNPUQrTCp4WzJdK1AqeFsxXStDKnhbMF1dLEg9eisoVi16KSpVLFc9RysodltNPUQrQip4WzJdK1AqeFsxXStDKnhbMF1dLUcpKlU7TT1EK0kqeVsyXStOKnlbMV0rVCp5WzBdLGYudmFsdWVzW01dPUgrKFctSCkqRn19fX1lbHNlIGZvcihJPTA7STxoOysrSSl7dmFyIHE7aWYoKHE9aD4xP0UqKGwtMSkrSSpSOi41KihFK0EpKihsLTEpKTwwfHxxPmwtMSlmb3IoRD0wO0Q8YztEKyspe009RCtJKnlbMl0rTip5WzFdK1QqeVswXTtmLnZhbHVlc1tNXT1hfWVsc2V7dmFyICQ9TWF0aC5yb3VuZChxKSxYPU1hdGgucm91bmQoayk7Zm9yKEQ9MDtEPGM7RCsrKXt2YXIgSz1EKyQqeFsyXStYKnhbMV0rQyp4WzBdLGo9RCtJKnlbMl0rTip5WzFdK1QqeVswXTtmLnZhbHVlc1tqXT12W0tdfX19fX1yZXR1cm4gZi50b1RlbnNvcigpfSxlLnByb3RvdHlwZS5nYXRoZXJORD1mdW5jdGlvbihlLHQpe3ZhciBuPXQuc2hhcGUscj1uW24ubGVuZ3RoLTFdLG89cHJlcGFyZUFuZFZhbGlkYXRlKGUsdCksYT1vWzBdLGk9b1sxXSxzPW9bMl0sdT1vWzNdO2lmKDA9PT1pKXJldHVybiB0ZW5zb3IoW10sYSxlLmR0eXBlKTtmb3IodmFyIGw9bmV3IFRlbnNvckJ1ZmZlcihbaSxzXSxlLmR0eXBlKSxjPXQuZGF0YVN5bmMoKSxwPWUuZGF0YVN5bmMoKSxkPTA7ZDxpO2QrKyl7Zm9yKHZhciBoPVtdLGY9MCxtPTA7bTxyO20rKyl7dmFyIGc9Y1tkKnIrbV07Zis9Zyp1W21dLGgucHVzaChnKX1pZihmPDB8fGY+PWUuc2l6ZS9zKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5kaWNlczogXCIraCtcIiBkb2VzIG5vdCBpbmRleCBpbnRvIFwiK2Uuc2hhcGUpO2Zvcih2YXIgdj0wO3Y8czt2KyspbC52YWx1ZXNbZCpzK3ZdPXBbZipzK3ZdfXJldHVybiBsLnRvVGVuc29yKCkucmVzaGFwZShhKX0sZS5wcm90b3R5cGUuc2NhdHRlck5EPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1wcmVwYXJlQW5kVmFsaWRhdGUkMSh0LGUsbiksbz1yWzBdLGE9clsxXSxpPXJbMl0scz1yWzNdLHU9cls0XSxsPVt1L2ksaV0sYz1lLmRhdGFTeW5jKCkscD10LmRhdGFTeW5jKCk7aWYoMD09PXUpcmV0dXJuIHRlbnNvcihbXSxuLHQuZHR5cGUpO2Zvcih2YXIgZD1uZXcgVGVuc29yQnVmZmVyKGwsdC5kdHlwZSksaD0wO2g8YTtoKyspe2Zvcih2YXIgZj1bXSxtPTAsZz0wO2c8bztnKyspe3ZhciB2PWNbaCpvK2ddO2YucHVzaCh2KSxtKz12KnNbZ119aWYobTwwfHxtPj11L2kpdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbmRpY2VzOiBcIitmK1wiIGRvZXMgbm90IGluZGV4IGludG8gXCIrbik7Zm9yKHZhciB4PTA7eDxpO3grKylkLnZhbHVlc1ttKmkreF0rPXBbaCppK3hdfXJldHVybiBkLnRvVGVuc29yKCkucmVzaGFwZShuKX0sZX0oKTtFTlYucmVnaXN0ZXJCYWNrZW5kKFwiY3B1XCIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE1hdGhCYWNrZW5kQ1BVfSwxLHNldFRlbnNvclRyYWNrZXIpO3ZhciBkZWxheUNhbGxiYWNrPVwidW5kZWZpbmVkXCIhPXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU/cmVxdWVzdEFuaW1hdGlvbkZyYW1lOnNldEltbWVkaWF0ZTtmdW5jdGlvbiBuZXh0RnJhbWUoKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSl7cmV0dXJuIGRlbGF5Q2FsbGJhY2soZnVuY3Rpb24oKXtyZXR1cm4gZSgpfSl9KX12YXIgRFRZUEVfVkFMVUVfU0laRV9NQVA9e2Zsb2F0MzI6NCxpbnQzMjo0LHVpbnQxNjoyLHVpbnQ4OjEsYm9vbDoxfTtmdW5jdGlvbiBlbmNvZGVXZWlnaHRzKGUpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIHQsbixyLG87cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24oYSl7c3dpdGNoKGEubGFiZWwpe2Nhc2UgMDpmb3IociBpbiB0PVtdLG49W10sZSl7aWYoXCJmbG9hdDMyXCIhPT0obz1lW3JdKS5kdHlwZSYmXCJpbnQzMlwiIT09by5kdHlwZSYmXCJib29sXCIhPT1vLmR0eXBlKXRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGR0eXBlIGluIHdlaWdodCAnXCIrcitcIic6IFwiK28uZHR5cGUpO3QucHVzaCh7bmFtZTpyLHNoYXBlOm8uc2hhcGUsZHR5cGU6by5kdHlwZX0pLG4ucHVzaChvLmRhdGEoKSl9cmV0dXJuWzQsUHJvbWlzZS5hbGwobildO2Nhc2UgMTpyZXR1cm5bMix7ZGF0YTpjb25jYXRlbmF0ZVR5cGVkQXJyYXlzKGEuc2VudCgpKSxzcGVjczp0fV19fSl9KX1mdW5jdGlvbiBkZWNvZGVXZWlnaHRzKGUsdCl7Zm9yKHZhciBuPXt9LHI9MCxvPWZ1bmN0aW9uKHQpe3ZhciBvPXQubmFtZSxhPXQuZHR5cGUsaT10LnNoYXBlLHM9c2l6ZUZyb21TaGFwZShpKSx1PXZvaWQgMDtpZihcInF1YW50aXphdGlvblwiaW4gdCl7dmFyIGw9dC5xdWFudGl6YXRpb247aWYoXCJ1aW50OFwiIT09bC5kdHlwZSYmXCJ1aW50MTZcIiE9PWwuZHR5cGUpdGhyb3cgbmV3IEVycm9yKFwiV2VpZ2h0IFwiK3QubmFtZStcIiBoYXMgdW5rbm93biBxdWFudGl6YXRpb24gZHR5cGUgXCIrbC5kdHlwZStcIi4gU3VwcG9ydGVkIHF1YW50aXphdGlvbiBkdHlwZXMgYXJlOiAndWludDgnIGFuZCAndWludDE2Jy5cIik7dmFyIGM9RFRZUEVfVkFMVUVfU0laRV9NQVBbbC5kdHlwZV0scD1lLnNsaWNlKHIscitzKmMpLGQ9XCJ1aW50OFwiPT09bC5kdHlwZT9uZXcgVWludDhBcnJheShwKTpuZXcgVWludDE2QXJyYXkocCk7aWYoXCJmbG9hdDMyXCI9PT1hKXU9RmxvYXQzMkFycmF5LmZyb20oZCxmdW5jdGlvbihlKXtyZXR1cm4gZSpsLnNjYWxlK2wubWlufSk7ZWxzZXtpZihcImludDMyXCIhPT1hKXRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGR0eXBlIGluIHdlaWdodCAnXCIrbytcIic6IFwiK2EpO3U9SW50MzJBcnJheS5mcm9tKGQsZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQoZSpsLnNjYWxlK2wubWluKX0pfXIrPXMqY31lbHNle3ZhciBoPURUWVBFX1ZBTFVFX1NJWkVfTUFQW2FdO3A9ZS5zbGljZShyLHIrcypoKTtpZihcImZsb2F0MzJcIj09PWEpdT1uZXcgRmxvYXQzMkFycmF5KHApO2Vsc2UgaWYoXCJpbnQzMlwiPT09YSl1PW5ldyBJbnQzMkFycmF5KHApO2Vsc2V7aWYoXCJib29sXCIhPT1hKXRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGR0eXBlIGluIHdlaWdodCAnXCIrbytcIic6IFwiK2EpO3U9bmV3IFVpbnQ4QXJyYXkocCl9cis9cypofXZhciBmPXZvaWQgMDtpZihcImZsb2F0MzJcIj09PWEpZj10ZW5zb3IodSxpLFwiZmxvYXQzMlwiKTtlbHNlIGlmKFwiaW50MzJcIj09PWEpZj10ZW5zb3IodSxpLFwiaW50MzJcIik7ZWxzZXtpZihcImJvb2xcIiE9PWEpdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgZHR5cGUgaW4gd2VpZ2h0ICdcIitvK1wiJzogXCIrYSk7Zj10ZW5zb3IodSxpLFwiYm9vbFwiKX1uW29dPWZ9LGE9MCxpPXQ7YTxpLmxlbmd0aDthKyspe28oaVthXSl9cmV0dXJuIG59ZnVuY3Rpb24gY29uY2F0ZW5hdGVUeXBlZEFycmF5cyhlKXtpZihudWxsPT09ZSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGlucHV0IHZhbHVlOiBcIitKU09OLnN0cmluZ2lmeShlKSk7dmFyIHQ9MCxuPVtdO2UuZm9yRWFjaChmdW5jdGlvbihlKXtpZih0Kz1lLmJ5dGVMZW5ndGgsbi5wdXNoKGUuYnl0ZUxlbmd0aD09PWUuYnVmZmVyLmJ5dGVMZW5ndGg/ZTpuZXcgZS5jb25zdHJ1Y3RvcihlKSksIShlIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5fHxlIGluc3RhbmNlb2YgSW50MzJBcnJheXx8ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKXRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIFR5cGVkQXJyYXkgc3VidHlwZTogXCIrZS5jb25zdHJ1Y3Rvci5uYW1lKX0pO3ZhciByPW5ldyBVaW50OEFycmF5KHQpLG89MDtyZXR1cm4gbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3Iuc2V0KG5ldyBVaW50OEFycmF5KGUuYnVmZmVyKSxvKSxvKz1lLmJ5dGVMZW5ndGh9KSxyLmJ1ZmZlcn12YXIgdXNlTm9kZUJ1ZmZlcj1cInVuZGVmaW5lZFwiIT10eXBlb2YgQnVmZmVyJiYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIEJsb2J8fFwidW5kZWZpbmVkXCI9PXR5cGVvZiBhdG9ifHxcInVuZGVmaW5lZFwiPT10eXBlb2YgYnRvYSk7ZnVuY3Rpb24gc3RyaW5nQnl0ZUxlbmd0aChlKXtyZXR1cm4gdXNlTm9kZUJ1ZmZlcj9CdWZmZXIuYnl0ZUxlbmd0aChlKTpuZXcgQmxvYihbZV0pLnNpemV9ZnVuY3Rpb24gYXJyYXlCdWZmZXJUb0Jhc2U2NFN0cmluZyhlKXtyZXR1cm4gdXNlTm9kZUJ1ZmZlcj9CdWZmZXIuZnJvbShlKS50b1N0cmluZyhcImJhc2U2NFwiKTpidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxuZXcgVWludDhBcnJheShlKSkpfWZ1bmN0aW9uIGJhc2U2NFN0cmluZ1RvQXJyYXlCdWZmZXIoZSl7aWYodXNlTm9kZUJ1ZmZlcil7dmFyIHQ9QnVmZmVyLmZyb20oZSxcImJhc2U2NFwiKTtyZXR1cm4gdC5idWZmZXIuc2xpY2UodC5ieXRlT2Zmc2V0LHQuYnl0ZU9mZnNldCt0LmJ5dGVMZW5ndGgpfWZvcih2YXIgbj1hdG9iKGUpLHI9bmV3IFVpbnQ4QXJyYXkobi5sZW5ndGgpLG89MDtvPG4ubGVuZ3RoOysrbylyLnNldChbbi5jaGFyQ29kZUF0KG8pXSxvKTtyZXR1cm4gci5idWZmZXJ9ZnVuY3Rpb24gY29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnMoZSl7dmFyIHQ9MDtlLmZvckVhY2goZnVuY3Rpb24oZSl7dCs9ZS5ieXRlTGVuZ3RofSk7dmFyIG49bmV3IFVpbnQ4QXJyYXkodCkscj0wO3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24oZSl7bi5zZXQobmV3IFVpbnQ4QXJyYXkoZSkscikscis9ZS5ieXRlTGVuZ3RofSksbi5idWZmZXJ9ZnVuY3Rpb24gYmFzZW5hbWUoZSl7Zm9yKGU9ZS50cmltKCk7ZS5lbmRzV2l0aChcIi9cIik7KWU9ZS5zbGljZSgwLGUubGVuZ3RoLTEpO3ZhciB0PWUuc3BsaXQoXCIvXCIpO3JldHVybiB0W3QubGVuZ3RoLTFdfWZ1bmN0aW9uIGdldE1vZGVsQXJ0aWZhY3RzSW5mb0ZvckpTT04oZSl7aWYoZS5tb2RlbFRvcG9sb2d5IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgSlNPTiBtb2RlbCB0b3BvbG9neSwgcmVjZWl2ZWQgQXJyYXlCdWZmZXIuXCIpO3JldHVybntkYXRlU2F2ZWQ6bmV3IERhdGUsbW9kZWxUb3BvbG9neVR5cGU6XCJKU09OXCIsbW9kZWxUb3BvbG9neUJ5dGVzOm51bGw9PWUubW9kZWxUb3BvbG9neT8wOnN0cmluZ0J5dGVMZW5ndGgoSlNPTi5zdHJpbmdpZnkoZS5tb2RlbFRvcG9sb2d5KSksd2VpZ2h0U3BlY3NCeXRlczpudWxsPT1lLndlaWdodFNwZWNzPzA6c3RyaW5nQnl0ZUxlbmd0aChKU09OLnN0cmluZ2lmeShlLndlaWdodFNwZWNzKSksd2VpZ2h0RGF0YUJ5dGVzOm51bGw9PWUud2VpZ2h0RGF0YT8wOmUud2VpZ2h0RGF0YS5ieXRlTGVuZ3RofX12YXIgSU9Sb3V0ZXJSZWdpc3RyeT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt0aGlzLnNhdmVSb3V0ZXJzPVtdLHRoaXMubG9hZFJvdXRlcnM9W119cmV0dXJuIGUuZ2V0SW5zdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09ZS5pbnN0YW5jZSYmKGUuaW5zdGFuY2U9bmV3IGUpLGUuaW5zdGFuY2V9LGUucmVnaXN0ZXJTYXZlUm91dGVyPWZ1bmN0aW9uKHQpe2UuZ2V0SW5zdGFuY2UoKS5zYXZlUm91dGVycy5wdXNoKHQpfSxlLnJlZ2lzdGVyTG9hZFJvdXRlcj1mdW5jdGlvbih0KXtlLmdldEluc3RhbmNlKCkubG9hZFJvdXRlcnMucHVzaCh0KX0sZS5nZXRTYXZlSGFuZGxlcnM9ZnVuY3Rpb24odCl7cmV0dXJuIGUuZ2V0SGFuZGxlcnModCxcInNhdmVcIil9LGUuZ2V0TG9hZEhhbmRsZXJzPWZ1bmN0aW9uKHQpe3JldHVybiBlLmdldEhhbmRsZXJzKHQsXCJsb2FkXCIpfSxlLmdldEhhbmRsZXJzPWZ1bmN0aW9uKGUsdCl7dmFyIG49W107cmV0dXJuKFwibG9hZFwiPT09dD90aGlzLmdldEluc3RhbmNlKCkubG9hZFJvdXRlcnM6dGhpcy5nZXRJbnN0YW5jZSgpLnNhdmVSb3V0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciByPXQoZSk7bnVsbCE9PXImJm4ucHVzaChyKX0pLG59LGV9KCksVVJMX1NDSEVNRV9TVUZGSVg9XCI6Ly9cIixNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3RoaXMubWFuYWdlcnM9e319cmV0dXJuIGUuZ2V0SW5zdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09ZS5pbnN0YW5jZSYmKGUuaW5zdGFuY2U9bmV3IGUpLGUuaW5zdGFuY2V9LGUucmVnaXN0ZXJNYW5hZ2VyPWZ1bmN0aW9uKHQsbil7YXNzZXJ0KG51bGwhPXQsXCJzY2hlbWUgbXVzdCBub3QgYmUgdW5kZWZpbmVkIG9yIG51bGwuXCIpLHQuZW5kc1dpdGgoVVJMX1NDSEVNRV9TVUZGSVgpJiYodD10LnNsaWNlKDAsdC5pbmRleE9mKFVSTF9TQ0hFTUVfU1VGRklYKSkpLGFzc2VydCh0Lmxlbmd0aD4wLFwic2NoZW1lIG11c3Qgbm90IGJlIGFuIGVtcHR5IHN0cmluZy5cIik7dmFyIHI9ZS5nZXRJbnN0YW5jZSgpO2Fzc2VydChudWxsPT1yLm1hbmFnZXJzW3RdLFwiQSBtb2RlbCBzdG9yZSBtYW5hZ2VyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3Igc2NoZW1lICdcIit0K1wiJy5cIiksci5tYW5hZ2Vyc1t0XT1ufSxlLmdldE1hbmFnZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXRJbnN0YW5jZSgpLm1hbmFnZXJzW2VdO2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kZWwgbWFuYWdlciBmb3Igc2NoZW1lICdcIitlK1wiJ1wiKTtyZXR1cm4gdH0sZS5nZXRTY2hlbWVzPWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZ2V0SW5zdGFuY2UoKS5tYW5hZ2Vycyl9LGV9KCk7ZnVuY3Rpb24gcGFyc2VVUkwoZSl7aWYoLTE9PT1lLmluZGV4T2YoVVJMX1NDSEVNRV9TVUZGSVgpKXRocm93IG5ldyBFcnJvcihcIlRoZSB1cmwgc3RyaW5nIHByb3ZpZGVkIGRvZXMgbm90IGNvbnRhaW4gYSBzY2hlbWUuIFN1cHBvcnRlZCBzY2hlbWVzIGFyZTogXCIrTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeS5nZXRTY2hlbWVzKCkuam9pbihcIixcIikpO3JldHVybntzY2hlbWU6ZS5zcGxpdChVUkxfU0NIRU1FX1NVRkZJWClbMF0scGF0aDplLnNwbGl0KFVSTF9TQ0hFTUVfU1VGRklYKVsxXX19ZnVuY3Rpb24gY2xvbmVNb2RlbEludGVybmFsKGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49ITEpLF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgcixvLGEsaSxzLHUsbCxjLHA7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24oZCl7c3dpdGNoKGQubGFiZWwpe2Nhc2UgMDpyZXR1cm4gYXNzZXJ0KGUhPT10LFwiT2xkIHBhdGggYW5kIG5ldyBwYXRoIGFyZSB0aGUgc2FtZTogJ1wiK2UrXCInXCIpLGFzc2VydCgocj1JT1JvdXRlclJlZ2lzdHJ5LmdldExvYWRIYW5kbGVycyhlKSkubGVuZ3RoPjAsXCJDb3B5aW5nIGZhaWxlZCBiZWNhdXNlIG5vIGxvYWQgaGFuZGxlciBpcyBmb3VuZCBmb3Igc291cmNlIFVSTCBcIitlK1wiLlwiKSxhc3NlcnQoci5sZW5ndGg8MixcIkNvcHlpbmcgZmFpbGVkIGJlY2F1c2UgbW9yZSB0aGFuIG9uZSAoXCIrci5sZW5ndGgrXCIpIGxvYWQgaGFuZGxlcnMgZm9yIHNvdXJjZSBVUkwgXCIrZStcIi5cIiksbz1yWzBdLGFzc2VydCgoYT1JT1JvdXRlclJlZ2lzdHJ5LmdldFNhdmVIYW5kbGVycyh0KSkubGVuZ3RoPjAsXCJDb3B5aW5nIGZhaWxlZCBiZWNhdXNlIG5vIHNhdmUgaGFuZGxlciBpcyBmb3VuZCBmb3IgZGVzdGluYXRpb24gVVJMIFwiK3QrXCIuXCIpLGFzc2VydChhLmxlbmd0aDwyLFwiQ29weWluZyBmYWlsZWQgYmVjYXVzZSBtb3JlIHRoYW4gb25lIChcIityLmxlbmd0aCtcIikgc2F2ZSBoYW5kbGVycyBmb3IgZGVzdGluYXRpb24gVVJMIFwiK3QrXCIuXCIpLGk9YVswXSxzPXBhcnNlVVJMKGUpLnNjaGVtZSx1PXBhcnNlVVJMKGUpLnBhdGgsbD1zPT09cGFyc2VVUkwoZSkuc2NoZW1lLFs0LG8ubG9hZCgpXTtjYXNlIDE6cmV0dXJuIGM9ZC5zZW50KCksbiYmbD9bNCxNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5LmdldE1hbmFnZXIocykucmVtb3ZlTW9kZWwodSldOlszLDNdO2Nhc2UgMjpkLnNlbnQoKSxkLmxhYmVsPTM7Y2FzZSAzOnJldHVybls0LGkuc2F2ZShjKV07Y2FzZSA0OnJldHVybiBwPWQuc2VudCgpLCFufHxsP1szLDZdOls0LE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0TWFuYWdlcihzKS5yZW1vdmVNb2RlbCh1KV07Y2FzZSA1OmQuc2VudCgpLGQubGFiZWw9NjtjYXNlIDY6cmV0dXJuWzIscC5tb2RlbEFydGlmYWN0c0luZm9dfX0pfSl9ZnVuY3Rpb24gbGlzdE1vZGVscygpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsbyxhLGk7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24ocyl7c3dpdGNoKHMubGFiZWwpe2Nhc2UgMDplPU1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0U2NoZW1lcygpLHQ9e30sbj0wLHI9ZSxzLmxhYmVsPTE7Y2FzZSAxOnJldHVybiBuPHIubGVuZ3RoPyhvPXJbbl0sWzQsTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeS5nZXRNYW5hZ2VyKG8pLmxpc3RNb2RlbHMoKV0pOlszLDRdO2Nhc2UgMjpmb3IoaSBpbiBhPXMuc2VudCgpKXRbbytVUkxfU0NIRU1FX1NVRkZJWCtpXT1hW2ldO3MubGFiZWw9MztjYXNlIDM6cmV0dXJuIG4rKyxbMywxXTtjYXNlIDQ6cmV0dXJuWzIsdF19fSl9KX1mdW5jdGlvbiByZW1vdmVNb2RlbChlKXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciB0O3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKG4pe3N3aXRjaChuLmxhYmVsKXtjYXNlIDA6cmV0dXJuIHQ9cGFyc2VVUkwoZSksWzQsTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeS5nZXRNYW5hZ2VyKHQuc2NoZW1lKS5yZW1vdmVNb2RlbCh0LnBhdGgpXTtjYXNlIDE6cmV0dXJuWzIsbi5zZW50KCldfX0pfSl9ZnVuY3Rpb24gY29weU1vZGVsKGUsdCl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihuKXtzd2l0Y2gobi5sYWJlbCl7Y2FzZSAwOnJldHVybls0LGNsb25lTW9kZWxJbnRlcm5hbChlLHQsITEpXTtjYXNlIDE6cmV0dXJuWzIsbi5zZW50KCldfX0pfSl9ZnVuY3Rpb24gbW92ZU1vZGVsKGUsdCl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihuKXtzd2l0Y2gobi5sYWJlbCl7Y2FzZSAwOnJldHVybls0LGNsb25lTW9kZWxJbnRlcm5hbChlLHQsITApXTtjYXNlIDE6cmV0dXJuWzIsbi5zZW50KCldfX0pfSl9dmFyIERBVEFCQVNFX05BTUU9XCJ0ZW5zb3JmbG93anNcIixEQVRBQkFTRV9WRVJTSU9OPTEsTU9ERUxfU1RPUkVfTkFNRT1cIm1vZGVsc19zdG9yZVwiLElORk9fU1RPUkVfTkFNRT1cIm1vZGVsX2luZm9fc3RvcmVcIjtmdW5jdGlvbiBnZXRJbmRleGVkREJGYWN0b3J5KCl7aWYoIUVOVi5nZXQoXCJJU19CUk9XU0VSXCIpKXRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBvYnRhaW4gSW5kZXhlZERCIGZhY3RvcnkgYmVjYXVzZSB0aGUgY3VycmVudCBlbnZpcm9ubWVudGlzIG5vdCBhIHdlYiBicm93c2VyLlwiKTt2YXIgZT13aW5kb3csdD1lLmluZGV4ZWREQnx8ZS5tb3pJbmRleGVkREJ8fGUud2Via2l0SW5kZXhlZERCfHxlLm1zSW5kZXhlZERCfHxlLnNoaW1JbmRleGVkREI7aWYobnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoXCJUaGUgY3VycmVudCBicm93c2VyIGRvZXMgbm90IGFwcGVhciB0byBzdXBwb3J0IEluZGV4ZWREQi5cIik7cmV0dXJuIHR9ZnVuY3Rpb24gc2V0VXBEYXRhYmFzZShlKXt2YXIgdD1lLnJlc3VsdDt0LmNyZWF0ZU9iamVjdFN0b3JlKE1PREVMX1NUT1JFX05BTUUse2tleVBhdGg6XCJtb2RlbFBhdGhcIn0pLHQuY3JlYXRlT2JqZWN0U3RvcmUoSU5GT19TVE9SRV9OQU1FLHtrZXlQYXRoOlwibW9kZWxQYXRoXCJ9KX12YXIgQnJvd3NlckluZGV4ZWREQj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYodGhpcy5pbmRleGVkREI9Z2V0SW5kZXhlZERCRmFjdG9yeSgpLG51bGw9PWV8fCFlKXRocm93IG5ldyBFcnJvcihcIkZvciBJbmRleGVkREIsIG1vZGVsUGF0aCBtdXN0IG5vdCBiZSBudWxsLCB1bmRlZmluZWQgb3IgZW1wdHkuXCIpO3RoaXMubW9kZWxQYXRoPWV9cmV0dXJuIGUucHJvdG90eXBlLnNhdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbih0KXtpZihlLm1vZGVsVG9wb2xvZ3kgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcil0aHJvdyBuZXcgRXJyb3IoXCJCcm93c2VyTG9jYWxTdG9yYWdlLnNhdmUoKSBkb2VzIG5vdCBzdXBwb3J0IHNhdmluZyBtb2RlbCB0b3BvbG9neSBpbiBiaW5hcnkgZm9ybWF0cyB5ZXQuXCIpO3JldHVyblsyLHRoaXMuZGF0YWJhc2VBY3Rpb24odGhpcy5tb2RlbFBhdGgsZSldfSl9KX0sZS5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuWzIsdGhpcy5kYXRhYmFzZUFjdGlvbih0aGlzLm1vZGVsUGF0aCldfSl9KX0sZS5wcm90b3R5cGUuZGF0YWJhc2VBY3Rpb249ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHIpe3ZhciBvPW4uaW5kZXhlZERCLm9wZW4oREFUQUJBU0VfTkFNRSxEQVRBQkFTRV9WRVJTSU9OKTtvLm9udXBncmFkZW5lZWRlZD1mdW5jdGlvbigpe3JldHVybiBzZXRVcERhdGFiYXNlKG8pfSxvLm9uc3VjY2Vzcz1mdW5jdGlvbigpe3ZhciBhPW8ucmVzdWx0O2lmKG51bGw9PXQpe3ZhciBpPWEudHJhbnNhY3Rpb24oTU9ERUxfU1RPUkVfTkFNRSxcInJlYWRvbmx5XCIpLHM9aS5vYmplY3RTdG9yZShNT0RFTF9TVE9SRV9OQU1FKS5nZXQobi5tb2RlbFBhdGgpO3Mub25zdWNjZXNzPWZ1bmN0aW9uKCl7aWYobnVsbD09cy5yZXN1bHQpcmV0dXJuIGEuY2xvc2UoKSxyKG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZGVsIHdpdGggcGF0aCAnXCIrbi5tb2RlbFBhdGgrXCInIGluIEluZGV4ZWREQi5cIikpO2Uocy5yZXN1bHQubW9kZWxBcnRpZmFjdHMpfSxzLm9uZXJyb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGEuY2xvc2UoKSxyKHMuZXJyb3IpfSxpLm9uY29tcGxldGU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5jbG9zZSgpfX1lbHNle3ZhciB1LGw9Z2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTih0KSxjPWEudHJhbnNhY3Rpb24oSU5GT19TVE9SRV9OQU1FLFwicmVhZHdyaXRlXCIpLHA9Yy5vYmplY3RTdG9yZShJTkZPX1NUT1JFX05BTUUpLGQ9cC5wdXQoe21vZGVsUGF0aDpuLm1vZGVsUGF0aCxtb2RlbEFydGlmYWN0c0luZm86bH0pO2Qub25zdWNjZXNzPWZ1bmN0aW9uKCl7dmFyIG89KHU9YS50cmFuc2FjdGlvbihNT0RFTF9TVE9SRV9OQU1FLFwicmVhZHdyaXRlXCIpKS5vYmplY3RTdG9yZShNT0RFTF9TVE9SRV9OQU1FKS5wdXQoe21vZGVsUGF0aDpuLm1vZGVsUGF0aCxtb2RlbEFydGlmYWN0czp0LG1vZGVsQXJ0aWZhY3RzSW5mbzpsfSk7by5vbnN1Y2Nlc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZSh7bW9kZWxBcnRpZmFjdHNJbmZvOmx9KX0sby5vbmVycm9yPWZ1bmN0aW9uKGUpe3ZhciB0PShwPWMub2JqZWN0U3RvcmUoSU5GT19TVE9SRV9OQU1FKSkuZGVsZXRlKG4ubW9kZWxQYXRoKTt0Lm9uc3VjY2Vzcz1mdW5jdGlvbigpe3JldHVybiBhLmNsb3NlKCkscihvLmVycm9yKX0sdC5vbmVycm9yPWZ1bmN0aW9uKGUpe3JldHVybiBhLmNsb3NlKCkscihvLmVycm9yKX19fSxkLm9uZXJyb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGEuY2xvc2UoKSxyKGQuZXJyb3IpfSxjLm9uY29tcGxldGU9ZnVuY3Rpb24oKXtudWxsPT11P2EuY2xvc2UoKTp1Lm9uY29tcGxldGU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5jbG9zZSgpfX19fSxvLm9uZXJyb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIHIoby5lcnJvcil9fSl9LGUuVVJMX1NDSEVNRT1cImluZGV4ZWRkYjovL1wiLGV9KCksaW5kZXhlZERCUm91dGVyPWZ1bmN0aW9uKGUpe3JldHVybiBFTlYuZ2V0KFwiSVNfQlJPV1NFUlwiKSYmIUFycmF5LmlzQXJyYXkoZSkmJmUuc3RhcnRzV2l0aChCcm93c2VySW5kZXhlZERCLlVSTF9TQ0hFTUUpP2Jyb3dzZXJJbmRleGVkREIoZS5zbGljZShCcm93c2VySW5kZXhlZERCLlVSTF9TQ0hFTUUubGVuZ3RoKSk6bnVsbH07ZnVuY3Rpb24gYnJvd3NlckluZGV4ZWREQihlKXtyZXR1cm4gbmV3IEJyb3dzZXJJbmRleGVkREIoZSl9ZnVuY3Rpb24gbWF5YmVTdHJpcFNjaGVtZShlKXtyZXR1cm4gZS5zdGFydHNXaXRoKEJyb3dzZXJJbmRleGVkREIuVVJMX1NDSEVNRSk/ZS5zbGljZShCcm93c2VySW5kZXhlZERCLlVSTF9TQ0hFTUUubGVuZ3RoKTplfUlPUm91dGVyUmVnaXN0cnkucmVnaXN0ZXJTYXZlUm91dGVyKGluZGV4ZWREQlJvdXRlciksSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlckxvYWRSb3V0ZXIoaW5kZXhlZERCUm91dGVyKTt2YXIgQnJvd3NlckluZGV4ZWREQk1hbmFnZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dGhpcy5pbmRleGVkREI9Z2V0SW5kZXhlZERCRmFjdG9yeSgpfXJldHVybiBlLnByb3RvdHlwZS5saXN0TW9kZWxzPWZ1bmN0aW9uKCl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKHQpe3JldHVyblsyLG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5pbmRleGVkREIub3BlbihEQVRBQkFTRV9OQU1FLERBVEFCQVNFX1ZFUlNJT04pO3Iub251cGdyYWRlbmVlZGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHNldFVwRGF0YWJhc2Uocil9LHIub25zdWNjZXNzPWZ1bmN0aW9uKCl7dmFyIGU9ci5yZXN1bHQsbz1lLnRyYW5zYWN0aW9uKElORk9fU1RPUkVfTkFNRSxcInJlYWRvbmx5XCIpLGE9by5vYmplY3RTdG9yZShJTkZPX1NUT1JFX05BTUUpLmdldEFsbCgpO2Eub25zdWNjZXNzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXt9LG49MCxyPWEucmVzdWx0O248ci5sZW5ndGg7bisrKXt2YXIgbz1yW25dO2Vbby5tb2RlbFBhdGhdPW8ubW9kZWxBcnRpZmFjdHNJbmZvfXQoZSl9LGEub25lcnJvcj1mdW5jdGlvbih0KXtyZXR1cm4gZS5jbG9zZSgpLG4oYS5lcnJvcil9LG8ub25jb21wbGV0ZT1mdW5jdGlvbigpe3JldHVybiBlLmNsb3NlKCl9fSxyLm9uZXJyb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIG4oci5lcnJvcil9fSldfSl9KX0sZS5wcm90b3R5cGUucmVtb3ZlTW9kZWw9ZnVuY3Rpb24oZSl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKG4pe3JldHVybiBlPW1heWJlU3RyaXBTY2hlbWUoZSksWzIsbmV3IFByb21pc2UoZnVuY3Rpb24obixyKXt2YXIgbz10LmluZGV4ZWREQi5vcGVuKERBVEFCQVNFX05BTUUsREFUQUJBU0VfVkVSU0lPTik7by5vbnVwZ3JhZGVuZWVkZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gc2V0VXBEYXRhYmFzZShvKX0sby5vbnN1Y2Nlc3M9ZnVuY3Rpb24oKXt2YXIgdCxhPW8ucmVzdWx0LGk9YS50cmFuc2FjdGlvbihJTkZPX1NUT1JFX05BTUUsXCJyZWFkd3JpdGVcIikscz1pLm9iamVjdFN0b3JlKElORk9fU1RPUkVfTkFNRSksdT1zLmdldChlKTt1Lm9uc3VjY2Vzcz1mdW5jdGlvbigpe2lmKG51bGw9PXUucmVzdWx0KXJldHVybiBhLmNsb3NlKCkscihuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2RlbCB3aXRoIHBhdGggJ1wiK2UrXCInIGluIEluZGV4ZWREQi5cIikpO3ZhciBvPXMuZGVsZXRlKGUpLGk9ZnVuY3Rpb24oKXt2YXIgbz0odD1hLnRyYW5zYWN0aW9uKE1PREVMX1NUT1JFX05BTUUsXCJyZWFkd3JpdGVcIikpLm9iamVjdFN0b3JlKE1PREVMX1NUT1JFX05BTUUpLmRlbGV0ZShlKTtvLm9uc3VjY2Vzcz1mdW5jdGlvbigpe3JldHVybiBuKHUucmVzdWx0Lm1vZGVsQXJ0aWZhY3RzSW5mbyl9LG8ub25lcnJvcj1mdW5jdGlvbihlKXtyZXR1cm4gcih1LmVycm9yKX19O28ub25zdWNjZXNzPWksby5vbmVycm9yPWZ1bmN0aW9uKGUpe3JldHVybiBpKCksYS5jbG9zZSgpLHIodS5lcnJvcil9fSx1Lm9uZXJyb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGEuY2xvc2UoKSxyKHUuZXJyb3IpfSxpLm9uY29tcGxldGU9ZnVuY3Rpb24oKXtudWxsPT10P2EuY2xvc2UoKTp0Lm9uY29tcGxldGU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5jbG9zZSgpfX19LG8ub25lcnJvcj1mdW5jdGlvbihlKXtyZXR1cm4gcihvLmVycm9yKX19KV19KX0pfSxlfSgpO2lmKEVOVi5nZXQoXCJJU19CUk9XU0VSXCIpKXRyeXtNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5LnJlZ2lzdGVyTWFuYWdlcihCcm93c2VySW5kZXhlZERCLlVSTF9TQ0hFTUUsbmV3IEJyb3dzZXJJbmRleGVkREJNYW5hZ2VyKX1jYXRjaChlKXt9dmFyIFBBVEhfU0VQQVJBVE9SPVwiL1wiLFBBVEhfUFJFRklYPVwidGVuc29yZmxvd2pzX21vZGVsc1wiLElORk9fU1VGRklYPVwiaW5mb1wiLE1PREVMX1RPUE9MT0dZX1NVRkZJWD1cIm1vZGVsX3RvcG9sb2d5XCIsV0VJR0hUX1NQRUNTX1NVRkZJWD1cIndlaWdodF9zcGVjc1wiLFdFSUdIVF9EQVRBX1NVRkZJWD1cIndlaWdodF9kYXRhXCI7ZnVuY3Rpb24gZ2V0TW9kZWxLZXlzKGUpe3JldHVybntpbmZvOltQQVRIX1BSRUZJWCxlLElORk9fU1VGRklYXS5qb2luKFBBVEhfU0VQQVJBVE9SKSx0b3BvbG9neTpbUEFUSF9QUkVGSVgsZSxNT0RFTF9UT1BPTE9HWV9TVUZGSVhdLmpvaW4oUEFUSF9TRVBBUkFUT1IpLHdlaWdodFNwZWNzOltQQVRIX1BSRUZJWCxlLFdFSUdIVF9TUEVDU19TVUZGSVhdLmpvaW4oUEFUSF9TRVBBUkFUT1IpLHdlaWdodERhdGE6W1BBVEhfUFJFRklYLGUsV0VJR0hUX0RBVEFfU1VGRklYXS5qb2luKFBBVEhfU0VQQVJBVE9SKX19ZnVuY3Rpb24gZ2V0TW9kZWxQYXRoRnJvbUtleShlKXt2YXIgdD1lLnNwbGl0KFBBVEhfU0VQQVJBVE9SKTtpZih0Lmxlbmd0aDwzKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQga2V5IGZvcm1hdDogXCIrZSk7cmV0dXJuIHQuc2xpY2UoMSx0Lmxlbmd0aC0xKS5qb2luKFBBVEhfU0VQQVJBVE9SKX1mdW5jdGlvbiBtYXliZVN0cmlwU2NoZW1lJDEoZSl7cmV0dXJuIGUuc3RhcnRzV2l0aChCcm93c2VyTG9jYWxTdG9yYWdlLlVSTF9TQ0hFTUUpP2Uuc2xpY2UoQnJvd3NlckxvY2FsU3RvcmFnZS5VUkxfU0NIRU1FLmxlbmd0aCk6ZX12YXIgQnJvd3NlckxvY2FsU3RvcmFnZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYoIUVOVi5nZXQoXCJJU19CUk9XU0VSXCIpfHx2b2lkIDA9PT13aW5kb3cubG9jYWxTdG9yYWdlKXRocm93IG5ldyBFcnJvcihcIlRoZSBjdXJyZW50IGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgbG9jYWwgc3RvcmFnZS5cIik7aWYodGhpcy5MUz13aW5kb3cubG9jYWxTdG9yYWdlLG51bGw9PWV8fCFlKXRocm93IG5ldyBFcnJvcihcIkZvciBsb2NhbCBzdG9yYWdlLCBtb2RlbFBhdGggbXVzdCBub3QgYmUgbnVsbCwgdW5kZWZpbmVkIG9yIGVtcHR5LlwiKTt0aGlzLm1vZGVsUGF0aD1lLHRoaXMua2V5cz1nZXRNb2RlbEtleXModGhpcy5tb2RlbFBhdGgpfXJldHVybiBlLnByb3RvdHlwZS5zYXZlPWZ1bmN0aW9uKGUpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIHQsbixyLG87cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24oYSl7aWYoZS5tb2RlbFRvcG9sb2d5IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpdGhyb3cgbmV3IEVycm9yKFwiQnJvd3NlckxvY2FsU3RvcmFnZS5zYXZlKCkgZG9lcyBub3Qgc3VwcG9ydCBzYXZpbmcgbW9kZWwgdG9wb2xvZ3kgaW4gYmluYXJ5IGZvcm1hdHMgeWV0LlwiKTt0PUpTT04uc3RyaW5naWZ5KGUubW9kZWxUb3BvbG9neSksbj1KU09OLnN0cmluZ2lmeShlLndlaWdodFNwZWNzKSxyPWdldE1vZGVsQXJ0aWZhY3RzSW5mb0ZvckpTT04oZSk7dHJ5e3JldHVybiB0aGlzLkxTLnNldEl0ZW0odGhpcy5rZXlzLmluZm8sSlNPTi5zdHJpbmdpZnkocikpLHRoaXMuTFMuc2V0SXRlbSh0aGlzLmtleXMudG9wb2xvZ3ksdCksdGhpcy5MUy5zZXRJdGVtKHRoaXMua2V5cy53ZWlnaHRTcGVjcyxuKSx0aGlzLkxTLnNldEl0ZW0odGhpcy5rZXlzLndlaWdodERhdGEsYXJyYXlCdWZmZXJUb0Jhc2U2NFN0cmluZyhlLndlaWdodERhdGEpKSxbMix7bW9kZWxBcnRpZmFjdHNJbmZvOnJ9XX1jYXRjaChlKXtmb3IobyBpbiB0aGlzLmtleXMpdGhpcy5MUy5yZW1vdmVJdGVtKHRoaXMua2V5c1tvXSk7dGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIHNhdmUgbW9kZWwgJ1wiK3RoaXMubW9kZWxQYXRoK1wiJyB0byBsb2NhbCBzdG9yYWdlOiBzaXplIHF1b3RhIGJlaW5nIGV4Y2VlZGVkIGlzIGEgcG9zc2libGUgY2F1c2Ugb2YgdGhpcyBmYWlsdXJlOiBtb2RlbFRvcG9sb2d5Qnl0ZXM9XCIrci5tb2RlbFRvcG9sb2d5Qnl0ZXMrXCIsIHdlaWdodFNwZWNzQnl0ZXM9XCIrci53ZWlnaHRTcGVjc0J5dGVzK1wiLCB3ZWlnaHREYXRhQnl0ZXM9XCIrci53ZWlnaHREYXRhQnl0ZXMrXCIuXCIpfXJldHVyblsyXX0pfSl9LGUucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBlLHQsbixyLG87cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24oYSl7aWYobnVsbD09KGU9SlNPTi5wYXJzZSh0aGlzLkxTLmdldEl0ZW0odGhpcy5rZXlzLmluZm8pKSkpdGhyb3cgbmV3IEVycm9yKFwiSW4gbG9jYWwgc3RvcmFnZSwgdGhlcmUgaXMgbm8gbW9kZWwgd2l0aCBuYW1lICdcIit0aGlzLm1vZGVsUGF0aCtcIidcIik7aWYoXCJKU09OXCIhPT1lLm1vZGVsVG9wb2xvZ3lUeXBlKXRocm93IG5ldyBFcnJvcihcIkJyb3dzZXJMb2NhbFN0b3JhZ2UgZG9lcyBub3Qgc3VwcG9ydCBsb2FkaW5nIG5vbi1KU09OIG1vZGVsIHRvcG9sb2d5IHlldC5cIik7aWYodD17fSxudWxsPT0obj1KU09OLnBhcnNlKHRoaXMuTFMuZ2V0SXRlbSh0aGlzLmtleXMudG9wb2xvZ3kpKSkpdGhyb3cgbmV3IEVycm9yKFwiSW4gbG9jYWwgc3RvcmFnZSwgdGhlIHRvcG9sb2d5IG9mIG1vZGVsICdcIit0aGlzLm1vZGVsUGF0aCtcIicgaXMgbWlzc2luZy5cIik7aWYodC5tb2RlbFRvcG9sb2d5PW4sbnVsbD09KHI9SlNPTi5wYXJzZSh0aGlzLkxTLmdldEl0ZW0odGhpcy5rZXlzLndlaWdodFNwZWNzKSkpKXRocm93IG5ldyBFcnJvcihcIkluIGxvY2FsIHN0b3JhZ2UsIHRoZSB3ZWlnaHQgc3BlY3Mgb2YgbW9kZWwgJ1wiK3RoaXMubW9kZWxQYXRoK1wiJyBhcmUgbWlzc2luZy5cIik7aWYodC53ZWlnaHRTcGVjcz1yLG51bGw9PShvPXRoaXMuTFMuZ2V0SXRlbSh0aGlzLmtleXMud2VpZ2h0RGF0YSkpKXRocm93IG5ldyBFcnJvcihcIkluIGxvY2FsIHN0b3JhZ2UsIHRoZSBiaW5hcnkgd2VpZ2h0IHZhbHVlcyBvZiBtb2RlbCAnXCIrdGhpcy5tb2RlbFBhdGgrXCInIGFyZSBtaXNzaW5nLlwiKTtyZXR1cm4gdC53ZWlnaHREYXRhPWJhc2U2NFN0cmluZ1RvQXJyYXlCdWZmZXIobyksWzIsdF19KX0pfSxlLlVSTF9TQ0hFTUU9XCJsb2NhbHN0b3JhZ2U6Ly9cIixlfSgpLGxvY2FsU3RvcmFnZVJvdXRlcj1mdW5jdGlvbihlKXtyZXR1cm4gRU5WLmdldChcIklTX0JST1dTRVJcIikmJiFBcnJheS5pc0FycmF5KGUpJiZlLnN0YXJ0c1dpdGgoQnJvd3NlckxvY2FsU3RvcmFnZS5VUkxfU0NIRU1FKT9icm93c2VyTG9jYWxTdG9yYWdlKGUuc2xpY2UoQnJvd3NlckxvY2FsU3RvcmFnZS5VUkxfU0NIRU1FLmxlbmd0aCkpOm51bGx9O2Z1bmN0aW9uIGJyb3dzZXJMb2NhbFN0b3JhZ2UoZSl7cmV0dXJuIG5ldyBCcm93c2VyTG9jYWxTdG9yYWdlKGUpfUlPUm91dGVyUmVnaXN0cnkucmVnaXN0ZXJTYXZlUm91dGVyKGxvY2FsU3RvcmFnZVJvdXRlciksSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlckxvYWRSb3V0ZXIobG9jYWxTdG9yYWdlUm91dGVyKTt2YXIgQnJvd3NlckxvY2FsU3RvcmFnZU1hbmFnZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7YXNzZXJ0KEVOVi5nZXQoXCJJU19CUk9XU0VSXCIpLFwiQ3VycmVudCBlbnZpcm9ubWVudCBpcyBub3QgYSB3ZWIgYnJvd3NlclwiKSxhc3NlcnQodm9pZCAwIT09d2luZG93LmxvY2FsU3RvcmFnZSxcIkN1cnJlbnQgYnJvd3NlciBkb2VzIG5vdCBhcHBlYXIgdG8gc3VwcG9ydCBsb2NhbFN0b3JhZ2VcIiksdGhpcy5MUz13aW5kb3cubG9jYWxTdG9yYWdlfXJldHVybiBlLnByb3RvdHlwZS5saXN0TW9kZWxzPWZ1bmN0aW9uKCl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgZSx0LG4scixvLGE7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24oaSl7Zm9yKGU9e30sdD1QQVRIX1BSRUZJWCtQQVRIX1NFUEFSQVRPUixuPVBBVEhfU0VQQVJBVE9SK0lORk9fU1VGRklYLHI9MDtyPHRoaXMuTFMubGVuZ3RoOysrcikobz10aGlzLkxTLmtleShyKSkuc3RhcnRzV2l0aCh0KSYmby5lbmRzV2l0aChuKSYmKGE9Z2V0TW9kZWxQYXRoRnJvbUtleShvKSxlW2FdPUpTT04ucGFyc2UodGhpcy5MUy5nZXRJdGVtKG8pKSk7cmV0dXJuWzIsZV19KX0pfSxlLnByb3RvdHlwZS5yZW1vdmVNb2RlbD1mdW5jdGlvbihlKXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciB0LG47cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24ocil7aWYoZT1tYXliZVN0cmlwU2NoZW1lJDEoZSksdD1nZXRNb2RlbEtleXMoZSksbnVsbD09dGhpcy5MUy5nZXRJdGVtKHQuaW5mbykpdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kZWwgYXQgcGF0aCAnXCIrZStcIidcIik7cmV0dXJuIG49SlNPTi5wYXJzZSh0aGlzLkxTLmdldEl0ZW0odC5pbmZvKSksdGhpcy5MUy5yZW1vdmVJdGVtKHQuaW5mbyksdGhpcy5MUy5yZW1vdmVJdGVtKHQudG9wb2xvZ3kpLHRoaXMuTFMucmVtb3ZlSXRlbSh0LndlaWdodFNwZWNzKSx0aGlzLkxTLnJlbW92ZUl0ZW0odC53ZWlnaHREYXRhKSxbMixuXX0pfSl9LGV9KCk7aWYoRU5WLmdldChcIklTX0JST1dTRVJcIikpdHJ5e01vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkucmVnaXN0ZXJNYW5hZ2VyKEJyb3dzZXJMb2NhbFN0b3JhZ2UuVVJMX1NDSEVNRSxuZXcgQnJvd3NlckxvY2FsU3RvcmFnZU1hbmFnZXIpfWNhdGNoKGUpe312YXIgREVGQVVMVF9GSUxFX05BTUVfUFJFRklYPVwibW9kZWxcIixERUZBVUxUX0pTT05fRVhURU5TSU9OX05BTUU9XCIuanNvblwiLERFRkFVTFRfV0VJR0hUX0RBVEFfRVhURU5TSU9OX05BTUU9XCIud2VpZ2h0cy5iaW5cIixCcm93c2VyRG93bmxvYWRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtpZighRU5WLmdldChcIklTX0JST1dTRVJcIikpdGhyb3cgbmV3IEVycm9yKFwidHJpZ2dlckRvd25sb2FkcygpIGNhbm5vdCBwcm9jZWVkIGJlY2F1c2UgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgbm90IGEgYnJvd3Nlci5cIik7dC5zdGFydHNXaXRoKGUuVVJMX1NDSEVNRSkmJih0PXQuc2xpY2UoZS5VUkxfU0NIRU1FLmxlbmd0aCkpLG51bGwhPXQmJjAhPT10Lmxlbmd0aHx8KHQ9REVGQVVMVF9GSUxFX05BTUVfUFJFRklYKSx0aGlzLm1vZGVsVG9wb2xvZ3lGaWxlTmFtZT10K0RFRkFVTFRfSlNPTl9FWFRFTlNJT05fTkFNRSx0aGlzLndlaWdodERhdGFGaWxlTmFtZT10K0RFRkFVTFRfV0VJR0hUX0RBVEFfRVhURU5TSU9OX05BTUV9cmV0dXJuIGUucHJvdG90eXBlLnNhdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgdCxuLHIsbyxhLGk7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24ocyl7aWYodD13aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbZS53ZWlnaHREYXRhXSx7dHlwZTpcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwifSkpLGUubW9kZWxUb3BvbG9neSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKXRocm93IG5ldyBFcnJvcihcIkRvd25sb2FkVHJpZ2dlci5zYXZlKCkgZG9lcyBub3Qgc3VwcG9ydCBzYXZpbmcgbW9kZWwgdG9wb2xvZ3kgaW4gYmluYXJ5IGZvcm1hdHMgeWV0LlwiKTtyZXR1cm4gbj1be3BhdGhzOltcIi4vXCIrdGhpcy53ZWlnaHREYXRhRmlsZU5hbWVdLHdlaWdodHM6ZS53ZWlnaHRTcGVjc31dLHI9e21vZGVsVG9wb2xvZ3k6ZS5tb2RlbFRvcG9sb2d5LHdlaWdodHNNYW5pZmVzdDpufSxvPXdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeShyKV0se3R5cGU6XCJhcHBsaWNhdGlvbi9qc29uXCJ9KSksKGE9bnVsbD09dGhpcy5qc29uQW5jaG9yP2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpOnRoaXMuanNvbkFuY2hvcikuZG93bmxvYWQ9dGhpcy5tb2RlbFRvcG9sb2d5RmlsZU5hbWUsYS5ocmVmPW8sYS5jbGljaygpLG51bGwhPWUud2VpZ2h0RGF0YSYmKChpPW51bGw9PXRoaXMud2VpZ2h0RGF0YUFuY2hvcj9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTp0aGlzLndlaWdodERhdGFBbmNob3IpLmRvd25sb2FkPXRoaXMud2VpZ2h0RGF0YUZpbGVOYW1lLGkuaHJlZj10LGkuY2xpY2soKSksWzIse21vZGVsQXJ0aWZhY3RzSW5mbzpnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OKGUpfV19KX0pfSxlLlVSTF9TQ0hFTUU9XCJkb3dubG9hZHM6Ly9cIixlfSgpLEJyb3dzZXJGaWxlcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYobnVsbD09ZXx8ZS5sZW5ndGg8MSl0aHJvdyBuZXcgRXJyb3IoXCJXaGVuIGNhbGxpbmcgYnJvd3NlckZpbGVzLCBhdCBsZWFzdCAxIGZpbGUgaXMgcmVxdWlyZWQsIGJ1dCByZWNlaXZlZCBcIitlKTt0aGlzLmZpbGVzPWV9cmV0dXJuIGUucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBlLHQsbj10aGlzO3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKHIpe3JldHVybiBlPXRoaXMuZmlsZXNbMF0sdD10aGlzLmZpbGVzLnNsaWNlKDEpLFsyLG5ldyBQcm9taXNlKGZ1bmN0aW9uKHIsbyl7dmFyIGE9bmV3IEZpbGVSZWFkZXI7YS5vbmxvYWQ9ZnVuY3Rpb24oYSl7dmFyIGk9SlNPTi5wYXJzZShhLnRhcmdldC5yZXN1bHQpLHM9aS5tb2RlbFRvcG9sb2d5O2lmKG51bGwhPXMpezA9PT10Lmxlbmd0aCYmcih7bW9kZWxUb3BvbG9neTpzfSk7dmFyIHU9aS53ZWlnaHRzTWFuaWZlc3Q7aWYobnVsbCE9dSl7dmFyIGw7dHJ5e2w9bi5jaGVja01hbmlmZXN0QW5kV2VpZ2h0RmlsZXModSx0KX1jYXRjaChlKXtyZXR1cm4gdm9pZCBvKGUpfXZhciBjPVtdLHA9W10sZD1bXTt1LmZvckVhY2goZnVuY3Rpb24oZSl7ZS5wYXRocy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3AucHVzaChlKSxkLnB1c2gobnVsbCl9KSxjLnB1c2guYXBwbHkoYyxlLndlaWdodHMpfSksdS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucGF0aHMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1uZXcgRmlsZVJlYWRlcjt0Lm9ubG9hZD1mdW5jdGlvbih0KXt2YXIgbj10LnRhcmdldC5yZXN1bHQsbz1wLmluZGV4T2YoZSk7ZFtvXT1uLC0xPT09ZC5pbmRleE9mKG51bGwpJiZyKHttb2RlbFRvcG9sb2d5OnMsd2VpZ2h0U3BlY3M6Yyx3ZWlnaHREYXRhOmNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzKGQpfSl9LHQub25lcnJvcj1mdW5jdGlvbih0KXtvKFwiRmFpbGVkIHRvIHdlaWdodHMgZGF0YSBmcm9tIGZpbGUgb2YgcGF0aCAnXCIrZStcIicuXCIpfSx0LnJlYWRBc0FycmF5QnVmZmVyKGxbZV0pfSl9KX1lbHNlIG8obmV3IEVycm9yKFwid2VpZ2h0TWFuaWZlc3QgZmllbGQgaXMgbWlzc2luZyBmcm9tIGZpbGUgXCIrZS5uYW1lKSl9ZWxzZSBvKG5ldyBFcnJvcihcIm1vZGVsVG9wb2xvZ3kgZmllbGQgaXMgbWlzc2luZyBmcm9tIGZpbGUgXCIrZS5uYW1lKSl9LGEub25lcnJvcj1mdW5jdGlvbih0KXtvKFwiRmFpbGVkIHRvIHJlYWQgbW9kZWwgdG9wb2xvZ3kgYW5kIHdlaWdodHMgbWFuaWZlc3QgSlNPTiBmcm9tIGZpbGUgJ1wiK2UubmFtZStcIicuIEJyb3dzZXJGaWxlcyBzdXBwb3J0cyBsb2FkaW5nIEtlcmFzLXN0eWxlIHRmLk1vZGVsIGFydGlmYWN0cyBvbmx5LlwiKX0sYS5yZWFkQXNUZXh0KGUpfSldfSl9KX0sZS5wcm90b3R5cGUuY2hlY2tNYW5pZmVzdEFuZFdlaWdodEZpbGVzPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVtdLHI9dC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGJhc2VuYW1lKGUubmFtZSl9KSxvPXt9LGE9MCxpPWU7YTxpLmxlbmd0aDthKyspe2lbYV0ucGF0aHMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgYT1iYXNlbmFtZShlKTtpZigtMSE9PW4uaW5kZXhPZihhKSl0aHJvdyBuZXcgRXJyb3IoXCJEdXBsaWNhdGUgZmlsZSBiYXNlbmFtZSBmb3VuZCBpbiB3ZWlnaHRzIG1hbmlmZXN0OiAnXCIrYStcIidcIik7aWYobi5wdXNoKGEpLC0xPT09ci5pbmRleE9mKGEpKXRocm93IG5ldyBFcnJvcihcIldlaWdodCBmaWxlIHdpdGggYmFzZW5hbWUgJ1wiK2ErXCInIGlzIG5vdCBwcm92aWRlZC5cIik7b1tlXT10W3IuaW5kZXhPZihhKV19KX1pZihuLmxlbmd0aCE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcIk1pc21hdGNoIGluIHRoZSBudW1iZXIgb2YgZmlsZXMgaW4gd2VpZ2h0cyBtYW5pZmVzdCAoXCIrbi5sZW5ndGgrXCIpIGFuZCB0aGUgbnVtYmVyIG9mIHdlaWdodCBmaWxlcyBwcm92aWRlZCAoXCIrdC5sZW5ndGgrXCIpLlwiKTtyZXR1cm4gb30sZX0oKSxicm93c2VyRG93bmxvYWRzUm91dGVyPWZ1bmN0aW9uKGUpe3JldHVybiBFTlYuZ2V0KFwiSVNfQlJPV1NFUlwiKSYmIUFycmF5LmlzQXJyYXkoZSkmJmUuc3RhcnRzV2l0aChCcm93c2VyRG93bmxvYWRzLlVSTF9TQ0hFTUUpP2Jyb3dzZXJEb3dubG9hZHMoZS5zbGljZShCcm93c2VyRG93bmxvYWRzLlVSTF9TQ0hFTUUubGVuZ3RoKSk6bnVsbH07ZnVuY3Rpb24gYnJvd3NlckRvd25sb2FkcyhlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9XCJtb2RlbFwiKSxuZXcgQnJvd3NlckRvd25sb2FkcyhlKX1mdW5jdGlvbiBicm93c2VyRmlsZXMoZSl7cmV0dXJuIG5ldyBCcm93c2VyRmlsZXMoZSl9ZnVuY3Rpb24gbG9hZFdlaWdodHNBc0FycmF5QnVmZmVyKGUsdCl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgbixyO3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKG8pe3N3aXRjaChvLmxhYmVsKXtjYXNlIDA6cmV0dXJuIG49ZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGZldGNoKGUsdCl9KSxbNCxQcm9taXNlLmFsbChuKV07Y2FzZSAxOnJldHVybiByPW8uc2VudCgpLFs0LFByb21pc2UuYWxsKHIubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmFycmF5QnVmZmVyKCl9KSldO2Nhc2UgMjpyZXR1cm5bMixvLnNlbnQoKV19fSl9KX1mdW5jdGlvbiBsb2FkV2VpZ2h0cyhlLHQsbixyKXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9XCJcIiksX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBvLGEsaSxzLHUsbCxjLHAsZCxoO3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKGYpe3N3aXRjaChmLmxhYmVsKXtjYXNlIDA6aWYobz1lLm1hcChmdW5jdGlvbigpe3JldHVybiExfSksYT17fSxpPW51bGwhPW4/bi5tYXAoZnVuY3Rpb24oKXtyZXR1cm4hMX0pOltdLHM9W10sZS5mb3JFYWNoKGZ1bmN0aW9uKGUsdCl7dmFyIHI9MDtlLndlaWdodHMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdT1cInF1YW50aXphdGlvblwiaW4gZT9lLnF1YW50aXphdGlvbi5kdHlwZTplLmR0eXBlLGw9RFRZUEVfVkFMVUVfU0laRV9NQVBbdV0qc2l6ZUZyb21TaGFwZShlLnNoYXBlKSxjPWZ1bmN0aW9uKCl7b1t0XT0hMCxudWxsPT1hW3RdJiYoYVt0XT1bXSksYVt0XS5wdXNoKHttYW5pZmVzdEVudHJ5OmUsZ3JvdXBPZmZzZXQ6cixzaXplQnl0ZXM6bH0pfTtudWxsIT1uP24uZm9yRWFjaChmdW5jdGlvbih0LG4pe3Q9PT1lLm5hbWUmJihjKCksaVtuXT0hMCl9KTpjKCkscy5wdXNoKGUubmFtZSkscis9bH0pfSksIWkuZXZlcnkoZnVuY3Rpb24oZSl7cmV0dXJuIGV9KSl0aHJvdyB1PW4uZmlsdGVyKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIWlbdF19KSxuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCB3ZWlnaHRzIGluIG1hbmlmZXN0IHdpdGggbmFtZXM6IFwiK3Uuam9pbihcIiwgXCIpK1wiLiBcXG5NYW5pZmVzdCBKU09OIGhhcyB3ZWlnaHRzIHdpdGggbmFtZXM6IFwiK3Muam9pbihcIiwgXCIpK1wiLlwiKTtyZXR1cm4gbD1vLnJlZHVjZShmdW5jdGlvbihlLHQsbil7cmV0dXJuIHQmJmUucHVzaChuKSxlfSxbXSksYz1bXSxsLmZvckVhY2goZnVuY3Rpb24obil7ZVtuXS5wYXRocy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBuPXQrKHQuZW5kc1dpdGgoXCIvXCIpP1wiXCI6XCIvXCIpK2U7Yy5wdXNoKG4pfSl9KSxbNCxsb2FkV2VpZ2h0c0FzQXJyYXlCdWZmZXIoYyxyKV07Y2FzZSAxOnJldHVybiBwPWYuc2VudCgpLGQ9e30saD0wLGwuZm9yRWFjaChmdW5jdGlvbih0KXtmb3IodmFyIG49ZVt0XS5wYXRocy5sZW5ndGgscj0wLG89MDtvPG47bysrKXIrPXBbaCtvXS5ieXRlTGVuZ3RoO2Zvcih2YXIgaT1uZXcgQXJyYXlCdWZmZXIocikscz1uZXcgVWludDhBcnJheShpKSx1PTAsbD0wO2w8bjtsKyspe3ZhciBjPW5ldyBVaW50OEFycmF5KHBbaCtsXSk7cy5zZXQoYyx1KSx1Kz1jLmJ5dGVMZW5ndGh9YVt0XS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWRlY29kZVdlaWdodHMoaS5zbGljZShlLmdyb3VwT2Zmc2V0LGUuZ3JvdXBPZmZzZXQrZS5zaXplQnl0ZXMpLFtlLm1hbmlmZXN0RW50cnldKTtmb3IodmFyIG4gaW4gdClkW25dPXRbbl19KSxoKz1ufSksWzIsZF19fSl9KX1JT1JvdXRlclJlZ2lzdHJ5LnJlZ2lzdGVyU2F2ZVJvdXRlcihicm93c2VyRG93bmxvYWRzUm91dGVyKTt2YXIgQnJvd3NlckhUVFBSZXF1ZXN0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2lmKHRoaXMuREVGQVVMVF9NRVRIT0Q9XCJQT1NUXCIsXCJ1bmRlZmluZWRcIj09dHlwZW9mIGZldGNoKXRocm93IG5ldyBFcnJvcihcImJyb3dzZXJIVFRQUmVxdWVzdCBpcyBub3Qgc3VwcG9ydGVkIG91dHNpZGUgdGhlIHdlYiBicm93c2VyIHdpdGhvdXQgYSBmZXRjaCBwb2x5ZmlsbC5cIik7aWYoYXNzZXJ0KG51bGwhPWUmJmUubGVuZ3RoPjAsXCJVUkwgcGF0aCBmb3IgYnJvd3NlckhUVFBSZXF1ZXN0IG11c3Qgbm90IGJlIG51bGwsIHVuZGVmaW5lZCBvciBlbXB0eS5cIiksQXJyYXkuaXNBcnJheShlKSYmYXNzZXJ0KDI9PT1lLmxlbmd0aCxcIlVSTCBwYXRocyBmb3IgYnJvd3NlckhUVFBSZXF1ZXN0IG11c3QgaGF2ZSBhIGxlbmd0aCBvZiAyLCAoYWN0dWFsIGxlbmd0aCBpcyBcIitlLmxlbmd0aCtcIikuXCIpLHRoaXMucGF0aD1lLG51bGwhPXQmJm51bGwhPXQuYm9keSl0aHJvdyBuZXcgRXJyb3IoXCJyZXF1ZXN0SW5pdCBpcyBleHBlY3RlZCB0byBoYXZlIG5vIHByZS1leGlzdGluZyBib2R5LCBidXQgaGFzIG9uZS5cIik7dGhpcy5yZXF1ZXN0SW5pdD10fHx7fX1yZXR1cm4gZS5wcm90b3R5cGUuc2F2ZT1mdW5jdGlvbihlKXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciB0LG4scixvO3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKGEpe3N3aXRjaChhLmxhYmVsKXtjYXNlIDA6aWYoZS5tb2RlbFRvcG9sb2d5IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpdGhyb3cgbmV3IEVycm9yKFwiQnJvd3NlckhUVFBSZXF1ZXN0LnNhdmUoKSBkb2VzIG5vdCBzdXBwb3J0IHNhdmluZyBtb2RlbCB0b3BvbG9neSBpbiBiaW5hcnkgZm9ybWF0cyB5ZXQuXCIpO3JldHVybih0PU9iamVjdC5hc3NpZ24oe21ldGhvZDp0aGlzLkRFRkFVTFRfTUVUSE9EfSx0aGlzLnJlcXVlc3RJbml0KSkuYm9keT1uZXcgRm9ybURhdGEsbj1be3BhdGhzOltcIi4vbW9kZWwud2VpZ2h0cy5iaW5cIl0sd2VpZ2h0czplLndlaWdodFNwZWNzfV0scj17bW9kZWxUb3BvbG9neTplLm1vZGVsVG9wb2xvZ3ksd2VpZ2h0c01hbmlmZXN0Om59LHQuYm9keS5hcHBlbmQoXCJtb2RlbC5qc29uXCIsbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KHIpXSx7dHlwZTpcImFwcGxpY2F0aW9uL2pzb25cIn0pLFwibW9kZWwuanNvblwiKSxudWxsIT1lLndlaWdodERhdGEmJnQuYm9keS5hcHBlbmQoXCJtb2RlbC53ZWlnaHRzLmJpblwiLG5ldyBCbG9iKFtlLndlaWdodERhdGFdLHt0eXBlOlwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCJ9KSxcIm1vZGVsLndlaWdodHMuYmluXCIpLFs0LGZldGNoKHRoaXMucGF0aCx0KV07Y2FzZSAxOmlmKDIwMD09PShvPWEuc2VudCgpKS5zdGF0dXMpcmV0dXJuWzIse21vZGVsQXJ0aWZhY3RzSW5mbzpnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OKGUpLHJlc3BvbnNlczpbb119XTt0aHJvdyBuZXcgRXJyb3IoXCJCcm93c2VySFRUUFJlcXVlc3Quc2F2ZSgpIGZhaWxlZCBkdWUgdG8gSFRUUCByZXNwb25zZSBzdGF0dXMgXCIrby5zdGF0dXMrXCIuXCIpfX0pfSl9LGUucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKGUpe3JldHVyblsyLEFycmF5LmlzQXJyYXkodGhpcy5wYXRoKT90aGlzLmxvYWRCaW5hcnlNb2RlbCgpOnRoaXMubG9hZEpTT05Nb2RlbCgpXX0pfSl9LGUucHJvdG90eXBlLmxvYWRCaW5hcnlUb3BvbG9neT1mdW5jdGlvbigpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24odCl7c3dpdGNoKHQubGFiZWwpe2Nhc2UgMDpyZXR1cm4gdC50cnlzLnB1c2goWzAsMywsNF0pLFs0LGZldGNoKHRoaXMucGF0aFswXSx0aGlzLnJlcXVlc3RJbml0KV07Y2FzZSAxOnJldHVybls0LHQuc2VudCgpLmFycmF5QnVmZmVyKCldO2Nhc2UgMjpyZXR1cm5bMix0LnNlbnQoKV07Y2FzZSAzOnRocm93IGU9dC5zZW50KCksbmV3IEVycm9yKHRoaXMucGF0aFswXStcIiBub3QgZm91bmQuIFwiK2UpO2Nhc2UgNDpyZXR1cm5bMl19fSl9KX0sZS5wcm90b3R5cGUubG9hZEJpbmFyeU1vZGVsPWZ1bmN0aW9uKCl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgZSx0LG4scixvLGEsaSxzO3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKHUpe3N3aXRjaCh1LmxhYmVsKXtjYXNlIDA6cmV0dXJuIGU9dGhpcy5sb2FkQmluYXJ5VG9wb2xvZ3koKSxbNCxmZXRjaCh0aGlzLnBhdGhbMV0sdGhpcy5yZXF1ZXN0SW5pdCldO2Nhc2UgMTpyZXR1cm4gdD11LnNlbnQoKSxbNCxQcm9taXNlLmFsbChbZSx0XSldO2Nhc2UgMjpyZXR1cm4gbj11LnNlbnQoKSxyPW5bMF0sWzQsblsxXS5qc29uKCldO2Nhc2UgMzpyZXR1cm4gbnVsbD09KG89dS5zZW50KCkpP1szLDVdOls0LHRoaXMubG9hZFdlaWdodHMobyldO2Nhc2UgNDpzPXUuc2VudCgpLGE9c1swXSxpPXNbMV0sdS5sYWJlbD01O2Nhc2UgNTpyZXR1cm5bMix7bW9kZWxUb3BvbG9neTpyLHdlaWdodFNwZWNzOmEsd2VpZ2h0RGF0YTppfV19fSl9KX0sZS5wcm90b3R5cGUubG9hZEpTT05Nb2RlbD1mdW5jdGlvbigpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsbyxhLGk7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24ocyl7c3dpdGNoKHMubGFiZWwpe2Nhc2UgMDpyZXR1cm5bNCxmZXRjaCh0aGlzLnBhdGgsdGhpcy5yZXF1ZXN0SW5pdCldO2Nhc2UgMTpyZXR1cm5bNCxzLnNlbnQoKS5qc29uKCldO2Nhc2UgMjppZihlPXMuc2VudCgpLHQ9ZS5tb2RlbFRvcG9sb2d5LG49ZS53ZWlnaHRzTWFuaWZlc3QsbnVsbD09dCYmbnVsbD09bil0aHJvdyBuZXcgRXJyb3IoXCJUaGUgSlNPTiBmcm9tIEhUVFAgcGF0aCBcIit0aGlzLnBhdGgrXCIgY29udGFpbnMgbmVpdGhlciBtb2RlbCB0b3BvbG9neSBvciBtYW5pZmVzdCBmb3Igd2VpZ2h0cy5cIik7cmV0dXJuIG51bGw9PW4/WzMsNF06KGE9ZS53ZWlnaHRzTWFuaWZlc3QsWzQsdGhpcy5sb2FkV2VpZ2h0cyhhKV0pO2Nhc2UgMzppPXMuc2VudCgpLHI9aVswXSxvPWlbMV0scy5sYWJlbD00O2Nhc2UgNDpyZXR1cm5bMix7bW9kZWxUb3BvbG9neTp0LHdlaWdodFNwZWNzOnIsd2VpZ2h0RGF0YTpvfV19fSl9KX0sZS5wcm90b3R5cGUubG9hZFdlaWdodHM9ZnVuY3Rpb24oZSl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgdCxuLHIsbyxhLGkscyx1LGw7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24oYyl7c3dpdGNoKGMubGFiZWwpe2Nhc2UgMDpmb3IodD1BcnJheS5pc0FycmF5KHRoaXMucGF0aCk/dGhpcy5wYXRoWzFdOnRoaXMucGF0aCxuPVtdLHI9MCxvPWU7cjxvLmxlbmd0aDtyKyspYT1vW3JdLG4ucHVzaC5hcHBseShuLGEud2VpZ2h0cyk7cmV0dXJuKGk9dC5zdWJzdHJpbmcoMCx0Lmxhc3RJbmRleE9mKFwiL1wiKSkpLmVuZHNXaXRoKFwiL1wiKXx8KGkrPVwiL1wiKSxzPVtdLGUuZm9yRWFjaChmdW5jdGlvbihlKXtlLnBhdGhzLmZvckVhY2goZnVuY3Rpb24oZSl7cy5wdXNoKGkrZSl9KX0pLHU9W25dLGw9Y29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnMsWzQsbG9hZFdlaWdodHNBc0FycmF5QnVmZmVyKHMsdGhpcy5yZXF1ZXN0SW5pdCldO2Nhc2UgMTpyZXR1cm5bMix1LmNvbmNhdChbbC5hcHBseSh2b2lkIDAsW2Muc2VudCgpXSldKV19fSl9KX0sZS5VUkxfU0NIRU1FX1JFR0VYPS9eaHR0cHM/OlxcL1xcLy8sZX0oKTtmdW5jdGlvbiBpc0hUVFBTY2hlbWUoZSl7cmV0dXJuIG51bGwhPWUubWF0Y2goQnJvd3NlckhUVFBSZXF1ZXN0LlVSTF9TQ0hFTUVfUkVHRVgpfXZhciBodHRwUmVxdWVzdFJvdXRlcj1mdW5jdGlvbihlKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgZmV0Y2gpcmV0dXJuIG51bGw7cmV0dXJuKEFycmF5LmlzQXJyYXkoZSk/ZS5ldmVyeShmdW5jdGlvbihlKXtyZXR1cm4gaXNIVFRQU2NoZW1lKGUpfSk6aXNIVFRQU2NoZW1lKGUpKT9icm93c2VySFRUUFJlcXVlc3QoZSk6bnVsbH07ZnVuY3Rpb24gYnJvd3NlckhUVFBSZXF1ZXN0KGUsdCl7cmV0dXJuIG5ldyBCcm93c2VySFRUUFJlcXVlc3QoZSx0KX1JT1JvdXRlclJlZ2lzdHJ5LnJlZ2lzdGVyU2F2ZVJvdXRlcihodHRwUmVxdWVzdFJvdXRlciksSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlckxvYWRSb3V0ZXIoaHR0cFJlcXVlc3RSb3V0ZXIpO3ZhciBQYXNzdGhyb3VnaExvYWRlcj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0LG4pe3RoaXMubW9kZWxUb3BvbG9neT1lLHRoaXMud2VpZ2h0U3BlY3M9dCx0aGlzLndlaWdodERhdGE9bn1yZXR1cm4gZS5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24odCl7cmV0dXJuIGU9e30sbnVsbCE9dGhpcy5tb2RlbFRvcG9sb2d5JiYoZT1fX2Fzc2lnbih7bW9kZWxUb3BvbG9neTp0aGlzLm1vZGVsVG9wb2xvZ3l9LGUpKSxudWxsIT10aGlzLndlaWdodFNwZWNzJiZ0aGlzLndlaWdodFNwZWNzLmxlbmd0aD4wJiYoZT1fX2Fzc2lnbih7d2VpZ2h0U3BlY3M6dGhpcy53ZWlnaHRTcGVjc30sZSkpLG51bGwhPXRoaXMud2VpZ2h0RGF0YSYmdGhpcy53ZWlnaHREYXRhLmJ5dGVMZW5ndGg+MCYmKGU9X19hc3NpZ24oe3dlaWdodERhdGE6dGhpcy53ZWlnaHREYXRhfSxlKSksWzIsZV19KX0pfSxlfSgpLFBhc3N0aHJvdWdoU2F2ZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RoaXMuc2F2ZUhhbmRsZXI9ZX1yZXR1cm4gZS5wcm90b3R5cGUuc2F2ZT1mdW5jdGlvbihlKXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKHQpe3JldHVyblsyLHRoaXMuc2F2ZUhhbmRsZXIoZSldfSl9KX0sZX0oKTtmdW5jdGlvbiBmcm9tTWVtb3J5KGUsdCxuKXtyZXR1cm4gbmV3IFBhc3N0aHJvdWdoTG9hZGVyKGUsdCxuKX1mdW5jdGlvbiB3aXRoU2F2ZUhhbmRsZXIoZSl7cmV0dXJuIG5ldyBQYXNzdGhyb3VnaFNhdmVyKGUpfXZhciByZWdpc3RlclNhdmVSb3V0ZXI9SU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlclNhdmVSb3V0ZXIscmVnaXN0ZXJMb2FkUm91dGVyPUlPUm91dGVyUmVnaXN0cnkucmVnaXN0ZXJMb2FkUm91dGVyLGdldFNhdmVIYW5kbGVycz1JT1JvdXRlclJlZ2lzdHJ5LmdldFNhdmVIYW5kbGVycyxnZXRMb2FkSGFuZGxlcnM9SU9Sb3V0ZXJSZWdpc3RyeS5nZXRMb2FkSGFuZGxlcnMsaW89T2JqZWN0LmZyZWV6ZSh7YnJvd3NlckZpbGVzOmJyb3dzZXJGaWxlcyxicm93c2VySFRUUFJlcXVlc3Q6YnJvd3NlckhUVFBSZXF1ZXN0LGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzOmNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzLGRlY29kZVdlaWdodHM6ZGVjb2RlV2VpZ2h0cyxlbmNvZGVXZWlnaHRzOmVuY29kZVdlaWdodHMsZnJvbU1lbW9yeTpmcm9tTWVtb3J5LGdldExvYWRIYW5kbGVyczpnZXRMb2FkSGFuZGxlcnMsZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTjpnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OLGdldFNhdmVIYW5kbGVyczpnZXRTYXZlSGFuZGxlcnMsbG9hZFdlaWdodHM6bG9hZFdlaWdodHMscmVnaXN0ZXJMb2FkUm91dGVyOnJlZ2lzdGVyTG9hZFJvdXRlcixyZWdpc3RlclNhdmVSb3V0ZXI6cmVnaXN0ZXJTYXZlUm91dGVyLHdpdGhTYXZlSGFuZGxlcjp3aXRoU2F2ZUhhbmRsZXIsY29weU1vZGVsOmNvcHlNb2RlbCxsaXN0TW9kZWxzOmxpc3RNb2RlbHMsbW92ZU1vZGVsOm1vdmVNb2RlbCxyZW1vdmVNb2RlbDpyZW1vdmVNb2RlbH0pLFNlcmlhbGl6YWJsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt9cmV0dXJuIGUucHJvdG90eXBlLmdldENsYXNzTmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLmNsYXNzTmFtZX0sZS5mcm9tQ29uZmlnPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBlKHQpfSxlfSgpLFNlcmlhbGl6YXRpb25NYXA9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dGhpcy5jbGFzc05hbWVNYXA9e319cmV0dXJuIGUuZ2V0TWFwPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWUuaW5zdGFuY2UmJihlLmluc3RhbmNlPW5ldyBlKSxlLmluc3RhbmNlfSxlLnJlZ2lzdGVyPWZ1bmN0aW9uKHQpe2UuZ2V0TWFwKCkuY2xhc3NOYW1lTWFwW3QuY2xhc3NOYW1lXT1bdCx0LmZyb21Db25maWddfSxlfSgpO2Z1bmN0aW9uIHJlZ2lzdGVyQ2xhc3MoZSl7YXNzZXJ0KG51bGwhPWUuY2xhc3NOYW1lLFwiQ2xhc3MgYmVpbmcgcmVnaXN0ZXJlZCBkb2VzIG5vdCBoYXZlIHRoZSBzdGF0aWMgY2xhc3NOYW1lIHByb3BlcnR5IGRlZmluZWQuXCIpLGFzc2VydChcInN0cmluZ1wiPT10eXBlb2YgZS5jbGFzc05hbWUsXCJjbGFzc05hbWUgaXMgcmVxdWlyZWQgdG8gYmUgYSBzdHJpbmcsIGJ1dCBnb3QgdHlwZSBcIit0eXBlb2YgZS5jbGFzc05hbWUpLGFzc2VydChlLmNsYXNzTmFtZS5sZW5ndGg+MCxcIkNsYXNzIGJlaW5nIHJlZ2lzdGVyZWQgaGFzIGFuIGVtcHR5LXN0cmluZyBhcyBpdHMgY2xhc3NOYW1lLCB3aGljaCBpcyBkaXNhbGxvd2VkLlwiKSxTZXJpYWxpemF0aW9uTWFwLnJlZ2lzdGVyKGUpfXZhciBzZXJpYWxpemF0aW9uPU9iamVjdC5mcmVlemUoe1NlcmlhbGl6YWJsZTpTZXJpYWxpemFibGUsU2VyaWFsaXphdGlvbk1hcDpTZXJpYWxpemF0aW9uTWFwLHJlZ2lzdGVyQ2xhc3M6cmVnaXN0ZXJDbGFzc30pLFdFQkdMX0VOVlM9e0hBU19XRUJHTDohMH0sTk9ERV9FTlZTPXtJU19OT0RFOiEwfSxDSFJPTUVfRU5WUz17SVNfQ0hST01FOiEwfSxCUk9XU0VSX0VOVlM9e0lTX0JST1dTRVI6ITB9LENQVV9FTlZTPXtIQVNfV0VCR0w6ITF9LEFMTF9FTlZTPXt9O2Z1bmN0aW9uIGV4cGVjdEFycmF5c0Nsb3NlKGUsdCxuKXtpZihudWxsPT1uJiYobj1FTlYuZ2V0KFwiVEVTVF9FUFNJTE9OXCIpKSxlIGluc3RhbmNlb2YgVGVuc29yfHx0IGluc3RhbmNlb2YgVGVuc29yKXtpZihlIGluc3RhbmNlb2YgVGVuc29yJiZ0IGluc3RhbmNlb2YgVGVuc29yKXtpZihlLmR0eXBlIT09dC5kdHlwZSl0aHJvdyBuZXcgRXJyb3IoXCJBcnJheXMgYXJlIG9mIGRpZmZlcmVudCB0eXBlIGFjdHVhbDogXCIrZS5kdHlwZStcIiB2cyBleHBlY3RlZDogXCIrdC5kdHlwZStcIi5cIik7aWYoIWFycmF5c0VxdWFsKGUuc2hhcGUsdC5zaGFwZSkpdGhyb3cgbmV3IEVycm9yKFwiQXJyYXlzIGFyZSBvZiBkaWZmZXJlbnQgc2hhcGUgYWN0dWFsOiBcIitlLnNoYXBlK1wiIHZzIGV4cGVjdGVkOiBcIit0LnNoYXBlK1wiLlwiKX19ZWxzZXt2YXIgcj1lLmNvbnN0cnVjdG9yLm5hbWUsbz10LmNvbnN0cnVjdG9yLm5hbWU7aWYociE9PW8pdGhyb3cgbmV3IEVycm9yKFwiQXJyYXlzIGFyZSBvZiBkaWZmZXJlbnQgdHlwZSBhY3R1YWw6IFwiK3IrXCIgdnMgZXhwZWN0ZWQ6IFwiK28pfXZhciBhLGk7aWYoYT1lIGluc3RhbmNlb2YgVGVuc29yP2UuZGF0YVN5bmMoKTplLGk9dCBpbnN0YW5jZW9mIFRlbnNvcj90LmRhdGFTeW5jKCk6dCxhLmxlbmd0aCE9PWkubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcIkFycmF5cyBoYXZlIGRpZmZlcmVudCBsZW5ndGhzIGFjdHVhbDogXCIrYS5sZW5ndGgrXCIgdnMgZXhwZWN0ZWQ6IFwiK2kubGVuZ3RoK1wiLlxcbkFjdHVhbDogICBcIithK1wiLlxcbkV4cGVjdGVkOiBcIitpK1wiLlwiKTtmb3IodmFyIHM9MDtzPGkubGVuZ3RoOysrcyl7dmFyIHU9YVtzXSxsPWlbc107aWYoIWFyZUNsb3NlKHUsTnVtYmVyKGwpLG4pKXRocm93IG5ldyBFcnJvcihcIkFycmF5cyBkaWZmZXI6IGFjdHVhbFtcIitzK1wiXSA9IFwiK3UrXCIsIGV4cGVjdGVkW1wiK3MrXCJdID0gXCIrbCtcIi5cXG5BY3R1YWw6ICAgXCIrYStcIi5cXG5FeHBlY3RlZDogXCIraStcIi5cIil9fWZ1bmN0aW9uIGV4cGVjdFByb21pc2VUb0ZhaWwoZSx0KXtlKCkudGhlbihmdW5jdGlvbigpe3JldHVybiB0LmZhaWwoKX0sZnVuY3Rpb24oKXtyZXR1cm4gdCgpfSl9ZnVuY3Rpb24gZXhwZWN0QXJyYXlzRXF1YWwoZSx0KXtyZXR1cm4gZXhwZWN0QXJyYXlzQ2xvc2UoZSx0LDApfWZ1bmN0aW9uIGV4cGVjdE51bWJlcnNDbG9zZShlLHQsbil7aWYobnVsbD09biYmKG49RU5WLmdldChcIlRFU1RfRVBTSUxPTlwiKSksIWFyZUNsb3NlKGUsdCxuKSl0aHJvdyBuZXcgRXJyb3IoXCJOdW1iZXJzIGRpZmZlcjogYWN0dWFsID09PSBcIitlK1wiLCBleHBlY3RlZCA9PT0gXCIrdCl9ZnVuY3Rpb24gYXJlQ2xvc2UoZSx0LG4pe3JldHVybiEoIWlzTmFOKGUpfHwhaXNOYU4odCkpfHwhKGlzTmFOKGUpfHxpc05hTih0KXx8TWF0aC5hYnMoZS10KT5uKX1mdW5jdGlvbiBleHBlY3RWYWx1ZXNJblJhbmdlKGUsdCxuKXt2YXIgcjtyPWUgaW5zdGFuY2VvZiBUZW5zb3I/ZS5kYXRhU3luYygpOmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspaWYocltvXTx0fHxyW29dPm4pdGhyb3cgbmV3IEVycm9yKFwiVmFsdWUgb3V0IG9mIHJhbmdlOlwiK3Jbb10rXCIgbG93OiBcIit0K1wiLCBoaWdoOiBcIituKX1mdW5jdGlvbiBleHBlY3RBcnJheUJ1ZmZlcnNFcXVhbChlLHQpe2V4cGVjdChuZXcgRmxvYXQzMkFycmF5KGUpKS50b0VxdWFsKG5ldyBGbG9hdDMyQXJyYXkodCkpfXZhciB0ZXN0X3V0aWw9T2JqZWN0LmZyZWV6ZSh7V0VCR0xfRU5WUzpXRUJHTF9FTlZTLE5PREVfRU5WUzpOT0RFX0VOVlMsQ0hST01FX0VOVlM6Q0hST01FX0VOVlMsQlJPV1NFUl9FTlZTOkJST1dTRVJfRU5WUyxDUFVfRU5WUzpDUFVfRU5WUyxBTExfRU5WUzpBTExfRU5WUyxleHBlY3RBcnJheXNDbG9zZTpleHBlY3RBcnJheXNDbG9zZSxleHBlY3RQcm9taXNlVG9GYWlsOmV4cGVjdFByb21pc2VUb0ZhaWwsZXhwZWN0QXJyYXlzRXF1YWw6ZXhwZWN0QXJyYXlzRXF1YWwsZXhwZWN0TnVtYmVyc0Nsb3NlOmV4cGVjdE51bWJlcnNDbG9zZSxleHBlY3RWYWx1ZXNJblJhbmdlOmV4cGVjdFZhbHVlc0luUmFuZ2UsZXhwZWN0QXJyYXlCdWZmZXJzRXF1YWw6ZXhwZWN0QXJyYXlCdWZmZXJzRXF1YWx9KSx2ZXJzaW9uPVwiMC4xMy42XCIsd2ViZ2w9T2JqZWN0LmZyZWV6ZSh7Z3BncHVfdXRpbDpncGdwdV91dGlsLHdlYmdsX3V0aWw6d2ViZ2xfdXRpbCxNYXRoQmFja2VuZFdlYkdMOk1hdGhCYWNrZW5kV2ViR0wsR1BHUFVDb250ZXh0OkdQR1BVQ29udGV4dH0pLE9wdGltaXplcj1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7cmV0dXJuIG51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUubWluaW1pemU9ZnVuY3Rpb24oZSx0LG4pe3ZvaWQgMD09PXQmJih0PSExKTt2YXIgcj10aGlzLmNvbXB1dGVHcmFkaWVudHMoZSxuKSxvPXIudmFsdWUsYT1yLmdyYWRzO3JldHVybiB0aGlzLmFwcGx5R3JhZGllbnRzKGEpLE9iamVjdC5rZXlzKGEpLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGFbZV0uZGlzcG9zZSgpfSksdD9vOihvLmRpc3Bvc2UoKSxudWxsKX0sdC5wcm90b3R5cGUuY29tcHV0ZUdyYWRpZW50cz1mdW5jdGlvbihlLHQpe3JldHVybiB2YXJpYWJsZUdyYWRzKGUsdCl9LHR9KFNlcmlhbGl6YWJsZSksQWRhZGVsdGFPcHRpbWl6ZXI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0LG4scil7dm9pZCAwPT09ciYmKHI9bnVsbCk7dmFyIG89ZS5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBvLmxlYXJuaW5nUmF0ZT10LG8ucmhvPW4sby5lcHNpbG9uPXIsby5hY2N1bXVsYXRlZEdyYWRzPXt9LG8uYWNjdW11bGF0ZWRVcGRhdGVzPXt9LG8uYz1rZWVwKHNjYWxhcigtdCkpLG8ucmhvU2NhbGFyPWtlZXAoc2NhbGFyKG4pKSxvLm9uZU1pbnVzUmhvPWtlZXAoc2NhbGFyKDEtbikpLG51bGw9PT1yJiYocj1FTlYuZ2V0KFwiRVBTSUxPTlwiKSksby5lcHNpbG9uU2NhbGFyPWtlZXAoc2NhbGFyKHIpKSxvfXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5hcHBseUdyYWRpZW50cz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLG49ZnVuY3Rpb24obil7dmFyIG89RU5WLmVuZ2luZS5yZWdpc3RlcmVkVmFyaWFibGVzW25dO2lmKG51bGw9PXIuYWNjdW11bGF0ZWRHcmFkc1tuXSl7dGlkeShmdW5jdGlvbigpe3QuYWNjdW11bGF0ZWRHcmFkc1tuXT16ZXJvc0xpa2UobykudmFyaWFibGUoITEpfSl9aWYobnVsbD09ci5hY2N1bXVsYXRlZFVwZGF0ZXNbbl0pe3RpZHkoZnVuY3Rpb24oKXt0LmFjY3VtdWxhdGVkVXBkYXRlc1tuXT16ZXJvc0xpa2UobykudmFyaWFibGUoITEpfSl9dmFyIGE9ZVtuXSxpPXIuYWNjdW11bGF0ZWRHcmFkc1tuXSxzPXIuYWNjdW11bGF0ZWRVcGRhdGVzW25dO3RpZHkoZnVuY3Rpb24oKXt2YXIgZT10LnJob1NjYWxhci5tdWwoaSkuYWRkKHQub25lTWludXNSaG8ubXVsKGEuc3F1YXJlKCkpKSxyPXMuYWRkKHQuZXBzaWxvblNjYWxhcikuc3FydCgpLmRpdihpLmFkZCh0LmVwc2lsb25TY2FsYXIpLnNxcnQoKSkubXVsKGEpLHU9dC5yaG9TY2FsYXIubXVsKHMpLmFkZCh0Lm9uZU1pbnVzUmhvLm11bChyLnNxdWFyZSgpKSk7dC5hY2N1bXVsYXRlZEdyYWRzW25dLmFzc2lnbihlKSx0LmFjY3VtdWxhdGVkVXBkYXRlc1tuXS5hc3NpZ24odSk7dmFyIGw9dC5jLm11bChyKS5hZGQobyk7by5hc3NpZ24obCl9KX0scj10aGlzO2Zvcih2YXIgbyBpbiBlKW4obyl9LHQucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuYy5kaXNwb3NlKCksdGhpcy5lcHNpbG9uU2NhbGFyLmRpc3Bvc2UoKSx0aGlzLnJob1NjYWxhci5kaXNwb3NlKCksdGhpcy5vbmVNaW51c1Joby5kaXNwb3NlKCksbnVsbCE9dGhpcy5hY2N1bXVsYXRlZFVwZGF0ZXMmJihPYmplY3Qua2V5cyh0aGlzLmFjY3VtdWxhdGVkVXBkYXRlcykuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gZS5hY2N1bXVsYXRlZFVwZGF0ZXNbdF0uZGlzcG9zZSgpfSksT2JqZWN0LmtleXModGhpcy5hY2N1bXVsYXRlZEdyYWRzKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmFjY3VtdWxhdGVkR3JhZHNbdF0uZGlzcG9zZSgpfSkpfSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXtyZXR1cm57bGVhcm5pbmdSYXRlOnRoaXMubGVhcm5pbmdSYXRlLHJobzp0aGlzLnJobyxlcHNpbG9uOnRoaXMuZXBzaWxvbn19LHQuZnJvbUNvbmZpZz1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgZSh0LmxlYXJuaW5nUmF0ZSx0LnJobyx0LmVwc2lsb24pfSx0LmNsYXNzTmFtZT1cIkFkYWRlbHRhT3B0aW1pemVyXCIsdH0oT3B0aW1pemVyKTtyZWdpc3RlckNsYXNzKEFkYWRlbHRhT3B0aW1pemVyKTt2YXIgQWRhZ3JhZE9wdGltaXplcj1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQsbil7dm9pZCAwPT09biYmKG49LjEpO3ZhciByPWUuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gci5sZWFybmluZ1JhdGU9dCxyLmluaXRpYWxBY2N1bXVsYXRvclZhbHVlPW4sci5hY2N1bXVsYXRlZEdyYWRzPXt9LHIuYz1rZWVwKHNjYWxhcigtdCkpLHIuZXBzaWxvbj1rZWVwKHNjYWxhcihFTlYuZ2V0KFwiRVBTSUxPTlwiKSkpLHJ9cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmFwcGx5R3JhZGllbnRzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1mdW5jdGlvbihuKXt2YXIgbz1FTlYuZW5naW5lLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbl07aWYobnVsbD09ci5hY2N1bXVsYXRlZEdyYWRzW25dKXt0aWR5KGZ1bmN0aW9uKCl7dC5hY2N1bXVsYXRlZEdyYWRzW25dPWZpbGwoby5zaGFwZSx0LmluaXRpYWxBY2N1bXVsYXRvclZhbHVlKS52YXJpYWJsZSghMSl9KX12YXIgYT1lW25dLGk9ci5hY2N1bXVsYXRlZEdyYWRzW25dO3RpZHkoZnVuY3Rpb24oKXt2YXIgZT1pLmFkZChhLnNxdWFyZSgpKTt0LmFjY3VtdWxhdGVkR3JhZHNbbl0uYXNzaWduKGUpO3ZhciByPXQuYy5tdWwoYS5kaXYoZS5hZGQodC5lcHNpbG9uKS5zcXJ0KCkpKS5hZGQobyk7by5hc3NpZ24ocil9KX0scj10aGlzO2Zvcih2YXIgbyBpbiBlKW4obyl9LHQucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuZXBzaWxvbi5kaXNwb3NlKCksdGhpcy5jLmRpc3Bvc2UoKSxudWxsIT10aGlzLmFjY3VtdWxhdGVkR3JhZHMmJk9iamVjdC5rZXlzKHRoaXMuYWNjdW11bGF0ZWRHcmFkcykuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gZS5hY2N1bXVsYXRlZEdyYWRzW3RdLmRpc3Bvc2UoKX0pfSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXtyZXR1cm57bGVhcm5pbmdSYXRlOnRoaXMubGVhcm5pbmdSYXRlLGluaXRpYWxBY2N1bXVsYXRvclZhbHVlOnRoaXMuaW5pdGlhbEFjY3VtdWxhdG9yVmFsdWV9fSx0LmZyb21Db25maWc9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IGUodC5sZWFybmluZ1JhdGUsdC5pbml0aWFsQWNjdW11bGF0b3JWYWx1ZSl9LHQuY2xhc3NOYW1lPVwiQWRhZ3JhZE9wdGltaXplclwiLHR9KE9wdGltaXplcik7cmVnaXN0ZXJDbGFzcyhBZGFncmFkT3B0aW1pemVyKTt2YXIgQWRhbU9wdGltaXplcj1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQsbixyLG8pe3ZvaWQgMD09PW8mJihvPW51bGwpO3ZhciBhPWUuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gYS5sZWFybmluZ1JhdGU9dCxhLmJldGExPW4sYS5iZXRhMj1yLGEuZXBzaWxvbj1vLGEuYWNjdW11bGF0ZWRGaXJzdE1vbWVudD17fSxhLmFjY3VtdWxhdGVkU2Vjb25kTW9tZW50PXt9LGEuYz1rZWVwKHNjYWxhcigtdCkpLGEuYmV0YTFTY2FsYXI9a2VlcChzY2FsYXIobikpLGEuYmV0YTJTY2FsYXI9a2VlcChzY2FsYXIocikpLHRpZHkoZnVuY3Rpb24oKXthLmFjY0JldGExPXNjYWxhcihuKS52YXJpYWJsZSgpLGEuYWNjQmV0YTI9c2NhbGFyKHIpLnZhcmlhYmxlKCl9KSxhLm9uZU1pbnVzQmV0YTE9a2VlcChzY2FsYXIoMS1uKSksYS5vbmVNaW51c0JldGEyPWtlZXAoc2NhbGFyKDEtcikpLGEub25lPWtlZXAoc2NhbGFyKDEpKSxudWxsPT09byYmKG89RU5WLmdldChcIkVQU0lMT05cIikpLGEuZXBzU2NhbGFyPWtlZXAoc2NhbGFyKG8pKSxhfXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5hcHBseUdyYWRpZW50cz1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3RpZHkoZnVuY3Rpb24oKXt2YXIgbj10Lm9uZS5zdWIodC5hY2NCZXRhMSkscj10Lm9uZS5zdWIodC5hY2NCZXRhMik7Zm9yKHZhciBvIGluIGUpe3ZhciBhPUVOVi5lbmdpbmUucmVnaXN0ZXJlZFZhcmlhYmxlc1tvXTtpZihudWxsPT10LmFjY3VtdWxhdGVkRmlyc3RNb21lbnRbb10pe3ZhciBpPSExO3QuYWNjdW11bGF0ZWRGaXJzdE1vbWVudFtvXT16ZXJvc0xpa2UoYSkudmFyaWFibGUoaSl9aWYobnVsbD09dC5hY2N1bXVsYXRlZFNlY29uZE1vbWVudFtvXSl7aT0hMTt0LmFjY3VtdWxhdGVkU2Vjb25kTW9tZW50W29dPXplcm9zTGlrZShhKS52YXJpYWJsZShpKX12YXIgcz1lW29dLHU9dC5hY2N1bXVsYXRlZEZpcnN0TW9tZW50W29dLGw9dC5hY2N1bXVsYXRlZFNlY29uZE1vbWVudFtvXSxjPXQuYmV0YTFTY2FsYXIubXVsKHUpLmFkZCh0Lm9uZU1pbnVzQmV0YTEubXVsKHMpKSxwPXQuYmV0YTJTY2FsYXIubXVsKGwpLmFkZCh0Lm9uZU1pbnVzQmV0YTIubXVsKHMuc3F1YXJlKCkpKSxkPWMuZGl2KG4pLGg9cC5kaXYocik7dC5hY2N1bXVsYXRlZEZpcnN0TW9tZW50W29dLmFzc2lnbihjKSx0LmFjY3VtdWxhdGVkU2Vjb25kTW9tZW50W29dLmFzc2lnbihwKTt2YXIgZj10LmMubXVsKGQuZGl2KHQuZXBzU2NhbGFyLmFkZChoLnNxcnQoKSkpKS5hZGQoYSk7YS5hc3NpZ24oZil9dC5hY2NCZXRhMS5hc3NpZ24odC5hY2NCZXRhMS5tdWwodC5iZXRhMVNjYWxhcikpLHQuYWNjQmV0YTIuYXNzaWduKHQuYWNjQmV0YTIubXVsKHQuYmV0YTJTY2FsYXIpKX0pfSx0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmMuZGlzcG9zZSgpLHRoaXMuZXBzU2NhbGFyLmRpc3Bvc2UoKSx0aGlzLmJldGExU2NhbGFyLmRpc3Bvc2UoKSx0aGlzLmJldGEyU2NhbGFyLmRpc3Bvc2UoKSx0aGlzLmFjY0JldGExLmRpc3Bvc2UoKSx0aGlzLmFjY0JldGEyLmRpc3Bvc2UoKSx0aGlzLm9uZU1pbnVzQmV0YTEuZGlzcG9zZSgpLHRoaXMub25lTWludXNCZXRhMi5kaXNwb3NlKCksdGhpcy5vbmUuZGlzcG9zZSgpLG51bGwhPXRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudCYmT2JqZWN0LmtleXModGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50KS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmFjY3VtdWxhdGVkRmlyc3RNb21lbnRbdF0uZGlzcG9zZSgpfSksbnVsbCE9dGhpcy5hY2N1bXVsYXRlZFNlY29uZE1vbWVudCYmT2JqZWN0LmtleXModGhpcy5hY2N1bXVsYXRlZFNlY29uZE1vbWVudCkuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gZS5hY2N1bXVsYXRlZFNlY29uZE1vbWVudFt0XS5kaXNwb3NlKCl9KX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7cmV0dXJue2xlYXJuaW5nUmF0ZTp0aGlzLmxlYXJuaW5nUmF0ZSxiZXRhMTp0aGlzLmJldGExLGJldGEyOnRoaXMuYmV0YTIsZXBzaWxvbjp0aGlzLmVwc2lsb259fSx0LmZyb21Db25maWc9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IGUodC5sZWFybmluZ1JhdGUsdC5iZXRhMSx0LmJldGEyLHQuZXBzaWxvbil9LHQuY2xhc3NOYW1lPVwiQWRhbU9wdGltaXplclwiLHR9KE9wdGltaXplcik7cmVnaXN0ZXJDbGFzcyhBZGFtT3B0aW1pemVyKTt2YXIgQWRhbWF4T3B0aW1pemVyPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCxuLHIsbyxhKXt2b2lkIDA9PT1vJiYobz1udWxsKSx2b2lkIDA9PT1hJiYoYT0wKTt2YXIgaT1lLmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIGkubGVhcm5pbmdSYXRlPXQsaS5iZXRhMT1uLGkuYmV0YTI9cixpLmVwc2lsb249byxpLmRlY2F5PWEsaS5hY2N1bXVsYXRlZEZpcnN0TW9tZW50PXt9LGkuYWNjdW11bGF0ZWRXZWlnaHRlZEluZk5vcm09e30saS5jPWtlZXAoc2NhbGFyKC10KSksaS5iZXRhMVNjYWxhcj1rZWVwKHNjYWxhcihuKSksaS5iZXRhMlNjYWxhcj1rZWVwKHNjYWxhcihyKSksaS5kZWNheVNjYWxhcj1rZWVwKHNjYWxhcihhKSksdGlkeShmdW5jdGlvbigpe2kuaXRlcmF0aW9uPXNjYWxhcigwKS52YXJpYWJsZSgpLGkuYWNjQmV0YTE9c2NhbGFyKG4pLnZhcmlhYmxlKCl9KSxpLm9uZU1pbnVzQmV0YTE9a2VlcChzY2FsYXIoMS1uKSksaS5vbmU9a2VlcChzY2FsYXIoMSkpLG51bGw9PT1vJiYobz1FTlYuZ2V0KFwiRVBTSUxPTlwiKSksaS5lcHNTY2FsYXI9a2VlcChzY2FsYXIobykpLGl9cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmFwcGx5R3JhZGllbnRzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGlkeShmdW5jdGlvbigpe3ZhciBuPXQub25lLnN1Yih0LmFjY0JldGExKSxyPXQuYy5kaXYodC5vbmUuYWRkKHQuZGVjYXlTY2FsYXIubXVsKHQuaXRlcmF0aW9uKSkpO2Zvcih2YXIgbyBpbiBlKXt2YXIgYT1FTlYuZW5naW5lLnJlZ2lzdGVyZWRWYXJpYWJsZXNbb107aWYobnVsbD09dC5hY2N1bXVsYXRlZEZpcnN0TW9tZW50W29dKXt2YXIgaT0hMTt0LmFjY3VtdWxhdGVkRmlyc3RNb21lbnRbb109emVyb3NMaWtlKGEpLnZhcmlhYmxlKGkpfWlmKG51bGw9PXQuYWNjdW11bGF0ZWRXZWlnaHRlZEluZk5vcm1bb10pe2k9ITE7dC5hY2N1bXVsYXRlZFdlaWdodGVkSW5mTm9ybVtvXT16ZXJvc0xpa2UoYSkudmFyaWFibGUoaSl9dmFyIHM9ZVtvXSx1PXQuYWNjdW11bGF0ZWRGaXJzdE1vbWVudFtvXSxsPXQuYWNjdW11bGF0ZWRXZWlnaHRlZEluZk5vcm1bb10sYz10LmJldGExU2NhbGFyLm11bCh1KS5hZGQodC5vbmVNaW51c0JldGExLm11bChzKSkscD10LmJldGEyU2NhbGFyLm11bChsKSxkPXMuYWJzKCksaD1wLm1heGltdW0oZCk7dC5hY2N1bXVsYXRlZEZpcnN0TW9tZW50W29dLmFzc2lnbihjKSx0LmFjY3VtdWxhdGVkV2VpZ2h0ZWRJbmZOb3JtW29dLmFzc2lnbihoKTt2YXIgZj1yLmRpdihuKS5tdWwoYy5kaXYodC5lcHNTY2FsYXIuYWRkKGgpKSkuYWRkKGEpO2EuYXNzaWduKGYpfXQuaXRlcmF0aW9uLmFzc2lnbih0Lml0ZXJhdGlvbi5hZGQodC5vbmUpKSx0LmFjY0JldGExLmFzc2lnbih0LmFjY0JldGExLm11bCh0LmJldGExU2NhbGFyKSl9KX0sdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5jLmRpc3Bvc2UoKSx0aGlzLmVwc1NjYWxhci5kaXNwb3NlKCksdGhpcy5hY2NCZXRhMS5kaXNwb3NlKCksdGhpcy5iZXRhMVNjYWxhci5kaXNwb3NlKCksdGhpcy5iZXRhMlNjYWxhci5kaXNwb3NlKCksdGhpcy5vbmVNaW51c0JldGExLmRpc3Bvc2UoKSx0aGlzLmRlY2F5U2NhbGFyLmRpc3Bvc2UoKSx0aGlzLml0ZXJhdGlvbi5kaXNwb3NlKCksdGhpcy5vbmUuZGlzcG9zZSgpLG51bGwhPXRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudCYmT2JqZWN0LmtleXModGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50KS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmFjY3VtdWxhdGVkRmlyc3RNb21lbnRbdF0uZGlzcG9zZSgpfSksbnVsbCE9dGhpcy5hY2N1bXVsYXRlZFdlaWdodGVkSW5mTm9ybSYmT2JqZWN0LmtleXModGhpcy5hY2N1bXVsYXRlZFdlaWdodGVkSW5mTm9ybSkuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gZS5hY2N1bXVsYXRlZFdlaWdodGVkSW5mTm9ybVt0XS5kaXNwb3NlKCl9KX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7cmV0dXJue2xlYXJuaW5nUmF0ZTp0aGlzLmxlYXJuaW5nUmF0ZSxiZXRhMTp0aGlzLmJldGExLGJldGEyOnRoaXMuYmV0YTIsZXBzaWxvbjp0aGlzLmVwc2lsb24sZGVjYXk6dGhpcy5kZWNheX19LHQuZnJvbUNvbmZpZz1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgZSh0LmxlYXJuaW5nUmF0ZSx0LmJldGExLHQuYmV0YTIsdC5lcHNpbG9uLHQuZGVjYXkpfSx0LmNsYXNzTmFtZT1cIkFkYW1heE9wdGltaXplclwiLHR9KE9wdGltaXplcik7cmVnaXN0ZXJDbGFzcyhBZGFtYXhPcHRpbWl6ZXIpO3ZhciBTR0RPcHRpbWl6ZXI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4ubGVhcm5pbmdSYXRlPXQsbi5zZXRMZWFybmluZ1JhdGUodCksbn1yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuYXBwbHlHcmFkaWVudHM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3ZhciByPWVbbl0sbz1FTlYuZW5naW5lLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbl07dGlkeShmdW5jdGlvbigpe3ZhciBlPXQuYy5tdWwocikuYWRkKG8pO28uYXNzaWduKGUpfSl9KX0sdC5wcm90b3R5cGUuc2V0TGVhcm5pbmdSYXRlPWZ1bmN0aW9uKGUpe3RoaXMubGVhcm5pbmdSYXRlPWUsbnVsbCE9dGhpcy5jJiZ0aGlzLmMuZGlzcG9zZSgpLHRoaXMuYz1rZWVwKHNjYWxhcigtZSkpfSx0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5jLmRpc3Bvc2UoKX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7cmV0dXJue2xlYXJuaW5nUmF0ZTp0aGlzLmxlYXJuaW5nUmF0ZX19LHQuZnJvbUNvbmZpZz1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgZSh0LmxlYXJuaW5nUmF0ZSl9LHQuY2xhc3NOYW1lPVwiU0dET3B0aW1pemVyXCIsdH0oT3B0aW1pemVyKTtyZWdpc3RlckNsYXNzKFNHRE9wdGltaXplcik7dmFyIE1vbWVudHVtT3B0aW1pemVyPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCxuLHIpe3ZvaWQgMD09PXImJihyPSExKTt2YXIgbz1lLmNhbGwodGhpcyx0KXx8dGhpcztyZXR1cm4gby5sZWFybmluZ1JhdGU9dCxvLm1vbWVudHVtPW4sby51c2VOZXN0ZXJvdj1yLG8ubT1zY2FsYXIoby5tb21lbnR1bSksby5hY2N1bXVsYXRpb25zPXt9LG99cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmFwcGx5R3JhZGllbnRzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1mdW5jdGlvbihuKXt2YXIgbz1FTlYuZW5naW5lLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbl07aWYobnVsbD09ci5hY2N1bXVsYXRpb25zW25dKXt0aWR5KGZ1bmN0aW9uKCl7dC5hY2N1bXVsYXRpb25zW25dPXplcm9zTGlrZShvKS52YXJpYWJsZSghMSl9KX12YXIgYT1yLmFjY3VtdWxhdGlvbnNbbl0saT1lW25dO3RpZHkoZnVuY3Rpb24oKXt2YXIgZSxyPXQubS5tdWwoYSkuYWRkKGkpO2U9dC51c2VOZXN0ZXJvdj90LmMubXVsKGkuYWRkKHIubXVsKHQubSkpKS5hZGQobyk6dC5jLm11bChyKS5hZGQobyksdC5hY2N1bXVsYXRpb25zW25dLmFzc2lnbihyKSxvLmFzc2lnbihlKX0pfSxyPXRoaXM7Zm9yKHZhciBvIGluIGUpbihvKX0sdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe2lmKGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLm0uZGlzcG9zZSgpLG51bGwhPXRoaXMuYWNjdW11bGF0aW9ucylmb3IodmFyIHQgaW4gdGhpcy5hY2N1bXVsYXRpb25zKXRoaXMuYWNjdW11bGF0aW9uc1t0XS5kaXNwb3NlKCl9LHQucHJvdG90eXBlLnNldE1vbWVudHVtPWZ1bmN0aW9uKGUpe3RoaXMubW9tZW50dW09ZX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7cmV0dXJue2xlYXJuaW5nUmF0ZTp0aGlzLmxlYXJuaW5nUmF0ZSxtb21lbnR1bTp0aGlzLm1vbWVudHVtLHVzZU5lc3Rlcm92OnRoaXMudXNlTmVzdGVyb3Z9fSx0LmZyb21Db25maWc9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IGUodC5sZWFybmluZ1JhdGUsdC5tb21lbnR1bSx0LnVzZU5lc3Rlcm92KX0sdC5jbGFzc05hbWU9XCJNb21lbnR1bU9wdGltaXplclwiLHR9KFNHRE9wdGltaXplcik7cmVnaXN0ZXJDbGFzcyhNb21lbnR1bU9wdGltaXplcik7dmFyIFJNU1Byb3BPcHRpbWl6ZXI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0LG4scixvLGEpe3ZvaWQgMD09PW4mJihuPS45KSx2b2lkIDA9PT1yJiYocj0wKSx2b2lkIDA9PT1vJiYobz1udWxsKSx2b2lkIDA9PT1hJiYoYT0hMSk7dmFyIGk9ZS5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBpLmxlYXJuaW5nUmF0ZT10LGkuZGVjYXk9bixpLm1vbWVudHVtPXIsaS5lcHNpbG9uPW8saS5hY2N1bXVsYXRlZE1lYW5TcXVhcmVzPXt9LGkuYWNjdW11bGF0ZWRNZWFuR3JhZHM9e30saS5hY2N1bXVsYXRlZE1vbWVudHM9e30saS5jPWtlZXAoc2NhbGFyKHQpKSxpLmRlY2F5U2NhbGFyPWtlZXAoc2NhbGFyKG4pKSxpLm1vbWVudHVtU2NhbGFyPWtlZXAoc2NhbGFyKHIpKSxpLm9uZU1pbnVzRGVjYXk9a2VlcChzY2FsYXIoMS1uKSksaS5jZW50ZXJlZD1hLG51bGw9PT1vJiYobz1FTlYuZ2V0KFwiRVBTSUxPTlwiKSksaS5lcHNpbG9uU2NhbGFyPWtlZXAoc2NhbGFyKG8pKSxpfXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5hcHBseUdyYWRpZW50cz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLG49ZnVuY3Rpb24obil7dmFyIG89RU5WLmVuZ2luZS5yZWdpc3RlcmVkVmFyaWFibGVzW25dO2lmKG51bGw9PXIuYWNjdW11bGF0ZWRNZWFuU3F1YXJlc1tuXSl7dGlkeShmdW5jdGlvbigpe3QuYWNjdW11bGF0ZWRNZWFuU3F1YXJlc1tuXT16ZXJvc0xpa2UobykudmFyaWFibGUoITEpfSl9aWYobnVsbD09ci5hY2N1bXVsYXRlZE1lYW5HcmFkc1tuXSYmci5jZW50ZXJlZCl7dGlkeShmdW5jdGlvbigpe3QuYWNjdW11bGF0ZWRNZWFuR3JhZHNbbl09emVyb3NMaWtlKG8pLnZhcmlhYmxlKCExKX0pfWlmKG51bGw9PXIuYWNjdW11bGF0ZWRNb21lbnRzW25dKXt0aWR5KGZ1bmN0aW9uKCl7dC5hY2N1bXVsYXRlZE1vbWVudHNbbl09emVyb3NMaWtlKG8pLnZhcmlhYmxlKCExKX0pfXZhciBhPXIuYWNjdW11bGF0ZWRNZWFuU3F1YXJlc1tuXSxpPXIuYWNjdW11bGF0ZWRNZWFuR3JhZHNbbl0scz1yLmFjY3VtdWxhdGVkTW9tZW50c1tuXSx1PWVbbl07dGlkeShmdW5jdGlvbigpe3ZhciBlPXQuZGVjYXlTY2FsYXIubXVsKGEpLmFkZCh0Lm9uZU1pbnVzRGVjYXkubXVsKHUuc3F1YXJlKCkpKTtpZih0LmNlbnRlcmVkKXt2YXIgcj10LmRlY2F5U2NhbGFyLm11bChpKS5hZGQodC5vbmVNaW51c0RlY2F5Lm11bCh1KSksbD10Lm1vbWVudHVtU2NhbGFyLm11bChzKS5hZGQodC5jLm11bCh1KS5kaXYoZS5zdWIoci5zcXVhcmUoKS5hZGQodC5lcHNpbG9uU2NhbGFyKSkuc3FydCgpKSk7dC5hY2N1bXVsYXRlZE1lYW5TcXVhcmVzW25dLmFzc2lnbihlKSx0LmFjY3VtdWxhdGVkTWVhbkdyYWRzW25dLmFzc2lnbihyKSx0LmFjY3VtdWxhdGVkTW9tZW50c1tuXS5hc3NpZ24obCk7dmFyIGM9by5zdWIobCk7by5hc3NpZ24oYyl9ZWxzZXt2YXIgcD10LmRlY2F5U2NhbGFyLm11bChhKS5hZGQodC5vbmVNaW51c0RlY2F5Lm11bCh1LnNxdWFyZSgpKSk7bD10Lm1vbWVudHVtU2NhbGFyLm11bChzKS5hZGQodC5jLm11bCh1KS5kaXYocC5hZGQodC5lcHNpbG9uU2NhbGFyKS5zcXJ0KCkpKTt0LmFjY3VtdWxhdGVkTWVhblNxdWFyZXNbbl0uYXNzaWduKHApLHQuYWNjdW11bGF0ZWRNb21lbnRzW25dLmFzc2lnbihsKTtjPW8uc3ViKGwpO28uYXNzaWduKGMpfX0pfSxyPXRoaXM7Zm9yKHZhciBvIGluIGUpbihvKX0sdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5jLmRpc3Bvc2UoKSx0aGlzLmVwc2lsb25TY2FsYXIuZGlzcG9zZSgpLHRoaXMuZGVjYXlTY2FsYXIuZGlzcG9zZSgpLHRoaXMubW9tZW50dW1TY2FsYXIuZGlzcG9zZSgpLHRoaXMub25lTWludXNEZWNheS5kaXNwb3NlKCksbnVsbCE9dGhpcy5hY2N1bXVsYXRlZE1lYW5TcXVhcmVzJiZPYmplY3Qua2V5cyh0aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXMpLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGUuYWNjdW11bGF0ZWRNZWFuU3F1YXJlc1t0XS5kaXNwb3NlKCl9KSxudWxsIT10aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzJiZ0aGlzLmNlbnRlcmVkJiZPYmplY3Qua2V5cyh0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmFjY3VtdWxhdGVkTWVhbkdyYWRzW3RdLmRpc3Bvc2UoKX0pLG51bGwhPXRoaXMuYWNjdW11bGF0ZWRNb21lbnRzJiZPYmplY3Qua2V5cyh0aGlzLmFjY3VtdWxhdGVkTW9tZW50cykuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gZS5hY2N1bXVsYXRlZE1vbWVudHNbdF0uZGlzcG9zZSgpfSl9LHQucHJvdG90eXBlLmdldENvbmZpZz1mdW5jdGlvbigpe3JldHVybntsZWFybmluZ1JhdGU6dGhpcy5sZWFybmluZ1JhdGUsZGVjYXk6dGhpcy5kZWNheSxtb21lbnR1bTp0aGlzLm1vbWVudHVtLGVwc2lsb246dGhpcy5lcHNpbG9uLGNlbnRlcmVkOnRoaXMuY2VudGVyZWR9fSx0LmZyb21Db25maWc9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IGUodC5sZWFybmluZ1JhdGUsdC5kZWNheSx0Lm1vbWVudHVtLHQuZXBzaWxvbix0LmNlbnRlcmVkKX0sdC5jbGFzc05hbWU9XCJSTVNQcm9wT3B0aW1pemVyXCIsdH0oT3B0aW1pemVyKTtyZWdpc3RlckNsYXNzKFJNU1Byb3BPcHRpbWl6ZXIpO3ZhciBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7fXJldHVybiBlLnNnZD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFNHRE9wdGltaXplcihlKX0sZS5tb21lbnR1bT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPSExKSxuZXcgTW9tZW50dW1PcHRpbWl6ZXIoZSx0LG4pfSxlLnJtc3Byb3A9ZnVuY3Rpb24oZSx0LG4scixvKXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9LjkpLHZvaWQgMD09PW4mJihuPTApLHZvaWQgMD09PXImJihyPW51bGwpLHZvaWQgMD09PW8mJihvPSExKSxuZXcgUk1TUHJvcE9wdGltaXplcihlLHQsbixyLG8pfSxlLmFkYW09ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHZvaWQgMD09PWUmJihlPS4wMDEpLHZvaWQgMD09PXQmJih0PS45KSx2b2lkIDA9PT1uJiYobj0uOTk5KSx2b2lkIDA9PT1yJiYocj1udWxsKSxuZXcgQWRhbU9wdGltaXplcihlLHQsbixyKX0sZS5hZGFkZWx0YT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHZvaWQgMD09PWUmJihlPS4wMDEpLHZvaWQgMD09PXQmJih0PS45NSksdm9pZCAwPT09biYmKG49bnVsbCksbmV3IEFkYWRlbHRhT3B0aW1pemVyKGUsdCxuKX0sZS5hZGFtYXg9ZnVuY3Rpb24oZSx0LG4scixvKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9LjAwMiksdm9pZCAwPT09dCYmKHQ9LjkpLHZvaWQgMD09PW4mJihuPS45OTkpLHZvaWQgMD09PXImJihyPW51bGwpLHZvaWQgMD09PW8mJihvPTApLG5ldyBBZGFtYXhPcHRpbWl6ZXIoZSx0LG4scixvKX0sZS5hZGFncmFkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PS4xKSxuZXcgQWRhZ3JhZE9wdGltaXplcihlLHQpfSxlfSgpLHRyYWluPXtzZ2Q6T3B0aW1pemVyQ29uc3RydWN0b3JzLnNnZCxtb21lbnR1bTpPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMubW9tZW50dW0sYWRhZGVsdGE6T3B0aW1pemVyQ29uc3RydWN0b3JzLmFkYWRlbHRhLGFkYWdyYWQ6T3B0aW1pemVyQ29uc3RydWN0b3JzLmFkYWdyYWQscm1zcHJvcDpPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMucm1zcHJvcCxhZGFtYXg6T3B0aW1pemVyQ29uc3RydWN0b3JzLmFkYW1heCxhZGFtOk9wdGltaXplckNvbnN0cnVjdG9ycy5hZGFtfSxzZXRCYWNrZW5kPUVudmlyb25tZW50LnNldEJhY2tlbmQsZ2V0QmFja2VuZD1FbnZpcm9ubWVudC5nZXRCYWNrZW5kLGRpc3Bvc2VWYXJpYWJsZXM9RW52aXJvbm1lbnQuZGlzcG9zZVZhcmlhYmxlcyxtZW1vcnk9RW52aXJvbm1lbnQubWVtb3J5O3NldE9wSGFuZGxlcihvcHMpO2V4cG9ydHtzZXRCYWNrZW5kLGdldEJhY2tlbmQsZGlzcG9zZVZhcmlhYmxlcyxtZW1vcnksdmVyc2lvbiBhcyB2ZXJzaW9uX2NvcmUsbmV4dEZyYW1lLGVudmlyb25tZW50LGlvLHNlcmlhbGl6YXRpb24sdGVzdF91dGlsLHV0aWwsd2ViZ2wsQWRhZGVsdGFPcHRpbWl6ZXIsQWRhZ3JhZE9wdGltaXplcixBZGFtT3B0aW1pemVyLEFkYW1heE9wdGltaXplcixNb21lbnR1bU9wdGltaXplcixPcHRpbWl6ZXIsUk1TUHJvcE9wdGltaXplcixTR0RPcHRpbWl6ZXIsVGVuc29yLFRlbnNvckJ1ZmZlcix2YXJpYWJsZSxWYXJpYWJsZSxSYW5rLFJlZHVjdGlvbixFTlYsRW52aXJvbm1lbnQsRGF0YVN0b3JhZ2UsaW1hZ2Vfb3BzIGFzIGltYWdlLGxpbmFsZ19vcHMgYXMgbGluYWxnLGxvc3Nfb3BzIGFzIGxvc3NlcyxzcGVjdHJhbF9vcHMgYXMgc3BlY3RyYWwsb3AsYmF0Y2hOb3JtYWxpemF0aW9uMmQsYmF0Y2hOb3JtYWxpemF0aW9uM2QsYmF0Y2hOb3JtYWxpemF0aW9uNGQsYmF0Y2hOb3JtYWxpemF0aW9uLGNvbXBsZXgscmVhbCxpbWFnLGNvbmNhdCxjb25jYXQxZCxjb25jYXQyZCxjb25jYXQzZCxjb25jYXQ0ZCxzcGxpdCQxIGFzIHNwbGl0LGNvbnYxZCxjb252MmQsZGVwdGh3aXNlQ29udjJkLHNlcGFyYWJsZUNvbnYyZCxjb252MmRUcmFuc3Bvc2UsbWF0TXVsLGRvdCxvdXRlclByb2R1Y3QscmV2ZXJzZSxyZXZlcnNlMWQscmV2ZXJzZTJkLHJldmVyc2UzZCxyZXZlcnNlNGQsbWF4UG9vbCxhdmdQb29sLHNsaWNlLHNsaWNlMWQsc2xpY2UyZCxzbGljZTNkLHNsaWNlNGQsYWJzLGFjb3MsYWNvc2gsYXNpbixhc2luaCxhdGFuLGF0YW5oLGNlaWwsY2xpcEJ5VmFsdWUsY29zLGNvc2gsZXJmLGV4cCxleHBtMSxmbG9vcixsb2ckMSBhcyBsb2csbG9nMXAsbG9nU2lnbW9pZCxuZWcscmVjaXByb2NhbCxyb3VuZCxyc3FydCxzaWdtb2lkLHNpZ24sc2luLHNpbmgsc29mdHBsdXMsc3FydCxzcXVhcmUsc3RlcCx0YW4sdGFuaCQxIGFzIHRhbmgsYWxsLGFueSxhcmdNYXgsYXJnTWluLGxvZ1N1bUV4cCxtYXgsbWVhbixtaW4sbW9tZW50cyxzdW0scHJvZCxlcXVhbCxlcXVhbFN0cmljdCxncmVhdGVyLGdyZWF0ZXJFcXVhbCxncmVhdGVyRXF1YWxTdHJpY3QsZ3JlYXRlclN0cmljdCxsZXNzLGxlc3NFcXVhbCxsZXNzRXF1YWxTdHJpY3QsbGVzc1N0cmljdCxub3RFcXVhbCxub3RFcXVhbFN0cmljdCxhZGQsYWRkTixhZGRTdHJpY3QsYXRhbjIsZGl2LGRpdlN0cmljdCxmbG9vckRpdixtYXhpbXVtLG1heGltdW1TdHJpY3QsbWluaW11bSxtaW5pbXVtU3RyaWN0LG1vZCxtb2RTdHJpY3QsbXVsLG11bFN0cmljdCxwb3cscG93U3RyaWN0LHNxdWFyZWREaWZmZXJlbmNlLHNxdWFyZWREaWZmZXJlbmNlU3RyaWN0LHN1YixzdWJTdHJpY3QsZWx1LGxlYWt5UmVsdSxwcmVsdSxyZWx1LHNlbHUsbG9naWNhbEFuZCxsb2dpY2FsTm90LGxvZ2ljYWxPcixsb2dpY2FsWG9yLHdoZXJlLHdoZXJlQXN5bmMsYnVmZmVyLHRvUGl4ZWxzLHByaW50LGJhdGNoVG9TcGFjZU5ELGNhc3QsY2xvbmUsY3Vtc3VtLGRlcHRoVG9TcGFjZSxleHBhbmREaW1zLGV5ZSxmcm9tUGl4ZWxzLG11bHRpbm9taWFsLG9uZUhvdCxwYWQscGFkMWQscGFkMmQscGFkM2QscGFkNGQscmFuZCxyYW5kb21Ob3JtYWwscmFuZG9tVW5pZm9ybSxyZXNoYXBlLHNwYWNlVG9CYXRjaE5ELHNxdWVlemUsc3RhY2ssdGlsZSx0cnVuY2F0ZWROb3JtYWwsdW5zdGFjayxmaWxsLGxpbnNwYWNlLG9uZXMkMSBhcyBvbmVzLHJhbmdlLHNjYWxhcix0ZW5zb3IsdGVuc29yMWQsdGVuc29yMmQsdGVuc29yM2QsdGVuc29yNGQsdGVuc29yNWQsdGVuc29yNmQsemVyb3Msb25lc0xpa2UsemVyb3NMaWtlLHRyYW5zcG9zZSxzb2Z0bWF4LGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uLG5vcm0sZ2F0aGVyLHVuc29ydGVkU2VnbWVudFN1bSxiYXNpY0xTVE1DZWxsLG11bHRpUk5OQ2VsbCxtb3ZpbmdBdmVyYWdlLHN0cmlkZWRTbGljZSx0b3BrLHNjYXR0ZXJORCxmZnQsZ2F0aGVyTkQsdHJhaW4sdGlkeSxrZWVwLGRpc3Bvc2UsdGltZSxwcm9maWxlLGN1c3RvbUdyYWQsZ3JhZCxncmFkcyx2YWx1ZUFuZEdyYWQsdmFsdWVBbmRHcmFkcyx2YXJpYWJsZUdyYWRzfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRmLWNvcmUuZXNtLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0e0VOVixrZWVwLHNjYWxhcix0aWR5LG9uZXNMaWtlLHRlbnNvcjFkLHV0aWwsd2hlcmUsemVyb3NMaWtlLHRyYWluLGNhc3Qsc2VyaWFsaXphdGlvbixuZXh0RnJhbWUsYWRkLG11bCxkaXYsVGVuc29yLE9wdGltaXplcixtZWFuLGlvLHRyYW5zcG9zZSxyZXZlcnNlLGNvbmNhdCx6ZXJvcyxkaXNwb3NlLHN1bSxuZWcsdmFyaWFibGUsb25lcyxleWUscmFuZG9tVW5pZm9ybSx0cnVuY2F0ZWROb3JtYWwscmFuZG9tTm9ybWFsLHN1YixzcXJ0LG11bFN0cmljdCxjbGlwQnlWYWx1ZSxyZWx1LGxpbmFsZyxsZWFreVJlbHUsZWx1LGNvbnYxZCxjb252MmQsY29udjJkVHJhbnNwb3NlLHNlcGFyYWJsZUNvbnYyZCxkZXB0aHdpc2VDb252MmQsbWF4aW11bSxtaW5pbXVtLGJhdGNoTm9ybWFsaXphdGlvbjJkLGJhdGNoTm9ybWFsaXphdGlvbjNkLGJhdGNoTm9ybWFsaXphdGlvbjRkLG1vbWVudHMsbW92aW5nQXZlcmFnZSxwYWQsbWF4UG9vbCxhdmdQb29sLHNxdWVlemUsbWF4LGFicyxsb2csc29mdHBsdXMsc29mdG1heCxmbG9vcixvbmVIb3QsZXhwLGdyZWF0ZXIsZXF1YWwsYXJnTWF4LGxvZ2ljYWxBbmQsc2xpY2UxZCxzbGljZTJkLHNsaWNlM2Qsc2xpY2U0ZCxjb25jYXQxZCxjb25jYXQyZCxjb25jYXQzZCxjb25jYXQ0ZCx0aWxlLG1hdE11bCxnYXRoZXIsc3RlcCxtaW4sc2VsdSxzaWdtb2lkLHRhbmh9ZnJvbVwiQHRlbnNvcmZsb3cvdGZqcy1jb3JlXCI7dmFyIGV4dGVuZFN0YXRpY3M9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKGUsdCl7ZS5fX3Byb3RvX189dH18fGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmKGVbbl09dFtuXSl9O2Z1bmN0aW9uIF9fZXh0ZW5kcyhlLHQpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPWV9ZXh0ZW5kU3RhdGljcyhlLHQpLGUucHJvdG90eXBlPW51bGw9PT10P09iamVjdC5jcmVhdGUodCk6KG4ucHJvdG90eXBlPXQucHJvdG90eXBlLG5ldyBuKX12YXIgX19hc3NpZ249T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rKylmb3IodmFyIGkgaW4gdD1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsaSkmJihlW2ldPXRbaV0pO3JldHVybiBlfTtmdW5jdGlvbiBfX2F3YWl0ZXIoZSx0LG4scil7cmV0dXJuIG5ldyhufHwobj1Qcm9taXNlKSkoZnVuY3Rpb24oaSxhKXtmdW5jdGlvbiBvKGUpe3RyeXtsKHIubmV4dChlKSl9Y2F0Y2goZSl7YShlKX19ZnVuY3Rpb24gcyhlKXt0cnl7bChyLnRocm93KGUpKX1jYXRjaChlKXthKGUpfX1mdW5jdGlvbiBsKGUpe2UuZG9uZT9pKGUudmFsdWUpOm5ldyBuKGZ1bmN0aW9uKHQpe3QoZS52YWx1ZSl9KS50aGVuKG8scyl9bCgocj1yLmFwcGx5KGUsdHx8W10pKS5uZXh0KCkpfSl9ZnVuY3Rpb24gX19nZW5lcmF0b3IoZSx0KXt2YXIgbixyLGksYSxvPXtsYWJlbDowLHNlbnQ6ZnVuY3Rpb24oKXtpZigxJmlbMF0pdGhyb3cgaVsxXTtyZXR1cm4gaVsxXX0sdHJ5czpbXSxvcHM6W119O3JldHVybiBhPXtuZXh0OnMoMCksdGhyb3c6cygxKSxyZXR1cm46cygyKX0sXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiYoYVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxhO2Z1bmN0aW9uIHMoYSl7cmV0dXJuIGZ1bmN0aW9uKHMpe3JldHVybiBmdW5jdGlvbihhKXtpZihuKXRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO2Zvcig7bzspdHJ5e2lmKG49MSxyJiYoaT1yWzImYVswXT9cInJldHVyblwiOmFbMF0/XCJ0aHJvd1wiOlwibmV4dFwiXSkmJiEoaT1pLmNhbGwocixhWzFdKSkuZG9uZSlyZXR1cm4gaTtzd2l0Y2gocj0wLGkmJihhPVswLGkudmFsdWVdKSxhWzBdKXtjYXNlIDA6Y2FzZSAxOmk9YTticmVhaztjYXNlIDQ6cmV0dXJuIG8ubGFiZWwrKyx7dmFsdWU6YVsxXSxkb25lOiExfTtjYXNlIDU6by5sYWJlbCsrLHI9YVsxXSxhPVswXTtjb250aW51ZTtjYXNlIDc6YT1vLm9wcy5wb3AoKSxvLnRyeXMucG9wKCk7Y29udGludWU7ZGVmYXVsdDppZighKGk9KGk9by50cnlzKS5sZW5ndGg+MCYmaVtpLmxlbmd0aC0xXSkmJig2PT09YVswXXx8Mj09PWFbMF0pKXtvPTA7Y29udGludWV9aWYoMz09PWFbMF0mJighaXx8YVsxXT5pWzBdJiZhWzFdPGlbM10pKXtvLmxhYmVsPWFbMV07YnJlYWt9aWYoNj09PWFbMF0mJm8ubGFiZWw8aVsxXSl7by5sYWJlbD1pWzFdLGk9YTticmVha31pZihpJiZvLmxhYmVsPGlbMl0pe28ubGFiZWw9aVsyXSxvLm9wcy5wdXNoKGEpO2JyZWFrfWlbMl0mJm8ub3BzLnBvcCgpLG8udHJ5cy5wb3AoKTtjb250aW51ZX1hPXQuY2FsbChlLG8pfWNhdGNoKGUpe2E9WzYsZV0scj0wfWZpbmFsbHl7bj1pPTB9aWYoNSZhWzBdKXRocm93IGFbMV07cmV0dXJue3ZhbHVlOmFbMF0/YVsxXTp2b2lkIDAsZG9uZTohMH19KFthLHNdKX19fXZhciBfZXBzaWxvbj1FTlYuZ2V0KFwiRVBTSUxPTlwiKTtmdW5jdGlvbiBlcHNpbG9uKCl7cmV0dXJuIF9lcHNpbG9ufWZ1bmN0aW9uIGltYWdlRGF0YUZvcm1hdCgpe3JldHVyblwiY2hhbm5lbHNMYXN0XCJ9dmFyIF9uZXh0VW5pcXVlVGVuc29ySWQ9MDtmdW5jdGlvbiBnZXROZXh0VW5pcXVlVGVuc29ySWQoKXtyZXR1cm4gX25leHRVbmlxdWVUZW5zb3JJZCsrfXZhciBfdWlkUHJlZml4ZXM9e307ZnVuY3Rpb24gZ2V0VWlkKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1cIlwiKSxlIGluIF91aWRQcmVmaXhlc3x8KF91aWRQcmVmaXhlc1tlXT0wKSxfdWlkUHJlZml4ZXNbZV0rPTEsZStfdWlkUHJlZml4ZXNbZV0udG9TdHJpbmcoKX12YXIgc2NhbGFyQ2FjaGU9e2Zsb2F0MzI6e30saW50MzI6e319LERFRkFVTFRfRFRZUEU9XCJmbG9hdDMyXCI7ZnVuY3Rpb24gZ2V0U2NhbGFyKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PURFRkFVTFRfRFRZUEUpLG51bGw9PXNjYWxhckNhY2hlW3RdW2VdJiYoc2NhbGFyQ2FjaGVbdF1bZV09c2NhbGFyKGUsdCksa2VlcChzY2FsYXJDYWNoZVt0XVtlXSkpLHNjYWxhckNhY2hlW3RdW2VdfXZhciBBdHRyaWJ1dGVFcnJvcj1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe3ZhciByPWUuY2FsbCh0aGlzLG4pfHx0aGlzO3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Yocix0LnByb3RvdHlwZSkscn1yZXR1cm4gX19leHRlbmRzKHQsZSksdH0oRXJyb3IpLFJ1bnRpbWVFcnJvcj1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe3ZhciByPWUuY2FsbCh0aGlzLG4pfHx0aGlzO3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Yocix0LnByb3RvdHlwZSkscn1yZXR1cm4gX19leHRlbmRzKHQsZSksdH0oRXJyb3IpLFZhbHVlRXJyb3I9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXt2YXIgcj1lLmNhbGwodGhpcyxuKXx8dGhpcztyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKHIsdC5wcm90b3R5cGUpLHJ9cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHR9KEVycm9yKSxOb3RJbXBsZW1lbnRlZEVycm9yPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobil7dmFyIHI9ZS5jYWxsKHRoaXMsbil8fHRoaXM7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihyLHQucHJvdG90eXBlKSxyfXJldHVybiBfX2V4dGVuZHModCxlKSx0fShFcnJvciksQXNzZXJ0aW9uRXJyb3I9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXt2YXIgcj1lLmNhbGwodGhpcyxuKXx8dGhpcztyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKHIsdC5wcm90b3R5cGUpLHJ9cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHR9KEVycm9yKSxJbmRleEVycm9yPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobil7dmFyIHI9ZS5jYWxsKHRoaXMsbil8fHRoaXM7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihyLHQucHJvdG90eXBlKSxyfXJldHVybiBfX2V4dGVuZHModCxlKSx0fShFcnJvcik7ZnVuY3Rpb24gcHlMaXN0UmVwZWF0KGUsdCl7aWYoQXJyYXkuaXNBcnJheShlKSl7Zm9yKHZhciBuPVtdLHI9MDtyPHQ7cisrKW49bi5jb25jYXQoZSk7cmV0dXJuIG59cmV0dXJuKG49bmV3IEFycmF5KHQpKS5maWxsKGUpLG59ZnVuY3Rpb24gYXNzZXJ0KGUsdCl7aWYoIWUpdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKHQpfWZ1bmN0aW9uIGNvdW50KGUsdCl7Zm9yKHZhciBuPTAscj0wLGk9ZTtyPGkubGVuZ3RoO3IrKyl7aVtyXT09PXQmJm4rK31yZXR1cm4gbn1mdW5jdGlvbiBzaW5nbGV0b25PckFycmF5KGUpe3JldHVybiAxPT09ZS5sZW5ndGg/ZVswXTplfWZ1bmN0aW9uIHRvTGlzdChlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lOltlXX1mdW5jdGlvbiB0b1NuYWtlQ2FzZShlKXt2YXIgdD1lLnJlcGxhY2UoLyguKShbQS1aXVthLXowLTldKykvZyxcIiQxXyQyXCIpLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csXCIkMV8kMlwiKS50b0xvd2VyQ2FzZSgpO3JldHVyblwiX1wiIT09dFswXT90OlwicHJpdmF0ZVwiK3R9ZnVuY3Rpb24gdG9DYW1lbENhc2UoZSl7cmV0dXJuIGUubGVuZ3RoPD0xP2U6LTE9PT1lLmluZGV4T2YoXCJfXCIpP2U6ZS5yZXBsYWNlKC9bX10rKFxcd3wkKS9nLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKX0pfXZhciBfR0xPQkFMX0NVU1RPTV9PQkpFQ1RTPXt9O2Z1bmN0aW9uIHNlcmlhbGl6ZUtlcmFzT2JqZWN0KGUpe3JldHVybiBudWxsPT09ZXx8dm9pZCAwPT09ZT9udWxsOntjbGFzc05hbWU6ZS5nZXRDbGFzc05hbWUoKSxjb25maWc6ZS5nZXRDb25maWcoKX19ZnVuY3Rpb24gZGVzZXJpYWxpemVLZXJhc09iamVjdChlLHQsbixyKXtpZih2b2lkIDA9PT10JiYodD17fSksdm9pZCAwPT09biYmKG49e30pLHZvaWQgMD09PXImJihyPVwib2JqZWN0XCIpLFwic3RyaW5nXCI9PXR5cGVvZiBlKXt2YXIgaT1lLGE9dm9pZCAwO2lmKGkgaW4gbilhPW5baV07ZWxzZSBpZihpIGluIF9HTE9CQUxfQ1VTVE9NX09CSkVDVFMpYT1fR0xPQkFMX0NVU1RPTV9PQkpFQ1RTW2ldO2Vsc2UgaWYobnVsbD09KGE9dFtpXSkpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJVbmtub3duIFwiK3IrXCI6IFwiK2UrXCIuIFRoaXMgbWF5IGJlIGR1ZSB0byBvbmUgb2YgdGhlIGZvbGxvd2luZyByZWFzb25zOlxcbjEuIFRoZSBcIityK1wiIGlzIGRlZmluZWQgaW4gUHl0aG9uLCBpbiB3aGljaCBjYXNlIGl0IG5lZWRzIHRvIGJlIHBvcnRlZCB0byBUZW5zb3JGbG93LmpzIG9yIHlvdXIgSmF2YVNjcmlwdCBjb2RlLlxcbjIuIFRoZSBjdXN0b20gXCIrcitcIiBpcyBkZWZpbmVkIGluIEphdmFTY3JpcHQsIGJ1dCBpcyBub3QgcmVnaXN0ZXJlZCBwcm9wZXJseSB3aXRoIHRmLnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcygpLlwiKTtyZXR1cm4gYX12YXIgbz1lO2lmKG51bGw9PW8uY2xhc3NOYW1lfHxudWxsPT1vLmNvbmZpZyl0aHJvdyBuZXcgVmFsdWVFcnJvcihyK1wiOiBJbXByb3BlciBjb25maWcgZm9ybWF0OiBcIitKU09OLnN0cmluZ2lmeShvKStcIi5cXG4nY2xhc3NOYW1lJyBhbmQgJ2NvbmZpZycgbXVzdCBzZXQuXCIpO3ZhciBzPW8uY2xhc3NOYW1lLGw9dm9pZCAwLHU9dm9pZCAwO2lmKHMgaW4gbj8obD0oUz1uLmdldChzKSlbMF0sdT1TWzFdKTpzIGluIF9HTE9CQUxfQ1VTVE9NX09CSkVDVFM/KGw9KEE9X0dMT0JBTF9DVVNUT01fT0JKRUNUUy5jbGFzc05hbWUpWzBdLHU9QVsxXSk6cyBpbiB0JiYobD0oST10W3NdKVswXSx1PUlbMV0pLG51bGw9PWwpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJVbmtub3duIFwiK3IrXCI6IFwiK3MrXCIuIFRoaXMgbWF5IGJlIGR1ZSB0byBvbmUgb2YgdGhlIGZvbGxvd2luZyByZWFzb25zOlxcbjEuIFRoZSBcIityK1wiIGlzIGRlZmluZWQgaW4gUHl0aG9uLCBpbiB3aGljaCBjYXNlIGl0IG5lZWRzIHRvIGJlIHBvcnRlZCB0byBUZW5zb3JGbG93LmpzIG9yIHlvdXIgSmF2YVNjcmlwdCBjb2RlLlxcbjIuIFRoZSBjdXN0b20gXCIrcitcIiBpcyBkZWZpbmVkIGluIEphdmFTY3JpcHQsIGJ1dCBpcyBub3QgcmVnaXN0ZXJlZCBwcm9wZXJseSB3aXRoIHRmLnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcygpLlwiKTtpZihudWxsIT11KXtmb3IodmFyIGM9e30scD0wLGg9T2JqZWN0LmtleXMoX0dMT0JBTF9DVVNUT01fT0JKRUNUUyk7cDxoLmxlbmd0aDtwKyspe2Nbdj1oW3BdXT1fR0xPQkFMX0NVU1RPTV9PQkpFQ1RTW3ZdfWZvcih2YXIgZD0wLGc9T2JqZWN0LmtleXMobik7ZDxnLmxlbmd0aDtkKyspe2Nbdj1nW2RdXT1uW3ZdfW8uY29uZmlnLmN1c3RvbU9iamVjdHM9Yztmb3IodmFyIGY9X19hc3NpZ24oe30sX0dMT0JBTF9DVVNUT01fT0JKRUNUUyksbT0wLHk9T2JqZWN0LmtleXMobik7bTx5Lmxlbmd0aDttKyspe3ZhciB2PXlbbV07X0dMT0JBTF9DVVNUT01fT0JKRUNUU1t2XT1uW3ZdfXZhciBiPXUobCxvLmNvbmZpZyk7cmV0dXJuIF9HTE9CQUxfQ1VTVE9NX09CSkVDVFM9X19hc3NpZ24oe30sZiksYn1mPV9fYXNzaWduKHt9LF9HTE9CQUxfQ1VTVE9NX09CSkVDVFMpO2Zvcih2YXIgdz0wLHo9T2JqZWN0LmtleXMobik7dzx6Lmxlbmd0aDt3Kyspe3Y9elt3XTtfR0xPQkFMX0NVU1RPTV9PQkpFQ1RTW3ZdPW5bdl19dmFyIFMsQSxJO2I9bmV3IGwoby5jb25maWcpO3JldHVybiBfR0xPQkFMX0NVU1RPTV9PQkpFQ1RTPV9fYXNzaWduKHt9LGYpLGJ9ZnVuY3Rpb24gbnVtYmVyQ29tcGFyZShlLHQpe3JldHVybiBlPHQ/LTE6ZT50PzE6MH1mdW5jdGlvbiByZXZlcnNlTnVtYmVyQ29tcGFyZShlLHQpe3JldHVybi0xKm51bWJlckNvbXBhcmUoZSx0KX1mdW5jdGlvbiBzdHJpbmdUb0RUeXBlKGUpe3N3aXRjaChlKXtjYXNlXCJmbG9hdDMyXCI6cmV0dXJuXCJmbG9hdDMyXCI7ZGVmYXVsdDp0aHJvdyBuZXcgVmFsdWVFcnJvcihcIkludmFsaWQgZHR5cGU6IFwiK2UpfX1mdW5jdGlvbiB1bmlxdWUoZSl7aWYobnVsbD09ZSlyZXR1cm4gZTtmb3IodmFyIHQ9W10sbj0wLHI9ZTtuPHIubGVuZ3RoO24rKyl7dmFyIGk9cltuXTstMT09PXQuaW5kZXhPZihpKSYmdC5wdXNoKGkpfXJldHVybiB0fWZ1bmN0aW9uIGlzT2JqZWN0RW1wdHkoZSl7aWYobnVsbD09ZSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIkludmFsaWQgdmFsdWUgaW4gb2JqOiBcIitKU09OLnN0cmluZ2lmeShlKSk7Zm9yKHZhciB0IGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eSh0KSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBjaGVja1N0cmluZ1R5cGVVbmlvblZhbHVlKGUsdCxuKXtpZihudWxsIT1uJiZlLmluZGV4T2Yobik8MCl0aHJvdyBuZXcgVmFsdWVFcnJvcihuK1wiIGlzIG5vdCBhIHZhbGlkIFwiK3QrXCIuICBWYWxpZCB2YWx1ZXMgYXJlIFwiK2UrXCIgb3IgbnVsbC91bmRlZmluZWQuXCIpfWZ1bmN0aW9uIGNoZWNrQXJyYXlUeXBlQW5kTGVuZ3RoKGUsdCxuLHIpe3JldHVybiB2b2lkIDA9PT1uJiYobj0wKSx2b2lkIDA9PT1yJiYocj0xLzApLGFzc2VydChuPj0wKSxhc3NlcnQocj49biksQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGg+PW4mJmUubGVuZ3RoPD1yJiZlLmV2ZXJ5KGZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZT09PXR9KX1mdW5jdGlvbiBjYWxjTDJOb3JtcyhlLHQpe3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7cmV0dXJuIHNxcnQoc3VtKG11bFN0cmljdChlLGUpLHQsITApKX0pfXZhciBDb25zdHJhaW50PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtyZXR1cm4gbnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXtyZXR1cm57fX0sdH0oc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGUpLE1heE5vcm09ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4uZGVmYXVsdE1heFZhbHVlPTIsbi5kZWZhdWx0QXhpcz0wLG4ubWF4VmFsdWU9bnVsbCE9dC5tYXhWYWx1ZT90Lm1heFZhbHVlOm4uZGVmYXVsdE1heFZhbHVlLG4uYXhpcz1udWxsIT10LmF4aXM/dC5heGlzOm4uZGVmYXVsdEF4aXMsbn1yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gdGlkeShmdW5jdGlvbigpe3ZhciBuPWNhbGNMMk5vcm1zKGUsdC5heGlzKSxyPWNsaXBCeVZhbHVlKG4sMCx0Lm1heFZhbHVlKTtyZXR1cm4gbXVsKGUsZGl2KHIsYWRkKGdldFNjYWxhcihlcHNpbG9uKCkpLG4pKSl9KX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7cmV0dXJue21heFZhbHVlOnRoaXMubWF4VmFsdWUsYXhpczp0aGlzLmF4aXN9fSx0LmNsYXNzTmFtZT1cIk1heE5vcm1cIix0fShDb25zdHJhaW50KTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoTWF4Tm9ybSk7dmFyIFVuaXROb3JtPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIG49ZS5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBuLmRlZmF1bHRBeGlzPTAsbi5heGlzPW51bGwhPXQuYXhpcz90LmF4aXM6bi5kZWZhdWx0QXhpcyxufXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7cmV0dXJuIGRpdihlLGFkZChnZXRTY2FsYXIoZXBzaWxvbigpKSxjYWxjTDJOb3JtcyhlLHQuYXhpcykpKX0pfSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXtyZXR1cm57YXhpczp0aGlzLmF4aXN9fSx0LmNsYXNzTmFtZT1cIlVuaXROb3JtXCIsdH0oQ29uc3RyYWludCk7c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFVuaXROb3JtKTt2YXIgTm9uTmVnPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtyZXR1cm4gbnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbihlKXtyZXR1cm4gcmVsdShlKX0sdC5jbGFzc05hbWU9XCJOb25OZWdcIix0fShDb25zdHJhaW50KTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoTm9uTmVnKTt2YXIgTWluTWF4Tm9ybT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gbi5kZWZhdWx0TWluVmFsdWU9MCxuLmRlZmF1bHRNYXhWYWx1ZT0xLG4uZGVmYXVsdFJhdGU9MSxuLmRlZmF1bHRBeGlzPTAsbi5taW5WYWx1ZT1udWxsIT10Lm1pblZhbHVlP3QubWluVmFsdWU6bi5kZWZhdWx0TWluVmFsdWUsbi5tYXhWYWx1ZT1udWxsIT10Lm1heFZhbHVlP3QubWF4VmFsdWU6bi5kZWZhdWx0TWF4VmFsdWUsbi5yYXRlPW51bGwhPXQucmF0ZT90LnJhdGU6bi5kZWZhdWx0UmF0ZSxuLmF4aXM9bnVsbCE9dC5heGlzP3QuYXhpczpuLmRlZmF1bHRBeGlzLG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXt2YXIgbj1jYWxjTDJOb3JtcyhlLHQuYXhpcykscj1hZGQobXVsKGdldFNjYWxhcih0LnJhdGUpLGNsaXBCeVZhbHVlKG4sdC5taW5WYWx1ZSx0Lm1heFZhbHVlKSksbXVsKGdldFNjYWxhcigxLXQucmF0ZSksbikpO3JldHVybiBtdWwoZSxkaXYocixhZGQoZ2V0U2NhbGFyKGVwc2lsb24oKSksbikpKX0pfSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXtyZXR1cm57bWluVmFsdWU6dGhpcy5taW5WYWx1ZSxtYXhWYWx1ZTp0aGlzLm1heFZhbHVlLHJhdGU6dGhpcy5yYXRlLGF4aXM6dGhpcy5heGlzfX0sdC5jbGFzc05hbWU9XCJNaW5NYXhOb3JtXCIsdH0oQ29uc3RyYWludCk7c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKE1pbk1heE5vcm0pO3ZhciBDT05TVFJBSU5UX0lERU5USUZJRVJfUkVHSVNUUllfU1lNQk9MX01BUD17bWF4Tm9ybTpcIk1heE5vcm1cIixtaW5NYXhOb3JtOlwiTWluTWF4Tm9ybVwiLG5vbk5lZzpcIk5vbk5lZ1wiLHVuaXROb3JtOlwiVW5pdE5vcm1cIn07ZnVuY3Rpb24gc2VyaWFsaXplQ29uc3RyYWludChlKXtyZXR1cm4gc2VyaWFsaXplS2VyYXNPYmplY3QoZSl9ZnVuY3Rpb24gZGVzZXJpYWxpemVDb25zdHJhaW50KGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PXt9KSxkZXNlcmlhbGl6ZUtlcmFzT2JqZWN0KGUsc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uTWFwLmdldE1hcCgpLmNsYXNzTmFtZU1hcCx0LFwiY29uc3RyYWludFwiKX1mdW5jdGlvbiBnZXRDb25zdHJhaW50KGUpe3JldHVybiBudWxsPT1lP251bGw6XCJzdHJpbmdcIj09dHlwZW9mIGU/ZGVzZXJpYWxpemVDb25zdHJhaW50KHtjbGFzc05hbWU6ZSBpbiBDT05TVFJBSU5UX0lERU5USUZJRVJfUkVHSVNUUllfU1lNQk9MX01BUD9DT05TVFJBSU5UX0lERU5USUZJRVJfUkVHSVNUUllfU1lNQk9MX01BUFtlXTplLGNvbmZpZzp7fX0pOmUgaW5zdGFuY2VvZiBDb25zdHJhaW50P2U6ZGVzZXJpYWxpemVDb25zdHJhaW50KGUpfWZ1bmN0aW9uIG1heE5vcm0oZSl7cmV0dXJuIG5ldyBNYXhOb3JtKGUpfWZ1bmN0aW9uIHVuaXROb3JtKGUpe3JldHVybiBuZXcgVW5pdE5vcm0oZSl9ZnVuY3Rpb24gbm9uTmVnKCl7cmV0dXJuIG5ldyBOb25OZWd9ZnVuY3Rpb24gbWluTWF4Tm9ybShlKXtyZXR1cm4gbmV3IE1pbk1heE5vcm0oZSl9dmFyIGV4cG9ydHNfY29uc3RyYWludHM9T2JqZWN0LmZyZWV6ZSh7bWF4Tm9ybTptYXhOb3JtLHVuaXROb3JtOnVuaXROb3JtLG5vbk5lZzpub25OZWcsbWluTWF4Tm9ybTptaW5NYXhOb3JtfSksbmFtZU1hcD1uZXcgTWFwLFZBTElEX0RBVEFfRk9STUFUX1ZBTFVFUz1bXCJjaGFubmVsc0ZpcnN0XCIsXCJjaGFubmVsc0xhc3RcIl07ZnVuY3Rpb24gY2hlY2tEYXRhRm9ybWF0KGUpe2NoZWNrU3RyaW5nVHlwZVVuaW9uVmFsdWUoVkFMSURfREFUQV9GT1JNQVRfVkFMVUVTLFwiRGF0YUZvcm1hdFwiLGUpfXZhciBWQUxJRF9QQURESU5HX01PREVfVkFMVUVTPVtcInZhbGlkXCIsXCJzYW1lXCIsXCJjYXVzYWxcIl07ZnVuY3Rpb24gY2hlY2tQYWRkaW5nTW9kZShlKXtjaGVja1N0cmluZ1R5cGVVbmlvblZhbHVlKFZBTElEX1BBRERJTkdfTU9ERV9WQUxVRVMsXCJQYWRkaW5nTW9kZVwiLGUpfXZhciBWQUxJRF9QT09MX01PREVfVkFMVUVTPVtcIm1heFwiLFwiYXZnXCJdO2Z1bmN0aW9uIGNoZWNrUG9vbE1vZGUoZSl7Y2hlY2tTdHJpbmdUeXBlVW5pb25WYWx1ZShWQUxJRF9QT09MX01PREVfVkFMVUVTLFwiUG9vbE1vZGVcIixlKX12YXIgX25hbWVTY29wZVN0YWNrPVtdLF9uYW1lU2NvcGVEaXZpZGVyPVwiL1wiO2Z1bmN0aW9uIG5hbWVTY29wZShlLHQpe19uYW1lU2NvcGVTdGFjay5wdXNoKGUpO3RyeXt2YXIgbj10KCk7cmV0dXJuIF9uYW1lU2NvcGVTdGFjay5wb3AoKSxufWNhdGNoKGUpe3Rocm93IF9uYW1lU2NvcGVTdGFjay5wb3AoKSxlfX1mdW5jdGlvbiBjdXJyZW50TmFtZVNjb3BlUHJlZml4KCl7cmV0dXJuIDA9PT1fbmFtZVNjb3BlU3RhY2subGVuZ3RoP1wiXCI6X25hbWVTY29wZVN0YWNrLmpvaW4oX25hbWVTY29wZURpdmlkZXIpK19uYW1lU2NvcGVEaXZpZGVyfWZ1bmN0aW9uIGdldFNjb3BlZFRlbnNvck5hbWUoZSl7aWYoIWlzVmFsaWRUZW5zb3JOYW1lKGUpKXRocm93IG5ldyBFcnJvcihcIk5vdCBhIHZhbGlkIHRlbnNvciBuYW1lOiAnXCIrZStcIidcIik7cmV0dXJuIGN1cnJlbnROYW1lU2NvcGVQcmVmaXgoKStlfWZ1bmN0aW9uIGdldFVuaXF1ZVRlbnNvck5hbWUoZSl7aWYoIWlzVmFsaWRUZW5zb3JOYW1lKGUpKXRocm93IG5ldyBFcnJvcihcIk5vdCBhIHZhbGlkIHRlbnNvciBuYW1lOiAnXCIrZStcIidcIik7bmFtZU1hcC5oYXMoZSl8fG5hbWVNYXAuc2V0KGUsMCk7dmFyIHQ9bmFtZU1hcC5nZXQoZSk7aWYobmFtZU1hcC5zZXQoZSxuYW1lTWFwLmdldChlKSsxKSx0PjApe3ZhciBuPWUrXCJfXCIrdDtyZXR1cm4gbmFtZU1hcC5zZXQobiwxKSxufXJldHVybiBlfXZhciB0ZW5zb3JOYW1lUmVnZXg9bmV3IFJlZ0V4cCgvXltBLVphLXpdW0EtWmEtejAtOVxcLl9cXC9dKiQvKTtmdW5jdGlvbiBpc1ZhbGlkVGVuc29yTmFtZShlKXtyZXR1cm4hIWUubWF0Y2godGVuc29yTmFtZVJlZ2V4KX1mdW5jdGlvbiBpc0ludGVnZXIoZSl7cmV0dXJuIGU9PT1wYXJzZUludChlLnRvU3RyaW5nKCksMTApfWZ1bmN0aW9uIGFycmF5UHJvZChlLHQsbil7bnVsbD09dCYmKHQ9MCksbnVsbD09biYmKG49ZS5sZW5ndGgpO2Zvcih2YXIgcj0xLGk9dDtpPG47KytpKXIqPWVbaV07cmV0dXJuIHJ9ZnVuY3Rpb24gdG9BcnJheTFEKGUpe3JldHVybiBlPUFycmF5LmlzQXJyYXkoZSk/bmV3IEZsb2F0MzJBcnJheShlKTplLHRlbnNvcjFkKGUpfWZ1bmN0aW9uIG1pbiQxKGUpe3JldHVybiBtaW4odG9BcnJheTFEKGUpKS5kYXRhU3luYygpWzBdfWZ1bmN0aW9uIG1heCQxKGUpe3JldHVybiBtYXgodG9BcnJheTFEKGUpKS5kYXRhU3luYygpWzBdfWZ1bmN0aW9uIHJhbmdlKGUsdCl7aWYodDxlKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiZW5kIChcIit0K1wiKSA8IGJlZ2luIChcIitlK1wiKSBpcyBmb3JiaWRkZW4uXCIpO2Zvcih2YXIgbj1bXSxyPWU7cjx0OysrciluLnB1c2gocik7cmV0dXJuIG59ZnVuY3Rpb24gY2FzdCQxKGUsdCl7cmV0dXJuIGUuYXNUeXBlKHQpfWZ1bmN0aW9uIGV4cGFuZERpbXMoZSx0KXt2b2lkIDA9PT10JiYodD0tMSk7dmFyIG49ZS5zaGFwZS5zbGljZSgpO3JldHVybiB0PDAmJih0PW4ubGVuZ3RoK3QrMSksbi5zcGxpY2UodCwwLDEpLGUucmVzaGFwZShuKX1mdW5jdGlvbiByZXBlYXQoZSx0KXtyZXR1cm4gdGlkeShmdW5jdGlvbigpe2lmKDIhPT1lLnNoYXBlLmxlbmd0aCl0aHJvdyBuZXcgVmFsdWVFcnJvcihcInJlcGVhdCgpIGV4cGVjdHMgYSByYW5rLTIgdGVuc29yLCBidXQgcmVjZWl2ZWQgYSByYW5rLVwiK2Uuc2hhcGUubGVuZ3RoK1wiIHRlbnNvci5cIik7cmV0dXJuIHRpbGUkMShleHBhbmREaW1zKGUsMSksWzEsdCwxXSl9KX1mdW5jdGlvbiBmbGF0dGVuKGUpe3ZhciB0PVthcnJheVByb2QoZS5zaGFwZSldO3JldHVybiBlLnJlc2hhcGUodCl9ZnVuY3Rpb24gYmF0Y2hGbGF0dGVuKGUpe2lmKGUucmFuazw9MSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcImJhdGNoRmxhdHRlbiByZXF1aXJlcyBhIG1pbmltdW0gcmFuayBvZiAyLiBHb3QgcmFuazogXCIrZS5yYW5rK1wiLlwiKTt2YXIgdD1bZS5zaGFwZVswXSxhcnJheVByb2QoZS5zaGFwZSwxKV07cmV0dXJuIGUucmVzaGFwZSh0KX1mdW5jdGlvbiBzbGljZUFsb25nRmlyc3RBeGlzKGUsdCxuKXtyZXR1cm4gdGlkeShmdW5jdGlvbigpe3N3aXRjaChlLnJhbmspe2Nhc2UgMTpyZXR1cm4gc2xpY2UxZChlLHQsbik7Y2FzZSAyOnJldHVybiBzbGljZTJkKGUsW3QsMF0sW24sZS5zaGFwZVsxXV0pO2Nhc2UgMzpyZXR1cm4gc2xpY2UzZChlLFt0LDAsMF0sW24sZS5zaGFwZVsxXSxlLnNoYXBlWzJdXSk7Y2FzZSA0OnJldHVybiBzbGljZTRkKGUsW3QsMCwwLDBdLFtuLGUuc2hhcGVbMV0sZS5zaGFwZVsyXSxlLnNoYXBlWzNdXSk7ZGVmYXVsdDp0aHJvdyBuZXcgVmFsdWVFcnJvcihcInNsaWNlQWxvbmdGaXJzdEF4aXMoKSByZWNlaXZlZCBhbiB1bnN1cHBvcnRlZCB0ZW5zb3IgcmFuazogXCIrZS5yYW5rKX19KX1mdW5jdGlvbiBzbGljZUFsb25nTGFzdEF4aXMoZSx0LG4pe3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7c3dpdGNoKGUucmFuayl7Y2FzZSAxOnJldHVybiBzbGljZTFkKGUsdCxuKTtjYXNlIDI6cmV0dXJuIHNsaWNlMmQoZSxbMCx0XSxbZS5zaGFwZVswXSxuXSk7Y2FzZSAzOnJldHVybiBzbGljZTNkKGUsWzAsMCx0XSxbZS5zaGFwZVswXSxlLnNoYXBlWzFdLG5dKTtjYXNlIDQ6cmV0dXJuIHNsaWNlNGQoZSxbMCwwLDAsdF0sW2Uuc2hhcGVbMF0sZS5zaGFwZVsxXSxlLnNoYXBlWzJdLG5dKTtkZWZhdWx0OnRocm93IG5ldyBWYWx1ZUVycm9yKFwic2xpY2VBbG9uZ0xhc3RBeGlzKCkgcmVjZWl2ZWQgYW4gdW5zdXBwb3J0ZWQgdGVuc29yIHJhbms6IFwiK2UucmFuayl9fSl9ZnVuY3Rpb24gc2xpY2VBbG9uZ0F4aXMoZSx0LG4scil7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXtzd2l0Y2goZS5yYW5rKXtjYXNlIDE6cmV0dXJuIHNsaWNlMWQoZSx0LG4pO2Nhc2UgMjpzd2l0Y2gocil7Y2FzZSAxOnJldHVybiBzbGljZUFsb25nRmlyc3RBeGlzKGUsdCxuKTtjYXNlIDI6cmV0dXJuIHNsaWNlQWxvbmdMYXN0QXhpcyhlLHQsbik7ZGVmYXVsdDp0aHJvdyBuZXcgVmFsdWVFcnJvcihcIlRoZSBheGlzIGlzIG5vdCB3aXRoaW4gdGhlIHJhbmsgb2YgdGhlIHRlbnNvciBcIityKX1jYXNlIDM6c3dpdGNoKHIpe2Nhc2UgMTpyZXR1cm4gc2xpY2VBbG9uZ0ZpcnN0QXhpcyhlLHQsbik7Y2FzZSAyOnJldHVybiBzbGljZTNkKGUsWzAsdCwwXSxbZS5zaGFwZVswXSxuLGUuc2hhcGVbMl1dKTtjYXNlIDM6cmV0dXJuIHNsaWNlQWxvbmdMYXN0QXhpcyhlLHQsbik7ZGVmYXVsdDp0aHJvdyBuZXcgVmFsdWVFcnJvcihcIlRoZSBheGlzIGlzIG5vdCB3aXRoaW4gdGhlIHJhbmsgb2YgdGhlIHRlbnNvciBcIityKX1jYXNlIDQ6c3dpdGNoKHIpe2Nhc2UgMTpyZXR1cm4gc2xpY2VBbG9uZ0ZpcnN0QXhpcyhlLHQsbik7Y2FzZSAyOnJldHVybiBzbGljZTRkKGUsWzAsdCwwLDBdLFtlLnNoYXBlWzBdLG4sZS5zaGFwZVsyXSxlLnNoYXBlWzNdXSk7Y2FzZSAzOnJldHVybiBzbGljZTRkKGUsWzAsMCx0LDBdLFtlLnNoYXBlWzBdLGUuc2hhcGVbMV0sbixlLnNoYXBlWzNdXSk7Y2FzZSA0OnJldHVybiBzbGljZUFsb25nTGFzdEF4aXMoZSx0LG4pO2RlZmF1bHQ6dGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJUaGUgYXhpcyBpcyBub3Qgd2l0aGluIHRoZSByYW5rIG9mIHRoZSB0ZW5zb3IgXCIrcil9ZGVmYXVsdDp0aHJvdyBuZXcgVmFsdWVFcnJvcihcInNsaWNlQWxvbmdMYXN0QXhpcygpIHJlY2VpdmVkIGFuIHVuc3VwcG9ydGVkIHRlbnNvciByYW5rOiBcIitlLnJhbmspfX0pfWZ1bmN0aW9uIGNvbmNhdGVuYXRlKGUsdCl7dmFyIG47cmV0dXJuIHZvaWQgMD09PXQmJih0PS0xKSx0PDAmJih0PTAhPT0obj1lWzBdLnJhbmspP246MCksdD09PWVbMF0ucmFuayYmKHQ9LTEpLGNvbmNhdChlLHQpfWZ1bmN0aW9uIGNvbmNhdEFsb25nRmlyc3RBeGlzKGUsdCl7c3dpdGNoKGUucmFuayl7Y2FzZSAxOnJldHVybiBjb25jYXQxZChbZSx0XSk7Y2FzZSAyOnJldHVybiBjb25jYXQyZChbZSx0XSwwKTtjYXNlIDM6cmV0dXJuIGNvbmNhdDNkKFtlLHRdLDApO2Nhc2UgNDpyZXR1cm4gY29uY2F0NGQoW2UsdF0sMCk7ZGVmYXVsdDp0aHJvdyBuZXcgVmFsdWVFcnJvcihcImNvbmNhdEFsb25nRmlyc3RBeGlzKCkgcmVjZWl2ZWQgYW4gdW5zdXBwb3J0ZWQgdGVuc29yIHJhbms6IFwiK2UucmFuayl9fWZ1bmN0aW9uIHRpbGUkMShlLHQpe2lmKEFycmF5LmlzQXJyYXkodCl8fCh0PVt0XSksZS5yYW5rIT09dC5sZW5ndGgpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJUaGUgbGVuZ3RoIG9mIGlucHV0IG4gKFwiK3QubGVuZ3RoK1wiKSBkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgaW4gaW5wdXQgeCAoXCIrZS5yYW5rK1wiKVwiKTtyZXR1cm4gdGlsZShlLHQpfWZ1bmN0aW9uIHJhbmRvbU5vcm1hbCQxKGUsdCxuLHIsaSl7cmV0dXJuIHZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PW4mJihuPTEpLHJhbmRvbU5vcm1hbChlLHQsbixyLGkpfWZ1bmN0aW9uIGRvdChlLHQpe2lmKGUucmFuazwyfHx0LnJhbms8Mil0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcImRvdCByZXF1aXJlcyBib3RoIGlucHV0cyB0byBiZSByYW5rID49IDIgYnV0IGdvdCB4IHNoYXBlID0gXCIrZS5zaGFwZStcIiBhbmQgeSBzaGFwZSA9IFwiK3Quc2hhcGUpO2lmKHQucmFuaz49MyYmKHI9ZS5zaGFwZS5zbGljZSgtMSlbMF0pIT09KG89dC5zaGFwZS5zbGljZSgtMilbMF0pKXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiSWYgcmFuayB5ID49IDMsIHRoZW4gdGhlIHNlY29uZCBsYXN0IGRpbSBvZiB5IG11c3QgZXF1YWwgdGhlIGxhc3QgZGltIG9mIHggYnV0IGdvdCB4IHNoYXBlID0gXCIrZS5zaGFwZStcIiBhbmQgIHkgc2hhcGUgPSBcIit0LnNoYXBlKTtpZigyPT09ZS5yYW5rJiYyPT09dC5yYW5rKXJldHVybiBtYXRNdWwoZSx0KTt2YXIgbj1lLnNoYXBlLnNsaWNlKCkscj1uLnBvcCgpO2U9ZS5yZXNoYXBlKFstMSxyXSk7dmFyIGk9dC5zaGFwZS5zbGljZSgpLGE9aS5wb3AoKSxvPWkucG9wKCkscz1pLmNvbmNhdChbYV0pLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnQucmFua30sZnVuY3Rpb24oZSxuKXtyZXR1cm4gMD09PW4/dC5yYW5rLTI6bjw9dC5yYW5rLTI/bi0xOm59KTt0PXQudHJhbnNwb3NlKGwpLnJlc2hhcGUoW28sLTFdKTt2YXIgdT1uLmNvbmNhdChzKTtyZXR1cm4gbWF0TXVsKGUsdCkucmVzaGFwZSh1KX1mdW5jdGlvbiBnYXRoZXIkMShlLHQsbil7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXtyZXR1cm4gdD1BcnJheS5pc0FycmF5KHQpP3RlbnNvcjFkKHQsXCJpbnQzMlwiKTp0LnRvSW50KCksZ2F0aGVyKGUsdCxuKX0pfWZ1bmN0aW9uIHNxdWFyZShlKXtyZXR1cm4gbXVsU3RyaWN0KGUsZSl9ZnVuY3Rpb24gYmlhc0FkZChlLHQsbil7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXtpZihudWxsPT1uJiYobj1pbWFnZURhdGFGb3JtYXQoKSksY2hlY2tEYXRhRm9ybWF0KG4pLDEhPT10LnJhbmsmJnQucmFuayE9PWUucmFuayl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIlVuZXhwZWN0ZWQgYmlhcyBkaW1lbnNpb25zOiBcIit0LnJhbmsrXCI7IGV4cGVjdGVkIGl0IHRvIGJlIDEgb3IgXCIrZS5yYW5rKTt2YXIgcixpPXQuc2hhcGU7aWYoNT09PWUucmFuaylcImNoYW5uZWxzRmlyc3RcIj09PW4/cj0xPT09aS5sZW5ndGg/ZS5hZGQodC5yZXNoYXBlKFsxLGlbMF0sMSwxLDFdKSk6ZS5hZGQodC5yZXNoYXBlKFsxLGlbM10saVswXSxpWzFdLGlbMl1dKSk6XCJjaGFubmVsc0xhc3RcIj09PW4mJihyPTE9PT1pLmxlbmd0aD9lLmFkZCh0LnJlc2hhcGUoWzEsMSwxLDEsaVswXV0pKTplLmFkZCh0LnJlc2hhcGUoWzFdLmNvbmNhdChpKSkpKTtlbHNlIGlmKDQ9PT1lLnJhbmspXCJjaGFubmVsc0ZpcnN0XCI9PT1uP3I9MT09PWkubGVuZ3RoP2UuYWRkKHQucmVzaGFwZShbMSxpWzBdLDEsMV0pKTplLmFkZCh0LnJlc2hhcGUoWzEsaVsyXSxpWzBdLGlbMV1dKSk6XCJjaGFubmVsc0xhc3RcIj09PW4mJihyPTE9PT1pLmxlbmd0aD9lLmFkZCh0LnJlc2hhcGUoWzEsMSwxLGlbMF1dKSk6ZS5hZGQodC5yZXNoYXBlKFsxXS5jb25jYXQoaSkpKSk7ZWxzZSBpZigzPT09ZS5yYW5rKVwiY2hhbm5lbHNGaXJzdFwiPT09bj9yPTE9PT1pLmxlbmd0aD9lLmFkZCh0LnJlc2hhcGUoWzEsaVswXSwxXSkpOmUuYWRkKHQucmVzaGFwZShbMSxpWzFdLGlbMF1dKSk6XCJjaGFubmVsc0xhc3RcIj09PW4mJihyPTE9PT1pLmxlbmd0aD9lLmFkZCh0LnJlc2hhcGUoWzEsMSxpWzBdXSkpOmUuYWRkKHQucmVzaGFwZShbMV0uY29uY2F0KGkpKSkpO2Vsc2V7aWYoIShlLnJhbms8MykpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJVbnN1cHBvcnRlZCBpbnB1dCByYW5rIGJ5IGJpYXNBZGQ6IFwiK2UucmFuayk7cj1lLmFkZCh0KX1yZXR1cm4gcn0pfWZ1bmN0aW9uIGVsdSQxKGUsdCl7aWYodm9pZCAwPT09dCYmKHQ9MSksMSE9PXQpdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXCJTdXBwb3J0IGZvciBhbHBoYSB2YWx1ZXMgb3RoZXIgdGhhbiAxIChcIit0K1wiKSBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LlwiKTtyZXR1cm4gZWx1KGUpfWZ1bmN0aW9uIHNvZnRzaWduKGUpe3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7cmV0dXJuIGRpdihlLGFkZChnZXRTY2FsYXIoMSksYWJzKGUpKSl9KX1mdW5jdGlvbiBkcm9wb3V0KGUsdCxuLHIpe3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7aWYobnVsbCE9biYmIXV0aWwuYXJyYXlzRXF1YWwoZS5zaGFwZSxuKSl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcIk5vbi1kZWZhdWx0IG5vaXNlIHNoYXBlIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQ6IFwiK0pTT04uc3RyaW5naWZ5KG4pKTtpZihudWxsIT1yKXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwic2VlZCBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIGRyb3BvdXQgeWV0LlwiKTt2YXIgaT1zdGVwKGFkZChuZWcodCkscmFuZG9tVW5pZm9ybShlLnNoYXBlLDAsMSxcImZsb2F0MzJcIikpKTtyZXR1cm4gaT1tdWwoZGl2KGdldFNjYWxhcigxKSxzdWIoZ2V0U2NhbGFyKDEpLHQpKSxpKSxtdWwoZSxpKX0pfWZ1bmN0aW9uIGhhcmRTaWdtb2lkKGUpe3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7dmFyIHQ9YWRkKGdldFNjYWxhciguNSksbXVsKGdldFNjYWxhciguMiksZSkpO3JldHVybiBjbGlwQnlWYWx1ZSh0LDAsMSl9KX1mdW5jdGlvbiBpblRyYWluUGhhc2UoZSx0LG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj0hMSksbj9lKCk6dCgpfXZhciBWQUxJRF9GQU5fTU9ERV9WQUxVRVM9W1wiZmFuSW5cIixcImZhbk91dFwiLFwiZmFuQXZnXCJdO2Z1bmN0aW9uIGNoZWNrRmFuTW9kZShlKXtjaGVja1N0cmluZ1R5cGVVbmlvblZhbHVlKFZBTElEX0ZBTl9NT0RFX1ZBTFVFUyxcIkZhbk1vZGVcIixlKX12YXIgVkFMSURfRElTVFJJQlVUSU9OX1ZBTFVFUz1bXCJub3JtYWxcIixcInVuaWZvcm1cIl07ZnVuY3Rpb24gY2hlY2tEaXN0cmlidXRpb24oZSl7Y2hlY2tTdHJpbmdUeXBlVW5pb25WYWx1ZShWQUxJRF9ESVNUUklCVVRJT05fVkFMVUVTLFwiRGlzdHJpYnV0aW9uXCIsZSl9dmFyIEluaXRpYWxpemVyPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtyZXR1cm4gbnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5mcm9tQ29uZmlnVXNlc0N1c3RvbU9iamVjdHM9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7cmV0dXJue319LHR9KHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlKSxaZXJvcz1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7cmV0dXJuIG51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gemVyb3MoZSx0KX0sdC5jbGFzc05hbWU9XCJaZXJvc1wiLHR9KEluaXRpYWxpemVyKTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoWmVyb3MpO3ZhciBPbmVzPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtyZXR1cm4gbnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbihlLHQpe3JldHVybiBvbmVzKGUsdCl9LHQuY2xhc3NOYW1lPVwiT25lc1wiLHR9KEluaXRpYWxpemVyKTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoT25lcyk7dmFyIENvbnN0YW50PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIG49ZS5jYWxsKHRoaXMpfHx0aGlzO2lmKFwib2JqZWN0XCIhPXR5cGVvZiB0KXRocm93IG5ldyBWYWx1ZUVycm9yKFwiRXhwZWN0ZWQgYXJndW1lbnQgb2YgdHlwZSBDb25zdGFudENvbmZpZyBidXQgZ290IFwiK3QpO2lmKHZvaWQgMD09PXQudmFsdWUpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJjb25maWcgbXVzdCBoYXZlIHZhbHVlIHNldCBidXQgZ290IFwiK3QpO3JldHVybiBuLnZhbHVlPXQudmFsdWUsbn1yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7cmV0dXJuIG11bChzY2FsYXIobi52YWx1ZSksb25lcyhlLHQpKX0pfSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXtyZXR1cm57dmFsdWU6dGhpcy52YWx1ZX19LHQuY2xhc3NOYW1lPVwiQ29uc3RhbnRcIix0fShJbml0aWFsaXplcik7c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKENvbnN0YW50KTt2YXIgUmFuZG9tVW5pZm9ybT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gbi5ERUZBVUxUX01JTlZBTD0tLjA1LG4uREVGQVVMVF9NQVhWQUw9LjA1LG4ubWludmFsPXQubWludmFsfHxuLkRFRkFVTFRfTUlOVkFMLG4ubWF4dmFsPXQubWF4dmFsfHxuLkRFRkFVTFRfTUFYVkFMLG4uc2VlZD10LnNlZWQsbn1yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcmFuZG9tVW5pZm9ybShlLHRoaXMubWludmFsLHRoaXMubWF4dmFsLHQpfSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXtyZXR1cm57bWludmFsOnRoaXMubWludmFsLG1heHZhbDp0aGlzLm1heHZhbCxzZWVkOnRoaXMuc2VlZH19LHQuY2xhc3NOYW1lPVwiUmFuZG9tVW5pZm9ybVwiLHR9KEluaXRpYWxpemVyKTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoUmFuZG9tVW5pZm9ybSk7dmFyIFJhbmRvbU5vcm1hbD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gbi5ERUZBVUxUX01FQU49MCxuLkRFRkFVTFRfU1REREVWPS4wNSxuLm1lYW49dC5tZWFufHxuLkRFRkFVTFRfTUVBTixuLnN0ZGRldj10LnN0ZGRldnx8bi5ERUZBVUxUX1NURERFVixuLnNlZWQ9dC5zZWVkLG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKGUsdCl7aWYoXCJmbG9hdDMyXCIhPT0odD10fHxcImZsb2F0MzJcIikmJlwiaW50MzJcIiE9PXQpdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXCJyYW5kb21Ob3JtYWwgZG9lcyBub3Qgc3VwcG9ydCBkVHlwZSBcIit0K1wiLlwiKTtyZXR1cm4gcmFuZG9tTm9ybWFsJDEoZSx0aGlzLm1lYW4sdGhpcy5zdGRkZXYsdCx0aGlzLnNlZWQpfSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXtyZXR1cm57bWVhbjp0aGlzLm1lYW4sc3RkZGV2OnRoaXMuc3RkZGV2LHNlZWQ6dGhpcy5zZWVkfX0sdC5jbGFzc05hbWU9XCJSYW5kb21Ob3JtYWxcIix0fShJbml0aWFsaXplcik7c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFJhbmRvbU5vcm1hbCk7dmFyIFRydW5jYXRlZE5vcm1hbD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gbi5ERUZBVUxUX01FQU49MCxuLkRFRkFVTFRfU1REREVWPS4wNSxuLm1lYW49dC5tZWFufHxuLkRFRkFVTFRfTUVBTixuLnN0ZGRldj10LnN0ZGRldnx8bi5ERUZBVUxUX1NURERFVixuLnNlZWQ9dC5zZWVkLG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKGUsdCl7aWYoXCJmbG9hdDMyXCIhPT0odD10fHxcImZsb2F0MzJcIikmJlwiaW50MzJcIiE9PXQpdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXCJ0cnVuY2F0ZWROb3JtYWwgZG9lcyBub3Qgc3VwcG9ydCBkVHlwZSBcIit0K1wiLlwiKTtyZXR1cm4gdHJ1bmNhdGVkTm9ybWFsKGUsdGhpcy5tZWFuLHRoaXMuc3RkZGV2LHQsdGhpcy5zZWVkKX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7cmV0dXJue21lYW46dGhpcy5tZWFuLHN0ZGRldjp0aGlzLnN0ZGRldixzZWVkOnRoaXMuc2VlZH19LHQuY2xhc3NOYW1lPVwiVHJ1bmNhdGVkTm9ybWFsXCIsdH0oSW5pdGlhbGl6ZXIpO3NlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhUcnVuY2F0ZWROb3JtYWwpO3ZhciBJZGVudGl0eT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gbi5nYWluPW51bGwhPXQuZ2Fpbj9zY2FsYXIodC5nYWluKTpnZXRTY2FsYXIoMSksbn1yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7aWYoMiE9PWUubGVuZ3RofHxlWzBdIT09ZVsxXSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIklkZW50aXR5IG1hdHJpeCBpbml0aWFsaXplciBjYW4gb25seSBiZSB1c2VkIGZvciAyRCBzcXVhcmUgbWF0cmljZXMuXCIpO3JldHVybiBtdWwobi5nYWluLGV5ZShlWzBdKSl9KX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7cmV0dXJue2dhaW46dGhpcy5nYWluLmdldCgpfX0sdC5jbGFzc05hbWU9XCJJZGVudGl0eVwiLHR9KEluaXRpYWxpemVyKTtmdW5jdGlvbiBjb21wdXRlRmFucyhlLHQpe3ZhciBuLHI7aWYodm9pZCAwPT09dCYmKHQ9XCJjaGFubmVsc0xhc3RcIiksY2hlY2tEYXRhRm9ybWF0KHQpLDI9PT1lLmxlbmd0aCluPWVbMF0scj1lWzFdO2Vsc2UgaWYoLTEhPT1bMyw0LDVdLmluZGV4T2YoZS5sZW5ndGgpKXtpZihcImNoYW5uZWxzRmlyc3RcIj09PXQpe3ZhciBpPWFycmF5UHJvZChlLDIpO249ZVsxXSppLHI9ZVswXSppfWVsc2UgaWYoXCJjaGFubmVsc0xhc3RcIj09PXQpe2k9YXJyYXlQcm9kKGUsMCxlLmxlbmd0aC0yKTtuPWVbZS5sZW5ndGgtMl0qaSxyPWVbZS5sZW5ndGgtMV0qaX19ZWxzZXt2YXIgYT1hcnJheVByb2QoZSk7bj1NYXRoLnNxcnQoYSkscj1NYXRoLnNxcnQoYSl9cmV0dXJuW24scl19c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKElkZW50aXR5KTt2YXIgVmFyaWFuY2VTY2FsaW5nPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIG49ZS5jYWxsKHRoaXMpfHx0aGlzO2lmKHQuc2NhbGU8MCl0aHJvdyBuZXcgVmFsdWVFcnJvcihcInNjYWxlIG11c3QgYmUgYSBwb3NpdGl2ZSBmbG9hdC4gR290OiBcIit0LnNjYWxlKTtyZXR1cm4gbi5zY2FsZT1udWxsPT10LnNjYWxlPzE6dC5zY2FsZSxuLm1vZGU9dC5tb2RlLGNoZWNrRmFuTW9kZShuLm1vZGUpLG4uZGlzdHJpYnV0aW9uPXQuZGlzdHJpYnV0aW9uLGNoZWNrRGlzdHJpYnV0aW9uKG4uZGlzdHJpYnV0aW9uKSxuLnNlZWQ9dC5zZWVkLG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKGUsdCl7dmFyIG49Y29tcHV0ZUZhbnMoZSkscj1uWzBdLGk9blsxXSxhPXRoaXMuc2NhbGU7aWYoXCJmYW5JblwiPT09dGhpcy5tb2RlP2EvPU1hdGgubWF4KDEscik6XCJmYW5PdXRcIj09PXRoaXMubW9kZT9hLz1NYXRoLm1heCgxLGkpOmEvPU1hdGgubWF4KDEsKHIraSkvMiksXCJub3JtYWxcIj09PXRoaXMuZGlzdHJpYnV0aW9uKXt2YXIgbz1NYXRoLnNxcnQoYSk7aWYoXCJmbG9hdDMyXCIhPT0odD10fHxcImZsb2F0MzJcIikmJlwiaW50MzJcIiE9PXQpdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5nZXRDbGFzc05hbWUoKStcIiBkb2VzIG5vdCBzdXBwb3J0IGRUeXBlIFwiK3QrXCIuXCIpO3JldHVybiB0cnVuY2F0ZWROb3JtYWwoZSwwLG8sdCx0aGlzLnNlZWQpfXZhciBzPU1hdGguc3FydCgzKmEpO3JldHVybiByYW5kb21Vbmlmb3JtKGUsLXMscyx0KX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7cmV0dXJue3NjYWxlOnRoaXMuc2NhbGUsbW9kZTp0aGlzLm1vZGUsZGlzdHJpYnV0aW9uOnRoaXMuZGlzdHJpYnV0aW9uLHNlZWQ6dGhpcy5zZWVkfX0sdC5jbGFzc05hbWU9XCJWYXJpYW5jZVNjYWxpbmdcIix0fShJbml0aWFsaXplcik7c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFZhcmlhbmNlU2NhbGluZyk7dmFyIEdsb3JvdFVuaWZvcm09ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gZS5jYWxsKHRoaXMse3NjYWxlOjEsbW9kZTpcImZhbkF2Z1wiLGRpc3RyaWJ1dGlvbjpcInVuaWZvcm1cIixzZWVkOm51bGw9PXQ/bnVsbDp0LnNlZWR9KXx8dGhpc31yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuZ2V0Q2xhc3NOYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFZhcmlhbmNlU2NhbGluZy5jbGFzc05hbWV9LHR9KFZhcmlhbmNlU2NhbGluZyksR2xvcm90Tm9ybWFsPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIGUuY2FsbCh0aGlzLHtzY2FsZToxLG1vZGU6XCJmYW5BdmdcIixkaXN0cmlidXRpb246XCJub3JtYWxcIixzZWVkOm51bGw9PXQ/bnVsbDp0LnNlZWR9KXx8dGhpc31yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuZ2V0Q2xhc3NOYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFZhcmlhbmNlU2NhbGluZy5jbGFzc05hbWV9LHR9KFZhcmlhbmNlU2NhbGluZyksSGVOb3JtYWw9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gZS5jYWxsKHRoaXMse3NjYWxlOjIsbW9kZTpcImZhbkluXCIsZGlzdHJpYnV0aW9uOlwibm9ybWFsXCIsc2VlZDpudWxsPT10P251bGw6dC5zZWVkfSl8fHRoaXN9cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmdldENsYXNzTmFtZT1mdW5jdGlvbigpe3JldHVybiBWYXJpYW5jZVNjYWxpbmcuY2xhc3NOYW1lfSx0fShWYXJpYW5jZVNjYWxpbmcpLExlQ3VuTm9ybWFsPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIGUuY2FsbCh0aGlzLHtzY2FsZToxLG1vZGU6XCJmYW5JblwiLGRpc3RyaWJ1dGlvbjpcIm5vcm1hbFwiLHNlZWQ6bnVsbD09dD9udWxsOnQuc2VlZH0pfHx0aGlzfXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5nZXRDbGFzc05hbWU9ZnVuY3Rpb24oKXtyZXR1cm4gVmFyaWFuY2VTY2FsaW5nLmNsYXNzTmFtZX0sdH0oVmFyaWFuY2VTY2FsaW5nKSxPcnRob2dvbmFsPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIG49ZS5jYWxsKHRoaXMpfHx0aGlzO2lmKG4uREVGQVVMVF9HQUlOPTEsbi5nYWluPW51bGw9PXQuZ2Fpbj9uLkRFRkFVTFRfR0FJTjp0LmdhaW4sbi5zZWVkPXQuc2VlZCxudWxsIT1uLnNlZWQpdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXCJSYW5kb20gc2VlZCBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIE9ydGhvZ29uYWwgSW5pdGlhbGl6ZXIgeWV0LlwiKTtyZXR1cm4gbn1yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7aWYoMiE9PWUubGVuZ3RoKXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiVGhlIE9ydGhvZ29uYWwgSW5pdGlhbGl6ZXIgZG9lcyBub3Qgc3VwcG9ydCBub24tMkQgc2hhcGVzIHlldC5cIik7ZVswXSplWzFdPjJlMyYmY29uc29sZS53YXJuKFwiT3J0aG9nb25hbCBpbml0aWFsaXplciBpcyBiZWluZyBjYWxsZWQgb24gYSBtYXRyaXggd2l0aCBtb3JlIHRoYW4gMjAwMCAoXCIrZVswXSplWzFdK1wiKSBlbGVtZW50czogU2xvd25lc3MgbWF5IHJlc3VsdC5cIik7dmFyIHQ9cmFuZG9tTm9ybWFsJDEoZVswXT5lWzFdP1tlWzFdLGVbMF1dOmUsMCwxLFwiZmxvYXQzMlwiKSxyPWxpbmFsZy5ncmFtU2NobWlkdCh0KTtyZXR1cm4gZVswXT5lWzFdJiYocj1yLnRyYW5zcG9zZSgpKSxtdWwoZ2V0U2NhbGFyKG4uZ2Fpbikscil9KX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7cmV0dXJue2dhaW46dGhpcy5nYWluLHNlZWQ6dGhpcy5zZWVkfX0sdC5jbGFzc05hbWU9XCJPcnRob2dvbmFsXCIsdH0oSW5pdGlhbGl6ZXIpO3NlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhPcnRob2dvbmFsKTt2YXIgSU5JVElBTElaRVJfSURFTlRJRklFUl9SRUdJU1RSWV9TWU1CT0xfTUFQPXtjb25zdGFudDpcIkNvbnN0YW50XCIsZ2xvcm90Tm9ybWFsOlwiR2xvcm90Tm9ybWFsXCIsZ2xvcm90VW5pZm9ybTpcIkdsb3JvdFVuaWZvcm1cIixoZU5vcm1hbDpcIkhlTm9ybWFsXCIsaWRlbnRpdHk6XCJJZGVudGl0eVwiLGxlQ3VuTm9ybWFsOlwiTGVDdW5Ob3JtYWxcIixvbmVzOlwiT25lc1wiLG9ydGhvZ29uYWw6XCJPcnRob2dvbmFsXCIscmFuZG9tTm9ybWFsOlwiUmFuZG9tTm9ybWFsXCIscmFuZG9tVW5pZm9ybTpcIlJhbmRvbVVuaWZvcm1cIix0cnVuY2F0ZWROb3JtYWw6XCJUcnVuY2F0ZWROb3JtYWxcIix2YXJpYW5jZVNjYWxpbmc6XCJWYXJpYW5jZVNjYWxpbmdcIix6ZXJvczpcIlplcm9zXCJ9O2Z1bmN0aW9uIGRlc2VyaWFsaXplSW5pdGlhbGl6ZXIoZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9e30pLGRlc2VyaWFsaXplS2VyYXNPYmplY3QoZSxzZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25NYXAuZ2V0TWFwKCkuY2xhc3NOYW1lTWFwLHQsXCJpbml0aWFsaXplclwiKX1mdW5jdGlvbiBzZXJpYWxpemVJbml0aWFsaXplcihlKXtyZXR1cm4gc2VyaWFsaXplS2VyYXNPYmplY3QoZSl9ZnVuY3Rpb24gZ2V0SW5pdGlhbGl6ZXIoZSl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUpe3ZhciB0PWUgaW4gSU5JVElBTElaRVJfSURFTlRJRklFUl9SRUdJU1RSWV9TWU1CT0xfTUFQP0lOSVRJQUxJWkVSX0lERU5USUZJRVJfUkVHSVNUUllfU1lNQk9MX01BUFtlXTplO3JldHVyblwiR2xvcm90VW5pZm9ybVwiPT09dD9uZXcgR2xvcm90VW5pZm9ybTpcIkdsb3JvdE5vcm1hbFwiPT09dD9uZXcgR2xvcm90Tm9ybWFsOlwiSGVOb3JtYWxcIj09PXQ/bmV3IEhlTm9ybWFsOlwiTGVDdW5Ob3JtYWxcIj09PXQ/bmV3IExlQ3VuTm9ybWFsOmRlc2VyaWFsaXplSW5pdGlhbGl6ZXIoe2NsYXNzTmFtZTp0LGNvbmZpZzp7fX0pfXJldHVybiBlIGluc3RhbmNlb2YgSW5pdGlhbGl6ZXI/ZTpkZXNlcmlhbGl6ZUluaXRpYWxpemVyKGUpfWZ1bmN0aW9uIHplcm9zJDEoKXtyZXR1cm4gbmV3IFplcm9zfWZ1bmN0aW9uIG9uZXMkMSgpe3JldHVybiBuZXcgT25lc31mdW5jdGlvbiBjb25zdGFudChlKXtyZXR1cm4gbmV3IENvbnN0YW50KGUpfWZ1bmN0aW9uIHJhbmRvbVVuaWZvcm0kMShlKXtyZXR1cm4gbmV3IFJhbmRvbVVuaWZvcm0oZSl9ZnVuY3Rpb24gcmFuZG9tTm9ybWFsJDIoZSl7cmV0dXJuIG5ldyBSYW5kb21Ob3JtYWwoZSl9ZnVuY3Rpb24gdHJ1bmNhdGVkTm9ybWFsJDEoZSl7cmV0dXJuIG5ldyBUcnVuY2F0ZWROb3JtYWwoZSl9ZnVuY3Rpb24gaWRlbnRpdHkoZSl7cmV0dXJuIG5ldyBJZGVudGl0eShlKX1mdW5jdGlvbiB2YXJpYW5jZVNjYWxpbmcoZSl7cmV0dXJuIG5ldyBWYXJpYW5jZVNjYWxpbmcoZSl9ZnVuY3Rpb24gZ2xvcm90VW5pZm9ybShlKXtyZXR1cm4gbmV3IEdsb3JvdFVuaWZvcm0oZSl9ZnVuY3Rpb24gZ2xvcm90Tm9ybWFsKGUpe3JldHVybiBuZXcgR2xvcm90Tm9ybWFsKGUpfWZ1bmN0aW9uIGhlTm9ybWFsKGUpe3JldHVybiBuZXcgSGVOb3JtYWwoZSl9ZnVuY3Rpb24gbGVDdW5Ob3JtYWwoZSl7cmV0dXJuIG5ldyBMZUN1bk5vcm1hbChlKX1mdW5jdGlvbiBvcnRob2dvbmFsKGUpe3JldHVybiBuZXcgT3J0aG9nb25hbChlKX12YXIgZXhwb3J0c19pbml0aWFsaXplcnM9T2JqZWN0LmZyZWV6ZSh7emVyb3M6emVyb3MkMSxvbmVzOm9uZXMkMSxjb25zdGFudDpjb25zdGFudCxyYW5kb21Vbmlmb3JtOnJhbmRvbVVuaWZvcm0kMSxyYW5kb21Ob3JtYWw6cmFuZG9tTm9ybWFsJDIsdHJ1bmNhdGVkTm9ybWFsOnRydW5jYXRlZE5vcm1hbCQxLGlkZW50aXR5OmlkZW50aXR5LHZhcmlhbmNlU2NhbGluZzp2YXJpYW5jZVNjYWxpbmcsZ2xvcm90VW5pZm9ybTpnbG9yb3RVbmlmb3JtLGdsb3JvdE5vcm1hbDpnbG9yb3ROb3JtYWwsaGVOb3JtYWw6aGVOb3JtYWwsbGVDdW5Ob3JtYWw6bGVDdW5Ob3JtYWwsb3J0aG9nb25hbDpvcnRob2dvbmFsfSk7ZnVuY3Rpb24gaXNBcnJheU9mU2hhcGVzKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpJiZBcnJheS5pc0FycmF5KGVbMF0pfWZ1bmN0aW9uIG5vcm1hbGl6ZVNoYXBlTGlzdChlKXtyZXR1cm4gMD09PWUubGVuZ3RoP1tdOkFycmF5LmlzQXJyYXkoZVswXSk/ZTpbZV19ZnVuY3Rpb24gZ2V0RXhhY3RseU9uZVRlbnNvcihlKXt2YXIgdDtpZihBcnJheS5pc0FycmF5KGUpKXtpZigxIT09ZS5sZW5ndGgpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJFeHBlY3RlZCBUZW5zb3IgbGVuZ3RoIHRvIGJlIDE7IGdvdCBcIitlLmxlbmd0aCk7dD1lWzBdfWVsc2UgdD1lO3JldHVybiB0fWZ1bmN0aW9uIGdldEV4YWN0bHlPbmVTaGFwZShlKXtpZihBcnJheS5pc0FycmF5KGUpJiZBcnJheS5pc0FycmF5KGVbMF0pKXtpZigxPT09ZS5sZW5ndGgpcmV0dXJuKGU9ZSlbMF07dGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJFeHBlY3RlZCBleGFjdGx5IDEgU2hhcGU7IGdvdCBcIitlLmxlbmd0aCl9cmV0dXJuIGV9ZnVuY3Rpb24gY291bnRQYXJhbXNJbldlaWdodHMoZSl7Zm9yKHZhciB0PTAsbj0wLHI9ZTtuPHIubGVuZ3RoO24rKyl7dmFyIGk9cltuXTswPT09aS5zaGFwZS5sZW5ndGg/dCs9MTp0Kz1pLnNoYXBlLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlKnR9KX1yZXR1cm4gdH12YXIgREVGQVVMVF9WQVJJQUJMRV9OQU1FX1BSRUZJWD1cIlZhcmlhYmxlXCIsTGF5ZXJWYXJpYWJsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0LG4scixpKXt2b2lkIDA9PT10JiYodD1cImZsb2F0MzJcIiksdm9pZCAwPT09biYmKG49REVGQVVMVF9WQVJJQUJMRV9OQU1FX1BSRUZJWCksdm9pZCAwPT09ciYmKHI9ITApLHZvaWQgMD09PWkmJihpPW51bGwpLHRoaXMuZHR5cGU9bnVsbD09dD9cImZsb2F0MzJcIjp0LHRoaXMuc2hhcGU9ZS5zaGFwZSx0aGlzLmlkPWdldE5leHRVbmlxdWVUZW5zb3JJZCgpLG49bnVsbD09bj9ERUZBVUxUX1ZBUklBQkxFX05BTUVfUFJFRklYOm4sdGhpcy5vcmlnaW5hbE5hbWU9Z2V0U2NvcGVkVGVuc29yTmFtZShuKSx0aGlzLm5hbWU9Z2V0VW5pcXVlVGVuc29yTmFtZSh0aGlzLm9yaWdpbmFsTmFtZSksdGhpcy50cmFpbmFibGU9cix0aGlzLmNvbnN0cmFpbnQ9aSx0aGlzLnZhbD12YXJpYWJsZShlLHRoaXMudHJhaW5hYmxlLHRoaXMubmFtZSx0aGlzLmR0eXBlKX1yZXR1cm4gZS5wcm90b3R5cGUucmVhZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFzc2VydE5vdERpc3Bvc2VkKCksdGhpcy52YWx9LGUucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmFzc2VydE5vdERpc3Bvc2VkKCksY2hlY2tTaGFwZXNNYXRjaCh0aGlzLnZhbCxlKSx0aGlzLnZhbC5pZCE9PWUuaWQmJih0aGlzLnZhbC5hc3NpZ24oZSksbnVsbCE9dGhpcy5jb25zdHJhaW50JiZ0aGlzLnZhbC5hc3NpZ24odGhpcy5jb25zdHJhaW50LmFwcGx5KHRoaXMudmFsKSkpLHRoaXN9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmFzc2VydE5vdERpc3Bvc2VkKCksdGhpcy52YWwuZGlzcG9zZSgpfSxlLnByb3RvdHlwZS5hc3NlcnROb3REaXNwb3NlZD1mdW5jdGlvbigpe2lmKHRoaXMudmFsLmlzRGlzcG9zZWQpdGhyb3cgbmV3IEVycm9yKFwiTGF5ZXJzVmFyaWFibGUgXCIrdGhpcy5uYW1lK1wiIGlzIGFscmVhZHkgZGlzcG9zZWQuXCIpfSxlfSgpO2Z1bmN0aW9uIGNoZWNrU2hhcGVzTWF0Y2goZSx0KXtpZihlLnNoYXBlLnRvU3RyaW5nKCkhPT10LnNoYXBlLnRvU3RyaW5nKCkpdGhyb3cgbmV3IEVycm9yKFwiU2hhcGUgbWlzbWF0Y2g6IFwiK0pTT04uc3RyaW5naWZ5KGUuc2hhcGUpK1wiIHZzLiBcIitKU09OLnN0cmluZ2lmeSh0LnNoYXBlKSl9ZnVuY3Rpb24gYmF0Y2hHZXRWYWx1ZShlKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVhZCgpfSl9ZnVuY3Rpb24gYmF0Y2hTZXRWYWx1ZShlKXtlLm1hcChmdW5jdGlvbihlKXtlWzBdLndyaXRlKGVbMV0pfSl9dmFyIElucHV0U3BlYz1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXt0aGlzLmR0eXBlPWUuZHR5cGUsdGhpcy5zaGFwZT1lLnNoYXBlLG51bGwhPWUuc2hhcGU/dGhpcy5uZGltPWUuc2hhcGUubGVuZ3RoOnRoaXMubmRpbT1lLm5kaW0sdGhpcy5tYXhORGltPWUubWF4TkRpbSx0aGlzLm1pbk5EaW09ZS5taW5ORGltLHRoaXMuYXhlcz1lLmF4ZXN8fHt9fX0oKSxTeW1ib2xpY1RlbnNvcj1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLHQsbixyLGksYSxvKXt0aGlzLmR0eXBlPWUsdGhpcy5zaGFwZT10LHRoaXMuc291cmNlTGF5ZXI9bix0aGlzLmlucHV0cz1yLHRoaXMuY2FsbEFyZ3M9aSx0aGlzLm91dHB1dFRlbnNvckluZGV4PW8sdGhpcy5pZD1nZXROZXh0VW5pcXVlVGVuc29ySWQoKSxudWxsIT1hJiYodGhpcy5vcmlnaW5hbE5hbWU9Z2V0U2NvcGVkVGVuc29yTmFtZShhKSx0aGlzLm5hbWU9Z2V0VW5pcXVlVGVuc29yTmFtZSh0aGlzLm9yaWdpbmFsTmFtZSkpLHRoaXMucmFuaz10Lmxlbmd0aH19KCksX25leHROb2RlSUQ9MCxOb2RlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe3RoaXMuY2FsbEFyZ3M9dCx0aGlzLmlkPV9uZXh0Tm9kZUlEKyssdGhpcy5vdXRib3VuZExheWVyPWUub3V0Ym91bmRMYXllcix0aGlzLmluYm91bmRMYXllcnM9ZS5pbmJvdW5kTGF5ZXJzLHRoaXMubm9kZUluZGljZXM9ZS5ub2RlSW5kaWNlcyx0aGlzLnRlbnNvckluZGljZXM9ZS50ZW5zb3JJbmRpY2VzLHRoaXMuaW5wdXRUZW5zb3JzPWUuaW5wdXRUZW5zb3JzLHRoaXMub3V0cHV0VGVuc29ycz1lLm91dHB1dFRlbnNvcnMsdGhpcy5pbnB1dE1hc2tzPWUuaW5wdXRNYXNrcyx0aGlzLm91dHB1dE1hc2tzPWUub3V0cHV0TWFza3MsdGhpcy5pbnB1dFNoYXBlcz1lLmlucHV0U2hhcGVzLHRoaXMub3V0cHV0U2hhcGVzPWUub3V0cHV0U2hhcGVzO2Zvcih2YXIgbj0wLHI9ZS5pbmJvdW5kTGF5ZXJzO248ci5sZW5ndGg7bisrKXt2YXIgaT1yW25dO251bGwhPWkmJmkub3V0Ym91bmROb2Rlcy5wdXNoKHRoaXMpfWUub3V0Ym91bmRMYXllci5pbmJvdW5kTm9kZXMucHVzaCh0aGlzKX1yZXR1cm4gZS5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9MCxuPXRoaXMuaW5ib3VuZExheWVyczt0PG4ubGVuZ3RoO3QrKyl7dmFyIHI9blt0XTtudWxsIT1yP2UucHVzaChyLm5hbWUpOmUucHVzaChudWxsKX1yZXR1cm57b3V0Ym91bmRMYXllcjp0aGlzLm91dGJvdW5kTGF5ZXI/dGhpcy5vdXRib3VuZExheWVyLm5hbWU6bnVsbCxpbmJvdW5kTGF5ZXJzOmUsbm9kZUluZGljZXM6dGhpcy5ub2RlSW5kaWNlcyx0ZW5zb3JJbmRpY2VzOnRoaXMudGVuc29ySW5kaWNlc319LGV9KCksX25leHRMYXllcklEPTAsTGF5ZXI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyl8fHRoaXM7bi5fY2FsbEhvb2s9bnVsbCxuLl9hZGRlZFdlaWdodE5hbWVzPVtdLG4uX3N0YXRlZnVsPSExLG4uaWQ9X25leHRMYXllcklEKyssbi5hY3Rpdml0eVJlZ3VsYXJpemVyPW51bGwsbi5pbnB1dFNwZWM9bnVsbCxuLnN1cHBvcnRzTWFza2luZz0hMSxuLl90cmFpbmFibGVXZWlnaHRzPVtdLG4uX25vblRyYWluYWJsZVdlaWdodHM9W10sbi5fbG9zc2VzPVtdLG4uX3VwZGF0ZXM9W10sbi5fYnVpbHQ9ITEsbi5pbmJvdW5kTm9kZXM9W10sbi5vdXRib3VuZE5vZGVzPVtdO3ZhciByPXQubmFtZTtpZighcil7dmFyIGk9bi5nZXRDbGFzc05hbWUoKTtyPXRvU25ha2VDYXNlKGkpK1wiX1wiK2dldFVpZChpKX1pZihuLm5hbWU9cixuLnRyYWluYWJsZT1udWxsPT10LnRyYWluYWJsZXx8dC50cmFpbmFibGUsbi51cGRhdGFibGU9bnVsbD09dC51cGRhdGFibGV8fHQudXBkYXRhYmxlLG51bGwhPXQuaW5wdXRTaGFwZXx8bnVsbCE9dC5iYXRjaElucHV0U2hhcGUpe3ZhciBhPXZvaWQgMDtpZihudWxsIT10LmJhdGNoSW5wdXRTaGFwZSlhPXQuYmF0Y2hJbnB1dFNoYXBlO2Vsc2UgaWYobnVsbCE9dC5pbnB1dFNoYXBlKXt2YXIgbz1udWxsO251bGwhPXQuYmF0Y2hTaXplJiYobz10LmJhdGNoU2l6ZSksYT1bb10uY29uY2F0KHQuaW5wdXRTaGFwZSl9bi5iYXRjaElucHV0U2hhcGU9YTt2YXIgcz10LmR0eXBlO251bGw9PXMmJihzPXQuaW5wdXREVHlwZSksbnVsbD09cyYmKHM9XCJmbG9hdDMyXCIpLG4uZHR5cGU9c31yZXR1cm4gbnVsbCE9dC53ZWlnaHRzP24uaW5pdGlhbFdlaWdodHM9dC53ZWlnaHRzOm4uaW5pdGlhbFdlaWdodHM9bnVsbCxuLl9yZWZDb3VudD1udWxsLG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQubm9kZUtleT1mdW5jdGlvbihlLHQpe3JldHVybiBlLm5hbWUrXCJfaWItXCIrdC50b1N0cmluZygpfSx0LnByb3RvdHlwZS5nZXROb2RlQXRJbmRleD1mdW5jdGlvbihlLHQpe2lmKDA9PT10aGlzLmluYm91bmROb2Rlcy5sZW5ndGgpdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihcIlRoZSBsYXllciBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQgYW5kIHRodXMgaGFzIG5vIGRlZmluZWQgXCIrdCtcIi5cIik7aWYodGhpcy5pbmJvdW5kTm9kZXMubGVuZ3RoPD1lKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiQXNrZWQgdG8gZ2V0IFwiK3QrXCIgYXQgbm9kZSBcIitlK1wiLCBidXQgdGhlIGxheWVyIGhhcyBvbmx5IFwiK3RoaXMuaW5ib3VuZE5vZGVzLmxlbmd0aCtcIiBpbmJvdW5kIG5vZGVzLlwiKTtyZXR1cm4gdGhpcy5pbmJvdW5kTm9kZXNbZV19LHQucHJvdG90eXBlLmdldElucHV0QXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHNpbmdsZXRvbk9yQXJyYXkodGhpcy5nZXROb2RlQXRJbmRleChlLFwiaW5wdXRcIikuaW5wdXRUZW5zb3JzKX0sdC5wcm90b3R5cGUuZ2V0T3V0cHV0QXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHNpbmdsZXRvbk9yQXJyYXkodGhpcy5nZXROb2RlQXRJbmRleChlLFwib3V0cHV0XCIpLm91dHB1dFRlbnNvcnMpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJpbnB1dFwiLHtnZXQ6ZnVuY3Rpb24oKXtpZih0aGlzLmluYm91bmROb2Rlcy5sZW5ndGg+MSl0aHJvdyBuZXcgQXR0cmlidXRlRXJyb3IoXCJMYXllciBcIit0aGlzLm5hbWUrJyBoYXMgbXVsdGlwbGUgaW5ib3VuZCBub2RlcywgaGVuY2UgdGhlIG5vdGlvbiBvZiBcImxheWVyIGlucHV0XCIgaXMgaWxsLWRlZmluZWQuIFVzZSBgZ2V0SW5wdXRBdChub2RlSW5kZXgpYCBpbnN0ZWFkLicpO2lmKDA9PT10aGlzLmluYm91bmROb2Rlcy5sZW5ndGgpdGhyb3cgbmV3IEF0dHJpYnV0ZUVycm9yKFwiTGF5ZXIgXCIrdGhpcy5uYW1lK1wiIGlzIG5vdCBjb25uZWN0ZWQsIG5vIGlucHV0IHRvIHJldHVybi5cIik7cmV0dXJuIHNpbmdsZXRvbk9yQXJyYXkodGhpcy5nZXROb2RlQXRJbmRleCgwLFwiaW5wdXRcIikuaW5wdXRUZW5zb3JzKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJvdXRwdXRcIix7Z2V0OmZ1bmN0aW9uKCl7aWYoMD09PXRoaXMuaW5ib3VuZE5vZGVzLmxlbmd0aCl0aHJvdyBuZXcgQXR0cmlidXRlRXJyb3IoXCJMYXllciBcIit0aGlzLm5hbWUrXCIgaGFzIG5vIGluYm91bmQgbm9kZXMuXCIpO2lmKHRoaXMuaW5ib3VuZE5vZGVzLmxlbmd0aD4xKXRocm93IG5ldyBBdHRyaWJ1dGVFcnJvcihcIkxheWVyIFwiK3RoaXMubmFtZSsnIGhhcyBtdWx0aXBsZSBpbmJvdW5kIG5vZGVzLCBoZW5jZSB0aGUgbm90aW9uIG9mIFwibGF5ZXIgb3V0cHV0XCIgaXMgaWxsLWRlZmluZWQuIFVzZSBgZ2V0T3V0cHV0QXQobm9kZUluZGV4KWAgaW5zdGVhZC4nKTtyZXR1cm4gc2luZ2xldG9uT3JBcnJheSh0aGlzLmdldE5vZGVBdEluZGV4KDAsXCJvdXRwdXRcIikub3V0cHV0VGVuc29ycyl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwibG9zc2VzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb3NzZXN9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuY2FsY3VsYXRlTG9zc2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9zc2VzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZSgpfSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcInVwZGF0ZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VwZGF0ZXN9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwiYnVpbHRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2J1aWx0fSxzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5fYnVpbHQ9ZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJ0cmFpbmFibGVXZWlnaHRzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRyYWluYWJsZT90aGlzLl90cmFpbmFibGVXZWlnaHRzOltdfSxzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5fdHJhaW5hYmxlV2VpZ2h0cz1lfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcIm5vblRyYWluYWJsZVdlaWdodHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHJhaW5hYmxlP3RoaXMuX25vblRyYWluYWJsZVdlaWdodHM6dGhpcy5fdHJhaW5hYmxlV2VpZ2h0cy5jb25jYXQodGhpcy5fbm9uVHJhaW5hYmxlV2VpZ2h0cyl9LHNldDpmdW5jdGlvbihlKXt0aGlzLl9ub25UcmFpbmFibGVXZWlnaHRzPWV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwid2VpZ2h0c1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cmFpbmFibGVXZWlnaHRzLmNvbmNhdCh0aGlzLm5vblRyYWluYWJsZVdlaWdodHMpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcInN0YXRlZnVsXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGF0ZWZ1bH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5yZXNldFN0YXRlcz1mdW5jdGlvbigpe2lmKCF0aGlzLnN0YXRlZnVsKXRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjYWxsIHRoZSByZXNldFN0YXRlcygpIG1ldGhvZCBvZiBhIG5vbi1zdGF0ZWZ1bCBMYXllciBvYmplY3QuXCIpfSx0LnByb3RvdHlwZS5hc3NlcnRJbnB1dENvbXBhdGliaWxpdHk9ZnVuY3Rpb24oZSl7aWYoZT10b0xpc3QoZSksbnVsbCE9dGhpcy5pbnB1dFNwZWMmJjAhPT10aGlzLmlucHV0U3BlYy5sZW5ndGgpe3ZhciB0PXRvTGlzdCh0aGlzLmlucHV0U3BlYyk7aWYoZS5sZW5ndGghPT10Lmxlbmd0aCl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIkxheWVyIFwiK3RoaXMubmFtZStcIiBleHBlY3RzIFwiK3QubGVuZ3RoK1wiIGlucHV0cywgYnV0IGl0IHJlY2VpdmVkIFwiK2UubGVuZ3RoK1wiIGlucHV0IHRlbnNvcnMuIElucHV0IHJlY2VpdmVkOiBcIitlKTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXSxpPXRbbl07aWYobnVsbCE9aSl7dmFyIGE9ci5yYW5rO2lmKG51bGwhPWkubmRpbSYmYSE9PWkubmRpbSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIklucHV0IFwiK24rXCIgaXMgaW5jb21wYXRpYmxlIHdpdGggbGF5ZXIgXCIrdGhpcy5uYW1lK1wiOiBleHBlY3RlZCBuZGltPVwiK2kubmRpbStcIiwgZm91bmQgbmRpbT1cIithKTtpZihudWxsIT1pLm1heE5EaW0mJmE+aS5tYXhORGltKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiSW5wdXQgXCIrbitcIiBpcyBpbmNvbXBhdGlibGUgd2l0aCBsYXllciBcIit0aGlzLm5hbWUrXCI6IGV4cGVjdGVkIG1heF9uZGltPVwiK2kubWF4TkRpbStcIiwgZm91bmQgbmRpbT1cIithKTtpZihudWxsIT1pLm1pbk5EaW0mJmE8aS5taW5ORGltKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiSW5wdXQgXCIrbitcIiBpcyBpbmNvbXBhdGlibGUgd2l0aCBsYXllciBcIit0aGlzLm5hbWUrXCI6IGV4cGVjdGVkIG1pbl9uZGltPVwiK2kubWluTkRpbStcIiwgZm91bmQgbmRpbT1cIithK1wiLlwiKTtpZihudWxsIT1pLmR0eXBlJiZyLmR0eXBlIT09aS5kdHlwZSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIklucHV0IFwiK24rXCIgaXMgaW5jb21wYXRpYmxlIHdpdGggbGF5ZXIgXCIrdGhpcy5uYW1lK1wiIDogZXhwZWN0ZWQgZHR5cGU9XCIraS5kdHlwZStcIiwgZm91bmQgZHR5cGU9XCIrci5kdHlwZStcIi5cIik7aWYoaS5heGVzKXt2YXIgbz1yLnNoYXBlO2Zvcih2YXIgcyBpbiBpLmF4ZXMpe3ZhciBsPU51bWJlcihzKSx1PWkuYXhlc1tzXSxjPWw+PTA/b1tsXTpvW28ubGVuZ3RoK2xdO2lmKG51bGwhPXUmJi0xPT09W3UsbnVsbF0uaW5kZXhPZihjKSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIklucHV0IFwiK24rXCIgaXMgaW5jb21wYXRpYmxlIHdpdGggbGF5ZXIgXCIrdGhpcy5uYW1lK1wiOiBleHBlY3RlZCBheGlzIFwiK2wrXCIgb2YgaW5wdXQgc2hhcGUgdG8gaGF2ZSB2YWx1ZSBcIit1K1wiIGJ1dCBnb3Qgc2hhcGUgXCIrbytcIi5cIil9fWlmKG51bGwhPWkuc2hhcGUpZm9yKHZhciBwPTA7cDxpLnNoYXBlLmxlbmd0aDsrK3Ape3ZhciBoPWkuc2hhcGVbcF0sZD1yLnNoYXBlW3BdO2lmKG51bGwhPWgmJm51bGwhPWQmJmghPT1kKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiSW5wdXQgXCIrbitcIiBpcyBpbmNvbXBhdGlibGUgd2l0aCBsYXllciBcIit0aGlzLm5hbWUrXCI6IGV4cGVjdGVkIHNoYXBlPVwiK2kuc2hhcGUrXCIsIGZvdW5kIHNoYXBlPSR7eFNoYXBlfS5cIil9fX19fSx0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGV9LHQucHJvdG90eXBlLmludm9rZUNhbGxIb29rPWZ1bmN0aW9uKGUsdCl7bnVsbCE9dGhpcy5fY2FsbEhvb2smJnRoaXMuX2NhbGxIb29rKGUsdCl9LHQucHJvdG90eXBlLnNldENhbGxIb29rPWZ1bmN0aW9uKGUpe3RoaXMuX2NhbGxIb29rPWV9LHQucHJvdG90eXBlLmNsZWFyQ2FsbEhvb2s9ZnVuY3Rpb24oKXt0aGlzLl9jYWxsSG9vaz1udWxsfSx0LnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7dD10fHx7fSx0aGlzLmFzc2VydE5vdERpc3Bvc2VkKCk7Zm9yKHZhciByPXRvTGlzdChlKSxpPSEwLGE9MCxvPXI7YTxvLmxlbmd0aDthKyspe2lmKCEob1thXWluc3RhbmNlb2YgU3ltYm9saWNUZW5zb3IpKXtpPSExO2JyZWFrfX1mb3IodmFyIHM9ITAsbD0wLHU9cjtsPHUubGVuZ3RoO2wrKyl7aWYodVtsXWluc3RhbmNlb2YgU3ltYm9saWNUZW5zb3Ipe3M9ITE7YnJlYWt9fWlmKGk9PT1zKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiQXJndW1lbnRzIHRvIGFwcGx5KCkgbXVzdCBiZSBhbGwgU3ltYm9saWNUZW5zb3JzIG9yIGFsbCBUZW5zb3JzXCIpO3JldHVybiBuYW1lU2NvcGUodGhpcy5uYW1lLGZ1bmN0aW9uKCl7aWYoIW4uYnVpbHQpe24uYXNzZXJ0SW5wdXRDb21wYXRpYmlsaXR5KGUpO2Zvcih2YXIgaT1bXSxhPTAsbz10b0xpc3QoZSk7YTxvLmxlbmd0aDthKyspe3ZhciBsPW9bYV07aS5wdXNoKGwuc2hhcGUpfW4uYnVpbGQoc2luZ2xldG9uT3JBcnJheShpKSksbi5idWlsdD0hMCxuLmluaXRpYWxXZWlnaHRzJiZuLnNldFdlaWdodHMobi5pbml0aWFsV2VpZ2h0cyksbnVsbD09PW4uX3JlZkNvdW50JiZzJiYobi5fcmVmQ291bnQ9MSl9aWYobi5hc3NlcnRJbnB1dENvbXBhdGliaWxpdHkoZSkscyl7Zm9yKHZhciB1PVtdLGM9MCxwPXRvTGlzdChmPW4uY2FsbChlLHQpKTtjPHAubGVuZ3RoO2MrKyl7dmFyIGg9cFtjXTstMSE9PXIuaW5kZXhPZihoKSYmKGg9aC5jbG9uZSgpKSx1LnB1c2goaCl9aWYoZj1zaW5nbGV0b25PckFycmF5KHUpLG51bGwhPW4uYWN0aXZpdHlSZWd1bGFyaXplcil0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcIkxheWVyIGludm9jYXRpb24gaW4gdGhlIHByZXNlbmNlIG9mIGFjdGl2aXR5IHJlZ3VsYXJpemVyKHMpIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LlwiKTtyZXR1cm4gZn12YXIgZD1jb2xsZWN0SW5wdXRTaGFwZShlKSxnPW4uY29tcHV0ZU91dHB1dFNoYXBlKGQpLGY9dm9pZCAwLG09Z3Vlc3NPdXRwdXREVHlwZShlKTtpZihuLndhcm5PbkluY29tcGF0aWJsZUlucHV0U2hhcGUoQXJyYXkuaXNBcnJheShlKT9kWzBdOmQpLGY9bnVsbCE9ZyYmZy5sZW5ndGg+MCYmQXJyYXkuaXNBcnJheShnWzBdKT9nLm1hcChmdW5jdGlvbihyLGkpe3JldHVybiBuZXcgU3ltYm9saWNUZW5zb3IobSxyLG4sdG9MaXN0KGUpLHQsbi5uYW1lLGkpfSk6bmV3IFN5bWJvbGljVGVuc29yKG0sZyxuLHRvTGlzdChlKSx0LG4ubmFtZSksbi5hZGRJbmJvdW5kTm9kZShlLGYsbnVsbCxudWxsLGQsZyx0KSxuLl9yZWZDb3VudCsrLG51bGwhPW4uYWN0aXZpdHlSZWd1bGFyaXplcil0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcIkxheWVyIGludm9jYXRpb24gaW4gdGhlIHByZXNlbmNlIG9mIGFjdGl2aXR5IHJlZ3VsYXJpemVyKHMpIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LlwiKTtyZXR1cm4gZn0pfSx0LnByb3RvdHlwZS53YXJuT25JbmNvbXBhdGlibGVJbnB1dFNoYXBlPWZ1bmN0aW9uKGUpe2lmKG51bGwhPXRoaXMuYmF0Y2hJbnB1dFNoYXBlKWlmKGUubGVuZ3RoIT09dGhpcy5iYXRjaElucHV0U2hhcGUubGVuZ3RoKWNvbnNvbGUud2FybihcIlRoZSByYW5rIG9mIHRoZSBpbnB1dCB0ZW5zb3IgcHJvdmlkZWQgKHNoYXBlOiBcIitKU09OLnN0cmluZ2lmeShlKStcIikgZG9lcyBub3QgbWF0Y2ggdGhhdCBvZiB0aGUgYmF0Y2hJbnB1dFNoYXBlIChcIitKU09OLnN0cmluZ2lmeSh0aGlzLmJhdGNoSW5wdXRTaGFwZSkrXCIpIG9mIHRoZSBsYXllciBcIit0aGlzLm5hbWUpO2Vsc2V7dmFyIHQ9ITE7dGhpcy5iYXRjaElucHV0U2hhcGUuZm9yRWFjaChmdW5jdGlvbihuLHIpe251bGwhPW4mJm51bGwhPWVbcl0mJmVbcl0hPT1uJiYodD0hMCl9KSx0JiZjb25zb2xlLndhcm4oXCJUaGUgc2hhcGUgb2YgdGhlIGlucHV0IHRlbnNvciAoXCIrSlNPTi5zdHJpbmdpZnkoZSkrXCIpIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RhdGlvbiBvZiBsYXllciBcIit0aGlzLm5hbWUrXCI6IFwiK0pTT04uc3RyaW5naWZ5KHRoaXMuYmF0Y2hJbnB1dFNoYXBlKSl9fSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJvdXRwdXRTaGFwZVwiLHtnZXQ6ZnVuY3Rpb24oKXtpZihudWxsPT10aGlzLmluYm91bmROb2Rlc3x8MD09PXRoaXMuaW5ib3VuZE5vZGVzLmxlbmd0aCl0aHJvdyBuZXcgQXR0cmlidXRlRXJyb3IoXCJUaGUgbGF5ZXIgXCIrdGhpcy5uYW1lK1wiIGhhcyBuZXZlciBiZWVuIGNhbGxlZCBhbmQgdGh1cyBoYXMgbm8gZGVmaW5lZCBvdXRwdXQgc2hhcGUuXCIpO2Zvcih2YXIgZT1bXSx0PTAsbj10aGlzLmluYm91bmROb2Rlczt0PG4ubGVuZ3RoO3QrKyl7dmFyIHI9blt0XSxpPUpTT04uc3RyaW5naWZ5KHIub3V0cHV0U2hhcGVzKTstMT09PWUuaW5kZXhPZihpKSYmZS5wdXNoKGkpfWlmKDE9PT1lLmxlbmd0aCl7dmFyIGE9dGhpcy5pbmJvdW5kTm9kZXNbMF0ub3V0cHV0U2hhcGVzO3JldHVybiBBcnJheS5pc0FycmF5KGEpJiZBcnJheS5pc0FycmF5KGFbMF0pJiYxPT09YS5sZW5ndGg/YVswXTphfXRocm93IG5ldyBBdHRyaWJ1dGVFcnJvcihcIlRoZSBsYXllciBcIit0aGlzLm5hbWUrJyBoYXMgbXVsdGlwbGUgaW5ib3VuZCBub2RlcyB3aXRoIGRpZmZlcmVudCBvdXRwdXQgc2hhcGVzLiBIZW5jZSB0aGUgbm90aW9uIG9mIFwib3V0dXQgc2hhcGVcIiBpcyBpbGwtZGVmaW5lZCBmb3IgdGhlIGxheWVyLicpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmNvdW50UGFyYW1zPWZ1bmN0aW9uKCl7aWYoIXRoaXMuYnVpbHQpdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihcIllvdSB0cmllZCB0byBjYWxsIGNvdW50UGFyYW1zKCkgb24gXCIrdGhpcy5uYW1lK1wiLCBidXQgdGhlIGxheWVyIGlzIG5vdCBidWlsdCB5ZXQuIEJ1aWxkIGl0IGZpcnN0IGJ5IGNhbGxpbmcgYnVpbGQoYmF0Y2hJbnB1dFNoYXBlKS5cIik7cmV0dXJuIGNvdW50UGFyYW1zSW5XZWlnaHRzKHRoaXMud2VpZ2h0cyl9LHQucHJvdG90eXBlLmJ1aWxkPWZ1bmN0aW9uKGUpe3RoaXMuYnVpbHQ9ITB9LHQucHJvdG90eXBlLmdldFdlaWdodHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSExKSxiYXRjaEdldFZhbHVlKGU/dGhpcy50cmFpbmFibGVXZWlnaHRzOnRoaXMud2VpZ2h0cyl9LHQucHJvdG90eXBlLnNldFdlaWdodHM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aWR5KGZ1bmN0aW9uKCl7dmFyIG49dC53ZWlnaHRzO2lmKG4ubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1lvdSBjYWxsZWQgc2V0V2VpZ2h0cyh3ZWlnaHRzKSBvbiBsYXllciBcIicrdC5uYW1lKydcIiB3aXRoIGEgd2VpZ2h0IGxpc3Qgb2YgbGVuZ3RoICcrZS5sZW5ndGgrXCIsIGJ1dCB0aGUgbGF5ZXIgd2FzIGV4cGVjdGluZyBcIituLmxlbmd0aCtcIiB3ZWlnaHRzLiBQcm92aWRlZCB3ZWlnaHRzOiBcIitlK1wiLi4uXCIpO2lmKDAhPT1uLmxlbmd0aCl7Zm9yKHZhciByPVtdLGk9YmF0Y2hHZXRWYWx1ZShuKSxhPTA7YTxpLmxlbmd0aDsrK2Epe3ZhciBvPWlbYV0scz1uW2FdLGw9ZVthXTtpZighdXRpbC5hcnJheXNFcXVhbChvLnNoYXBlLGwuc2hhcGUpKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiTGF5ZXIgd2VpZ2h0IHNoYXBlIFwiK28uc2hhcGUrXCIgbm90IGNvbXBhdGlibGUgd2l0aCBwcm92aWRlZCB3ZWlnaHQgc2hhcGUgXCIrbC5zaGFwZSk7ci5wdXNoKFtzLGxdKX1iYXRjaFNldFZhbHVlKHIpfX0pfSx0LnByb3RvdHlwZS5hZGRXZWlnaHQ9ZnVuY3Rpb24oZSx0LG4scixpLGEsbyl7aWYoLTEhPT10aGlzLl9hZGRlZFdlaWdodE5hbWVzLmluZGV4T2YoZSkpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJEdXBsaWNhdGUgd2VpZ2h0IG5hbWUgXCIrZStcIiBmb3IgbGF5ZXIgXCIrdGhpcy5uYW1lKTt0aGlzLl9hZGRlZFdlaWdodE5hbWVzLnB1c2goZSksbnVsbD09biYmKG49XCJmbG9hdDMyXCIpO3ZhciBzPW5ldyBMYXllclZhcmlhYmxlKHIuYXBwbHkodCxuKSxuLGUsYSxvKTtyZXR1cm4gbnVsbCE9aSYmdGhpcy5hZGRMb3NzKGZ1bmN0aW9uKCl7cmV0dXJuIGkuYXBwbHkocy5yZWFkKCkpfSksbnVsbD09YSYmKGE9ITApLGE/dGhpcy5fdHJhaW5hYmxlV2VpZ2h0cy5wdXNoKHMpOnRoaXMuX25vblRyYWluYWJsZVdlaWdodHMucHVzaChzKSxzfSx0LnByb3RvdHlwZS5hZGRMb3NzPWZ1bmN0aW9uKGUpe3ZhciB0O251bGw9PWV8fEFycmF5LmlzQXJyYXkoZSkmJjA9PT1lLmxlbmd0aHx8KGU9dG9MaXN0KGUpLHZvaWQgMCE9PXRoaXMuX2xvc3NlcyYmbnVsbCE9PXRoaXMuX2xvc3NlcyYmKHQ9dGhpcy5sb3NzZXMpLnB1c2guYXBwbHkodCxlKSl9LHQucHJvdG90eXBlLmNvbXB1dGVPdXRwdXRTaGFwZT1mdW5jdGlvbihlKXtyZXR1cm4gZX0sdC5wcm90b3R5cGUuY29tcHV0ZU1hc2s9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKCF0aGlzLnN1cHBvcnRzTWFza2luZyl7aWYobnVsbCE9dCl7aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkxheWVyIFwiK3RoaXMubmFtZStcIiBkb2VzIG5vdCBzdXBwb3J0IG1hc2tpbmcsYnV0IHdhcyBwYXNzZWQgYW4gaW5wdXRNYXNrLlwiKTt0LmZvckVhY2goZnVuY3Rpb24oZSl7aWYobnVsbCE9ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiTGF5ZXIgXCIrbi5uYW1lK1wiIGRvZXMgbm90IHN1cHBvcnQgbWFza2luZyxidXQgd2FzIHBhc3NlZCBhbiBpbnB1dE1hc2suXCIpfSl9cmV0dXJuIG51bGx9cmV0dXJuIHR9LHQucHJvdG90eXBlLmFkZEluYm91bmROb2RlPWZ1bmN0aW9uKGUsdCxuLHIsaSxhLG8pe3ZvaWQgMD09PW8mJihvPW51bGwpO3ZhciBzPXRvTGlzdChlKTt0PXRvTGlzdCh0KSxuPXRvTGlzdChuKSxyPXRvTGlzdChyKSxpPW5vcm1hbGl6ZVNoYXBlTGlzdChpKSxhPW5vcm1hbGl6ZVNoYXBlTGlzdChhKTtmb3IodmFyIGw9W10sdT1bXSxjPVtdLHA9MCxoPXM7cDxoLmxlbmd0aDtwKyspe3ZhciBkPWhbcF07bC5wdXNoKGQuc291cmNlTGF5ZXIpLHUucHVzaChkLm5vZGVJbmRleCksYy5wdXNoKGQudGVuc29ySW5kZXgpfW5ldyBOb2RlKHtvdXRib3VuZExheWVyOnRoaXMsaW5ib3VuZExheWVyczpsLG5vZGVJbmRpY2VzOnUsdGVuc29ySW5kaWNlczpjLGlucHV0VGVuc29yczpzLG91dHB1dFRlbnNvcnM6dCxpbnB1dE1hc2tzOm4sb3V0cHV0TWFza3M6cixpbnB1dFNoYXBlczppLG91dHB1dFNoYXBlczphfSxvKTtmb3IodmFyIGc9MDtnPHQubGVuZ3RoO2crKyl0W2ddLnNvdXJjZUxheWVyPXRoaXMsdFtnXS5ub2RlSW5kZXg9dGhpcy5pbmJvdW5kTm9kZXMubGVuZ3RoLTEsdFtnXS50ZW5zb3JJbmRleD1nfSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXt2YXIgZT17bmFtZTp0aGlzLm5hbWUsdHJhaW5hYmxlOnRoaXMudHJhaW5hYmxlfTtyZXR1cm4gbnVsbCE9dGhpcy5iYXRjaElucHV0U2hhcGUmJihlLmJhdGNoSW5wdXRTaGFwZT10aGlzLmJhdGNoSW5wdXRTaGFwZSksbnVsbCE9dGhpcy5kdHlwZSYmKGUuZHR5cGU9dGhpcy5kdHlwZSksZX0sdC5wcm90b3R5cGUuZGlzcG9zZVdlaWdodHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZWlnaHRzLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGlzcG9zZSgpfSksdGhpcy53ZWlnaHRzLmxlbmd0aH0sdC5wcm90b3R5cGUuYXNzZXJ0Tm90RGlzcG9zZWQ9ZnVuY3Rpb24oKXtpZigwPT09dGhpcy5fcmVmQ291bnQpdGhyb3cgbmV3IEVycm9yKFwiTGF5ZXIgJ1wiK3RoaXMubmFtZStcIicgaXMgYWxyZWFkeSBkaXNwb3NlZC5cIil9LHQucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtpZighdGhpcy5idWlsdCl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZGlzcG9zZSBMYXllciBcIit0aGlzLm5hbWUrXCIgYmVjYXVzZSBpdCBoYXMgbm90IGJlZW4gYnVpbHQgeWV0LlwiKTtpZihudWxsPT09dGhpcy5fcmVmQ291bnQpdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGRpc3Bvc2UgTGF5ZXIgXCIrdGhpcy5uYW1lK1wiIGJlY2F1c2UgaXQgaGFzIG5vdCBiZWVuIHVzZWQgeWV0LlwiKTt0aGlzLmFzc2VydE5vdERpc3Bvc2VkKCk7dmFyIGU9MDtyZXR1cm4gMD09LS10aGlzLl9yZWZDb3VudCYmKGU9dGhpcy5kaXNwb3NlV2VpZ2h0cygpKSx7cmVmQ291bnRBZnRlckRpc3Bvc2U6dGhpcy5fcmVmQ291bnQsbnVtRGlzcG9zZWRWYXJpYWJsZXM6ZX19LHR9KHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlKTtmdW5jdGlvbiBjb2xsZWN0SW5wdXRTaGFwZShlKXtmb3IodmFyIHQ9W10sbj0wLHI9ZT10b0xpc3QoZSk7bjxyLmxlbmd0aDtuKyspe3ZhciBpPXJbbl07dC5wdXNoKGkuc2hhcGUpfXJldHVybiBzaW5nbGV0b25PckFycmF5KHQpfWZ1bmN0aW9uIGd1ZXNzT3V0cHV0RFR5cGUoZSl7cmV0dXJuXCJmbG9hdDMyXCJ9ZnVuY3Rpb24gZ2V0U291cmNlSW5wdXRzKGUsdCxuKXtpZigobnVsbD09dHx8bnVsbCE9biYmbj4wKSYmKHQ9ZS5zb3VyY2VMYXllcixuPWUubm9kZUluZGV4KSwwPT09dC5pbmJvdW5kTm9kZXMubGVuZ3RoKXJldHVybltlXTt2YXIgcj10LmluYm91bmROb2Rlc1tuXTtpZigwPT09ci5pbmJvdW5kTGF5ZXJzLmxlbmd0aClyZXR1cm4gci5pbnB1dFRlbnNvcnM7Zm9yKHZhciBpPVtdLGE9MDthPHIuaW5ib3VuZExheWVycy5sZW5ndGg7YSsrKWZvcih2YXIgbz0wLHM9Z2V0U291cmNlSW5wdXRzKHIuaW5wdXRUZW5zb3JzW2FdLHIuaW5ib3VuZExheWVyc1thXSxyLm5vZGVJbmRpY2VzW2FdKTtvPHMubGVuZ3RoO28rKyl7dmFyIGw9c1tvXTstMT09PWkuaW5kZXhPZihsKSYmaS5wdXNoKGwpfXJldHVybiBpfXZhciBJbnB1dExheWVyPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIG49ZS5jYWxsKHRoaXMse2R0eXBlOnQuZHR5cGUsbmFtZTpudWxsIT10Lm5hbWU/dC5uYW1lOmdldFVpZChcImlucHV0XCIpLnRvU3RyaW5nKCl9KXx8dGhpcztpZihudWxsPT10LmJhdGNoU2l6ZSYmKHQuYmF0Y2hTaXplPW51bGwpLG51bGw9PXQuc3BhcnNlJiYodC5zcGFyc2U9ITEpLG4udHJhaW5hYmxlPSExLG4uYnVpbHQ9ITAsbi5zcGFyc2U9dC5zcGFyc2UsbnVsbCE9dC5pbnB1dFNoYXBlJiZudWxsIT10LmJhdGNoSW5wdXRTaGFwZSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIk9ubHkgcHJvdmlkZSB0aGUgaW5wdXRTaGFwZSBPUiBiYXRjaElucHV0U2hhcGUgYXJndW1lbnQgdG8gaW5wdXRMYXllciwgbm90IGJvdGggYXQgdGhlIHNhbWUgdGltZS5cIik7dmFyIHI9dC5iYXRjaElucHV0U2hhcGU7aWYobnVsbD09cil7aWYobnVsbD09dC5pbnB1dFNoYXBlKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiQW4gSW5wdXRMYXllciBzaG91bGQgYmUgcGFzc2VkIGVpdGhlciBhIGBiYXRjaElucHV0U2hhcGVgIG9yIGFuIGBpbnB1dFNoYXBlYC5cIik7cj1bdC5iYXRjaFNpemVdLmNvbmNhdCh0LmlucHV0U2hhcGUpfWVsc2UgaWYobnVsbCE9dC5iYXRjaFNpemUpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJDYW5ub3Qgc3BlY2lmeSBiYXRjaFNpemUgaWYgYmF0Y2hJbnB1dFNoYXBlIGlzc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgYW4gSW5wdXRMYXllci5cIik7dmFyIGk9dC5kdHlwZXx8XCJmbG9hdDMyXCI7bi5iYXRjaElucHV0U2hhcGU9cixuLmR0eXBlPWksbi5pbnB1dFNwZWM9W3tzaGFwZTpyfV07dmFyIGE9bmV3IFN5bWJvbGljVGVuc29yKG4uZHR5cGUsbi5iYXRjaElucHV0U2hhcGUsbixbXSx7fSxuLm5hbWUpO3JldHVybiBhLm5vZGVJbmRleD0wLGEudGVuc29ySW5kZXg9MCxuZXcgTm9kZSh7b3V0Ym91bmRMYXllcjpuLGluYm91bmRMYXllcnM6W10sbm9kZUluZGljZXM6W10sdGVuc29ySW5kaWNlczpbXSxpbnB1dFRlbnNvcnM6W2FdLG91dHB1dFRlbnNvcnM6W2FdLGlucHV0TWFza3M6W251bGxdLG91dHB1dE1hc2tzOltudWxsXSxpbnB1dFNoYXBlczpbcl0sb3V0cHV0U2hhcGVzOltyXX0pLG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKGUsdCl7dGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJDYW5ub3QgcGFzcyBhbnkgaW5wdXQgdG8gYW4gSW5wdXRMYXllcidzIGFwcGx5KCkgbWV0aG9kLiBJbnB1dExheWVyIG5hbWU6IFwiK3RoaXMubmFtZSl9LHQucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm57cmVmQ291bnRBZnRlckRpc3Bvc2U6dGhpcy5fcmVmQ291bnQsbnVtRGlzcG9zZWRWYXJpYWJsZXM6MH19LHQucHJvdG90eXBlLmdldENvbmZpZz1mdW5jdGlvbigpe3JldHVybntiYXRjaElucHV0U2hhcGU6dGhpcy5iYXRjaElucHV0U2hhcGUsZHR5cGU6dGhpcy5kdHlwZSxzcGFyc2U6dGhpcy5zcGFyc2UsbmFtZTp0aGlzLm5hbWV9fSx0LmNsYXNzTmFtZT1cIklucHV0TGF5ZXJcIix0fShMYXllcik7ZnVuY3Rpb24gSW5wdXQoZSl7aWYobnVsbD09ZS5iYXRjaFNoYXBlJiZudWxsPT1lLnNoYXBlKXRocm93IG5ldyBFcnJvcihcIlBsZWFzZSBwcm92aWRlIHRvIElucHV0IGVpdGhlciBhIGBzaGFwZWAgb3IgYSBgYmF0Y2hTaGFwZWAgYXJndW1lbnQuIE5vdGUgdGhhdCBgc2hhcGVgIGRvZXMgbm90IGluY2x1ZGUgdGhlIGJhdGNoIGRpbWVuc2lvbi5cIik7aWYobnVsbCE9ZS5iYXRjaFNoYXBlJiZudWxsIT1lLnNoYXBlKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiUGxlYXNlIHByb3ZpZGUgZWl0aGVyIGEgYHNoYXBlYCBvciBgYmF0Y2hTaGFwZWAgYXJndW1lbnQgdG8gSW5wdXQsIGJ1dCBub3QgYm90aC5cIik7dmFyIHQ9ZS5iYXRjaFNoYXBlO251bGwhPWUuc2hhcGUmJm51bGw9PXQmJih0PVtudWxsXS5jb25jYXQoZS5zaGFwZSkpO3ZhciBuPWUuZHR5cGU7cmV0dXJuIG51bGw9PW4mJihuPVwiZmxvYXQzMlwiKSxuZXcgSW5wdXRMYXllcih7YmF0Y2hJbnB1dFNoYXBlOnQsbmFtZTplLm5hbWUsZHR5cGU6bixzcGFyc2U6ZS5zcGFyc2V9KS5pbmJvdW5kTm9kZXNbMF0ub3V0cHV0VGVuc29yc1swXX1mdW5jdGlvbiBsMk5vcm1hbGl6ZShlLHQpe3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7dmFyIG49c3VtKHNxdWFyZShlKSx0LCEwKSxyPW11bChzY2FsYXIoZXBzaWxvbigpKSxvbmVzTGlrZShlKSksaT1zcXJ0KG1heGltdW0obixyKSk7cmV0dXJuIGRpdihlLGkpfSl9ZnVuY3Rpb24gbWVhblNxdWFyZWRFcnJvcihlLHQpe3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7cmV0dXJuIG1lYW4oc3F1YXJlKHN1Yih0LGUpKSwtMSl9KX1mdW5jdGlvbiBtZWFuQWJzb2x1dGVFcnJvcihlLHQpe3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7cmV0dXJuIG1lYW4oYWJzKHN1Yih0LGUpKSwtMSl9KX1mdW5jdGlvbiBtZWFuQWJzb2x1dGVQZXJjZW50YWdlRXJyb3IoZSx0KXtyZXR1cm4gdGlkeShmdW5jdGlvbigpe3ZhciBuPXN1YihlLHQpLHI9Y2xpcEJ5VmFsdWUoYWJzKGUpLGVwc2lsb24oKSxOdW1iZXIuTUFYX1ZBTFVFKSxpPWFicyhkaXYobixyKSk7cmV0dXJuIG11bChnZXRTY2FsYXIoMTAwKSxtZWFuKGksLTEpKX0pfWZ1bmN0aW9uIG1lYW5TcXVhcmVkTG9nYXJpdGhtaWNFcnJvcihlLHQpe3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7dmFyIG49Z2V0U2NhbGFyKDEpLHI9Y2xpcEJ5VmFsdWUodCxlcHNpbG9uKCksTnVtYmVyLk1BWF9WQUxVRSksaT1sb2coYWRkKG4scikpLGE9Y2xpcEJ5VmFsdWUoZSxlcHNpbG9uKCksTnVtYmVyLk1BWF9WQUxVRSksbz1sb2coYWRkKG4sYSkpO3JldHVybiBtZWFuKHNxdWFyZShzdWIoaSxvKSksLTEpfSl9ZnVuY3Rpb24gc3F1YXJlZEhpbmdlKGUsdCl7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXt2YXIgbj1nZXRTY2FsYXIoMCkscj1nZXRTY2FsYXIoMSksaT1tYXhpbXVtKG4sc3ViKHIsbXVsKGUsdCkpKTtyZXR1cm4gbWVhbihzcXVhcmUoaSksLTEpfSl9ZnVuY3Rpb24gaGluZ2UoZSx0KXtyZXR1cm4gdGlkeShmdW5jdGlvbigpe3ZhciBuPWdldFNjYWxhcigwKSxyPWdldFNjYWxhcigxKSxpPW1heGltdW0obixzdWIocixtdWwoZSx0KSkpO3JldHVybiBtZWFuKGksLTEpfSl9ZnVuY3Rpb24gY2F0ZWdvcmljYWxIaW5nZShlLHQpe3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7dmFyIG49Z2V0U2NhbGFyKDApLHI9Z2V0U2NhbGFyKDEpLGk9c3VtKG11bChlLHQpLC0xKSxhPW1heChtdWwoc3ViKHIsZSksdCksLTEpO3JldHVybiBtYXhpbXVtKG4sYWRkKHIsc3ViKGEsaSkpKX0pfWZ1bmN0aW9uIGxvZ2Nvc2goZSx0KXtyZXR1cm4gdGlkeShmdW5jdGlvbigpe3ZhciBuPWdldFNjYWxhcihNYXRoLmxvZygyKSkscj1zdWIodCxlKSxpPXN1YihhZGQocixzb2Z0cGx1cyhtdWwoZ2V0U2NhbGFyKC0yKSxyKSkpLG4pO3JldHVybiBtZWFuKGksLTEpfSl9ZnVuY3Rpb24gY2F0ZWdvcmljYWxDcm9zc2VudHJvcHkoZSx0LG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj0hMSksdGlkeShmdW5jdGlvbigpe2lmKG4pdD1zb2Z0bWF4KHQpO2Vsc2V7dmFyIHI9c3VtKHQsdC5zaGFwZS5sZW5ndGgtMSwhMCk7dD1kaXYodCxyKX1yZXR1cm4gdD1jbGlwQnlWYWx1ZSh0LGVwc2lsb24oKSwxLWVwc2lsb24oKSksbmVnKHN1bShtdWwoZS50b0Zsb2F0KCksbG9nKHQpKSx0LnNoYXBlLmxlbmd0aC0xKSl9KX1mdW5jdGlvbiBzcGFyc2VDYXRlZ29yaWNhbENyb3NzZW50cm9weShlLHQsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPSExKSx0aWR5KGZ1bmN0aW9uKCl7dmFyIHI9Zmxvb3IoZmxhdHRlbihlKSkudG9JbnQoKSxpPXQuc2hhcGU7cmV0dXJuIGNhdGVnb3JpY2FsQ3Jvc3NlbnRyb3B5KG9uZUhvdChyLGlbaS5sZW5ndGgtMV0pLnJlc2hhcGUoaSksdCxuKX0pfWZ1bmN0aW9uIHNpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzKGUsdCl7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXt2YXIgbj1tYXhpbXVtKHQsemVyb3NMaWtlKHQpKSxyPW11bCh0LGUpLGk9bG9nKGFkZChnZXRTY2FsYXIoMSksZXhwKG5lZyhhYnModCkpKSkpO3JldHVybiBhZGQoc3ViKG4sciksaSl9KX1mdW5jdGlvbiBiaW5hcnlDcm9zc2VudHJvcHkoZSx0KXtyZXR1cm4gdGlkeShmdW5jdGlvbigpe3ZhciBuO3JldHVybiBuPWNsaXBCeVZhbHVlKHQsZXBzaWxvbigpLDEtZXBzaWxvbigpKSxuPWxvZyhkaXYobixzdWIob25lc0xpa2UobiksbikpKSxtZWFuKHNpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzKGUsbiksLTEpfSl9ZnVuY3Rpb24ga3VsbGJhY2tMZWlibGVyRGl2ZXJnZW5jZShlLHQpe3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7dmFyIG49Y2xpcEJ5VmFsdWUoZSxlcHNpbG9uKCksMSkscj1jbGlwQnlWYWx1ZSh0LGVwc2lsb24oKSwxKTtyZXR1cm4gc3VtKG11bChlLGxvZyhkaXYobixyKSkpLC0xKX0pfWZ1bmN0aW9uIHBvaXNzb24oZSx0KXtyZXR1cm4gdGlkeShmdW5jdGlvbigpe3ZhciBuPWxvZyhhZGQoZ2V0U2NhbGFyKGVwc2lsb24oKSksdCkpO3JldHVybiBtZWFuKHN1Yih0LG11bChlLG4pKSwtMSl9KX1mdW5jdGlvbiBjb3NpbmVQcm94aW1pdHkoZSx0KXtyZXR1cm4gdGlkeShmdW5jdGlvbigpe3ZhciBuPWwyTm9ybWFsaXplKGUsLTEpLHI9bDJOb3JtYWxpemUodCwtMSksaT1tdWwobixyKTtyZXR1cm4gbmVnKHN1bShpLC0xKSl9KX1mdW5jdGlvbiBnZXQoZSl7dmFyIHQ9e21lYW5TcXVhcmVkRXJyb3I6bWVhblNxdWFyZWRFcnJvcixtZWFuQWJzb2x1dGVFcnJvcjptZWFuQWJzb2x1dGVFcnJvcixtZWFuQWJzb2x1dGVQZXJjZW50YWdlRXJyb3I6bWVhbkFic29sdXRlUGVyY2VudGFnZUVycm9yLG1lYW5TcXVhcmVkTG9nYXJpdGhtaWNFcnJvcjptZWFuU3F1YXJlZExvZ2FyaXRobWljRXJyb3Isc3F1YXJlZEhpbmdlOnNxdWFyZWRIaW5nZSxoaW5nZTpoaW5nZSxjYXRlZ29yaWNhbEhpbmdlOmNhdGVnb3JpY2FsSGluZ2UsbG9nY29zaDpsb2djb3NoLGNhdGVnb3JpY2FsQ3Jvc3NlbnRyb3B5OmNhdGVnb3JpY2FsQ3Jvc3NlbnRyb3B5LHNwYXJzZUNhdGVnb3JpY2FsQ3Jvc3NlbnRyb3B5OnNwYXJzZUNhdGVnb3JpY2FsQ3Jvc3NlbnRyb3B5LGJpbmFyeUNyb3NzZW50cm9weTpiaW5hcnlDcm9zc2VudHJvcHksa3VsbGJhY2tMZWlibGVyRGl2ZXJnZW5jZTprdWxsYmFja0xlaWJsZXJEaXZlcmdlbmNlLHBvaXNzb246cG9pc3Nvbixjb3NpbmVQcm94aW1pdHk6Y29zaW5lUHJveGltaXR5fTtpZihcInN0cmluZ1wiPT10eXBlb2YgZSl7aWYoZSBpbiB0KXJldHVybiB0W2VdO3ZhciBuPVwiVW5rbm93biBsb3NzIFwiK2U7dGhyb3cgZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwic29mdG1heGNyb3NzZW50cm9weVwiKSYmKG49XCJVbmtub3duIGxvc3MgXCIrZSsnLiBVc2UgXCJjYXRlZ29yaWNhbENyb3NzZW50cm9weVwiIGFzIHRoZSBzdHJpbmcgbmFtZSBmb3IgdGYubG9zc2VzLnNvZnRtYXhDcm9zc0VudHJvcHknKSxuZXcgVmFsdWVFcnJvcihuKX1yZXR1cm4gZX1mdW5jdGlvbiBiaW5hcnlBY2N1cmFjeShlLHQpe3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7dmFyIG49bXVsKGdldFNjYWxhciguNSksb25lc0xpa2UodCkpLHI9Y2FzdCQxKGdyZWF0ZXIodCxuKSxlLmR0eXBlKTtyZXR1cm4gbWVhbihlcXVhbChlLHIpLC0xKX0pfWZ1bmN0aW9uIGNhdGVnb3JpY2FsQWNjdXJhY3koZSx0KXtyZXR1cm4gdGlkeShmdW5jdGlvbigpe3JldHVybiBjYXN0JDEoZXF1YWwoYXJnTWF4KGUsLTEpLGFyZ01heCh0LC0xKSksXCJmbG9hdDMyXCIpfSl9ZnVuY3Rpb24gdHJ1ZVBvc2l0aXZlcyhlLHQpe3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7dmFyIG49Z2V0U2NhbGFyKDEpO3JldHVybiBsb2dpY2FsQW5kKGUuZXF1YWwobiksdC5lcXVhbChuKSkuc3VtKCkuY2FzdChcImZsb2F0MzJcIil9KX1mdW5jdGlvbiBmYWxzZU5lZ2F0aXZlcyhlLHQpe3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7dmFyIG49Z2V0U2NhbGFyKDEpLHI9Z2V0U2NhbGFyKDApO3JldHVybiBsb2dpY2FsQW5kKGUuZXF1YWwobiksdC5lcXVhbChyKSkuc3VtKCkuY2FzdChcImZsb2F0MzJcIil9KX1mdW5jdGlvbiBmYWxzZVBvc2l0aXZlcyhlLHQpe3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7dmFyIG49Z2V0U2NhbGFyKDEpLHI9Z2V0U2NhbGFyKDApO3JldHVybiBsb2dpY2FsQW5kKGUuZXF1YWwociksdC5lcXVhbChuKSkuc3VtKCkuY2FzdChcImZsb2F0MzJcIil9KX1mdW5jdGlvbiBwcmVjaXNpb24oZSx0KXtyZXR1cm4gdGlkeShmdW5jdGlvbigpe3ZhciBuPWdldFNjYWxhcigwKSxyPXRydWVQb3NpdGl2ZXMoZSx0KSxpPWZhbHNlUG9zaXRpdmVzKGUsdCksYT1yLmFkZChpKTtyZXR1cm4gd2hlcmUoZ3JlYXRlcihhLG4pLHIuZGl2KGEpLG4pLmNhc3QoXCJmbG9hdDMyXCIpfSl9ZnVuY3Rpb24gcmVjYWxsKGUsdCl7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXt2YXIgbj1nZXRTY2FsYXIoMCkscj10cnVlUG9zaXRpdmVzKGUsdCksaT1mYWxzZU5lZ2F0aXZlcyhlLHQpLGE9ci5hZGQoaSk7cmV0dXJuIHdoZXJlKGdyZWF0ZXIoYSxuKSxyLmRpdihhKSxuKS5jYXN0KFwiZmxvYXQzMlwiKX0pfWZ1bmN0aW9uIGJpbmFyeUNyb3NzZW50cm9weSQxKGUsdCl7cmV0dXJuIGJpbmFyeUNyb3NzZW50cm9weShlLHQpfWZ1bmN0aW9uIHNwYXJzZUNhdGVnb3JpY2FsQWNjdXJhY3koZSx0KXt0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcn1zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoSW5wdXRMYXllcik7dmFyIG1zZSQxPW1lYW5TcXVhcmVkRXJyb3IsTVNFJDE9bWVhblNxdWFyZWRFcnJvcixtYWUkMT1tZWFuQWJzb2x1dGVFcnJvcixNQUUkMT1tZWFuQWJzb2x1dGVFcnJvcixtYXBlJDE9bWVhbkFic29sdXRlUGVyY2VudGFnZUVycm9yLE1BUEUkMT1tZWFuQWJzb2x1dGVQZXJjZW50YWdlRXJyb3IsY2F0ZWdvcmljYWxDcm9zc2VudHJvcHkkMT1jYXRlZ29yaWNhbENyb3NzZW50cm9weSxjb3NpbmUkMT1jb3NpbmVQcm94aW1pdHksc3BhcnNlQ2F0ZWdvcmljYWxDcm9zc2VudHJvcHkkMT1zcGFyc2VDYXRlZ29yaWNhbENyb3NzZW50cm9weTtmdW5jdGlvbiBnZXQkMShlKXt2YXIgdD17YmluYXJ5QWNjdXJhY3k6YmluYXJ5QWNjdXJhY3ksY2F0ZWdvcmljYWxBY2N1cmFjeTpjYXRlZ29yaWNhbEFjY3VyYWN5LHByZWNpc2lvbjpwcmVjaXNpb24sY2F0ZWdvcmljYWxDcm9zc2VudHJvcHk6Y2F0ZWdvcmljYWxDcm9zc2VudHJvcHkkMSxzcGFyc2VDYXRlZ29yaWNhbENyb3NzZW50cm9weTpzcGFyc2VDYXRlZ29yaWNhbENyb3NzZW50cm9weSQxLG1zZTptc2UkMSxNU0U6TVNFJDEsbWFlOm1hZSQxLE1BRTpNQUUkMSxtYXBlOm1hcGUkMSxNQVBFOk1BUEUkMSxjb3NpbmU6Y29zaW5lJDF9O2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlJiZlIGluIHQpcmV0dXJuIHRbZV07aWYoXCJzdHJpbmdcIiE9dHlwZW9mIGUmJm51bGwhPWUpcmV0dXJuIGU7dGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJVbmtub3duIG1ldHJpYyBcIitlKX1mdW5jdGlvbiBnZXRPcHRpbWl6ZXIoZSl7dmFyIHQ9e0FkYWdyYWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdHJhaW4uYWRhZ3JhZCguMDEpfSxBZGFkZWx0YTpmdW5jdGlvbigpe3JldHVybiB0cmFpbi5hZGFkZWx0YSgxLC45NSxlcHNpbG9uKCkpfSxBZGFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRyYWluLmFkYW0oLjAwMSwuOSwuOTk5LGVwc2lsb24oKSl9LEFkYW1heDpmdW5jdGlvbigpe3JldHVybiB0cmFpbi5hZGFtYXgoLjAwMiwuOSwuOTk5LGVwc2lsb24oKSwwKX0sUk1TUHJvcDpmdW5jdGlvbigpe3JldHVybiB0cmFpbi5ybXNwcm9wKC4wMDEsLjksMCxlcHNpbG9uKCkpfSxTR0Q6ZnVuY3Rpb24oKXtyZXR1cm4gdHJhaW4uc2dkKC4wMSl9fTtpZih0LmFkYWdyYWQ9dC5BZGFncmFkLHQuYWRhZGVsdGE9dC5BZGFkZWx0YSx0LmFkYW09dC5BZGFtLHQuYWRhbWF4PXQuQWRhbWF4LHQucm1zcHJvcD10LlJNU1Byb3AsdC5zZ2Q9dC5TR0QsZSBpbiB0KXJldHVybiB0W2VdKCk7dGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJVbmtub3duIE9wdGltaXplciBcIitlKX1mdW5jdGlvbiBwcmludFN1bW1hcnkoZSx0LG4scil7dm9pZCAwPT09ciYmKHI9Y29uc29sZS5sb2cpO3ZhciBpLGE9aXNNb2RlbFNlcXVlbnRpYWxMaWtlKGUpLG89W1wiTGF5ZXIgKHR5cGUpXCIsXCJPdXRwdXQgc2hhcGVcIixcIlBhcmFtICNcIl07aWYoYT8odD10fHw2NSxuPW58fFsuNDUsLjg1LDFdKToodD10fHw5OCxuPW58fFsuMzMsLjU1LC42NywxXSksbltuLmxlbmd0aC0xXTw9MSYmKG49bi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguZmxvb3IodCplKX0pKSwhYSlmb3IodmFyIHMgaW4gby5wdXNoKFwiUmVjZWl2ZXMgaW5wdXRzXCIpLGk9W10sZS5ub2Rlc0J5RGVwdGgpaS5wdXNoLmFwcGx5KGksZS5ub2Rlc0J5RGVwdGhbc10pO3IoXCJfXCIucmVwZWF0KHQpKSxwcmludFJvdyhvLG4scikscihcIj1cIi5yZXBlYXQodCkpO2Zvcih2YXIgbD1lLmxheWVycyx1PTA7dTxsLmxlbmd0aDsrK3UpYT9wcmludExheWVyU3VtbWFyeShsW3VdLG4scik6cHJpbnRMYXllclN1bW1hcnlXaXRoQ29ubmVjdGlvbnMobFt1XSxuLGkscikscigodT09PWwubGVuZ3RoLTE/XCI9XCI6XCJfXCIpLnJlcGVhdCh0KSk7ZS5jaGVja1RyYWluYWJsZVdlaWdodHNDb25zaXN0ZW5jeSgpO3ZhciBjPWNvdW50VHJhaW5hYmxlUGFyYW1zKGUpLHA9Y291bnRQYXJhbXNJbldlaWdodHMoZS5ub25UcmFpbmFibGVXZWlnaHRzKTtyKFwiVG90YWwgcGFyYW1zOiBcIisoYytwKSkscihcIlRyYWluYWJsZSBwYXJhbXM6IFwiK2MpLHIoXCJOb24tdHJhaW5hYmxlIHBhcmFtczogXCIrcCkscihcIl9cIi5yZXBlYXQodCkpfWZ1bmN0aW9uIGNvdW50VHJhaW5hYmxlUGFyYW1zKGUpe3JldHVybiBudWxsIT1lLmNvbGxlY3RlZFRyYWluYWJsZVdlaWdodHM/Y291bnRQYXJhbXNJbldlaWdodHMoZS5jb2xsZWN0ZWRUcmFpbmFibGVXZWlnaHRzKTpjb3VudFBhcmFtc0luV2VpZ2h0cyhlLnRyYWluYWJsZVdlaWdodHMpfWZ1bmN0aW9uIGlzTW9kZWxTZXF1ZW50aWFsTGlrZShlKXt2YXIgdD0hMCxuPVtdLHI9W107Zm9yKHZhciBpIGluIGUubm9kZXNCeURlcHRoKW4ucHVzaChlLm5vZGVzQnlEZXB0aFtpXSk7Zm9yKHZhciBhPTAsbz1uO2E8by5sZW5ndGg7YSsrKXt2YXIgcz1vW2FdO2lmKHMubGVuZ3RoPjF8fDE9PT1zLmxlbmd0aCYmc1swXS5pbmJvdW5kTGF5ZXJzLmxlbmd0aD4xKXt0PSExO2JyZWFrfXIucHVzaC5hcHBseShyLHMpfWlmKHQpZm9yKHZhciBsPTAsdT1lLmxheWVycztsPHUubGVuZ3RoO2wrKyl7Zm9yKHZhciBjPSExLHA9MCxoPXVbbF0uaW5ib3VuZE5vZGVzO3A8aC5sZW5ndGg7cCsrKXt2YXIgZD1oW3BdO2lmKC0xIT09ci5pbmRleE9mKGQpKXtpZihjKXt0PSExO2JyZWFrfWM9ITB9fWlmKCF0KWJyZWFrfXJldHVybiB0fWZ1bmN0aW9uIHByaW50Um93KGUsdCxuKXt2b2lkIDA9PT1uJiYobj1jb25zb2xlLmxvZyk7Zm9yKHZhciByPVwiXCIsaT0wO2k8ZS5sZW5ndGg7KytpKWk+MCYmKHI9ci5zbGljZSgwLHIubGVuZ3RoLTEpK1wiIFwiKSxyPShyKz1lW2ldKS5zbGljZSgwLHRbaV0pLHIrPVwiIFwiLnJlcGVhdCh0W2ldLXIubGVuZ3RoKTtuKHIpfWZ1bmN0aW9uIHByaW50TGF5ZXJTdW1tYXJ5KGUsdCxuKXt2YXIgcjt0cnl7cj1KU09OLnN0cmluZ2lmeShlLm91dHB1dFNoYXBlKX1jYXRjaChlKXtyPVwibXVsdGlwbGVcIn1wcmludFJvdyhbZS5uYW1lK1wiIChcIitlLmdldENsYXNzTmFtZSgpK1wiKVwiLHIsZS5jb3VudFBhcmFtcygpLnRvU3RyaW5nKCldLHQsbil9ZnVuY3Rpb24gcHJpbnRMYXllclN1bW1hcnlXaXRoQ29ubmVjdGlvbnMoZSx0LG4scil7dmFyIGk7dHJ5e2k9SlNPTi5zdHJpbmdpZnkoZS5vdXRwdXRTaGFwZSl9Y2F0Y2goZSl7aT1cIm11bHRpcGxlXCJ9Zm9yKHZhciBhPVtdLG89MCxzPWUuaW5ib3VuZE5vZGVzO288cy5sZW5ndGg7bysrKXt2YXIgbD1zW29dO2lmKCEobnVsbCE9biYmbi5sZW5ndGg+MCYmLTE9PT1uLmluZGV4T2YobCkpKWZvcih2YXIgdT0wO3U8bC5pbmJvdW5kTGF5ZXJzLmxlbmd0aDsrK3Upe3ZhciBjPWwuaW5ib3VuZExheWVyc1t1XS5uYW1lLHA9bC5ub2RlSW5kaWNlc1t1XSxoPWwudGVuc29ySW5kaWNlc1t1XTthLnB1c2goYytcIltcIitwK1wiXVtcIitoK1wiXVwiKX19dmFyIGQ9ZS5uYW1lLGc9ZS5nZXRDbGFzc05hbWUoKSxmPTA9PT1hLmxlbmd0aD9cIlwiOmFbMF07cHJpbnRSb3coW2QrXCIgKFwiK2crXCIpXCIsaSxlLmNvdW50UGFyYW1zKCkudG9TdHJpbmcoKSxmXSx0LHIpO2Zvcih1PTE7dTxhLmxlbmd0aDsrK3UpcHJpbnRSb3coW1wiXCIsXCJcIixcIlwiLGFbdV1dLHQscil9ZnVuY3Rpb24gZGVzZXJpYWxpemUoZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9e30pLGRlc2VyaWFsaXplS2VyYXNPYmplY3QoZSxzZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25NYXAuZ2V0TWFwKCkuY2xhc3NOYW1lTWFwLHQsXCJsYXllclwiKX1mdW5jdGlvbiBpc0FycmF5SXRlbUlucHV0T3JPdXRwdXROYW1lKGUsdCxuKXtyZXR1cm4oXCJpbmJvdW5kTm9kZXNcIj09PWV8fFwib3V0cHV0TGF5ZXJzXCI9PT1lfHxcImlucHV0TGF5ZXJzXCI9PT1lKSYmMD09PXQmJlwic3RyaW5nXCI9PXR5cGVvZiBufWZ1bmN0aW9uIGNvbnZlcnRQeXRob25pY1RvVHMoZSx0KXtpZihudWxsPT09ZSlyZXR1cm4gbnVsbDtpZihcInN0cmluZ1wiPT10eXBlb2YgZSlyZXR1cm4gdG9DYW1lbENhc2UoZSk7aWYoXCJudW1iZXJcIj09dHlwZW9mIGV8fFwiYm9vbGVhblwiPT10eXBlb2YgZSlyZXR1cm4gZTtpZihlIGluc3RhbmNlb2YgQXJyYXkpe2Zvcih2YXIgbj1bXSxyPWUubGVuZ3RoLGk9MDtpPHI7KytpKXt2YXIgYT1lW2ldO2lzQXJyYXlJdGVtSW5wdXRPck91dHB1dE5hbWUodCxpLGEpP24ucHVzaChhKTpuLnB1c2goY29udmVydFB5dGhvbmljVG9UcyhhLHQpKX1yZXR1cm4gbn1mb3IodmFyIG89e30scz0wLGw9T2JqZWN0LmtleXMoZSk7czxsLmxlbmd0aDtzKyspe3ZhciB1PWxbc10sYz1lW3VdO2lmKFwibmFtZVwiPT09dSYmXCJzdHJpbmdcIj09dHlwZW9mIGMpb1t1XT1jO2Vsc2V7dmFyIHA9dG9DYW1lbENhc2UodSk7b1twXT1jb252ZXJ0UHl0aG9uaWNUb1RzKGMscCl9fXJldHVybiBvfWZ1bmN0aW9uIGNvbnZlcnRUc1RvUHl0aG9uaWMoZSx0KXtpZihudWxsPT09ZXx8dm9pZCAwPT09ZSlyZXR1cm4gbnVsbDtpZihcInN0cmluZ1wiPT10eXBlb2YgZSlyZXR1cm4gdG9TbmFrZUNhc2UoZSk7aWYoXCJudW1iZXJcIj09dHlwZW9mIGV8fFwiYm9vbGVhblwiPT10eXBlb2YgZSlyZXR1cm4gZTtpZihlIGluc3RhbmNlb2YgQXJyYXkpe2Zvcih2YXIgbj1bXSxyPWUubGVuZ3RoLGk9MDtpPHI7KytpKXt2YXIgYT1lW2ldO2lzQXJyYXlJdGVtSW5wdXRPck91dHB1dE5hbWUodCxpLGEpP24ucHVzaChhKTpuLnB1c2goY29udmVydFRzVG9QeXRob25pYyhhLHQpKX1yZXR1cm4gbn1mb3IodmFyIG89e30scz0wLGw9T2JqZWN0LmtleXMoZSk7czxsLmxlbmd0aDtzKyspe3ZhciB1PWxbc10sYz1lW3VdLHA9dG9TbmFrZUNhc2UodSk7b1twXT1cIm5hbWVcIiE9PXUmJlwiY2xhc3NOYW1lXCIhPT11fHxcInN0cmluZ1wiIT10eXBlb2YgYz9jb252ZXJ0VHNUb1B5dGhvbmljKGMsdSk6Y31yZXR1cm4gb312YXIgdmVyc2lvbj1cIjAuOC4yXCI7ZnVuY3Rpb24gcHJlcHJvY2Vzc1dlaWdodHNGb3JMb2FkaW5nKGUsdCxuLHIpe2lmKCFuLnN0YXJ0c1dpdGgoXCIyLlwiKSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIlVuc3VwcG9ydGVkIEtlcmFzIHZlcnNpb24gaW4gd2VpZ2h0cyBiZWluZyBsb2FkZWQ6IFwiK24pO3JldHVybiB0fWZ1bmN0aW9uIGxvYWRUZW5zb3IoZSx0LG4pe3ZhciByPXN0cmluZ1RvRFR5cGUoZSk7cmV0dXJuIFRlbnNvci5tYWtlKHQse3ZhbHVlczowPT09dC5sZW5ndGg/bjp1dGlsLmZsYXR0ZW4obil9LHIpfWZ1bmN0aW9uIGxvYWRXZWlnaHRzRnJvbUpzb24oZSx0LG4pe3ZvaWQgMD09PW4mJihuPSExKTtmb3IodmFyIHI9ZS5rZXJhc192ZXJzaW9uLGk9ZS5iYWNrZW5kLGE9dC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUubmFtZX0pLG89e30scz0wLGw9dDtzPGwubGVuZ3RoO3MrKyl7bnVsbCE9KGI9bFtzXSkubmFtZSYmKG51bGw9PW9bYi5uYW1lXSYmKG9bYi5uYW1lXT1bXSksb1tiLm5hbWVdLnB1c2goYikpfWZvcih2YXIgdT1lLndlaWdodHMsYz1bXSxwPTA7cDxhLmxlbmd0aDsrK3Ape3ZhciBoPWFbcF0sZD11W2hdO251bGw9PWQmJihkPVtdKTtmb3IodmFyIGc9W10sZj0wO2Y8ZC5sZW5ndGg7KytmKXt2YXIgbT1kW2ZdO2cucHVzaChuZXcgTGF5ZXJWYXJpYWJsZShsb2FkVGVuc29yKG0uZHR5cGUsbS5zaGFwZSxtLnZhbHVlKSkpfWZvcih2YXIgeT0wLHY9b1toXTt5PHYubGVuZ3RoO3krKyl7dmFyIGIsdz0oYj12W3ldKS53ZWlnaHRzO2lmKChnPXByZXByb2Nlc3NXZWlnaHRzRm9yTG9hZGluZyhiLGcscixpKSkubGVuZ3RoIT09dy5sZW5ndGgpe2lmKCFuKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiTGF5ZXIgI1wiK3ArJyAobmFtZWQgXCInK2IubmFtZSsnXCIpIGV4cGVjdHMgJyt3Lmxlbmd0aCtcIiB3ZWlnaHQocyksIGJ1dCB0aGUgc2F2ZWQgd2VpZ2h0cyBoYXZlIFwiK2cubGVuZ3RoK1wiIGVsZW1lbnQocykuXCIpO2NvbnNvbGUud2FybihcIlNraXBwaW5nIGxvYWRpbmcgb2Ygd2VpZ2h0cyBvZiBsYXllciBcIitiLm5hbWUrXCIgZHVlIHRvIG1pc21hdGNoIGluIG51bWJlciBvZiB3ZWlnaHRzOiAoXCIrZy5sZW5ndGgrXCIgdnMgXCIrdy5sZW5ndGgrXCIpLlwiKX1mb3IodmFyIHo9MDt6PGcubGVuZ3RoOysreikhbnx8dXRpbC5hcnJheXNFcXVhbCh3W3pdLnNoYXBlLGdbel0uc2hhcGUpP2MucHVzaChbd1t6XSxnW3pdLnJlYWQoKV0pOmNvbnNvbGUud2FybihcIlNraXBwaW5nIGxvYWRpbmcgb2Ygd2VpZ2h0cyBmb3IgbGF5ZXIgXCIrYi5uYW1lK1wiIGR1ZSB0byBtaXNtYXRjaCBpbiBzaGFwZSAoXCIrd1t6XS5zaGFwZStcIiB2cyBcIitnW3pdLnNoYXBlK1wiKVwiKX19YmF0Y2hTZXRWYWx1ZShjKX1mdW5jdGlvbiBsb2FkV2VpZ2h0c0Zyb21OYW1lZFRlbnNvck1hcChlLHQsbil7dm9pZCAwPT09biYmKG49ITApO2Zvcih2YXIgcj17fSxpPTAsYT0wLG89dDthPG8ubGVuZ3RoO2ErKylmb3IodmFyIHM9MCxsPW9bYV0ud2VpZ2h0cztzPGwubGVuZ3RoO3MrKyl7dmFyIHU9bFtzXTtpZihudWxsIT1yW3Uub3JpZ2luYWxOYW1lXSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIkR1cGxpY2F0ZSB3ZWlnaHQgbmFtZTogXCIrdS5vcmlnaW5hbE5hbWUpO3JbdS5vcmlnaW5hbE5hbWVdPXUsaSsrfXZhciBjPVtdO2Zvcih2YXIgcCBpbiBlKXtpZihudWxsIT1yW3BdKWMucHVzaChbcltwXSxlW3BdXSk7ZWxzZSBpZihuKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiUHJvdmlkZWQgd2VpZ2h0IGRhdGEgaGFzIG5vIHRhcmdldCB2YXJpYWJsZTogXCIrcCk7ZGVsZXRlIHJbcF19aWYobil7dmFyIGg9W107Zm9yKHZhciBkIGluIHIpaC5wdXNoKGQpO2lmKGgubGVuZ3RoPjApdGhyb3cgbmV3IFZhbHVlRXJyb3IoaC5sZW5ndGgrXCIgb2YgXCIraStcIiB3ZWlnaHRzIGFyZSBub3Qgc2V0OiBcIitoKX1iYXRjaFNldFZhbHVlKGMpfXZhciBDb250YWluZXI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXt2YXIgcj1lLmNhbGwodGhpcyx7fSl8fHRoaXM7aWYoci5jb250YWluZXJOb2Rlcz1uZXcgU2V0LHIubmFtZT1uLm5hbWUsbnVsbD09ci5uYW1lKXt2YXIgaT1yLmdldENsYXNzTmFtZSgpLnRvTG93ZXJDYXNlKCk7ci5uYW1lPWdldFVpZChpKX1pZihyLnN1cHBvcnRzTWFza2luZz0hMSxyLnRyYWluYWJsZT0hMCxyLnVwZGF0YWJsZT0hMCxBcnJheS5pc0FycmF5KG4uaW5wdXRzKT9yLmlucHV0cz1uLmlucHV0cy5zbGljZSgpOnIuaW5wdXRzPVtuLmlucHV0c10sQXJyYXkuaXNBcnJheShuLm91dHB1dHMpP3Iub3V0cHV0cz1uLm91dHB1dHMuc2xpY2UoKTpyLm91dHB1dHM9W24ub3V0cHV0c10sdW5pcXVlKHIuaW5wdXRzKS5sZW5ndGghPT1yLmlucHV0cy5sZW5ndGgpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJUaGUgbGlzdCBvZiBpbnB1dHMgcGFzc2VkIHRvIHRoZSBtb2RlbCBpcyByZWR1bmRhbnQuIEFsbCBpbnB1dHMgc2hvdWxkIG9ubHkgYXBwZWFyIG9uY2UuIEZvdW5kOiBcIityLmlucHV0cy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUubmFtZX0pKTt1bmlxdWUoci5vdXRwdXRzKS5sZW5ndGghPT1yLm91dHB1dHMubGVuZ3RoJiZjb25zb2xlLndhcm4oXCJUaGUgbGlzdCBvZiBvdXRwdXRzIHBhc3NlZCB0byB0aGUgbW9kZWwgaXMgcmVkdW5kYW50LiBBbGwgb3V0cHV0cyBzaG91bGQgb25seSBhcHBlYXIgb25jZS4gRm91bmQ6IFwiK3Iub3V0cHV0cy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUubmFtZX0pKSxyLmlucHV0TGF5ZXJzPVtdLHIuaW5wdXRMYXllcnNOb2RlSW5kaWNlcz1bXSxyLmlucHV0TGF5ZXJzVGVuc29ySW5kaWNlcz1bXSxyLm91dHB1dExheWVycz1bXSxyLm91dHB1dExheWVyc05vZGVJbmRpY2VzPVtdLHIub3V0cHV0TGF5ZXJzVGVuc29ySW5kaWNlcz1bXSxyLmxheWVycz1bXTtmb3IodmFyIGE9MCxvPXIub3V0cHV0czthPG8ubGVuZ3RoO2ErKyl7dmFyIHM9KE49b1thXSkuc291cmNlTGF5ZXIsbD1OLm5vZGVJbmRleCx1PU4udGVuc29ySW5kZXg7ci5vdXRwdXRMYXllcnMucHVzaChzKSxyLm91dHB1dExheWVyc05vZGVJbmRpY2VzLnB1c2gobCksci5vdXRwdXRMYXllcnNUZW5zb3JJbmRpY2VzLnB1c2godSl9Zm9yKHZhciBjPTAscD1yLmlucHV0cztjPHAubGVuZ3RoO2MrKyl7cz0oTj1wW2NdKS5zb3VyY2VMYXllcixsPU4ubm9kZUluZGV4LHU9Ti50ZW5zb3JJbmRleDthc3NlcnQoMD09PWwsXCJpbnB1dCBsYXllciBoYXMgPjEgbm9kZXNcIiksYXNzZXJ0KDA9PT11LFwiaW5wdXQgbGF5ZXIgaGFzID4xIHRlbnNvcnNcIiksci5pbnB1dExheWVycy5wdXNoKHMpLHIuaW5wdXRMYXllcnNOb2RlSW5kaWNlcy5wdXNoKGwpLHIuaW5wdXRMYXllcnNUZW5zb3JJbmRpY2VzLnB1c2godSl9ci5pbnB1dE5hbWVzPVtdLHIub3V0cHV0TmFtZXM9W10sci5mZWVkSW5wdXRTaGFwZXM9W10sci5mZWVkSW5wdXROYW1lcz1bXSxyLmZlZWRPdXRwdXROYW1lcz1bXTtmb3IodmFyIGg9MDtoPHIuaW5wdXRMYXllcnMubGVuZ3RoO2grKyl7aWYoISgocz1yLmlucHV0TGF5ZXJzW2hdKWluc3RhbmNlb2YgSW5wdXRMYXllcikpdGhyb3cgbmV3IFR5cGVFcnJvcihcIklucHV0IGxheWVycyB0byBhIE1vZGVsIG11c3QgYmUgSW5wdXRMYXllciBvYmplY3RzLiBSZWNlaXZlZCBpbnB1dHM6IFwiK24uaW5wdXRzK1wiLiBJbnB1dCBcIitoK1wiICgwLWJhc2VkKSBvcmlnaW5hdGVzIGZyb20gbGF5ZXIgdHlwZSBcIitzLmdldENsYXNzTmFtZSgpK1wiLlwiKTtyLmlucHV0TmFtZXMucHVzaChzLm5hbWUpLHIuZmVlZElucHV0U2hhcGVzLnB1c2gocy5iYXRjaElucHV0U2hhcGUpLHIuZmVlZElucHV0TmFtZXMucHVzaChzLm5hbWUpfWZvcih2YXIgZD0wLGc9ci5vdXRwdXRMYXllcnM7ZDxnLmxlbmd0aDtkKyspe3M9Z1tkXTtyLm91dHB1dE5hbWVzLnB1c2gocy5uYW1lKX1yLmludGVybmFsSW5wdXRTaGFwZXM9ci5pbnB1dHMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNoYXBlfSksci5pbnRlcm5hbE91dHB1dFNoYXBlcz1yLm91dHB1dHMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNoYXBlfSk7Zm9yKHZhciBmPXt9LG09e30seT17fSx2PXt9LGI9e30sdz1bXSx6PWZ1bmN0aW9uKGUsbixpLGEsbyxzKXtudWxsIT1hJiZudWxsIT1vJiZudWxsIT1zfHwoYT1lLnNvdXJjZUxheWVyLG89ZS5ub2RlSW5kZXgscz1lLnRlbnNvckluZGV4KTt2YXIgbD1hLmluYm91bmROb2Rlc1tvXTtpZigtMSE9PWkuaW5kZXhPZihsKSl0aHJvdyBuZXcgUnVudGltZUVycm9yKFwiVGhlIHRlbnNvciBcIitlLm5hbWUrJyBhdCBsYXllciBcIicrYS5uYW1lKydcIiBpcyBwYXJ0IG9mIGEgY3ljbGUuJyk7aWYoLTE9PT1uLmluZGV4T2YobCkpe3IuY29udGFpbmVyTm9kZXMuYWRkKHQubm9kZUtleShhLG8pKSxhLmlkIGluIGJ8fChiW2EuaWRdPU9iamVjdC5rZXlzKGIpLmxlbmd0aCksLTE9PT1pLmluZGV4T2YobCkmJmkucHVzaChsKTtmb3IodmFyIHU9bC5pbmJvdW5kTGF5ZXJzLmxlbmd0aCxjPTA7Yzx1O2MrKyl7dmFyIHA9bC5pbnB1dFRlbnNvcnNbY10saD1sLmluYm91bmRMYXllcnNbY10sZD1sLm5vZGVJbmRpY2VzW2NdLGc9bC50ZW5zb3JJbmRpY2VzW2NdO3oocCxuLGksaCxkLGcpfWZvcihuLnB1c2gobCk7aS5pbmRleE9mKGwpPj0wOylpLnNwbGljZShpLmluZGV4T2YobCksMSk7dy5wdXNoKGwpfX0sUz1bXSxBPVtdLEk9MCxDPXIub3V0cHV0cztJPEMubGVuZ3RoO0krKyl7dmFyIE49Q1tJXTt6KE4sUyxBKX1mb3IodmFyIEU9MCxfPXcuc2xpY2UoKS5yZXZlcnNlKCk7RTxfLmxlbmd0aDtFKyspe21bKEs9X1tFXSkuaWRdPUssSy5pZCBpbiBmfHwoZltLLmlkXT0wKTt2YXIgaz1mW0suaWRdLEw9bnVsbD09eVtLLm91dGJvdW5kTGF5ZXIuaWRdPzA6eVtLLm91dGJvdW5kTGF5ZXIuaWRdO2s9TWF0aC5tYXgoayxMKSx5W0sub3V0Ym91bmRMYXllci5pZF09ayx2W0sub3V0Ym91bmRMYXllci5pZF09Sy5vdXRib3VuZExheWVyLGZbSy5pZF09aztmb3IoaD0wO2g8Sy5pbmJvdW5kTGF5ZXJzLmxlbmd0aDtoKyspe3ZhciB4PUsuaW5ib3VuZExheWVyc1toXSxUPShsPUsubm9kZUluZGljZXNbaF0seC5pbmJvdW5kTm9kZXNbbF0pLEQ9bnVsbD09ZltULmlkXT8wOmZbVC5pZF07ZltULmlkXT1NYXRoLm1heChrKzEsRCksbVtULmlkXT1UfX12YXIgUj17fTtmb3IodmFyIE8gaW4gZil7KGs9ZltPXSlpbiBSfHwoUltrXT1bXSksUltrXS5wdXNoKG1bT10pfXZhciBNPXt9O2Zvcih2YXIgUCBpbiB5KXsoaz15W1BdKWluIE18fChNW2tdPVtdKSxNW2tdLnB1c2godltQXSl9dmFyIFY9T2JqZWN0LmtleXMoTSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBwYXJzZUludChlLDEwKX0pLnNvcnQocmV2ZXJzZU51bWJlckNvbXBhcmUpO3IubGF5ZXJzPVtdO2Zvcih2YXIgRj0wLEI9VjtGPEIubGVuZ3RoO0YrKyl7dmFyIFU9TVtrPUJbRl1dO1Uuc29ydChmdW5jdGlvbihlLHQpe3ZhciBuPWJbZS5pZF0scj1iW3QuaWRdO3JldHVybiBuPHI/LTE6bj5yPzE6MH0pO2Zvcih2YXIgaj0wLFc9VTtqPFcubGVuZ3RoO2orKyl7cz1XW2pdO3IubGF5ZXJzLnB1c2gocyl9fXIubGF5ZXJzQnlEZXB0aD1NLFY9T2JqZWN0LmtleXMoUikubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBwYXJzZUludChlLDEwKX0pLnNvcnQocmV2ZXJzZU51bWJlckNvbXBhcmUpO2Zvcih2YXIgJD1yLmlucHV0cy5zbGljZSgpLHE9W10sRz0wLEo9VjtHPEoubGVuZ3RoO0crKylmb3IodmFyIEg9MCxaPVJbaz1KW0ddXTtIPFoubGVuZ3RoO0grKyl7dmFyIEs7aWYobnVsbCE9KHM9KEs9WltIXSkub3V0Ym91bmRMYXllcikpe2Zvcih2YXIgWT0wLFg9Sy5pbnB1dFRlbnNvcnM7WTxYLmxlbmd0aDtZKyspe049WFtZXTtpZigtMT09PSQuaW5kZXhPZihOKSl0aHJvdyBuZXcgUnVudGltZUVycm9yKFwiR3JhcGggZGlzY29ubmVjdGVkOiBjYW5ub3Qgb2J0YWluIHZhbHVlIGZvciB0ZW5zb3IgXCIrTisnIGF0IGxheWVyIFwiJytzLm5hbWUrJ1wiLiBUaGUgZm9sbG93aW5nIHByZXZpb3VzIGxheWVycyB3ZXJlIGFjY2Vzc2VkIHdpdGhvdXQgaXNzdWU6ICcrcSl9Zm9yKHZhciBRPTAsZWU9Sy5vdXRwdXRUZW5zb3JzO1E8ZWUubGVuZ3RoO1ErKyl7Tj1lZVtRXTskLnB1c2goTil9cS5wdXNoKHMubmFtZSl9fXIubm9kZXNCeURlcHRoPVI7Zm9yKHZhciB0ZT1yLmxheWVycy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUubmFtZX0pLG5lPWZ1bmN0aW9uKGUpe3ZhciB0PXRlLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdD09PWV9KS5sZW5ndGg7aWYoMSE9PXQpdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcignVGhlIG5hbWUgXCInK2UrJ1wiIGlzIHVzZWQgJyt0K1wiIHRpbWVzIGluIHRoZSBtb2RlbC4gQWxsIGxheWVyIG5hbWVzIHNob3VsZCBiZSB1bmlxdWUuIExheWVyIG5hbWVzOiBcIitKU09OLnN0cmluZ2lmeSh0ZSkpfSxyZT0wLGllPXRlO3JlPGllLmxlbmd0aDtyZSsrKXtuZShpZVtyZV0pfXJldHVybiByLm91dGJvdW5kTm9kZXM9W10sci5pbmJvdW5kTm9kZXM9W10sbmV3IE5vZGUoe291dGJvdW5kTGF5ZXI6cixpbmJvdW5kTGF5ZXJzOltdLG5vZGVJbmRpY2VzOltdLHRlbnNvckluZGljZXM6W10saW5wdXRUZW5zb3JzOnIuaW5wdXRzLG91dHB1dFRlbnNvcnM6ci5vdXRwdXRzLGlucHV0TWFza3M6ci5pbnB1dHMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBudWxsfSksb3V0cHV0TWFza3M6ci5vdXRwdXRzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gbnVsbH0pLGlucHV0U2hhcGVzOnIuaW5wdXRzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5zaGFwZX0pLG91dHB1dFNoYXBlczpyLm91dHB1dHMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNoYXBlfSl9KSxyLmJ1aWx0PSEwLHIuX3JlZkNvdW50PTEscn1yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuYXNzZXJ0Tm90RGlzcG9zZWQ9ZnVuY3Rpb24oKXtpZigwPT09dGhpcy5fcmVmQ291bnQpdGhyb3cgbmV3IEVycm9yKFwiQ29udGFpbmVyICdcIit0aGlzLm5hbWUrXCInIGlzIGFscmVhZHkgZGlzcG9zZWQuXCIpfSx0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5hc3NlcnROb3REaXNwb3NlZCgpO3ZhciBlPXtyZWZDb3VudEFmdGVyRGlzcG9zZTpudWxsLG51bURpc3Bvc2VkVmFyaWFibGVzOjB9O2lmKDA9PS0tdGhpcy5fcmVmQ291bnQpZm9yKHZhciB0PTAsbj10aGlzLmxheWVyczt0PG4ubGVuZ3RoO3QrKyl7dmFyIHI9blt0XTtlLm51bURpc3Bvc2VkVmFyaWFibGVzKz1yLmRpc3Bvc2UoKS5udW1EaXNwb3NlZFZhcmlhYmxlc31yZXR1cm4gZS5yZWZDb3VudEFmdGVyRGlzcG9zZT10aGlzLl9yZWZDb3VudCxlfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJ0cmFpbmFibGVXZWlnaHRzXCIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMuX3RyYWluYWJsZVdlaWdodHMubGVuZ3RoPjApdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJDb250YWluZXIgaW5zdGFuY2UgdW5leHBlY3RlZGx5IGNvbnRhaW5zIF90cmFpbmFibGVXZWlnaHRzLlRoZSB0cmFpbmFibGUgd2VpZ2h0cyBvZiBhIENvbnRhaW5lciBhcmUgYSB1bmlvbiBvZiB0aGUgdHJhaW5hYmxlIHdlaWdodHMgb2YgaXRzIGNvbnNpdHVlbnQgTGF5ZXJzLiBJdHMgb3duIF90cmFpbmFibGVXZWlnaHRzIG11c3QgcmVtYWluIGFuIGVtcHR5IEFycmF5LlwiKTtpZighdGhpcy50cmFpbmFibGUpcmV0dXJuW107Zm9yKHZhciBlPVtdLHQ9MCxuPXRoaXMubGF5ZXJzO3Q8bi5sZW5ndGg7dCsrKXt2YXIgcj1uW3RdO2U9ZS5jb25jYXQoci50cmFpbmFibGVXZWlnaHRzKX1yZXR1cm4gZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJub25UcmFpbmFibGVXZWlnaHRzXCIse2dldDpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PTAsbj10aGlzLmxheWVyczt0PG4ubGVuZ3RoO3QrKyl7dmFyIHI9blt0XTtlLnB1c2guYXBwbHkoZSxyLm5vblRyYWluYWJsZVdlaWdodHMpfWlmKCF0aGlzLnRyYWluYWJsZSl7Zm9yKHZhciBpPVtdLGE9MCxvPXRoaXMubGF5ZXJzO2E8by5sZW5ndGg7YSsrKXtyPW9bYV07aS5wdXNoLmFwcGx5KGksci50cmFpbmFibGVXZWlnaHRzKX1yZXR1cm4gaS5jb25jYXQoZSl9cmV0dXJuIGV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwid2VpZ2h0c1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cmFpbmFibGVXZWlnaHRzLmNvbmNhdCh0aGlzLm5vblRyYWluYWJsZVdlaWdodHMpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmxvYWRXZWlnaHRzPWZ1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXQmJih0PSExKSx2b2lkIDA9PT1uJiYobj0hMSksdm9pZCAwPT09ciYmKHI9ITApLG4/bG9hZFdlaWdodHNGcm9tTmFtZWRUZW5zb3JNYXAoZSx0aGlzLmxheWVycyxyKTpsb2FkV2VpZ2h0c0Zyb21Kc29uKGUsdGhpcy5sYXllcnMsdCl9LHQucHJvdG90eXBlLnVwZGF0ZWRDb25maWc9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldENvbmZpZygpO3JldHVybntjbGFzc05hbWU6dGhpcy5nZXRDbGFzc05hbWUoKSxjb25maWc6ZSxrZXJhc1ZlcnNpb246XCJ0ZmpzLWxheWVycyBcIit2ZXJzaW9uLGJhY2tlbmQ6XCJUZW5zb3JGbG93LmpzXCJ9fSx0LnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT10JiYodD0hMCk7dmFyIG49Y29udmVydFRzVG9QeXRob25pYyh0aGlzLnVwZGF0ZWRDb25maWcoKSk7cmV0dXJuIHQ/SlNPTi5zdHJpbmdpZnkobik6bn0sdC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXt2YXIgcjtyZXR1cm4gZT10b0xpc3QoZSkscj1cIm1hc2tcImluIHQ/dG9MaXN0KHQubWFzayk6cHlMaXN0UmVwZWF0KG51bGwsZS5sZW5ndGgpLG4ucnVuSW50ZXJuYWxHcmFwaChlLHIpWzBdfSl9LHQucHJvdG90eXBlLmNvbXB1dGVNYXNrPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gdGlkeShmdW5jdGlvbigpe3ZhciByO3JldHVybiBlPXRvTGlzdChlKSxyPW51bGw9PXQ/cHlMaXN0UmVwZWF0KG51bGwsZS5sZW5ndGgpOnRvTGlzdCh0KSxuLnJ1bkludGVybmFsR3JhcGgoZSxyKVsxXX0pfSx0LnByb3RvdHlwZS5jb21wdXRlT3V0cHV0U2hhcGU9ZnVuY3Rpb24oZSl7dmFyIHQ9bm9ybWFsaXplU2hhcGVMaXN0KGUpO2lmKHQubGVuZ3RoIT09dGhpcy5pbnB1dExheWVycy5sZW5ndGgpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJJbnZhbGlkIGlucHV0U2hhcGUgYXJndW1lbnQgXCIrZStcIjogbW9kZWwgaGFzIFwiK3RoaXMuaW5wdXRMYXllcnMubGVuZ3RoK1wiIHRlbnNvciBpbnB1dHMuXCIpO2Zvcih2YXIgbj17fSxyPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBpPXRoaXMuaW5wdXRMYXllcnNbcl0sYT10W3JdO25bQT1pLm5hbWUrXCJfMF8wXCJdPWF9dmFyIG89T2JqZWN0LmtleXModGhpcy5ub2Rlc0J5RGVwdGgpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gcGFyc2VJbnQoZSwxMCl9KS5zb3J0KHJldmVyc2VOdW1iZXJDb21wYXJlKTtpZihvLmxlbmd0aD4xKWZvcih2YXIgcz0wLGw9bztzPGwubGVuZ3RoO3MrKylmb3IodmFyIHU9bFtzXSxjPTAscD10aGlzLm5vZGVzQnlEZXB0aFt1XTtjPHAubGVuZ3RoO2MrKyl7dmFyIGg9cFtjXTtpPWgub3V0Ym91bmRMYXllcjtpZigtMT09PXRoaXMuaW5wdXRMYXllcnMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlkfSkuaW5kZXhPZihpLmlkKSl7Zm9yKHZhciBkPVtdLGc9MDtnPGguaW5ib3VuZExheWVycy5sZW5ndGg7ZysrKXt2YXIgZj1oLmluYm91bmRMYXllcnNbZ10sbT1oLm5vZGVJbmRpY2VzW2ddLHk9aC50ZW5zb3JJbmRpY2VzW2ddLHY9bltBPWYubmFtZStcIl9cIittK1wiX1wiK3ldO2QucHVzaCh2KX12YXIgYj1ub3JtYWxpemVTaGFwZUxpc3QoaS5jb21wdXRlT3V0cHV0U2hhcGUoc2luZ2xldG9uT3JBcnJheShkKSkpLHc9aS5pbmJvdW5kTm9kZXMuaW5kZXhPZihoKTtmb3IoZz0wO2c8Yi5sZW5ndGg7ZysrKXtuW0E9aS5uYW1lK1wiX1wiK3crXCJfXCIrZ109YltnXX19fXZhciB6PVtdLFM9W107Zm9yKHI9MDtyPHRoaXMub3V0cHV0TGF5ZXJzLmxlbmd0aDtyKyspe2k9dGhpcy5vdXRwdXRMYXllcnNbcl0sdz10aGlzLm91dHB1dExheWVyc05vZGVJbmRpY2VzW3JdLHk9dGhpcy5vdXRwdXRMYXllcnNUZW5zb3JJbmRpY2VzW3JdO3ZhciBBPWkubmFtZStcIl9cIit3K1wiX1wiK3k7Uy5wdXNoKEEpfWZvcihyPTA7cjxTLmxlbmd0aDtyKyspe3ZhciBJPVNbcl07YXNzZXJ0KEkgaW4gbiksei5wdXNoKG5bSV0pfXJldHVybiBzaW5nbGV0b25PckFycmF5KHopfSx0LnByb3RvdHlwZS5ydW5JbnRlcm5hbEdyYXBoPWZ1bmN0aW9uKGUsdCl7bnVsbD09dCYmKHQ9cHlMaXN0UmVwZWF0KG51bGwsZS5sZW5ndGgpKTtmb3IodmFyIG49e30scj0wO3I8dGhpcy5pbnB1dHMubGVuZ3RoOysrcil7dmFyIGk9dGhpcy5pbnB1dHNbcl0sYT1lW3JdLG89dFtyXTtuW2kuaWRdPVthLG9dfWZvcih2YXIgcz0wLGw9T2JqZWN0LmtleXModGhpcy5ub2Rlc0J5RGVwdGgpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gcGFyc2VJbnQoZSwxMCl9KS5zb3J0KHJldmVyc2VOdW1iZXJDb21wYXJlKTtzPGwubGVuZ3RoO3MrKylmb3IodmFyIHU9bFtzXSxjPTAscD10aGlzLm5vZGVzQnlEZXB0aFt1XTtjPHAubGVuZ3RoO2MrKyl7Zm9yKHZhciBoPXBbY10sZD1oLm91dGJvdW5kTGF5ZXIsZz1oLmlucHV0VGVuc29ycyxmPWgub3V0cHV0VGVuc29ycyxtPW5ldyBBcnJheSx5PTAsdj1nO3k8di5sZW5ndGg7eSsrKXsoaT12W3ldKS5pZCBpbiBuJiZtLnB1c2gobltpLmlkXSl9aWYobS5sZW5ndGg9PT1nLmxlbmd0aCl7dmFyIGI9e30sdz12b2lkIDAsej12b2lkIDAsUz12b2lkIDAsQT12b2lkIDA7aWYobnVsbCE9aC5jYWxsQXJncyYmKGI9aC5jYWxsQXJncyksMT09PW0ubGVuZ3RoKXt2YXIgST1tWzBdLEM9SVswXSxOPUlbMV07bnVsbD09Yi5tYXNrJiYoYi5tYXNrPU4pLFM9dG9MaXN0KGQuY2FsbChDLGIpKSxBPXRvTGlzdChkLmNvbXB1dGVNYXNrKEMsTikpLHc9W0NdLHo9W05dfWVsc2Ugdz1tLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZVswXX0pLHo9bS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV19KSxudWxsPT1iLm1hc2smJihiLm1hc2s9eiksUz10b0xpc3QoZC5jYWxsKHcsYikpLEE9dG9MaXN0KGQuY29tcHV0ZU1hc2sodyx6KSk7aWYoZC5hY3Rpdml0eVJlZ3VsYXJpemVyKXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiTW9kZWwgaW52b2NhdGlvbiB3aXRoIGNvbmNyZXRlIFRlbnNvciB2YWx1ZShzKSBpbiB0aGUgcHJlc2VuY2Ugb2YgYWN0aXZpdHkgcmVndWxhcml6ZXIocykgaXMgbm90IHN1cHBvcnRlZCB5ZXQuXCIpO2ZvcihyPTA7cjxmLmxlbmd0aDsrK3Ipe2k9ZltyXSxhPVNbcl0sbz1BW3JdO25baS5pZF09W2Esb119fX1mb3IodmFyIEU9W10sXz1bXSxrPVtdLEw9MCx4PXRoaXMub3V0cHV0cztMPHgubGVuZ3RoO0wrKyl7YXNzZXJ0KChpPXhbTF0pLmlkIGluIG4sXCJDb3VsZCBub3QgY29tcHV0ZSBvdXRwdXQgXCIraS5uYW1lK1wiIDogXCIraS5pZCk7dmFyIFQ9bltpLmlkXSxEPVRbMF07bz1UWzFdO2sucHVzaChELnNoYXBlKSxFLnB1c2goRCksXy5wdXNoKG8pfXJldHVybltFLF8sa119LHQucHJvdG90eXBlLmJ1aWxkTm9kZUNvbnZlcnNpb25NYXA9ZnVuY3Rpb24oZSl7Zm9yKHZhciBuLHI9e30saT0wLGE9dGhpcy5sYXllcnM7aTxhLmxlbmd0aDtpKyspe3ZhciBvPWFbaV07bj1vIGluc3RhbmNlb2YgdD8xOjA7Zm9yKHZhciBzPTA7czxvLmluYm91bmROb2Rlcy5sZW5ndGg7cysrKXt2YXIgbD10Lm5vZGVLZXkobyxzKTtsIGluIHRoaXMuY29udGFpbmVyTm9kZXMmJihyW2xdPW4sbis9MSl9fXJldHVybiByfSx0LnByb3RvdHlwZS5nZXRMYXllcj1mdW5jdGlvbihlLHQpe2lmKG51bGwhPXQpe2lmKHRoaXMubGF5ZXJzLmxlbmd0aDw9dCl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIldhcyBhc2tlZCB0byByZXRyaWV2ZSBsYXllciBhdCBpbmRleCBcIit0K1wiLCBidXQgbW9kZWwgb25seSBoYXMgXCIrdGhpcy5sYXllcnMubGVuZ3RoK1wiIGxheWVyKHMpLlwiKTtyZXR1cm4gdGhpcy5sYXllcnNbdF19aWYobnVsbD09ZSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIlByb3ZpZGUgZWl0aGVyIGEgbGF5ZXIgbmFtZSBvciBsYXllciBpbmRleFwiKTtmb3IodmFyIG49MCxyPXRoaXMubGF5ZXJzO248ci5sZW5ndGg7bisrKXt2YXIgaT1yW25dO2lmKGkubmFtZT09PWUpcmV0dXJuIGl9dGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJObyBzdWNoIGxheWVyOiBcIitlKX0sdC5wcm90b3R5cGUuY2FsY3VsYXRlTG9zc2VzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gdGlkeShmdW5jdGlvbigpe2Zvcih2YXIgbj1bXSxyPTAsaT1lLmxheWVycztyPGkubGVuZ3RoO3IrKylmb3IodmFyIGE9aVtyXSxvPTA7bzxhLmluYm91bmROb2Rlcy5sZW5ndGg7KytvKXt2YXIgcz10Lm5vZGVLZXkoYSxvKTtlLmNvbnRhaW5lck5vZGVzLmhhcyhzKSYmbi5wdXNoLmFwcGx5KG4sYS5jYWxjdWxhdGVMb3NzZXMoKSl9cmV0dXJuIG59KX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXtuYW1lOnRoaXMubmFtZX0sbj10aGlzLmJ1aWxkTm9kZUNvbnZlcnNpb25NYXAodGhpcy5sYXllcnMpLHI9W10saT0wLGE9dGhpcy5sYXllcnM7aTxhLmxlbmd0aDtpKyspe2Zvcih2YXIgbz0oYj1hW2ldKS5nZXRDbGFzc05hbWUoKSxzPWIuZ2V0Q29uZmlnKCksbD1bXSx1PTA7dTxiLmluYm91bmROb2Rlcy5sZW5ndGg7dSsrKXt2YXIgYz1iLmluYm91bmROb2Rlc1t1XSxwPXQubm9kZUtleShiLHUpLGg9e307aWYodGhpcy5jb250YWluZXJOb2Rlcy5oYXMocCkpe2lmKGMuY2FsbEFyZ3MpdHJ5e0pTT04uc3RyaW5naWZ5KGMuY2FsbEFyZ3MpLGg9Yy5jYWxsQXJnc31jYXRjaChlKXtjb25zb2xlLndhcm4oXCJMYXllciBcIitiLm5hbWUrXCIgd2FzIHBhc3NlZCBub24tc2VyaWFsaXphYmxlIGtleXdvcmQgYXJndW1lbnRzOiBcIitjLmNhbGxBcmdzK1wiLiBUaGV5IHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBzZXJpYWxpemVkIG1vZGVsIChhbmQgdGh1cyB3aWxsIGJlIG1pc3NpbmcgYXQgZGVzZXJpYWxpemF0aW9uIHRpbWUpLlwiKSxoPXt9fWlmKGMuaW5ib3VuZExheWVycy5sZW5ndGg+MCl7Zm9yKHZhciBkPVtdLGc9MDtnPGMuaW5ib3VuZExheWVycy5sZW5ndGg7ZysrKXt2YXIgZj1jLmluYm91bmRMYXllcnNbZ10sbT1jLm5vZGVJbmRpY2VzW2ddLHk9Yy50ZW5zb3JJbmRpY2VzW2ddO251bGwhPT0oej1uW3Qubm9kZUtleShmLG0pXSkmJnZvaWQgMCE9PXp8fCh6PTApLGQucHVzaChbZi5uYW1lLHoseSxoXSl9bC5wdXNoKGQpfX19ci5wdXNoKHtuYW1lOmIubmFtZSxjbGFzc05hbWU6byxjb25maWc6cyxpbmJvdW5kTm9kZXM6bH0pfWUubGF5ZXJzPXI7dmFyIHY9W107Zm9yKGc9MDtnPHRoaXMuaW5wdXRMYXllcnMubGVuZ3RoO2crKyl7dmFyIGI9dGhpcy5pbnB1dExheWVyc1tnXTttPXRoaXMuaW5wdXRMYXllcnNOb2RlSW5kaWNlc1tnXSxwPXQubm9kZUtleShiLG0pO2lmKHRoaXMuY29udGFpbmVyTm9kZXMuaGFzKHApKXtudWxsIT09KHo9bltwXSkmJnZvaWQgMCE9PXp8fCh6PTApO3k9dGhpcy5pbnB1dExheWVyc1RlbnNvckluZGljZXNbZ107di5wdXNoKFtiLm5hbWUseix5XSl9fWUuaW5wdXRMYXllcnM9djt2YXIgdz1bXTtmb3IoZz0wO2c8dGhpcy5vdXRwdXRMYXllcnMubGVuZ3RoO2crKyl7Yj10aGlzLm91dHB1dExheWVyc1tnXSxtPXRoaXMub3V0cHV0TGF5ZXJzTm9kZUluZGljZXNbZ10scD10Lm5vZGVLZXkoYixtKTtpZih0aGlzLmNvbnRhaW5lck5vZGVzLmhhcyhwKSl7dmFyIHo7bnVsbCE9PSh6PW5bcF0pJiZ2b2lkIDAhPT16fHwoej0wKTt5PXRoaXMub3V0cHV0TGF5ZXJzVGVuc29ySW5kaWNlc1tnXTt3LnB1c2goW2IubmFtZSx6LHldKX19cmV0dXJuIGUub3V0cHV0TGF5ZXJzPXcsZX0sdC5mcm9tQ29uZmlnPWZ1bmN0aW9uKGUsdCl7dmFyIG49e30scj17fTtmdW5jdGlvbiBpKGUsdCl7ZS5uYW1lIGluIHI/cltlLm5hbWVdLnB1c2godCk6cltlLm5hbWVdPVt0XX1mdW5jdGlvbiBhKGUsdCl7Zm9yKHZhciByLGE9W10sbz0wLHM9dDtvPHMubGVuZ3RoO28rKyl7dmFyIGw9c1tvXSx1PWxbMF0sYz1sWzFdLHA9bFsyXTtpZigzPT09bC5sZW5ndGgpcj17fTtlbHNle2lmKDQhPT1sLmxlbmd0aCl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIkltcHJvcGVybHkgZm9ybWF0dGVkIG1vZGVsIGNvbmZpZyBmb3IgbGF5ZXIgXCIrSlNPTi5zdHJpbmdpZnkoZSkrXCI6IFwiK0pTT04uc3RyaW5naWZ5KGwpKTtyPWxbM119aWYoISh1IGluIG4pKXJldHVybiB2b2lkIGkoZSx0KTt2YXIgaD1uW3VdO2lmKGguaW5ib3VuZE5vZGVzLmxlbmd0aDw9YylyZXR1cm4gdm9pZCBpKGUsdCk7dmFyIGQ9aC5pbmJvdW5kTm9kZXNbY107YS5wdXNoKGQub3V0cHV0VGVuc29yc1twXSl9YS5sZW5ndGg+MCYmZS5hcHBseShzaW5nbGV0b25PckFycmF5KGEpLHIpfWZ1bmN0aW9uIG8oZSl7dmFyIHI9ZS5uYW1lLGE9ZGVzZXJpYWxpemUoZSxudWxsIT10LmN1c3RvbU9iamVjdHM/dC5jdXN0b21PYmplY3RzOnt9KTtuW3JdPWE7Zm9yKHZhciBvPTAscz1lLmluYm91bmROb2RlcztvPHMubGVuZ3RoO28rKyl7dmFyIGw9c1tvXTtpZighKGwgaW5zdGFuY2VvZiBBcnJheSkpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJDb3JydXB0ZWQgY29uZmlndXJhdGlvbiwgZXhwZWN0ZWQgYXJyYXkgZm9yIG5vZGVEYXRhOiBcIitsKTtpKGEsbCl9fWZvcih2YXIgcz10Lm5hbWUsbD10LmxheWVycyx1PTAsYz1sO3U8Yy5sZW5ndGg7dSsrKXtvKGQ9Y1t1XSl9Zm9yKDshaXNPYmplY3RFbXB0eShyKTspZm9yKHZhciBwPTAsaD1sO3A8aC5sZW5ndGg7cCsrKXt2YXIgZD1oW3BdO2lmKChOPW5bZC5uYW1lXSkubmFtZSBpbiByKXtmb3IodmFyIGc9MCxmPXJbTi5uYW1lXTtnPGYubGVuZ3RoO2crKyl7YShOLGZbZ10pfWRlbGV0ZSByW04ubmFtZV19fWZvcih2YXIgbT1bXSx5PVtdLHY9MCxiPXQuaW5wdXRMYXllcnM7djxiLmxlbmd0aDt2Kyspe3ZhciB3PShkPWJbdl0pWzBdLHo9ZFsxXSxTPWRbMl07YXNzZXJ0KHcgaW4gbik7dmFyIEE9KE49blt3XSkuaW5ib3VuZE5vZGVzW3pdLm91dHB1dFRlbnNvcnM7bS5wdXNoKEFbU10pfWZvcih2YXIgST0wLEM9dC5vdXRwdXRMYXllcnM7STxDLmxlbmd0aDtJKyspe3c9KGQ9Q1tJXSlbMF0sej1kWzFdLFM9ZFsyXTthc3NlcnQodyBpbiBuKTt2YXIgTjtBPShOPW5bd10pLmluYm91bmROb2Rlc1t6XS5vdXRwdXRUZW5zb3JzO3kucHVzaChBW1NdKX1yZXR1cm4gbmV3IGUoe2lucHV0czptLG91dHB1dHM6eSxuYW1lOnN9KX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwic3RhdGVmdWxcIix7Z2V0OmZ1bmN0aW9uKCl7aWYodGhpcy5fc3RhdGVmdWwpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJDb250YWluZXIgaW5zdGFuY2UgdW5leHBlY3RlZGx5IGhhcyBfc3RhdGVmdWwgPSB0cnVlLiBUaGUgc3RhdGVmdWxuZXNzIG9mIGEgQ29udGFpbmVyIGlzIGRldGVybWluZWQgYnkgdGhlIExheWVycyBpdCBjb250YWlucy4gSXRzIF9zdGF0ZWZ1bCBwcm9wZXJ0eSBtdXN0IHJlbWFpbiB0aGUgZGVmYXVsdCBmYWxzZS5cIik7Zm9yKHZhciBlPTAsdD10aGlzLmxheWVycztlPHQubGVuZ3RoO2UrKyl7aWYodFtlXS5zdGF0ZWZ1bClyZXR1cm4hMH1yZXR1cm4hMX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5yZXNldFN0YXRlcz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGlkeShmdW5jdGlvbigpe2UubGF5ZXJzLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5zdGF0ZWZ1bCYmZS5yZXNldFN0YXRlcygpfSl9KX0sdH0oTGF5ZXIpO2Z1bmN0aW9uIGFzc2VydEZlZWRDb21wYXRpYmlsaXR5KGUsdCl7aWYobnVsbCE9ZS5zaGFwZSl7aWYoZS5zaGFwZS5sZW5ndGghPT10LnNoYXBlLmxlbmd0aCl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIlRoZSByYW5rIG9mIGZlZWQgKFwiK3Quc2hhcGUubGVuZ3RoK1wiKSBkb2VzIG5vdCBtYXRjaCB0aGUgcmFuayBvZiB0aGUga2V5IChcIitlLnNoYXBlLmxlbmd0aCtcIikuXCIpO2Zvcih2YXIgbj0wO248ZS5zaGFwZS5sZW5ndGg7KytuKWlmKG51bGwhPWUuc2hhcGVbbl0mJmUuc2hhcGVbbl0hPT10LnNoYXBlW25dKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiVGhlIFwiK24rXCItdGggZGltZW5zaW9uIG9mIHRoZSBmZWVkIChcIit0LnNoYXBlW25dK1wiKSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGF0IG9mIHRoZSBrZXkgKFwiK2Uuc2hhcGVbbl0rXCIpLlwiKX1pZihudWxsPT1lLmR0eXBlfHxlLmR0eXBlPT09dC5kdHlwZSlyZXR1cm4gdDt0cnl7cmV0dXJuIGNhc3QodCxlLmR0eXBlKX1jYXRjaChuKXt0aHJvdyBuZXcgVmFsdWVFcnJvcihcIlRoZSBkdHlwZSBvZiB0aGUgZmVlZCAoXCIrdC5kdHlwZStcIikgY2FuIG5vdCBiZSBjYXN0IHRvIHRoZSBkdHlwZSBvZiB0aGUga2V5ICdcIitlLm5hbWUrXCInIChcIitlLmR0eXBlK1wiKS5cIil9fXZhciBNb2RlbExvZ2dpbmdWZXJib3NpdHksRmVlZERpY3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe2lmKHRoaXMuaWQyVmFsdWU9e30sdCBpbnN0YW5jZW9mIGUpZm9yKHZhciBuIGluIHQuaWQyVmFsdWUpdGhpcy5pZDJWYWx1ZVtuXT10LmlkMlZhbHVlW25dO2Vsc2V7aWYobnVsbD09dClyZXR1cm47Zm9yKHZhciByPTAsaT10O3I8aS5sZW5ndGg7cisrKXt2YXIgYT1pW3JdO3RoaXMuYWRkKGEua2V5LGEudmFsdWUpfX19cmV0dXJuIGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlLHQpe2lmKG51bGwhPXRoaXMuaWQyVmFsdWVbZS5pZF0pdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJEdXBsaWNhdGUga2V5OiBuYW1lPVwiK2UubmFtZStcIiwgaWQ9XCIrZS5pZCk7cmV0dXJuIHRoaXMuaWQyVmFsdWVbZS5pZF09YXNzZXJ0RmVlZENvbXBhdGliaWxpdHkoZSx0KSx0aGlzfSxlLnByb3RvdHlwZS5hZGRGZWVkPWZ1bmN0aW9uKGUpe3RoaXMuYWRkKGUua2V5LGUudmFsdWUpfSxlLnByb3RvdHlwZS5oYXNLZXk9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPXRoaXMuaWQyVmFsdWVbZS5pZF19LGUucHJvdG90eXBlLmdldFZhbHVlPWZ1bmN0aW9uKGUpe2lmKG51bGw9PXRoaXMuaWQyVmFsdWVbZS5pZF0pdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJOb25leGlzdGVudCBrZXk6IFwiK0pTT04uc3RyaW5naWZ5KGUpKTtyZXR1cm4gdGhpcy5pZDJWYWx1ZVtlLmlkXX0sZX0oKTtmdW5jdGlvbiBleGVjdXRlKGUsdCxuKXtmb3IodmFyIHI9QXJyYXkuaXNBcnJheShlKSxpPXI/ZTpbZV0sYT1bXSxvPW5ldyBGZWVkRGljdCh0KSxzPTAsbD1pO3M8bC5sZW5ndGg7cysrKXt2YXIgdT1sW3NdO2EucHVzaChleGVjdXRlSW50ZXJuYWwodSxvLG4pKX1yZXR1cm4gcj9hOmFbMF19ZnVuY3Rpb24gZXhlY3V0ZUludGVybmFsKGUsdCxuKXtpZih0Lmhhc0tleShlKSlyZXR1cm4gdC5nZXRWYWx1ZShlKTtpZihlLnNvdXJjZUxheWVyIGluc3RhbmNlb2YgSW5wdXRMYXllcil0aHJvdyBuZXcgVmFsdWVFcnJvcihcIk1pc3NpbmcgYSBmZWVkIHZhbHVlIGZvciBTeW1ib2xpY1RlbnNvciBmcm9tIElucHV0TGF5ZXIgJ1wiK0lucHV0TGF5ZXIubmFtZStcIidcIik7Zm9yKHZhciByPVtdLGk9MCxhPWUuaW5wdXRzO2k8YS5sZW5ndGg7aSsrKXt2YXIgbz1leGVjdXRlSW50ZXJuYWwoYVtpXSx0LG4pO3IucHVzaChvKX12YXIgcz1lLnNvdXJjZUxheWVyLmFwcGx5KHIsbik7QXJyYXkuaXNBcnJheShzKXx8KHM9W3NdKTtmb3IodmFyIGw9Z2V0Tm9kZU91dHB1dHMoZSksdT1BcnJheS5pc0FycmF5KGwpP2w6W2xdLGM9MDtjPHUubGVuZ3RoOysrYyl0LmFkZCh1W2NdLHNbY10pO3JldHVybiAxPT09cy5sZW5ndGg/c1swXTpzW2Uub3V0cHV0VGVuc29ySW5kZXhdfWZ1bmN0aW9uIGdldE5vZGVPdXRwdXRzKGUpe3ZhciB0O2lmKDE9PT1lLnNvdXJjZUxheWVyLmluYm91bmROb2Rlcy5sZW5ndGgpdD1lLnNvdXJjZUxheWVyLm91dHB1dDtlbHNle2Zvcih2YXIgbj1udWxsLHI9MDtyPGUuc291cmNlTGF5ZXIuaW5ib3VuZE5vZGVzLmxlbmd0aDsrK3IpZm9yKHZhciBpPTAsYT1lLnNvdXJjZUxheWVyLmluYm91bmROb2Rlc1tyXS5vdXRwdXRUZW5zb3JzO2k8YS5sZW5ndGg7aSsrKXtpZihhW2ldLmlkPT09ZS5pZCl7bj1yO2JyZWFrfX10PWUuc291cmNlTGF5ZXIuZ2V0T3V0cHV0QXQobil9cmV0dXJuIHR9ZnVuY3Rpb24gcmVzb2x2ZVNjYWxhcnNJbkxvZ3MoZSl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgdCxuLHIsaSxhLG8scyxsO3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKHUpe3N3aXRjaCh1LmxhYmVsKXtjYXNlIDA6aWYobnVsbD09ZSlyZXR1cm5bMl07Zm9yKGkgaW4gdD1bXSxuPVtdLHI9W10sZSlcIm51bWJlclwiIT10eXBlb2YoYT1lW2ldKSYmKG89YSx0LnB1c2goby5kYXRhKCkpLG4ucHVzaChpKSxyLnB1c2gobykpO3JldHVybls0LFByb21pc2UuYWxsKHQpXTtjYXNlIDE6Zm9yKHM9dS5zZW50KCksbD0wO2w8cy5sZW5ndGg7KytsKWVbbltsXV09c1tsXVswXTtyZXR1cm4gZGlzcG9zZShyKSxbMl19fSl9KX1mdW5jdGlvbiBkaXNwb3NlVGVuc29yc0luTG9ncyhlKXtpZihudWxsIT1lKWZvcih2YXIgdCBpbiBlKXt2YXIgbj1lW3RdO1wibnVtYmVyXCIhPXR5cGVvZiBuJiZuLmRpc3Bvc2UoKX19IWZ1bmN0aW9uKGUpe2VbZS5TSUxFTlQ9MF09XCJTSUxFTlRcIixlW2UuVkVSQk9TRT0xXT1cIlZFUkJPU0VcIn0oTW9kZWxMb2dnaW5nVmVyYm9zaXR5fHwoTW9kZWxMb2dnaW5nVmVyYm9zaXR5PXt9KSk7dmFyIEJhc2VDYWxsYmFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt0aGlzLnZhbGlkYXRpb25EYXRhPW51bGx9cmV0dXJuIGUucHJvdG90eXBlLnNldFBhcmFtcz1mdW5jdGlvbihlKXt0aGlzLnBhcmFtcz1lfSxlLnByb3RvdHlwZS5vbkVwb2NoQmVnaW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKGUpe3JldHVyblsyXX0pfSl9LGUucHJvdG90eXBlLm9uRXBvY2hFbmQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKGUpe3JldHVyblsyXX0pfSl9LGUucHJvdG90eXBlLm9uQmF0Y2hCZWdpbj1mdW5jdGlvbihlLHQpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuWzJdfSl9KX0sZS5wcm90b3R5cGUub25CYXRjaEVuZD1mdW5jdGlvbihlLHQpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuWzJdfSl9KX0sZS5wcm90b3R5cGUub25UcmFpbkJlZ2luPWZ1bmN0aW9uKGUpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuWzJdfSl9KX0sZS5wcm90b3R5cGUub25UcmFpbkVuZD1mdW5jdGlvbihlKXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKGUpe3JldHVyblsyXX0pfSl9LGUucHJvdG90eXBlLnNldE1vZGVsPWZ1bmN0aW9uKGUpe30sZX0oKSxDYWxsYmFja0xpc3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7dm9pZCAwPT09dCYmKHQ9MTApLG51bGw9PWUmJihlPVtdKSx0aGlzLmNhbGxiYWNrcz1lLHRoaXMucXVldWVMZW5ndGg9dH1yZXR1cm4gZS5wcm90b3R5cGUuYXBwZW5kPWZ1bmN0aW9uKGUpe3RoaXMuY2FsbGJhY2tzLnB1c2goZSl9LGUucHJvdG90eXBlLnNldFBhcmFtcz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPXRoaXMuY2FsbGJhY2tzO3Q8bi5sZW5ndGg7dCsrKXtuW3RdLnNldFBhcmFtcyhlKX19LGUucHJvdG90eXBlLnNldE1vZGVsPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49dGhpcy5jYWxsYmFja3M7dDxuLmxlbmd0aDt0Kyspe25bdF0uc2V0TW9kZWwoZSl9fSxlLnByb3RvdHlwZS5vbkVwb2NoQmVnaW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBuLHI7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24oaSl7c3dpdGNoKGkubGFiZWwpe2Nhc2UgMDpudWxsPT10JiYodD17fSksbj0wLHI9dGhpcy5jYWxsYmFja3MsaS5sYWJlbD0xO2Nhc2UgMTpyZXR1cm4gbjxyLmxlbmd0aD9bNCxyW25dLm9uRXBvY2hCZWdpbihlLHQpXTpbMyw0XTtjYXNlIDI6aS5zZW50KCksaS5sYWJlbD0zO2Nhc2UgMzpyZXR1cm4gbisrLFszLDFdO2Nhc2UgNDpyZXR1cm5bMl19fSl9KX0sZS5wcm90b3R5cGUub25FcG9jaEVuZD1mdW5jdGlvbihlLHQpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIG4scjtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihpKXtzd2l0Y2goaS5sYWJlbCl7Y2FzZSAwOm51bGw9PXQmJih0PXt9KSxuPTAscj10aGlzLmNhbGxiYWNrcyxpLmxhYmVsPTE7Y2FzZSAxOnJldHVybiBuPHIubGVuZ3RoP1s0LHJbbl0ub25FcG9jaEVuZChlLHQpXTpbMyw0XTtjYXNlIDI6aS5zZW50KCksaS5sYWJlbD0zO2Nhc2UgMzpyZXR1cm4gbisrLFszLDFdO2Nhc2UgNDpyZXR1cm5bMl19fSl9KX0sZS5wcm90b3R5cGUub25CYXRjaEJlZ2luPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgbixyO3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKGkpe3N3aXRjaChpLmxhYmVsKXtjYXNlIDA6bnVsbD09dCYmKHQ9e30pLG49MCxyPXRoaXMuY2FsbGJhY2tzLGkubGFiZWw9MTtjYXNlIDE6cmV0dXJuIG48ci5sZW5ndGg/WzQscltuXS5vbkJhdGNoQmVnaW4oZSx0KV06WzMsNF07Y2FzZSAyOmkuc2VudCgpLGkubGFiZWw9MztjYXNlIDM6cmV0dXJuIG4rKyxbMywxXTtjYXNlIDQ6cmV0dXJuWzJdfX0pfSl9LGUucHJvdG90eXBlLm9uQmF0Y2hFbmQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBuLHI7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24oaSl7c3dpdGNoKGkubGFiZWwpe2Nhc2UgMDpyZXR1cm4gbnVsbD09dCYmKHQ9e30pLFs0LHJlc29sdmVTY2FsYXJzSW5Mb2dzKHQpXTtjYXNlIDE6aS5zZW50KCksbj0wLHI9dGhpcy5jYWxsYmFja3MsaS5sYWJlbD0yO2Nhc2UgMjpyZXR1cm4gbjxyLmxlbmd0aD9bNCxyW25dLm9uQmF0Y2hFbmQoZSx0KV06WzMsNV07Y2FzZSAzOmkuc2VudCgpLGkubGFiZWw9NDtjYXNlIDQ6cmV0dXJuIG4rKyxbMywyXTtjYXNlIDU6cmV0dXJuWzJdfX0pfSl9LGUucHJvdG90eXBlLm9uVHJhaW5CZWdpbj1mdW5jdGlvbihlKXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciB0LG47cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24ocil7c3dpdGNoKHIubGFiZWwpe2Nhc2UgMDpudWxsPT1lJiYoZT17fSksdD0wLG49dGhpcy5jYWxsYmFja3Msci5sYWJlbD0xO2Nhc2UgMTpyZXR1cm4gdDxuLmxlbmd0aD9bNCxuW3RdLm9uVHJhaW5CZWdpbihlKV06WzMsNF07Y2FzZSAyOnIuc2VudCgpLHIubGFiZWw9MztjYXNlIDM6cmV0dXJuIHQrKyxbMywxXTtjYXNlIDQ6cmV0dXJuWzJdfX0pfSl9LGUucHJvdG90eXBlLm9uVHJhaW5FbmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgdCxuO3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKHIpe3N3aXRjaChyLmxhYmVsKXtjYXNlIDA6bnVsbD09ZSYmKGU9e30pLHQ9MCxuPXRoaXMuY2FsbGJhY2tzLHIubGFiZWw9MTtjYXNlIDE6cmV0dXJuIHQ8bi5sZW5ndGg/WzQsblt0XS5vblRyYWluRW5kKGUpXTpbMyw0XTtjYXNlIDI6ci5zZW50KCksci5sYWJlbD0zO2Nhc2UgMzpyZXR1cm4gdCsrLFszLDFdO2Nhc2UgNDpyZXR1cm5bMl19fSl9KX0sZX0oKSxNb2RlbFRyYWluaW5nWWllbGRlcj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dGhpcy55aWVsZEV2ZXJ5PWUsdGhpcy5iYXRjaENvdW50PTAsdGhpcy5iYXRjaER1cmF0aW9uc01pbGxpcz1bXSx0aGlzLmF1dG9ZaWVsZEV2ZXJ5QmF0Y2hlcz1udWxsLHRoaXMuYmF0Y2hTdGFydE1pbGxpcz11dGlsLm5vdygpfXJldHVybiBlLnByb3RvdHlwZS5yZXNvbHZlT25lVGVuc29ySW5Mb2dzPWZ1bmN0aW9uKGUpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIHQsbixyLGksYTtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihvKXtzd2l0Y2goby5sYWJlbCl7Y2FzZSAwOmZvcihuIGluIHQ9W10sZSl0LnB1c2gobik7cj0wLG8ubGFiZWw9MTtjYXNlIDE6cmV0dXJuIHI8dC5sZW5ndGg/KGk9dFtyXSxcIm51bWJlclwiPT10eXBlb2YoYT1lW2ldKT9bMywzXTpbNCxhLmRhdGEoKV0pOlszLDRdO2Nhc2UgMjpyZXR1cm4gby5zZW50KCksWzMsNF07Y2FzZSAzOnJldHVybiByKyssWzMsMV07Y2FzZSA0OnJldHVyblsyXX19KX0pfSxlLnByb3RvdHlwZS5tYXliZVlpZWxkT25CYXRjaD1mdW5jdGlvbih0KXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBuLHI7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24oaSl7c3dpdGNoKGkubGFiZWwpe2Nhc2UgMDpyZXR1cm5cImF1dG9cIiE9PXRoaXMueWllbGRFdmVyeT9bMyw3XToodGhpcy5iYXRjaENvdW50KyssbnVsbCE9dGhpcy5hdXRvWWllbGRFdmVyeUJhdGNoZXM/WzMsM106WzQsdGhpcy5yZXNvbHZlT25lVGVuc29ySW5Mb2dzKHQpXSk7Y2FzZSAxOnJldHVybiBpLnNlbnQoKSxuPXV0aWwubm93KCksWzQsbmV4dEZyYW1lKCldO2Nhc2UgMjpyZXR1cm4gaS5zZW50KCksdGhpcy5iYXRjaENvdW50PmUuU0tJUF9GSVJTVF9CQVRDSEVTJiYodGhpcy5iYXRjaER1cmF0aW9uc01pbGxpcy5wdXNoKG4tdGhpcy5iYXRjaFN0YXJ0TWlsbGlzKSx0aGlzLmJhdGNoRHVyYXRpb25zTWlsbGlzLmxlbmd0aD49ZS5ERUNJU0lPTl9CQVRDSF9DT1VOVCYmKHI9dGhpcy5iYXRjaER1cmF0aW9uc01pbGxpcy5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSt0fSkvdGhpcy5iYXRjaER1cmF0aW9uc01pbGxpcy5sZW5ndGgsdGhpcy5hdXRvWWllbGRFdmVyeUJhdGNoZXM9TWF0aC5yb3VuZChlLlRIUkVTSE9MRF9NSUxMSVMvciksdGhpcy5hdXRvWWllbGRFdmVyeUJhdGNoZXM8MSYmKHRoaXMuYXV0b1lpZWxkRXZlcnlCYXRjaGVzPTEpKSksdGhpcy5iYXRjaFN0YXJ0TWlsbGlzPXV0aWwubm93KCksdGhpcy5sYXN0WWllbGRCYXRjaENvdW50PXRoaXMuYmF0Y2hDb3VudCxbMyw2XTtjYXNlIDM6cmV0dXJuIHRoaXMuYmF0Y2hDb3VudC10aGlzLmxhc3RZaWVsZEJhdGNoQ291bnQ+PXRoaXMuYXV0b1lpZWxkRXZlcnlCYXRjaGVzP1s0LG5leHRGcmFtZSgpXTpbMyw2XTtjYXNlIDQ6cmV0dXJuIGkuc2VudCgpLFs0LHRoaXMucmVzb2x2ZU9uZVRlbnNvckluTG9ncyh0KV07Y2FzZSA1Omkuc2VudCgpLHRoaXMubGFzdFlpZWxkQmF0Y2hDb3VudD10aGlzLmJhdGNoQ291bnQsaS5sYWJlbD02O2Nhc2UgNjpyZXR1cm5bMyw5XTtjYXNlIDc6cmV0dXJuXCJiYXRjaFwiIT09dGhpcy55aWVsZEV2ZXJ5P1szLDldOls0LG5leHRGcmFtZSgpXTtjYXNlIDg6aS5zZW50KCksaS5sYWJlbD05O2Nhc2UgOTpyZXR1cm5bMl19fSl9KX0sZS5wcm90b3R5cGUubWF5YmVZaWVsZE9uRXBvY2g9ZnVuY3Rpb24oKXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKGUpe3N3aXRjaChlLmxhYmVsKXtjYXNlIDA6cmV0dXJuXCJlcG9jaFwiIT09dGhpcy55aWVsZEV2ZXJ5P1szLDJdOls0LG5leHRGcmFtZSgpXTtjYXNlIDE6ZS5zZW50KCksZS5sYWJlbD0yO2Nhc2UgMjpyZXR1cm5bMl19fSl9KX0sZS5TS0lQX0ZJUlNUX0JBVENIRVM9MSxlLkRFQ0lTSU9OX0JBVENIX0NPVU5UPTIsZS5USFJFU0hPTERfTUlMTElTPTE2LGV9KCksQmFzZUxvZ2dlcj1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gbi55aWVsZEV2ZXJ5PXR8fFwiYXV0b1wiLG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLm9uVHJhaW5CZWdpbj1mdW5jdGlvbihlKXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmF1dG9ZaWVsZGVyPW5ldyBNb2RlbFRyYWluaW5nWWllbGRlcih0aGlzLnlpZWxkRXZlcnkpLFsyXX0pfSl9LHQucHJvdG90eXBlLm9uRXBvY2hCZWdpbj1mdW5jdGlvbihlKXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnNlZW49MCx0aGlzLnRvdGFscz17fSxbMl19KX0pfSx0LnByb3RvdHlwZS5vbkJhdGNoRW5kPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgZSxuLHIsaSxhPXRoaXM7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24obyl7c3dpdGNoKG8ubGFiZWwpe2Nhc2UgMDpyZXR1cm5bNCx0aGlzLmF1dG9ZaWVsZGVyLm1heWJlWWllbGRPbkJhdGNoKHQpXTtjYXNlIDE6Zm9yKGkgaW4gby5zZW50KCksbnVsbD09dCYmKHQ9e30pLGU9bnVsbD09dC5zaXplPzA6dC5zaXplLHRoaXMuc2Vlbis9ZSxuPWZ1bmN0aW9uKG4pe3ZhciBpPXRbbl07aWYoXCJudW1iZXJcIj09dHlwZW9mIGkpci50b3RhbHMuaGFzT3duUHJvcGVydHkobil8fChyLnRvdGFsc1tuXT0wKSxyLnRvdGFsc1tuXT1yLnRvdGFsc1tuXStpKmU7ZWxzZXt2YXIgbz12b2lkIDA7biBpbiByLnRvdGFscz9vPXIudG90YWxzW25dOnIudG90YWxzW25dPWdldFNjYWxhcigwKSxyLnRvdGFsc1tuXT10aWR5KGZ1bmN0aW9uKCl7cmV0dXJuIGFkZChhLnRvdGFsc1tuXSxtdWwoaSxnZXRTY2FsYXIoZSkpKX0pLG51bGwhPW8mJm8uZGlzcG9zZSgpfX0scj10aGlzLHQpbihpKTtyZXR1cm5bMl19fSl9KX0sdC5wcm90b3R5cGUub25FcG9jaEVuZD1mdW5jdGlvbihlLHQpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIGUsbixyLGksYSxvPXRoaXM7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24ocyl7c3dpdGNoKHMubGFiZWwpe2Nhc2UgMDpyZXR1cm5bNCx0aGlzLmF1dG9ZaWVsZGVyLm1heWJlWWllbGRPbkVwb2NoKCldO2Nhc2UgMTppZihzLnNlbnQoKSxudWxsIT10KWZvcihlPWZ1bmN0aW9uKGUpe2lmKG51bGw9PW4udG90YWxzW2VdKXJldHVyblwiY29udGludWVcIjtcIm51bWJlclwiPT10eXBlb2Ygbi50b3RhbHNbZV0/dFtlXT1uLnRvdGFsc1tlXS9uLnNlZW46dGlkeShmdW5jdGlvbigpe3RbZV09bXVsKGRpdihnZXRTY2FsYXIoMSksZ2V0U2NhbGFyKG8uc2VlbikpLG8udG90YWxzW2VdKSxvLnRvdGFsc1tlXS5kaXNwb3NlKCksa2VlcCh0W2VdKX0pfSxuPXRoaXMscj0wLGk9dGhpcy5wYXJhbXMubWV0cmljcztyPGkubGVuZ3RoO3IrKylhPWlbcl0sZShhKTtyZXR1cm5bMl19fSl9KX0sdH0oQmFzZUNhbGxiYWNrKSxIaXN0b3J5PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtyZXR1cm4gbnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5vblRyYWluQmVnaW49ZnVuY3Rpb24oZSl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lcG9jaD1bXSx0aGlzLmhpc3Rvcnk9e30sWzJdfSl9KX0sdC5wcm90b3R5cGUub25FcG9jaEVuZD1mdW5jdGlvbihlLHQpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIG47cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24ocil7Zm9yKG4gaW4gbnVsbD09dCYmKHQ9e30pLHRoaXMuZXBvY2gucHVzaChlKSx0KW51bGw9PXRoaXMuaGlzdG9yeVtuXSYmKHRoaXMuaGlzdG9yeVtuXT1bXSksdGhpcy5oaXN0b3J5W25dLnB1c2godFtuXSk7cmV0dXJuWzJdfSl9KX0sdC5wcm90b3R5cGUuc3luY0RhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBlLHQsbixyLGksYSxvLHMsbDtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbih1KXtzd2l0Y2godS5sYWJlbCl7Y2FzZSAwOmZvcihyIGluIGU9W10sdD1bXSxuPVtdLHRoaXMuaGlzdG9yeSlmb3IoaT10aGlzLmhpc3Rvcnlbcl0sYT0wO2E8aS5sZW5ndGg7KythKVwibnVtYmVyXCIhPXR5cGVvZiBpW2FdJiYobz1pW2FdLGUucHVzaChvLmRhdGEoKSksdC5wdXNoKHIpLG4ucHVzaChhKSk7cmV0dXJuWzQsUHJvbWlzZS5hbGwoZSldO2Nhc2UgMTpmb3Iocz11LnNlbnQoKSxsPTA7bDxzLmxlbmd0aDsrK2wpdGhpcy5oaXN0b3J5W3RbbF1dW25bbF1dLmRpc3Bvc2UoKSx0aGlzLmhpc3RvcnlbdFtsXV1bbltsXV09c1tsXVswXTtyZXR1cm5bMl19fSl9KX0sdH0oQmFzZUNhbGxiYWNrKSxDdXN0b21DYWxsYmFjaz1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gbi50cmFpbkJlZ2luPXQub25UcmFpbkJlZ2luLG4udHJhaW5FbmQ9dC5vblRyYWluRW5kLG4uZXBvY2hCZWdpbj10Lm9uRXBvY2hCZWdpbixuLmVwb2NoRW5kPXQub25FcG9jaEVuZCxuLmJhdGNoQmVnaW49dC5vbkJhdGNoQmVnaW4sbi5iYXRjaEVuZD10Lm9uQmF0Y2hFbmQsbn1yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUub25FcG9jaEJlZ2luPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihuKXtzd2l0Y2gobi5sYWJlbCl7Y2FzZSAwOnJldHVybiBudWxsPT10aGlzLmVwb2NoQmVnaW4/WzMsM106WzQscmVzb2x2ZVNjYWxhcnNJbkxvZ3ModCldO2Nhc2UgMTpyZXR1cm4gbi5zZW50KCksWzQsdGhpcy5lcG9jaEJlZ2luKGUsdCldO2Nhc2UgMjpuLnNlbnQoKSxuLmxhYmVsPTM7Y2FzZSAzOnJldHVyblsyXX19KX0pfSx0LnByb3RvdHlwZS5vbkVwb2NoRW5kPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihuKXtzd2l0Y2gobi5sYWJlbCl7Y2FzZSAwOnJldHVybiBudWxsPT10aGlzLmVwb2NoRW5kP1szLDNdOls0LHJlc29sdmVTY2FsYXJzSW5Mb2dzKHQpXTtjYXNlIDE6cmV0dXJuIG4uc2VudCgpLFs0LHRoaXMuZXBvY2hFbmQoZSx0KV07Y2FzZSAyOm4uc2VudCgpLG4ubGFiZWw9MztjYXNlIDM6cmV0dXJuWzJdfX0pfSl9LHQucHJvdG90eXBlLm9uQmF0Y2hCZWdpbj1mdW5jdGlvbihlLHQpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24obil7c3dpdGNoKG4ubGFiZWwpe2Nhc2UgMDpyZXR1cm4gbnVsbD09dGhpcy5iYXRjaEJlZ2luP1szLDNdOls0LHJlc29sdmVTY2FsYXJzSW5Mb2dzKHQpXTtjYXNlIDE6cmV0dXJuIG4uc2VudCgpLFs0LHRoaXMuYmF0Y2hCZWdpbihlLHQpXTtjYXNlIDI6bi5zZW50KCksbi5sYWJlbD0zO2Nhc2UgMzpyZXR1cm5bMl19fSl9KX0sdC5wcm90b3R5cGUub25CYXRjaEVuZD1mdW5jdGlvbihlLHQpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24obil7c3dpdGNoKG4ubGFiZWwpe2Nhc2UgMDpyZXR1cm4gbnVsbD09dGhpcy5iYXRjaEVuZD9bMywzXTpbNCxyZXNvbHZlU2NhbGFyc0luTG9ncyh0KV07Y2FzZSAxOnJldHVybiBuLnNlbnQoKSxbNCx0aGlzLmJhdGNoRW5kKGUsdCldO2Nhc2UgMjpuLnNlbnQoKSxuLmxhYmVsPTM7Y2FzZSAzOnJldHVyblsyXX19KX0pfSx0LnByb3RvdHlwZS5vblRyYWluQmVnaW49ZnVuY3Rpb24oZSl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbih0KXtzd2l0Y2godC5sYWJlbCl7Y2FzZSAwOnJldHVybiBudWxsPT10aGlzLnRyYWluQmVnaW4/WzMsM106WzQscmVzb2x2ZVNjYWxhcnNJbkxvZ3MoZSldO2Nhc2UgMTpyZXR1cm4gdC5zZW50KCksWzQsdGhpcy50cmFpbkJlZ2luKGUpXTtjYXNlIDI6dC5zZW50KCksdC5sYWJlbD0zO2Nhc2UgMzpyZXR1cm5bMl19fSl9KX0sdC5wcm90b3R5cGUub25UcmFpbkVuZD1mdW5jdGlvbihlKXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKHQpe3N3aXRjaCh0LmxhYmVsKXtjYXNlIDA6cmV0dXJuIG51bGw9PXRoaXMudHJhaW5FbmQ/WzMsM106WzQscmVzb2x2ZVNjYWxhcnNJbkxvZ3MoZSldO2Nhc2UgMTpyZXR1cm4gdC5zZW50KCksWzQsdGhpcy50cmFpbkVuZChlKV07Y2FzZSAyOnQuc2VudCgpLHQubGFiZWw9MztjYXNlIDM6cmV0dXJuWzJdfX0pfSl9LHR9KEJhc2VDYWxsYmFjayk7ZnVuY3Rpb24gc3RhbmRhcmRpemVDYWxsYmFja3MoZSl7cmV0dXJuIG51bGw9PWU/bnVsbDplIGluc3RhbmNlb2YgQmFzZUNhbGxiYWNrP1tlXTpBcnJheS5pc0FycmF5KGUpJiZlWzBdaW5zdGFuY2VvZiBCYXNlQ2FsbGJhY2s/ZTp0b0xpc3QoZSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBuZXcgQ3VzdG9tQ2FsbGJhY2soZSl9KX12YXIgQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe31yZXR1cm4gZS5yZWdpc3RlckNhbGxiYWNrQ29uc3RydWN0b3I9ZnVuY3Rpb24odCxuKXt1dGlsLmFzc2VydCh0Pj0wJiZOdW1iZXIuaXNJbnRlZ2VyKHQpLFwiVmVyYm9zaXR5IGxldmVsIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGludGVnZXIgPj0gMCwgYnV0IGdvdCBcIit0KSxlLmNoZWNrRm9yRHVwbGljYXRlKG4pLG51bGw9PWUuY29uc3RydWN0b3JzW3RdJiYoZS5jb25zdHJ1Y3RvcnNbdF09W10pLGUuY29uc3RydWN0b3JzW3RdLnB1c2gobil9LGUuY2hlY2tGb3JEdXBsaWNhdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBuIGluIGUuY29uc3RydWN0b3JzKXtlLmNvbnN0cnVjdG9yc1srbl0uZm9yRWFjaChmdW5jdGlvbihlKXtpZihlPT09dCl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIkR1cGxpY2F0ZSBjYWxsYmFjayBjb25zdHJ1Y3Rvci5cIil9KX19LGUuY2xlYXI9ZnVuY3Rpb24oKXtlLmNvbnN0cnVjdG9ycz17fX0sZS5jcmVhdGVDYWxsYmFja3M9ZnVuY3Rpb24odCl7dmFyIG49W107Zm9yKHZhciByIGluIGUuY29uc3RydWN0b3JzKXt2YXIgaT0rcjt0Pj1pJiZuLnB1c2guYXBwbHkobixlLmNvbnN0cnVjdG9yc1tpXSl9cmV0dXJuIG4ubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBuZXcgZX0pfSxlLmNvbnN0cnVjdG9ycz17fSxlfSgpO2Z1bmN0aW9uIGNvbmZpZ3VyZUNhbGxiYWNrcyhlLHQsbixyLGksYSxvLHMsbCx1KXt2YXIgYz1uZXcgSGlzdG9yeSxwPVtuZXcgQmFzZUxvZ2dlcih0KV0uY29uY2F0KENhbGxiYWNrQ29uc3RydWN0b3JSZWdpc3RyeS5jcmVhdGVDYWxsYmFja3MobikpO251bGwhPWUmJnAucHVzaC5hcHBseShwLGUpLHAucHVzaChjKTt2YXIgaD1uZXcgQ2FsbGJhY2tMaXN0KHApO3JldHVybiBoLnNldFBhcmFtcyh7ZXBvY2hzOnIsaW5pdGlhbEVwb2NoOmksc2FtcGxlczphLHN0ZXBzOm8sYmF0Y2hTaXplOnMsdmVyYm9zZTpuLGRvVmFsaWRhdGlvbjpsLG1ldHJpY3M6dX0pLHtjYWxsYmFja0xpc3Q6aCxoaXN0b3J5OmN9fXZhciBMYXp5SXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXt9fSgpLERhdGFzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXt9fSgpLERFRkFVTFRfVkFMSURBVElPTl9CQVRDSF9TSVpFPTMyO2Z1bmN0aW9uIHN0YW5kYXJkaXplRGF0YUl0ZXJhdG9yT3V0cHV0KGUsdCl7aWYoZS5vdXRwdXRzLmxlbmd0aD4xKXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiU3VwcG9ydCBmb3IgdHJhaW5pbmcgYSBtb2RlbCB3aXRoIG11bHRpcGxlIG91dHB1dCB0ZW5zb3JzIHdpdGggYSBkYXRhc2V0IG9iamVjdCBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LlwiKTt1dGlsLmFzc2VydChBcnJheS5pc0FycmF5KHQpJiYyPT09dC5sZW5ndGgsXCJEYXRhc2V0IGl0ZXJhdG9yIGZvciBmaXREYXRhc2V0KCkgaXMgZXhwZWN0ZWQgdG8gZ2VuZXJhdGUgYW4gQXJyYXkgb2YgbGVuZ3RoIDI6IGBbeHMsIHlzXWAsIGJ1dCBpbnN0ZWFkIGdlbmVyYXRlcyBcIit0KTt2YXIgbj0odD10KVsxXSxyPXRbMF07aWYociBpbnN0YW5jZW9mIFRlbnNvcilyZXR1cm4gdXRpbC5hc3NlcnQoMT09PWUuaW5wdXRzLmxlbmd0aCxcIk1vZGVsIGhhcyBtdWx0aXBsZSBcIitlLmlucHV0cy5sZW5ndGgrXCIgaW5wdXRzLCBoZW5jZSBpdCBleHBlY3RzIHRoZSBpbnB1dCBkYXRhc2V0IHRvIGdlbmVyYXRlIGEgZGljdGlvbmFyeSBvZiB0ZW5zb3JzICAod2l0aCBrZXlzIFwiK0pTT04uc3RyaW5naWZ5KGUuaW5wdXROYW1lcykrXCIsIGJ1dCByZWNlaXZlZCBhIHNpbmdsZSB0ZW5zb3IuXCIpLHV0aWwuYXNzZXJ0KHIuc2hhcGVbMF09PT1uLnNoYXBlWzBdLFwiTWlzbWF0Y2ggaW4gYmF0Y2ggc2l6ZSBiZXR3ZWVuIHggYW5kIHkgdGVuc29ycyAoXCIrci5zaGFwZVswXStcIiB2cy4gXCIrbi5zaGFwZVswXStcIilcIiksW3Isbl07dmFyIGk9dm9pZCAwO3I9cjtmb3IodmFyIGE9W10sbz0wLHM9ZS5pbnB1dE5hbWVzO288cy5sZW5ndGg7bysrKXt2YXIgbD1zW29dO2lmKG51bGw9PXJbbF0pdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJUaGUgZmVhdHVyZSBkYXRhIGdlbmVyYXRlZCBieSB0aGUgZGF0YXNldCBsYWNrcyB0aGUgcmVxdWlyZWQgaW5wdXQga2V5ICdcIitsK1wiJy5cIik7YS5wdXNoKHJbbF0pLG51bGw9PWk/aT1yW2xdLnNoYXBlWzBdOnV0aWwuYXNzZXJ0KHJbbF0uc2hhcGVbMF09PT1pLFwiTWlzbWF0Y2ggaW4gYmF0Y2ggc2l6ZSBiZXR3ZWVuIHggYW5kIHkgdGVuc29ycyAoXCIrcltsXS5zaGFwZVswXStcIiB2cy4gXCIrbi5zaGFwZVswXStcIilcIil9cmV0dXJuIGEuY29uY2F0KG4pfWZ1bmN0aW9uIHN0YW5kYXJkaXplVGVuc29yVmFsaWRhdGlvbkRhdGEoZSl7aWYoMz09PWUubGVuZ3RoKXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiVmFsaWRhdGlvbiB3aXRoIHNhbXBsZSB3ZWlnaHRzIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuXCIpO3JldHVybnt4czplWzBdLHlzOmVbMV19fWZ1bmN0aW9uIGZpdERhdGFzZXQoZSx0LG4pe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIHIsaSxhLG8scyxsLHUsYyxwLGgsZCxnLGYsbSx5LHYsYix3LHosUyxBLEksQyxOLEUsXztyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihrKXtzd2l0Y2goay5sYWJlbCl7Y2FzZSAwOmlmKHV0aWwuYXNzZXJ0KG51bGwhPWUub3B0aW1pemVyLFwiWW91IG11c3QgY29tcGlsZSBhIG1vZGVsIGJlZm9yZSB0cmFpbmluZy90ZXN0aW5nLiBVc2UgTW9kZWwuY29tcGlsZShtb2RlbENvbXBpbGVDb25maWcpLlwiKSx1dGlsLmFzc2VydChudWxsIT1uLFwiRm9yIGZpdERhdGFzZXQoKSwgdGhlIDJuZCBhcmd1bWVudCAoY29uZmlnKSBpcyByZXF1aXJlZCwgYnV0IGl0IGlzIG5vdCBwcm92aWRlZCBpbiB0aGlzIGNhbGwuXCIpLHV0aWwuYXNzZXJ0KG51bGwhPW4uZXBvY2hzJiZuLmVwb2Nocz4wJiZOdW1iZXIuaXNJbnRlZ2VyKG4uZXBvY2hzKSxcIkZvciBmaXREYXRhc2V0KCksIGNvbmZpZy5lcG9jaHMgaXMgZXhwZWN0ZWQgdG8gYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBidXQgZ290IFwiK24uZXBvY2hzKSx1dGlsLmFzc2VydChudWxsIT1uLmJhdGNoZXNQZXJFcG9jaCYmbi5iYXRjaGVzUGVyRXBvY2g+MCYmTnVtYmVyLmlzSW50ZWdlcihuLmJhdGNoZXNQZXJFcG9jaCksXCJGb3IgZml0RGF0YXNldCgpLCBjb25maWcuYmF0Y2hlc1BlckVwb2NoIGlzIGV4cGVjdGVkIHRvIGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgYnV0IGdvdCBcIituLmJhdGNoZXNQZXJFcG9jaCksZS5pc1RyYWluaW5nKXRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzdGFydCB0cmFpbmluZyBiZWNhdXNlIGFub3RoZXIgZml0KCkgY2FsbCBpcyBvbmdvaW5nLlwiKTtlLmlzVHJhaW5pbmc9ITAsay5sYWJlbD0xO2Nhc2UgMTpyZXR1cm4gay50cnlzLnB1c2goWzEsLDIxLDIyXSkscj1udWxsIT1uLnZhbGlkYXRpb25EYXRhLGk9dm9pZCAwLGE9dm9pZCAwLG89dm9pZCAwLHI/bi52YWxpZGF0aW9uRGF0YSBpbnN0YW5jZW9mIERhdGFzZXQ/KHV0aWwuYXNzZXJ0KG4udmFsaWRhdGlvbkJhdGNoZXM+MCYmTnVtYmVyLmlzSW50ZWdlcihuLnZhbGlkYXRpb25CYXRjaGVzKSxcIkZvciBmaXREYXRhc2V0KCkgd2l0aCBkYXRhc2V0LWJhc2VkIHZhbGlkYXRpb24sIGNvbmZpZy52YWxpZGF0aW9uQmF0Y2hlcyBpcyBleHBlY3RlZCB0byBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGJ1dCBnb3QgXCIrbi52YWxpZGF0aW9uQmF0Y2hlcyksWzQsbi52YWxpZGF0aW9uRGF0YS5pdGVyYXRvcigpXSk6WzMsM106WzMsNF07Y2FzZSAyOnJldHVybiBpPWsuc2VudCgpLFszLDRdO2Nhc2UgMzpzPXN0YW5kYXJkaXplVGVuc29yVmFsaWRhdGlvbkRhdGEobi52YWxpZGF0aW9uRGF0YSksYT1zLnhzLG89cy55cyxrLmxhYmVsPTQ7Y2FzZSA0OnJldHVybiBsPWUubWFrZVRyYWluRnVuY3Rpb24oKSx1PWUuZ2V0RGVkdXBlZE1ldHJpY3NOYW1lcygpLGM9dm9pZCAwLGM9cj91LnNsaWNlKCkuY29uY2F0KHUubWFwKGZ1bmN0aW9uKGUpe3JldHVyblwidmFsX1wiK2V9KSk6dS5zbGljZSgpLHA9c3RhbmRhcmRpemVDYWxsYmFja3Mobi5jYWxsYmFja3MpLGg9Y29uZmlndXJlQ2FsbGJhY2tzKHAsbi55aWVsZEV2ZXJ5LG4udmVyYm9zZSxuLmVwb2NocyxudWxsLG51bGwsbi5iYXRjaGVzUGVyRXBvY2gsbnVsbCxyLGMpLGQ9aC5jYWxsYmFja0xpc3QsZz1oLmhpc3RvcnksZS5oaXN0b3J5PWcsWzQsZC5vblRyYWluQmVnaW4oKV07Y2FzZSA1OnJldHVybiBrLnNlbnQoKSxmPW51bGw9PW4uaW5pdGlhbEVwb2NoPzA6bi5pbml0aWFsRXBvY2gsbT17fSxbNCx0Lml0ZXJhdG9yKCldO2Nhc2UgNjp5PWsuc2VudCgpLGsubGFiZWw9NztjYXNlIDc6cmV0dXJuIGY8bi5lcG9jaHM/WzQsZC5vbkVwb2NoQmVnaW4oZildOlszLDE4XTtjYXNlIDg6ay5zZW50KCksdj0wLGI9MCxrLmxhYmVsPTk7Y2FzZSA5OnJldHVybiB2PG4uYmF0Y2hlc1BlckVwb2NoP1s0LHkubmV4dCgpXTpbMywxNl07Y2FzZSAxMDppZigodz1rLnNlbnQoKSkuZG9uZSlyZXR1cm4gY29uc29sZS53YXJuKFwiWW91ciBkYXRhc2V0IGl0ZXJhdG9yIHJhbiBvdXQgb2YgZGF0YTsgaW50ZXJydXB0aW5nIHRyYWluaW5nLiBNYWtlIHN1cmUgdGhhdCB5b3VyIGRhdGFzZXQgY2FuIGdlbmVyYXRlIGF0IGxlYXN0IGBiYXRjaGVzUGVyRXBvY2ggKiBlcG9jaHNgIGJhdGNoZXMgKGluIHRoaXMgY2FzZSwgXCIrbi5iYXRjaGVzUGVyRXBvY2gqbi5lcG9jaHMrXCIgYmF0Y2hlcykuIFlvdSBtYXkgbmVlZCB0byB1c2UgdGhlIHJlcGVhdCgpIGZ1bmN0aW9uIHdoZW4gYnVpbGRpbmcgeW91ciBkYXRhc2V0LlwiKSxbMywxNl07Zm9yKHo9c3RhbmRhcmRpemVEYXRhSXRlcmF0b3JPdXRwdXQoZSx3LnZhbHVlKSwoUz17fSkuYmF0Y2g9YixTLnNpemU9elswXS5zaGFwZVswXSxkLm9uQmF0Y2hCZWdpbihiLFMpLEE9bCh6KSxkaXNwb3NlKHopLF89MDtfPHUubGVuZ3RoOysrXylJPXVbX10sQz1BW19dLFNbSV09QyxrZWVwKEMpO3JldHVybls0LGQub25CYXRjaEVuZChiLFMpXTtjYXNlIDExOnJldHVybiBrLnNlbnQoKSxkaXNwb3NlVGVuc29yc0luTG9ncyhTKSxiKyssKyt2Pj1uLmJhdGNoZXNQZXJFcG9jaCYmcj8oTj12b2lkIDAsbi52YWxpZGF0aW9uRGF0YSBpbnN0YW5jZW9mIERhdGFzZXQ/KEU9dG9MaXN0LFs0LGUuZXZhbHVhdGVEYXRhc2V0KGkse2JhdGNoZXM6bi52YWxpZGF0aW9uQmF0Y2hlc30pXSk6WzMsMTNdKTpbMywxNV07Y2FzZSAxMjpyZXR1cm4gTj1FLmFwcGx5KHZvaWQgMCxbay5zZW50KCldKSxbMywxNF07Y2FzZSAxMzpOPXRvTGlzdChlLmV2YWx1YXRlKGEsbyx7YmF0Y2hTaXplOm51bGw9PW4udmFsaWRhdGlvbkJhdGNoU2l6ZT9ERUZBVUxUX1ZBTElEQVRJT05fQkFUQ0hfU0laRTpuLnZhbGlkYXRpb25CYXRjaFNpemUsdmVyYm9zZTowfSkpLGsubGFiZWw9MTQ7Y2FzZSAxNDpmb3IoXz0wO188ZS5tZXRyaWNzTmFtZXMubGVuZ3RoOysrXyltW1widmFsX1wiK2UubWV0cmljc05hbWVzW19dXT1OW19dO2subGFiZWw9MTU7Y2FzZSAxNTpyZXR1cm4gZS5zdG9wVHJhaW5pbmdfP1szLDE2XTpbMyw5XTtjYXNlIDE2OnJldHVybls0LGQub25FcG9jaEVuZChmLG0pXTtjYXNlIDE3OnJldHVybiBrLnNlbnQoKSxmKyssZS5zdG9wVHJhaW5pbmdfP1szLDE4XTpbMyw3XTtjYXNlIDE4OnJldHVybls0LGQub25UcmFpbkVuZCgpXTtjYXNlIDE5OnJldHVybiBrLnNlbnQoKSxbNCxlLmhpc3Rvcnkuc3luY0RhdGEoKV07Y2FzZSAyMDpyZXR1cm4gay5zZW50KCksWzIsZS5oaXN0b3J5XTtjYXNlIDIxOnJldHVybiBlLmlzVHJhaW5pbmc9ITEsWzddO2Nhc2UgMjI6cmV0dXJuWzJdfX0pfSl9ZnVuY3Rpb24gZXZhbHVhdGVEYXRhc2V0KGUsdCxuKXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciByLGksYSxvLHMsbCx1LGMscDtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihoKXtzd2l0Y2goaC5sYWJlbCl7Y2FzZSAwOmlmKHI9ZS50ZXN0RnVuY3Rpb24saT1bXSxuLnZlcmJvc2U+MCl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcIlZlcmJvc2UgbW9kZSBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LlwiKTtyZXR1cm4gdXRpbC5hc3NlcnQobi5iYXRjaGVzPjAmJk51bWJlci5pc0ludGVnZXIobi5iYXRjaGVzKSxcIlRlc3QgbG9vcCBleHBlY3RzIGBiYXRjaGVzYCB0byBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGJ1dCByZWNlaXZlZCBcIitKU09OLnN0cmluZ2lmeShuLmJhdGNoZXMpKSx0IGluc3RhbmNlb2YgTGF6eUl0ZXJhdG9yPyhvPXQsWzMsM10pOlszLDFdO2Nhc2UgMTpyZXR1cm5bNCx0Lml0ZXJhdG9yKCldO2Nhc2UgMjpvPWguc2VudCgpLGgubGFiZWw9MztjYXNlIDM6YT1vLHM9MCxsPWZ1bmN0aW9uKHQpe3ZhciBvLGwsdSxjLHAsaDtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihkKXtzd2l0Y2goZC5sYWJlbCl7Y2FzZSAwOnJldHVybls0LGEubmV4dCgpXTtjYXNlIDE6aWYoKG89ZC5zZW50KCkpLmRvbmUpcmV0dXJuIGNvbnNvbGUud2FybihcIllvdXIgZGF0YXNldCBpdGVyYXRvciByYW4gb3V0IG9mIGRhdGEgZHVyaW5nIGV2YWx1YXRlRGF0YXNldCgpLiBJbnRlcnJ1cHRpbmcgZXZhbHV0aW9uLiBNYWtlIHN1cmUgdGhhdCB5b3VyIGRhdGFzZXQgY2FuIGdlbmVyYXRlIGF0IGxlYXN0IGBiYXRjaGVzYCBiYXRjaGVzIChpbiB0aGlzIGNhc2UsIFwiK24uYmF0Y2hlcytcIiBiYXRjaGVzKS4gWW91IG1heSBuZWVkIHRvIHVzZSB0aGUgcmVwZWF0KCkgZnVuY3Rpb24gd2hlbiBidWlsZGluZyB5b3VyIGRhdGFzZXQuXCIpLFsyLFwiYnJlYWtcIl07aWYobD1zdGFuZGFyZGl6ZURhdGFJdGVyYXRvck91dHB1dChlLG8udmFsdWUpLHU9dGlkeShmdW5jdGlvbigpe3JldHVybiByKGwpfSksZGlzcG9zZShsKSwwPT09dClmb3IoaD0wO2g8dS5sZW5ndGg7KytoKWkucHVzaChnZXRTY2FsYXIoMCkpO2ZvcihjPWxbMF0uc2hhcGVbMF0scD1mdW5jdGlvbihlKXt2YXIgbj11W2VdLHI9aVtlXTtpW2VdPXRpZHkoZnVuY3Rpb24oKXtyZXR1cm4gYWRkKGlbZV0sbXVsKGdldFNjYWxhcihjKSxuKSl9KSx0PjAmJmRpc3Bvc2Uocil9LGg9MDtoPHUubGVuZ3RoOysraClwKGgpO3JldHVybiBkaXNwb3NlKHUpLHMrPWMsWzJdfX0pfSx1PTAsaC5sYWJlbD00O2Nhc2UgNDpyZXR1cm4gdTxuLmJhdGNoZXM/WzUsbCh1KV06WzMsN107Y2FzZSA1OmlmKFwiYnJlYWtcIj09PWguc2VudCgpKXJldHVyblszLDddO2gubGFiZWw9NjtjYXNlIDY6cmV0dXJuKyt1LFszLDRdO2Nhc2UgNzpmb3IoYz1mdW5jdGlvbihlKXt2YXIgdD1pW2VdO2lbZV09dGlkeShmdW5jdGlvbigpe3JldHVybiBkaXYoaVtlXSxnZXRTY2FsYXIocykpfSksZGlzcG9zZSh0KX0scD0wO3A8aS5sZW5ndGg7KytwKWMocCk7cmV0dXJuWzIsc2luZ2xldG9uT3JBcnJheShpKV19fSl9KX1mdW5jdGlvbiBjaGVja0JhdGNoU2l6ZShlKXt1dGlsLmFzc2VydChlPjAmJk51bWJlci5pc0ludGVnZXIoZSksXCJiYXRjaFNpemUgaXMgcmVxdWlyZWQgdG8gYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBidXQgZ290IFwiK2UpfWZ1bmN0aW9uIHNsaWNlQXJyYXlzKGUsdCxuKXtyZXR1cm4gbnVsbD09ZT9bbnVsbF06QXJyYXkuaXNBcnJheShlKT9lLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gc2xpY2VBbG9uZ0ZpcnN0QXhpcyhlLHQsbi10KX0pOnNsaWNlQWxvbmdGaXJzdEF4aXMoZSx0LG4tdCl9ZnVuY3Rpb24gc2xpY2VBcnJheXNCeUluZGljZXMoZSx0KXtyZXR1cm4gdGlkeShmdW5jdGlvbigpe3JldHVybiBudWxsPT1lP251bGw6QXJyYXkuaXNBcnJheShlKT9lLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gc2xpY2VBcnJheXNCeUluZGljZXMoZSx0KX0pOmdhdGhlciQxKGUsXCJpbnQzMlwiPT09dC5kdHlwZT90OnQudG9JbnQoKSl9KX1mdW5jdGlvbiBtYWtlQmF0Y2hlcyhlLHQpe2Zvcih2YXIgbj1bXSxyPTAsaT1udWxsO3I8ZTspKGk9cit0KT49ZSYmKGk9ZSksbi5wdXNoKFtyLGldKSxyPWk7cmV0dXJuIG59ZnVuY3Rpb24gZml0TG9vcChlLHQsbixyLGksYSxvLHMsbCx1LGMscCxoLGQsZyxmKXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBtLHksdixiLHcseixTLEE7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24oSSl7c3dpdGNoKEkubGFiZWwpe2Nhc2UgMDppZihudWxsPT1pJiYoaT0zMiksbnVsbD09YSYmKGE9MSksbnVsbD09YyYmKGM9ITApLG51bGw9PWgmJihoPTApLG09ITEsbnVsbCE9bCYmbnVsbCE9dSYmKG09ITApLG51bGwhPWcmJihtPSEwLG51bGw9PWQpKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiQ2FuIG9ubHkgdXNlIGB2YWxpZGF0aW9uU3RlcHNgIHdoZW4gZG9pbmcgc3RlcC13aXNlIHRyYWluaW5nLCBpLmUuLCBgc3RlcHNQZXJFcG9jaGAgbXVzdCBiZSBzZXQuXCIpO3JldHVybiBudWxsIT0oeT1lLmNoZWNrTnVtU2FtcGxlcyhuLGksZCxcInN0ZXBzX3Blcl9lcG9jaFwiKSkmJih2PXJhbmdlKDAseSkpLG51bGw9PW8mJihvPTEpLGI9Y29uZmlndXJlQ2FsbGJhY2tzKHMsZixvLGEsaCx5LGQsaSxtLHApLHc9Yi5jYWxsYmFja0xpc3Qsej1iLmhpc3Rvcnksdy5zZXRNb2RlbChlKSxlLmhpc3Rvcnk9eixbNCx3Lm9uVHJhaW5CZWdpbigpXTtjYXNlIDE6SS5zZW50KCksZS5zdG9wVHJhaW5pbmdfPSExLFM9ZnVuY3Rpb24oYSl7dmFyIG8scyxwLGgsZztyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihmKXtzd2l0Y2goZi5sYWJlbCl7Y2FzZSAwOnJldHVybls0LHcub25FcG9jaEJlZ2luKGEpXTtjYXNlIDE6aWYoZi5zZW50KCksbz17fSxudWxsPT1kKXJldHVyblszLDJdO3Rocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwic3RlcHNQZXJFcG9jaCBtb2RlIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuXCIpO2Nhc2UgMjppZihcImJhdGNoXCI9PT1jKXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiYmF0Y2ggc2h1ZmZsaW5nIGlzIG5vdCBpbXBsZW1uZXRlZCB5ZXRcIik7YyYmdXRpbC5zaHVmZmxlKHYpLHM9dGVuc29yMWQodikscD1tYWtlQmF0Y2hlcyh5LGkpLGg9ZnVuY3Rpb24oYSl7dmFyIGM7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24oaCl7c3dpdGNoKGgubGFiZWwpe2Nhc2UgMDpyZXR1cm4gYz17fSxbNCx3Lm9uQmF0Y2hCZWdpbihhLGMpXTtjYXNlIDE6cmV0dXJuIGguc2VudCgpLHRpZHkoZnVuY3Rpb24oKXt2YXIgaD1wW2FdWzBdLGQ9cFthXVsxXSxnPXNsaWNlQWxvbmdGaXJzdEF4aXMocyxoLGQtaCk7Yy5iYXRjaD1hLGMuc2l6ZT1kLWg7Zm9yKHZhciBmPXNsaWNlQXJyYXlzQnlJbmRpY2VzKG4sZykseT10KGYpLHY9MDt2PHIubGVuZ3RoOysrdil7dmFyIGI9clt2XSx3PXlbdl07Y1tiXT13LGtlZXAodyl9aWYoYT09PXAubGVuZ3RoLTEmJm0pe3ZhciB6PWUudGVzdExvb3AobCx1LGkpO2Zvcih2PTA7djxyLmxlbmd0aDsrK3Ype2I9clt2XSx3PXpbdl07a2VlcCh3KSxvW1widmFsX1wiK2JdPXd9fX0pLFs0LHcub25CYXRjaEVuZChhLGMpXTtjYXNlIDI6cmV0dXJuIGguc2VudCgpLGRpc3Bvc2VUZW5zb3JzSW5Mb2dzKGMpLGUuc3RvcFRyYWluaW5nXz9bMixcImJyZWFrXCJdOlsyXX19KX0sZz0wLGYubGFiZWw9MztjYXNlIDM6cmV0dXJuIGc8cC5sZW5ndGg/WzUsaChnKV06WzMsNl07Y2FzZSA0OmlmKFwiYnJlYWtcIj09PWYuc2VudCgpKXJldHVyblszLDZdO2YubGFiZWw9NTtjYXNlIDU6cmV0dXJuKytnLFszLDNdO2Nhc2UgNjpzLmRpc3Bvc2UoKSxmLmxhYmVsPTc7Y2FzZSA3OnJldHVybls0LHcub25FcG9jaEVuZChhLG8pXTtjYXNlIDg6cmV0dXJuIGYuc2VudCgpLGUuc3RvcFRyYWluaW5nXz9bMixcImJyZWFrXCJdOlsyXX19KX0sQT1oLEkubGFiZWw9MjtjYXNlIDI6cmV0dXJuIEE8YT9bNSxTKEEpXTpbMyw1XTtjYXNlIDM6aWYoXCJicmVha1wiPT09SS5zZW50KCkpcmV0dXJuWzMsNV07SS5sYWJlbD00O2Nhc2UgNDpyZXR1cm4rK0EsWzMsMl07Y2FzZSA1OnJldHVybls0LHcub25UcmFpbkVuZCgpXTtjYXNlIDY6cmV0dXJuIEkuc2VudCgpLFs0LGUuaGlzdG9yeS5zeW5jRGF0YSgpXTtjYXNlIDc6cmV0dXJuIEkuc2VudCgpLFsyLGUuaGlzdG9yeV19fSl9KX1mdW5jdGlvbiBmaXRUZW5zb3JzKGUsdCxuLHIpe3JldHVybiB2b2lkIDA9PT1yJiYocj17fSksX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBpLGEsbyxzLGwsdSxjLHAsaCxkLGcsZixtLHksdixiLHcseixTO3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKEEpe3N3aXRjaChBLmxhYmVsKXtjYXNlIDA6aWYoZS5pc1RyYWluaW5nKXRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzdGFydCB0cmFpbmluZyBiZWNhdXNlIGFub3RoZXIgZml0KCkgY2FsbCBpcyBvbmdvaW5nLlwiKTtlLmlzVHJhaW5pbmc9ITAsQS5sYWJlbD0xO2Nhc2UgMTppZihBLnRyeXMucHVzaChbMSwsMyw0XSksY2hlY2tCYXRjaFNpemUoaT1udWxsPT1yLmJhdGNoU2l6ZT8zMjpyLmJhdGNoU2l6ZSksYT1lLnN0YW5kYXJkaXplVXNlckRhdGEodCxuLCExLGkpLG89YVswXSxzPWFbMV0sbD0hMSx1PXZvaWQgMCxjPXZvaWQgMCxwPXZvaWQgMCxoPSExLG51bGwhPXIudmFsaWRhdGlvbkRhdGEmJnIudmFsaWRhdGlvbkRhdGEubGVuZ3RoPjApe2lmKGw9ITAsMiE9PXIudmFsaWRhdGlvbkRhdGEubGVuZ3RoKXRocm93IDM9PT1yLnZhbGlkYXRpb25EYXRhLmxlbmd0aD9uZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcInZhbGlkYXRpb25EYXRhIGluY2x1ZGluZyBzYW1wbGUgd2VpZ2h0cyBpcyBub3Qgc3VwcG9ydGVkIHlldC5cIik6bmV3IFZhbHVlRXJyb3IoXCJXaGVuIHBhc3NpbmcgdmFsaWRhdGlvbiBkYXRhLCBpdCBtdXN0IGNvbnRhaW4gMiAodmFsWCwgdmFsWSkgb3IgMyAodmFsWCwgdmFsWSwgdmFsU2FtcGxlV2VpZ2h0KSBpdGVtczsgXCIrci52YWxpZGF0aW9uRGF0YStcIiBpcyBpbnZhbGlkLlwiKTt1PXIudmFsaWRhdGlvbkRhdGFbMF0sYz1yLnZhbGlkYXRpb25EYXRhWzFdLGQ9ZS5zdGFuZGFyZGl6ZVVzZXJEYXRhKHUsYywhMCxpKSx1PWRbMF0sYz1kWzFdLHA9dS5jb25jYXQoYyl9ZWxzZSBudWxsIT1yLnZhbGlkYXRpb25TcGxpdCYmci52YWxpZGF0aW9uU3BsaXQ+MCYmci52YWxpZGF0aW9uU3BsaXQ8MT8obD0hMCxnPU1hdGguZmxvb3Iob1swXS5zaGFwZVswXSooMS1yLnZhbGlkYXRpb25TcGxpdCkpLGY9b1swXS5zaGFwZVswXSx1PXNsaWNlQXJyYXlzKG8sZyxmKSxvPXNsaWNlQXJyYXlzKG8sMCxnKSxjPXNsaWNlQXJyYXlzKHMsZyxmKSxzPXNsaWNlQXJyYXlzKHMsMCxnKSxoPSEwLHA9dS5jb25jYXQoYykpOm51bGwhPXIudmFsaWRhdGlvblN0ZXBzJiYobD0hMCk7cmV0dXJuIG09by5jb25jYXQocyksZS5jaGVja1RyYWluYWJsZVdlaWdodHNDb25zaXN0ZW5jeSgpLHk9ZS5tYWtlVHJhaW5GdW5jdGlvbigpLHY9ZS5nZXREZWR1cGVkTWV0cmljc05hbWVzKCksYj12b2lkIDAsdz12b2lkIDAsbD8oZS5tYWtlVGVzdEZ1bmN0aW9uKCksYj1lLnRlc3RGdW5jdGlvbix3PXYuc2xpY2UoKS5jb25jYXQodi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuXCJ2YWxfXCIrZX0pKSk6KGI9bnVsbCxwPVtdLHc9di5zbGljZSgpKSx6PXN0YW5kYXJkaXplQ2FsbGJhY2tzKHIuY2FsbGJhY2tzKSxbNCxmaXRMb29wKGUseSxtLHYsaSxyLmVwb2NocyxyLnZlcmJvc2UseixiLHAsci5zaHVmZmxlLHcsci5pbml0aWFsRXBvY2gsbnVsbCxudWxsLHIueWllbGRFdmVyeSldO2Nhc2UgMjpyZXR1cm4gUz1BLnNlbnQoKSxoJiYocC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc3Bvc2UoKX0pLG8uZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNwb3NlKCl9KSxzLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGlzcG9zZSgpfSkpLGUuaXNUcmFpbmluZz0hMSxbMixTXTtjYXNlIDM6cmV0dXJuIGUuaXNUcmFpbmluZz0hMSxbN107Y2FzZSA0OnJldHVyblsyXX19KX0pfWZ1bmN0aW9uIGlzRGF0YVRlbnNvcihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFRlbnNvcn1mdW5jdGlvbiBpc0RhdGFBcnJheShlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKX1mdW5jdGlvbiBpc0RhdGFEaWN0KGUpe3JldHVybiFpc0RhdGFUZW5zb3IoZSkmJiFpc0RhdGFBcnJheShlKX1mdW5jdGlvbiBzdGFuZGFyZGl6ZUlucHV0RGF0YShlLHQsbixyLGkpe2lmKHZvaWQgMD09PXImJihyPSEwKSx2b2lkIDA9PT1pJiYoaT1cIlwiKSxudWxsPT10fHwwPT09dC5sZW5ndGgpe2lmKG51bGwhPWUpe3ZhciBhPSExO2lmKGlzRGF0YUFycmF5KGUpJiZlLmxlbmd0aD4wKWE9ITA7ZWxzZSBpZihpc0RhdGFEaWN0KGUpKXtmb3IodmFyIG8gaW4gZSlpZihlLmhhc093blByb3BlcnR5KG8pKXthPSEwO2JyZWFrfX1lbHNlIGE9ITA7aWYoYSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIkVycm9yIHdoZW4gY2hlY2tpbmcgbW9kZWwgXCIraStcIiBleHBlY3RlZCBubyBkYXRhLCBidXQgZ290IFwiK2UpfXJldHVybltdfWlmKG51bGw9PWUpcmV0dXJuIHQubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBudWxsfSk7dmFyIHM7aWYoaXNEYXRhRGljdChlKSl7ZT1lLHM9W107Zm9yKHZhciBsPTAsdT10O2w8dS5sZW5ndGg7bCsrKXt2YXIgYz11W2xdO2lmKG51bGw9PWVbY10pdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ05vIGRhdGEgcHJvdmlkZWQgZm9yIFwiJytjKydcIi4gTmVlZCBkYXRhIGZvciBlYWNoIGtleSBpbjogJyt0KTtzLnB1c2goZVtjXSl9fWVsc2UgaWYoaXNEYXRhQXJyYXkoZSkpe2lmKChlPWUpLmxlbmd0aCE9PXQubGVuZ3RoKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiRXJyb3Igd2hlbiBjaGVja2luZyBtb2RlbCBcIitpK1wiOiB0aGUgQXJyYXkgb2YgVGVuc29ycyB0aGF0IHlvdSBhcmUgcGFzc2luZyB0byB5b3VyIG1vZGVsIGlzIG5vdCB0aGUgc2l6ZSB0aGUgbW9kZWwgZXhwZWN0ZWQuIEV4cGVjdGVkIHRvIHNlZSBcIit0Lmxlbmd0aCtcIiBUZW5zb3IocyksIGJ1dCBpbnN0ZWFkIGdvdCB0aGUgZm9sbG93aW5nIGxpc3Qgb2YgVGVuc29yKHMpOiBcIitlKTtzPWV9ZWxzZXtpZihlPWUsdC5sZW5ndGg+MSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIlRoZSBtb2RlbCBcIitpK1wiIGV4cGVjdHMgXCIrdC5sZW5ndGgrXCIgVGVuc29yKHMpLCBidXQgb25seSByZWNlaXZlZCBvbmUgVGVuc29yLiBGb3VuZDogVGVuc29yIHdpdGggc2hhcGUgXCIrZS5zaGFwZSk7cz1bZV19Zm9yKHZhciBwPTA7cDx0Lmxlbmd0aDsrK3ApezE9PT0oaD1zW3BdKS5zaGFwZS5sZW5ndGgmJihzW3BdPWV4cGFuZERpbXMoaCwxKSl9aWYobnVsbCE9bilmb3IocD0wO3A8dC5sZW5ndGg7KytwKWlmKG51bGwhPW5bcF0pe3ZhciBoO2lmKChoPXNbcF0pLnNoYXBlLmxlbmd0aCE9PW5bcF0ubGVuZ3RoKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiRXJyb3Igd2hlbiBjaGVja2luZyBcIitpK1wiOiBleHBlY3RlZCBcIit0W3BdK1wiIHRvIGhhdmUgXCIrbltwXS5sZW5ndGgrXCIgZGltZW5zaW9uKHMpLiBidXQgZ290IGFycmF5IHdpdGggc2hhcGUgXCIraC5zaGFwZSk7Zm9yKHZhciBkPTA7ZDxuW3BdLmxlbmd0aDsrK2QpaWYoMCE9PWR8fHIpe3ZhciBnPWguc2hhcGVbZF0sZj1uW3BdW2RdO2lmKG51bGwhPWYmJmY+PTAmJmchPT1mKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiRXJyb3Igd2hlbiBjaGVja2luZyBcIitpK1wiOiBleHBlY3RlZCBcIit0W3BdK1wiIHRvIGhhdmUgc2hhcGUgW1wiK25bcF0rXCJdLCBidXQgZ290IGFycmF5IHdpdGggc2hhcGUgW1wiK2guc2hhcGUrXCJdLlwiKX19cmV0dXJuIHN9ZnVuY3Rpb24gY2hlY2tBcnJheUxlbmd0aHMoZSx0LG4pe3ZhciByPXVuaXF1ZShlLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5zaGFwZVswXX0pKTtyLnNvcnQoKTt2YXIgaT11bmlxdWUodC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2hhcGVbMF19KSk7aWYoaS5zb3J0KCksci5sZW5ndGg+MSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIkFsbCBpbnB1dCBUZW5zb3JzICh4KSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Ygc2FtcGxlcy4gR290IGFycmF5IHNoYXBlczogXCIrSlNPTi5zdHJpbmdpZnkoZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2hhcGV9KSkpO2lmKGkubGVuZ3RoPjEpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJBbGwgdGFyZ2V0IFRlbnNvcnMgKHkpIHNob3VsZCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBzYW1wbGVzLiBHb3QgYXJyYXkgc2hhcGVzOiBcIitKU09OLnN0cmluZ2lmeSh0Lm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5zaGFwZX0pKSk7aWYoci5sZW5ndGg+MCYmaS5sZW5ndGg+MCYmIXV0aWwuYXJyYXlzRXF1YWwocixpKSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIklucHV0IFRlbnNvcnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHNhbXBsZXMgYXMgdGFyZ2V0IFRlbnNvcnMuIEZvdW5kIFwiK3JbMF0rXCIgaW5wdXQgc2FtcGxlKHMpIGFuZCBcIitpWzBdK1wiIHRhcmdldCBzYW1wbGUocykuXCIpfWZ1bmN0aW9uIGNoZWNrTG9zc0FuZFRhcmdldENvbXBhdGliaWxpdHkoZSx0LG4pe2Zvcih2YXIgcj1bbWVhblNxdWFyZWRFcnJvcixiaW5hcnlDcm9zc2VudHJvcHksY2F0ZWdvcmljYWxDcm9zc2VudHJvcHldLGk9MDtpPGUubGVuZ3RoOysraSl7dmFyIGE9ZVtpXSxvPXRbaV0scz1uW2ldO2lmKG51bGwhPW8pe2lmKG89PT1jYXRlZ29yaWNhbENyb3NzZW50cm9weSYmMT09PWEuc2hhcGVbYS5zaGFwZS5sZW5ndGgtMV0pdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJZb3UgYXJlIHBhc3NpbmcgYSB0YXJnZXQgYXJyYXkgb2Ygc2hhcGUgXCIrYS5zaGFwZStcIiB3aGlsZSB1c2luZyBhIGxvc3MgJ2NhdGVnb3JpY2FsX2Nyb3NzZW50cm9weScuICdjYXRlZ29yaWNhbF9jcm9zc2VudHJvcHknZXhwZWN0cyB0YXJnZXRzIHRvIGJlIGJpbmFyeSBtYXRyaWNlcyAoMXMgYW5kIDBzKSBvZiBzaGFwZSBbc2FtcGxlcywgY2xhc3Nlc10uXCIpO2lmKC0xIT09ci5pbmRleE9mKG8pKWZvcih2YXIgbD1hLnNoYXBlLnNsaWNlKDEpLHU9cy5zbGljZSgxKSxjPTA7YzxsLmxlbmd0aDsrK2Mpe3ZhciBwPWxbY10saD11W2NdO2lmKG51bGwhPWgmJnAhPT1oKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiQSB0YXJnZXQgVGVuc29yIHdpdGggc2hhcGUgXCIrYS5zaGFwZStcIiB3YXMgcGFzc2VkIGZvciBhbiBvdXRwdXQgb2Ygc2hhcGUgXCIrcytcIiwgd2hpbGUgdXNpbmcgYSBsb3NzIGZ1bmN0aW9uIHRoYXQgZXhwZWN0cyB0YXJnZXRzIHRvIGhhdmUgdGhlIHNhbWUgc2hhcGUgYXMgdGhlIG91dHB1dC5cIil9fX19ZnVuY3Rpb24gY2hlY2tJbnB1dERhdGEoZSx0LG4scixpKXt2YXIgYTtpZih2b2lkIDA9PT1yJiYocj0hMCksdm9pZCAwPT09aSYmKGk9XCJcIiksQXJyYXkuaXNBcnJheShlKSl7aWYoZS5sZW5ndGghPT10Lmxlbmd0aCl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIkVycm9yIHdoZW4gY2hlY2tpbmcgbW9kZWwgXCIraStcIjogdGhlIEFycmF5IG9mIFRlbnNvcnMgdGhhdCB5b3UgYXJlIHBhc3NpbmcgdG8geW91ciBtb2RlbCBpcyBub3QgdGhlIHNpemUgdGhlIHRoZSBtb2RlbCBleHBlY3RlZC4gRXhwZWN0ZWQgdG8gc2VlIFwiK3QubGVuZ3RoK1wiIFRlbnNvcihzKSwgYnV0IGluc3RlYWQgZ290IFwiK2UubGVuZ3RoK1wiIFRlbnNvcnMocykuXCIpO2E9ZX1lbHNle2lmKHQubGVuZ3RoPjEpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJUaGUgbW9kZWwgZXhwZWN0cyBcIit0Lmxlbmd0aCtcIiBcIitpK1wiIFRlbnNvcnMsIGJ1dCBvbmx5IHJlY2VpdmVkIG9uZSBUZW5zb3IuIEZvdW5kOiBhcnJheSB3aXRoIHNoYXBlIFwiK0pTT04uc3RyaW5naWZ5KGUuc2hhcGUpK1wiLlwiKTthPVtlXX1pZihudWxsIT1uKWZvcih2YXIgbz0wO288dC5sZW5ndGg7KytvKWlmKG51bGwhPW5bb10pe3ZhciBzPWFbb107aWYocy5zaGFwZS5sZW5ndGghPT1uW29dLmxlbmd0aCl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIkVycm9yIHdoZW4gY2hlY2tpbmcgXCIraStcIjogZXhwZWN0ZWQgXCIrdFtvXStcIiB0byBoYXZlIFwiK25bb10ubGVuZ3RoK1wiIGRpbWVuc2lvbihzKSwgYnV0IGdvdCBhcnJheSB3aXRoIHNoYXBlIFwiK0pTT04uc3RyaW5naWZ5KHMuc2hhcGUpKTtmb3IodmFyIGw9MDtsPG5bb10ubGVuZ3RoOysrbClpZigwIT09bHx8cil7dmFyIHU9cy5zaGFwZVtsXSxjPW5bb11bbF07aWYobnVsbCE9YyYmYyE9PXUpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJFcnJvciB3aGVuIGNoZWNraW5nIFwiK2krXCI6IGV4cGVjdGVkIFwiK3Rbb10rXCIgdG8gaGF2ZSBzaGFwZSBcIitKU09OLnN0cmluZ2lmeShuW29dKStcIiBidXQgZ290IGFycmF5IHdpdGggc2hhcGUgXCIrSlNPTi5zdHJpbmdpZnkocy5zaGFwZSkrXCIuXCIpfX19ZnVuY3Rpb24gY29sbGVjdE1ldHJpY3MoZSx0KXtpZihudWxsPT1lfHxBcnJheS5pc0FycmF5KGUpJiYwPT09ZS5sZW5ndGgpcmV0dXJuIHQubWFwKGZ1bmN0aW9uKGUpe3JldHVybltdfSk7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gdC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGV9KTtpZihudWxsIT1lKXtmb3IodmFyIG49W10scj0wLGk9dDtyPGkubGVuZ3RoO3IrKyl7dmFyIGE9aVtyXSxvPWUuaGFzT3duUHJvcGVydHkoYSk/ZVthXTpbXTtBcnJheS5pc0FycmF5KG8pfHwobz1bb10pLG4ucHVzaChvKX1yZXR1cm4gbn10aHJvdyBuZXcgVHlwZUVycm9yKFwiVHlwZSBvZiBtZXRyaWNzIGFyZ3VtZW50IG5vdCB1bmRlcnN0b29kLiBFeHBlY3RlZCBhbiBBcnJheSBvciBPYmplY3QsIGZvdW5kOiBcIitlKX12YXIgTW9kZWw9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyx0KXx8dGhpcztyZXR1cm4gbi5pc1RyYWluaW5nPSExLG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLnN1bW1hcnk9ZnVuY3Rpb24oZSx0LG4pe2lmKHZvaWQgMD09PW4mJihuPWNvbnNvbGUubG9nKSwhdGhpcy5idWlsdCl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIlRoaXMgbW9kZWwgaGFzIG5ldmVyIGJlZW4gY2FsbGVkLCB0aHVzIGl0cyB3ZWlnaHRzIGhhdmUgbm90IGJlZW4gY3JlYXRlZCB5ZXQuIFNvIG5vIHN1bW1hcnkgY2FuIGJlIGRpc3BsYXllZC4gQnVpbGQgdGhlIG1vZGVsIGZpcnN0IChlLmcuLCBieSBjYWxsaW5nIGl0IG9uIHNvbWUgdGVzdCBkYXRhKS5cIik7cHJpbnRTdW1tYXJ5KHRoaXMsZSx0LG4pfSx0LnByb3RvdHlwZS5jb21waWxlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYobnVsbD09ZS5sb3NzJiYoZS5sb3NzPVtdKSx0aGlzLmxvc3M9ZS5sb3NzLFwic3RyaW5nXCI9PXR5cGVvZiBlLm9wdGltaXplcil0aGlzLm9wdGltaXplcj1nZXRPcHRpbWl6ZXIoZS5vcHRpbWl6ZXIpO2Vsc2V7aWYoIShlLm9wdGltaXplciBpbnN0YW5jZW9mIE9wdGltaXplcikpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJVc2VyLWRlZmluZWQgb3B0aW1pemVyIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgdGYuT3B0aW1pemVyLlwiKTt0aGlzLm9wdGltaXplcj1lLm9wdGltaXplcn12YXIgbj1bXTtpZihBcnJheS5pc0FycmF5KGUubG9zcyl8fFwic3RyaW5nXCI9PXR5cGVvZiBlLmxvc3N8fFwiZnVuY3Rpb25cIj09dHlwZW9mIGUubG9zcylpZihBcnJheS5pc0FycmF5KGUubG9zcykpe2lmKGUubG9zcy5sZW5ndGghPT10aGlzLm91dHB1dHMubGVuZ3RoKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiV2hlbiBwYXNzaW5nIGFuIEFycmF5IGFzIGxvc3MsIGl0IHNob3VsZCBoYXZlIG9uZSBlbnRyeSBwZXIgbW9kZWwgb3V0cHV0LiBUaGUgbW9kZWwgaGFzIFwiK3RoaXMub3V0cHV0cy5sZW5ndGgrXCIgb3V0cHV0KHMpLCBidXQgeW91IHBhc3NlZCBsb3NzPVwiK2UubG9zcytcIi5cIik7dmFyIHI9ZS5sb3NzO249ci5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGdldChlKX0pfWVsc2V7dmFyIGk9Z2V0KGUubG9zcyk7dGhpcy5vdXRwdXRzLm1hcChmdW5jdGlvbihlKXtuLnB1c2goaSl9KX1lbHNle2Zvcih2YXIgYSBpbiBlLmxvc3M9ZS5sb3NzLGUubG9zcylpZigtMT09PXRoaXMub3V0cHV0TmFtZXMuaW5kZXhPZihhKSl0aHJvdyBuZXcgVmFsdWVFcnJvcignVW5rbm93biBlbnRyeSBpbiBsb3NzIGRpY3Rpb25hcnk6IFwiJythKydcIi4gT25seSBleHBlY3QgdGhlIGZvbGxvd2luZyBrZXlzOiAnK3RoaXMub3V0cHV0TmFtZXMpO2Zvcih2YXIgbyBpbiB0aGlzLm91dHB1dE5hbWVzKW51bGw9PWUubG9zc1tvXSYmY29uc29sZS53YXJuKCdPdXRwdXQgXCInK28rJ1wiIGlzIG1pc3NpbmcgZnJvbSBsb3NzIGRpY3Rpb25hcnkuIFdlIGFzc3VtZSB0aGlzIHdhcyBkb25lIG9uIHB1cnBvc2UsIGFuZCB3ZSB3aWxsIG5vdCBiZSBleHBlY3RpbmcgZGF0YSB0byBiZSBwYXNzZWQgdG8gJytvK1wiIGR1cmluZyB0cmFpbmluZ1wiKSxuLnB1c2goZ2V0KGUubG9zc1tvXSkpfXRoaXMubG9zc0Z1bmN0aW9ucz1uLHRoaXMuZmVlZE91dHB1dE5hbWVzPVtdLHRoaXMuZmVlZE91dHB1dFNoYXBlcz1bXSx0aGlzLmZlZWRMb3NzRm5zPVtdO2Zvcih2YXIgcz0wO3M8dGhpcy5vdXRwdXRzLmxlbmd0aDsrK3Mpe3ZhciBsPXRoaXMuaW50ZXJuYWxPdXRwdXRTaGFwZXNbc10sdT10aGlzLm91dHB1dE5hbWVzW3NdO3RoaXMuZmVlZE91dHB1dE5hbWVzLnB1c2godSksdGhpcy5mZWVkT3V0cHV0U2hhcGVzLnB1c2gobCksdGhpcy5mZWVkTG9zc0Zucy5wdXNoKHRoaXMubG9zc0Z1bmN0aW9uc1tzXSl9dmFyIGM9W107dGhpcy5tZXRyaWNzPWUubWV0cmljcyx0aGlzLm1ldHJpY3NOYW1lcz1bXCJsb3NzXCJdLHRoaXMubWV0cmljc1RlbnNvcnM9W10sbmFtZVNjb3BlKFwibG9zc1wiLGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx0Lm91dHB1dHMubGVuZ3RoOysrZSlpZigtMT09PWMuaW5kZXhPZihlKSl7dmFyIG49dC5sb3NzRnVuY3Rpb25zW2VdO3Qub3V0cHV0cy5sZW5ndGg+MSYmKHQubWV0cmljc1RlbnNvcnMucHVzaChbbixlXSksdC5tZXRyaWNzTmFtZXMucHVzaCh0Lm91dHB1dE5hbWVzW2VdK1wiX2xvc3NcIikpfX0pO3ZhciBwPWNvbGxlY3RNZXRyaWNzKGUubWV0cmljcyx0aGlzLm91dHB1dE5hbWVzKTtuYW1lU2NvcGUoXCJtZXRyaWNcIixmdW5jdGlvbigpe2Zvcih2YXIgZT1mdW5jdGlvbihlKXtpZigtMSE9PWMuaW5kZXhPZihlKSlyZXR1cm5cImNvbnRpbnVlXCI7IWZ1bmN0aW9uKG4pe2Zvcih2YXIgcixpLGEsbz1mdW5jdGlvbihuKXtpZigtMSE9PVtcImFjY3VyYWN5XCIsXCJhY2NcIixcImNyb3NzZW50cm9weVwiLFwiY2VcIl0uaW5kZXhPZihuKSl7dmFyIG89dC5pbnRlcm5hbE91dHB1dFNoYXBlc1tlXTsxPT09b1tvLmxlbmd0aC0xXXx8dC5sb3NzRnVuY3Rpb25zW2VdPT09YmluYXJ5Q3Jvc3NlbnRyb3B5Py0xIT09W1wiYWNjdXJhY3lcIixcImFjY1wiXS5pbmRleE9mKG4pP2k9YmluYXJ5QWNjdXJhY3k6LTEhPT1bXCJjcm9zc2VudHJvcHlcIixcImNlXCJdLmluZGV4T2YobikmJihpPWJpbmFyeUNyb3NzZW50cm9weSQxKTp0Lmxvc3NGdW5jdGlvbnNbZV09PT1zcGFyc2VDYXRlZ29yaWNhbENyb3NzZW50cm9weT8tMSE9PVtcImFjY3VyYWN5XCIsXCJhY2NcIl0uaW5kZXhPZihuKT9pPXNwYXJzZUNhdGVnb3JpY2FsQWNjdXJhY3k6LTEhPT1bXCJjcm9zc2VudHJvcHlcIixcImNlXCJdLmluZGV4T2YobikmJihpPXNwYXJzZUNhdGVnb3JpY2FsQ3Jvc3NlbnRyb3B5JDEpOi0xIT09W1wiYWNjdXJhY3lcIixcImFjY1wiXS5pbmRleE9mKG4pP2k9Y2F0ZWdvcmljYWxBY2N1cmFjeTotMSE9PVtcImNyb3NzZW50cm9weVwiLFwiY2VcIl0uaW5kZXhPZihuKSYmKGk9Y2F0ZWdvcmljYWxDcm9zc2VudHJvcHkkMSk7dmFyIHM9dm9pZCAwOy0xIT09W1wiYWNjdXJhY3lcIixcImFjY1wiXS5pbmRleE9mKG4pP3M9XCJhY2NcIjotMSE9PVtcImNyb3NzZW50cm9weVwiLFwiY2VcIl0uaW5kZXhPZihuKSYmKHM9XCJjZVwiKSxhPWkscj1cIlwiK3N9ZWxzZXt2YXIgbD1nZXQkMShuKTthPWwscj1cIlwiK259dmFyIHU7bmFtZVNjb3BlKHIsZnVuY3Rpb24oKXt1PWF9KSxmdW5jdGlvbihlLG4scil7dC5vdXRwdXROYW1lcy5sZW5ndGg+MSYmKG49dC5vdXRwdXROYW1lc1tlXStcIl9cIituKSx0Lm1ldHJpY3NOYW1lcy5wdXNoKG4pLHQubWV0cmljc1RlbnNvcnMucHVzaChbcixlXSl9KGUscix1KX0scz0wLGw9bjtzPGwubGVuZ3RoO3MrKylvKGxbc10pfShwW2VdKX0sbj0wO248dC5vdXRwdXRzLmxlbmd0aDsrK24pZShuKX0pLHRoaXMuY29sbGVjdGVkVHJhaW5hYmxlV2VpZ2h0cz10aGlzLnRyYWluYWJsZVdlaWdodHN9LHQucHJvdG90eXBlLmNoZWNrVHJhaW5hYmxlV2VpZ2h0c0NvbnNpc3RlbmN5PWZ1bmN0aW9uKCl7bnVsbCE9dGhpcy5jb2xsZWN0ZWRUcmFpbmFibGVXZWlnaHRzJiZ0aGlzLnRyYWluYWJsZVdlaWdodHMubGVuZ3RoIT09dGhpcy5jb2xsZWN0ZWRUcmFpbmFibGVXZWlnaHRzLmxlbmd0aCYmY29uc29sZS53YXJuKFwiRGlzY3JlcGFuY3kgYmV0d2VlbiB0cmFpbmFibGV3ZWlnaHRzIGFuZCBjb2xsZWN0ZWQgdHJhaW5hYmxlIHdlaWdodHMuIERpZCB5b3Ugc2V0IGBtb2RlbC50cmFpbmFibGVgIHdpdGhvdXQgY2FsbGluZyBgbW9kZWwuY29tcGlsZSgpYCBhZnRlcndhcmRzP1wiKX0sdC5wcm90b3R5cGUuZXZhbHVhdGU9ZnVuY3Rpb24oZSx0LG4pe3ZvaWQgMD09PW4mJihuPXt9KTt2YXIgcj1udWxsPT1uLmJhdGNoU2l6ZT8zMjpuLmJhdGNoU2l6ZTtjaGVja0JhdGNoU2l6ZShyKTt2YXIgaT10aGlzLnN0YW5kYXJkaXplVXNlckRhdGEoZSx0LCEwLHIpLGE9aVswXS5jb25jYXQoaVsxXSk7dGhpcy5tYWtlVGVzdEZ1bmN0aW9uKCk7dmFyIG89dGhpcy50ZXN0RnVuY3Rpb247cmV0dXJuIHNpbmdsZXRvbk9yQXJyYXkodGhpcy50ZXN0TG9vcChvLGEscixuLnZlcmJvc2Usbi5zdGVwcykpfSx0LnByb3RvdHlwZS5ldmFsdWF0ZURhdGFzZXQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gX19hd2FpdGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLm1ha2VUZXN0RnVuY3Rpb24oKSxbMixldmFsdWF0ZURhdGFzZXQodGhpcyxlLHQpXX0pfSl9LHQucHJvdG90eXBlLmNoZWNrTnVtU2FtcGxlcz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaTtpZih2b2lkIDA9PT1yJiYocj1cInN0ZXBzXCIpLG51bGwhPW4pe2lmKGk9bnVsbCxudWxsIT10KXRocm93IG5ldyBWYWx1ZUVycm9yKFwiSWYgXCIrcitcIiBpcyBzZXQsIGJhdGNoU2l6ZSBtdXN0IGJlIG51bGwgb3IgdW5kZWZpbmVkLkdvdCBiYXRjaFNpemUgPSBcIit0KX1lbHNle2lmKG51bGw9PWUpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJFaXRoZXIgdGhlIGlucHV0IGRhdGEgc2hvdWxkIGhhdmUgYSBkZWZpbmVkIHNoYXBlLCBvciBcIityK1wiIHNob3VkIGJlIHNwZWNpZmllZC5cIik7aT1BcnJheS5pc0FycmF5KGUpP2VbMF0uc2hhcGVbMF06ZS5zaGFwZVswXX1yZXR1cm4gaX0sdC5wcm90b3R5cGUuZXhlY3V0ZT1mdW5jdGlvbihlLHQpe2lmKEFycmF5LmlzQXJyYXkodCkmJjA9PT10Lmxlbmd0aCl0aHJvdyBuZXcgVmFsdWVFcnJvcihcImBvdXRwdXRzYCBpcyBhbiBlbXB0eSBBcnJheSwgd2hpY2ggaXMgbm90IGFsbG93ZWQuXCIpO3ZhciBuPUFycmF5LmlzQXJyYXkodCkscj1uP3Q6W3RdLGk9dGhpcy5yZXRyaWV2ZVN5bWJvbGljVGVuc29ycyhyKSxhPW5ldyBGZWVkRGljdDtpZihlIGluc3RhbmNlb2YgVGVuc29yJiYoZT1bZV0pLEFycmF5LmlzQXJyYXkoZSkpe2lmKGUubGVuZ3RoIT09dGhpcy5pbnB1dHMubGVuZ3RoKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiVGhlIG51bWJlciBvZiBpbnB1dHMgcHJvdmlkZWQgKFwiK2UubGVuZ3RoK1wiKSBkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGlucHV0cyBvZiB0aGlzIG1vZGVsIChcIit0aGlzLmlucHV0cy5sZW5ndGgrXCIpLlwiKTtmb3IodmFyIG89MDtvPHRoaXMuaW5wdXRzLmxlbmd0aDsrK28pYS5hZGQodGhpcy5pbnB1dHNbb10sZVtvXSl9ZWxzZSBmb3IodmFyIHM9MCxsPXRoaXMuaW5wdXRzO3M8bC5sZW5ndGg7cysrKXt2YXIgdT1sW3NdLGM9ZVt1Lm5hbWVdO2lmKG51bGw9PWMpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJObyB2YWx1ZSBpcyBwcm92aWRlZCBmb3IgdGhlIG1vZGVsJ3MgaW5wdXQgXCIrdS5uYW1lKTthLmFkZCh1LGMpfXZhciBwPWV4ZWN1dGUoaSxhKTtyZXR1cm4gbj9wOnBbMF19LHQucHJvdG90eXBlLnJldHJpZXZlU3ltYm9saWNUZW5zb3JzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1weUxpc3RSZXBlYXQobnVsbCxlLmxlbmd0aCksbj1lLmxlbmd0aCxyPTAsaT10aGlzLmxheWVycztyPGkubGVuZ3RoO3IrKyl7Zm9yKHZhciBhPWlbcl0sbz1BcnJheS5pc0FycmF5KGEub3V0cHV0KT9hLm91dHB1dDpbYS5vdXRwdXRdLHM9by5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUubmFtZX0pLGw9MDtsPGUubGVuZ3RoOysrbCl7dmFyIHU9cy5pbmRleE9mKGVbbF0pO2lmKC0xIT09dSYmKHRbbF09b1t1XSxuLS0pLDA9PT1uKWJyZWFrfWlmKDA9PT1uKWJyZWFrfWlmKG4+MCl7dmFyIGM9W107dGhyb3cgdC5mb3JFYWNoKGZ1bmN0aW9uKHQsbil7bnVsbD09dCYmYy5wdXNoKGVbbl0pfSksbmV3IFZhbHVlRXJyb3IoXCJDYW5ub3QgZmluZCBTeW1ib2xpY1RlbnNvcnMgZm9yIG91dHB1dCBuYW1lKHMpOiBcIitKU09OLnN0cmluZ2lmeShjKSl9cmV0dXJuIHR9LHQucHJvdG90eXBlLnByZWRpY3RMb29wPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzO3JldHVybiB2b2lkIDA9PT10JiYodD0zMiksdm9pZCAwPT09biYmKG49ITEpLHRpZHkoZnVuY3Rpb24oKXt2YXIgaT1yLmNoZWNrTnVtU2FtcGxlcyhlKTtpZihuKXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiVmVyYm9zZSBwcmVkaWN0TG9vcCgpIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuXCIpO2Zvcih2YXIgYT1tYWtlQmF0Y2hlcyhpLHQpLG89W10scz1mdW5jdGlvbih0KXt2YXIgbj10aWR5KGZ1bmN0aW9uKCl7dmFyIG49YVt0XVswXSxpPWFbdF1bMV0sbz1zbGljZUFycmF5cyhlLG4saSkscz1bXTtpZihBcnJheS5pc0FycmF5KG8pKWZvcih2YXIgbD0wO2w8by5sZW5ndGg7KytsKXMucHVzaCh7a2V5OnIuaW5wdXRzW2xdLHZhbHVlOm9bbF19KTtlbHNlIHMucHVzaCh7a2V5OnIuaW5wdXRzWzBdLHZhbHVlOm99KTt2YXIgdT1uZXcgRmVlZERpY3Qocyk7cmV0dXJuIGV4ZWN1dGUoci5vdXRwdXRzLHUpfSk7aWYoMD09PXQpZm9yKHZhciBpPTAscz1uO2k8cy5sZW5ndGg7aSsrKXt2YXIgbD1zW2ldO28ucHVzaChsKX1lbHNlIGZvcih2YXIgdT0wO3U8bi5sZW5ndGg7Kyt1KW9bdV09Y29uY2F0QWxvbmdGaXJzdEF4aXMob1t1XSxuW3VdKX0sbD0wO2w8YS5sZW5ndGg7KytsKXMobCk7cmV0dXJuIHNpbmdsZXRvbk9yQXJyYXkobyl9KX0sdC5wcm90b3R5cGUucHJlZGljdD1mdW5jdGlvbihlLHQpe3ZvaWQgMD09PXQmJih0PXt9KSxjaGVja0lucHV0RGF0YShlLHRoaXMuaW5wdXROYW1lcyx0aGlzLmZlZWRJbnB1dFNoYXBlcywhMSk7dmFyIG49bnVsbD09dC5iYXRjaFNpemU/MzI6dC5iYXRjaFNpemU7cmV0dXJuIGNoZWNrQmF0Y2hTaXplKG4pLHRoaXMucHJlZGljdExvb3AoZSxuKX0sdC5wcm90b3R5cGUucHJlZGljdE9uQmF0Y2g9ZnVuY3Rpb24oZSl7cmV0dXJuIGNoZWNrSW5wdXREYXRhKGUsdGhpcy5pbnB1dE5hbWVzLHRoaXMuZmVlZElucHV0U2hhcGVzLCEwKSx0aGlzLnByZWRpY3RMb29wKGUsZS5zaGFwZVswXSl9LHQucHJvdG90eXBlLnN0YW5kYXJkaXplVXNlckRhdGE9ZnVuY3Rpb24oZSx0LG4scil7aWYodm9pZCAwPT09biYmKG49ITApLG51bGw9PXRoaXMub3B0aW1pemVyKXRocm93IG5ldyBSdW50aW1lRXJyb3IoXCJZb3UgbXVzdCBjb21waWxlIGEgbW9kZWwgYmVmb3JlIHRyYWluaW5nL3Rlc3RpbmcuIFVzZSBNb2RlbC5jb21waWxlKG1vZGVsQ29tcGlsZUNvbmZpZykuXCIpO2Zvcih2YXIgaT1bXSxhPTA7YTx0aGlzLmZlZWRPdXRwdXRTaGFwZXMubGVuZ3RoOysrYSl7dmFyIG89dGhpcy5mZWVkT3V0cHV0U2hhcGVzW2FdO3RoaXMuZmVlZExvc3NGbnNbYV09PT1zcGFyc2VDYXRlZ29yaWNhbENyb3NzZW50cm9weT9pLnB1c2goby5zbGljZSgwLG8ubGVuZ3RoLTEpLmNvbmNhdChbMV0pKTppLnB1c2gobyl9aWYoY2hlY2tBcnJheUxlbmd0aHMoZT1zdGFuZGFyZGl6ZUlucHV0RGF0YShlLHRoaXMuZmVlZElucHV0TmFtZXMsdGhpcy5mZWVkSW5wdXRTaGFwZXMsITEsXCJpbnB1dFwiKSx0PXN0YW5kYXJkaXplSW5wdXREYXRhKHQsdGhpcy5mZWVkT3V0cHV0TmFtZXMsaSwhMSxcInRhcmdldFwiKSxudWxsKSxjaGVja0xvc3NBbmRUYXJnZXRDb21wYXRpYmlsaXR5KHQsdGhpcy5mZWVkTG9zc0Zucyx0aGlzLmZlZWRPdXRwdXRTaGFwZXMpLHRoaXMuc3RhdGVmdWwmJm51bGwhPXImJnI+MCYmZVswXS5zaGFwZVswXSVyIT0wKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiSW4gYSBzdGF0ZWZ1bCBuZXR3b3JrLCB5b3Ugc2hvdWxkIG9ubHkgcGFzcyBpbnB1dHMgd2l0aCBhIG51bWJlciBvZiBzYW1wbGVzIHRoYXQgaXMgZGl2aXNpYmxlIGJ5IHRoZSBiYXRjaCBzaXplIFwiK3IrXCIuIEZvdW5kOiBcIitlWzBdLnNoYXBlWzBdK1wiIHNhbXBsZShzKS5cIik7cmV0dXJuW2UsdCxudWxsXX0sdC5wcm90b3R5cGUudGVzdExvb3A9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgYT10aGlzO3JldHVybiB2b2lkIDA9PT1yJiYocj0wKSx0aWR5KGZ1bmN0aW9uKCl7dmFyIG89YS5jaGVja051bVNhbXBsZXModCxuLGksXCJzdGVwc1wiKSxzPVtdO2lmKHI+MCl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcIlZlcmJvc2UgbW9kZSBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LlwiKTtpZihudWxsIT1pKXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwic3RlcHMgbW9kZSBpbiB0ZXN0TG9vcCgpIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXRcIik7Zm9yKHZhciBsPW1ha2VCYXRjaGVzKG8sbiksdT10ZW5zb3IxZChyYW5nZSgwLG8pKSxjPTA7YzxsLmxlbmd0aDsrK2Mpe3ZhciBwPWxbY11bMF0saD1sW2NdWzFdLGQ9c2xpY2VBbG9uZ0ZpcnN0QXhpcyh1LHAsaC1wKSxnPXNsaWNlQXJyYXlzQnlJbmRpY2VzKHQsZCksZj1lKGcpO2lmKDA9PT1jKWZvcih2YXIgbT0wO208Zi5sZW5ndGg7KyttKXMucHVzaChnZXRTY2FsYXIoMCkpO2ZvcihtPTA7bTxmLmxlbmd0aDsrK20pe3ZhciB5PWZbbV07c1ttXT1hZGQoc1ttXSxtdWwoZ2V0U2NhbGFyKGgtcCkseSkpfX1mb3IobT0wO208cy5sZW5ndGg7KyttKXNbbV09ZGl2KHNbbV0sZ2V0U2NhbGFyKG8pKTtyZXR1cm4gc30pfSx0LnByb3RvdHlwZS5nZXREZWR1cGVkTWV0cmljc05hbWVzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMubWV0cmljc05hbWVzLHQ9W10sbj0wO248ZS5sZW5ndGg7KytuKXt2YXIgcj1lW25dLGk9cjtpZihjb3VudChlLHIpPjEpaSs9XCJfXCIrY291bnQoZS5zbGljZSgwLG4pLHIpO3QucHVzaChpKX1yZXR1cm4gdH0sdC5wcm90b3R5cGUubWFrZVRyYWluRnVuY3Rpb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10LnNsaWNlKDAsZS5pbnB1dHMubGVuZ3RoKSxyPXQuc2xpY2UoZS5pbnB1dHMubGVuZ3RoLGUuaW5wdXRzLmxlbmd0aCtlLm91dHB1dHMubGVuZ3RoKSxpPVtdLGE9ZS5jb2xsZWN0ZWRUcmFpbmFibGVXZWlnaHRzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZWFkKCl9KTtyZXR1cm5bZS5vcHRpbWl6ZXIubWluaW1pemUoZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sYT0wO2E8ZS5pbnB1dHMubGVuZ3RoOysrYSl0LnB1c2goe2tleTplLmlucHV0c1thXSx2YWx1ZTpuW2FdfSk7dmFyIG8scz1uZXcgRmVlZERpY3QodCksbD1leGVjdXRlKGUub3V0cHV0cyxzLHt0cmFpbmluZzohMH0pO2ZvcihhPTA7YTxlLmxvc3NGdW5jdGlvbnMubGVuZ3RoOysrYSl7dmFyIHU9KDAsZS5sb3NzRnVuY3Rpb25zW2FdKShyW2FdLGxbYV0pO21lYW4odSksbz0wPT09YT91OmFkZChvLHUpfWZvcihhPTA7YTxlLm1ldHJpY3NUZW5zb3JzLmxlbmd0aDsrK2Epe3ZhciBjPWUubWV0cmljc1RlbnNvcnNbYV1bMF0scD1lLm1ldHJpY3NUZW5zb3JzW2FdWzFdLGg9bWVhbihjKHJbcF0sbFtwXSkpO2tlZXAoaCksaS5wdXNoKGgpfXJldHVybiBvPW1lYW4obyksZS5jYWxjdWxhdGVMb3NzZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe289YWRkKG8sZSl9KSxvfSwhMCxhKV0uY29uY2F0KGkpfX0sdC5wcm90b3R5cGUubWFrZVRlc3RGdW5jdGlvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy50ZXN0RnVuY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXtmb3IodmFyIG4scj1bXSxpPXQuc2xpY2UoMCxlLmlucHV0cy5sZW5ndGgpLGE9dC5zbGljZShlLmlucHV0cy5sZW5ndGgsZS5pbnB1dHMubGVuZ3RoK2Uub3V0cHV0cy5sZW5ndGgpLG89W10scz0wO3M8ZS5pbnB1dHMubGVuZ3RoOysrcylvLnB1c2goe2tleTplLmlucHV0c1tzXSx2YWx1ZTppW3NdfSk7dmFyIGw9bmV3IEZlZWREaWN0KG8pLHU9ZXhlY3V0ZShlLm91dHB1dHMsbCk7Zm9yKHM9MDtzPGUubG9zc0Z1bmN0aW9ucy5sZW5ndGg7KytzKXt2YXIgYz1lLmxvc3NGdW5jdGlvbnNbc10scD1tZWFuKGMoYVtzXSx1W3NdKSk7bj0wPT09cz9wOmFkZChuLHApLHIucHVzaChuKX1mb3Iocz0wO3M8ZS5tZXRyaWNzVGVuc29ycy5sZW5ndGg7KytzKXt2YXIgaD1lLm1ldHJpY3NUZW5zb3JzW3NdWzBdLGQ9ZS5tZXRyaWNzVGVuc29yc1tzXVsxXSxnPW1lYW4oaChhW2RdLHVbZF0pKTtyLnB1c2goZyl9cmV0dXJuIHJ9KX19LHQucHJvdG90eXBlLmZpdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPXt9KSxfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24ocil7cmV0dXJuWzIsZml0VGVuc29ycyh0aGlzLGUsdCxuKV19KX0pfSx0LnByb3RvdHlwZS5maXREYXRhc2V0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihuKXtyZXR1cm5bMixmaXREYXRhc2V0KHRoaXMsZSx0KV19KX0pfSx0LnByb3RvdHlwZS5nZXROYW1lZFdlaWdodHM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXt9LG49bnVsbCE9ZSYmZS50cmFpbmFibGVPbmx5LHI9bj90aGlzLnRyYWluYWJsZVdlaWdodHM6dGhpcy53ZWlnaHRzLGk9dGhpcy5nZXRXZWlnaHRzKG4pLGE9MDthPHIubGVuZ3RoOysrYSluJiYhclthXS50cmFpbmFibGV8fCh0W3JbYV0ub3JpZ2luYWxOYW1lXT1pW2FdKTtyZXR1cm4gdH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwic3RvcFRyYWluaW5nXCIse3NldDpmdW5jdGlvbihlKXt0aGlzLnN0b3BUcmFpbmluZ189ZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5zYXZlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgbixyLGksYSxvO3JldHVybiBfX2dlbmVyYXRvcih0aGlzLGZ1bmN0aW9uKHMpe3N3aXRjaChzLmxhYmVsKXtjYXNlIDA6aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUpe2lmKDA9PT0obj1pby5nZXRTYXZlSGFuZGxlcnMoZSkpLmxlbmd0aCl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIkNhbm5vdCBmaW5kIGFueSBzYXZlIGhhbmRsZXJzIGZvciBVUkwgJ1wiK2UrXCInXCIpO2lmKG4ubGVuZ3RoPjEpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJGb3VuZCBtb3JlIHRoYW4gb25lIChcIituLmxlbmd0aCtcIikgc2F2ZSBoYW5kbGVycyBmb3IgVVJMICdcIitlK1wiJ1wiKTtlPW5bMF19aWYobnVsbD09ZS5zYXZlKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiTW9kZWwuc2F2ZSgpIGNhbm5vdCBwcm9jZWVkIGJlY2F1c2UgdGhlIElPSGFuZGxlciBwcm92aWRlZCBkb2VzIG5vdCBoYXZlIHRoZSBgc2F2ZWAgYXR0cmlidXRlIGRlZmluZWQuXCIpO3JldHVybls0LGlvLmVuY29kZVdlaWdodHModGhpcy5nZXROYW1lZFdlaWdodHModCkpXTtjYXNlIDE6cmV0dXJuIHI9cy5zZW50KCksaT0hMSxhPW51bGwsbz10aGlzLnRvSlNPTihhLGkpLFsyLGUuc2F2ZSh7bW9kZWxUb3BvbG9neTpvLHdlaWdodERhdGE6ci5kYXRhLHdlaWdodFNwZWNzOnIuc3BlY3N9KV19fSl9KX0sdC5jbGFzc05hbWU9XCJNb2RlbFwiLHR9KENvbnRhaW5lcik7ZnVuY3Rpb24gbG9hZE1vZGVsSW50ZXJuYWwoZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9ITApLF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgbjtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihyKXtpZihcInN0cmluZ1wiPT10eXBlb2YgZSl7aWYoMD09PShuPWlvLmdldExvYWRIYW5kbGVycyhlKSkubGVuZ3RoKW4ucHVzaChpby5icm93c2VySFRUUFJlcXVlc3QoZSkpO2Vsc2UgaWYobi5sZW5ndGg+MSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIkZvdW5kIG1vcmUgdGhhbiBvbmUgKFwiK24ubGVuZ3RoK1wiKSBsb2FkIGhhbmRsZXJzIGZvciBVUkwgJ1wiK2UrXCInXCIpO2U9blswXX1yZXR1cm5bMixsb2FkTW9kZWxGcm9tSU9IYW5kbGVyKGUsdm9pZCAwLHQpXX0pfSl9ZnVuY3Rpb24gbG9hZE1vZGVsRnJvbUlPSGFuZGxlcihlLHQsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPSEwKSxfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIHIsaSxhLG8scztyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihsKXtzd2l0Y2gobC5sYWJlbCl7Y2FzZSAwOmlmKG51bGw9PWUubG9hZCl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIkNhbm5vdCBwcm9jZWVkIHdpdGggbW9kZWwgbG9hZGluZyBiZWNhdXNlIHRoZSBJT0hhbmRsZXIgcHJvdmlkZWQgZG9lcyBub3QgaGF2ZSB0aGUgYGxvYWRgIG1ldGhvZCBpbXBsZW1lbnRlZC5cIik7cmV0dXJuWzQsZS5sb2FkKCldO2Nhc2UgMTppZihyPWwuc2VudCgpLG51bGwhPShpPXIubW9kZWxUb3BvbG9neSkubW9kZWxfY29uZmlnJiYoaT1pLm1vZGVsX2NvbmZpZyksYT1kZXNlcmlhbGl6ZShjb252ZXJ0UHl0aG9uaWNUb1RzKGkpLHQpLG51bGwhPXIud2VpZ2h0RGF0YSl7aWYobnVsbD09ci53ZWlnaHRTcGVjcyl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIk1vZGVsIGFydGlmYWN0cyBjb250YWlucyB3ZWlnaHQgZGF0YSwgYnV0IG5vdCB3ZWlnaHQgc3BlY3MuIFRoZXJlZm9yZSBsb2FkaW5nIG9mIHdlaWdodHMgY2Fubm90IHByb2NlZWQuXCIpO289ITEscz0hMCxhLmxvYWRXZWlnaHRzKGlvLmRlY29kZVdlaWdodHMoci53ZWlnaHREYXRhLHIud2VpZ2h0U3BlY3MpLG8scyxuKX1yZXR1cm5bMixhXX19KX0pfXNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhNb2RlbCk7dmFyIFNlcXVlbnRpYWw9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyx7aW5wdXRzOltdLG91dHB1dHM6W119KXx8dGhpcztpZih0PXR8fHt9LG4udHJhaW5hYmxlPSEwLG4uX3VwZGF0YWJsZT0hMCxuLmJ1aWx0PSExLG4ubmFtZT1udWxsIT10Lm5hbWU/dC5uYW1lOmdldFVpZChcInNlcXVlbnRpYWxfXCIpLG51bGwhPXQubGF5ZXJzKWZvcih2YXIgcj0wLGk9dC5sYXllcnM7cjxpLmxlbmd0aDtyKyspe3ZhciBhPWlbcl07bi5hZGQoYSl9cmV0dXJuIG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmNoZWNrU2hhcGU9ZnVuY3Rpb24oZSl7aWYoZS5pbmJvdW5kTm9kZXNbMF0ub3V0cHV0VGVuc29yc1swXS5zaGFwZS5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiBlPDB9KSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIk5lZ2F0aXZlIGRpbWVuc2lvbiBzaXplIGNhdXNlZCBieSBhZGRpbmcgbGF5ZXIgXCIrZS5uYW1lK1wiIHdpdGggaW5wdXQgc2hhcGUgW1wiK2UuaW5ib3VuZE5vZGVzWzBdLmlucHV0VGVuc29yc1swXS5zaGFwZStcIl1cIil9LHQucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXt2YXIgbixyPWUgaW5zdGFuY2VvZiB0fHxlIGluc3RhbmNlb2YgTW9kZWw7aWYocil7aWYoMSE9PShuPWUpLm91dHB1dHMubGVuZ3RoKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiQWxsIGxheWVycyBpbiBhIFNlcXVlbnRpYWwgbW9kZWwgc2hvdWxkIGhhdmUgYSBzaW5nbGUgb3V0cHV0IHRlbnNvci4gRm9yIG11bHRpLW91dHB1dCBsYXllcnMsIHVzZSB0aGUgZnVuY3Rpb25hbCBBUEkuXCIpO2lmKDEhPT1uLmlucHV0cy5sZW5ndGgpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJBbGwgbGF5ZXJzIGluIGEgU2VxdWVudGlhbCBtb2RlbCBzaG91bGQgaGF2ZSBhIHNpbmdsZSBpbnB1dCB0ZW5zb3IuIEZvciBtdWx0aS1pbnB1dCBsYXllcnMsIHVzZSB0aGUgZnVuY3Rpb25hbCBBUEkuXCIpfWlmKDA9PT10aGlzLm91dHB1dHMubGVuZ3RoKXtpZigwPT09ZS5pbmJvdW5kTm9kZXMubGVuZ3RoKXtpZihudWxsPT1lLmJhdGNoSW5wdXRTaGFwZSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIlRoZSBmaXJzdCBsYXllciBpbiBhIFNlcXVlbnRpYWwgbW9kZWwgbXVzdCBnZXQgYW4gYGlucHV0U2hhcGVgIG9yIGBiYXRjaElucHV0U2hhcGVgIGFyZ3VtZW50LlwiKTt2YXIgaT1JbnB1dCh7YmF0Y2hTaGFwZTplLmJhdGNoSW5wdXRTaGFwZSxkdHlwZTplLmR0eXBlLG5hbWU6ZS5uYW1lK1wiX2lucHV0XCJ9KTtlLmFwcGx5KGkpfWlmKHIpdGhpcy5vdXRwdXRzPW4ub3V0cHV0cyx0aGlzLmlucHV0cz1uLmlucHV0cztlbHNle2lmKDEhPT1lLmluYm91bmROb2Rlcy5sZW5ndGgpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJBIGxheWVyIGFkZGVkIHRvIGEgU2VxdWVudGlhbCBtb2RlbCBtdXN0IG5vdCBhbHJlYWR5IGJlIGNvbm5lY3RlZCBzb21ld2hlcmUgZWxzZS4gTW9kZWwgcmVjZWl2ZWQgbGF5ZXIgXCIrZS5uYW1lK1wiIHdoaWNoIGhhcyBcIitlLmluYm91bmROb2Rlcy5sZW5ndGgrXCIgcHJlLWV4aXN0aW5nIGluYm91bmQgY29ubmVjdGlvbnMuXCIpO2lmKDEhPT1lLmluYm91bmROb2Rlc1swXS5vdXRwdXRUZW5zb3JzLmxlbmd0aCl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIkFsbCBsYXllcnMgaW4gYSBTZXF1ZW50aWFsIG1vZGVsIHNob3VsZCBoYXZlIGEgc2luZ2xlIG91dHB1dCB0ZW5zb3IuIEZvciBtdWx0aS1vdXRwdXQgbGF5ZXJzLCB1c2UgdGhlIGZ1bmN0aW9uYWwgQVBJLlwiKTt0aGlzLmNoZWNrU2hhcGUoZSksdGhpcy5vdXRwdXRzPVtlLmluYm91bmROb2Rlc1swXS5vdXRwdXRUZW5zb3JzWzBdXSx0aGlzLmlucHV0cz1nZXRTb3VyY2VJbnB1dHModGhpcy5vdXRwdXRzWzBdKX10aGlzLmluYm91bmROb2Rlcz1bXSxuZXcgTm9kZSh7b3V0Ym91bmRMYXllcjp0aGlzLGluYm91bmRMYXllcnM6W10sbm9kZUluZGljZXM6W10sdGVuc29ySW5kaWNlczpbXSxpbnB1dFRlbnNvcnM6dGhpcy5pbnB1dHMsb3V0cHV0VGVuc29yczp0aGlzLm91dHB1dHMsaW5wdXRNYXNrczpweUxpc3RSZXBlYXQobnVsbCx0aGlzLmlucHV0cy5sZW5ndGgpLG91dHB1dE1hc2tzOltudWxsXSxpbnB1dFNoYXBlczp0aGlzLmlucHV0cy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2hhcGV9KSxvdXRwdXRTaGFwZXM6dGhpcy5vdXRwdXRzWzBdLnNoYXBlfSl9ZWxzZXt2YXIgYT1lLmFwcGx5KHRoaXMub3V0cHV0c1swXSk7aWYoQXJyYXkuaXNBcnJheShhKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQWxsIGxheWVycyBpbiBhIFNlcXVlbnRpYWwgbW9kZWwgc2hvdWxkIGhhdmUgYSBzaW5nbGUgb3V0cHV0IHRlbnNvci4gRm9yIG11bHRpLW91dHB1dCBsYXllcnMsIHVzZSB0aGUgZnVuY3Rpb25hbCBBUEkuXCIpO3RoaXMuY2hlY2tTaGFwZShlKSx0aGlzLm91dHB1dHM9W2FdLHRoaXMuaW5ib3VuZE5vZGVzWzBdLm91dHB1dFRlbnNvcnM9dGhpcy5vdXRwdXRzLHRoaXMuaW5ib3VuZE5vZGVzWzBdLm91dHB1dFNoYXBlcz1bdGhpcy5vdXRwdXRzWzBdLnNoYXBlXX10aGlzLmxheWVycy5wdXNoKGUpLHRoaXMuYnVpbHQ9ITF9LHQucHJvdG90eXBlLnBvcD1mdW5jdGlvbigpe2lmKDA9PT10aGlzLmxheWVycy5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZXJlIGFyZSBubyBsYXllcnMgaW4gdGhlIG1vZGVsLlwiKTtpZih0aGlzLmxheWVycy5wb3AoKSwwPT09dGhpcy5sYXllcnMubGVuZ3RoKXRoaXMub3V0cHV0cz1bXSx0aGlzLmluYm91bmROb2Rlcz1bXSx0aGlzLm91dGJvdW5kTm9kZXM9W107ZWxzZXt2YXIgZT10aGlzLmxheWVycy5sZW5ndGgtMTt0aGlzLmxheWVyc1tlXS5vdXRib3VuZE5vZGVzPVtdLHRoaXMub3V0cHV0cz1bdGhpcy5sYXllcnNbZV0ub3V0cHV0XSx0aGlzLmluYm91bmROb2Rlc1swXS5vdXRwdXRUZW5zb3JzPXRoaXMub3V0cHV0cyx0aGlzLmluYm91bmROb2Rlc1swXS5vdXRwdXRTaGFwZXM9W3RoaXMub3V0cHV0c1swXS5zaGFwZV19fSx0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PXRoaXMubW9kZWwmJnRoaXMuYnVpbGQoKSx0aGlzLm1vZGVsLmNhbGwoZSx0KX0sdC5wcm90b3R5cGUuYnVpbGQ9ZnVuY3Rpb24oZSl7aWYoZ2V0RXhhY3RseU9uZVNoYXBlKGUpLDA9PT10aGlzLmlucHV0cy5sZW5ndGh8fDA9PT10aGlzLm91dHB1dHMubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTZXF1ZW50aWFsIG1vZGVsIGNhbm5vdCBiZSBidWlsdDogbW9kZWwgaXMgZW1wdHkuIEFkZCBzb21lIGxheWVycyBmaXJzdC5cIik7dGhpcy5tb2RlbD1uZXcgTW9kZWwoe2lucHV0czp0aGlzLmlucHV0cyxvdXRwdXRzOnRoaXMub3V0cHV0c1swXSxuYW1lOnRoaXMubmFtZStcIl9tb2RlbFwifSksdGhpcy5tb2RlbC50cmFpbmFibGU9dGhpcy50cmFpbmFibGUsdGhpcy5tb2RlbC51cGRhdGFibGU9dGhpcy51cGRhdGFibGUsdGhpcy5zdXBwb3J0c01hc2tpbmc9dGhpcy5tb2RlbC5zdXBwb3J0c01hc2tpbmcsdGhpcy5pbnB1dExheWVycz10aGlzLm1vZGVsLmlucHV0TGF5ZXJzLHRoaXMuaW5wdXRMYXllcnNOb2RlSW5kaWNlcz10aGlzLm1vZGVsLmlucHV0TGF5ZXJzTm9kZUluZGljZXMsdGhpcy5pbnB1dExheWVyc1RlbnNvckluZGljZXM9dGhpcy5tb2RlbC5pbnB1dExheWVyc1RlbnNvckluZGljZXMsdGhpcy5vdXRwdXRMYXllcnM9dGhpcy5tb2RlbC5vdXRwdXRMYXllcnMsdGhpcy5vdXRwdXRMYXllcnNOb2RlSW5kaWNlcz10aGlzLm1vZGVsLm91dHB1dExheWVyc05vZGVJbmRpY2VzLHRoaXMub3V0cHV0TGF5ZXJzVGVuc29ySW5kaWNlcz10aGlzLm1vZGVsLm91dHB1dExheWVyc1RlbnNvckluZGljZXMsdGhpcy5ub2Rlc0J5RGVwdGg9dGhpcy5tb2RlbC5ub2Rlc0J5RGVwdGgsdGhpcy5jb250YWluZXJOb2Rlcz10aGlzLm1vZGVsLmNvbnRhaW5lck5vZGVzLHRoaXMub3V0cHV0TmFtZXM9dGhpcy5tb2RlbC5vdXRwdXROYW1lcyx0aGlzLmlucHV0TmFtZXM9dGhpcy5tb2RlbC5pbnB1dE5hbWVzLHRoaXMuYnVpbHQ9ITB9LHQucHJvdG90eXBlLmNvdW50UGFyYW1zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYnVpbHR8fHRoaXMuYnVpbGQoKSxlLnByb3RvdHlwZS5jb3VudFBhcmFtcy5jYWxsKHRoaXMpfSx0LnByb3RvdHlwZS5zdW1tYXJ5PWZ1bmN0aW9uKHQsbixyKXt2b2lkIDA9PT1yJiYocj1jb25zb2xlLmxvZyksdGhpcy5idWlsdHx8dGhpcy5idWlsZCgpLGUucHJvdG90eXBlLnN1bW1hcnkuY2FsbCh0aGlzLHQsbixyKX0sdC5wcm90b3R5cGUuc2V0V2VpZ2h0cz1mdW5jdGlvbihlKXtudWxsPT10aGlzLm1vZGVsJiZ0aGlzLmJ1aWxkKCksdGhpcy5tb2RlbC5zZXRXZWlnaHRzKGUpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJ1cGRhdGFibGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VwZGF0YWJsZX0sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuYnVpbHQmJih0aGlzLm1vZGVsLnVwZGF0YWJsZT1lKSx0aGlzLl91cGRhdGFibGU9ZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5ldmFsdWF0ZT1mdW5jdGlvbihlLHQsbil7aWYodm9pZCAwPT09biYmKG49e30pLCF0aGlzLmJ1aWx0KXRocm93IG5ldyBSdW50aW1lRXJyb3IoXCJUaGUgbW9kZWwgbmVlZHMgdG8gYmUgY29tcGlsZWQgYmVmb3JlIGJlaW5nIHVzZWQuXCIpO3JldHVybiB0aGlzLm1vZGVsLmV2YWx1YXRlKGUsdCxuKX0sdC5wcm90b3R5cGUuZXZhbHVhdGVEYXRhc2V0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihuKXtpZighdGhpcy5idWlsdCl0aHJvdyBuZXcgUnVudGltZUVycm9yKFwiVGhlIG1vZGVsIG5lZWRzIHRvIGJlIGNvbXBpbGVkIGJlZm9yZSBiZWluZyB1c2VkLlwiKTtyZXR1cm5bMix0aGlzLm1vZGVsLmV2YWx1YXRlRGF0YXNldChlLHQpXX0pfSl9LHQucHJvdG90eXBlLnByZWRpY3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9e30pLG51bGw9PXRoaXMubW9kZWwmJnRoaXMuYnVpbGQoKSx0aGlzLm1vZGVsLnByZWRpY3QoZSx0KX0sdC5wcm90b3R5cGUucHJlZGljdE9uQmF0Y2g9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PXRoaXMubW9kZWwmJnRoaXMuYnVpbGQoKSx0aGlzLm1vZGVsLnByZWRpY3RPbkJhdGNoKGUpfSx0LnByb3RvdHlwZS5jb21waWxlPWZ1bmN0aW9uKGUpe3RoaXMuYnVpbGQoKSx0aGlzLm1vZGVsLmNvbXBpbGUoZSksdGhpcy5vcHRpbWl6ZXI9dGhpcy5tb2RlbC5vcHRpbWl6ZXIsdGhpcy5sb3NzPXRoaXMubW9kZWwubG9zcyx0aGlzLm1ldHJpY3M9dGhpcy5tb2RlbC5tZXRyaWNzLHRoaXMubWV0cmljc1RlbnNvcnM9dGhpcy5tb2RlbC5tZXRyaWNzVGVuc29ycyx0aGlzLm1ldHJpY3NOYW1lcz10aGlzLm1vZGVsLm1ldHJpY3NOYW1lc30sdC5wcm90b3R5cGUuZml0PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49e30pLF9fYXdhaXRlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gX19nZW5lcmF0b3IodGhpcyxmdW5jdGlvbihyKXtpZighdGhpcy5idWlsdCl0aHJvdyBuZXcgUnVudGltZUVycm9yKFwiVGhlIG1vZGVsIG5lZWRzIHRvIGJlIGNvbXBpbGVkIGJlZm9yZSBiZWluZyB1c2VkLlwiKTtyZXR1cm5bMix0aGlzLm1vZGVsLmZpdChlLHQsbildfSl9KX0sdC5wcm90b3R5cGUuZml0RGF0YXNldD1mdW5jdGlvbihlLHQpe3JldHVybiBfX2F3YWl0ZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsZnVuY3Rpb24obil7aWYoIXRoaXMuYnVpbHQpdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihcIlRoZSBtb2RlbCBuZWVkcyB0byBiZSBjb21waWxlZCBiZWZvcmUgYmVpbmcgdXNlZC5cIik7cmV0dXJuWzIsdGhpcy5tb2RlbC5maXREYXRhc2V0KGUsdCldfSl9KX0sdC5mcm9tQ29uZmlnPWZ1bmN0aW9uKGUsbil7dmFyIHIsaT17fTtpZihuIGluc3RhbmNlb2YgQXJyYXkpe2lmKG51bGw9PW5bMF0uY2xhc3NOYW1lfHxcIk1lcmdlXCI9PT1uWzBdLmNsYXNzTmFtZSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIkxlZ2FjeSBzZXJpYWxpemF0aW9uIGZvcm1hdCBub3Qgc3VwcG9ydGVkIHlldC5cIik7cj1ufWVsc2UgdXRpbC5hc3NlcnQobnVsbCE9bi5sYXllcnMsXCJXaGVuIHRoZSBjb25maWcgZGF0YSBmb3IgYSBTZXF1ZW50aWFsIG1vZGVsIGlzIG5vdCBhbiBBcnJheSwgaXQgbXVzdCBiZSBhbiBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgJ2xheWVycycgZmllbGQuXCIpLHI9bi5sYXllcnMsZGVsZXRlIG4ubGF5ZXJzLGk9bjt2YXIgYT1uZXcgZShpKTtpZighKGEgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcIlNlcXVlbnRpYWwuZnJvbUNvbmZpZyBjYWxsZWQgb24gbm9uLVNlcXVlbnRpYWwgaW5wdXQ6IFwiK2EpO2Zvcih2YXIgbz0wLHM9cjtvPHMubGVuZ3RoO28rKyl7dmFyIGw9ZGVzZXJpYWxpemUoc1tvXSk7YS5hZGQobCl9cmV0dXJuIGF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcInN0b3BUcmFpbmluZ1wiLHtzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5tb2RlbC5zdG9wVHJhaW5pbmc9ZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wLG49dGhpcy5sYXllcnM7dDxuLmxlbmd0aDt0Kyspe3ZhciByPW5bdF07ZS5wdXNoKHtjbGFzc05hbWU6ci5nZXRDbGFzc05hbWUoKSxjb25maWc6ci5nZXRDb25maWcoKX0pfXJldHVybiBlfSx0LmNsYXNzTmFtZT1cIlNlcXVlbnRpYWxcIix0fShNb2RlbCk7ZnVuY3Rpb24gbW9kZWwoZSl7cmV0dXJuIG5ldyBNb2RlbChlKX1mdW5jdGlvbiBzZXF1ZW50aWFsKGUpe3JldHVybiBuZXcgU2VxdWVudGlhbChlKX1mdW5jdGlvbiBsb2FkTW9kZWwoZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9ITApLGxvYWRNb2RlbEludGVybmFsKGUsdCl9ZnVuY3Rpb24gaW5wdXQoZSl7cmV0dXJuIElucHV0KGUpfWZ1bmN0aW9uIHJlZ2lzdGVyQ2FsbGJhY2tDb25zdHJ1Y3RvcihlLHQpe0NhbGxiYWNrQ29uc3RydWN0b3JSZWdpc3RyeS5yZWdpc3RlckNhbGxiYWNrQ29uc3RydWN0b3IoZSx0KX1zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoU2VxdWVudGlhbCk7dmFyIEFjdGl2YXRpb249ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3JldHVybiBudWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmdldENvbmZpZz1mdW5jdGlvbigpe3JldHVybnt9fSx0fShzZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZSksRWx1PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtyZXR1cm4gbnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0xKSxlbHUkMShlLHQpfSx0LmNsYXNzTmFtZT1cImVsdVwiLHR9KEFjdGl2YXRpb24pO3NlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhFbHUpO3ZhciBTZWx1PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtyZXR1cm4gbnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbihlKXtyZXR1cm4gc2VsdShlKX0sdC5jbGFzc05hbWU9XCJzZWx1XCIsdH0oQWN0aXZhdGlvbik7c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFNlbHUpO3ZhciBSZWx1PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtyZXR1cm4gbnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbihlKXtyZXR1cm4gcmVsdShlKX0sdC5jbGFzc05hbWU9XCJyZWx1XCIsdH0oQWN0aXZhdGlvbik7c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFJlbHUpO3ZhciBSZWx1Nj1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7cmV0dXJuIG51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24oZSl7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXtyZXR1cm4gbWluaW11bShnZXRTY2FsYXIoNikscmVsdShlKSl9KX0sdC5jbGFzc05hbWU9XCJyZWx1NlwiLHR9KEFjdGl2YXRpb24pO3NlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhSZWx1Nik7dmFyIExpbmVhcj1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7cmV0dXJuIG51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHQuY2xhc3NOYW1lPVwibGluZWFyXCIsdH0oQWN0aXZhdGlvbik7c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKExpbmVhcik7dmFyIFNpZ21vaWQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3JldHVybiBudWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKGUpe3JldHVybiBzaWdtb2lkKGUpfSx0LmNsYXNzTmFtZT1cInNpZ21vaWRcIix0fShBY3RpdmF0aW9uKTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoU2lnbW9pZCk7dmFyIEhhcmRTaWdtb2lkPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtyZXR1cm4gbnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbihlKXtyZXR1cm4gaGFyZFNpZ21vaWQoZSl9LHQuY2xhc3NOYW1lPVwiaGFyZFNpZ21vaWRcIix0fShBY3RpdmF0aW9uKTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoSGFyZFNpZ21vaWQpO3ZhciBTb2Z0cGx1cz1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7cmV0dXJuIG51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24oZSl7cmV0dXJuIHNvZnRwbHVzKGUpfSx0LmNsYXNzTmFtZT1cInNvZnRwbHVzXCIsdH0oQWN0aXZhdGlvbik7c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFNvZnRwbHVzKTt2YXIgU29mdHNpZ249ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3JldHVybiBudWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKGUpe3JldHVybiBzb2Z0c2lnbihlKX0sdC5jbGFzc05hbWU9XCJzb2Z0c2lnblwiLHR9KEFjdGl2YXRpb24pO3NlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhTb2Z0c2lnbik7dmFyIFRhbmg9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3JldHVybiBudWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKGUpe3JldHVybiB0YW5oKGUpfSx0LmNsYXNzTmFtZT1cInRhbmhcIix0fShBY3RpdmF0aW9uKTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoVGFuaCk7dmFyIFNvZnRtYXg9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3JldHVybiBudWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PS0xKSxzb2Z0bWF4KGUsdCl9LHQuY2xhc3NOYW1lPVwic29mdG1heFwiLHR9KEFjdGl2YXRpb24pO2Z1bmN0aW9uIHNlcmlhbGl6ZUFjdGl2YXRpb24oZSl7cmV0dXJuIGUuZ2V0Q2xhc3NOYW1lKCl9ZnVuY3Rpb24gZGVzZXJpYWxpemVBY3RpdmF0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PXt9KSxkZXNlcmlhbGl6ZUtlcmFzT2JqZWN0KGUsc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uTWFwLmdldE1hcCgpLmNsYXNzTmFtZU1hcCx0LFwiYWN0aXZhdGlvblwiKX1mdW5jdGlvbiBnZXRBY3RpdmF0aW9uKGUpe3JldHVybiBudWxsPT1lP2Rlc2VyaWFsaXplQWN0aXZhdGlvbih7Y2xhc3NOYW1lOlwibGluZWFyXCIsY29uZmlnOnt9fSk6XCJzdHJpbmdcIj09dHlwZW9mIGU/ZGVzZXJpYWxpemVBY3RpdmF0aW9uKHtjbGFzc05hbWU6ZSxjb25maWc6e319KTplIGluc3RhbmNlb2YgQWN0aXZhdGlvbj9lOmRlc2VyaWFsaXplQWN0aXZhdGlvbihlKX1zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoU29mdG1heCk7dmFyIFJlTFU9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyxudWxsPT10P3t9OnQpfHx0aGlzO3JldHVybiBuLnN1cHBvcnRzTWFza2luZz0hMCxudWxsIT10JiYobi5tYXhWYWx1ZT10Lm1heFZhbHVlKSxufXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGUsdCl7ZT1nZXRFeGFjdGx5T25lVGVuc29yKGUpO3ZhciBuPXJlbHUoZSk7cmV0dXJuIG51bGwhPXRoaXMubWF4VmFsdWUmJihuPWNsaXBCeVZhbHVlKG4sMCx0aGlzLm1heFZhbHVlKSksbn0sdC5wcm90b3R5cGUuY29tcHV0ZU91dHB1dFNoYXBlPWZ1bmN0aW9uKGUpe3JldHVybiBlfSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXt2YXIgdD17bWF4VmFsdWU6dGhpcy5tYXhWYWx1ZX0sbj1lLnByb3RvdHlwZS5nZXRDb25maWcuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0LmFzc2lnbih0LG4pLHR9LHQuY2xhc3NOYW1lPVwiUmVMVVwiLHR9KExheWVyKTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoUmVMVSk7dmFyIExlYWt5UmVMVT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzLG51bGw9PXQ/e306dCl8fHRoaXM7cmV0dXJuIG4uREVGQVVMVF9BTFBIQT0uMyxudWxsPT10JiYodD17fSksbi5hbHBoYT1udWxsPT10LmFscGhhP24uREVGQVVMVF9BTFBIQTp0LmFscGhhLG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24oZSx0KXt2YXIgbj1nZXRFeGFjdGx5T25lVGVuc29yKGUpO3JldHVybiBsZWFreVJlbHUobix0aGlzLmFscGhhKX0sdC5wcm90b3R5cGUuY29tcHV0ZU91dHB1dFNoYXBlPWZ1bmN0aW9uKGUpe3JldHVybiBlfSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXt2YXIgdD17YWxwaGE6dGhpcy5hbHBoYX0sbj1lLnByb3RvdHlwZS5nZXRDb25maWcuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0LmFzc2lnbih0LG4pLHR9LHQuY2xhc3NOYW1lPVwiTGVha3lSZUxVXCIsdH0oTGF5ZXIpO3NlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhMZWFreVJlTFUpO3ZhciBFTFU9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyxudWxsPT10P3t9OnQpfHx0aGlzO2lmKG4uREVGQVVMVF9BTFBIQT0xLG51bGw9PXQmJih0PXt9KSxudWxsIT10LmFscGhhJiZ0LmFscGhhIT09bi5ERUZBVUxUX0FMUEhBKXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiTm9uLWRlZmF1bHQgYWxwaGEgdmFsdWUgKFwiK3QuYWxwaGErXCIpIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIEVMVSBsYXllciB5ZXQuXCIpO3JldHVybiBuLmFscGhhPW51bGw9PXQuYWxwaGE/bi5ERUZBVUxUX0FMUEhBOnQuYWxwaGEsbn1yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihlLHQpe3ZhciBuPWdldEV4YWN0bHlPbmVUZW5zb3IoZSk7cmV0dXJuIGVsdShuKX0sdC5wcm90b3R5cGUuY29tcHV0ZU91dHB1dFNoYXBlPWZ1bmN0aW9uKGUpe3JldHVybiBlfSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXt2YXIgdD17YWxwaGE6dGhpcy5hbHBoYX0sbj1lLnByb3RvdHlwZS5nZXRDb25maWcuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0LmFzc2lnbih0LG4pLHR9LHQuY2xhc3NOYW1lPVwiRUxVXCIsdH0oTGF5ZXIpO3NlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhFTFUpO3ZhciBUaHJlc2hvbGRlZFJlTFU9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyxudWxsPT10P3t9OnQpfHx0aGlzO3JldHVybiBuLkRFRkFVTFRfVEhFVEE9MSxudWxsPT10JiYodD17fSksbi50aGV0YT1udWxsPT10LnRoZXRhP24uREVGQVVMVF9USEVUQTp0LnRoZXRhLG4udGhldGFUZW5zb3I9Z2V0U2NhbGFyKG4udGhldGEpLG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24oZSx0KXt2YXIgbj1nZXRFeGFjdGx5T25lVGVuc29yKGUpO3JldHVybiBuLm11bChjYXN0JDEobi5ncmVhdGVyKHRoaXMudGhldGFUZW5zb3IpLFwiZmxvYXQzMlwiKSl9LHQucHJvdG90eXBlLmNvbXB1dGVPdXRwdXRTaGFwZT1mdW5jdGlvbihlKXtyZXR1cm4gZX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7dmFyIHQ9e3RoZXRhOnRoaXMudGhldGF9LG49ZS5wcm90b3R5cGUuZ2V0Q29uZmlnLmNhbGwodGhpcyk7cmV0dXJuIE9iamVjdC5hc3NpZ24odCxuKSx0fSx0LmNsYXNzTmFtZT1cIlRocmVzaG9sZGVkUmVMVVwiLHR9KExheWVyKTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoVGhyZXNob2xkZWRSZUxVKTt2YXIgU29mdG1heCQxPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIG49ZS5jYWxsKHRoaXMsbnVsbD09dD97fTp0KXx8dGhpcztyZXR1cm4gbi5ERUZBVUxUX0FYSVM9MSxudWxsPT10JiYodD17fSksbi5zb2Z0bWF4PShuZXcgU29mdG1heCkuYXBwbHksbi5heGlzPW51bGw9PXQuYXhpcz9uLkRFRkFVTFRfQVhJUzp0LmF4aXMsbn1yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihlLHQpe3ZhciBuPWdldEV4YWN0bHlPbmVUZW5zb3IoZSk7cmV0dXJuIHRoaXMuc29mdG1heChuLHRoaXMuYXhpcyl9LHQucHJvdG90eXBlLmNvbXB1dGVPdXRwdXRTaGFwZT1mdW5jdGlvbihlKXtyZXR1cm4gZX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7dmFyIHQ9e2F4aXM6dGhpcy5heGlzfSxuPWUucHJvdG90eXBlLmdldENvbmZpZy5jYWxsKHRoaXMpO3JldHVybiBPYmplY3QuYXNzaWduKHQsbiksdH0sdC5jbGFzc05hbWU9XCJTb2Z0bWF4XCIsdH0oTGF5ZXIpO3NlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhTb2Z0bWF4JDEpO3ZhciBSZWd1bGFyaXplcj1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7cmV0dXJuIG51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gX19leHRlbmRzKHQsZSksdH0oc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGUpLEwxTDI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyl8fHRoaXMscj1udWxsPT10fHxudWxsPT10LmwxPy4wMTp0LmwxLGk9bnVsbD09dHx8bnVsbD09dC5sMj8uMDE6dC5sMjtyZXR1cm4gbi5oYXNMMT0wIT09cixuLmhhc0wyPTAhPT1pLG4ubDE9Z2V0U2NhbGFyKHIpLG4ubDI9Z2V0U2NhbGFyKGkpLG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXt2YXIgbj16ZXJvcyhbMV0pO3JldHVybiB0Lmhhc0wxJiYobj1hZGQobixzdW0obXVsKHQubDEsYWJzKGUpKSkpKSx0Lmhhc0wyJiYobj1hZGQobixzdW0obXVsKHQubDIsc3F1YXJlKGUpKSkpKSxuLmFzU2NhbGFyKCl9KX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7cmV0dXJue2wxOnRoaXMubDEuZGF0YVN5bmMoKVswXSxsMjp0aGlzLmwyLmRhdGFTeW5jKClbMF19fSx0LmZyb21Db25maWc9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IGUoe2wxOnQubDEsbDI6dC5sMn0pfSx0LmNsYXNzTmFtZT1cIkwxTDJcIix0fShSZWd1bGFyaXplcik7ZnVuY3Rpb24gbDEoZSl7cmV0dXJuIG5ldyBMMUwyKHtsMTpudWxsIT1lP2UubDE6bnVsbCxsMjowfSl9ZnVuY3Rpb24gbDIoZSl7cmV0dXJuIG5ldyBMMUwyKHtsMjpudWxsIT1lP2UubDI6bnVsbCxsMTowfSl9c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKEwxTDIpO3ZhciBSRUdVTEFSSVpFUl9JREVOVElGSUVSX1JFR0lTVFJZX1NZTUJPTF9NQVA9e2wxbDI6XCJMMUwyXCJ9O2Z1bmN0aW9uIHNlcmlhbGl6ZVJlZ3VsYXJpemVyKGUpe3JldHVybiBzZXJpYWxpemVLZXJhc09iamVjdChlKX1mdW5jdGlvbiBkZXNlcmlhbGl6ZVJlZ3VsYXJpemVyKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PXt9KSxkZXNlcmlhbGl6ZUtlcmFzT2JqZWN0KGUsc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uTWFwLmdldE1hcCgpLmNsYXNzTmFtZU1hcCx0LFwicmVndWxhcml6ZXJcIil9ZnVuY3Rpb24gZ2V0UmVndWxhcml6ZXIoZSl7cmV0dXJuIG51bGw9PWU/bnVsbDpcInN0cmluZ1wiPT10eXBlb2YgZT9kZXNlcmlhbGl6ZVJlZ3VsYXJpemVyKHtjbGFzc05hbWU6ZSBpbiBSRUdVTEFSSVpFUl9JREVOVElGSUVSX1JFR0lTVFJZX1NZTUJPTF9NQVA/UkVHVUxBUklaRVJfSURFTlRJRklFUl9SRUdJU1RSWV9TWU1CT0xfTUFQW2VdOmUsY29uZmlnOnt9fSk6ZSBpbnN0YW5jZW9mIFJlZ3VsYXJpemVyP2U6ZGVzZXJpYWxpemVSZWd1bGFyaXplcihlKX1mdW5jdGlvbiBub3JtYWxpemVBcnJheShlLHQsbil7aWYoXCJudW1iZXJcIj09dHlwZW9mIGUpcmV0dXJuIHB5TGlzdFJlcGVhdChlLHQpO2lmKGUubGVuZ3RoIT09dCl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIlRoZSBcIituK1wiIGFyZ3VtZW50IG11c3QgYmUgYSB0dXBsZSBvZiBcIit0K1wiIGludGVnZXJzLiBSZWNlaXZlZDogXCIrZS5sZW5ndGgrXCIgZWxlbWVudHMuXCIpO2Zvcih2YXIgcj0wO3I8dDsrK3Ipe3ZhciBpPWVbcl07aWYoIWlzSW50ZWdlcihpKSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIlRoZSBcIituK1wiIGFyZ3VtZW50IG11c3QgYmUgYSB0dXBsZSBvZiBcIit0K1wiIGludGVnZXJzLiBSZWNlaXZlZDogXCIrSlNPTi5zdHJpbmdpZnkoZSkrXCIgaW5jbHVkaW5nIGEgbm9uLWludGVnZXIgbnVtYmVyIFwiK2kpfXJldHVybiBlfWZ1bmN0aW9uIGNvbnZPdXRwdXRMZW5ndGgoZSx0LG4scixpKXtyZXR1cm4gdm9pZCAwPT09aSYmKGk9MSksbnVsbD09ZT9lOihhPVwic2FtZVwiPT09bj9lOmUtKHQrKHQtMSkqKGktMSkpKzEsTWF0aC5mbG9vcigoYStyLTEpL3IpKTt2YXIgYX1mdW5jdGlvbiBkZWNvbnZMZW5ndGgoZSx0LG4scil7aWYobnVsbD09ZSlyZXR1cm4gbnVsbDtpZihcInZhbGlkXCI9PT1yKWU9ZSp0K21heCQxKFtuLXQsMF0pO2Vsc2V7aWYoXCJzYW1lXCIhPT1yKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiVW5zdXBwb3J0IHBhZGRpbmcgbW9kZTogXCIrcitcIi5cIik7ZSo9dH1yZXR1cm4gZX1mdW5jdGlvbiBwcmVwcm9jZXNzQ29udjJESW5wdXQoZSx0KXtyZXR1cm4gdGlkeShmdW5jdGlvbigpe3JldHVybiBjaGVja0RhdGFGb3JtYXQodCksXCJjaGFubmVsc0ZpcnN0XCI9PT10P3RyYW5zcG9zZShlLFswLDIsMywxXSk6ZX0pfWZ1bmN0aW9uIGNvbnYxZFdpdGhCaWFzKGUsdCxuLHIsaSxhLG8pe3JldHVybiB2b2lkIDA9PT1yJiYocj0xKSx2b2lkIDA9PT1pJiYoaT1cInZhbGlkXCIpLHZvaWQgMD09PW8mJihvPTEpLHRpZHkoZnVuY3Rpb24oKXtpZihudWxsPT1hJiYoYT1pbWFnZURhdGFGb3JtYXQoKSksY2hlY2tEYXRhRm9ybWF0KGEpLDMhPT1lLnNoYXBlLmxlbmd0aCl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIlRoZSBpbnB1dCBvZiBhIGNvbnYxZFdpdGhCaWFzIG9wZXJhdGlvbiBzaG91bGQgYmUgMywgYnV0IGlzIFwiK2Uuc2hhcGUubGVuZ3RoK1wiIGluc3RlYWQuXCIpO2lmKDMhPT10LnNoYXBlLmxlbmd0aCl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIlRoZSBrZXJuZWwgZm9yIGEgY29udjFkV2l0aEJpYXMgb3BlcmF0aW9uIHNob3VsZCBiZSAzLCBidXQgaXMgXCIrdC5zaGFwZS5sZW5ndGgrXCIgaW5zdGVhZFwiKTtpZihudWxsIT1uJiYxIT09bi5zaGFwZS5sZW5ndGgpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJUaGUgYmlhcyBmb3IgYSBjb252MWRXaXRoQmlhcyBvcGVyYXRpb24gc2hvdWxkIGJlIDEsIGJ1dCBpcyBcIit0LnNoYXBlLmxlbmd0aCtcIiBpbnN0ZWFkXCIpO2lmKFwiY2hhbm5lbHNGaXJzdFwiPT09YSYmKGU9dHJhbnNwb3NlKGUsWzAsMiwxXSkpLFwiY2F1c2FsXCI9PT1pKXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiVGhlIHN1cHBvcnQgZm9yIENBVVNBTCBwYWRkaW5nIG1vZGUgaW4gY29udjFkV2l0aEJpYXMgaXMgbm90IGltcGxlbWVudGVkIHlldC5cIik7dmFyIHM9Y29udjFkKGUsdCxyLFwic2FtZVwiPT09aT9cInNhbWVcIjpcInZhbGlkXCIsXCJOV0NcIixvKTtyZXR1cm4gbnVsbCE9biYmKHM9Ymlhc0FkZChzLG4pKSxzfSl9ZnVuY3Rpb24gY29udjJkV2l0aEJpYXMoZSx0LG4scixpLGEsbyl7cmV0dXJuIHZvaWQgMD09PXImJihyPVsxLDFdKSx2b2lkIDA9PT1pJiYoaT1cInZhbGlkXCIpLHRpZHkoZnVuY3Rpb24oKXtpZihudWxsPT1hJiYoYT1pbWFnZURhdGFGb3JtYXQoKSksY2hlY2tEYXRhRm9ybWF0KGEpLDMhPT1lLnJhbmsmJjQhPT1lLnJhbmspdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJjb252MmRXaXRoQmlhcyBleHBlY3RzIGlucHV0IHRvIGJlIG9mIHJhbmsgMyBvciA0LCBidXQgcmVjZWl2ZWQgXCIrZS5yYW5rK1wiLlwiKTtpZigzIT09dC5yYW5rJiY0IT09dC5yYW5rKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiY29udjJkV2l0aEJpYXMgZXhwZWN0cyBrZXJuZWwgdG8gYmUgb2YgcmFuayAzIG9yIDQsIGJ1dCByZWNlaXZlZCBcIitlLnJhbmsrXCIuXCIpO3ZhciBzPXByZXByb2Nlc3NDb252MkRJbnB1dChlLGEpO2lmKFwiY2F1c2FsXCI9PT1pKXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiVGhlIHN1cHBvcnQgZm9yIENBVVNBTCBwYWRkaW5nIG1vZGUgaW4gY29udjFkV2l0aEJpYXMgaXMgbm90IGltcGxlbWVudGVkIHlldC5cIik7cmV0dXJuIHM9Y29udjJkKHMsdCxyLFwic2FtZVwiPT09aT9cInNhbWVcIjpcInZhbGlkXCIsXCJOSFdDXCIsbyksbnVsbCE9biYmKHM9Ymlhc0FkZChzLG4pKSxcImNoYW5uZWxzRmlyc3RcIj09PWEmJihzPXRyYW5zcG9zZShzLFswLDMsMSwyXSkpLHN9KX12YXIgQmFzZUNvbnY9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuLHIpe3ZhciBpPWUuY2FsbCh0aGlzLHIpfHx0aGlzO2lmKGkuYmlhcz1udWxsLGkuREVGQVVMVF9LRVJORUxfSU5JVElBTElaRVI9XCJnbG9yb3ROb3JtYWxcIixpLkRFRkFVTFRfQklBU19JTklUSUFMSVpFUj1cInplcm9zXCIsdC52ZXJpZnlDb25maWcociksaS5yYW5rPW4sMSE9PWkucmFuayYmMiE9PWkucmFuayl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcIkNvbnZvbHV0aW9uIGxheWVyIGZvciByYW5rIG90aGVyIHRoYW4gMSBvciAyIChcIitpLnJhbmsrXCIpIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuXCIpO2lmKGkua2VybmVsU2l6ZT1ub3JtYWxpemVBcnJheShyLmtlcm5lbFNpemUsbixcImtlcm5lbFNpemVcIiksaS5zdHJpZGVzPW5vcm1hbGl6ZUFycmF5KG51bGw9PXIuc3RyaWRlcz8xOnIuc3RyaWRlcyxuLFwic3RyaWRlc1wiKSxpLnBhZGRpbmc9bnVsbD09ci5wYWRkaW5nP1widmFsaWRcIjpyLnBhZGRpbmcsY2hlY2tQYWRkaW5nTW9kZShpLnBhZGRpbmcpLGkuZGF0YUZvcm1hdD1udWxsPT1yLmRhdGFGb3JtYXQ/XCJjaGFubmVsc0xhc3RcIjpyLmRhdGFGb3JtYXQsY2hlY2tEYXRhRm9ybWF0KGkuZGF0YUZvcm1hdCksaS5hY3RpdmF0aW9uPWdldEFjdGl2YXRpb24oci5hY3RpdmF0aW9uKSxpLnVzZUJpYXM9bnVsbD09ci51c2VCaWFzfHxyLnVzZUJpYXMsaS5iaWFzSW5pdGlhbGl6ZXI9Z2V0SW5pdGlhbGl6ZXIoci5iaWFzSW5pdGlhbGl6ZXJ8fGkuREVGQVVMVF9CSUFTX0lOSVRJQUxJWkVSKSxpLmJpYXNDb25zdHJhaW50PWdldENvbnN0cmFpbnQoci5iaWFzQ29uc3RyYWludCksaS5iaWFzUmVndWxhcml6ZXI9Z2V0UmVndWxhcml6ZXIoci5iaWFzUmVndWxhcml6ZXIpLGkuYWN0aXZpdHlSZWd1bGFyaXplcj1nZXRSZWd1bGFyaXplcihyLmFjdGl2aXR5UmVndWxhcml6ZXIpLGkuZGlsYXRpb25SYXRlPW5vcm1hbGl6ZUFycmF5KG51bGw9PXIuZGlsYXRpb25SYXRlPzE6ci5kaWxhdGlvblJhdGUsbixcImRpbGF0aW9uUmF0ZVwiKSwxPT09aS5yYW5rJiZBcnJheS5pc0FycmF5KGkuZGlsYXRpb25SYXRlKSYmMSE9PWkuZGlsYXRpb25SYXRlLmxlbmd0aCl0aHJvdyBuZXcgVmFsdWVFcnJvcihcImRpbGF0aW9uUmF0ZSBtdXN0IGJlIGEgbnVtYmVyIG9yIGFuIGFycmF5IG9mIGEgc2luZ2xlIG51bWJlciBmb3IgMUQgY29udm9sdXRpb24sIGJ1dCByZWNlaXZlZCBcIitKU09OLnN0cmluZ2lmeShpLmRpbGF0aW9uUmF0ZSkpO2lmKDI9PT1pLnJhbmspaWYoXCJudW1iZXJcIj09dHlwZW9mIGkuZGlsYXRpb25SYXRlKWkuZGlsYXRpb25SYXRlPVtpLmRpbGF0aW9uUmF0ZSxpLmRpbGF0aW9uUmF0ZV07ZWxzZSBpZigyIT09aS5kaWxhdGlvblJhdGUubGVuZ3RoKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiZGlsYXRpb25SYXRlIG11c3QgYmUgYSBudW1iZXIgb3IgYXJyYXkgb2YgdHdvIG51bWJlcnMgZm9yIDJEIGNvbnZvbHV0aW9uLCBidXQgcmVjZWl2ZWQgXCIrSlNPTi5zdHJpbmdpZnkoaS5kaWxhdGlvblJhdGUpKTtyZXR1cm4gaX1yZXR1cm4gX19leHRlbmRzKHQsZSksdC52ZXJpZnlDb25maWc9ZnVuY3Rpb24oZSl7aWYoYXNzZXJ0KFwia2VybmVsU2l6ZVwiaW4gZSxcInJlcXVpcmVkIGtleSAna2VybmVsU2l6ZScgbm90IGluIGNvbmZpZ1wiKSxcIm51bWJlclwiIT10eXBlb2YgZS5rZXJuZWxTaXplJiYhY2hlY2tBcnJheVR5cGVBbmRMZW5ndGgoZS5rZXJuZWxTaXplLFwibnVtYmVyXCIsMSwyKSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIkJhc2VDb252IGV4cGVjdHMgY29uZmlnLmtlcm5lbFNpemUgdG8gYmUgbnVtYmVyIG9yIG51bWJlcltdIHdpdGggbGVuZ3RoIDEgb3IgMiwgYnV0IHJlY2VpdmVkIFwiK0pTT04uc3RyaW5naWZ5KGUua2VybmVsU2l6ZSkrXCIuXCIpfSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXt2YXIgdD17a2VybmVsU2l6ZTp0aGlzLmtlcm5lbFNpemUsc3RyaWRlczp0aGlzLnN0cmlkZXMscGFkZGluZzp0aGlzLnBhZGRpbmcsZGF0YUZvcm1hdDp0aGlzLmRhdGFGb3JtYXQsZGlsYXRpb25SYXRlOnRoaXMuZGlsYXRpb25SYXRlLGFjdGl2YXRpb246c2VyaWFsaXplQWN0aXZhdGlvbih0aGlzLmFjdGl2YXRpb24pLHVzZUJpYXM6dGhpcy51c2VCaWFzLGJpYXNJbml0aWFsaXplcjpzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLmJpYXNJbml0aWFsaXplciksYmlhc1JlZ3VsYXJpemVyOnNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYmlhc1JlZ3VsYXJpemVyKSxhY3Rpdml0eVJlZ3VsYXJpemVyOnNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYWN0aXZpdHlSZWd1bGFyaXplciksYmlhc0NvbnN0cmFpbnQ6c2VyaWFsaXplQ29uc3RyYWludCh0aGlzLmJpYXNDb25zdHJhaW50KX0sbj1lLnByb3RvdHlwZS5nZXRDb25maWcuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0LmFzc2lnbih0LG4pLHR9LHR9KExheWVyKSxDb252PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobixyKXt2YXIgaT1lLmNhbGwodGhpcyxuLHIpfHx0aGlzO3JldHVybiBpLmtlcm5lbD1udWxsLHQudmVyaWZ5Q29uZmlnKHIpLGkuZmlsdGVycz1yLmZpbHRlcnMsaS5rZXJuZWxJbml0aWFsaXplcj1nZXRJbml0aWFsaXplcihyLmtlcm5lbEluaXRpYWxpemVyfHxpLkRFRkFVTFRfS0VSTkVMX0lOSVRJQUxJWkVSKSxpLmtlcm5lbENvbnN0cmFpbnQ9Z2V0Q29uc3RyYWludChyLmtlcm5lbENvbnN0cmFpbnQpLGkua2VybmVsUmVndWxhcml6ZXI9Z2V0UmVndWxhcml6ZXIoci5rZXJuZWxSZWd1bGFyaXplciksaX1yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuYnVpbGQ9ZnVuY3Rpb24oZSl7ZT1nZXRFeGFjdGx5T25lU2hhcGUoZSk7dmFyIHQ9XCJjaGFubmVsc0ZpcnN0XCI9PT10aGlzLmRhdGFGb3JtYXQ/MTplLmxlbmd0aC0xO2lmKG51bGw9PWVbdF0pdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJUaGUgY2hhbm5lbCBkaW1lbnNpb24gb2YgdGhlIGlucHV0IHNob3VsZCBiZSBkZWZpbmVkLiBGb3VuZCBcIitlW3RdKTt2YXIgbixyPWVbdF0saT10aGlzLmtlcm5lbFNpemUuY29uY2F0KFtyLHRoaXMuZmlsdGVyc10pO3RoaXMua2VybmVsPXRoaXMuYWRkV2VpZ2h0KFwia2VybmVsXCIsaSxudWxsLHRoaXMua2VybmVsSW5pdGlhbGl6ZXIsdGhpcy5rZXJuZWxSZWd1bGFyaXplciwhMCx0aGlzLmtlcm5lbENvbnN0cmFpbnQpLHRoaXMudXNlQmlhcyYmKHRoaXMuYmlhcz10aGlzLmFkZFdlaWdodChcImJpYXNcIixbdGhpcy5maWx0ZXJzXSxudWxsLHRoaXMuYmlhc0luaXRpYWxpemVyLHRoaXMuYmlhc1JlZ3VsYXJpemVyLCEwLHRoaXMuYmlhc0NvbnN0cmFpbnQpKSx0aGlzLmlucHV0U3BlYz1be25kaW06dGhpcy5yYW5rKzIsYXhlczoobj17fSxuW3RdPXIsbil9XSx0aGlzLmJ1aWx0PSEwfSx0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gdGlkeShmdW5jdGlvbigpe3ZhciB0O2U9Z2V0RXhhY3RseU9uZVRlbnNvcihlKTt2YXIgcj1udWxsPT1uLmJpYXM/bnVsbDpuLmJpYXMucmVhZCgpO2lmKDE9PT1uLnJhbmspdD1jb252MWRXaXRoQmlhcyhlLG4ua2VybmVsLnJlYWQoKSxyLG4uc3RyaWRlc1swXSxuLnBhZGRpbmcsbi5kYXRhRm9ybWF0LG4uZGlsYXRpb25SYXRlWzBdKTtlbHNlIGlmKDI9PT1uLnJhbmspdD1jb252MmRXaXRoQmlhcyhlLG4ua2VybmVsLnJlYWQoKSxyLG4uc3RyaWRlcyxuLnBhZGRpbmcsbi5kYXRhRm9ybWF0LG4uZGlsYXRpb25SYXRlKTtlbHNlIGlmKDM9PT1uLnJhbmspdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXCIzRCBjb252b2x1dGlvbiBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LlwiKTtyZXR1cm4gbnVsbCE9bi5hY3RpdmF0aW9uJiYodD1uLmFjdGl2YXRpb24uYXBwbHkodCkpLHR9KX0sdC5wcm90b3R5cGUuY29tcHV0ZU91dHB1dFNoYXBlPWZ1bmN0aW9uKGUpe2U9Z2V0RXhhY3RseU9uZVNoYXBlKGUpO2Zvcih2YXIgdD1bXSxuPVwiY2hhbm5lbHNMYXN0XCI9PT10aGlzLmRhdGFGb3JtYXQ/ZS5zbGljZSgxLGUubGVuZ3RoLTEpOmUuc2xpY2UoMikscj0wO3I8bi5sZW5ndGg7KytyKXt2YXIgaT1jb252T3V0cHV0TGVuZ3RoKG5bcl0sdGhpcy5rZXJuZWxTaXplW3JdLHRoaXMucGFkZGluZyx0aGlzLnN0cmlkZXNbcl0sXCJudW1iZXJcIj09dHlwZW9mIHRoaXMuZGlsYXRpb25SYXRlP3RoaXMuZGlsYXRpb25SYXRlOnRoaXMuZGlsYXRpb25SYXRlW3JdKTt0LnB1c2goaSl9dmFyIGE9W2VbMF1dO3JldHVyblwiY2hhbm5lbHNMYXN0XCI9PT10aGlzLmRhdGFGb3JtYXQ/KGE9YS5jb25jYXQodCkpLnB1c2godGhpcy5maWx0ZXJzKTooYS5wdXNoKHRoaXMuZmlsdGVycyksYT1hLmNvbmNhdCh0KSksYX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7dmFyIHQ9e2ZpbHRlcnM6dGhpcy5maWx0ZXJzLGtlcm5lbEluaXRpYWxpemVyOnNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMua2VybmVsSW5pdGlhbGl6ZXIpLGtlcm5lbFJlZ3VsYXJpemVyOnNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMua2VybmVsUmVndWxhcml6ZXIpLGtlcm5lbENvbnN0cmFpbnQ6c2VyaWFsaXplQ29uc3RyYWludCh0aGlzLmtlcm5lbENvbnN0cmFpbnQpfSxuPWUucHJvdG90eXBlLmdldENvbmZpZy5jYWxsKHRoaXMpO3JldHVybiBPYmplY3QuYXNzaWduKHQsbiksdH0sdC52ZXJpZnlDb25maWc9ZnVuY3Rpb24oZSl7aWYoIShcImZpbHRlcnNcImluIGUpfHxcIm51bWJlclwiIT10eXBlb2YgZS5maWx0ZXJzfHxlLmZpbHRlcnM8MSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIkNvbnZvbHV0aW9uIGxheWVyIGV4cGVjdGVkIGNvbmZpZy5maWx0ZXJzIHRvIGJlIGEgJ251bWJlcicgPiAwIGJ1dCBnb3QgXCIrSlNPTi5zdHJpbmdpZnkoZS5maWx0ZXJzKSl9LHR9KEJhc2VDb252KSxDb252MkQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXt2YXIgcj1lLmNhbGwodGhpcywyLG4pfHx0aGlzO3JldHVybiB0LnZlcmlmeUNvbmZpZyhuKSxyfXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXt2YXIgdD1lLnByb3RvdHlwZS5nZXRDb25maWcuY2FsbCh0aGlzKTtyZXR1cm4gZGVsZXRlIHQucmFuayx0fSx0LnZlcmlmeUNvbmZpZz1mdW5jdGlvbihlKXtpZihcIm51bWJlclwiIT10eXBlb2YgZS5rZXJuZWxTaXplJiYhY2hlY2tBcnJheVR5cGVBbmRMZW5ndGgoZS5rZXJuZWxTaXplLFwibnVtYmVyXCIsMSwyKSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIkNvbnYyRCBleHBlY3RzIGNvbmZpZy5rZXJuZWxTaXplIHRvIGJlIG51bWJlciBvciBudW1iZXJbXSB3aXRoIGxlbmd0aCAxIG9yIDIsIGJ1dCByZWNlaXZlZCBcIitKU09OLnN0cmluZ2lmeShlLmtlcm5lbFNpemUpK1wiLlwiKX0sdC5jbGFzc05hbWU9XCJDb252MkRcIix0fShDb252KTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoQ29udjJEKTt2YXIgQ29udjJEVHJhbnNwb3NlPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIG49ZS5jYWxsKHRoaXMsdCl8fHRoaXM7aWYobi5pbnB1dFNwZWM9W25ldyBJbnB1dFNwZWMoe25kaW06NH0pXSxcInNhbWVcIiE9PW4ucGFkZGluZyYmXCJ2YWxpZFwiIT09bi5wYWRkaW5nKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiQ29udjJEVHJhbnNwb3NlIGN1cnJlbnRseSBzdXBwb3J0cyBvbmx5IHBhZGRpbmcgbW9kZXMgJ3NhbWUnIGFuZCAndmFsaWQnLCBidXQgcmVjZWl2ZWQgcGFkZGluZyBtb2RlIFwiK24ucGFkZGluZyk7cmV0dXJuIG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmJ1aWxkPWZ1bmN0aW9uKGUpe2lmKDQhPT0oZT1nZXRFeGFjdGx5T25lU2hhcGUoZSkpLmxlbmd0aCl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIklucHV0IHNob3VsZCBoYXZlIHJhbmsgNDsgUmVjZWl2ZWQgaW5wdXQgc2hhcGU6IFwiK0pTT04uc3RyaW5naWZ5KGUpKTt2YXIgdD1cImNoYW5uZWxzRmlyc3RcIj09PXRoaXMuZGF0YUZvcm1hdD8xOmUubGVuZ3RoLTE7aWYobnVsbD09ZVt0XSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIlRoZSBjaGFubmVsIGRpbWVuc2lvbiBvZiB0aGUgaW5wdXRzIHNob3VsZCBiZSBkZWZpbmVkLiBGb3VuZCBgTm9uZWAuXCIpO3ZhciBuLHI9ZVt0XSxpPXRoaXMua2VybmVsU2l6ZS5jb25jYXQoW3RoaXMuZmlsdGVycyxyXSk7dGhpcy5rZXJuZWw9dGhpcy5hZGRXZWlnaHQoXCJrZXJuZWxcIixpLFwiZmxvYXQzMlwiLHRoaXMua2VybmVsSW5pdGlhbGl6ZXIsdGhpcy5rZXJuZWxSZWd1bGFyaXplciwhMCx0aGlzLmtlcm5lbENvbnN0cmFpbnQpLHRoaXMudXNlQmlhcyYmKHRoaXMuYmlhcz10aGlzLmFkZFdlaWdodChcImJpYXNcIixbdGhpcy5maWx0ZXJzXSxcImZsb2F0MzJcIix0aGlzLmJpYXNJbml0aWFsaXplcix0aGlzLmJpYXNSZWd1bGFyaXplciwhMCx0aGlzLmJpYXNDb25zdHJhaW50KSksdGhpcy5pbnB1dFNwZWM9W25ldyBJbnB1dFNwZWMoe25kaW06NCxheGVzOihuPXt9LG5bdF09cixuKX0pXSx0aGlzLmJ1aWx0PSEwfSx0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gdGlkeShmdW5jdGlvbigpe3ZhciB0PWdldEV4YWN0bHlPbmVUZW5zb3IoZSk7aWYoNCE9PXQuc2hhcGUubGVuZ3RoKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiQ29udjJEVHJhbnNwb3NlLmNhbGwoKSBleHBlY3RzIGlucHV0IHRlbnNvciB0byBiZSByYW5rLTQsIGJ1dCByZWNlaXZlZCBhIHRlbnNvciBvZiByYW5rLVwiK3Quc2hhcGUubGVuZ3RoKTt2YXIgcixpLGE9dC5zaGFwZSxvPWFbMF07XCJjaGFubmVsc0ZpcnN0XCI9PT1uLmRhdGFGb3JtYXQ/KHI9MixpPTMpOihyPTEsaT0yKTt2YXIgcz1hW3JdLGw9YVtpXSx1PW4ua2VybmVsU2l6ZVswXSxjPW4ua2VybmVsU2l6ZVsxXSxwPW4uc3RyaWRlc1swXSxoPW4uc3RyaWRlc1sxXSxkPVtvLGRlY29udkxlbmd0aChzLHAsdSxuLnBhZGRpbmcpLGRlY29udkxlbmd0aChsLGgsYyxuLnBhZGRpbmcpLG4uZmlsdGVyc107XCJjaGFubmVsc0xhc3RcIiE9PW4uZGF0YUZvcm1hdCYmKHQ9dHJhbnNwb3NlKHQsWzAsMiwzLDFdKSk7dmFyIGc9Y29udjJkVHJhbnNwb3NlKHQsbi5rZXJuZWwucmVhZCgpLGQsbi5zdHJpZGVzLG4ucGFkZGluZyk7cmV0dXJuXCJjaGFubmVsc0xhc3RcIiE9PW4uZGF0YUZvcm1hdCYmKGc9dHJhbnNwb3NlKGcsWzAsMywxLDJdKSksbnVsbCE9bi5iaWFzJiYoZz1iaWFzQWRkKGcsbi5iaWFzLnJlYWQoKSxuLmRhdGFGb3JtYXQpKSxudWxsIT1uLmFjdGl2YXRpb24mJihnPW4uYWN0aXZhdGlvbi5hcHBseShnKSksZ30pfSx0LnByb3RvdHlwZS5jb21wdXRlT3V0cHV0U2hhcGU9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGk9KGU9Z2V0RXhhY3RseU9uZVNoYXBlKGUpKS5zbGljZSgpO1wiY2hhbm5lbHNGaXJzdFwiPT09dGhpcy5kYXRhRm9ybWF0Pyh0PTEsbj0yLHI9Myk6KHQ9MyxuPTEscj0yKTt2YXIgYT10aGlzLmtlcm5lbFNpemVbMF0sbz10aGlzLmtlcm5lbFNpemVbMV0scz10aGlzLnN0cmlkZXNbMF0sbD10aGlzLnN0cmlkZXNbMV07cmV0dXJuIGlbdF09dGhpcy5maWx0ZXJzLGlbbl09ZGVjb252TGVuZ3RoKGlbbl0scyxhLHRoaXMucGFkZGluZyksaVtyXT1kZWNvbnZMZW5ndGgoaVtyXSxsLG8sdGhpcy5wYWRkaW5nKSxpfSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXt2YXIgdD1lLnByb3RvdHlwZS5nZXRDb25maWcuY2FsbCh0aGlzKTtyZXR1cm4gZGVsZXRlIHQuZGlsYXRpb25SYXRlLHR9LHQuY2xhc3NOYW1lPVwiQ29udjJEVHJhbnNwb3NlXCIsdH0oQ29udjJEKTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoQ29udjJEVHJhbnNwb3NlKTt2YXIgU2VwYXJhYmxlQ29udj1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQsbil7dmFyIHI9ZS5jYWxsKHRoaXMsdCxuKXx8dGhpcztpZihyLkRFRkFVTFRfREVQVEhXSVNFX0lOSVRJQUxJWkVSPVwiZ2xvcm90VW5pZm9ybVwiLHIuREVGQVVMVF9QT0lOVFdJU0VfSU5JVElBTElaRVI9XCJnbG9yb3RVbmlmb3JtXCIsci5kZXB0aHdpc2VLZXJuZWw9bnVsbCxyLnBvaW50d2lzZUtlcm5lbD1udWxsLG51bGw9PW4uZmlsdGVycyl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIlRoZSBgZmlsdGVyc2AgY29uZmlndXJhdGlvbiBmaWVsZCBpcyByZXF1aXJlZCBieSBTZXBhcmFibGVDb252LCBidXQgaXMgdW5zcGVjaWZpZWQuXCIpO2lmKG51bGwhPW4ua2VybmVsSW5pdGlhbGl6ZXJ8fG51bGwhPW4ua2VybmVsUmVndWxhcml6ZXJ8fG51bGwhPW4ua2VybmVsQ29uc3RyYWludCl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIkZpZWxkcyBrZXJuZWxJbml0aWFsaXplciwga2VybmVsUmVndWxhcml6ZXIgYW5kIGtlcm5lbENvbnN0cmFpbnQgYXJlIGludmFsaWQgZm9yIFNlcGFyYWJsZUNvbnYyRC4gVXNlIGRlcHRod2lzZUluaXRpYWxpemVyLCBkZXB0aHdpc2VSZWd1bGFyaXplciwgZGVwdGh3aXNlQ29uc3RyYWludCwgcG9pbnR3aXNlSW5pdGlhbGl6ZXIsIHBvaW50d2lzZVJlZ3VsYXJpemVyIGFuZCBwb2ludHdpc2VDb25zdHJhaW50IGluc3RlYWQuXCIpO2lmKG51bGwhPW4ucGFkZGluZyYmXCJzYW1lXCIhPT1uLnBhZGRpbmcmJlwidmFsaWRcIiE9PW4ucGFkZGluZyl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIlNlcGFyYWJsZUNvbnZcIityLnJhbmsrXCJEIHN1cHBvcnRzIG9ubHkgcGFkZGluZyBtb2RlczogJ3NhbWUnIGFuZCAndmFsaWQnLCBidXQgcmVjZWl2ZWQgXCIrSlNPTi5zdHJpbmdpZnkobi5wYWRkaW5nKSk7cmV0dXJuIHIuZGVwdGhNdWx0aXBsaWVyPW51bGw9PW4uZGVwdGhNdWx0aXBsaWVyPzE6bi5kZXB0aE11bHRpcGxpZXIsci5kZXB0aHdpc2VJbml0aWFsaXplcj1nZXRJbml0aWFsaXplcihuLmRlcHRod2lzZUluaXRpYWxpemVyfHxyLkRFRkFVTFRfREVQVEhXSVNFX0lOSVRJQUxJWkVSKSxyLmRlcHRod2lzZVJlZ3VsYXJpemVyPWdldFJlZ3VsYXJpemVyKG4uZGVwdGh3aXNlUmVndWxhcml6ZXIpLHIuZGVwdGh3aXNlQ29uc3RyYWludD1nZXRDb25zdHJhaW50KG4uZGVwdGh3aXNlQ29uc3RyYWludCksci5wb2ludHdpc2VJbml0aWFsaXplcj1nZXRJbml0aWFsaXplcihuLmRlcHRod2lzZUluaXRpYWxpemVyfHxyLkRFRkFVTFRfUE9JTlRXSVNFX0lOSVRJQUxJWkVSKSxyLnBvaW50d2lzZVJlZ3VsYXJpemVyPWdldFJlZ3VsYXJpemVyKG4ucG9pbnR3aXNlUmVndWxhcml6ZXIpLHIucG9pbnR3aXNlQ29uc3RyYWludD1nZXRDb25zdHJhaW50KG4ucG9pbnR3aXNlQ29uc3RyYWludCkscn1yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuYnVpbGQ9ZnVuY3Rpb24oZSl7aWYoKGU9Z2V0RXhhY3RseU9uZVNoYXBlKGUpKS5sZW5ndGg8dGhpcy5yYW5rKzIpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJJbnB1dHMgdG8gU2VwYXJhYmxlQ29udlwiK3RoaXMucmFuaytcIkQgc2hvdWxkIGhhdmUgcmFuayBcIisodGhpcy5yYW5rKzIpK1wiLCBidXQgcmVjZWl2ZWQgaW5wdXQgc2hhcGU6IFwiK0pTT04uc3RyaW5naWZ5KGUpKTt2YXIgdD1cImNoYW5uZWxzRmlyc3RcIj09PXRoaXMuZGF0YUZvcm1hdD8xOmUubGVuZ3RoLTE7aWYobnVsbD09ZVt0XXx8ZVt0XTwwKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiVGhlIGNoYW5uZWwgZGltZW5zaW9uIG9mIHRoZSBpbnB1dHMgc2hvdWxkIGJlIGRlZmluZWQsIGJ1dCBmb3VuZCBcIitKU09OLnN0cmluZ2lmeShlW3RdKSk7Zm9yKHZhciBuPWVbdF0scj10aGlzLmtlcm5lbFNpemUuY29uY2F0KFtuLHRoaXMuZGVwdGhNdWx0aXBsaWVyXSksaT1bXSxhPTA7YTx0aGlzLnJhbms7KythKWkucHVzaCgxKTtpLnB1c2gobip0aGlzLmRlcHRoTXVsdGlwbGllcix0aGlzLmZpbHRlcnMpO3ZhciBvO3RoaXMuZGVwdGh3aXNlS2VybmVsPXRoaXMuYWRkV2VpZ2h0KFwiZGVwdGh3aXNlX2tlcm5lbFwiLHIsXCJmbG9hdDMyXCIsdGhpcy5kZXB0aHdpc2VJbml0aWFsaXplcix0aGlzLmRlcHRod2lzZVJlZ3VsYXJpemVyLCEwLHRoaXMuZGVwdGh3aXNlQ29uc3RyYWludCksdGhpcy5wb2ludHdpc2VLZXJuZWw9dGhpcy5hZGRXZWlnaHQoXCJwb2ludHdpc2Vfa2VybmVsXCIsaSxcImZsb2F0MzJcIix0aGlzLnBvaW50d2lzZUluaXRpYWxpemVyLHRoaXMucG9pbnR3aXNlUmVndWxhcml6ZXIsITAsdGhpcy5wb2ludHdpc2VDb25zdHJhaW50KSx0aGlzLnVzZUJpYXM/dGhpcy5iaWFzPXRoaXMuYWRkV2VpZ2h0KFwiYmlhc1wiLFt0aGlzLmZpbHRlcnNdLFwiZmxvYXQzMlwiLHRoaXMuYmlhc0luaXRpYWxpemVyLHRoaXMuYmlhc1JlZ3VsYXJpemVyLCEwLHRoaXMuYmlhc0NvbnN0cmFpbnQpOnRoaXMuYmlhcz1udWxsLHRoaXMuaW5wdXRTcGVjPVtuZXcgSW5wdXRTcGVjKHtuZGltOnRoaXMucmFuaysyLGF4ZXM6KG89e30sb1t0XT1uLG8pfSldLHRoaXMuYnVpbHQ9ITB9LHQucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7dmFyIHQ7aWYoZT1nZXRFeGFjdGx5T25lVGVuc29yKGUpLDE9PT1uLnJhbmspdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXCIxRCBzZXBhcmFibGUgY29udm9sdXRpb24gaXMgbm90IGltcGxlbWVudGVkIHlldC5cIik7cmV0dXJuIDI9PT1uLnJhbmsmJihcImNoYW5uZWxzRmlyc3RcIj09PW4uZGF0YUZvcm1hdCYmKGU9dHJhbnNwb3NlKGUsWzAsMiwzLDFdKSksdD1zZXBhcmFibGVDb252MmQoZSxuLmRlcHRod2lzZUtlcm5lbC5yZWFkKCksbi5wb2ludHdpc2VLZXJuZWwucmVhZCgpLG4uc3RyaWRlcyxuLnBhZGRpbmcsbi5kaWxhdGlvblJhdGUsXCJOSFdDXCIpKSxuLnVzZUJpYXMmJih0PWJpYXNBZGQodCxuLmJpYXMucmVhZCgpLG4uZGF0YUZvcm1hdCkpLG51bGwhPW4uYWN0aXZhdGlvbiYmKHQ9bi5hY3RpdmF0aW9uLmFwcGx5KHQpKSxcImNoYW5uZWxzRmlyc3RcIj09PW4uZGF0YUZvcm1hdCYmKHQ9dHJhbnNwb3NlKHQsWzAsMywxLDJdKSksdH0pfSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXt2YXIgdD1lLnByb3RvdHlwZS5nZXRDb25maWcuY2FsbCh0aGlzKTtyZXR1cm4gZGVsZXRlIHQucmFuayxkZWxldGUgdC5rZXJuZWxJbml0aWFsaXplcixkZWxldGUgdC5rZXJuZWxSZWd1bGFyaXplcixkZWxldGUgdC5rZXJuZWxDb25zdHJhaW50LHQuZGVwdGh3aXNlSW5pdGlhbGl6ZXI9c2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5kZXB0aHdpc2VJbml0aWFsaXplciksdC5wb2ludHdpc2VJbml0aWFsaXplcj1zZXJpYWxpemVJbml0aWFsaXplcih0aGlzLnBvaW50d2lzZUluaXRpYWxpemVyKSx0LmRlcHRod2lzZVJlZ3VsYXJpemVyPXNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuZGVwdGh3aXNlUmVndWxhcml6ZXIpLHQucG9pbnR3aXNlUmVndWxhcml6ZXI9c2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5wb2ludHdpc2VSZWd1bGFyaXplciksdC5kZXB0aHdpc2VDb25zdHJhaW50PXNlcmlhbGl6ZUNvbnN0cmFpbnQodGhpcy5kZXB0aHdpc2VDb25zdHJhaW50KSx0LnBvaW50d2lzZUNvbnN0cmFpbnQ9c2VyaWFsaXplQ29uc3RyYWludCh0aGlzLnBvaW50d2lzZUNvbnN0cmFpbnQpLHR9LHQuY2xhc3NOYW1lPVwiU2VwYXJhYmxlQ29udlwiLHR9KENvbnYpLFNlcGFyYWJsZUNvbnYyRD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3JldHVybiBlLmNhbGwodGhpcywyLHQpfHx0aGlzfXJldHVybiBfX2V4dGVuZHModCxlKSx0LmNsYXNzTmFtZT1cIlNlcGFyYWJsZUNvbnYyRFwiLHR9KFNlcGFyYWJsZUNvbnYpO3NlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhTZXBhcmFibGVDb252MkQpO3ZhciBDb252MUQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXt2YXIgcj1lLmNhbGwodGhpcywxLG4pfHx0aGlzO3JldHVybiB0LnZlcmlmeUNvbmZpZyhuKSxyLmlucHV0U3BlYz1be25kaW06M31dLHJ9cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmdldENvbmZpZz1mdW5jdGlvbigpe3ZhciB0PWUucHJvdG90eXBlLmdldENvbmZpZy5jYWxsKHRoaXMpO3JldHVybiBkZWxldGUgdC5yYW5rLGRlbGV0ZSB0LmRhdGFGb3JtYXQsdH0sdC52ZXJpZnlDb25maWc9ZnVuY3Rpb24oZSl7aWYoXCJudW1iZXJcIiE9dHlwZW9mIGUua2VybmVsU2l6ZSYmIWNoZWNrQXJyYXlUeXBlQW5kTGVuZ3RoKGUua2VybmVsU2l6ZSxcIm51bWJlclwiLDEsMSkpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJDb252MUQgZXhwZWN0cyBjb25maWcua2VybmVsU2l6ZSB0byBiZSBudW1iZXIgb3IgbnVtYmVyW10gd2l0aCBsZW5ndGggMSwgYnV0IHJlY2VpdmVkIFwiK0pTT04uc3RyaW5naWZ5KGUua2VybmVsU2l6ZSkrXCIuXCIpfSx0LmNsYXNzTmFtZT1cIkNvbnYxRFwiLHR9KENvbnYpO3NlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhDb252MUQpO3ZhciBDcm9wcGluZzJEPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIG49ZS5jYWxsKHRoaXMsdCl8fHRoaXM7cmV0dXJuXCJudW1iZXJcIj09dHlwZW9mIHQuY3JvcHBpbmc/bi5jcm9wcGluZz1bW3QuY3JvcHBpbmcsdC5jcm9wcGluZ10sW3QuY3JvcHBpbmcsdC5jcm9wcGluZ11dOlwibnVtYmVyXCI9PXR5cGVvZiB0LmNyb3BwaW5nWzBdP24uY3JvcHBpbmc9W1t0LmNyb3BwaW5nWzBdLHQuY3JvcHBpbmdbMF1dLFt0LmNyb3BwaW5nWzFdLHQuY3JvcHBpbmdbMV1dXTpuLmNyb3BwaW5nPXQuY3JvcHBpbmcsbi5kYXRhRm9ybWF0PXZvaWQgMD09PXQuZGF0YUZvcm1hdD9cImNoYW5uZWxzTGFzdFwiOnQuZGF0YUZvcm1hdCxuLmlucHV0U3BlYz1be25kaW06NH1dLG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmNvbXB1dGVPdXRwdXRTaGFwZT1mdW5jdGlvbihlKXtyZXR1cm5cImNoYW5uZWxzRmlyc3RcIj09PXRoaXMuZGF0YUZvcm1hdD9bZVswXSxlWzFdLGVbMl0tdGhpcy5jcm9wcGluZ1swXVswXS10aGlzLmNyb3BwaW5nWzBdWzFdLGVbM10tdGhpcy5jcm9wcGluZ1sxXVswXS10aGlzLmNyb3BwaW5nWzFdWzFdXTpbZVswXSxlWzFdLXRoaXMuY3JvcHBpbmdbMF1bMF0tdGhpcy5jcm9wcGluZ1swXVsxXSxlWzJdLXRoaXMuY3JvcHBpbmdbMV1bMF0tdGhpcy5jcm9wcGluZ1sxXVsxXSxlWzNdXX0sdC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXtyZXR1cm4gZT1nZXRFeGFjdGx5T25lVGVuc29yKGUpLFwiY2hhbm5lbHNMYXN0XCI9PT1uLmRhdGFGb3JtYXQ/c2xpY2VBbG9uZ0F4aXMoc2xpY2VBbG9uZ0F4aXMoZSxuLmNyb3BwaW5nWzBdWzBdLGUuc2hhcGVbMV0tbi5jcm9wcGluZ1swXVswXS1uLmNyb3BwaW5nWzBdWzFdLDIpLG4uY3JvcHBpbmdbMV1bMF0sZS5zaGFwZVsyXS1uLmNyb3BwaW5nWzFdWzFdLW4uY3JvcHBpbmdbMV1bMF0sMyk6c2xpY2VBbG9uZ0F4aXMoc2xpY2VBbG9uZ0F4aXMoZSxuLmNyb3BwaW5nWzBdWzBdLGUuc2hhcGVbMl0tbi5jcm9wcGluZ1swXVswXS1uLmNyb3BwaW5nWzBdWzFdLDMpLG4uY3JvcHBpbmdbMV1bMF0sZS5zaGFwZVszXS1uLmNyb3BwaW5nWzFdWzFdLW4uY3JvcHBpbmdbMV1bMF0sNCl9KX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7dmFyIHQ9e2Nyb3BwaW5nOnRoaXMuY3JvcHBpbmcsZGF0YUZvcm1hdDp0aGlzLmRhdGFGb3JtYXR9LG49ZS5wcm90b3R5cGUuZ2V0Q29uZmlnLmNhbGwodGhpcyk7cmV0dXJuIE9iamVjdC5hc3NpZ24odCxuKSx0fSx0LmNsYXNzTmFtZT1cIkNyb3BwaW5nMkRcIix0fShMYXllcik7c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKENyb3BwaW5nMkQpO3ZhciBVcFNhbXBsaW5nMkQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyx0KXx8dGhpcztyZXR1cm4gbi5ERUZBVUxUX1NJWkU9WzIsMl0sbi5pbnB1dFNwZWM9W3tuZGltOjR9XSxuLnNpemU9bnVsbD09dC5zaXplP24uREVGQVVMVF9TSVpFOnQuc2l6ZSxuLmRhdGFGb3JtYXQ9bnVsbD09dC5kYXRhRm9ybWF0P1wiY2hhbm5lbHNMYXN0XCI6dC5kYXRhRm9ybWF0LG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmNvbXB1dGVPdXRwdXRTaGFwZT1mdW5jdGlvbihlKXtpZihcImNoYW5uZWxzRmlyc3RcIj09PXRoaXMuZGF0YUZvcm1hdCl7dmFyIHQ9bnVsbD09ZVsyXT9udWxsOnRoaXMuc2l6ZVswXSplWzJdLG49bnVsbD09ZVszXT9udWxsOnRoaXMuc2l6ZVsxXSplWzNdO3JldHVybltlWzBdLGVbMV0sdCxuXX10PW51bGw9PWVbMV0/bnVsbDp0aGlzLnNpemVbMF0qZVsxXSxuPW51bGw9PWVbMl0/bnVsbDp0aGlzLnNpemVbMV0qZVsyXTtyZXR1cm5bZVswXSx0LG4sZVszXV19LHQucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7dmFyIHQ9Z2V0RXhhY3RseU9uZVRlbnNvcihlKSxyPXQuc2hhcGU7aWYoXCJjaGFubmVsc0ZpcnN0XCI9PT1uLmRhdGFGb3JtYXQpe3Q9dHJhbnNwb3NlKHQsWzAsMiwzLDFdKTt2YXIgaT1uLnNpemVbMF0qclsyXSxhPW4uc2l6ZVsxXSpyWzNdLG89dC5yZXNpemVOZWFyZXN0TmVpZ2hib3IoW2ksYV0pO3JldHVybiB0cmFuc3Bvc2UobyxbMCwzLDEsMl0pfWk9bi5zaXplWzBdKnJbMV0sYT1uLnNpemVbMV0qclsyXTtyZXR1cm4gdC5yZXNpemVOZWFyZXN0TmVpZ2hib3IoW2ksYV0pfSl9LHQucHJvdG90eXBlLmdldENvbmZpZz1mdW5jdGlvbigpe3ZhciB0PXtzaXplOnRoaXMuc2l6ZSxkYXRhRm9ybWF0OnRoaXMuZGF0YUZvcm1hdH0sbj1lLnByb3RvdHlwZS5nZXRDb25maWcuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0LmFzc2lnbih0LG4pLHR9LHQuY2xhc3NOYW1lPVwiVXBTYW1wbGluZzJEXCIsdH0oTGF5ZXIpO2Z1bmN0aW9uIGRlcHRod2lzZUNvbnYyZCQxKGUsdCxuLHIsaSxhKXtyZXR1cm4gdm9pZCAwPT09biYmKG49WzEsMV0pLHZvaWQgMD09PXImJihyPVwidmFsaWRcIiksdGlkeShmdW5jdGlvbigpe251bGw9PWkmJihpPWltYWdlRGF0YUZvcm1hdCgpKSxjaGVja0RhdGFGb3JtYXQoaSk7dmFyIG89cHJlcHJvY2Vzc0NvbnYyRElucHV0KGUsaSk7aWYoNCE9PWUucmFuayl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIklucHV0IGZvciBkZXB0aHdpc2VDb252MmQgaXMgcmVxdWlyZWQgdG8gYmUgNC1ELCBidXQgaXMgaW5zdGVhZCBcIitlLnJhbmsrXCItRFwiKTtpZig0IT09dC5yYW5rKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiZGVwdGh3aXNlS2VybmVsIGlzIHJlcXVpcmVkIHRvIGJlIDQtRCwgYnV0IGlzIGluc3RlYWQgXCIrdC5yYW5rK1wiLURcIik7cmV0dXJuIG89ZGVwdGh3aXNlQ29udjJkKG8sdCxuLFwic2FtZVwiPT09cj9cInNhbWVcIjpcInZhbGlkXCIsXCJOSFdDXCIsYSksXCJjaGFubmVsc0ZpcnN0XCI9PT1pJiYobz10cmFuc3Bvc2UobyxbMCwzLDEsMl0pKSxvfSl9c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFVwU2FtcGxpbmcyRCk7dmFyIERlcHRod2lzZUNvbnYyRD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzLDIsdCl8fHRoaXM7cmV0dXJuIG4uZGVwdGh3aXNlS2VybmVsPW51bGwsbi5kZXB0aE11bHRpcGxpZXI9bnVsbD09dC5kZXB0aE11bHRpcGxpZXI/MTp0LmRlcHRoTXVsdGlwbGllcixuLmRlcHRod2lzZUluaXRpYWxpemVyPWdldEluaXRpYWxpemVyKHQuZGVwdGh3aXNlSW5pdGlhbGl6ZXJ8fG4uREVGQVVMVF9LRVJORUxfSU5JVElBTElaRVIpLG4uZGVwdGh3aXNlQ29uc3RyYWludD1nZXRDb25zdHJhaW50KHQuZGVwdGh3aXNlQ29uc3RyYWludCksbi5kZXB0aHdpc2VSZWd1bGFyaXplcj1nZXRSZWd1bGFyaXplcih0LmRlcHRod2lzZVJlZ3VsYXJpemVyKSxufXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbihlKXtpZigoZT1nZXRFeGFjdGx5T25lU2hhcGUoZSkpLmxlbmd0aDw0KXRocm93IG5ldyBWYWx1ZUVycm9yKFwiSW5wdXRzIHRvIERlcHRod2lzZUNvbnYyRCBzaG91bGQgaGF2ZSByYW5rIDQuIFJlY2VpdmVkIGlucHV0IHNoYXBlOiBcIitKU09OLnN0cmluZ2lmeShlKStcIi5cIik7dmFyIHQ9XCJjaGFubmVsc0ZpcnN0XCI9PT10aGlzLmRhdGFGb3JtYXQ/MTozO2lmKG51bGw9PWVbdF18fGVbdF08MCl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIlRoZSBjaGFubmVsIGRpbWVuc2lvbiBvZiB0aGUgaW5wdXRzIHRvIERlcHRod2lzZUNvbnYyRCBzaG91bGQgYmUgZGVmaW5lZCwgYnV0IGlzIG5vdCAoXCIrZVt0XStcIikuXCIpO3ZhciBuPWVbdF0scj1bdGhpcy5rZXJuZWxTaXplWzBdLHRoaXMua2VybmVsU2l6ZVsxXSxuLHRoaXMuZGVwdGhNdWx0aXBsaWVyXTt0aGlzLmRlcHRod2lzZUtlcm5lbD10aGlzLmFkZFdlaWdodChcImRlcHRod2lzZV9rZXJuZWxcIixyLG51bGwsdGhpcy5kZXB0aHdpc2VJbml0aWFsaXplcix0aGlzLmRlcHRod2lzZVJlZ3VsYXJpemVyLCEwLHRoaXMuZGVwdGh3aXNlQ29uc3RyYWludCksdGhpcy51c2VCaWFzP3RoaXMuYmlhcz10aGlzLmFkZFdlaWdodChcImJpYXNcIixbbip0aGlzLmRlcHRoTXVsdGlwbGllcl0sbnVsbCx0aGlzLmJpYXNJbml0aWFsaXplcix0aGlzLmJpYXNSZWd1bGFyaXplciwhMCx0aGlzLmJpYXNDb25zdHJhaW50KTp0aGlzLmJpYXM9bnVsbCx0aGlzLmJ1aWx0PSEwfSx0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gdGlkeShmdW5jdGlvbigpe3ZhciB0PWRlcHRod2lzZUNvbnYyZCQxKGU9Z2V0RXhhY3RseU9uZVRlbnNvcihlKSxuLmRlcHRod2lzZUtlcm5lbC5yZWFkKCksbi5zdHJpZGVzLG4ucGFkZGluZyxuLmRhdGFGb3JtYXQsbnVsbCk7cmV0dXJuIG4udXNlQmlhcyYmKHQ9Ymlhc0FkZCh0LG4uYmlhcy5yZWFkKCksbi5kYXRhRm9ybWF0KSksbnVsbCE9bi5hY3RpdmF0aW9uJiYodD1uLmFjdGl2YXRpb24uYXBwbHkodCkpLHR9KX0sdC5wcm90b3R5cGUuY29tcHV0ZU91dHB1dFNoYXBlPWZ1bmN0aW9uKGUpe2U9Z2V0RXhhY3RseU9uZVNoYXBlKGUpO3ZhciB0PVwiY2hhbm5lbHNGaXJzdFwiPT09dGhpcy5kYXRhRm9ybWF0P2VbMl06ZVsxXSxuPVwiY2hhbm5lbHNGaXJzdFwiPT09dGhpcy5kYXRhRm9ybWF0P2VbM106ZVsyXSxyPVwiY2hhbm5lbHNGaXJzdFwiPT09dGhpcy5kYXRhRm9ybWF0P2VbMV0qdGhpcy5kZXB0aE11bHRpcGxpZXI6ZVszXSp0aGlzLmRlcHRoTXVsdGlwbGllcixpPWNvbnZPdXRwdXRMZW5ndGgodCx0aGlzLmtlcm5lbFNpemVbMF0sdGhpcy5wYWRkaW5nLHRoaXMuc3RyaWRlc1swXSksYT1jb252T3V0cHV0TGVuZ3RoKG4sdGhpcy5rZXJuZWxTaXplWzFdLHRoaXMucGFkZGluZyx0aGlzLnN0cmlkZXNbMV0pO3JldHVyblwiY2hhbm5lbHNGaXJzdFwiPT09dGhpcy5kYXRhRm9ybWF0P1tlWzBdLHIsaSxhXTpbZVswXSxpLGEscl19LHQucHJvdG90eXBlLmdldENvbmZpZz1mdW5jdGlvbigpe3ZhciB0PWUucHJvdG90eXBlLmdldENvbmZpZy5jYWxsKHRoaXMpO3JldHVybiB0LmRlcHRoTXVsdGlwbGllcj10aGlzLmRlcHRoTXVsdGlwbGllcix0LmRlcHRod2lzZUluaXRpYWxpemVyPXNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMuZGVwdGh3aXNlSW5pdGlhbGl6ZXIpLHQuZGVwdGh3aXNlUmVndWxhcml6ZXI9c2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5kZXB0aHdpc2VSZWd1bGFyaXplciksdC5kZXB0aHdpc2VDb25zdHJhaW50PXNlcmlhbGl6ZUNvbnN0cmFpbnQodGhpcy5kZXB0aHdpc2VSZWd1bGFyaXplciksdH0sdC5jbGFzc05hbWU9XCJEZXB0aHdpc2VDb252MkRcIix0fShCYXNlQ29udik7c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKERlcHRod2lzZUNvbnYyRCk7dmFyIERyb3BvdXQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyx0KXx8dGhpcztpZihuLnJhdGU9TWF0aC5tYXgoTWF0aC5taW4odC5yYXRlLDEpLDApLG4ucmF0ZVNjYWxhcj1nZXRTY2FsYXIobi5yYXRlKSxuLm5vaXNlU2hhcGU9dC5ub2lzZVNoYXBlLG4uc2VlZD10LnNlZWQsbnVsbCE9bi5zZWVkKXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiTm9uLWRlZmF1bHQgc2VlZCBpcyBub3QgaW1wbGVtZW50ZWQgaW4gRHJvcG91dCBsYXllciB5ZXQ6IFwiK24uc2VlZCk7cmV0dXJuIG4uc3VwcG9ydHNNYXNraW5nPSEwLG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmdldE5vaXNlU2hhcGU9ZnVuY3Rpb24oZSl7aWYobnVsbD09dGhpcy5ub2lzZVNoYXBlKXJldHVybiB0aGlzLm5vaXNlU2hhcGU7Zm9yKHZhciB0PWUuc2hhcGUsbj1bXSxyPTA7cjx0aGlzLm5vaXNlU2hhcGUubGVuZ3RoOysrciluLnB1c2gobnVsbD09dGhpcy5ub2lzZVNoYXBlW3JdP3Rbcl06dGhpcy5ub2lzZVNoYXBlW3JdKTtyZXR1cm4gbn0sdC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXtuLmludm9rZUNhbGxIb29rKGUsdCk7dmFyIHI9Z2V0RXhhY3RseU9uZVRlbnNvcihlKTtpZihudWxsIT1uLm5vaXNlU2hhcGUmJiF1dGlsLmFycmF5c0VxdWFsKHIuc2hhcGUsbi5ub2lzZVNoYXBlKSl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcIk5vbi1kZWZhdWx0IG5vaXNlIHNoYXBlIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiBEcm9wb3V0IGxheWVyIHlldDogXCIrSlNPTi5zdHJpbmdpZnkobi5ub2lzZVNoYXBlKSk7aWYoMDxuLnJhdGUmJm4ucmF0ZTwxKXt2YXIgaT1udWxsIT10LnRyYWluaW5nJiZ0LnRyYWluaW5nLGE9bi5nZXROb2lzZVNoYXBlKHIpO3JldHVybiBpblRyYWluUGhhc2UoZnVuY3Rpb24oKXtyZXR1cm4gZHJvcG91dChyLG4ucmF0ZVNjYWxhcixhLG4uc2VlZCl9LGZ1bmN0aW9uKCl7cmV0dXJuIHJ9LGkpfXJldHVybiBlfSl9LHQucHJvdG90eXBlLmdldENvbmZpZz1mdW5jdGlvbigpe3ZhciB0PXtyYXRlOnRoaXMucmF0ZSxub2lzZVNoYXBlOnRoaXMubm9pc2VTaGFwZSxzZWVkOnRoaXMuc2VlZH0sbj1lLnByb3RvdHlwZS5nZXRDb25maWcuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0LmFzc2lnbih0LG4pLHR9LHQuY2xhc3NOYW1lPVwiRHJvcG91dFwiLHR9KExheWVyKTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoRHJvcG91dCk7dmFyIERlbnNlPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIG49ZS5jYWxsKHRoaXMsdCl8fHRoaXM7aWYobi5hY3RpdmF0aW9uPW51bGwsbi51c2VCaWFzPSEwLG4ua2VybmVsPW51bGwsbi5iaWFzPW51bGwsbi5ERUZBVUxUX0tFUk5FTF9JTklUSUFMSVpFUj1cImdsb3JvdE5vcm1hbFwiLG4uREVGQVVMVF9CSUFTX0lOSVRJQUxJWkVSPVwiemVyb3NcIixudWxsPT10LmJhdGNoSW5wdXRTaGFwZSYmbnVsbD09dC5pbnB1dFNoYXBlJiZudWxsIT10LmlucHV0RGltKXt2YXIgcj1udWxsO251bGwhPXQuYmF0Y2hTaXplJiYocj10LmJhdGNoU2l6ZSksbi5iYXRjaElucHV0U2hhcGU9W3IsdC5pbnB1dERpbV19cmV0dXJuIG4udW5pdHM9dC51bml0cyxuLmFjdGl2YXRpb249Z2V0QWN0aXZhdGlvbih0LmFjdGl2YXRpb24pLG51bGwhPXQudXNlQmlhcyYmKG4udXNlQmlhcz10LnVzZUJpYXMpLG4ua2VybmVsSW5pdGlhbGl6ZXI9Z2V0SW5pdGlhbGl6ZXIodC5rZXJuZWxJbml0aWFsaXplcnx8bi5ERUZBVUxUX0tFUk5FTF9JTklUSUFMSVpFUiksbi5iaWFzSW5pdGlhbGl6ZXI9Z2V0SW5pdGlhbGl6ZXIodC5iaWFzSW5pdGlhbGl6ZXJ8fG4uREVGQVVMVF9CSUFTX0lOSVRJQUxJWkVSKSxuLmtlcm5lbENvbnN0cmFpbnQ9Z2V0Q29uc3RyYWludCh0Lmtlcm5lbENvbnN0cmFpbnQpLG4uYmlhc0NvbnN0cmFpbnQ9Z2V0Q29uc3RyYWludCh0LmJpYXNDb25zdHJhaW50KSxuLmtlcm5lbFJlZ3VsYXJpemVyPWdldFJlZ3VsYXJpemVyKHQua2VybmVsUmVndWxhcml6ZXIpLG4uYmlhc1JlZ3VsYXJpemVyPWdldFJlZ3VsYXJpemVyKHQuYmlhc1JlZ3VsYXJpemVyKSxuLmFjdGl2aXR5UmVndWxhcml6ZXI9Z2V0UmVndWxhcml6ZXIodC5hY3Rpdml0eVJlZ3VsYXJpemVyKSxuLmlucHV0U3BlYz1be21pbk5EaW06Mn1dLG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmJ1aWxkPWZ1bmN0aW9uKGUpe3ZhciB0LG49KGU9Z2V0RXhhY3RseU9uZVNoYXBlKGUpKVtlLmxlbmd0aC0xXTtudWxsPT10aGlzLmtlcm5lbCYmKHRoaXMua2VybmVsPXRoaXMuYWRkV2VpZ2h0KFwia2VybmVsXCIsW24sdGhpcy51bml0c10sbnVsbCx0aGlzLmtlcm5lbEluaXRpYWxpemVyLHRoaXMua2VybmVsUmVndWxhcml6ZXIsITAsdGhpcy5rZXJuZWxDb25zdHJhaW50KSx0aGlzLnVzZUJpYXMmJih0aGlzLmJpYXM9dGhpcy5hZGRXZWlnaHQoXCJiaWFzXCIsW3RoaXMudW5pdHNdLG51bGwsdGhpcy5iaWFzSW5pdGlhbGl6ZXIsdGhpcy5iaWFzUmVndWxhcml6ZXIsITAsdGhpcy5iaWFzQ29uc3RyYWludCkpKSx0aGlzLmlucHV0U3BlYz1be21pbk5EaW06MixheGVzOih0PXt9LHRbLTFdPW4sdCl9XSx0aGlzLmJ1aWx0PSEwfSx0LnByb3RvdHlwZS5jb21wdXRlT3V0cHV0U2hhcGU9ZnVuY3Rpb24oZSl7dmFyIHQ9KGU9Z2V0RXhhY3RseU9uZVNoYXBlKGUpKS5zbGljZSgpO3JldHVybiB0W3QubGVuZ3RoLTFdPXRoaXMudW5pdHMsdH0sdC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXtuLmludm9rZUNhbGxIb29rKGUsdCk7dmFyIHI9ZG90KGdldEV4YWN0bHlPbmVUZW5zb3IoZSksbi5rZXJuZWwucmVhZCgpKTtyZXR1cm4gbnVsbCE9bi5iaWFzJiYocj1iaWFzQWRkKHIsbi5iaWFzLnJlYWQoKSkpLG51bGwhPW4uYWN0aXZhdGlvbiYmKHI9bi5hY3RpdmF0aW9uLmFwcGx5KHIpKSxyfSl9LHQucHJvdG90eXBlLmdldENvbmZpZz1mdW5jdGlvbigpe3ZhciB0PXt1bml0czp0aGlzLnVuaXRzLGFjdGl2YXRpb246c2VyaWFsaXplQWN0aXZhdGlvbih0aGlzLmFjdGl2YXRpb24pLHVzZUJpYXM6dGhpcy51c2VCaWFzLGtlcm5lbEluaXRpYWxpemVyOnNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMua2VybmVsSW5pdGlhbGl6ZXIpLGJpYXNJbml0aWFsaXplcjpzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLmJpYXNJbml0aWFsaXplciksa2VybmVsUmVndWxhcml6ZXI6c2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5rZXJuZWxSZWd1bGFyaXplciksYmlhc1JlZ3VsYXJpemVyOnNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYmlhc1JlZ3VsYXJpemVyKSxhY3Rpdml0eVJlZ3VsYXJpemVyOnNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYWN0aXZpdHlSZWd1bGFyaXplciksa2VybmVsQ29uc3RyYWludDpzZXJpYWxpemVDb25zdHJhaW50KHRoaXMua2VybmVsQ29uc3RyYWludCksYmlhc0NvbnN0cmFpbnQ6c2VyaWFsaXplQ29uc3RyYWludCh0aGlzLmJpYXNDb25zdHJhaW50KX0sbj1lLnByb3RvdHlwZS5nZXRDb25maWcuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0LmFzc2lnbih0LG4pLHR9LHQuY2xhc3NOYW1lPVwiRGVuc2VcIix0fShMYXllcik7c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKERlbnNlKTt2YXIgRmxhdHRlbj1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzLHR8fHt9KXx8dGhpcztyZXR1cm4gbi5pbnB1dFNwZWM9W3ttaW5ORGltOjN9XSxufXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5jb21wdXRlT3V0cHV0U2hhcGU9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj0oZT1nZXRFeGFjdGx5T25lU2hhcGUoZSkpLnNsaWNlKDEpO3Q8bi5sZW5ndGg7dCsrKXtpZihudWxsPT1uW3RdKXRocm93IG5ldyBWYWx1ZUVycm9yKCdUaGUgc2hhcGUgb2YgdGhlIGlucHV0IHRvIFwiRmxhdHRlblwiIGlzIG5vdCBmdWxseSBkZWZpbmVkIChnb3QgJytlLnNsaWNlKDEpKycpLiBNYWtlIHN1cmUgdG8gcGFzcyBhIGNvbXBsZXRlIFwiaW5wdXRfc2hhcGVcIiBvciBcImJhdGNoX2lucHV0X3NoYXBlXCIgYXJndW1lbnQgdG8gdGhlIGZpcnN0IGxheWVyIGluIHlvdXIgbW9kZWwuJyl9cmV0dXJuW2VbMF0sYXJyYXlQcm9kKGUsMSldfSx0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gdGlkeShmdW5jdGlvbigpe3JldHVybiBuLmludm9rZUNhbGxIb29rKGUsdCksYmF0Y2hGbGF0dGVuKGdldEV4YWN0bHlPbmVUZW5zb3IoZSkpfSl9LHQuY2xhc3NOYW1lPVwiRmxhdHRlblwiLHR9KExheWVyKTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoRmxhdHRlbik7dmFyIEFjdGl2YXRpb24kMT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzLHQpfHx0aGlzO3JldHVybiBuLnN1cHBvcnRzTWFza2luZz0hMCxuLmFjdGl2YXRpb249Z2V0QWN0aXZhdGlvbih0LmFjdGl2YXRpb24pLG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7bi5pbnZva2VDYWxsSG9vayhlLHQpO3ZhciByPWdldEV4YWN0bHlPbmVUZW5zb3IoZSk7cmV0dXJuIG4uYWN0aXZhdGlvbi5hcHBseShyKX0pfSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXt2YXIgdD17YWN0aXZhdGlvbjpzZXJpYWxpemVBY3RpdmF0aW9uKHRoaXMuYWN0aXZhdGlvbil9LG49ZS5wcm90b3R5cGUuZ2V0Q29uZmlnLmNhbGwodGhpcyk7cmV0dXJuIE9iamVjdC5hc3NpZ24odCxuKSx0fSx0LmNsYXNzTmFtZT1cIkFjdGl2YXRpb25cIix0fShMYXllcik7c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKEFjdGl2YXRpb24kMSk7dmFyIFJlcGVhdFZlY3Rvcj1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzLHQpfHx0aGlzO3JldHVybiBuLm49dC5uLG4uaW5wdXRTcGVjPVt7bmRpbToyfV0sbn1yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuY29tcHV0ZU91dHB1dFNoYXBlPWZ1bmN0aW9uKGUpe3JldHVybltlWzBdLHRoaXMubixlWzFdXX0sdC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXtyZXR1cm4gcmVwZWF0KGU9Z2V0RXhhY3RseU9uZVRlbnNvcihlKSxuLm4pfSl9LHQucHJvdG90eXBlLmdldENvbmZpZz1mdW5jdGlvbigpe3ZhciB0PXtuOnRoaXMubn0sbj1lLnByb3RvdHlwZS5nZXRDb25maWcuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0LmFzc2lnbih0LG4pLHR9LHQuY2xhc3NOYW1lPVwiUmVwZWF0VmVjdG9yXCIsdH0oTGF5ZXIpO3NlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhSZXBlYXRWZWN0b3IpO3ZhciBSZXNoYXBlPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIG49ZS5jYWxsKHRoaXMsdCl8fHRoaXM7bi50YXJnZXRTaGFwZT10LnRhcmdldFNoYXBlO2Zvcih2YXIgcj0wO3I8bi50YXJnZXRTaGFwZS5sZW5ndGg7KytyKW4uaXNVbmtub3duKG4udGFyZ2V0U2hhcGVbcl0pJiYobi50YXJnZXRTaGFwZVtyXT1udWxsKTtyZXR1cm4gbn1yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuaXNVbmtub3duPWZ1bmN0aW9uKGUpe3JldHVybiBlPDB8fG51bGw9PWV9LHQucHJvdG90eXBlLmZpeFVua25vd25EaW1lbnNpb249ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49XCJUb3RhbCBzaXplIG9mIG5ldyBhcnJheSBtdXN0IGJlIHVuY2hhbmdlZC5cIixyPXQuc2xpY2UoKSxpPTEsYT1udWxsLG89MDtvPHIubGVuZ3RoOysrbyl7dmFyIHM9cltvXTtpZih0aGlzLmlzVW5rbm93bihzKSl7aWYobnVsbCE9PWEpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJDYW4gb25seSBzcGVjaWZpeSBvbmUgdW5rbm93biBkaW1lbnNpb24uXCIpO2E9b31lbHNlIGkqPXN9dmFyIGw9YXJyYXlQcm9kKGUpO2lmKG51bGwhPT1hKXtpZigwPT09aXx8bCVpIT0wKXRocm93IG5ldyBWYWx1ZUVycm9yKG4pO3JbYV09bC9pfWVsc2UgaWYobCE9PWkpdGhyb3cgbmV3IFZhbHVlRXJyb3Iobik7cmV0dXJuIHJ9LHQucHJvdG90eXBlLmNvbXB1dGVPdXRwdXRTaGFwZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ITEsbj0wO248ZS5sZW5ndGg7KytuKWlmKHRoaXMuaXNVbmtub3duKGVbbl0pKXt0PSEwO2JyZWFrfXJldHVybiB0P2Uuc2xpY2UoMCwxKS5jb25jYXQodGhpcy50YXJnZXRTaGFwZSk6ZS5zbGljZSgwLDEpLmNvbmNhdCh0aGlzLmZpeFVua25vd25EaW1lbnNpb24oZS5zbGljZSgxKSx0aGlzLnRhcmdldFNoYXBlKSl9LHQucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7bi5pbnZva2VDYWxsSG9vayhlLHQpO3ZhciByPWdldEV4YWN0bHlPbmVUZW5zb3IoZSksaT1yLnNoYXBlLGE9aS5zbGljZSgwLDEpLmNvbmNhdChuLmZpeFVua25vd25EaW1lbnNpb24oaS5zbGljZSgxKSxuLnRhcmdldFNoYXBlKSk7cmV0dXJuIHIucmVzaGFwZShhKX0pfSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXt2YXIgdD17dGFyZ2V0U2hhcGU6dGhpcy50YXJnZXRTaGFwZX0sbj1lLnByb3RvdHlwZS5nZXRDb25maWcuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0LmFzc2lnbih0LG4pLHR9LHQuY2xhc3NOYW1lPVwiUmVzaGFwZVwiLHR9KExheWVyKTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoUmVzaGFwZSk7dmFyIFBlcm11dGU9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyx0KXx8dGhpcztpZihudWxsPT10LmRpbXMpdGhyb3cgbmV3IEVycm9yKFwiUmVxdWlyZWQgY29uZmlndXJhdGlvbiBmaWVsZCBgZGltc2AgaXMgbWlzc2luZyBkdXJpbmcgUGVybXV0ZSBjb25zdHJ1Y3RvciBjYWxsLlwiKTtpZighQXJyYXkuaXNBcnJheSh0LmRpbXMpKXRocm93IG5ldyBFcnJvcihcIlBlcm11dGUgY29uc3RydWN0b3IgcmVxdWlyZXMgYGRpbXNgIHRvIGJlIGFuIEFycmF5LCBidXQgcmVjZWl2ZWQgXCIrdC5kaW1zK1wiIGluc3RlYWQuXCIpO3ZhciByPXJhbmdlKDEsdC5kaW1zLmxlbmd0aCsxKTtpZighdXRpbC5hcnJheXNFcXVhbCh0LmRpbXMuc2xpY2UoKS5zb3J0KCkscikpdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwZXJtdXRhdGlvbiBgZGltc2A6IFwiK0pTT04uc3RyaW5naWZ5KHQuZGltcykrXCIgYGRpbXNgIG11c3QgY29udGFpbiBjb25zZWN1dGl2ZSBpbnRlZ2VycyBzdGFydGluZyBmcm9tIDEuXCIpO3JldHVybiBuLmRpbXM9dC5kaW1zLG4uZGltc0luY2x1ZGluZ0JhdGNoPVswXS5jb25jYXQobi5kaW1zKSxuLmlucHV0U3BlYz1bbmV3IElucHV0U3BlYyh7bmRpbTpuLmRpbXMubGVuZ3RoKzF9KV0sbn1yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuY29tcHV0ZU91dHB1dFNoYXBlPWZ1bmN0aW9uKGUpe3ZhciB0PShlPWdldEV4YWN0bHlPbmVTaGFwZShlKSkuc2xpY2UoKTtyZXR1cm4gdGhpcy5kaW1zLmZvckVhY2goZnVuY3Rpb24obixyKXt0W3IrMV09ZVtuXX0pLHR9LHQucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHJhbnNwb3NlKGdldEV4YWN0bHlPbmVUZW5zb3IoZSksdGhpcy5kaW1zSW5jbHVkaW5nQmF0Y2gpfSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXt2YXIgdD17ZGltczp0aGlzLmRpbXN9LG49ZS5wcm90b3R5cGUuZ2V0Q29uZmlnLmNhbGwodGhpcyk7cmV0dXJuIE9iamVjdC5hc3NpZ24odCxuKSx0fSx0LmNsYXNzTmFtZT1cIlBlcm11dGVcIix0fShMYXllcik7c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFBlcm11dGUpO3ZhciBFbWJlZGRpbmc9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyx0KXx8dGhpcztpZihuLmVtYmVkZGluZ3M9bnVsbCxuLkRFRkFVTFRfRU1CRURESU5HU19JTklUSUFMSVpFUj1cInJhbmRvbVVuaWZvcm1cIixudWxsPT10LmJhdGNoSW5wdXRTaGFwZSYmbnVsbD09dC5pbnB1dFNoYXBlKXt2YXIgcj1udWxsO251bGwhPXQuYmF0Y2hTaXplJiYocj10LmJhdGNoU2l6ZSksbnVsbD09dC5pbnB1dExlbmd0aD9uLmJhdGNoSW5wdXRTaGFwZT1bcixudWxsXTpuLmJhdGNoSW5wdXRTaGFwZT1bcl0uY29uY2F0KHRvTGlzdCh0LmlucHV0TGVuZ3RoKSl9cmV0dXJuIG4uaW5wdXREaW09dC5pbnB1dERpbSxuLm91dHB1dERpbT10Lm91dHB1dERpbSxuLmVtYmVkZGluZ3NJbml0aWFsaXplcj1nZXRJbml0aWFsaXplcih0LmVtYmVkZGluZ3NJbml0aWFsaXplcnx8bi5ERUZBVUxUX0VNQkVERElOR1NfSU5JVElBTElaRVIpLG4uZW1iZWRkaW5nc1JlZ3VsYXJpemVyPWdldFJlZ3VsYXJpemVyKHQuZW1iZWRkaW5nc1JlZ3VsYXJpemVyKSxuLmFjdGl2aXR5UmVndWxhcml6ZXI9Z2V0UmVndWxhcml6ZXIodC5hY3Rpdml0eVJlZ3VsYXJpemVyKSxuLmVtYmVkZGluZ3NDb25zdHJhaW50PWdldENvbnN0cmFpbnQodC5lbWJlZGRpbmdzQ29uc3RyYWludCksbi5tYXNrWmVybz10Lm1hc2taZXJvLG4uaW5wdXRMZW5ndGg9dC5pbnB1dExlbmd0aCxufXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbihlKXt0aGlzLmVtYmVkZGluZ3M9dGhpcy5hZGRXZWlnaHQoXCJlbWJlZGRpbmdzXCIsW3RoaXMuaW5wdXREaW0sdGhpcy5vdXRwdXREaW1dLHRoaXMuZHR5cGUsdGhpcy5lbWJlZGRpbmdzSW5pdGlhbGl6ZXIsdGhpcy5lbWJlZGRpbmdzUmVndWxhcml6ZXIsITAsdGhpcy5lbWJlZGRpbmdzQ29uc3RyYWludCksdGhpcy5idWlsdD0hMH0sdC5wcm90b3R5cGUud2Fybk9uSW5jb21wYXRpYmxlSW5wdXRTaGFwZT1mdW5jdGlvbihlKXt9LHQucHJvdG90eXBlLmNvbXB1dGVNYXNrPWZ1bmN0aW9uKGUsdCl7dGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXCJjb21wdXRlTWFzayBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQgZm9yIEVtYmVkZGluZyB5ZXRcIil9LHQucHJvdG90eXBlLmNvbXB1dGVPdXRwdXRTaGFwZT1mdW5jdGlvbihlKXtpZihlPWdldEV4YWN0bHlPbmVTaGFwZShlKSxudWxsPT10aGlzLmlucHV0TGVuZ3RoKXJldHVybiBlLmNvbmNhdChbdGhpcy5vdXRwdXREaW1dKTt2YXIgdD10b0xpc3QodGhpcy5pbnB1dExlbmd0aCk7aWYodC5sZW5ndGghPT1lLmxlbmd0aC0xKXRocm93IG5ldyBWYWx1ZUVycm9yKCdcImlucHV0TGVuZ3RoXCIgaXMgJyt0aGlzLmlucHV0TGVuZ3RoK1wiLCBidXQgcmVjZWl2ZWQgaW5wdXQgc2hhcGUgaGFzIHNoYXBlIFwiK2UpO2Zvcih2YXIgbj0wLHI9MDtyPHQubGVuZ3RoOysrcil7dmFyIGk9dFtyXSxhPWVbcisxXTtpZihudWxsIT1pJiZudWxsIT1hJiZpIT09YSl0aHJvdyBuZXcgVmFsdWVFcnJvcignXCJpbnB1dExlbmd0aFwiIGlzICcrdGhpcy5pbnB1dExlbmd0aCtcIiwgYnV0IHJlY2VpdmVkIGlucHV0IHNoYXBlIGhhcyBzaGFwZSBcIitlKTtudWxsPT1pJiYodFtuXT1hKSxuKyt9cmV0dXJuW2VbMF1dLmNvbmNhdCh0LFt0aGlzLm91dHB1dERpbV0pfSx0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gdGlkeShmdW5jdGlvbigpe24uaW52b2tlQ2FsbEhvb2soZSx0KTt2YXIgcj1nZXRFeGFjdGx5T25lVGVuc29yKGUpO3JldHVyblwiaW50MzJcIiE9PXIuZHR5cGUmJihyPWNhc3QkMShyLFwiaW50MzJcIikpLGdhdGhlciQxKG4uZW1iZWRkaW5ncy5yZWFkKCksci5hczFEKCkpLnJlc2hhcGUoZ2V0RXhhY3RseU9uZVNoYXBlKG4uY29tcHV0ZU91dHB1dFNoYXBlKHIuc2hhcGUpKSl9KX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7dmFyIHQ9e2lucHV0RGltOnRoaXMuaW5wdXREaW0sb3V0cHV0RGltOnRoaXMub3V0cHV0RGltLGVtYmVkZGluZ3NJbml0aWFsaXplcjpzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLmVtYmVkZGluZ3NJbml0aWFsaXplciksZW1iZWRkaW5nc1JlZ3VsYXJpemVyOnNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuZW1iZWRkaW5nc1JlZ3VsYXJpemVyKSxhY3Rpdml0eVJlZ3VsYXJpemVyOnNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYWN0aXZpdHlSZWd1bGFyaXplciksZW1iZWRkaW5nc0NvbnN0cmFpbnQ6c2VyaWFsaXplQ29uc3RyYWludCh0aGlzLmVtYmVkZGluZ3NDb25zdHJhaW50KSxtYXNrWmVybzp0aGlzLm1hc2taZXJvLGlucHV0TGVuZ3RoOnRoaXMuaW5wdXRMZW5ndGh9LG49ZS5wcm90b3R5cGUuZ2V0Q29uZmlnLmNhbGwodGhpcyk7cmV0dXJuIE9iamVjdC5hc3NpZ24odCxuKSx0fSx0LmNsYXNzTmFtZT1cIkVtYmVkZGluZ1wiLHR9KExheWVyKTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoRW1iZWRkaW5nKTt2YXIgTWVyZ2U9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyx0fHx7fSl8fHRoaXM7cmV0dXJuIG4uc3VwcG9ydHNNYXNraW5nPSEwLG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLm1lcmdlRnVuY3Rpb249ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3J9LHQucHJvdG90eXBlLmNvbXB1dGVFbGVtZW50d2lzZU9wT3V0cHV0U2hhcGU9ZnVuY3Rpb24oZSx0KXtpZihudWxsPT1lfHxudWxsPT10KXJldHVybiBudWxsO2lmKGUubGVuZ3RoPHQubGVuZ3RoKXJldHVybiB0aGlzLmNvbXB1dGVFbGVtZW50d2lzZU9wT3V0cHV0U2hhcGUodCxlKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIGU7Zm9yKHZhciBuPWUuc2xpY2UoMCxlLmxlbmd0aC10Lmxlbmd0aCkscj0wO3I8dC5sZW5ndGg7KytyKXt2YXIgaT1lW2UubGVuZ3RoLXQubGVuZ3RoK3JdLGE9dFtyXTtpZihudWxsPT1pfHxudWxsPT1hfHxpPDB8fGE8MCluLnB1c2gobnVsbCk7ZWxzZSBpZigxPT09aSluLnB1c2goYSk7ZWxzZSBpZigxPT09YSluLnB1c2goaSk7ZWxzZXtpZihpIT09YSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIk9wZXJhbmRzIGNvdWxkIG5vdCBiZSBicm9hZGNhc3QgdG9nZXRoZXIgd2l0aCBzaGFwZXMgXCIrSlNPTi5zdHJpbmdpZnkoZSkrXCIgXCIrSlNPTi5zdHJpbmdpZnkodCkpO24ucHVzaChpKX19cmV0dXJuIG59LHQucHJvdG90eXBlLmJ1aWxkPWZ1bmN0aW9uKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkmJiFBcnJheS5pc0FycmF5KGVbMF0pJiYoZT1bZ2V0RXhhY3RseU9uZVNoYXBlKGUpXSksKGU9ZSkubGVuZ3RoPDIpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJBIG1lcmdlIGxheWVyIHNob3VsZCBiZSBjYWxsZWQgb24gYW4gQXJyYXkgb2YgYXQgbGVhc3QgMiBpbnB1dHMuIEdvdCBcIitlLmxlbmd0aCtcIiBpbnB1dChzKS5cIik7Zm9yKHZhciB0PVtdLG49MCxyPWU7bjxyLmxlbmd0aDtuKyspe251bGwhPShvPXJbbl0pJiZudWxsIT09b1swXSYmdC5wdXNoKG9bMF0pfWlmKCh0PXVuaXF1ZSh0KSkubGVuZ3RoPjEpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJDYW4gbm90IG1lcmdlIHRlbnNvcnMgd2l0aCBkaWZmZXJlbnQgYmF0Y2ggc2l6ZXMuIEdvdCB0ZW5zb3JzIHdpdGggc2hhcGVzOiBcIitKU09OLnN0cmluZ2lmeShlKStcIi5cIik7Zm9yKHZhciBpPW51bGw9PWVbMF0/bnVsbDplWzBdLnNsaWNlKDEpLGE9MTthPGUubGVuZ3RoOysrYSl7dmFyIG89bnVsbD09ZVthXT9udWxsOmVbYV0uc2xpY2UoMSk7aT10aGlzLmNvbXB1dGVFbGVtZW50d2lzZU9wT3V0cHV0U2hhcGUoaSxvKX12YXIgcz1lLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5sZW5ndGh9KTstMT09PWUuaW5kZXhPZihudWxsKSYmMT09PXVuaXF1ZShzKS5sZW5ndGg/dGhpcy5yZXNoYXBlUmVxdWlyZWQ9ITE6dGhpcy5yZXNoYXBlUmVxdWlyZWQ9ITB9LHQucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7aWYoZT1lLG4ucmVzaGFwZVJlcXVpcmVkKXt2YXIgdD1bXSxyPWUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJhbmt9KTtpZigtMT09PXIuaW5kZXhPZihudWxsKSl7Zm9yKHZhciBpPW1heCQxKHIpLGE9MCxvPWU7YTxvLmxlbmd0aDthKyspe2Zvcih2YXIgcz0oaD1vW2FdKS5yYW5rLGw9MDtsPGktczsrK2wpaD1leHBhbmREaW1zKGgsMSk7dC5wdXNoKGgpfXJldHVybiBuLm1lcmdlRnVuY3Rpb24odCl9Zm9yKHZhciB1PSExLGM9MCxwPWU7YzxwLmxlbmd0aDtjKyspe3ZhciBoO2lmKG51bGw9PShzPShoPXBbY10pLnJhbmspKXt2YXIgZD1oLnNoYXBlLGc9ZFswXSxmPWQuc2xpY2UoMSkuY29uY2F0KFtnXSksbT1oLnJlc2hhcGUoW2ddLmNvbmNhdChhcnJheVByb2QoZC5zbGljZSgxKSkpKTttPShtPXRyYW5zcG9zZShtLFsxLDBdKSkucmVzaGFwZShmKSx0LnB1c2gobSksdT0hMH1lbHNlIGlmKHM+MSl7dmFyIHk9cmFuZ2UoMSxzKS5jb25jYXQoWzBdKTt0LnB1c2godHJhbnNwb3NlKGgseSkpLHU9ITB9ZWxzZSB0LnB1c2goaCl9dmFyIHY9bi5tZXJnZUZ1bmN0aW9uKHQpLGI9di5yYW5rO2lmKHUpaWYobnVsbD09Yil7dmFyIHc9di5zaGFwZTtmPVtnPXdbdy5sZW5ndGgtMV1dLmNvbmNhdCh3LnNsaWNlKDAsdy5sZW5ndGgtMSkpO3Y9dHJhbnNwb3NlKHYucmVzaGFwZShbLTEsZ10pLFsxLDBdKS5yZXNoYXBlKGYpfWVsc2UgaWYoYj4xKXt5PVtiLTFdLmNvbmNhdChyYW5nZSgwLGItMSkpO3Y9dHJhbnNwb3NlKHYseSl9cmV0dXJuIHZ9cmV0dXJuIG4ubWVyZ2VGdW5jdGlvbihlKX0pfSx0LnByb3RvdHlwZS5jb21wdXRlT3V0cHV0U2hhcGU9ZnVuY3Rpb24oZSl7dmFyIHQ7dD1udWxsPT0oZT1lKVswXT9udWxsOmVbMF0uc2xpY2UoMSk7Zm9yKHZhciBuPTE7bjxlLmxlbmd0aDsrK24pe3ZhciByPW51bGw9PWVbbl0/bnVsbDplW25dLnNsaWNlKDEpO3Q9dGhpcy5jb21wdXRlRWxlbWVudHdpc2VPcE91dHB1dFNoYXBlKHQscil9Zm9yKHZhciBpPVtdLGE9MCxvPWU7YTxvLmxlbmd0aDthKyspe251bGwhPShyPW9bYV0pJiZudWxsIT09clswXSYmaS5wdXNoKHJbMF0pfXJldHVybiB0PTE9PT0oaT11bmlxdWUoaSkpLmxlbmd0aD9pLmNvbmNhdCh0KTpbbnVsbF0uY29uY2F0KHQpfSx0LnByb3RvdHlwZS5jb21wdXRlTWFzaz1mdW5jdGlvbihlLHQpe3Rocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiY29tcHV0ZU1hc2sgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkIGZvciBNZXJnZSB5ZXRcIil9LHR9KExheWVyKSxBZGQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gZS5jYWxsKHRoaXMsdCl8fHRoaXN9cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLm1lcmdlRnVuY3Rpb249ZnVuY3Rpb24oZSl7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXtmb3IodmFyIHQ9ZVswXS5jbG9uZSgpLG49MTtuPGUubGVuZ3RoOysrbil0PWFkZCh0LGVbbl0pO3JldHVybiB0fSl9LHQuY2xhc3NOYW1lPVwiQWRkXCIsdH0oTWVyZ2UpO3NlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhBZGQpO3ZhciBNdWx0aXBseT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3JldHVybiBlLmNhbGwodGhpcyx0KXx8dGhpc31yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUubWVyZ2VGdW5jdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gdGlkeShmdW5jdGlvbigpe2Zvcih2YXIgdD1lWzBdLmNsb25lKCksbj0xO248ZS5sZW5ndGg7KytuKXQ9bXVsKHQsZVtuXSk7cmV0dXJuIHR9KX0sdC5jbGFzc05hbWU9XCJNdWx0aXBseVwiLHR9KE1lcmdlKTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoTXVsdGlwbHkpO3ZhciBBdmVyYWdlPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIGUuY2FsbCh0aGlzLHQpfHx0aGlzfXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5tZXJnZUZ1bmN0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7Zm9yKHZhciB0PWVbMF0uY2xvbmUoKSxuPTE7bjxlLmxlbmd0aDsrK24pdD1hZGQodCxlW25dKTtyZXR1cm4gbXVsKGdldFNjYWxhcigxL2UubGVuZ3RoKSx0KX0pfSx0LmNsYXNzTmFtZT1cIkF2ZXJhZ2VcIix0fShNZXJnZSk7c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKEF2ZXJhZ2UpO3ZhciBNYXhpbXVtPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIGUuY2FsbCh0aGlzLHQpfHx0aGlzfXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5tZXJnZUZ1bmN0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7Zm9yKHZhciB0PWVbMF0sbj0xO248ZS5sZW5ndGg7KytuKXQ9bWF4aW11bSh0LGVbbl0pO3JldHVybiB0fSl9LHQuY2xhc3NOYW1lPVwiTWF4aW11bVwiLHR9KE1lcmdlKTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoTWF4aW11bSk7dmFyIE1pbmltdW09ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gZS5jYWxsKHRoaXMsdCl8fHRoaXN9cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLm1lcmdlRnVuY3Rpb249ZnVuY3Rpb24oZSl7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXtmb3IodmFyIHQ9ZVswXSxuPTE7bjxlLmxlbmd0aDsrK24pdD1taW5pbXVtKHQsZVtuXSk7cmV0dXJuIHR9KX0sdC5jbGFzc05hbWU9XCJNaW5pbXVtXCIsdH0oTWVyZ2UpO3NlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhNaW5pbXVtKTt2YXIgQ29uY2F0ZW5hdGU9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyx0KXx8dGhpcztyZXR1cm4gbi5ERUZBVUxUX0FYSVM9LTEsbnVsbD09dCYmKHQ9e30pLG4uYXhpcz1udWxsPT10LmF4aXM/bi5ERUZBVUxUX0FYSVM6dC5heGlzLG4uc3VwcG9ydHNNYXNraW5nPSEwLG4ucmVzaGFwZVJlcXVpcmVkPSExLG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmJ1aWxkPWZ1bmN0aW9uKGUpe2lmKCFBcnJheS5pc0FycmF5KGUpfHwhQXJyYXkuaXNBcnJheShlWzBdKXx8MT09PWUubGVuZ3RoKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiQSBgQ29uY2F0ZW5hdGVgIGxheWVyIHNob3VsZCBiZSBjYWxsZWQgb24gYSBsaXN0IG9mIGF0IGxlYXN0IDIgaW5wdXRzXCIpO2Zvcih2YXIgdD0hMCxuPTAscj1lPWU7bjxyLmxlbmd0aDtuKyspe2lmKG51bGwhPShjPXJbbl0pKXt0PSExO2JyZWFrfX1pZighdCl7Zm9yKHZhciBpPVtdLGE9MDthPGUubGVuZ3RoOysrYSl7dmFyIG89ZVthXS5zbGljZSgpO28uc3BsaWNlKHRoaXMuYXhpcywxKTtmb3IodmFyIHM9ITEsbD0wLHU9aTtsPHUubGVuZ3RoO2wrKyl7dmFyIGM9dVtsXTtpZih1dGlsLmFycmF5c0VxdWFsKGMsbykpe3M9ITA7YnJlYWt9fXN8fGkucHVzaChvKX1pZihpLmxlbmd0aD4xKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiQSBgQ29uY2F0ZW5hdGVgIGxheWVyIHJlcXVpcmVzIGlucHV0cyB3aXRoIG1hdGNoaW5nIHNoYXBlcyBleGNlcHQgZm9yIHRoZSBjb25jYXQgYXhpcy4gR290IGlucHV0IHNoYXBlczogXCIrSlNPTi5zdHJpbmdpZnkoZSkpfX0sdC5wcm90b3R5cGUubWVyZ2VGdW5jdGlvbj1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7cmV0dXJuIGNvbmNhdGVuYXRlKGUsdC5heGlzKX0pfSx0LnByb3RvdHlwZS5jb21wdXRlT3V0cHV0U2hhcGU9ZnVuY3Rpb24oZSl7aWYoIUFycmF5LmlzQXJyYXkoZSl8fCFBcnJheS5pc0FycmF5KGVbMF0pKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiQSBgQ29uY2F0ZW5hdGVgIGxheWVyIHNob3VsZCBiZSBjYWxsZWQgb24gYSBsaXN0IG9mIGlucHV0cy5cIik7Zm9yKHZhciB0PWUsbj10WzBdLnNsaWNlKCkscj10aGlzLmF4aXM8MD9uLmxlbmd0aCt0aGlzLmF4aXM6dGhpcy5heGlzLGk9MCxhPXQuc2xpY2UoMSk7aTxhLmxlbmd0aDtpKyspe3ZhciBvPWFbaV07aWYobnVsbD09bltyXXx8bnVsbD09b1tyXSl7bltyXT1udWxsO2JyZWFrfW5bcl0rPW9bcl19cmV0dXJuIG59LHQucHJvdG90eXBlLmNvbXB1dGVNYXNrPWZ1bmN0aW9uKGUsdCl7dGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXCJjb21wdXRlTWFzayBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQgZm9yIENvbmNhdGVuYXRlIHlldFwiKX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7dmFyIHQ9e2F4aXM6dGhpcy5heGlzfSxuPWUucHJvdG90eXBlLmdldENvbmZpZy5jYWxsKHRoaXMpO3JldHVybiBPYmplY3QuYXNzaWduKHQsbiksdH0sdC5jbGFzc05hbWU9XCJDb25jYXRlbmF0ZVwiLHR9KE1lcmdlKTtmdW5jdGlvbiBpbnRlcnByZXRBeGlzKGUsdCl7Zm9yKDtlPDA7KWUrPXQ7cmV0dXJuIGV9ZnVuY3Rpb24gYmF0Y2hEb3QoZSx0LG4pe2lmKGUuc2hhcGUubGVuZ3RoPjN8fHQuc2hhcGUubGVuZ3RoPjMpdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXCJiYXRjaERvdCBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIHRlbnNvcnMgb2YgNEQgb3IgaGlnaGVyIHJhbmsgeWV0XCIpO2lmKHV0aWwuYXNzZXJ0KGUuc2hhcGUubGVuZ3RoPj0yLFwiYmF0Y2hEb3QgcmVxdWlyZXMgdGhlIHJhbmsgb2YgeCB0byBiZSA+PSAyLCBidXQgZ290IFwiK2Uuc2hhcGUubGVuZ3RoKSx1dGlsLmFzc2VydChlLnNoYXBlLmxlbmd0aD49MixcImJhdGNoRG90IHJlcXVpcmVzIHRoZSByYW5rIG9mIHkgdG8gYmUgPj0gMiwgYnV0IGdvdCBcIit0LnNoYXBlLmxlbmd0aCksXCJudW1iZXJcIj09dHlwZW9mIG4mJihuPVtuLG5dKSxcImNvbXBsZXg2NFwiPT09ZS5kdHlwZXx8XCJjb21wbGV4NjRcIj09PXQuZHR5cGUpdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXCJiYXRjaERvdCBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIGNvbXBsZXg2NC10eXBlIFRlbnNvcnMgeWV0LlwiKTt2YXIgcj1lLnNoYXBlLmxlbmd0aCxpPXQuc2hhcGUubGVuZ3RoO251bGw9PW4mJihuPVtyLTEsaS0yXSk7dmFyIGE9bjtyZXR1cm4gdGlkeShmdW5jdGlvbigpe3ZhciBuLG87aWYocj5pKXtuPXItaTtmb3IodmFyIHM9W10sbD0wO2w8bjsrK2wpcy5wdXNoKDEpO3Q9dC5yZXNoYXBlKHQuc2hhcGUuY29uY2F0KHMpKX1lbHNlIGlmKGk+cil7bj1pLXI7Zm9yKHM9W10sbD0wO2w8bjsrK2wpcy5wdXNoKDEpO2U9ZS5yZXNoYXBlKGUuc2hhcGUuY29uY2F0KHMpKX1lbHNlIG49MDtpZigyPT09ZS5zaGFwZS5sZW5ndGgmJjI9PT10LnNoYXBlLmxlbmd0aClvPWFbMF09PT1hWzFdP2UubXVsU3RyaWN0KHQpLnN1bShhWzBdKTplLnRyYW5zcG9zZShbMSwwXSkubXVsU3RyaWN0KHQpLnN1bShhWzFdKTtlbHNle3ZhciB1PWFbMF0hPT1lLnNoYXBlLmxlbmd0aC0xfHxudWxsLGM9YVsxXT09PXQuc2hhcGUubGVuZ3RoLTF8fG51bGw7bz1lLm1hdE11bCh0LHUsYyl9aWYobj4wKXt2YXIgcD12b2lkIDAsaD1bXTtmb3IobD1wPXI+aT9yK2ktMzpyLTE7bDxwK247KytsKWgucHVzaChsKTtvPW8uc3F1ZWV6ZShoKX1yZXR1cm4gMT09PW8uc2hhcGUubGVuZ3RoJiYobz1vLmV4cGFuZERpbXMoMSkpLG99KX1zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoQ29uY2F0ZW5hdGUpO3ZhciBEb3Q9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyx0KXx8dGhpcztyZXR1cm4gbi5heGVzPXQuYXhlcyxuLm5vcm1hbGl6ZT1udWxsIT10Lm5vcm1hbGl6ZSYmdC5ub3JtYWxpemUsbi5zdXBwb3J0c01hc2tpbmc9ITAsbi5yZXNoYXBlUmVxdWlyZWQ9ITEsbn1yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuYnVpbGQ9ZnVuY3Rpb24oZSl7dXRpbC5hc3NlcnQoQXJyYXkuaXNBcnJheShlKSYmMj09PWUubGVuZ3RoJiZBcnJheS5pc0FycmF5KGVbMF0pJiZBcnJheS5pc0FycmF5KGVbMV0pLFwiQSBgRG90YCBsYXllciBzaG91bGQgYmUgY2FsbGVkIG9uIGEgbGlzdCBvZiBleGFjdGx5IDIgaW5wdXRzLlwiKTt2YXIgdD1lWzBdLG49ZVsxXTtpZih0Lmxlbmd0aD4zfHxuLmxlbmd0aD4zKXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiRG90IGxheWVyIGRvZXMgbm90IHN1cHBvcnQgdGVuc29ycyBvZiA0RCBvciBoaWdoZXIgcmFuayB5ZXQuXCIpO3ZhciByPXRoaXMuaW50ZXJwcmV0QXhlcyh0LG4pO2lmKHRbclswXV0hPT1uW3JbMV1dKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiRGltZW5zaW9uIGluY29tcGF0aWJpbGl0eTogXCIrdFtyWzBdXStcIiAhPT0gXCIrbltyWzFdXSl9LHQucHJvdG90eXBlLm1lcmdlRnVuY3Rpb249ZnVuY3Rpb24oZSl7aWYoMiE9PWUubGVuZ3RoKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiQSBgRG90YCBsYXllciBtdXN0IGJlIGNhbGxlZCBvbiBleGFjdGx5IDIgaW5wdXRzLCBidXQgcmVjZWl2ZWQgXCIrZS5sZW5ndGgrXCIgaW5wdXQocykuXCIpO3ZhciB0LG49ZVswXSxyPWVbMV07cmV0dXJuIHQ9QXJyYXkuaXNBcnJheSh0aGlzLmF4ZXMpP3RoaXMuYXhlcy5tYXAoZnVuY3Rpb24odCxuKXtyZXR1cm4gaW50ZXJwcmV0QXhpcyh0LGVbbl0uc2hhcGUubGVuZ3RoKX0pOltpbnRlcnByZXRBeGlzKHRoaXMuYXhlcyxuLnNoYXBlLmxlbmd0aCksaW50ZXJwcmV0QXhpcyh0aGlzLmF4ZXMsci5zaGFwZS5sZW5ndGgpXSx0aGlzLm5vcm1hbGl6ZSYmKG49bDJOb3JtYWxpemUobix0WzBdKSxyPWwyTm9ybWFsaXplKHIsdFsxXSkpLGJhdGNoRG90KG4scix0KX0sdC5wcm90b3R5cGUuaW50ZXJwcmV0QXhlcz1mdW5jdGlvbihlLHQpe3JldHVybiBBcnJheS5pc0FycmF5KHRoaXMuYXhlcyk/dGhpcy5heGVzOltpbnRlcnByZXRBeGlzKHRoaXMuYXhlcyxlLmxlbmd0aCksaW50ZXJwcmV0QXhpcyh0aGlzLmF4ZXMsdC5sZW5ndGgpXX0sdC5wcm90b3R5cGUuY29tcHV0ZU91dHB1dFNoYXBlPWZ1bmN0aW9uKGUpe3V0aWwuYXNzZXJ0KEFycmF5LmlzQXJyYXkoZSkmJjI9PT1lLmxlbmd0aCYmQXJyYXkuaXNBcnJheShlWzBdKSYmQXJyYXkuaXNBcnJheShlWzFdKSxcIkEgYERvdGAgbGF5ZXIgc2hvdWxkIGJlIGNhbGxlZCBvbiBhIGxpc3Qgb2YgZXhhY3RseSAyIGlucHV0cy5cIik7dmFyIHQ9ZVswXSxuPWVbMV07aWYodC5sZW5ndGg+M3x8bi5sZW5ndGg+Myl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcIkRvdCBsYXllciBkb2VzIG5vdCBzdXBwb3J0IHRlbnNvcnMgb2YgNEQgb3IgaGlnaGVyIHJhbmsgeWV0LlwiKTt2YXIgcj10aGlzLmludGVycHJldEF4ZXModCxuKTt0LnNwbGljZShyWzBdLDEpLG4uc3BsaWNlKHJbMV0sMSksbi5zcGxpY2UoMCwxKTt2YXIgaT10LmNvbmNhdChuKTtyZXR1cm4gMT09PWkubGVuZ3RoJiZpLnB1c2goMSksaX0sdC5wcm90b3R5cGUuY29tcHV0ZU1hc2s9ZnVuY3Rpb24oZSx0KXt0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcImNvbXB1dGVNYXNrIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCBmb3IgRG90IHlldFwiKX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7dmFyIHQ9e2F4ZXM6dGhpcy5heGVzLG5vcm1hbGl6ZTp0aGlzLm5vcm1hbGl6ZX0sbj1lLnByb3RvdHlwZS5nZXRDb25maWcuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0LmFzc2lnbih0LG4pLHR9LHQuY2xhc3NOYW1lPVwiRG90XCIsdH0oTWVyZ2UpO2Z1bmN0aW9uIGJhdGNoTm9ybWFsaXphdGlvbihlLHQsbixyLGksYSl7dmFyIG87aWYodm9pZCAwPT09YSYmKGE9LjAwMSksMj09PWUucmFuaylvPWJhdGNoTm9ybWFsaXphdGlvbjJkKGUsdCxuLGEsaSxyKTtlbHNlIGlmKDM9PT1lLnJhbmspbz1iYXRjaE5vcm1hbGl6YXRpb24zZChlLHQsbixhLGkscik7ZWxzZXtpZig0IT09ZS5yYW5rKXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiYmF0Y2hOb3JtYWxpemF0aW9uIGlzIG5vdCBpbXBsZW1lbW50ZWQgZm9yIGFycmF5IG9mIHJhbmsgXCIrZS5yYW5rK1wiIHlldFwiKTtvPWJhdGNoTm9ybWFsaXphdGlvbjRkKGUsdCxuLGEsaSxyKX1yZXR1cm4gb31mdW5jdGlvbiByZWd1bGFyTm9ybWFsaXplQmF0Y2hJblRyYWluaW5nKGUsdCxuLHIsaSl7cmV0dXJuIHZvaWQgMD09PWkmJihpPS4wMDEpLHRpZHkoZnVuY3Rpb24oKXt2YXIgYT1tb21lbnRzKGUsciksbz1hLm1lYW4scz1hLnZhcmlhbmNlO3JldHVybltiYXRjaE5vcm1hbGl6YXRpb24oZSxvLHMsbix0LGkpLG8sc119KX1mdW5jdGlvbiBicm9hZGNhc3ROb3JtYWxpemVCYXRjaEluVHJhaW5pbmcoZSx0LG4scixpKXtyZXR1cm4gdm9pZCAwPT09aSYmKGk9LjAwMSksdGlkeShmdW5jdGlvbigpe2Zvcih2YXIgYT1tb21lbnRzKGUsciksbz1hLm1lYW4scz1hLnZhcmlhbmNlLGw9W10sdT0wLGM9cmFuZ2UoMCxlLnJhbmspO3U8Yy5sZW5ndGg7dSsrKXt2YXIgcD1jW3VdOy0xIT09ci5pbmRleE9mKHApP2wucHVzaCgxKTpsLnB1c2goZS5zaGFwZVtwXSl9dmFyIGg9by5yZXNoYXBlKGwpLGQ9cy5yZXNoYXBlKGwpLGc9bnVsbD09dD9udWxsOnQucmVzaGFwZShsKSxmPW51bGw9PW4/bnVsbDpuLnJlc2hhcGUobCk7cmV0dXJuW2JhdGNoTm9ybWFsaXphdGlvbihlLGgsZCxmLGcsaSksbyxzXX0pfWZ1bmN0aW9uIG5vcm1hbGl6ZUJhdGNoSW5UcmFpbmluZyhlLHQsbixyLGkpe3JldHVybiB2b2lkIDA9PT1pJiYoaT0uMDAxKSx1dGlsLmFycmF5c0VxdWFsKHIuc2xpY2UoKS5zb3J0KCkscmFuZ2UoMCxlLnJhbmstMSkpP3JlZ3VsYXJOb3JtYWxpemVCYXRjaEluVHJhaW5pbmcoZSx0LG4scixpKTpicm9hZGNhc3ROb3JtYWxpemVCYXRjaEluVHJhaW5pbmcoZSx0LG4scixpKX1zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoRG90KTt2YXIgQmF0Y2hOb3JtYWxpemF0aW9uPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIG49dGhpcztyZXR1cm4gbnVsbD09dCYmKHQ9e30pLChuPWUuY2FsbCh0aGlzLHQpfHx0aGlzKS5zdXBwb3J0c01hc2tpbmc9ITAsbi5heGlzPW51bGw9PXQuYXhpcz8tMTp0LmF4aXMsbi5tb21lbnR1bT1udWxsPT10Lm1vbWVudHVtPy45OTp0Lm1vbWVudHVtLG4uZXBzaWxvbj1udWxsPT10LmVwc2lsb24/LjAwMTp0LmVwc2lsb24sbi5jZW50ZXI9bnVsbD09dC5jZW50ZXJ8fHQuY2VudGVyLG4uc2NhbGU9bnVsbD09dC5zY2FsZXx8dC5zY2FsZSxuLmJldGFJbml0aWFsaXplcj1nZXRJbml0aWFsaXplcih0LmJldGFJbml0aWFsaXplcnx8XCJ6ZXJvc1wiKSxuLmdhbW1hSW5pdGlhbGl6ZXI9Z2V0SW5pdGlhbGl6ZXIodC5nYW1tYUluaXRpYWxpemVyfHxcIm9uZXNcIiksbi5tb3ZpbmdNZWFuSW5pdGlhbGl6ZXI9Z2V0SW5pdGlhbGl6ZXIodC5tb3ZpbmdNZWFuSW5pdGlhbGl6ZXJ8fFwiemVyb3NcIiksbi5tb3ZpbmdWYXJpYW5jZUluaXRpYWxpemVyPWdldEluaXRpYWxpemVyKHQubW92aW5nVmFyaWFuY2VJbml0aWFsaXplcnx8XCJvbmVzXCIpLG4uYmV0YUNvbnN0cmFpbnQ9Z2V0Q29uc3RyYWludCh0LmJldGFDb25zdHJhaW50KSxuLmdhbW1hQ29uc3RyYWludD1nZXRDb25zdHJhaW50KHQuZ2FtbWFDb25zdHJhaW50KSxuLmJldGFSZWd1bGFyaXplcj1nZXRSZWd1bGFyaXplcih0LmJldGFSZWd1bGFyaXplciksbi5nYW1tYVJlZ3VsYXJpemVyPWdldFJlZ3VsYXJpemVyKHQuZ2FtbWFSZWd1bGFyaXplciksbi5zdGVwQ291bnQ9MCxufXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbihlKXtlPWdldEV4YWN0bHlPbmVTaGFwZShlKTt2YXIgdD10aGlzLmF4aXM+PTA/dGhpcy5heGlzOnRoaXMuYXhpcytlLmxlbmd0aCxuPWVbdF07aWYobnVsbD09bil0aHJvdyBuZXcgVmFsdWVFcnJvcihcIkF4aXMgXCIrdCtcIiBvZiBpbnB1dCB0ZW5zb3Igc2hvdWxkIGhhdmUgYSBkZWZpbmVkIGRpbWVuc2lvbiBidXQgdGhlIGxheWVyIHJlY2VpdmVkIGFuIGlucHV0IHdpdGggc2hhcGUgXCIrSlNPTi5zdHJpbmdpZnkoZSkrXCIuXCIpO3RoaXMuaW5wdXRTcGVjPVtuZXcgSW5wdXRTcGVjKHtuZGltOmUubGVuZ3RoLGF4ZXM6KHI9e30sclt0XT1uLHIpfSldO3ZhciByLGk9W25dO3RoaXMuc2NhbGUmJih0aGlzLmdhbW1hPXRoaXMuYWRkV2VpZ2h0KFwiZ2FtbWFcIixpLG51bGwsdGhpcy5nYW1tYUluaXRpYWxpemVyLHRoaXMuZ2FtbWFSZWd1bGFyaXplciwhMCx0aGlzLmdhbW1hQ29uc3RyYWludCkpLHRoaXMuY2VudGVyJiYodGhpcy5iZXRhPXRoaXMuYWRkV2VpZ2h0KFwiYmV0YVwiLGksbnVsbCx0aGlzLmJldGFJbml0aWFsaXplcix0aGlzLmJldGFSZWd1bGFyaXplciwhMCx0aGlzLmJldGFDb25zdHJhaW50KSksdGhpcy5tb3ZpbmdNZWFuPXRoaXMuYWRkV2VpZ2h0KFwibW92aW5nX21lYW5cIixpLG51bGwsdGhpcy5tb3ZpbmdNZWFuSW5pdGlhbGl6ZXIsbnVsbCwhMSksdGhpcy5tb3ZpbmdWYXJpYW5jZT10aGlzLmFkZFdlaWdodChcIm1vdmluZ192YXJpYW5jZVwiLGksbnVsbCx0aGlzLm1vdmluZ1ZhcmlhbmNlSW5pdGlhbGl6ZXIsbnVsbCwhMSksdGhpcy5idWlsdD0hMH0sdC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXt2YXIgcj1udWxsIT10LnRyYWluaW5nJiZ0LnRyYWluaW5nLGk9Z2V0RXhhY3RseU9uZVRlbnNvcihlKSxhPWkuc2hhcGUsbz1hLmxlbmd0aCxzPXJhbmdlKDAsbyksbD1uLmF4aXM+PTA/bi5heGlzOm4uYXhpcytvO3Muc3BsaWNlKGwsMSk7dmFyIHU9cHlMaXN0UmVwZWF0KDEsbyk7dVtsXT1hW2xdO3ZhciBjPXMuc2xpY2UoKTtjLnNvcnQoKTt2YXIgcD0hdXRpbC5hcnJheXNFcXVhbChjLHJhbmdlKDAsbykuc2xpY2UoMCxvLTEpKTtpZighcilyZXR1cm4gZnVuY3Rpb24oKXtpZihwKXt2YXIgZT1uLm1vdmluZ01lYW4ucmVhZCgpLnJlc2hhcGUodSksdD1uLm1vdmluZ1ZhcmlhbmNlLnJlYWQoKS5yZXNoYXBlKHUpLHI9bi5jZW50ZXI/bi5iZXRhLnJlYWQoKS5yZXNoYXBlKHUpOm51bGwsYT1uLnNjYWxlP24uZ2FtbWEucmVhZCgpLnJlc2hhcGUodSk6bnVsbDtyZXR1cm4gYmF0Y2hOb3JtYWxpemF0aW9uKGksZSx0LHIsYSxuLmVwc2lsb24pfXJldHVybiBiYXRjaE5vcm1hbGl6YXRpb24oaSxuLm1vdmluZ01lYW4ucmVhZCgpLG4ubW92aW5nVmFyaWFuY2UucmVhZCgpLG51bGw9PW4uYmV0YT9udWxsOm4uYmV0YS5yZWFkKCksbnVsbD09bi5nYW1tYT9udWxsOm4uZ2FtbWEucmVhZCgpLG4uZXBzaWxvbil9KCk7dmFyIGg9bm9ybWFsaXplQmF0Y2hJblRyYWluaW5nKGksbi5nYW1tYS5yZWFkKCksbi5iZXRhLnJlYWQoKSxzLG4uZXBzaWxvbiksZD1oWzBdLGc9aFsxXSxmPWhbMl0sbT1hcnJheVByb2Qocy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGkuc2hhcGVbZV19KSkseT1mLm11bChnZXRTY2FsYXIobS8obS0oMStuLmVwc2lsb24pKSkpO3JldHVybiBmdW5jdGlvbigpe24uc3RlcENvdW50Kys7dmFyIGU9bW92aW5nQXZlcmFnZShuLm1vdmluZ01lYW4ucmVhZCgpLGcsbi5tb21lbnR1bSxuLnN0ZXBDb3VudCk7bi5tb3ZpbmdNZWFuLndyaXRlKGUpO3ZhciB0PW1vdmluZ0F2ZXJhZ2Uobi5tb3ZpbmdWYXJpYW5jZS5yZWFkKCkseSxuLm1vbWVudHVtLG4uc3RlcENvdW50KTtuLm1vdmluZ1ZhcmlhbmNlLndyaXRlKHQpfSgpLGR9KX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7dmFyIHQ9e2F4aXM6dGhpcy5heGlzLG1vbWVudHVtOnRoaXMubW9tZW50dW0sZXBzaWxvbjp0aGlzLmVwc2lsb24sY2VudGVyOnRoaXMuY2VudGVyLHNjYWxlOnRoaXMuc2NhbGUsYmV0YUluaXRpYWxpemVyOnNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMuYmV0YUluaXRpYWxpemVyKSxnYW1tYUluaXRpYWxpemVyOnNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMuZ2FtbWFJbml0aWFsaXplciksbW92aW5nTWVhbkluaXRpYWxpemVyOnNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMubW92aW5nTWVhbkluaXRpYWxpemVyKSxtb3ZpbmdWYXJpYW5jZUluaXRpYWxpemVyOnNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMubW92aW5nVmFyaWFuY2VJbml0aWFsaXplciksYmV0YVJlZ3VsYXJpemVyOnNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYmV0YVJlZ3VsYXJpemVyKSxnYW1tYVJlZ3VsYXJpemVyOnNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuZ2FtbWFSZWd1bGFyaXplciksYmV0YUNvbnN0cmFpbnQ6c2VyaWFsaXplQ29uc3RyYWludCh0aGlzLmJldGFDb25zdHJhaW50KSxnYW1tYUNvbnN0cmFpbnQ6c2VyaWFsaXplQ29uc3RyYWludCh0aGlzLmdhbW1hQ29uc3RyYWludCl9LG49ZS5wcm90b3R5cGUuZ2V0Q29uZmlnLmNhbGwodGhpcyk7cmV0dXJuIE9iamVjdC5hc3NpZ24odCxuKSx0fSx0LmNsYXNzTmFtZT1cIkJhdGNoTm9ybWFsaXphdGlvblwiLHR9KExheWVyKTtmdW5jdGlvbiBzcGF0aWFsMmRQYWRkaW5nKGUsdCxuKXtyZXR1cm4gdGlkeShmdW5jdGlvbigpe2lmKDQhPT1lLnJhbmspdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJ0ZW1wb3JhbFBhZGRpbmcgZXhwZWN0cyBpbnB1dCB0ZW5zb3IgdG8gYmUgNC1ELCBidXQgcmVjZWl2ZWQgYSBcIitlLnJhbmsrXCItRCB0ZW5zb3IuXCIpO2lmKG51bGw9PXQmJih0PVtbMSwxXSxbMSwxXV0pLDIhPT10Lmxlbmd0aHx8MiE9PXRbMF0ubGVuZ3RofHwyIT09dFsxXS5sZW5ndGgpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJzcGF0aWFsMmRQYWRkaW5nIGV4cGVjdHMgYHBhZGRpbmdgIHRvIGJlIGFuIEFycmF5IG9mIHR3byBBcnJheXMsIGVhY2ggb2Ygd2hpY2ggaXMgYW4gQXJyYXkgb2YgdHdvIGludGVnZXJzLlwiKTtpZihudWxsPT1uJiYobj1pbWFnZURhdGFGb3JtYXQoKSksXCJjaGFubmVsc0xhc3RcIiE9PW4mJlwiY2hhbm5lbHNGaXJzdFwiIT09bil0aHJvdyBuZXcgVmFsdWVFcnJvcihcIlVua25vd24gZGF0YSBmb3JtYXQ6IFwiK24rXCIuIFN1cHBvcnRlZCBkYXRhIGZvcm1hdHMgYXJlICdjaGFubmVsc0xhc3QnIGFuZCAnY2hhbm5lbHNGaXJzdC5cIik7dmFyIHI7cmV0dXJuIHI9XCJjaGFubmVsc0ZpcnN0XCI9PT1uP1tbMCwwXSxbMCwwXSx0WzBdLHRbMV1dOltbMCwwXSx0WzBdLHRbMV0sWzAsMF1dLHBhZChlLHIpfSl9c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKEJhdGNoTm9ybWFsaXphdGlvbik7dmFyIFplcm9QYWRkaW5nMkQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj10aGlzO2lmKG51bGw9PXQmJih0PXt9KSwobj1lLmNhbGwodGhpcyx0KXx8dGhpcykuZGF0YUZvcm1hdD1udWxsPT10LmRhdGFGb3JtYXQ/aW1hZ2VEYXRhRm9ybWF0KCk6dC5kYXRhRm9ybWF0LG51bGw9PXQucGFkZGluZyluLnBhZGRpbmc9W1sxLDFdLFsxLDFdXTtlbHNlIGlmKFwibnVtYmVyXCI9PXR5cGVvZiB0LnBhZGRpbmcpbi5wYWRkaW5nPVtbdC5wYWRkaW5nLHQucGFkZGluZ10sW3QucGFkZGluZyx0LnBhZGRpbmddXTtlbHNle2lmKHQucGFkZGluZz10LnBhZGRpbmcsMiE9PXQucGFkZGluZy5sZW5ndGgpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJaZXJvUGFkZGluZzJEIGV4cGVjdHMgcGFkZGluZyB0byBiZSBhIGxlbmd0aC0yIGFycmF5LCBidXQgcmVjZWl2ZWQgYSBsZW5ndGgtXCIrdC5wYWRkaW5nLmxlbmd0aCtcIiBhcnJheS5cIik7dmFyIHI9dm9pZCAwLGk9dm9pZCAwO2lmKFwibnVtYmVyXCI9PXR5cGVvZiB0LnBhZGRpbmdbMF0pcj1bdC5wYWRkaW5nWzBdLHQucGFkZGluZ1swXV0saT1bdC5wYWRkaW5nWzFdLHQucGFkZGluZ1sxXV07ZWxzZXtpZih0LnBhZGRpbmc9dC5wYWRkaW5nLDIhPT10LnBhZGRpbmdbMF0ubGVuZ3RoKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiWmVyb1BhZGRpbmcyRCBleHBlY3RzIGhlaWdodCBwYWRkaW5nIHRvIGJlIGEgbGVuZ3RoLTIgYXJyYXksIGJ1dCByZWNlaXZlZCBhIGxlbmd0aC1cIit0LnBhZGRpbmdbMF0ubGVuZ3RoK1wiIGFycmF5LlwiKTtpZihyPXQucGFkZGluZ1swXSwyIT09dC5wYWRkaW5nWzFdLmxlbmd0aCl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIlplcm9QYWRkaW5nMkQgZXhwZWN0cyB3aWR0aCBwYWRkaW5nIHRvIGJlIGEgbGVuZ3RoLTIgYXJyYXksIGJ1dCByZWNlaXZlZCBhIGxlbmd0aC1cIit0LnBhZGRpbmdbMV0ubGVuZ3RoK1wiIGFycmF5LlwiKTtpPXQucGFkZGluZ1sxXX1uLnBhZGRpbmc9W3IsaV19cmV0dXJuIG4uaW5wdXRTcGVjPVtuZXcgSW5wdXRTcGVjKHtuZGltOjR9KV0sbn1yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuY29tcHV0ZU91dHB1dFNoYXBlPWZ1bmN0aW9uKGUpe3ZhciB0LG47cmV0dXJuIGU9Z2V0RXhhY3RseU9uZVNoYXBlKGUpLFwiY2hhbm5lbHNGaXJzdFwiPT09dGhpcy5kYXRhRm9ybWF0Pyh0PW51bGwhPWVbMl0mJmVbMl0+PTA/ZVsyXSt0aGlzLnBhZGRpbmdbMF1bMF0rdGhpcy5wYWRkaW5nWzBdWzFdOm51bGwsbj1udWxsIT1lWzNdJiZlWzNdPj0wP2VbM10rdGhpcy5wYWRkaW5nWzFdWzBdK3RoaXMucGFkZGluZ1sxXVsxXTpudWxsLFtlWzBdLGVbMV0sdCxuXSk6KHQ9bnVsbCE9ZVsxXSYmZVsxXT49MD9lWzFdK3RoaXMucGFkZGluZ1swXVswXSt0aGlzLnBhZGRpbmdbMF1bMV06bnVsbCxuPW51bGwhPWVbMl0mJmVbMl0+PTA/ZVsyXSt0aGlzLnBhZGRpbmdbMV1bMF0rdGhpcy5wYWRkaW5nWzFdWzFdOm51bGwsW2VbMF0sdCxuLGVbM11dKX0sdC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXtyZXR1cm4gc3BhdGlhbDJkUGFkZGluZyhnZXRFeGFjdGx5T25lVGVuc29yKGUpLG4ucGFkZGluZyxuLmRhdGFGb3JtYXQpfSl9LHQucHJvdG90eXBlLmdldENvbmZpZz1mdW5jdGlvbigpe3ZhciB0PXtwYWRkaW5nOnRoaXMucGFkZGluZyxkYXRhRm9ybWF0OnRoaXMuZGF0YUZvcm1hdH0sbj1lLnByb3RvdHlwZS5nZXRDb25maWcuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0LmFzc2lnbih0LG4pLHR9LHQuY2xhc3NOYW1lPVwiWmVyb1BhZGRpbmcyRFwiLHR9KExheWVyKTtmdW5jdGlvbiBwb29sMmQoZSx0LG4scixpLGEpe3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7dmFyIG87Y2hlY2tEYXRhRm9ybWF0KGkpLGNoZWNrUG9vbE1vZGUoYSksY2hlY2tQYWRkaW5nTW9kZShyKSxudWxsPT1uJiYobj1bMSwxXSksbnVsbD09ciYmKHI9XCJ2YWxpZFwiKSxudWxsPT1pJiYoaT1pbWFnZURhdGFGb3JtYXQoKSksbnVsbD09YSYmKGE9XCJtYXhcIiksZT1wcmVwcm9jZXNzQ29udjJESW5wdXQoZSxpKTt2YXIgcz1cInNhbWVcIj09PXI/XCJzYW1lXCI6XCJ2YWxpZFwiO3JldHVybiBvPVwibWF4XCI9PT1hP21heFBvb2woZSx0LG4scyk6YXZnUG9vbChlLHQsbixzKSxcImNoYW5uZWxzRmlyc3RcIj09PWkmJihvPXRyYW5zcG9zZShvLFswLDMsMSwyXSkpLG99KX1zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoWmVyb1BhZGRpbmcyRCk7dmFyIFBvb2xpbmcxRD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPXRoaXM7aWYobnVsbD09dC5wb29sU2l6ZSYmKHQucG9vbFNpemU9Miksbj1lLmNhbGwodGhpcyx0KXx8dGhpcyxcIm51bWJlclwiPT10eXBlb2YgdC5wb29sU2l6ZSluLnBvb2xTaXplPVt0LnBvb2xTaXplXTtlbHNle2lmKCFBcnJheS5pc0FycmF5KHQucG9vbFNpemUpfHwxIT09dC5wb29sU2l6ZS5sZW5ndGh8fFwibnVtYmVyXCIhPXR5cGVvZiB0LnBvb2xTaXplWzBdKXRocm93IG5ldyBWYWx1ZUVycm9yKFwicG9vbFNpemUgZm9yIDFEIGNvbnZvbHV0aW9uYWwgbGF5ZXIgbXVzdCBiZSBhIG51bWJlciBvciBhbiBBcnJheSBvZiBhIHNpbmdsZSBudW1iZXIsIGJ1dCByZWNlaXZlZCBcIitKU09OLnN0cmluZ2lmeSh0LnBvb2xTaXplKSk7bi5wb29sU2l6ZT10LnBvb2xTaXplfWlmKG51bGw9PXQuc3RyaWRlcyluLnN0cmlkZXM9bi5wb29sU2l6ZTtlbHNlIGlmKFwibnVtYmVyXCI9PXR5cGVvZiB0LnN0cmlkZXMpbi5zdHJpZGVzPVt0LnN0cmlkZXNdO2Vsc2V7aWYoIUFycmF5LmlzQXJyYXkodC5zdHJpZGVzKXx8MSE9PXQuc3RyaWRlcy5sZW5ndGh8fFwibnVtYmVyXCIhPXR5cGVvZiB0LnN0cmlkZXNbMF0pdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJzdHJpZGVzIGZvciAxRCBjb252b2x1dGlvbmFsIGxheWVyIG11c3QgYmUgYSBudW1iZXIgb3IgYW4gQXJyYXkgb2YgYSBzaW5nbGUgbnVtYmVyLCBidXQgcmVjZWl2ZWQgXCIrSlNPTi5zdHJpbmdpZnkodC5zdHJpZGVzKSk7bi5zdHJpZGVzPXQuc3RyaWRlc31yZXR1cm4gbi5wYWRkaW5nPW51bGw9PXQucGFkZGluZz9cInZhbGlkXCI6dC5wYWRkaW5nLGNoZWNrUGFkZGluZ01vZGUobi5wYWRkaW5nKSxuLmlucHV0U3BlYz1bbmV3IElucHV0U3BlYyh7bmRpbTozfSldLG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmNvbXB1dGVPdXRwdXRTaGFwZT1mdW5jdGlvbihlKXt2YXIgdD1jb252T3V0cHV0TGVuZ3RoKChlPWdldEV4YWN0bHlPbmVTaGFwZShlKSlbMV0sdGhpcy5wb29sU2l6ZVswXSx0aGlzLnBhZGRpbmcsdGhpcy5zdHJpZGVzWzBdKTtyZXR1cm5bZVswXSx0LGVbMl1dfSx0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gdGlkeShmdW5jdGlvbigpe24uaW52b2tlQ2FsbEhvb2soZSx0KSxlPWV4cGFuZERpbXMoZ2V0RXhhY3RseU9uZVRlbnNvcihlKSwyKTt2YXIgcj1uLnBvb2xpbmdGdW5jdGlvbihnZXRFeGFjdGx5T25lVGVuc29yKGUpLFtuLnBvb2xTaXplWzBdLDFdLFtuLnN0cmlkZXNbMF0sMV0sbi5wYWRkaW5nLFwiY2hhbm5lbHNMYXN0XCIpO3JldHVybiBzcXVlZXplKHIsWzJdKX0pfSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXt2YXIgdD17cG9vbFNpemU6dGhpcy5wb29sU2l6ZSxwYWRkaW5nOnRoaXMucGFkZGluZyxzdHJpZGVzOnRoaXMuc3RyaWRlc30sbj1lLnByb3RvdHlwZS5nZXRDb25maWcuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0LmFzc2lnbih0LG4pLHR9LHR9KExheWVyKSxNYXhQb29saW5nMUQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gZS5jYWxsKHRoaXMsdCl8fHRoaXN9cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLnBvb2xpbmdGdW5jdGlvbj1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiBjaGVja0RhdGFGb3JtYXQoaSksY2hlY2tQYWRkaW5nTW9kZShyKSxwb29sMmQoZSx0LG4scixpLFwibWF4XCIpfSx0LmNsYXNzTmFtZT1cIk1heFBvb2xpbmcxRFwiLHR9KFBvb2xpbmcxRCk7c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKE1heFBvb2xpbmcxRCk7dmFyIEF2ZXJhZ2VQb29saW5nMUQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gZS5jYWxsKHRoaXMsdCl8fHRoaXN9cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLnBvb2xpbmdGdW5jdGlvbj1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiBjaGVja0RhdGFGb3JtYXQoaSksY2hlY2tQYWRkaW5nTW9kZShyKSxwb29sMmQoZSx0LG4scixpLFwiYXZnXCIpfSx0LmNsYXNzTmFtZT1cIkF2ZXJhZ2VQb29saW5nMURcIix0fShQb29saW5nMUQpO3NlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhBdmVyYWdlUG9vbGluZzFEKTt2YXIgUG9vbGluZzJEPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIG49dGhpcztpZihudWxsPT10LnBvb2xTaXplJiYodC5wb29sU2l6ZT1bMiwyXSksKG49ZS5jYWxsKHRoaXMsdCl8fHRoaXMpLnBvb2xTaXplPUFycmF5LmlzQXJyYXkodC5wb29sU2l6ZSk/dC5wb29sU2l6ZTpbdC5wb29sU2l6ZSx0LnBvb2xTaXplXSxudWxsPT10LnN0cmlkZXMpbi5zdHJpZGVzPW4ucG9vbFNpemU7ZWxzZSBpZihBcnJheS5pc0FycmF5KHQuc3RyaWRlcykpe2lmKDIhPT10LnN0cmlkZXMubGVuZ3RoKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiSWYgdGhlIHN0cmlkZXMgcHJvcGVydHkgb2YgYSAyRCBwb29saW5nIGxheWVyIGlzIGFuIEFycmF5LCBpdCBpcyBleHBlY3RlZCB0byBoYXZlIGEgbGVuZ3RoIG9mIDIsIGJ1dCByZWNlaXZlZCBsZW5ndGggXCIrdC5zdHJpZGVzLmxlbmd0aCtcIi5cIik7bi5zdHJpZGVzPXQuc3RyaWRlc31lbHNlIG4uc3RyaWRlcz1bdC5zdHJpZGVzLHQuc3RyaWRlc107cmV0dXJuIG4ucGFkZGluZz1udWxsPT10LnBhZGRpbmc/XCJ2YWxpZFwiOnQucGFkZGluZyxuLmRhdGFGb3JtYXQ9bnVsbD09dC5kYXRhRm9ybWF0P1wiY2hhbm5lbHNMYXN0XCI6dC5kYXRhRm9ybWF0LGNoZWNrRGF0YUZvcm1hdChuLmRhdGFGb3JtYXQpLGNoZWNrUGFkZGluZ01vZGUobi5wYWRkaW5nKSxuLmlucHV0U3BlYz1bbmV3IElucHV0U3BlYyh7bmRpbTo0fSldLG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmNvbXB1dGVPdXRwdXRTaGFwZT1mdW5jdGlvbihlKXtlPWdldEV4YWN0bHlPbmVTaGFwZShlKTt2YXIgdD1cImNoYW5uZWxzRmlyc3RcIj09PXRoaXMuZGF0YUZvcm1hdD9lWzJdOmVbMV0sbj1cImNoYW5uZWxzRmlyc3RcIj09PXRoaXMuZGF0YUZvcm1hdD9lWzNdOmVbMl07cmV0dXJuIHQ9Y29udk91dHB1dExlbmd0aCh0LHRoaXMucG9vbFNpemVbMF0sdGhpcy5wYWRkaW5nLHRoaXMuc3RyaWRlc1swXSksbj1jb252T3V0cHV0TGVuZ3RoKG4sdGhpcy5wb29sU2l6ZVsxXSx0aGlzLnBhZGRpbmcsdGhpcy5zdHJpZGVzWzFdKSxcImNoYW5uZWxzRmlyc3RcIj09PXRoaXMuZGF0YUZvcm1hdD9bZVswXSxlWzFdLHQsbl06W2VbMF0sdCxuLGVbM11dfSx0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gdGlkeShmdW5jdGlvbigpe3JldHVybiBuLmludm9rZUNhbGxIb29rKGUsdCksbi5wb29saW5nRnVuY3Rpb24oZ2V0RXhhY3RseU9uZVRlbnNvcihlKSxuLnBvb2xTaXplLG4uc3RyaWRlcyxuLnBhZGRpbmcsbi5kYXRhRm9ybWF0KX0pfSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXt2YXIgdD17cG9vbFNpemU6dGhpcy5wb29sU2l6ZSxwYWRkaW5nOnRoaXMucGFkZGluZyxzdHJpZGVzOnRoaXMuc3RyaWRlcyxkYXRhRm9ybWF0OnRoaXMuZGF0YUZvcm1hdH0sbj1lLnByb3RvdHlwZS5nZXRDb25maWcuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0LmFzc2lnbih0LG4pLHR9LHR9KExheWVyKSxNYXhQb29saW5nMkQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gZS5jYWxsKHRoaXMsdCl8fHRoaXN9cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLnBvb2xpbmdGdW5jdGlvbj1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiBjaGVja0RhdGFGb3JtYXQoaSksY2hlY2tQYWRkaW5nTW9kZShyKSxwb29sMmQoZSx0LG4scixpLFwibWF4XCIpfSx0LmNsYXNzTmFtZT1cIk1heFBvb2xpbmcyRFwiLHR9KFBvb2xpbmcyRCk7c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKE1heFBvb2xpbmcyRCk7dmFyIEF2ZXJhZ2VQb29saW5nMkQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gZS5jYWxsKHRoaXMsdCl8fHRoaXN9cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLnBvb2xpbmdGdW5jdGlvbj1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiBjaGVja0RhdGFGb3JtYXQoaSksY2hlY2tQYWRkaW5nTW9kZShyKSxwb29sMmQoZSx0LG4scixpLFwiYXZnXCIpfSx0LmNsYXNzTmFtZT1cIkF2ZXJhZ2VQb29saW5nMkRcIix0fShQb29saW5nMkQpO3NlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhBdmVyYWdlUG9vbGluZzJEKTt2YXIgR2xvYmFsUG9vbGluZzFEPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIG49ZS5jYWxsKHRoaXMsdCl8fHRoaXM7cmV0dXJuIG4uaW5wdXRTcGVjPVtuZXcgSW5wdXRTcGVjKHtuZGltOjN9KV0sbn1yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuY29tcHV0ZU91dHB1dFNoYXBlPWZ1bmN0aW9uKGUpe3JldHVybltlWzBdLGVbMl1dfSx0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGUsdCl7dGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3J9LHR9KExheWVyKSxHbG9iYWxBdmVyYWdlUG9vbGluZzFEPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIGUuY2FsbCh0aGlzLHQpfHx0aGlzfXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXt2YXIgdD1nZXRFeGFjdGx5T25lVGVuc29yKGUpO3JldHVybiBtZWFuKHQsMSl9KX0sdC5jbGFzc05hbWU9XCJHbG9iYWxBdmVyYWdlUG9vbGluZzFEXCIsdH0oR2xvYmFsUG9vbGluZzFEKTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoR2xvYmFsQXZlcmFnZVBvb2xpbmcxRCk7dmFyIEdsb2JhbE1heFBvb2xpbmcxRD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3JldHVybiBlLmNhbGwodGhpcyx0KXx8dGhpc31yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihlLHQpe3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7dmFyIHQ9Z2V0RXhhY3RseU9uZVRlbnNvcihlKTtyZXR1cm4gbWF4KHQsMSl9KX0sdC5jbGFzc05hbWU9XCJHbG9iYWxNYXhQb29saW5nMURcIix0fShHbG9iYWxQb29saW5nMUQpO3NlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhHbG9iYWxNYXhQb29saW5nMUQpO3ZhciBHbG9iYWxQb29saW5nMkQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyx0KXx8dGhpcztyZXR1cm4gbi5kYXRhRm9ybWF0PW51bGw9PXQuZGF0YUZvcm1hdD9cImNoYW5uZWxzTGFzdFwiOnQuZGF0YUZvcm1hdCxjaGVja0RhdGFGb3JtYXQobi5kYXRhRm9ybWF0KSxuLmlucHV0U3BlYz1bbmV3IElucHV0U3BlYyh7bmRpbTo0fSldLG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmNvbXB1dGVPdXRwdXRTaGFwZT1mdW5jdGlvbihlKXtyZXR1cm4gZT1lLFwiY2hhbm5lbHNMYXN0XCI9PT10aGlzLmRhdGFGb3JtYXQ/W2VbMF0sZVszXV06W2VbMF0sZVsxXV19LHQucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24oZSx0KXt0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcn0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7dmFyIHQ9e2RhdGFGb3JtYXQ6dGhpcy5kYXRhRm9ybWF0fSxuPWUucHJvdG90eXBlLmdldENvbmZpZy5jYWxsKHRoaXMpO3JldHVybiBPYmplY3QuYXNzaWduKHQsbiksdH0sdH0oTGF5ZXIpLEdsb2JhbEF2ZXJhZ2VQb29saW5nMkQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3JldHVybiBudWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7dmFyIHQ9Z2V0RXhhY3RseU9uZVRlbnNvcihlKTtyZXR1cm5cImNoYW5uZWxzTGFzdFwiPT09bi5kYXRhRm9ybWF0P21lYW4odCxbMSwyXSk6bWVhbih0LFsyLDNdKX0pfSx0LmNsYXNzTmFtZT1cIkdsb2JhbEF2ZXJhZ2VQb29saW5nMkRcIix0fShHbG9iYWxQb29saW5nMkQpO3NlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhHbG9iYWxBdmVyYWdlUG9vbGluZzJEKTt2YXIgR2xvYmFsTWF4UG9vbGluZzJEPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtyZXR1cm4gbnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gdGlkeShmdW5jdGlvbigpe3ZhciB0PWdldEV4YWN0bHlPbmVUZW5zb3IoZSk7cmV0dXJuXCJjaGFubmVsc0xhc3RcIj09PW4uZGF0YUZvcm1hdD9tYXgodCxbMSwyXSk6bWF4KHQsWzIsM10pfSl9LHQuY2xhc3NOYW1lPVwiR2xvYmFsTWF4UG9vbGluZzJEXCIsdH0oR2xvYmFsUG9vbGluZzJEKTtmdW5jdGlvbiBzdGFuZGFyZGl6ZUFyZ3MoZSx0LG4scil7aWYoQXJyYXkuaXNBcnJheShlKSl7aWYobnVsbCE9dHx8bnVsbCE9bil0aHJvdyBuZXcgVmFsdWVFcnJvcihcIldoZW4gaW5wdXRzIGlzIGFuIGFycmF5LCBuZWl0aGVyIGluaXRpYWxTdGF0ZSBvciBjb25zdGFudHMgc2hvdWxkIGJlIHByb3ZpZGVkXCIpO251bGwhPXImJihuPWUuc2xpY2UoZS5sZW5ndGgtcixlLmxlbmd0aCksZT1lLnNsaWNlKDAsZS5sZW5ndGgtcikpLGUubGVuZ3RoPjEmJih0PWUuc2xpY2UoMSxlLmxlbmd0aCkpLGU9ZVswXX1mdW5jdGlvbiBpKGUpe3JldHVybiBudWxsPT1lfHxBcnJheS5pc0FycmF5KGUpP2U6W2VdfXJldHVybntpbnB1dHM6ZSxpbml0aWFsU3RhdGU6dD1pKHQpLGNvbnN0YW50czpuPWkobil9fWZ1bmN0aW9uIHJubihlLHQsbixyLGksYSxvLHMpe3ZvaWQgMD09PXImJihyPSExKSx2b2lkIDA9PT1vJiYobz0hMSksdm9pZCAwPT09cyYmKHM9ITEpO3ZhciBsPXQuc2hhcGUubGVuZ3RoO2lmKGw8Myl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIklucHV0IHNob3VsZCBiZSBhdCBsZWFzdCAzRCwgYnV0IGlzIFwiK2wrXCJELlwiKTt2YXIgdSxjLHA9WzEsMF0uY29uY2F0KHJhbmdlKDIsbCkpO2lmKHQ9dHJhbnNwb3NlKHQscCksbnVsbCE9aSl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcIlRoZSBybm4oKSBmdW5jdGlvbiBvZiB0aGUgZGVlcGxlYXJuLmpzIGJhY2tlbmQgZG9lcyBub3Qgc3VwcG9ydCBtYXNraW5nIHlldC5cIik7aWYobnVsbCE9YSl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcIlRoZSBybm4oKSBmdW5jdG9pbiBvZiB0aGUgZGVlcGxlYXJuLmpzIGJhY2tlbmQgZG9lcyBub3Qgc3VwcG9ydCBjb25zdGFudHMgeWV0LlwiKTtvJiZjb25zb2xlLndhcm4oXCJCYWNrZW5kIHJubigpOiB0aGUgdW5yb2xsID0gdHJ1ZSBvcHRpb24gaXMgbm90IGFwcGxpY2FibGUgdG8gdGhlIGltcGVyYXRpdmUgZGVlcGxlYXJuLmpzIGJhY2tlbmQuXCIpLHImJih0PXJldmVyc2UodCwwKSk7Zm9yKHZhciBoPW4sZD10LnNoYXBlWzBdLGc9ZnVuY3Rpb24obil7dmFyIHI9c2xpY2VBbG9uZ0ZpcnN0QXhpcyh0LG4sMSk7cj1yLnJlc2hhcGUoci5zaGFwZS5zbGljZSgxKSk7dmFyIGk9dGlkeShmdW5jdGlvbigpe3JldHVybiBlKHIsaCl9KTtpZihjPWlbMF0scylpZigwPT09bil1PWMuZXhwYW5kRGltcygxKTtlbHNle3ZhciBhPWNvbmNhdChbdSxjLmV4cGFuZERpbXMoMSldLDEpO3UuZGlzcG9zZSgpLHU9YX1oPWlbMV19LGY9MDtmPGQ7KytmKWcoZik7cmV0dXJuW2MsdSxoXX1zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoR2xvYmFsTWF4UG9vbGluZzJEKTt2YXIgUk5OPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIG4scj1lLmNhbGwodGhpcyx0KXx8dGhpcztpZihudWxsPT10LmNlbGwpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJjZWxsIHByb3BlcnR5IGlzIG1pc3NpbmcgZm9yIHRoZSBjb25zdHJ1Y3RvciBvZiBSTk4uXCIpO2lmKG51bGw9PShuPUFycmF5LmlzQXJyYXkodC5jZWxsKT9uZXcgU3RhY2tlZFJOTkNlbGxzKHtjZWxsczp0LmNlbGx9KTp0LmNlbGwpLnN0YXRlU2l6ZSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIlRoZSBSTk4gY2VsbCBzaG91bGQgaGF2ZSBhbiBhdHRyaWJ1dGUgYHN0YXRlU2l6ZWAgKHR1cGxlIG9mIGludGVnZXJzLCBvbmUgaW50ZWdlciBwZXIgUk5OIHN0YXRlKS5cIik7cmV0dXJuIHIuY2VsbD1uLHIucmV0dXJuU2VxdWVuY2VzPW51bGwhPXQucmV0dXJuU2VxdWVuY2VzJiZ0LnJldHVyblNlcXVlbmNlcyxyLnJldHVyblN0YXRlPW51bGwhPXQucmV0dXJuU3RhdGUmJnQucmV0dXJuU3RhdGUsci5nb0JhY2t3YXJkcz1udWxsIT10LmdvQmFja3dhcmRzJiZ0LmdvQmFja3dhcmRzLHIuX3N0YXRlZnVsPW51bGwhPXQuc3RhdGVmdWwmJnQuc3RhdGVmdWwsci51bnJvbGw9bnVsbCE9dC51bnJvbGwmJnQudW5yb2xsLHIuc3VwcG9ydHNNYXNraW5nPSEwLHIuaW5wdXRTcGVjPVtuZXcgSW5wdXRTcGVjKHtuZGltOjN9KV0sci5zdGF0ZVNwZWM9bnVsbCxyLnN0YXRlcz1udWxsLHIubnVtQ29uc3RhbnRzPW51bGwsci5rZXB0U3RhdGVzPVtdLHJ9cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmdldFN0YXRlcz1mdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLnN0YXRlcz9yYW5nZSgwLEFycmF5LmlzQXJyYXkodGhpcy5jZWxsLnN0YXRlU2l6ZSk/dGhpcy5jZWxsLnN0YXRlU2l6ZS5sZW5ndGg6MSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBudWxsfSk6dGhpcy5zdGF0ZXN9LHQucHJvdG90eXBlLnNldFN0YXRlcz1mdW5jdGlvbihlKXt0aGlzLnN0YXRlcz1lfSx0LnByb3RvdHlwZS5jb21wdXRlT3V0cHV0U2hhcGU9ZnVuY3Rpb24oZSl7aXNBcnJheU9mU2hhcGVzKGUpJiYoZT1lWzBdKSxlPWU7dmFyIHQ9dGhpcy5jZWxsLnN0YXRlU2l6ZTtBcnJheS5pc0FycmF5KHQpfHwodD1bdF0pO3ZhciBuLHI9dFswXTtpZihuPXRoaXMucmV0dXJuU2VxdWVuY2VzP1tlWzBdLGVbMV0scl06W2VbMF0scl0sdGhpcy5yZXR1cm5TdGF0ZSl7Zm9yKHZhciBpPVtdLGE9MCxvPXQ7YTxvLmxlbmd0aDthKyspe3ZhciBzPW9bYV07aS5wdXNoKFtlWzBdLHNdKX1yZXR1cm5bbl0uY29uY2F0KGkpfXJldHVybiBufSx0LnByb3RvdHlwZS5jb21wdXRlTWFzaz1mdW5jdGlvbihlLHQpe3Rocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiY29tcHV0ZU1hc2sgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkIGZvciBSTk4geWV0XCIpfSx0LnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbihlKXtpZihudWxsIT10aGlzLm51bUNvbnN0YW50cyl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcIkNvbnN0YW50cyBzdXBwb3J0IGlzIG5vdCBpbXBsZW1lbnRlZCBpbiBSTk4geWV0LlwiKTtpc0FycmF5T2ZTaGFwZXMoZSkmJihlPWVbMF0pLGU9ZTt2YXIgdD10aGlzLnN0YXRlZnVsP2VbMF06bnVsbCxuPWVbZS5sZW5ndGgtMV07dGhpcy5pbnB1dFNwZWNbMF09bmV3IElucHV0U3BlYyh7c2hhcGU6W3QsbnVsbCxuXX0pO3ZhciByLGk9W2VbMF1dLmNvbmNhdChlLnNsaWNlKDIpKTtpZih0aGlzLmNlbGwuYnVpbGQoaSkscj1BcnJheS5pc0FycmF5KHRoaXMuY2VsbC5zdGF0ZVNpemUpP3RoaXMuY2VsbC5zdGF0ZVNpemU6W3RoaXMuY2VsbC5zdGF0ZVNpemVdLG51bGwhPXRoaXMuc3RhdGVTcGVjKXtpZighdXRpbC5hcnJheXNFcXVhbCh0aGlzLnN0YXRlU3BlYy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2hhcGVbZS5zaGFwZS5sZW5ndGgtMV19KSxyKSl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIkFuIGluaXRpYWxTdGF0ZSB3YXMgcGFzc2VkIHRoYXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBjZWxsLnN0YXRlU2l6ZS4gUmVjZWl2ZWQgc3RhdGVTcGVjPVwiK3RoaXMuc3RhdGVTcGVjK1wiOyBIb3dldmVyIGNlbGwuc3RhdGVTaXplIGlzIFwiK3RoaXMuY2VsbC5zdGF0ZVNpemUpfWVsc2UgdGhpcy5zdGF0ZVNwZWM9ci5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBJbnB1dFNwZWMoe3NoYXBlOltudWxsLGVdfSl9KTt0aGlzLnN0YXRlZnVsJiZ0aGlzLnJlc2V0U3RhdGVzKCl9LHQucHJvdG90eXBlLnJlc2V0U3RhdGVzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGlkeShmdW5jdGlvbigpe2lmKCF0LnN0YXRlZnVsKXRocm93IG5ldyBBdHRyaWJ1dGVFcnJvcihcIkNhbm5vdCBjYWxsIHJlc2V0U3RhdGVzKCkgb24gYW4gUk5OIExheWVyIHRoYXQgaXMgbm90IHN0YXRlZnVsLlwiKTt2YXIgbj10LmlucHV0U3BlY1swXS5zaGFwZVswXTtpZihudWxsPT1uKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiSWYgYW4gUk5OIGlzIHN0YXRlZnVsLCBpdCBuZWVkcyB0byBrbm93IGl0cyBiYXRjaCBzaXplLiBTcGVjaWZ5IHRoZSBiYXRjaCBzaXplIG9mIHlvdXIgaW5wdXQgdGVuc29yczogXFxuLSBJZiB1c2luZyBhIFNlcXVlbnRpYWwgbW9kZWwsIHNwZWNpZnkgdGhlIGJhdGNoIHNpemUgYnkgcGFzc2luZyBhIGBiYXRjaElucHV0U2hhcGVgIG9wdGlvbiB0byB5b3VyIGZpcnN0IGxheWVyLlxcbi0gSWYgdXNpbmcgdGhlIGZ1bmN0aW9uYWwgQVBJLCBzcGVjaWZ5IHRoZSBiYXRjaCBzaXplIGJ5IHBhc3NpbmcgYSBgYmF0Y2hTaGFwZWAgb3B0aW9uIHRvIHlvdXIgSW5wdXQgbGF5ZXIuXCIpO2lmKG51bGw9PXQuc3RhdGVzKUFycmF5LmlzQXJyYXkodC5jZWxsLnN0YXRlU2l6ZSk/dC5zdGF0ZXM9dC5jZWxsLnN0YXRlU2l6ZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHplcm9zKFtuLGVdKX0pOnQuc3RhdGVzPVt6ZXJvcyhbbix0LmNlbGwuc3RhdGVTaXplXSldO2Vsc2UgaWYobnVsbD09ZSlkaXNwb3NlKHQuc3RhdGVzKSxudWxsIT10LmtlcHRTdGF0ZXMmJihkaXNwb3NlKHQua2VwdFN0YXRlcyksdC5rZXB0U3RhdGVzPVtdKSxBcnJheS5pc0FycmF5KHQuY2VsbC5zdGF0ZVNpemUpP3Quc3RhdGVzPXQuY2VsbC5zdGF0ZVNpemUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiB6ZXJvcyhbbixlXSl9KTp0LnN0YXRlc1swXT16ZXJvcyhbbix0LmNlbGwuc3RhdGVTaXplXSk7ZWxzZXtpZih0LmtlcHRTdGF0ZXMucHVzaCh0LnN0YXRlcy5zbGljZSgpKSxBcnJheS5pc0FycmF5KGUpfHwoZT1bZV0pLGUubGVuZ3RoIT09dC5zdGF0ZXMubGVuZ3RoKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiTGF5ZXIgXCIrdC5uYW1lK1wiIGV4cGVjdHMgXCIrdC5zdGF0ZXMubGVuZ3RoK1wiIHN0YXRlKHMpLCBidXQgaXQgcmVjZWl2ZWQgXCIrZS5sZW5ndGgrXCIgc3RhdGUgdmFsdWUocykuIElucHV0IHJlY2VpdmVkOiBcIitlKTtmb3IodmFyIHI9MDtyPHQuc3RhdGVzLmxlbmd0aDsrK3Ipe3ZhciBpPWVbcl0sYT1BcnJheS5pc0FycmF5KHQuY2VsbC5zdGF0ZVNpemUpP3QuY2VsbC5zdGF0ZVNpemVbcl06dC5jZWxsLnN0YXRlU2l6ZSxvPVtuLGFdO2lmKCF1dGlsLmFycmF5c0VxdWFsKGkuc2hhcGUsbykpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJTdGF0ZSBcIityK1wiIGlzIGluY29tcGF0aWJsZSB3aXRoIGxheWVyIFwiK3QubmFtZStcIjogZXhwZWN0ZWQgc2hhcGU9XCIrbytcIiwgcmVjZWl2ZWQgc2hhcGU9XCIraS5zaGFwZSk7dC5zdGF0ZXNbcl09aX19dC5zdGF0ZXMuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4ga2VlcChlKX0pfSl9LHQucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKHQsbil7dmFyIHI9bnVsbD09bj9udWxsOm4uaW5pdGlhbFN0YXRlLGk9bnVsbD09bj9udWxsOm4uY29uc3RhbnRzO251bGw9PW4mJihuPXt9KTt2YXIgYT1zdGFuZGFyZGl6ZUFyZ3ModCxyLGksdGhpcy5udW1Db25zdGFudHMpO3Q9YS5pbnB1dHMscj1hLmluaXRpYWxTdGF0ZSxpPWEuY29uc3RhbnRzO3ZhciBvPVtdLHM9W107aWYobnVsbCE9cil7bi5pbml0aWFsU3RhdGU9cixvPW8uY29uY2F0KHIpLHRoaXMuc3RhdGVTcGVjPVtdO2Zvcih2YXIgbD0wLHU9cjtsPHUubGVuZ3RoO2wrKyl7dmFyIGM9dVtsXTt0aGlzLnN0YXRlU3BlYy5wdXNoKG5ldyBJbnB1dFNwZWMoe3NoYXBlOmMuc2hhcGV9KSl9cz1zLmNvbmNhdCh0aGlzLnN0YXRlU3BlYyl9aWYobnVsbCE9aSYmKG4uY29uc3RhbnRzPWksbz1vLmNvbmNhdChpKSx0aGlzLm51bUNvbnN0YW50cz1pLmxlbmd0aCksb1swXWluc3RhbmNlb2YgU3ltYm9saWNUZW5zb3Ipe3ZhciBwPVt0XS5jb25jYXQobyksaD10aGlzLmlucHV0U3BlYy5jb25jYXQocyksZD10aGlzLmlucHV0U3BlYzt0aGlzLmlucHV0U3BlYz1oO3ZhciBnPWUucHJvdG90eXBlLmFwcGx5LmNhbGwodGhpcyxwLG4pO3JldHVybiB0aGlzLmlucHV0U3BlYz1kLGd9cmV0dXJuIGUucHJvdG90eXBlLmFwcGx5LmNhbGwodGhpcyx0LG4pfSx0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gdGlkeShmdW5jdGlvbigpe3ZhciByPW51bGw9PXQ/bnVsbDp0Lm1hc2ssaT1udWxsPT10P251bGw6dC50cmFpbmluZyxhPW51bGw9PXQ/bnVsbDp0LmluaXRpYWxTdGF0ZTtpZihlPWdldEV4YWN0bHlPbmVUZW5zb3IoZSksbnVsbD09YSYmKGE9bi5zdGF0ZWZ1bD9uLnN0YXRlczpuLmdldEluaXRpYWxTdGF0ZShlKSksbnVsbCE9cil0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcIk1hc2tpbmcgaXMgbm90IGltcGxlbWVudGVkIGZvciBSTk4geWV0XCIpO3ZhciBvPUFycmF5LmlzQXJyYXkobi5jZWxsLnN0YXRlU2l6ZSk/bi5jZWxsLnN0YXRlU2l6ZS5sZW5ndGg6MTtpZihhLmxlbmd0aCE9PW8pdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJSTk4gTGF5ZXIgaGFzIFwiK28rXCIgc3RhdGUocykgYnV0IHdhcyBwYXNzZWQgXCIrYS5sZW5ndGgrXCIgaW5pdGlhbCBzdGF0ZShzKS5cIik7bi51bnJvbGwmJmNvbnNvbGUud2FybihcIklnbm9yaW5nIHVucm9sbCA9IHRydWUgZm9yIFJOTiBsYXllciwgZHVlIHRvIGltcGVyYXRpdmUgYmFja2VuZC5cIik7dmFyIHM9e3RyYWluaW5nOml9LGw9cm5uKGZ1bmN0aW9uKGUsdCl7dmFyIHI9bi5jZWxsLmNhbGwoW2VdLmNvbmNhdCh0KSxzKTtyZXR1cm5bclswXSxyLnNsaWNlKDEpXX0sZSxhLG4uZ29CYWNrd2FyZHMsbnVsbCxudWxsLG4udW5yb2xsLG4ucmV0dXJuU2VxdWVuY2VzKSx1PWxbMF0sYz1sWzFdLHA9bFsyXTtuLnN0YXRlZnVsJiZuLnJlc2V0U3RhdGVzKHApO3ZhciBoPW4ucmV0dXJuU2VxdWVuY2VzP2M6dTtyZXR1cm4gbi5yZXR1cm5TdGF0ZT9baF0uY29uY2F0KHApOmh9KX0sdC5wcm90b3R5cGUuZ2V0SW5pdGlhbFN0YXRlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXt2YXIgbj16ZXJvcyhlLnNoYXBlKTtyZXR1cm4gbj1leHBhbmREaW1zKG49c3VtKG4sWzEsMl0pKSxBcnJheS5pc0FycmF5KHQuY2VsbC5zdGF0ZVNpemUpP3QuY2VsbC5zdGF0ZVNpemUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlPjE/dGlsZSQxKG4sWzEsZV0pOm59KTp0LmNlbGwuc3RhdGVTaXplPjE/W3RpbGUkMShuLFsxLHQuY2VsbC5zdGF0ZVNpemVdKV06W25dfSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcInRyYWluYWJsZVdlaWdodHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHJhaW5hYmxlP3RoaXMuY2VsbC50cmFpbmFibGVXZWlnaHRzOltdfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcIm5vblRyYWluYWJsZVdlaWdodHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHJhaW5hYmxlP3RoaXMuY2VsbC5ub25UcmFpbmFibGVXZWlnaHRzOnRoaXMuY2VsbC53ZWlnaHRzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmdldENvbmZpZz1mdW5jdGlvbigpe3ZhciB0PXtyZXR1cm5TZXF1ZW5jZXM6dGhpcy5yZXR1cm5TZXF1ZW5jZXMscmV0dXJuU3RhdGU6dGhpcy5yZXR1cm5TdGF0ZSxnb0JhY2t3YXJkczp0aGlzLmdvQmFja3dhcmRzLHN0YXRlZnVsOnRoaXMuc3RhdGVmdWwsdW5yb2xsOnRoaXMudW5yb2xsfTtudWxsIT10aGlzLm51bUNvbnN0YW50cyYmKHQubnVtQ29uc3RhbnRzPXRoaXMubnVtQ29uc3RhbnRzKTt2YXIgbj10aGlzLmNlbGwuZ2V0Q29uZmlnKCk7dC5jZWxsPXtjbGFzc05hbWU6dGhpcy5jZWxsLmdldENsYXNzTmFtZSgpLGNvbmZpZzpufTt2YXIgcj1lLnByb3RvdHlwZS5nZXRDb25maWcuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0LmFzc2lnbih0LHIpLHR9LHQuY2xhc3NOYW1lPVwiUk5OXCIsdH0oTGF5ZXIpO3NlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhSTk4pO3ZhciBSTk5DZWxsPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtyZXR1cm4gbnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBfX2V4dGVuZHModCxlKSx0fShMYXllciksU2ltcGxlUk5OQ2VsbD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzLHQpfHx0aGlzO3JldHVybiBuLkRFRkFVTFRfQUNUSVZBVElPTj1cInRhbmhcIixuLkRFRkFVTFRfS0VSTkVMX0lOSVRJQUxJWkVSPVwiZ2xvcm90Tm9ybWFsXCIsbi5ERUZBVUxUX1JFQ1VSUkVOVF9JTklUSUFMSVpFUj1cIm9ydGhvZ29uYWxcIixuLkRFRkFVTFRfQklBU19JTklUSUFMSVpFUj1cInplcm9zXCIsbi51bml0cz10LnVuaXRzLG4uYWN0aXZhdGlvbj1nZXRBY3RpdmF0aW9uKG51bGw9PXQuYWN0aXZhdGlvbj9uLkRFRkFVTFRfQUNUSVZBVElPTjp0LmFjdGl2YXRpb24pLG4udXNlQmlhcz1udWxsPT10LnVzZUJpYXN8fHQudXNlQmlhcyxuLmtlcm5lbEluaXRpYWxpemVyPWdldEluaXRpYWxpemVyKHQua2VybmVsSW5pdGlhbGl6ZXJ8fG4uREVGQVVMVF9LRVJORUxfSU5JVElBTElaRVIpLG4ucmVjdXJyZW50SW5pdGlhbGl6ZXI9Z2V0SW5pdGlhbGl6ZXIodC5yZWN1cnJlbnRJbml0aWFsaXplcnx8bi5ERUZBVUxUX1JFQ1VSUkVOVF9JTklUSUFMSVpFUiksbi5iaWFzSW5pdGlhbGl6ZXI9Z2V0SW5pdGlhbGl6ZXIodC5iaWFzSW5pdGlhbGl6ZXJ8fG4uREVGQVVMVF9CSUFTX0lOSVRJQUxJWkVSKSxuLmtlcm5lbFJlZ3VsYXJpemVyPWdldFJlZ3VsYXJpemVyKHQua2VybmVsUmVndWxhcml6ZXIpLG4ucmVjdXJyZW50UmVndWxhcml6ZXI9Z2V0UmVndWxhcml6ZXIodC5yZWN1cnJlbnRSZWd1bGFyaXplciksbi5iaWFzUmVndWxhcml6ZXI9Z2V0UmVndWxhcml6ZXIodC5iaWFzUmVndWxhcml6ZXIpLG4ua2VybmVsQ29uc3RyYWludD1nZXRDb25zdHJhaW50KHQua2VybmVsQ29uc3RyYWludCksbi5yZWN1cnJlbnRDb25zdHJhaW50PWdldENvbnN0cmFpbnQodC5yZWN1cnJlbnRDb25zdHJhaW50KSxuLmJpYXNDb25zdHJhaW50PWdldENvbnN0cmFpbnQodC5iaWFzQ29uc3RyYWludCksbi5kcm9wb3V0PW1pbiQxKFsxLG1heCQxKFswLG51bGw9PXQuZHJvcG91dD8wOnQuZHJvcG91dF0pXSksbi5yZWN1cnJlbnREcm9wb3V0PW1pbiQxKFsxLG1heCQxKFswLG51bGw9PXQucmVjdXJyZW50RHJvcG91dD8wOnQucmVjdXJyZW50RHJvcG91dF0pXSksbi5zdGF0ZVNpemU9bi51bml0cyxuLmRyb3BvdXRNYXNrPW51bGwsbi5yZWN1cnJlbnREcm9wb3V0TWFzaz1udWxsLG59cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmJ1aWxkPWZ1bmN0aW9uKGUpe2U9Z2V0RXhhY3RseU9uZVNoYXBlKGUpLHRoaXMua2VybmVsPXRoaXMuYWRkV2VpZ2h0KFwia2VybmVsXCIsW2VbZS5sZW5ndGgtMV0sdGhpcy51bml0c10sbnVsbCx0aGlzLmtlcm5lbEluaXRpYWxpemVyLHRoaXMua2VybmVsUmVndWxhcml6ZXIsITAsdGhpcy5rZXJuZWxDb25zdHJhaW50KSx0aGlzLnJlY3VycmVudEtlcm5lbD10aGlzLmFkZFdlaWdodChcInJlY3VycmVudF9rZXJuZWxcIixbdGhpcy51bml0cyx0aGlzLnVuaXRzXSxudWxsLHRoaXMucmVjdXJyZW50SW5pdGlhbGl6ZXIsdGhpcy5yZWN1cnJlbnRSZWd1bGFyaXplciwhMCx0aGlzLnJlY3VycmVudENvbnN0cmFpbnQpLHRoaXMudXNlQmlhcz90aGlzLmJpYXM9dGhpcy5hZGRXZWlnaHQoXCJiaWFzXCIsW3RoaXMudW5pdHNdLG51bGwsdGhpcy5iaWFzSW5pdGlhbGl6ZXIsdGhpcy5iaWFzUmVndWxhcml6ZXIsITAsdGhpcy5iaWFzQ29uc3RyYWludCk6dGhpcy5iaWFzPW51bGwsdGhpcy5idWlsdD0hMH0sdC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXtpZigyIT09KGU9ZSkubGVuZ3RoKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiU2ltcGxlUk5OQ2VsbCBleHBlY3RzIDIgaW5wdXQgVGVuc29ycywgZ290IFwiK2UubGVuZ3RoK1wiLlwiKTt2YXIgcj1lWzFdO2U9ZVswXTt2YXIgaSxhPW51bGwhPXQudHJhaW5pbmcmJnQudHJhaW5pbmc7MDxuLmRyb3BvdXQmJm4uZHJvcG91dDwxJiZudWxsPT1uLmRyb3BvdXRNYXNrJiYobi5kcm9wb3V0TWFzaz1nZW5lcmF0ZURyb3BvdXRNYXNrKGZ1bmN0aW9uKCl7cmV0dXJuIG9uZXNMaWtlKGUpfSxuLmRyb3BvdXQsYSkpLDA8bi5yZWN1cnJlbnREcm9wb3V0JiZuLnJlY3VycmVudERyb3BvdXQ8MSYmbnVsbD09bi5yZWN1cnJlbnREcm9wb3V0TWFzayYmKG4ucmVjdXJyZW50RHJvcG91dE1hc2s9Z2VuZXJhdGVEcm9wb3V0TWFzayhmdW5jdGlvbigpe3JldHVybiBvbmVzTGlrZShyKX0sbi5yZWN1cnJlbnREcm9wb3V0LGEpKTt2YXIgbz1uLmRyb3BvdXRNYXNrLHM9bi5yZWN1cnJlbnREcm9wb3V0TWFzaztpPWRvdChudWxsIT1vP211bChlLG8pOmUsbi5rZXJuZWwucmVhZCgpKSxudWxsIT1uLmJpYXMmJihpPWJpYXNBZGQoaSxuLmJpYXMucmVhZCgpKSksbnVsbCE9cyYmKHI9bXVsKHIscykpO3ZhciBsPWFkZChpLGRvdChyLG4ucmVjdXJyZW50S2VybmVsLnJlYWQoKSkpO3JldHVybiBudWxsIT1uLmFjdGl2YXRpb24mJihsPW4uYWN0aXZhdGlvbi5hcHBseShsKSksW2wsbF19KX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7dmFyIHQ9e3VuaXRzOnRoaXMudW5pdHMsYWN0aXZhdGlvbjpzZXJpYWxpemVBY3RpdmF0aW9uKHRoaXMuYWN0aXZhdGlvbiksdXNlQmlhczp0aGlzLnVzZUJpYXMsa2VybmVsSW5pdGlhbGl6ZXI6c2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5rZXJuZWxJbml0aWFsaXplcikscmVjdXJyZW50SW5pdGlhbGl6ZXI6c2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5yZWN1cnJlbnRJbml0aWFsaXplciksYmlhc0luaXRpYWxpemVyOnNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMuYmlhc0luaXRpYWxpemVyKSxrZXJuZWxSZWd1bGFyaXplcjpzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmtlcm5lbFJlZ3VsYXJpemVyKSxyZWN1cnJlbnRSZWd1bGFyaXplcjpzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLnJlY3VycmVudFJlZ3VsYXJpemVyKSxiaWFzUmVndWxhcml6ZXI6c2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5iaWFzUmVndWxhcml6ZXIpLGFjdGl2aXR5UmVndWxhcml6ZXI6c2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5hY3Rpdml0eVJlZ3VsYXJpemVyKSxrZXJuZWxDb25zdHJhaW50OnNlcmlhbGl6ZUNvbnN0cmFpbnQodGhpcy5rZXJuZWxDb25zdHJhaW50KSxyZWN1cnJlbnRDb25zdHJhaW50OnNlcmlhbGl6ZUNvbnN0cmFpbnQodGhpcy5yZWN1cnJlbnRDb25zdHJhaW50KSxiaWFzQ29uc3RyYWludDpzZXJpYWxpemVDb25zdHJhaW50KHRoaXMuYmlhc0NvbnN0cmFpbnQpLGRyb3BvdXQ6dGhpcy5kcm9wb3V0LHJlY3VycmVudERyb3BvdXQ6dGhpcy5yZWN1cnJlbnREcm9wb3V0fSxuPWUucHJvdG90eXBlLmdldENvbmZpZy5jYWxsKHRoaXMpO3JldHVybiBPYmplY3QuYXNzaWduKHQsbiksdH0sdC5jbGFzc05hbWU9XCJTaW1wbGVSTk5DZWxsXCIsdH0oUk5OQ2VsbCk7c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFNpbXBsZVJOTkNlbGwpO3ZhciBTaW1wbGVSTk49ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gdC5jZWxsPW5ldyBTaW1wbGVSTk5DZWxsKHQpLGUuY2FsbCh0aGlzLHQpfHx0aGlzfXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcztyZXR1cm4gdGlkeShmdW5jdGlvbigpe251bGwhPXIuY2VsbC5kcm9wb3V0TWFzayYmKGRpc3Bvc2Uoci5jZWxsLmRyb3BvdXRNYXNrKSxyLmNlbGwuZHJvcG91dE1hc2s9bnVsbCksbnVsbCE9ci5jZWxsLnJlY3VycmVudERyb3BvdXRNYXNrJiYoZGlzcG9zZShyLmNlbGwucmVjdXJyZW50RHJvcG91dE1hc2spLHIuY2VsbC5yZWN1cnJlbnREcm9wb3V0TWFzaz1udWxsKTt2YXIgaT1udWxsPT1uP251bGw6bi5tYXNrLGE9bnVsbD09bj9udWxsOm4udHJhaW5pbmcsbz1udWxsPT1uP251bGw6bi5pbml0aWFsU3RhdGU7cmV0dXJuIGUucHJvdG90eXBlLmNhbGwuY2FsbChyLHQse21hc2s6aSx0cmFpbmluZzphLGluaXRpYWxTdGF0ZTpvfSl9KX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwidW5pdHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2VsbC51bml0c30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJhY3RpdmF0aW9uXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwuYWN0aXZhdGlvbn0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJ1c2VCaWFzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwudXNlQmlhc30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJrZXJuZWxJbml0aWFsaXplclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jZWxsLmtlcm5lbEluaXRpYWxpemVyfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcInJlY3VycmVudEluaXRpYWxpemVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwucmVjdXJyZW50SW5pdGlhbGl6ZXJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwiYmlhc0luaXRpYWxpemVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwuYmlhc0luaXRpYWxpemVyfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcImtlcm5lbFJlZ3VsYXJpemVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwua2VybmVsUmVndWxhcml6ZXJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwicmVjdXJyZW50UmVndWxhcml6ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2VsbC5yZWN1cnJlbnRSZWd1bGFyaXplcn0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJiaWFzUmVndWxhcml6ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2VsbC5iaWFzUmVndWxhcml6ZXJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwia2VybmVsQ29uc3RyYWludFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jZWxsLmtlcm5lbENvbnN0cmFpbnR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwicmVjdXJyZW50Q29uc3RyYWludFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jZWxsLnJlY3VycmVudENvbnN0cmFpbnR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwiYmlhc0NvbnN0cmFpbnRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2VsbC5iaWFzQ29uc3RyYWludH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJkcm9wb3V0XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwuZHJvcG91dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJyZWN1cnJlbnREcm9wb3V0XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwucmVjdXJyZW50RHJvcG91dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXt2YXIgdD17dW5pdHM6dGhpcy51bml0cyxhY3RpdmF0aW9uOnNlcmlhbGl6ZUFjdGl2YXRpb24odGhpcy5hY3RpdmF0aW9uKSx1c2VCaWFzOnRoaXMudXNlQmlhcyxrZXJuZWxJbml0aWFsaXplcjpzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLmtlcm5lbEluaXRpYWxpemVyKSxyZWN1cnJlbnRJbml0aWFsaXplcjpzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLnJlY3VycmVudEluaXRpYWxpemVyKSxiaWFzSW5pdGlhbGl6ZXI6c2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5iaWFzSW5pdGlhbGl6ZXIpLGtlcm5lbFJlZ3VsYXJpemVyOnNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMua2VybmVsUmVndWxhcml6ZXIpLHJlY3VycmVudFJlZ3VsYXJpemVyOnNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMucmVjdXJyZW50UmVndWxhcml6ZXIpLGJpYXNSZWd1bGFyaXplcjpzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmJpYXNSZWd1bGFyaXplciksYWN0aXZpdHlSZWd1bGFyaXplcjpzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmFjdGl2aXR5UmVndWxhcml6ZXIpLGtlcm5lbENvbnN0cmFpbnQ6c2VyaWFsaXplQ29uc3RyYWludCh0aGlzLmtlcm5lbENvbnN0cmFpbnQpLHJlY3VycmVudENvbnN0cmFpbnQ6c2VyaWFsaXplQ29uc3RyYWludCh0aGlzLnJlY3VycmVudENvbnN0cmFpbnQpLGJpYXNDb25zdHJhaW50OnNlcmlhbGl6ZUNvbnN0cmFpbnQodGhpcy5iaWFzQ29uc3RyYWludCksZHJvcG91dDp0aGlzLmRyb3BvdXQscmVjdXJyZW50RHJvcG91dDp0aGlzLnJlY3VycmVudERyb3BvdXR9LG49ZS5wcm90b3R5cGUuZ2V0Q29uZmlnLmNhbGwodGhpcyk7cmV0dXJuIGRlbGV0ZSBuLmNlbGwsT2JqZWN0LmFzc2lnbih0LG4pLHR9LHQuY2xhc3NOYW1lPVwiU2ltcGxlUk5OXCIsdH0oUk5OKTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoU2ltcGxlUk5OKTt2YXIgR1JVQ2VsbD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzLHQpfHx0aGlzO3JldHVybiBuLkRFRkFVTFRfQUNUSVZBVElPTj1cInRhbmhcIixuLkRFRkFVTFRfUkVDVVJSRU5UX0FDVElWQVRJT049XCJoYXJkU2lnbW9pZFwiLG4uREVGQVVMVF9LRVJORUxfSU5JVElBTElaRVI9XCJnbG9yb3ROb3JtYWxcIixuLkRFRkFVTFRfUkVDVVJSRU5UX0lOSVRJQUxJWkVSPVwib3J0aG9nb25hbFwiLG4uREVGQVVMVF9CSUFTX0lOSVRJQUxJWkVSPVwiemVyb3NcIixuLnVuaXRzPXQudW5pdHMsbi5hY3RpdmF0aW9uPWdldEFjdGl2YXRpb24odm9pZCAwPT09dC5hY3RpdmF0aW9uP24uREVGQVVMVF9BQ1RJVkFUSU9OOnQuYWN0aXZhdGlvbiksbi5yZWN1cnJlbnRBY3RpdmF0aW9uPWdldEFjdGl2YXRpb24odm9pZCAwPT09dC5yZWN1cnJlbnRBY3RpdmF0aW9uP24uREVGQVVMVF9SRUNVUlJFTlRfQUNUSVZBVElPTjp0LnJlY3VycmVudEFjdGl2YXRpb24pLG4udXNlQmlhcz1udWxsPT10LnVzZUJpYXN8fHQudXNlQmlhcyxuLmtlcm5lbEluaXRpYWxpemVyPWdldEluaXRpYWxpemVyKHQua2VybmVsSW5pdGlhbGl6ZXJ8fG4uREVGQVVMVF9LRVJORUxfSU5JVElBTElaRVIpLG4ucmVjdXJyZW50SW5pdGlhbGl6ZXI9Z2V0SW5pdGlhbGl6ZXIodC5yZWN1cnJlbnRJbml0aWFsaXplcnx8bi5ERUZBVUxUX1JFQ1VSUkVOVF9JTklUSUFMSVpFUiksbi5iaWFzSW5pdGlhbGl6ZXI9Z2V0SW5pdGlhbGl6ZXIodC5iaWFzSW5pdGlhbGl6ZXJ8fG4uREVGQVVMVF9CSUFTX0lOSVRJQUxJWkVSKSxuLmtlcm5lbFJlZ3VsYXJpemVyPWdldFJlZ3VsYXJpemVyKHQua2VybmVsUmVndWxhcml6ZXIpLG4ucmVjdXJyZW50UmVndWxhcml6ZXI9Z2V0UmVndWxhcml6ZXIodC5yZWN1cnJlbnRSZWd1bGFyaXplciksbi5iaWFzUmVndWxhcml6ZXI9Z2V0UmVndWxhcml6ZXIodC5iaWFzUmVndWxhcml6ZXIpLG4ua2VybmVsQ29uc3RyYWludD1nZXRDb25zdHJhaW50KHQua2VybmVsQ29uc3RyYWludCksbi5yZWN1cnJlbnRDb25zdHJhaW50PWdldENvbnN0cmFpbnQodC5yZWN1cnJlbnRDb25zdHJhaW50KSxuLmJpYXNDb25zdHJhaW50PWdldENvbnN0cmFpbnQodC5iaWFzQ29uc3RyYWludCksbi5kcm9wb3V0PW1pbiQxKFsxLG1heCQxKFswLG51bGw9PXQuZHJvcG91dD8wOnQuZHJvcG91dF0pXSksbi5yZWN1cnJlbnREcm9wb3V0PW1pbiQxKFsxLG1heCQxKFswLG51bGw9PXQucmVjdXJyZW50RHJvcG91dD8wOnQucmVjdXJyZW50RHJvcG91dF0pXSksbi5pbXBsZW1lbnRhdGlvbj10LmltcGxlbWVudGF0aW9uLG4uc3RhdGVTaXplPW4udW5pdHMsbi5kcm9wb3V0TWFzaz1udWxsLG4ucmVjdXJyZW50RHJvcG91dE1hc2s9bnVsbCxufXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbihlKXt2YXIgdD0oZT1nZXRFeGFjdGx5T25lU2hhcGUoZSkpW2UubGVuZ3RoLTFdO3RoaXMua2VybmVsPXRoaXMuYWRkV2VpZ2h0KFwia2VybmVsXCIsW3QsMyp0aGlzLnVuaXRzXSxudWxsLHRoaXMua2VybmVsSW5pdGlhbGl6ZXIsdGhpcy5rZXJuZWxSZWd1bGFyaXplciwhMCx0aGlzLmtlcm5lbENvbnN0cmFpbnQpLHRoaXMucmVjdXJyZW50S2VybmVsPXRoaXMuYWRkV2VpZ2h0KFwicmVjdXJyZW50X2tlcm5lbFwiLFt0aGlzLnVuaXRzLDMqdGhpcy51bml0c10sbnVsbCx0aGlzLnJlY3VycmVudEluaXRpYWxpemVyLHRoaXMucmVjdXJyZW50UmVndWxhcml6ZXIsITAsdGhpcy5yZWN1cnJlbnRDb25zdHJhaW50KSx0aGlzLnVzZUJpYXM/dGhpcy5iaWFzPXRoaXMuYWRkV2VpZ2h0KFwiYmlhc1wiLFszKnRoaXMudW5pdHNdLG51bGwsdGhpcy5iaWFzSW5pdGlhbGl6ZXIsdGhpcy5iaWFzUmVndWxhcml6ZXIsITAsdGhpcy5iaWFzQ29uc3RyYWludCk6dGhpcy5iaWFzPW51bGwsdGhpcy5idWlsdD0hMH0sdC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXtpZigyIT09KGU9ZSkubGVuZ3RoKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiR1JVQ2VsbCBleHBlY3RzIDIgaW5wdXQgVGVuc29ycyAoaW5wdXRzLCBoLCBjKSwgZ290IFwiK2UubGVuZ3RoK1wiLlwiKTt2YXIgcj1udWxsIT10LnRyYWluaW5nJiZ0LnRyYWluaW5nLGk9ZVsxXTtlPWVbMF0sMDxuLmRyb3BvdXQmJm4uZHJvcG91dDwxJiZudWxsPT1uLmRyb3BvdXRNYXNrJiYobi5kcm9wb3V0TWFzaz1nZW5lcmF0ZURyb3BvdXRNYXNrKGZ1bmN0aW9uKCl7cmV0dXJuIG9uZXNMaWtlKGUpfSxuLmRyb3BvdXQsciwzKSksMDxuLnJlY3VycmVudERyb3BvdXQmJm4ucmVjdXJyZW50RHJvcG91dDwxJiZudWxsPT1uLnJlY3VycmVudERyb3BvdXRNYXNrJiYobi5yZWN1cnJlbnREcm9wb3V0TWFzaz1nZW5lcmF0ZURyb3BvdXRNYXNrKGZ1bmN0aW9uKCl7cmV0dXJuIG9uZXNMaWtlKGkpfSxuLnJlY3VycmVudERyb3BvdXQsciwzKSk7dmFyIGEsbyxzLGw9bi5kcm9wb3V0TWFzayx1PW4ucmVjdXJyZW50RHJvcG91dE1hc2s7aWYoMT09PW4uaW1wbGVtZW50YXRpb24pe3ZhciBjPXNsaWNlQWxvbmdMYXN0QXhpcyhuLmtlcm5lbC5yZWFkKCksMCxuLnVuaXRzKSxwPXNsaWNlQWxvbmdMYXN0QXhpcyhuLmtlcm5lbC5yZWFkKCksbi51bml0cyxuLnVuaXRzKSxoPXNsaWNlQWxvbmdMYXN0QXhpcyhuLmtlcm5lbC5yZWFkKCksMipuLnVuaXRzLG4udW5pdHMpLGQ9c2xpY2VBbG9uZ0xhc3RBeGlzKG4ucmVjdXJyZW50S2VybmVsLnJlYWQoKSwwLG4udW5pdHMpLGc9c2xpY2VBbG9uZ0xhc3RBeGlzKG4ucmVjdXJyZW50S2VybmVsLnJlYWQoKSxuLnVuaXRzLG4udW5pdHMpLGY9c2xpY2VBbG9uZ0xhc3RBeGlzKG4ucmVjdXJyZW50S2VybmVsLnJlYWQoKSwyKm4udW5pdHMsbi51bml0cyksbT12b2lkIDAseT12b2lkIDAsdj12b2lkIDA7MDxuLmRyb3BvdXQmJm4uZHJvcG91dDwxPyhtPW11bChlLGxbMF0pLHk9bXVsKGUsbFsxXSksdj1tdWwoZSxsWzJdKSk6KG09ZSx5PWUsdj1lKTt2YXIgYj1kb3QobSxjKSx3PWRvdCh5LHApLHo9ZG90KHYsaCk7aWYobi51c2VCaWFzKXt2YXIgUz1zbGljZUFsb25nRmlyc3RBeGlzKG4uYmlhcy5yZWFkKCksMCxuLnVuaXRzKSxBPXNsaWNlQWxvbmdGaXJzdEF4aXMobi5iaWFzLnJlYWQoKSxuLnVuaXRzLG4udW5pdHMpLEk9c2xpY2VBbG9uZ0ZpcnN0QXhpcyhuLmJpYXMucmVhZCgpLDIqbi51bml0cyxuLnVuaXRzKTtiPWJpYXNBZGQoYixTKSx3PWJpYXNBZGQodyxBKSx6PWJpYXNBZGQoeixJKX12YXIgQz12b2lkIDAsTj12b2lkIDAsRT12b2lkIDA7MDxuLnJlY3VycmVudERyb3BvdXQmJm4ucmVjdXJyZW50RHJvcG91dDwxPyhDPW11bChpLHVbMF0pLE49bXVsKGksdVsxXSksRT1tdWwoaSx1WzJdKSk6KEM9aSxOPWksRT1pKSxhPW4ucmVjdXJyZW50QWN0aXZhdGlvbi5hcHBseShhZGQoYixkb3QoQyxkKSkpLG89bi5yZWN1cnJlbnRBY3RpdmF0aW9uLmFwcGx5KGFkZCh3LGRvdChOLGcpKSkscz1uLmFjdGl2YXRpb24uYXBwbHkoYWRkKHosZG90KG11bChvLEUpLGYpKSl9ZWxzZXswPG4uZHJvcG91dCYmbi5kcm9wb3V0PDEmJihlPW11bChlLGxbMF0pKTt2YXIgXz1kb3QoZSxuLmtlcm5lbC5yZWFkKCkpO24udXNlQmlhcyYmKF89Ymlhc0FkZChfLG4uYmlhcy5yZWFkKCkpKSwwPG4uZHJvcG91dCYmbi5kcm9wb3V0PDEmJihpPW11bChpLHVbMF0pKTt2YXIgaz1kb3QoaSxzbGljZUFsb25nTGFzdEF4aXMobi5yZWN1cnJlbnRLZXJuZWwucmVhZCgpLDAsMipuLnVuaXRzKSksTD0oYj1zbGljZUFsb25nTGFzdEF4aXMoXywwLG4udW5pdHMpLHc9c2xpY2VBbG9uZ0xhc3RBeGlzKF8sbi51bml0cyxuLnVuaXRzKSxzbGljZUFsb25nTGFzdEF4aXMoaywwLG4udW5pdHMpKSx4PXNsaWNlQWxvbmdMYXN0QXhpcyhrLG4udW5pdHMsbi51bml0cyk7YT1uLnJlY3VycmVudEFjdGl2YXRpb24uYXBwbHkoYWRkKGIsTCkpLG89bi5yZWN1cnJlbnRBY3RpdmF0aW9uLmFwcGx5KGFkZCh3LHgpKTt6PXNsaWNlQWxvbmdMYXN0QXhpcyhfLDIqbi51bml0cyxuLnVuaXRzKTt2YXIgVD1kb3QobXVsKG8saSksc2xpY2VBbG9uZ0xhc3RBeGlzKG4ucmVjdXJyZW50S2VybmVsLnJlYWQoKSwyKm4udW5pdHMsbi51bml0cykpO3M9bi5hY3RpdmF0aW9uLmFwcGx5KGFkZCh6LFQpKX12YXIgRD1hZGQobXVsKGEsaSksbXVsKGFkZChnZXRTY2FsYXIoMSksbmVnKGEpKSxzKSk7cmV0dXJuW0QsRF19KX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7dmFyIHQ9e3VuaXRzOnRoaXMudW5pdHMsYWN0aXZhdGlvbjpzZXJpYWxpemVBY3RpdmF0aW9uKHRoaXMuYWN0aXZhdGlvbikscmVjdXJyZW50QWN0aXZhdGlvbjpzZXJpYWxpemVBY3RpdmF0aW9uKHRoaXMucmVjdXJyZW50QWN0aXZhdGlvbiksdXNlQmlhczp0aGlzLnVzZUJpYXMsa2VybmVsSW5pdGlhbGl6ZXI6c2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5rZXJuZWxJbml0aWFsaXplcikscmVjdXJyZW50SW5pdGlhbGl6ZXI6c2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5yZWN1cnJlbnRJbml0aWFsaXplciksYmlhc0luaXRpYWxpemVyOnNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMuYmlhc0luaXRpYWxpemVyKSxrZXJuZWxSZWd1bGFyaXplcjpzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmtlcm5lbFJlZ3VsYXJpemVyKSxyZWN1cnJlbnRSZWd1bGFyaXplcjpzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLnJlY3VycmVudFJlZ3VsYXJpemVyKSxiaWFzUmVndWxhcml6ZXI6c2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5iaWFzUmVndWxhcml6ZXIpLGFjdGl2aXR5UmVndWxhcml6ZXI6c2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5hY3Rpdml0eVJlZ3VsYXJpemVyKSxrZXJuZWxDb25zdHJhaW50OnNlcmlhbGl6ZUNvbnN0cmFpbnQodGhpcy5rZXJuZWxDb25zdHJhaW50KSxyZWN1cnJlbnRDb25zdHJhaW50OnNlcmlhbGl6ZUNvbnN0cmFpbnQodGhpcy5yZWN1cnJlbnRDb25zdHJhaW50KSxiaWFzQ29uc3RyYWludDpzZXJpYWxpemVDb25zdHJhaW50KHRoaXMuYmlhc0NvbnN0cmFpbnQpLGRyb3BvdXQ6dGhpcy5kcm9wb3V0LHJlY3VycmVudERyb3BvdXQ6dGhpcy5yZWN1cnJlbnREcm9wb3V0LGltcGxlbWVudGF0aW9uOnRoaXMuaW1wbGVtZW50YXRpb259LG49ZS5wcm90b3R5cGUuZ2V0Q29uZmlnLmNhbGwodGhpcyk7cmV0dXJuIE9iamVjdC5hc3NpZ24odCxuKSx0fSx0LmNsYXNzTmFtZT1cIkdSVUNlbGxcIix0fShSTk5DZWxsKTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoR1JVQ2VsbCk7dmFyIEdSVT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3JldHVybiAwPT09dC5pbXBsZW1lbnRhdGlvbiYmY29uc29sZS53YXJuKFwiYGltcGxlbWVudGF0aW9uPTBgIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIGFuZCBub3cgZGVmYXVsdHMgdG8gYGltcGxlbWVudGF0aW9uPTFgLiBQbGVhc2UgdXBkYXRlIHlvdXIgbGF5ZXIgY2FsbC5cIiksdC5jZWxsPW5ldyBHUlVDZWxsKHQpLGUuY2FsbCh0aGlzLHQpfHx0aGlzfXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcztyZXR1cm4gdGlkeShmdW5jdGlvbigpe251bGwhPXIuY2VsbC5kcm9wb3V0TWFzayYmKGRpc3Bvc2Uoci5jZWxsLmRyb3BvdXRNYXNrKSxyLmNlbGwuZHJvcG91dE1hc2s9bnVsbCksbnVsbCE9ci5jZWxsLnJlY3VycmVudERyb3BvdXRNYXNrJiYoZGlzcG9zZShyLmNlbGwucmVjdXJyZW50RHJvcG91dE1hc2spLHIuY2VsbC5yZWN1cnJlbnREcm9wb3V0TWFzaz1udWxsKTt2YXIgaT1udWxsPT1uP251bGw6bi5tYXNrLGE9bnVsbD09bj9udWxsOm4udHJhaW5pbmcsbz1udWxsPT1uP251bGw6bi5pbml0aWFsU3RhdGU7cmV0dXJuIGUucHJvdG90eXBlLmNhbGwuY2FsbChyLHQse21hc2s6aSx0cmFpbmluZzphLGluaXRpYWxTdGF0ZTpvfSl9KX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwidW5pdHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2VsbC51bml0c30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJhY3RpdmF0aW9uXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwuYWN0aXZhdGlvbn0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJyZWN1cnJlbnRBY3RpdmF0aW9uXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwucmVjdXJyZW50QWN0aXZhdGlvbn0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJ1c2VCaWFzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwudXNlQmlhc30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJrZXJuZWxJbml0aWFsaXplclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jZWxsLmtlcm5lbEluaXRpYWxpemVyfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcInJlY3VycmVudEluaXRpYWxpemVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwucmVjdXJyZW50SW5pdGlhbGl6ZXJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwiYmlhc0luaXRpYWxpemVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwuYmlhc0luaXRpYWxpemVyfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcImtlcm5lbFJlZ3VsYXJpemVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwua2VybmVsUmVndWxhcml6ZXJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwicmVjdXJyZW50UmVndWxhcml6ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2VsbC5yZWN1cnJlbnRSZWd1bGFyaXplcn0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJiaWFzUmVndWxhcml6ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2VsbC5iaWFzUmVndWxhcml6ZXJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwia2VybmVsQ29uc3RyYWludFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jZWxsLmtlcm5lbENvbnN0cmFpbnR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwicmVjdXJyZW50Q29uc3RyYWludFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jZWxsLnJlY3VycmVudENvbnN0cmFpbnR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwiYmlhc0NvbnN0cmFpbnRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2VsbC5iaWFzQ29uc3RyYWludH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJkcm9wb3V0XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwuZHJvcG91dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJyZWN1cnJlbnREcm9wb3V0XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwucmVjdXJyZW50RHJvcG91dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJpbXBsZW1lbnRhdGlvblwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jZWxsLmltcGxlbWVudGF0aW9ufSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmdldENvbmZpZz1mdW5jdGlvbigpe3ZhciB0PXt1bml0czp0aGlzLnVuaXRzLGFjdGl2YXRpb246c2VyaWFsaXplQWN0aXZhdGlvbih0aGlzLmFjdGl2YXRpb24pLHJlY3VycmVudEFjdGl2YXRpb246c2VyaWFsaXplQWN0aXZhdGlvbih0aGlzLnJlY3VycmVudEFjdGl2YXRpb24pLHVzZUJpYXM6dGhpcy51c2VCaWFzLGtlcm5lbEluaXRpYWxpemVyOnNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMua2VybmVsSW5pdGlhbGl6ZXIpLHJlY3VycmVudEluaXRpYWxpemVyOnNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMucmVjdXJyZW50SW5pdGlhbGl6ZXIpLGJpYXNJbml0aWFsaXplcjpzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLmJpYXNJbml0aWFsaXplciksa2VybmVsUmVndWxhcml6ZXI6c2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5rZXJuZWxSZWd1bGFyaXplcikscmVjdXJyZW50UmVndWxhcml6ZXI6c2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5yZWN1cnJlbnRSZWd1bGFyaXplciksYmlhc1JlZ3VsYXJpemVyOnNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYmlhc1JlZ3VsYXJpemVyKSxhY3Rpdml0eVJlZ3VsYXJpemVyOnNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYWN0aXZpdHlSZWd1bGFyaXplciksa2VybmVsQ29uc3RyYWludDpzZXJpYWxpemVDb25zdHJhaW50KHRoaXMua2VybmVsQ29uc3RyYWludCkscmVjdXJyZW50Q29uc3RyYWludDpzZXJpYWxpemVDb25zdHJhaW50KHRoaXMucmVjdXJyZW50Q29uc3RyYWludCksYmlhc0NvbnN0cmFpbnQ6c2VyaWFsaXplQ29uc3RyYWludCh0aGlzLmJpYXNDb25zdHJhaW50KSxkcm9wb3V0OnRoaXMuZHJvcG91dCxyZWN1cnJlbnREcm9wb3V0OnRoaXMucmVjdXJyZW50RHJvcG91dCxpbXBsZW1lbnRhdGlvbjp0aGlzLmltcGxlbWVudGF0aW9ufSxuPWUucHJvdG90eXBlLmdldENvbmZpZy5jYWxsKHRoaXMpO3JldHVybiBkZWxldGUgbi5jZWxsLE9iamVjdC5hc3NpZ24odCxuKSx0fSx0LmZyb21Db25maWc9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMD09PXQuaW1wbG1lbnRhdGlvbiYmKHQuaW1wbGVtZW50YXRpb249MSksbmV3IGUodCl9LHQuY2xhc3NOYW1lPVwiR1JVXCIsdH0oUk5OKTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoR1JVKTt2YXIgTFNUTUNlbGw9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyx0KXx8dGhpcztyZXR1cm4gbi5ERUZBVUxUX0FDVElWQVRJT049XCJ0YW5oXCIsbi5ERUZBVUxUX1JFQ1VSUkVOVF9BQ1RJVkFUSU9OPVwiaGFyZFNpZ21vaWRcIixuLkRFRkFVTFRfS0VSTkVMX0lOSVRJQUxJWkVSPVwiZ2xvcm90Tm9ybWFsXCIsbi5ERUZBVUxUX1JFQ1VSUkVOVF9JTklUSUFMSVpFUj1cIm9ydGhvZ29uYWxcIixuLkRFRkFVTFRfQklBU19JTklUSUFMSVpFUj1cInplcm9zXCIsbi51bml0cz10LnVuaXRzLG4uYWN0aXZhdGlvbj1nZXRBY3RpdmF0aW9uKHZvaWQgMD09PXQuYWN0aXZhdGlvbj9uLkRFRkFVTFRfQUNUSVZBVElPTjp0LmFjdGl2YXRpb24pLG4ucmVjdXJyZW50QWN0aXZhdGlvbj1nZXRBY3RpdmF0aW9uKHZvaWQgMD09PXQucmVjdXJyZW50QWN0aXZhdGlvbj9uLkRFRkFVTFRfUkVDVVJSRU5UX0FDVElWQVRJT046dC5yZWN1cnJlbnRBY3RpdmF0aW9uKSxuLnVzZUJpYXM9bnVsbD09dC51c2VCaWFzfHx0LnVzZUJpYXMsbi5rZXJuZWxJbml0aWFsaXplcj1nZXRJbml0aWFsaXplcih0Lmtlcm5lbEluaXRpYWxpemVyfHxuLkRFRkFVTFRfS0VSTkVMX0lOSVRJQUxJWkVSKSxuLnJlY3VycmVudEluaXRpYWxpemVyPWdldEluaXRpYWxpemVyKHQucmVjdXJyZW50SW5pdGlhbGl6ZXJ8fG4uREVGQVVMVF9SRUNVUlJFTlRfSU5JVElBTElaRVIpLG4uYmlhc0luaXRpYWxpemVyPWdldEluaXRpYWxpemVyKHQuYmlhc0luaXRpYWxpemVyfHxuLkRFRkFVTFRfQklBU19JTklUSUFMSVpFUiksbi51bml0Rm9yZ2V0Qmlhcz10LnVuaXRGb3JnZXRCaWFzLG4ua2VybmVsUmVndWxhcml6ZXI9Z2V0UmVndWxhcml6ZXIodC5rZXJuZWxSZWd1bGFyaXplciksbi5yZWN1cnJlbnRSZWd1bGFyaXplcj1nZXRSZWd1bGFyaXplcih0LnJlY3VycmVudFJlZ3VsYXJpemVyKSxuLmJpYXNSZWd1bGFyaXplcj1nZXRSZWd1bGFyaXplcih0LmJpYXNSZWd1bGFyaXplciksbi5rZXJuZWxDb25zdHJhaW50PWdldENvbnN0cmFpbnQodC5rZXJuZWxDb25zdHJhaW50KSxuLnJlY3VycmVudENvbnN0cmFpbnQ9Z2V0Q29uc3RyYWludCh0LnJlY3VycmVudENvbnN0cmFpbnQpLG4uYmlhc0NvbnN0cmFpbnQ9Z2V0Q29uc3RyYWludCh0LmJpYXNDb25zdHJhaW50KSxuLmRyb3BvdXQ9bWluJDEoWzEsbWF4JDEoWzAsbnVsbD09dC5kcm9wb3V0PzA6dC5kcm9wb3V0XSldKSxuLnJlY3VycmVudERyb3BvdXQ9bWluJDEoWzEsbWF4JDEoWzAsbnVsbD09dC5yZWN1cnJlbnREcm9wb3V0PzA6dC5yZWN1cnJlbnREcm9wb3V0XSldKSxuLmltcGxlbWVudGF0aW9uPXQuaW1wbGVtZW50YXRpb24sbi5zdGF0ZVNpemU9W24udW5pdHMsbi51bml0c10sbi5kcm9wb3V0TWFzaz1udWxsLG4ucmVjdXJyZW50RHJvcG91dE1hc2s9bnVsbCxufXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbihlKXt2YXIgdCxuLHI9KGU9Z2V0RXhhY3RseU9uZVNoYXBlKGUpKVtlLmxlbmd0aC0xXTtpZih0aGlzLmtlcm5lbD10aGlzLmFkZFdlaWdodChcImtlcm5lbFwiLFtyLDQqdGhpcy51bml0c10sbnVsbCx0aGlzLmtlcm5lbEluaXRpYWxpemVyLHRoaXMua2VybmVsUmVndWxhcml6ZXIsITAsdGhpcy5rZXJuZWxDb25zdHJhaW50KSx0aGlzLnJlY3VycmVudEtlcm5lbD10aGlzLmFkZFdlaWdodChcInJlY3VycmVudF9rZXJuZWxcIixbdGhpcy51bml0cyw0KnRoaXMudW5pdHNdLG51bGwsdGhpcy5yZWN1cnJlbnRJbml0aWFsaXplcix0aGlzLnJlY3VycmVudFJlZ3VsYXJpemVyLCEwLHRoaXMucmVjdXJyZW50Q29uc3RyYWludCksdGhpcy51c2VCaWFzKXtpZih0aGlzLnVuaXRGb3JnZXRCaWFzKXt2YXIgaT10aGlzLmJpYXNJbml0aWFsaXplcixhPXRoaXMudW5pdHM7dD1uZXcoKG49ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3JldHVybiBudWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIF9fZXh0ZW5kcyh0LGUpLHQucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKGUsdCl7dmFyIG49aS5hcHBseShbYV0pLHI9KG5ldyBPbmVzKS5hcHBseShbYV0pLG89aS5hcHBseShbMiphXSk7cmV0dXJuIGNvbmNhdEFsb25nRmlyc3RBeGlzKGNvbmNhdEFsb25nRmlyc3RBeGlzKG4sciksbyl9LHR9KEluaXRpYWxpemVyKSkuY2xhc3NOYW1lPVwiQ3VzdG9tSW5pdFwiLG4pfWVsc2UgdD10aGlzLmJpYXNJbml0aWFsaXplcjt0aGlzLmJpYXM9dGhpcy5hZGRXZWlnaHQoXCJiaWFzXCIsWzQqdGhpcy51bml0c10sbnVsbCx0LHRoaXMuYmlhc1JlZ3VsYXJpemVyLCEwLHRoaXMuYmlhc0NvbnN0cmFpbnQpfWVsc2UgdGhpcy5iaWFzPW51bGw7dGhpcy5idWlsdD0hMH0sdC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXt2YXIgcj1udWxsIT10LnRyYWluaW5nJiZ0LnRyYWluaW5nO2lmKDMhPT0oZT1lKS5sZW5ndGgpdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJMU1RNQ2VsbCBleHBlY3RzIDMgaW5wdXQgVGVuc29ycyAoaW5wdXRzLCBoLCBjKSwgZ290IFwiK2UubGVuZ3RoK1wiLlwiKTt2YXIgaT1lWzFdLGE9ZVsyXTtlPWVbMF0sMDxuLmRyb3BvdXQmJm4uZHJvcG91dDwxJiZudWxsPT1uLmRyb3BvdXRNYXNrJiYobi5kcm9wb3V0TWFzaz1nZW5lcmF0ZURyb3BvdXRNYXNrKGZ1bmN0aW9uKCl7cmV0dXJuIG9uZXNMaWtlKGUpfSxuLmRyb3BvdXQsciw0KSksMDxuLnJlY3VycmVudERyb3BvdXQmJm4ucmVjdXJyZW50RHJvcG91dDwxJiZudWxsPT1uLnJlY3VycmVudERyb3BvdXRNYXNrJiYobi5yZWN1cnJlbnREcm9wb3V0TWFzaz1nZW5lcmF0ZURyb3BvdXRNYXNrKGZ1bmN0aW9uKCl7cmV0dXJuIG9uZXNMaWtlKGkpfSxuLnJlY3VycmVudERyb3BvdXQsciw0KSk7dmFyIG8scyxsLHUsYz1uLmRyb3BvdXRNYXNrLHA9bi5yZWN1cnJlbnREcm9wb3V0TWFzaztpZigxPT09bi5pbXBsZW1lbnRhdGlvbil7dmFyIGg9c2xpY2VBbG9uZ0xhc3RBeGlzKG4ua2VybmVsLnJlYWQoKSwwLG4udW5pdHMpLGQ9c2xpY2VBbG9uZ0xhc3RBeGlzKG4ua2VybmVsLnJlYWQoKSxuLnVuaXRzLG4udW5pdHMpLGc9c2xpY2VBbG9uZ0xhc3RBeGlzKG4ua2VybmVsLnJlYWQoKSwyKm4udW5pdHMsbi51bml0cyksZj1zbGljZUFsb25nTGFzdEF4aXMobi5rZXJuZWwucmVhZCgpLDMqbi51bml0cyxuLnVuaXRzKSxtPXNsaWNlQWxvbmdMYXN0QXhpcyhuLnJlY3VycmVudEtlcm5lbC5yZWFkKCksMCxuLnVuaXRzKSx5PXNsaWNlQWxvbmdMYXN0QXhpcyhuLnJlY3VycmVudEtlcm5lbC5yZWFkKCksbi51bml0cyxuLnVuaXRzKSx2PXNsaWNlQWxvbmdMYXN0QXhpcyhuLnJlY3VycmVudEtlcm5lbC5yZWFkKCksMipuLnVuaXRzLG4udW5pdHMpLGI9c2xpY2VBbG9uZ0xhc3RBeGlzKG4ucmVjdXJyZW50S2VybmVsLnJlYWQoKSwzKm4udW5pdHMsbi51bml0cyksdz12b2lkIDAsej12b2lkIDAsUz12b2lkIDAsQT12b2lkIDA7MDxuLmRyb3BvdXQmJm4uZHJvcG91dDwxPyh3PW11bChlLGNbMF0pLHo9bXVsKGUsY1sxXSksUz1tdWwoZSxjWzJdKSxBPW11bChlLGNbM10pKToodz1lLHo9ZSxTPWUsQT1lKTt2YXIgST1kb3QodyxoKSxDPWRvdCh6LGQpLE49ZG90KFMsZyksRT1kb3QoQSxmKTtpZihuLnVzZUJpYXMpe3ZhciBfPXNsaWNlQWxvbmdGaXJzdEF4aXMobi5iaWFzLnJlYWQoKSwwLG4udW5pdHMpLGs9c2xpY2VBbG9uZ0ZpcnN0QXhpcyhuLmJpYXMucmVhZCgpLG4udW5pdHMsbi51bml0cyksTD1zbGljZUFsb25nRmlyc3RBeGlzKG4uYmlhcy5yZWFkKCksMipuLnVuaXRzLG4udW5pdHMpLHg9c2xpY2VBbG9uZ0ZpcnN0QXhpcyhuLmJpYXMucmVhZCgpLDMqbi51bml0cyxuLnVuaXRzKTtJPWJpYXNBZGQoSSxfKSxDPWJpYXNBZGQoQyxrKSxOPWJpYXNBZGQoTixMKSxFPWJpYXNBZGQoRSx4KX12YXIgVD12b2lkIDAsRD12b2lkIDAsUj12b2lkIDAsTz12b2lkIDA7MDxuLnJlY3VycmVudERyb3BvdXQmJm4ucmVjdXJyZW50RHJvcG91dDwxPyhUPW11bChpLHBbMF0pLEQ9bXVsKGkscFsxXSksUj1tdWwoaSxwWzJdKSxPPW11bChpLHBbM10pKTooVD1pLEQ9aSxSPWksTz1pKSxvPW4ucmVjdXJyZW50QWN0aXZhdGlvbi5hcHBseShhZGQoSSxkb3QoVCxtKSkpLHM9bi5yZWN1cnJlbnRBY3RpdmF0aW9uLmFwcGx5KGFkZChDLGRvdChELHkpKSksbD1hZGQobXVsKHMsYSksbXVsKG8sbi5hY3RpdmF0aW9uLmFwcGx5KGFkZChOLGRvdChSLHYpKSkpKSx1PW4ucmVjdXJyZW50QWN0aXZhdGlvbi5hcHBseShhZGQoRSxkb3QoTyxiKSkpfWVsc2V7MDxuLmRyb3BvdXQmJm4uZHJvcG91dDwxJiYoZT1tdWwoZSxjWzBdKSk7dmFyIE09ZG90KGUsbi5rZXJuZWwucmVhZCgpKTswPG4ucmVjdXJyZW50RHJvcG91dCYmbi5yZWN1cnJlbnREcm9wb3V0PDEmJihpPW11bChpLHBbMF0pKSxNPWFkZChNLGRvdChpLG4ucmVjdXJyZW50S2VybmVsLnJlYWQoKSkpLG4udXNlQmlhcyYmKE09Ymlhc0FkZChNLG4uYmlhcy5yZWFkKCkpKTt2YXIgUD1zbGljZUFsb25nTGFzdEF4aXMoTSwwLG4udW5pdHMpLFY9c2xpY2VBbG9uZ0xhc3RBeGlzKE0sbi51bml0cyxuLnVuaXRzKSxGPXNsaWNlQWxvbmdMYXN0QXhpcyhNLDIqbi51bml0cyxuLnVuaXRzKSxCPXNsaWNlQWxvbmdMYXN0QXhpcyhNLDMqbi51bml0cyxuLnVuaXRzKTtvPW4ucmVjdXJyZW50QWN0aXZhdGlvbi5hcHBseShQKSxzPW4ucmVjdXJyZW50QWN0aXZhdGlvbi5hcHBseShWKSxsPWFkZChtdWwocyxhKSxtdWwobyxuLmFjdGl2YXRpb24uYXBwbHkoRikpKSx1PW4ucmVjdXJyZW50QWN0aXZhdGlvbi5hcHBseShCKX12YXIgVT1tdWwodSxuLmFjdGl2YXRpb24uYXBwbHkobCkpO3JldHVybltVLFUsbF19KX0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7dmFyIHQ9e3VuaXRzOnRoaXMudW5pdHMsYWN0aXZhdGlvbjpzZXJpYWxpemVBY3RpdmF0aW9uKHRoaXMuYWN0aXZhdGlvbikscmVjdXJyZW50QWN0aXZhdGlvbjpzZXJpYWxpemVBY3RpdmF0aW9uKHRoaXMucmVjdXJyZW50QWN0aXZhdGlvbiksdXNlQmlhczp0aGlzLnVzZUJpYXMsa2VybmVsSW5pdGlhbGl6ZXI6c2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5rZXJuZWxJbml0aWFsaXplcikscmVjdXJyZW50SW5pdGlhbGl6ZXI6c2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5yZWN1cnJlbnRJbml0aWFsaXplciksYmlhc0luaXRpYWxpemVyOnNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMuYmlhc0luaXRpYWxpemVyKSx1bml0Rm9yZ2V0Qmlhczp0aGlzLnVuaXRGb3JnZXRCaWFzLGtlcm5lbFJlZ3VsYXJpemVyOnNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMua2VybmVsUmVndWxhcml6ZXIpLHJlY3VycmVudFJlZ3VsYXJpemVyOnNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMucmVjdXJyZW50UmVndWxhcml6ZXIpLGJpYXNSZWd1bGFyaXplcjpzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmJpYXNSZWd1bGFyaXplciksYWN0aXZpdHlSZWd1bGFyaXplcjpzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmFjdGl2aXR5UmVndWxhcml6ZXIpLGtlcm5lbENvbnN0cmFpbnQ6c2VyaWFsaXplQ29uc3RyYWludCh0aGlzLmtlcm5lbENvbnN0cmFpbnQpLHJlY3VycmVudENvbnN0cmFpbnQ6c2VyaWFsaXplQ29uc3RyYWludCh0aGlzLnJlY3VycmVudENvbnN0cmFpbnQpLGJpYXNDb25zdHJhaW50OnNlcmlhbGl6ZUNvbnN0cmFpbnQodGhpcy5iaWFzQ29uc3RyYWludCksZHJvcG91dDp0aGlzLmRyb3BvdXQscmVjdXJyZW50RHJvcG91dDp0aGlzLnJlY3VycmVudERyb3BvdXQsaW1wbGVtZW50YXRpb246dGhpcy5pbXBsZW1lbnRhdGlvbn0sbj1lLnByb3RvdHlwZS5nZXRDb25maWcuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0LmFzc2lnbih0LG4pLHR9LHQuY2xhc3NOYW1lPVwiTFNUTUNlbGxcIix0fShSTk5DZWxsKTtzZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoTFNUTUNlbGwpO3ZhciBMU1RNPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIDA9PT10LmltcGxlbWVudGF0aW9uJiZjb25zb2xlLndhcm4oXCJgaW1wbGVtZW50YXRpb249MGAgaGFzIGJlZW4gZGVwcmVjYXRlZCwgYW5kIG5vdyBkZWZhdWx0cyB0byBgaW1wbGVtZW50YXRpb249MWAuIFBsZWFzZSB1cGRhdGUgeW91ciBsYXllciBjYWxsLlwiKSx0LmNlbGw9bmV3IExTVE1DZWxsKHQpLGUuY2FsbCh0aGlzLHQpfHx0aGlzfXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcztyZXR1cm4gdGlkeShmdW5jdGlvbigpe251bGwhPXIuY2VsbC5kcm9wb3V0TWFzayYmKGRpc3Bvc2Uoci5jZWxsLmRyb3BvdXRNYXNrKSxyLmNlbGwuZHJvcG91dE1hc2s9bnVsbCksbnVsbCE9ci5jZWxsLnJlY3VycmVudERyb3BvdXRNYXNrJiYoZGlzcG9zZShyLmNlbGwucmVjdXJyZW50RHJvcG91dE1hc2spLHIuY2VsbC5yZWN1cnJlbnREcm9wb3V0TWFzaz1udWxsKTt2YXIgaT1udWxsPT1uP251bGw6bi5tYXNrLGE9bnVsbD09bj9udWxsOm4udHJhaW5pbmcsbz1udWxsPT1uP251bGw6bi5pbml0aWFsU3RhdGU7cmV0dXJuIGUucHJvdG90eXBlLmNhbGwuY2FsbChyLHQse21hc2s6aSx0cmFpbmluZzphLGluaXRpYWxTdGF0ZTpvfSl9KX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwidW5pdHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2VsbC51bml0c30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJhY3RpdmF0aW9uXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwuYWN0aXZhdGlvbn0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJyZWN1cnJlbnRBY3RpdmF0aW9uXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwucmVjdXJyZW50QWN0aXZhdGlvbn0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJ1c2VCaWFzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwudXNlQmlhc30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJrZXJuZWxJbml0aWFsaXplclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jZWxsLmtlcm5lbEluaXRpYWxpemVyfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcInJlY3VycmVudEluaXRpYWxpemVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwucmVjdXJyZW50SW5pdGlhbGl6ZXJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwiYmlhc0luaXRpYWxpemVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwuYmlhc0luaXRpYWxpemVyfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcInVuaXRGb3JnZXRCaWFzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwudW5pdEZvcmdldEJpYXN9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwia2VybmVsUmVndWxhcml6ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2VsbC5rZXJuZWxSZWd1bGFyaXplcn0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJyZWN1cnJlbnRSZWd1bGFyaXplclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jZWxsLnJlY3VycmVudFJlZ3VsYXJpemVyfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcImJpYXNSZWd1bGFyaXplclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jZWxsLmJpYXNSZWd1bGFyaXplcn0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJrZXJuZWxDb25zdHJhaW50XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwua2VybmVsQ29uc3RyYWludH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJyZWN1cnJlbnRDb25zdHJhaW50XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwucmVjdXJyZW50Q29uc3RyYWludH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJiaWFzQ29uc3RyYWludFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jZWxsLmJpYXNDb25zdHJhaW50fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcImRyb3BvdXRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2VsbC5kcm9wb3V0fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcInJlY3VycmVudERyb3BvdXRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2VsbC5yZWN1cnJlbnREcm9wb3V0fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcImltcGxlbWVudGF0aW9uXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGwuaW1wbGVtZW50YXRpb259LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7dmFyIHQ9e3VuaXRzOnRoaXMudW5pdHMsYWN0aXZhdGlvbjpzZXJpYWxpemVBY3RpdmF0aW9uKHRoaXMuYWN0aXZhdGlvbikscmVjdXJyZW50QWN0aXZhdGlvbjpzZXJpYWxpemVBY3RpdmF0aW9uKHRoaXMucmVjdXJyZW50QWN0aXZhdGlvbiksdXNlQmlhczp0aGlzLnVzZUJpYXMsa2VybmVsSW5pdGlhbGl6ZXI6c2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5rZXJuZWxJbml0aWFsaXplcikscmVjdXJyZW50SW5pdGlhbGl6ZXI6c2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5yZWN1cnJlbnRJbml0aWFsaXplciksYmlhc0luaXRpYWxpemVyOnNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMuYmlhc0luaXRpYWxpemVyKSx1bml0Rm9yZ2V0Qmlhczp0aGlzLnVuaXRGb3JnZXRCaWFzLGtlcm5lbFJlZ3VsYXJpemVyOnNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMua2VybmVsUmVndWxhcml6ZXIpLHJlY3VycmVudFJlZ3VsYXJpemVyOnNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMucmVjdXJyZW50UmVndWxhcml6ZXIpLGJpYXNSZWd1bGFyaXplcjpzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmJpYXNSZWd1bGFyaXplciksYWN0aXZpdHlSZWd1bGFyaXplcjpzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmFjdGl2aXR5UmVndWxhcml6ZXIpLGtlcm5lbENvbnN0cmFpbnQ6c2VyaWFsaXplQ29uc3RyYWludCh0aGlzLmtlcm5lbENvbnN0cmFpbnQpLHJlY3VycmVudENvbnN0cmFpbnQ6c2VyaWFsaXplQ29uc3RyYWludCh0aGlzLnJlY3VycmVudENvbnN0cmFpbnQpLGJpYXNDb25zdHJhaW50OnNlcmlhbGl6ZUNvbnN0cmFpbnQodGhpcy5iaWFzQ29uc3RyYWludCksZHJvcG91dDp0aGlzLmRyb3BvdXQscmVjdXJyZW50RHJvcG91dDp0aGlzLnJlY3VycmVudERyb3BvdXQsaW1wbGVtZW50YXRpb246dGhpcy5pbXBsZW1lbnRhdGlvbn0sbj1lLnByb3RvdHlwZS5nZXRDb25maWcuY2FsbCh0aGlzKTtyZXR1cm4gZGVsZXRlIG4uY2VsbCxPYmplY3QuYXNzaWduKHQsbiksdH0sdC5mcm9tQ29uZmlnPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIDA9PT10LmltcGxtZW50YXRpb24mJih0LmltcGxlbWVudGF0aW9uPTEpLG5ldyBlKHQpfSx0LmNsYXNzTmFtZT1cIkxTVE1cIix0fShSTk4pO3NlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhMU1RNKTt2YXIgU3RhY2tlZFJOTkNlbGxzPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIG49ZS5jYWxsKHRoaXMsdCl8fHRoaXM7cmV0dXJuIG4uY2VsbHM9dC5jZWxscyxufXJldHVybiBfX2V4dGVuZHModCxlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJzdGF0ZVNpemVcIix7Z2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9MCxuPXRoaXMuY2VsbHMuc2xpY2UoKS5yZXZlcnNlKCk7dDxuLmxlbmd0aDt0Kyspe3ZhciByPW5bdF07QXJyYXkuaXNBcnJheShyLnN0YXRlU2l6ZSk/ZS5wdXNoLmFwcGx5KGUsci5zdGF0ZVNpemUpOmUucHVzaChyLnN0YXRlU2l6ZSl9cmV0dXJuIGV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7cmV0dXJuIHRpZHkoZnVuY3Rpb24oKXtmb3IodmFyIHI9KGU9ZSkuc2xpY2UoMSksaT1bXSxhPTAsbz1uLmNlbGxzLnNsaWNlKCkucmV2ZXJzZSgpO2E8by5sZW5ndGg7YSsrKXt2YXIgcz1vW2FdO0FycmF5LmlzQXJyYXkocy5zdGF0ZVNpemUpP2kucHVzaChyLnNwbGljZSgwLHMuc3RhdGVTaXplLmxlbmd0aCkpOmkucHVzaChyLnNwbGljZSgwLDEpKX1pLnJldmVyc2UoKTtmb3IodmFyIGwsdT1bXSxjPTA7YzxuLmNlbGxzLmxlbmd0aDsrK2Mpe3M9bi5jZWxsc1tjXTtyPWlbY10sbD0wPT09Yz9bZVswXV0uY29uY2F0KHIpOltsWzBdXS5jb25jYXQociksbD1zLmNhbGwobCx0KSx1LnB1c2gobC5zbGljZSgxKSl9cj1bXTtmb3IodmFyIHA9MCxoPXUuc2xpY2UoKS5yZXZlcnNlKCk7cDxoLmxlbmd0aDtwKyspe3ZhciBkPWhbcF07ci5wdXNoLmFwcGx5KHIsZCl9cmV0dXJuW2xbMF1dLmNvbmNhdChyKX0pfSx0LnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbihlKXt2YXIgdDtpc0FycmF5T2ZTaGFwZXMoZSkmJihlPWVbMF0pLGU9ZTtmb3IodmFyIG49MCxyPXRoaXMuY2VsbHM7bjxyLmxlbmd0aDtuKyspe3ZhciBpPXJbbl07aS5idWlsZChlKSx0PUFycmF5LmlzQXJyYXkoaS5zdGF0ZVNpemUpP2kuc3RhdGVTaXplWzBdOmkuc3RhdGVTaXplLGU9W2VbMF0sdF19dGhpcy5idWlsdD0hMH0sdC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLG49MCxyPXRoaXMuY2VsbHM7bjxyLmxlbmd0aDtuKyspe3ZhciBpPXJbbl07dC5wdXNoKHtjbGFzc05hbWU6dGhpcy5nZXRDbGFzc05hbWUoKSxjb25maWc6aS5nZXRDb25maWcoKX0pfXZhciBhPXtjZWxsczp0fSxvPWUucHJvdG90eXBlLmdldENvbmZpZy5jYWxsKHRoaXMpO3JldHVybiBPYmplY3QuYXNzaWduKGEsbyksYX0sdC5mcm9tQ29uZmlnPWZ1bmN0aW9uKGUsdCxuKXt2b2lkIDA9PT1uJiYobj17fSk7Zm9yKHZhciByPVtdLGk9MCxhPXQuY2VsbHM7aTxhLmxlbmd0aDtpKyspe3ZhciBvPWFbaV07ci5wdXNoKGRlc2VyaWFsaXplKG8sbikpfXJldHVybiBuZXcgZSh7Y2VsbHM6cn0pfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJ0cmFpbmFibGVXZWlnaHRzXCIse2dldDpmdW5jdGlvbigpe2lmKCF0aGlzLnRyYWluYWJsZSlyZXR1cm5bXTtmb3IodmFyIGU9W10sdD0wLG49dGhpcy5jZWxsczt0PG4ubGVuZ3RoO3QrKyl7dmFyIHI9blt0XTtlLnB1c2guYXBwbHkoZSxyLnRyYWluYWJsZVdlaWdodHMpfXJldHVybiBlfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcIm5vblRyYWluYWJsZVdlaWdodHNcIix7Z2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9MCxuPXRoaXMuY2VsbHM7dDxuLmxlbmd0aDt0Kyspe3ZhciByPW5bdF07ZS5wdXNoLmFwcGx5KGUsci5ub25UcmFpbmFibGVXZWlnaHRzKX1pZighdGhpcy50cmFpbmFibGUpe2Zvcih2YXIgaT1bXSxhPTAsbz10aGlzLmNlbGxzO2E8by5sZW5ndGg7YSsrKXtyPW9bYV07aS5wdXNoLmFwcGx5KGksci50cmFpbmFibGVXZWlnaHRzKX1yZXR1cm4gaS5jb25jYXQoZSl9cmV0dXJuIGV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuZ2V0V2VpZ2h0cz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PTAsbj10aGlzLmNlbGxzO3Q8bi5sZW5ndGg7dCsrKXt2YXIgcj1uW3RdO2UucHVzaC5hcHBseShlLHIud2VpZ2h0cyl9cmV0dXJuIGJhdGNoR2V0VmFsdWUoZSl9LHQucHJvdG90eXBlLnNldFdlaWdodHM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MCxyPXRoaXMuY2VsbHM7bjxyLmxlbmd0aDtuKyspZm9yKHZhciBpPXJbbl0sYT1pLndlaWdodHMubGVuZ3RoLG89ZS5zcGxpY2UoYSkscz0wO3M8aS53ZWlnaHRzLmxlbmd0aDsrK3MpdC5wdXNoKFtpLndlaWdodHNbc10sb1tzXV0pO2JhdGNoU2V0VmFsdWUodCl9LHQuY2xhc3NOYW1lPVwiU3RhY2tlZFJOTkNlbGxzXCIsdH0oUk5OQ2VsbCk7ZnVuY3Rpb24gZ2VuZXJhdGVEcm9wb3V0TWFzayhlLHQsbixyKXtmdW5jdGlvbiBpKCl7cmV0dXJuIGRyb3BvdXQoZSgpLGdldFNjYWxhcih0KSl9aWYodm9pZCAwPT09biYmKG49bnVsbCksdm9pZCAwPT09ciYmKHI9MSkscj4xKXtmb3IodmFyIGE9W10sbz0wO288cjtvKyspYS5wdXNoKGluVHJhaW5QaGFzZShpLGUsbikpO3JldHVybiBhLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGtlZXAoZSl9KSxhfXJldHVybiBrZWVwKGluVHJhaW5QaGFzZShpLGUsbikpfXNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhTdGFja2VkUk5OQ2VsbHMpO3ZhciBXcmFwcGVyPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIG49ZS5jYWxsKHRoaXMsdCl8fHRoaXM7cmV0dXJuIG4ubGF5ZXI9dC5sYXllcixufXJldHVybiBfX2V4dGVuZHModCxlKSx0LnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbihlKXt0aGlzLmJ1aWx0PSEwfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJ0cmFpbmFibGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXRoaXMubGF5ZXImJnRoaXMubGF5ZXIudHJhaW5hYmxlfSxzZXQ6ZnVuY3Rpb24oZSl7bnVsbCE9dGhpcy5sYXllciYmKHRoaXMubGF5ZXIudHJhaW5hYmxlPWUpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcInRyYWluYWJsZVdlaWdodHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5ZXIudHJhaW5hYmxlV2VpZ2h0c30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJub25UcmFpbmFibGVXZWlnaHRzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxheWVyLm5vblRyYWluYWJsZVdlaWdodHN9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwidXBkYXRlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXllci5fdXBkYXRlc30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJsb3NzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5ZXIubG9zc2VzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmdldFdlaWdodHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXllci5nZXRXZWlnaHRzKCl9LHQucHJvdG90eXBlLnNldFdlaWdodHM9ZnVuY3Rpb24oZSl7dGhpcy5sYXllci5zZXRXZWlnaHRzKGUpfSx0LnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXt2YXIgdD17bGF5ZXI6e2NsYXNzTmFtZTp0aGlzLmxheWVyLmdldENsYXNzTmFtZSgpLGNvbmZpZzp0aGlzLmxheWVyLmdldENvbmZpZygpfX0sbj1lLnByb3RvdHlwZS5nZXRDb25maWcuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0LmFzc2lnbih0LG4pLHR9LHQuZnJvbUNvbmZpZz1mdW5jdGlvbihlLHQsbil7dm9pZCAwPT09biYmKG49e30pO3ZhciByPWRlc2VyaWFsaXplKHQubGF5ZXIsbik7ZGVsZXRlIHQubGF5ZXI7dmFyIGk9e2xheWVyOnJ9O3JldHVybiBPYmplY3QuYXNzaWduKGksdCksbmV3IGUoaSl9LHR9KExheWVyKSxUaW1lRGlzdHJpYnV0ZWQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyx0KXx8dGhpcztyZXR1cm4gbi5zdXBwb3J0c01hc2tpbmc9ITAsbn1yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuYnVpbGQ9ZnVuY3Rpb24odCl7aWYoKHQ9Z2V0RXhhY3RseU9uZVNoYXBlKHQpKS5sZW5ndGg8Myl0aHJvdyBuZXcgVmFsdWVFcnJvcihcIlRpbWVEaXN0cmlidXRlZCBsYXllciBleHBlY3RzIGFuIGlucHV0IHNoYXBlID49IDNELCBidXQgcmVjZWl2ZWQgaW5wdXQgc2hhcGUgXCIrSlNPTi5zdHJpbmdpZnkodCkpO3RoaXMuaW5wdXRTcGVjPVt7c2hhcGU6dH1dO3ZhciBuPVt0WzBdXS5jb25jYXQodC5zbGljZSgyKSk7dGhpcy5sYXllci5idWlsdHx8KHRoaXMubGF5ZXIuYnVpbGQobiksdGhpcy5sYXllci5idWlsdD0hMCksZS5wcm90b3R5cGUuYnVpbGQuY2FsbCh0aGlzLHQpfSx0LnByb3RvdHlwZS5jb21wdXRlT3V0cHV0U2hhcGU9ZnVuY3Rpb24oZSl7dmFyIHQ9WyhlPWdldEV4YWN0bHlPbmVTaGFwZShlKSlbMF1dLmNvbmNhdChlLnNsaWNlKDIpKSxuPXRoaXMubGF5ZXIuY29tcHV0ZU91dHB1dFNoYXBlKHQpLHI9ZVsxXTtyZXR1cm5bblswXSxyXS5jb25jYXQobi5zbGljZSgxKSl9LHQucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3JldHVybiB0aWR5KGZ1bmN0aW9uKCl7cmV0dXJuIHJubihmdW5jdGlvbihlLHIpe3JldHVybltnZXRFeGFjdGx5T25lVGVuc29yKG4ubGF5ZXIuY2FsbChlLHQpKSxbXV19LGU9Z2V0RXhhY3RseU9uZVRlbnNvcihlKSxbXSwhMSxudWxsLG51bGwsITEsITApWzFdfSl9LHQuY2xhc3NOYW1lPVwiVGltZURpc3RyaWJ1dGVkXCIsdH0oV3JhcHBlcik7c2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFRpbWVEaXN0cmlidXRlZCk7dmFyIFZBTElEX0JJRElSRUNUSU9OQUxfTUVSR0VfTU9ERVM9W1wic3VtXCIsXCJtdWxcIixcImNvbmNhdFwiLFwiYXZlXCJdO2Z1bmN0aW9uIGNoZWNrQmlkaXJlY3Rpb25hbE1lcmdlTW9kZShlKXtjaGVja1N0cmluZ1R5cGVVbmlvblZhbHVlKFZBTElEX0JJRElSRUNUSU9OQUxfTUVSR0VfTU9ERVMsXCJCaWRpcmVjdGlvbmFsTWVyZ2VNb2RlXCIsZSl9dmFyIEJpZGlyZWN0aW9uYWw9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyx0KXx8dGhpcyxyPXQubGF5ZXIuZ2V0Q29uZmlnKCk7aWYobi5mb3J3YXJkTGF5ZXI9ZGVzZXJpYWxpemUoe2NsYXNzTmFtZTp0LmxheWVyLmdldENsYXNzTmFtZSgpLGNvbmZpZzpyfSksci5nb0JhY2t3YXJkcz0hMCE9PXIuZ29CYWNrd2FyZHMsbi5iYWNrd2FyZExheWVyPWRlc2VyaWFsaXplKHtjbGFzc05hbWU6dC5sYXllci5nZXRDbGFzc05hbWUoKSxjb25maWc6cn0pLG4uZm9yd2FyZExheWVyLm5hbWU9XCJmb3J3YXJkX1wiK24uZm9yd2FyZExheWVyLm5hbWUsbi5iYWNrd2FyZExheWVyLm5hbWU9XCJiYWNrd2FyZF9cIituLmJhY2t3YXJkTGF5ZXIubmFtZSxjaGVja0JpZGlyZWN0aW9uYWxNZXJnZU1vZGUodC5tZXJnZU1vZGUpLG4ubWVyZ2VNb2RlPXQubWVyZ2VNb2RlLHQud2VpZ2h0cyl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcIndlaWdodHMgc3VwcG9ydCBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEJpZGlyZWN0aW9uYWwgbGF5ZXIgeWV0LlwiKTtyZXR1cm4gbi5fc3RhdGVmdWw9dC5sYXllci5zdGF0ZWZ1bCxuLnJldHVyblNlcXVlbmNlcz10LmxheWVyLnJldHVyblNlcXVlbmNlcyxuLnJldHVyblN0YXRlPXQubGF5ZXIucmV0dXJuU3RhdGUsbi5zdXBwb3J0c01hc2tpbmc9ITAsbi5fdHJhaW5hYmxlPSEwLG4uaW5wdXRTcGVjPXQubGF5ZXIuaW5wdXRTcGVjLG4ubnVtQ29uc3RhbnRzPW51bGwsbn1yZXR1cm4gX19leHRlbmRzKHQsZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwidHJhaW5hYmxlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90cmFpbmFibGV9LHNldDpmdW5jdGlvbihlKXt0aGlzLl90cmFpbmFibGU9ZSxudWxsIT10aGlzLmZvcndhcmRMYXllciYmKHRoaXMuZm9yd2FyZExheWVyLnRyYWluYWJsZT1lKSxudWxsIT10aGlzLmJhY2t3YXJkTGF5ZXImJih0aGlzLmJhY2t3YXJkTGF5ZXIudHJhaW5hYmxlPWUpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmdldFdlaWdodHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mb3J3YXJkTGF5ZXIuZ2V0V2VpZ2h0cygpLmNvbmNhdCh0aGlzLmJhY2t3YXJkTGF5ZXIuZ2V0V2VpZ2h0cygpKX0sdC5wcm90b3R5cGUuc2V0V2VpZ2h0cz1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aCxuPU1hdGguZmxvb3IodC8yKTt0aGlzLmZvcndhcmRMYXllci5zZXRXZWlnaHRzKGUuc2xpY2UoMCxuKSksdGhpcy5iYWNrd2FyZExheWVyLnNldFdlaWdodHMoZS5zbGljZShuKSl9LHQucHJvdG90eXBlLmNvbXB1dGVPdXRwdXRTaGFwZT1mdW5jdGlvbihlKXt2YXIgdCxuLHIsaT10aGlzLmZvcndhcmRMYXllci5jb21wdXRlT3V0cHV0U2hhcGUoZSk7cmV0dXJuIEFycmF5LmlzQXJyYXkoaSkmJkFycmF5LmlzQXJyYXkoaVswXSl8fChpPVtpXSksaT1pLHRoaXMucmV0dXJuU3RhdGU/KHI9aS5zbGljZSgxKSx0PWlbMF0pOnQ9aVswXSx0PXQsXCJjb25jYXRcIj09PXRoaXMubWVyZ2VNb2RlPyh0W3QubGVuZ3RoLTFdKj0yLG49W3RdKTpuPW51bGw9PXRoaXMubWVyZ2VNb2RlP1t0LHQuc2xpY2UoKV06W3RdLHRoaXMucmV0dXJuU3RhdGU/bnVsbD09dGhpcy5tZXJnZU1vZGU/bi5jb25jYXQocikuY29uY2F0KHIuc2xpY2UoKSk6W3RdLmNvbmNhdChyKS5jb25jYXQoci5zbGljZSgpKTpzaW5nbGV0b25PckFycmF5KG4pfSx0LnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbih0LG4pe3ZhciByPW51bGw9PW4/bnVsbDpuLmluaXRpYWxTdGF0ZSxpPW51bGw9PW4/bnVsbDpuLmNvbnN0YW50cztudWxsPT1uJiYobj17fSk7dmFyIGE9c3RhbmRhcmRpemVBcmdzKHQscixpLHRoaXMubnVtQ29uc3RhbnRzKTtpZih0PWEuaW5wdXRzLHI9YS5pbml0aWFsU3RhdGUsaT1hLmNvbnN0YW50cyxBcnJheS5pc0FycmF5KHQpJiYocj10LnNsaWNlKDEpLHQ9dFswXSksKG51bGw9PXJ8fDA9PT1yLmxlbmd0aCkmJm51bGw9PWkpcmV0dXJuIGUucHJvdG90eXBlLmFwcGx5LmNhbGwodGhpcyx0LG4pO3ZhciBvPVtdLHM9W107aWYobnVsbCE9cil7dmFyIGw9ci5sZW5ndGg7aWYobCUyPjApdGhyb3cgbmV3IFZhbHVlRXJyb3IoXCJXaGVuIHBhc3NpbmcgYGluaXRpYWxTdGF0ZWAgdG8gYSBCaWRyZWN0aW9uYWwgUk5OLCB0aGUgc3RhdGUgc2hvdWxkIGJlIGFuIEFycmF5IGNvbnRhaW5pbmcgdGhlIHN0YXRlcyBvZiB0aGUgdW5kZXJseWluZyBSTk5zLlwiKTtuLmluaXRpYWxTdGF0ZT1yLG8ucHVzaC5hcHBseShvLHIpO3ZhciB1PXIubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBuZXcgSW5wdXRTcGVjKHtzaGFwZTplLnNoYXBlfSl9KTt0aGlzLmZvcndhcmRMYXllci5zdGF0ZVNwZWM9dS5zbGljZSgwLGwvMiksdGhpcy5iYWNrd2FyZExheWVyLnN0YXRlU3BlYz11LnNsaWNlKGwvMikscy5wdXNoLmFwcGx5KHMsdSl9aWYobnVsbCE9aSl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcIlN1cHBvcnQgZm9yIGNvbnN0YW50cyBpbiBCaWRpcmVjdGlvbmFsIGxheWVycyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LlwiKTtmb3IodmFyIGM9b1swXWluc3RhbmNlb2YgU3ltYm9saWNUZW5zb3IscD0wLGg9bztwPGgubGVuZ3RoO3ArKyl7aWYoaFtwXWluc3RhbmNlb2YgU3ltYm9saWNUZW5zb3IhPT1jKXRocm93IG5ldyBWYWx1ZUVycm9yKFwiVGhlIGluaXRpYWwgc3RhdGUgb2YgYSBCaWRpcmVjdGlvbmFsIGxheWVyIGNhbm5vdCBiZSBzcGVjaWZpZWQgYXMgYSBtaXggb2Ygc3ltYm9saWMgYW5kIG5vbi1zeW1ib2xpYyB0ZW5zb3JzXCIpfWlmKGMpe3ZhciBkPVt0XS5jb25jYXQobyksZz10aGlzLmlucHV0U3BlYy5jb25jYXQocyksZj10aGlzLmlucHV0U3BlYzt0aGlzLmlucHV0U3BlYz1nO3ZhciBtPWUucHJvdG90eXBlLmFwcGx5LmNhbGwodGhpcyxkLG4pO3JldHVybiB0aGlzLmlucHV0U3BlYz1mLG19cmV0dXJuIGUucHJvdG90eXBlLmFwcGx5LmNhbGwodGhpcyx0LG4pfSx0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gdGlkeShmdW5jdGlvbigpe2lmKG51bGwhPXQubWFzayl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcIlRoZSBzdXBwb3J0IGZvciBtYXNraW5nIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgQmlkaXJlY3Rpb25hbCBsYXllcnMgeWV0LlwiKTt2YXIgcixpLGEsbyxzPXQuaW5pdGlhbFN0YXRlO2lmKG51bGw9PXMpcj1uLmZvcndhcmRMYXllci5jYWxsKGUsdCksaT1uLmJhY2t3YXJkTGF5ZXIuY2FsbChlLHQpO2Vsc2V7dmFyIGw9cy5zbGljZSgwLHMubGVuZ3RoLzIpLHU9cy5zbGljZShzLmxlbmd0aC8yKTtyPW4uZm9yd2FyZExheWVyLmNhbGwoZSxPYmplY3QuYXNzaWduKHQse2luaXRpYWxTdGF0ZTpsfSkpLGk9bi5iYWNrd2FyZExheWVyLmNhbGwoZSxPYmplY3QuYXNzaWduKHQse2luaXRpYWxTdGF0ZTp1fSkpfXJldHVybiBuLnJldHVyblN0YXRlJiYoQXJyYXkuaXNBcnJheShyKSYmKGE9ci5zbGljZSgxKS5jb25jYXQoaS5zbGljZSgxKSkpLHI9clswXSxpPWlbMF0pLG4ucmV0dXJuU2VxdWVuY2VzJiYoaT1yZXZlcnNlKGksMSkpLFwiY29uY2F0XCI9PT1uLm1lcmdlTW9kZT9vPWNvbmNhdGVuYXRlKFtyLGldKTpcInN1bVwiPT09bi5tZXJnZU1vZGU/bz1hZGQocixpKTpcImF2ZVwiPT09bi5tZXJnZU1vZGU/bz1tdWwoZ2V0U2NhbGFyKC41KSxhZGQocixpKSk6XCJtdWxcIj09PW4ubWVyZ2VNb2RlP289bXVsKHIsaSk6bnVsbD09bi5tZXJnZU1vZGUmJihvPVtyLGldKSxuLnJldHVyblN0YXRlP251bGw9PW4ubWVyZ2VNb2RlP28uY29uY2F0KGEpOltvXS5jb25jYXQoYSk6b30pfSx0LnByb3RvdHlwZS5yZXNldFN0YXRlcz1mdW5jdGlvbihlKXt0aGlzLmZvcndhcmRMYXllci5yZXNldFN0YXRlcygpLHRoaXMuYmFja3dhcmRMYXllci5yZXNldFN0YXRlcygpfSx0LnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbihlKXt2YXIgdD10aGlzO25hbWVTY29wZSh0aGlzLmZvcndhcmRMYXllci5uYW1lLGZ1bmN0aW9uKCl7dC5mb3J3YXJkTGF5ZXIuYnVpbGQoZSl9KSxuYW1lU2NvcGUodGhpcy5iYWNrd2FyZExheWVyLm5hbWUsZnVuY3Rpb24oKXt0LmJhY2t3YXJkTGF5ZXIuYnVpbGQoZSl9KSx0aGlzLmJ1aWx0PSEwfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJ0cmFpbmFibGVXZWlnaHRzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZvcndhcmRMYXllci50cmFpbmFibGVXZWlnaHRzLmNvbmNhdCh0aGlzLmJhY2t3YXJkTGF5ZXIudHJhaW5hYmxlV2VpZ2h0cyl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwibm9uVHJhaW5hYmxlV2VpZ2h0c1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mb3J3YXJkTGF5ZXIubm9uVHJhaW5hYmxlV2VpZ2h0cy5jb25jYXQodGhpcy5iYWNrd2FyZExheWVyLm5vblRyYWluYWJsZVdlaWdodHMpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmdldENvbmZpZz1mdW5jdGlvbigpe3ZhciB0PXttZXJnZU1vZGU6dGhpcy5tZXJnZU1vZGV9LG49ZS5wcm90b3R5cGUuZ2V0Q29uZmlnLmNhbGwodGhpcyk7cmV0dXJuIE9iamVjdC5hc3NpZ24odCxuKSx0fSx0LmZyb21Db25maWc9ZnVuY3Rpb24oZSx0KXt2YXIgbj1kZXNlcmlhbGl6ZSh0LmxheWVyKTtpZihkZWxldGUgdC5sYXllcixudWxsIT10Lm51bUNvbnN0YW50cyl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcIkRlc2VyaWFsaXphdGlvbiBvZiBhIEJpZGlyZWN0aW9uYWwgbGF5ZXIgd2l0aCBudW1Db25zdGFudHMgcHJlc2VudCBpcyBub3Qgc3VwcG9ydGVkIHlldC5cIik7dmFyIHI9dDtyZXR1cm4gci5sYXllcj1uLG5ldyBlKHIpfSx0LmNsYXNzTmFtZT1cIkJpZGlyZWN0aW9uYWxcIix0fShXcmFwcGVyKTtmdW5jdGlvbiBpbnB1dExheWVyKGUpe3JldHVybiBuZXcgSW5wdXRMYXllcihlKX1mdW5jdGlvbiBlbHUkMihlKXtyZXR1cm4gbmV3IEVMVShlKX1mdW5jdGlvbiByZUxVKGUpe3JldHVybiBuZXcgUmVMVShlKX1mdW5jdGlvbiBsZWFreVJlTFUoZSl7cmV0dXJuIG5ldyBMZWFreVJlTFUoZSl9ZnVuY3Rpb24gc29mdG1heCQxKGUpe3JldHVybiBuZXcgU29mdG1heCQxKGUpfWZ1bmN0aW9uIHRocmVzaG9sZGVkUmVMVShlKXtyZXR1cm4gbmV3IFRocmVzaG9sZGVkUmVMVShlKX1mdW5jdGlvbiBjb252MWQkMihlKXtyZXR1cm4gbmV3IENvbnYxRChlKX1mdW5jdGlvbiBjb252MmQkMihlKXtyZXR1cm4gbmV3IENvbnYyRChlKX1mdW5jdGlvbiBjb252MmRUcmFuc3Bvc2UkMShlKXtyZXR1cm4gbmV3IENvbnYyRFRyYW5zcG9zZShlKX1mdW5jdGlvbiBzZXBhcmFibGVDb252MmQkMShlKXtyZXR1cm4gbmV3IFNlcGFyYWJsZUNvbnYyRChlKX1mdW5jdGlvbiBjcm9wcGluZzJEKGUpe3JldHVybiBuZXcgQ3JvcHBpbmcyRChlKX1mdW5jdGlvbiB1cFNhbXBsaW5nMmQoZSl7cmV0dXJuIG5ldyBVcFNhbXBsaW5nMkQoZSl9ZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkJDIoZSl7cmV0dXJuIG5ldyBEZXB0aHdpc2VDb252MkQoZSl9ZnVuY3Rpb24gYWN0aXZhdGlvbihlKXtyZXR1cm4gbmV3IEFjdGl2YXRpb24kMShlKX1mdW5jdGlvbiBkZW5zZShlKXtyZXR1cm4gbmV3IERlbnNlKGUpfWZ1bmN0aW9uIGRyb3BvdXQkMShlKXtyZXR1cm4gbmV3IERyb3BvdXQoZSl9ZnVuY3Rpb24gZmxhdHRlbiQxKGUpe3JldHVybiBuZXcgRmxhdHRlbihlKX1mdW5jdGlvbiByZXBlYXRWZWN0b3IoZSl7cmV0dXJuIG5ldyBSZXBlYXRWZWN0b3IoZSl9ZnVuY3Rpb24gcmVzaGFwZShlKXtyZXR1cm4gbmV3IFJlc2hhcGUoZSl9ZnVuY3Rpb24gcGVybXV0ZShlKXtyZXR1cm4gbmV3IFBlcm11dGUoZSl9ZnVuY3Rpb24gZW1iZWRkaW5nKGUpe3JldHVybiBuZXcgRW1iZWRkaW5nKGUpfWZ1bmN0aW9uIGFkZCQyKGUpe3JldHVybiBuZXcgQWRkKGUpfWZ1bmN0aW9uIGF2ZXJhZ2UkMShlKXtyZXR1cm4gbmV3IEF2ZXJhZ2UoZSl9ZnVuY3Rpb24gY29uY2F0ZW5hdGUkMihlKXtyZXR1cm4gbmV3IENvbmNhdGVuYXRlKGUpfWZ1bmN0aW9uIG1heGltdW0kMihlKXtyZXR1cm4gbmV3IE1heGltdW0oZSl9ZnVuY3Rpb24gbWluaW11bSQyKGUpe3JldHVybiBuZXcgTWluaW11bShlKX1mdW5jdGlvbiBtdWx0aXBseSQxKGUpe3JldHVybiBuZXcgTXVsdGlwbHkoZSl9ZnVuY3Rpb24gZG90JDEoZSl7cmV0dXJuIG5ldyBEb3QoZSl9ZnVuY3Rpb24gYmF0Y2hOb3JtYWxpemF0aW9uJDEoZSl7cmV0dXJuIG5ldyBCYXRjaE5vcm1hbGl6YXRpb24oZSl9ZnVuY3Rpb24gemVyb1BhZGRpbmcyZChlKXtyZXR1cm4gbmV3IFplcm9QYWRkaW5nMkQoZSl9ZnVuY3Rpb24gYXZlcmFnZVBvb2xpbmcxZChlKXtyZXR1cm4gbmV3IEF2ZXJhZ2VQb29saW5nMUQoZSl9ZnVuY3Rpb24gYXZnUG9vbDFkKGUpe3JldHVybiBhdmVyYWdlUG9vbGluZzFkKGUpfWZ1bmN0aW9uIGF2Z1Bvb2xpbmcxZChlKXtyZXR1cm4gYXZlcmFnZVBvb2xpbmcxZChlKX1mdW5jdGlvbiBhdmVyYWdlUG9vbGluZzJkKGUpe3JldHVybiBuZXcgQXZlcmFnZVBvb2xpbmcyRChlKX1mdW5jdGlvbiBhdmdQb29sMmQoZSl7cmV0dXJuIGF2ZXJhZ2VQb29saW5nMmQoZSl9ZnVuY3Rpb24gYXZnUG9vbGluZzJkKGUpe3JldHVybiBhdmVyYWdlUG9vbGluZzJkKGUpfWZ1bmN0aW9uIGdsb2JhbEF2ZXJhZ2VQb29saW5nMWQoZSl7cmV0dXJuIG5ldyBHbG9iYWxBdmVyYWdlUG9vbGluZzFEKGUpfWZ1bmN0aW9uIGdsb2JhbEF2ZXJhZ2VQb29saW5nMmQoZSl7cmV0dXJuIG5ldyBHbG9iYWxBdmVyYWdlUG9vbGluZzJEKGUpfWZ1bmN0aW9uIGdsb2JhbE1heFBvb2xpbmcxZChlKXtyZXR1cm4gbmV3IEdsb2JhbE1heFBvb2xpbmcxRChlKX1mdW5jdGlvbiBnbG9iYWxNYXhQb29saW5nMmQoZSl7cmV0dXJuIG5ldyBHbG9iYWxNYXhQb29saW5nMkQoZSl9ZnVuY3Rpb24gbWF4UG9vbGluZzFkKGUpe3JldHVybiBuZXcgTWF4UG9vbGluZzFEKGUpfWZ1bmN0aW9uIG1heFBvb2xpbmcyZChlKXtyZXR1cm4gbmV3IE1heFBvb2xpbmcyRChlKX1mdW5jdGlvbiBncnUoZSl7cmV0dXJuIG5ldyBHUlUoZSl9ZnVuY3Rpb24gZ3J1Q2VsbChlKXtyZXR1cm4gbmV3IEdSVUNlbGwoZSl9ZnVuY3Rpb24gbHN0bShlKXtyZXR1cm4gbmV3IExTVE0oZSl9ZnVuY3Rpb24gbHN0bUNlbGwoZSl7cmV0dXJuIG5ldyBMU1RNQ2VsbChlKX1mdW5jdGlvbiBzaW1wbGVSTk4oZSl7cmV0dXJuIG5ldyBTaW1wbGVSTk4oZSl9ZnVuY3Rpb24gc2ltcGxlUk5OQ2VsbChlKXtyZXR1cm4gbmV3IFNpbXBsZVJOTkNlbGwoZSl9ZnVuY3Rpb24gcm5uJDEoZSl7cmV0dXJuIG5ldyBSTk4oZSl9ZnVuY3Rpb24gc3RhY2tlZFJOTkNlbGxzKGUpe3JldHVybiBuZXcgU3RhY2tlZFJOTkNlbGxzKGUpfWZ1bmN0aW9uIGJpZGlyZWN0aW9uYWwoZSl7cmV0dXJuIG5ldyBCaWRpcmVjdGlvbmFsKGUpfWZ1bmN0aW9uIHRpbWVEaXN0cmlidXRlZChlKXtyZXR1cm4gbmV3IFRpbWVEaXN0cmlidXRlZChlKX1zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoQmlkaXJlY3Rpb25hbCk7dmFyIGdsb2JhbE1heFBvb2wxZD1nbG9iYWxNYXhQb29saW5nMWQsZ2xvYmFsTWF4UG9vbDJkPWdsb2JhbE1heFBvb2xpbmcyZCxtYXhQb29sMWQ9bWF4UG9vbGluZzFkLG1heFBvb2wyZD1tYXhQb29saW5nMmQsZXhwb3J0c19sYXllcnM9T2JqZWN0LmZyZWV6ZSh7aW5wdXRMYXllcjppbnB1dExheWVyLGVsdTplbHUkMixyZUxVOnJlTFUsbGVha3lSZUxVOmxlYWt5UmVMVSxzb2Z0bWF4OnNvZnRtYXgkMSx0aHJlc2hvbGRlZFJlTFU6dGhyZXNob2xkZWRSZUxVLGNvbnYxZDpjb252MWQkMixjb252MmQ6Y29udjJkJDIsY29udjJkVHJhbnNwb3NlOmNvbnYyZFRyYW5zcG9zZSQxLHNlcGFyYWJsZUNvbnYyZDpzZXBhcmFibGVDb252MmQkMSxjcm9wcGluZzJEOmNyb3BwaW5nMkQsdXBTYW1wbGluZzJkOnVwU2FtcGxpbmcyZCxkZXB0aHdpc2VDb252MmQ6ZGVwdGh3aXNlQ29udjJkJDIsYWN0aXZhdGlvbjphY3RpdmF0aW9uLGRlbnNlOmRlbnNlLGRyb3BvdXQ6ZHJvcG91dCQxLGZsYXR0ZW46ZmxhdHRlbiQxLHJlcGVhdFZlY3RvcjpyZXBlYXRWZWN0b3IscmVzaGFwZTpyZXNoYXBlLHBlcm11dGU6cGVybXV0ZSxlbWJlZGRpbmc6ZW1iZWRkaW5nLGFkZDphZGQkMixhdmVyYWdlOmF2ZXJhZ2UkMSxjb25jYXRlbmF0ZTpjb25jYXRlbmF0ZSQyLG1heGltdW06bWF4aW11bSQyLG1pbmltdW06bWluaW11bSQyLG11bHRpcGx5Om11bHRpcGx5JDEsZG90OmRvdCQxLGJhdGNoTm9ybWFsaXphdGlvbjpiYXRjaE5vcm1hbGl6YXRpb24kMSx6ZXJvUGFkZGluZzJkOnplcm9QYWRkaW5nMmQsYXZlcmFnZVBvb2xpbmcxZDphdmVyYWdlUG9vbGluZzFkLGF2Z1Bvb2wxZDphdmdQb29sMWQsYXZnUG9vbGluZzFkOmF2Z1Bvb2xpbmcxZCxhdmVyYWdlUG9vbGluZzJkOmF2ZXJhZ2VQb29saW5nMmQsYXZnUG9vbDJkOmF2Z1Bvb2wyZCxhdmdQb29saW5nMmQ6YXZnUG9vbGluZzJkLGdsb2JhbEF2ZXJhZ2VQb29saW5nMWQ6Z2xvYmFsQXZlcmFnZVBvb2xpbmcxZCxnbG9iYWxBdmVyYWdlUG9vbGluZzJkOmdsb2JhbEF2ZXJhZ2VQb29saW5nMmQsZ2xvYmFsTWF4UG9vbGluZzFkOmdsb2JhbE1heFBvb2xpbmcxZCxnbG9iYWxNYXhQb29saW5nMmQ6Z2xvYmFsTWF4UG9vbGluZzJkLG1heFBvb2xpbmcxZDptYXhQb29saW5nMWQsbWF4UG9vbGluZzJkOm1heFBvb2xpbmcyZCxncnU6Z3J1LGdydUNlbGw6Z3J1Q2VsbCxsc3RtOmxzdG0sbHN0bUNlbGw6bHN0bUNlbGwsc2ltcGxlUk5OOnNpbXBsZVJOTixzaW1wbGVSTk5DZWxsOnNpbXBsZVJOTkNlbGwscm5uOnJubiQxLHN0YWNrZWRSTk5DZWxsczpzdGFja2VkUk5OQ2VsbHMsYmlkaXJlY3Rpb25hbDpiaWRpcmVjdGlvbmFsLHRpbWVEaXN0cmlidXRlZDp0aW1lRGlzdHJpYnV0ZWQsZ2xvYmFsTWF4UG9vbDFkOmdsb2JhbE1heFBvb2wxZCxnbG9iYWxNYXhQb29sMmQ6Z2xvYmFsTWF4UG9vbDJkLG1heFBvb2wxZDptYXhQb29sMWQsbWF4UG9vbDJkOm1heFBvb2wyZCxMYXllcjpMYXllcixSTk46Uk5OLFJOTkNlbGw6Uk5OQ2VsbCxpbnB1dDppbnB1dH0pO2Z1bmN0aW9uIGJpbmFyeUFjY3VyYWN5JDEoZSx0KXtyZXR1cm4gYmluYXJ5QWNjdXJhY3koZSx0KX1mdW5jdGlvbiBiaW5hcnlDcm9zc2VudHJvcHkkMihlLHQpe3JldHVybiBiaW5hcnlDcm9zc2VudHJvcHkkMShlLHQpfWZ1bmN0aW9uIGNhdGVnb3JpY2FsQWNjdXJhY3kkMShlLHQpe3JldHVybiBjYXRlZ29yaWNhbEFjY3VyYWN5KGUsdCl9ZnVuY3Rpb24gY2F0ZWdvcmljYWxDcm9zc2VudHJvcHkkMihlLHQpe3JldHVybiBjYXRlZ29yaWNhbENyb3NzZW50cm9weSQxKGUsdCl9ZnVuY3Rpb24gcHJlY2lzaW9uJDEoZSx0KXtyZXR1cm4gcHJlY2lzaW9uKGUsdCl9ZnVuY3Rpb24gcmVjYWxsJDEoZSx0KXtyZXR1cm4gcmVjYWxsKGUsdCl9ZnVuY3Rpb24gY29zaW5lUHJveGltaXR5JDEoZSx0KXtyZXR1cm4gY29zaW5lUHJveGltaXR5KGUsdCl9ZnVuY3Rpb24gbWVhbkFic29sdXRlRXJyb3IkMShlLHQpe3JldHVybiBtZWFuQWJzb2x1dGVFcnJvcihlLHQpfWZ1bmN0aW9uIG1lYW5BYnNvbHV0ZVBlcmNlbnRhZ2VFcnJvciQxKGUsdCl7cmV0dXJuIG1lYW5BYnNvbHV0ZVBlcmNlbnRhZ2VFcnJvcihlLHQpfWZ1bmN0aW9uIE1BUEUkMihlLHQpe3JldHVybiBtZWFuQWJzb2x1dGVQZXJjZW50YWdlRXJyb3IoZSx0KX1mdW5jdGlvbiBtYXBlJDIoZSx0KXtyZXR1cm4gbWVhbkFic29sdXRlUGVyY2VudGFnZUVycm9yKGUsdCl9ZnVuY3Rpb24gbWVhblNxdWFyZWRFcnJvciQxKGUsdCl7cmV0dXJuIG1lYW5TcXVhcmVkRXJyb3IoZSx0KX1mdW5jdGlvbiBNU0UkMihlLHQpe3JldHVybiBtZWFuU3F1YXJlZEVycm9yKGUsdCl9ZnVuY3Rpb24gbXNlJDIoZSx0KXtyZXR1cm4gbWVhblNxdWFyZWRFcnJvcihlLHQpfXZhciBleHBvcnRzX21ldHJpY3M9T2JqZWN0LmZyZWV6ZSh7YmluYXJ5QWNjdXJhY3k6YmluYXJ5QWNjdXJhY3kkMSxiaW5hcnlDcm9zc2VudHJvcHk6YmluYXJ5Q3Jvc3NlbnRyb3B5JDIsY2F0ZWdvcmljYWxBY2N1cmFjeTpjYXRlZ29yaWNhbEFjY3VyYWN5JDEsY2F0ZWdvcmljYWxDcm9zc2VudHJvcHk6Y2F0ZWdvcmljYWxDcm9zc2VudHJvcHkkMixwcmVjaXNpb246cHJlY2lzaW9uJDEscmVjYWxsOnJlY2FsbCQxLGNvc2luZVByb3hpbWl0eTpjb3NpbmVQcm94aW1pdHkkMSxtZWFuQWJzb2x1dGVFcnJvcjptZWFuQWJzb2x1dGVFcnJvciQxLG1lYW5BYnNvbHV0ZVBlcmNlbnRhZ2VFcnJvcjptZWFuQWJzb2x1dGVQZXJjZW50YWdlRXJyb3IkMSxNQVBFOk1BUEUkMixtYXBlOm1hcGUkMixtZWFuU3F1YXJlZEVycm9yOm1lYW5TcXVhcmVkRXJyb3IkMSxNU0U6TVNFJDIsbXNlOm1zZSQyfSk7ZnVuY3Rpb24gbDFsMihlKXtyZXR1cm4gbmV3IEwxTDIoZSl9ZnVuY3Rpb24gbDEkMShlKXtyZXR1cm4gbDEoZSl9ZnVuY3Rpb24gbDIkMShlKXtyZXR1cm4gbDIoZSl9dmFyIGV4cG9ydHNfcmVndWxhcml6ZXJzPU9iamVjdC5mcmVlemUoe2wxbDI6bDFsMixsMTpsMSQxLGwyOmwyJDF9KSxDYWxsYmFjaz1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7dmFyIHQ9bnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiB0Lm1vZGVsPW51bGwsdH1yZXR1cm4gX19leHRlbmRzKHQsZSksdC5wcm90b3R5cGUuc2V0TW9kZWw9ZnVuY3Rpb24oZSl7aWYoIShlIGluc3RhbmNlb2YgTW9kZWwpKXRocm93IG5ldyBFcnJvcihcIm1vZGVsIG11c3QgYmUgYSBNb2RlbCwgbm90IHNvbWUgb3RoZXIgQ29udGFpbmVyXCIpO3RoaXMubW9kZWw9ZX0sdH0oQmFzZUNhbGxiYWNrKTtleHBvcnR7ZXhwb3J0c19jb25zdHJhaW50cyBhcyBjb25zdHJhaW50cyxleHBvcnRzX2luaXRpYWxpemVycyBhcyBpbml0aWFsaXplcnMsZXhwb3J0c19sYXllcnMgYXMgbGF5ZXJzLGV4cG9ydHNfbWV0cmljcyBhcyBtZXRyaWNzLGV4cG9ydHNfcmVndWxhcml6ZXJzIGFzIHJlZ3VsYXJpemVycyxDYWxsYmFja0xpc3QsQ3VzdG9tQ2FsbGJhY2ssSGlzdG9yeSxDYWxsYmFjayxJbnB1dFNwZWMsU3ltYm9saWNUZW5zb3IsTW9kZWwsaW5wdXQsbG9hZE1vZGVsLG1vZGVsLHJlZ2lzdGVyQ2FsbGJhY2tDb25zdHJ1Y3RvcixzZXF1ZW50aWFsLFJOTixTZXF1ZW50aWFsLExheWVyVmFyaWFibGUsdmVyc2lvbiBhcyB2ZXJzaW9uX2xheWVyc307XG4vLyMgc291cmNlTWFwcGluZ1VSTD10Zi1sYXllcnMuZXNtLmpzLm1hcFxuIiwiLy8gQHRlbnNvcmZsb3cvdGZqcyBDb3B5cmlnaHQgMjAxOCBHb29nbGVcbmltcG9ydHt2ZXJzaW9uX2NvcmV9ZnJvbVwiQHRlbnNvcmZsb3cvdGZqcy1jb3JlXCI7ZXhwb3J0KmZyb21cIkB0ZW5zb3JmbG93L3RmanMtY29yZVwiO2ltcG9ydHt2ZXJzaW9uX2xheWVyc31mcm9tXCJAdGVuc29yZmxvdy90ZmpzLWxheWVyc1wiO2V4cG9ydCpmcm9tXCJAdGVuc29yZmxvdy90ZmpzLWxheWVyc1wiO2ltcG9ydHt2ZXJzaW9uX2NvbnZlcnRlcn1mcm9tXCJAdGVuc29yZmxvdy90ZmpzLWNvbnZlcnRlclwiO2V4cG9ydCpmcm9tXCJAdGVuc29yZmxvdy90ZmpzLWNvbnZlcnRlclwiO3ZhciB2ZXJzaW9uPVwiMC4xMy4yXCIsdmVyc2lvbiQxPXtcInRmanMtY29yZVwiOnZlcnNpb25fY29yZSxcInRmanMtbGF5ZXJzXCI6dmVyc2lvbl9sYXllcnMsXCJ0ZmpzLWNvbnZlcnRlclwiOnZlcnNpb25fY29udmVydGVyLHRmanM6dmVyc2lvbn07ZXhwb3J0e3ZlcnNpb24kMSBhcyB2ZXJzaW9ufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRmLmVzbS5qcy5tYXBcbiIsInZhciBFdmVudEVtaXR0ZXIgICAgICAgICAgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIsXG4gICAgaW5oZXJpdHMgICAgICAgICAgICAgID0gcmVxdWlyZSgnaW5oZXJpdHMnKSxcbiAgICByYWYgICAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCdyYWYnKSxcbiAgICBtZXRob2RzO1xuXG5cbi8vdGhlIHNhbWUgYXMgb2ZmIHdpbmRvdyB1bmxlc3MgcG9seWZpbGxlZCBvciBpbiBub2RlXG52YXIgZGVmYXVsdFJBRk9iamVjdCA9IHtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWU6IHJhZixcbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZTogcmFmLmNhbmNlbFxufTtcblxuZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpeyByZXR1cm4gdHJ1ZTsgfVxuXG4vL21hbmFnZSBGUFMgaWYgPCA2MCwgZWxzZSByZXR1cm4gdHJ1ZTtcbmZ1bmN0aW9uIG1ha2VUaHJvdHRsZShmcHMpe1xuICAgIHZhciBkZWxheSA9IDEwMDAvZnBzO1xuICAgIHZhciBsYXN0VGltZSA9IERhdGUubm93KCk7XG5cblxuICAgIGlmKCBmcHM8PTAgfHwgZnBzID09PSBJbmZpbml0eSApe1xuICAgICAgICByZXR1cm4gcmV0dXJuVHJ1ZTtcbiAgICB9XG5cbiAgICAvL2lmIGFuIGZwcyB0aHJvdHRsZSBoYXMgYmVlbiBzZXQgdGhlbiB3ZSdsbCBhc3N1bWVcbiAgICAvL2l0IG5hdGl2ZWx5IHJ1bnMgYXQgNjBmcHMsXG4gICAgdmFyIGhhbGYgPSBNYXRoLmNlaWwoMTAwMCAvIDYwKSAvIDI7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24oKXtcbiAgICAgICAgLy9pZiBhIGN1c3RvbSBmcHMgaXMgcmVxdWVzdGVkXG4gICAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAvL2lzIHRoaXMgZnJhbWUgd2l0aGluIDguNW1zIG9mIHRoZSB0YXJnZXQ/XG4gICAgICAgIC8vaWYgc28gdGhlbiBuZXh0IGZyYW1lIGlzIGdvbm5hIGJlIHRvbyBsYXRlXG4gICAgICAgIGlmKG5vdyAtIGxhc3RUaW1lIDwgZGVsYXkgLSBoYWxmKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0VGltZSA9IG5vdztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIEFuaW1pdHRlciBwcm92aWRlcyBldmVudC1iYXNlZCBsb29wcyBmb3IgdGhlIGJyb3dzZXIgYW5kIG5vZGUsXG4gKiB1c2luZyBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzXVxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRzLmZwcz1JbmZpbml0eV0gdGhlIGZyYW1lcmF0ZSByZXF1ZXN0ZWQsIGRlZmF1bHRzIHRvIGFzIGZhc3QgYXMgaXQgY2FuICg2MGZwcyBvbiB3aW5kb3cpXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdHMuZGVsYXk9MF0gbWlsbGlzZWNvbmRzIGRlbGF5IGJldHdlZW4gaW52b2tpbmcgYHN0YXJ0YCBhbmQgaW5pdGlhbGl6aW5nIHRoZSBsb29wXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHMucmVxdWVzdEFuaW1hdGlvbkZyYW1lT2JqZWN0PWdsb2JhbF0gdGhlIG9iamVjdCBvbiB3aGljaCB0byBmaW5kIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIGFuZCBgY2FuY2VsQW5pbWF0aW9uRnJhbWVgIG1ldGhvZHNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdHMuZml4ZWREZWx0YT1mYWxzZV0gaWYgdHJ1ZSwgdGltZXN0YW1wcyB3aWxsIHByZXRlbmQgdG8gYmUgZXhlY3V0ZWQgYXQgZml4ZWQgaW50ZXJ2YWxzIGFsd2F5c1xuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEFuaW1pdHRlciggb3B0cyApe1xuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gICAgdGhpcy5fX2RlbGF5ID0gb3B0cy5kZWxheSB8fCAwO1xuXG4gICAgLyoqIEBleHBvc2UgKi9cbiAgICB0aGlzLmZpeGVkRGVsdGEgPSAhIW9wdHMuZml4ZWREZWx0YTtcblxuICAgIC8qKiBAZXhwb3NlICovXG4gICAgdGhpcy5mcmFtZUNvdW50ID0gMDtcbiAgICAvKiogQGV4cG9zZSAqL1xuICAgIHRoaXMuZGVsdGFUaW1lID0gMDtcbiAgICAvKiogQGV4cG9zZSAqL1xuICAgIHRoaXMuZWxhcHNlZFRpbWUgPSAwO1xuXG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgdGhpcy5fX3J1bm5pbmcgPSBmYWxzZTtcbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICB0aGlzLl9fY29tcGxldGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLnNldEZQUyhvcHRzLmZwcyB8fCBJbmZpbml0eSk7XG4gICAgdGhpcy5zZXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWVPYmplY3Qob3B0cy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVPYmplY3QgfHwgZGVmYXVsdFJBRk9iamVjdCk7XG59XG5cbmluaGVyaXRzKEFuaW1pdHRlciwgRXZlbnRFbWl0dGVyKTtcblxuZnVuY3Rpb24gb25TdGFydChzY29wZSl7XG4gICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgdmFyIHJBRklEO1xuICAgIC8vZG9udCBsZXQgYSBzZWNvbmQgYW5pbWF0aW9uIHN0YXJ0IG9uIHRoZSBzYW1lIG9iamVjdFxuICAgIC8vdXNlICoub24oJ3VwZGF0ZScsZm4pKiBpbnN0ZWFkXG4gICAgaWYoc2NvcGUuX19ydW5uaW5nKXtcbiAgICAgICAgcmV0dXJuIHNjb3BlO1xuICAgIH1cblxuICAgIGV4cG9ydHMucnVubmluZyArPSAxO1xuICAgIHNjb3BlLl9fcnVubmluZyA9IHRydWU7XG4gICAgc2NvcGUuX19sYXN0VGltZSA9IG5vdztcbiAgICBzY29wZS5kZWx0YVRpbWUgPSAwO1xuXG4gICAgLy9lbWl0ICoqc3RhcnQqKiBvbmNlIGF0IHRoZSBiZWdpbm5pbmdcbiAgICBzY29wZS5lbWl0KCdzdGFydCcsIHNjb3BlLmRlbHRhVGltZSwgMCwgc2NvcGUuZnJhbWVDb3VudCk7XG5cbiAgICB2YXIgbGFzdFJBRk9iamVjdCA9IHNjb3BlLnJlcXVlc3RBbmltYXRpb25GcmFtZU9iamVjdDtcblxuICAgIHZhciBkcmF3RnJhbWUgPSBmdW5jdGlvbigpe1xuICAgICAgICBpZihsYXN0UkFGT2JqZWN0ICE9PSBzY29wZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVPYmplY3Qpe1xuICAgICAgICAgICAgLy9pZiB0aGUgcmVxdWVzdEFuaW1hdGlvbkZyYW1lT2JqZWN0IHN3aXRjaGVkIGluLWJldHdlZW4sXG4gICAgICAgICAgICAvL3RoZW4gcmUtcmVxdWVzdCB3aXRoIHRoZSBuZXcgb25lIHRvIGVuc3VyZSBwcm9wZXIgdXBkYXRlIGV4ZWN1dGlvbiBjb250ZXh0XG4gICAgICAgICAgICAvL2kuZS4gVlJEaXNwbGF5I3N1Ym1pdEZyYW1lKCkgbWF5IG9ubHkgYmUgcmVxdWVzdGVkIHRocm91Z2ggVlJEaXNwbGF5I3JlcXVlc3RBbmltYXRpb25GcmFtZShkcmF3RnJhbWUpXG4gICAgICAgICAgICBsYXN0UkFGT2JqZWN0ID0gc2NvcGUucmVxdWVzdEFuaW1hdGlvbkZyYW1lT2JqZWN0O1xuICAgICAgICAgICAgc2NvcGUucmVxdWVzdEFuaW1hdGlvbkZyYW1lT2JqZWN0LnJlcXVlc3RBbmltYXRpb25GcmFtZShkcmF3RnJhbWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmKHNjb3BlLl9faXNSZWFkeUZvclVwZGF0ZSgpKXtcbiAgICAgICAgICAgIHNjb3BlLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHNjb3BlLl9fcnVubmluZyl7XG4gICAgICAgICAgICByQUZJRCA9IHNjb3BlLnJlcXVlc3RBbmltYXRpb25GcmFtZU9iamVjdC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZHJhd0ZyYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNjb3BlLnJlcXVlc3RBbmltYXRpb25GcmFtZU9iamVjdC5jYW5jZWxBbmltYXRpb25GcmFtZShyQUZJRCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgc2NvcGUucmVxdWVzdEFuaW1hdGlvbkZyYW1lT2JqZWN0LnJlcXVlc3RBbmltYXRpb25GcmFtZShkcmF3RnJhbWUpO1xuXG4gICAgcmV0dXJuIHNjb3BlO1xufVxuXG5tZXRob2RzID0ge1xuICAgIC8vRXZlbnRFbWl0dGVyIEFsaWFzZXNcbiAgICBvZmYgICAgIDogRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcixcbiAgICB0cmlnZ2VyIDogRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0LFxuXG4gICAgLyoqXG4gICAgICogc3RvcHMgdGhlIGFuaW1hdGlvbiBhbmQgbWFya3MgaXQgYXMgY29tcGxldGVkXG4gICAgICogQGVtaXQgQW5pbWl0dGVyI2NvbXBsZXRlXG4gICAgICogQHJldHVybnMge0FuaW1pdHRlcn1cbiAgICAgKi9cbiAgICBjb21wbGV0ZTogZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgIHRoaXMuX19jb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmVtaXQoJ2NvbXBsZXRlJywgdGhpcy5mcmFtZUNvdW50LCB0aGlzLmRlbHRhVGltZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBzdG9wcyB0aGUgYW5pbWF0aW9uIGFuZCByZW1vdmVzIGFsbCBsaXN0ZW5lcnNcbiAgICAgKiBAZW1pdCBBbmltaXR0ZXIjc3RvcFxuICAgICAqIEByZXR1cm5zIHtBbmltaXR0ZXJ9XG4gICAgICovXG4gICAgZGlzcG9zZTogZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBnZXQgbWlsbGlzZWNvbmRzIGJldHdlZW4gdGhlIGxhc3QgMiB1cGRhdGVzXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0RGVsdGFUaW1lOiBmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy5kZWx0YVRpbWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGdldCB0aGUgdG90YWwgbWlsbGlzZWNvbmRzIHRoYXQgdGhlIGFuaW1hdGlvbiBoYXMgcmFuLlxuICAgICAqIFRoaXMgaXMgdGhlIGN1bWxhdGl2ZSB2YWx1ZSBvZiB0aGUgZGVsdGFUaW1lIGJldHdlZW4gZnJhbWVzXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0RWxhcHNlZFRpbWU6IGZ1bmN0aW9uKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmVsYXBzZWRUaW1lO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBnZXQgdGhlIGluc3RhbmNlcyBmcmFtZXMgcGVyIHNlY29uZCBhcyBjYWxjdWxhdGVkIGJ5IHRoZSBsYXN0IGRlbHRhXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0RlBTOiBmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy5kZWx0YVRpbWUgPiAwID8gMTAwMCAvIHRoaXMuZGVsdGFUaW1lIDogMDtcbiAgICAgICAgaWYodGhpcy5kZWx0YVRpbWUpe1xuICAgICAgICAgICAgcmV0dXJuIDEwMDAgLyB0aGlzLmRlbHRhVGltZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBnZXQgdGhlIGV4cGxpY2l0IEZQUyBsaW1pdCBzZXQgdmlhIGBBbmltaXR0ZXIjc2V0RlBTKGZwcylgIG9yXG4gICAgICogdmlhIHRoZSBpbml0aWFsIGBvcHRpb25zLmZwc2AgcHJvcGVydHlcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9IGVpdGhlciBhcyBzZXQgb3IgSW5maW5pdHlcbiAgICAgKi9cbiAgICBnZXRGUFNMaW1pdDogZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19mcHM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGdldCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0aGF0IGhhdmUgb2NjdXJyZWRcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRGcmFtZUNvdW50OiBmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy5mcmFtZUNvdW50O1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIGdldCB0aGUgb2JqZWN0IHByb3ZpZGluZyBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYFxuICAgICAqIGFuZCBgY2FuY2VsQW5pbWF0aW9uRnJhbWVgIG1ldGhvZHNcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICovXG4gICAgZ2V0UmVxdWVzdEFuaW1hdGlvbkZyYW1lT2JqZWN0OiBmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVPYmplY3Q7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGlzIHRoZSBhbmltYXRpb24gbG9vcCBhY3RpdmVcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNSdW5uaW5nOiBmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy5fX3J1bm5pbmc7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGlzIHRoZSBhbmltYXRpb24gbWFya2VkIGFzIGNvbXBsZXRlZFxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0NvbXBsZXRlZDogZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19jb21wbGV0ZWQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHJlc2V0IHRoZSBhbmltYXRpb24gbG9vcCwgbWFya3MgYXMgaW5jb21wbGV0ZSxcbiAgICAgKiBsZWF2ZXMgbGlzdGVuZXJzIGludGFjdFxuICAgICAqXG4gICAgICogQGVtaXQgQW5pbWl0dGVyI3Jlc2V0XG4gICAgICogQHJldHVybiB7QW5pbWl0dGVyfVxuICAgICAqL1xuICAgIHJlc2V0OiBmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgdGhpcy5fX2NvbXBsZXRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9fbGFzdFRpbWUgPSAwO1xuICAgICAgICB0aGlzLmRlbHRhVGltZSA9IDA7XG4gICAgICAgIHRoaXMuZWxhcHNlZFRpbWUgPSAwO1xuICAgICAgICB0aGlzLmZyYW1lQ291bnQgPSAwO1xuXG4gICAgICAgIHRoaXMuZW1pdCgncmVzZXQnLCAwLCAwLCB0aGlzLmZyYW1lQ291bnQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogc2V0IHRoZSBmcmFtZXJhdGUgZm9yIHRoZSBhbmltYXRpb24gbG9vcFxuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGZwc1xuICAgICAqIEByZXR1cm4ge0FuaW1pdHRlcn1cbiAgICAgKi9cbiAgICBzZXRGUFM6IGZ1bmN0aW9uKGZwcyl7XG4gICAgICAgIHRoaXMuX19mcHMgPSBmcHM7XG4gICAgICAgIHRoaXMuX19pc1JlYWR5Rm9yVXBkYXRlID0gbWFrZVRocm90dGxlKGZwcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBzZXQgdGhlIG9iamVjdCB0aGF0IHdpbGwgcHJvdmlkZSBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYFxuICAgICAqIGFuZCBgY2FuY2VsQW5pbWF0aW9uRnJhbWVgIG1ldGhvZHMgdG8gdGhpcyBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICAgKiBAcmV0dXJuIHtBbmltaXR0ZXJ9XG4gICAgICovXG4gICAgc2V0UmVxdWVzdEFuaW1hdGlvbkZyYW1lT2JqZWN0OiBmdW5jdGlvbihvYmplY3Qpe1xuICAgICAgICBpZih0eXBlb2Ygb2JqZWN0LnJlcXVlc3RBbmltYXRpb25GcmFtZSAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2Ygb2JqZWN0LmNhbmNlbEFuaW1hdGlvbkZyYW1lICE9PSAnZnVuY3Rpb24nKXtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgb2JqZWN0IHByb3ZpZGUgdG8gYHNldFJlcXVlc3RBbmltYXRpb25GcmFtZU9iamVjdGBcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVPYmplY3QgPSBvYmplY3Q7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBzdGFydCBhbiBhbmltYXRpb24gbG9vcFxuICAgICAqIEBlbWl0IEFuaW1pdHRlciNzdGFydFxuICAgICAqIEByZXR1cm4ge0FuaW1pdHRlcn1cbiAgICAgKi9cbiAgICBzdGFydDogZnVuY3Rpb24oKXtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICBpZih0aGlzLl9fZGVsYXkpe1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIG9uU3RhcnQoc2VsZik7XG4gICAgICAgICAgICB9LCB0aGlzLl9fZGVsYXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb25TdGFydCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogc3RvcHMgdGhlIGFuaW1hdGlvbiBsb29wLCBkb2VzIG5vdCBtYXJrIGFzIGNvbXBsZXRlZFxuICAgICAqXG4gICAgICogQGVtaXQgQW5pbWl0dGVyI3N0b3BcbiAgICAgKiBAcmV0dXJuIHtBbmltaXR0ZXJ9XG4gICAgICovXG4gICAgc3RvcDogZnVuY3Rpb24oKXtcbiAgICAgICAgaWYoIHRoaXMuX19ydW5uaW5nICl7XG4gICAgICAgICAgICB0aGlzLl9fcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgZXhwb3J0cy5ydW5uaW5nIC09IDE7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3N0b3AnLCB0aGlzLmRlbHRhVGltZSwgdGhpcy5lbGFwc2VkVGltZSwgdGhpcy5mcmFtZUNvdW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogdXBkYXRlIHRoZSBhbmltYXRpb24gbG9vcCBvbmNlXG4gICAgICpcbiAgICAgKiBAZW1pdCBBbmltaXR0ZXIjdXBkYXRlXG4gICAgICogQHJldHVybiB7QW5pbWl0dGVyfVxuICAgICAqL1xuICAgIHVwZGF0ZTogZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5mcmFtZUNvdW50Kys7XG4gICAgICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgICAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy5fX2xhc3RUaW1lID0gdGhpcy5fX2xhc3RUaW1lIHx8IG5vdztcbiAgICAgICAgdGhpcy5kZWx0YVRpbWUgPSAodGhpcy5maXhlZERlbHRhIHx8IGV4cG9ydHMuZ2xvYmFsRml4ZWREZWx0YSkgPyAxMDAwL01hdGgubWluKDYwLCB0aGlzLl9fZnBzKSA6IG5vdyAtIHRoaXMuX19sYXN0VGltZTtcbiAgICAgICAgdGhpcy5lbGFwc2VkVGltZSArPSB0aGlzLmRlbHRhVGltZTtcbiAgICAgICAgdGhpcy5fX2xhc3RUaW1lID0gbm93O1xuXG4gICAgICAgIHRoaXMuZW1pdCgndXBkYXRlJywgdGhpcy5kZWx0YVRpbWUsIHRoaXMuZWxhcHNlZFRpbWUsIHRoaXMuZnJhbWVDb3VudCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn07XG5cblxuXG5mb3IodmFyIG1ldGhvZCBpbiBtZXRob2RzKXtcbiAgICBBbmltaXR0ZXIucHJvdG90eXBlW21ldGhvZF0gPSBtZXRob2RzW21ldGhvZF07XG59XG5cblxuLyoqXG4gKiBjcmVhdGUgYW4gYW5pbWl0dGVyIGluc3RhbmNlLFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4oIGRlbHRhVGltZTpOdW1iZXIsIGVsYXBzZWRUaW1lOk51bWJlciwgZnJhbWVDb3VudDpOdW1iZXIgKVxuICogQHJldHVybnMge0FuaW1pdHRlcn1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQW5pbWl0dGVyKG9wdGlvbnMsIGZuKXtcblxuICAgIGlmKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKXtcbiAgICAgICAgZm4gPSBvcHRpb25zO1xuICAgICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgdmFyIF9pbnN0YW5jZSA9IG5ldyBBbmltaXR0ZXIoIG9wdGlvbnMgKTtcblxuICAgIGlmKCBmbiApe1xuICAgICAgICBfaW5zdGFuY2Uub24oJ3VwZGF0ZScsIGZuKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX2luc3RhbmNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBjcmVhdGVBbmltaXR0ZXI7XG5cbi8qKlxuICogY3JlYXRlIGFuIGFuaW1pdHRlciBpbnN0YW5jZSxcbiAqIHdoZXJlIHRoZSBzY29wZSBpcyBib3VuZCBpbiBhbGwgZnVuY3Rpb25zXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiggZGVsdGFUaW1lOk51bWJlciwgZWxhcHNlZFRpbWU6TnVtYmVyLCBmcmFtZUNvdW50Ok51bWJlciApXG4gKiBAcmV0dXJucyB7QW5pbWl0dGVyfVxuICovXG5leHBvcnRzLmJvdW5kID0gZnVuY3Rpb24ob3B0aW9ucywgZm4pe1xuXG4gICAgdmFyIGxvb3AgPSBjcmVhdGVBbmltaXR0ZXIob3B0aW9ucywgZm4pLFxuICAgICAgICBmdW5jdGlvbktleXMgPSBmdW5jdGlvbnMoQW5pbWl0dGVyLnByb3RvdHlwZSksXG4gICAgICAgIGhhc0JpbmQgPSAhIUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLFxuICAgICAgICBmbktleTtcblxuICAgIGZvcih2YXIgaT0wOyBpPGZ1bmN0aW9uS2V5cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGZuS2V5ID0gZnVuY3Rpb25LZXlzW2ldO1xuICAgICAgICBsb29wW2ZuS2V5XSA9IGhhc0JpbmQgPyBsb29wW2ZuS2V5XS5iaW5kKGxvb3ApIDogYmluZChsb29wW2ZuS2V5XSwgbG9vcCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvb3A7XG59O1xuXG5cbmV4cG9ydHMuQW5pbWl0dGVyID0gQW5pbWl0dGVyO1xuXG4vKipcbiAqIGlmIHRydWUsIGFsbCBgQW5pbWl0dGVyYCBpbnN0YW5jZXMgd2lsbCBiZWhhdmUgYXMgaWYgYG9wdGlvbnMuZml4ZWREZWx0YSA9IHRydWVgXG4gKi9cbmV4cG9ydHMuZ2xvYmFsRml4ZWREZWx0YSA9IGZhbHNlO1xuXG4vL2hlbHBmdWwgdG8gaW5oZXJpdCBmcm9tIHdoZW4gdXNpbmcgYnVuZGxlZFxuZXhwb3J0cy5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG4vL2tlZXAgYSBnbG9iYWwgY291bnRlciBvZiBhbGwgbG9vcHMgcnVubmluZywgaGVscGZ1bCB0byB3YXRjaCBpbiBkZXYgdG9vbHNcbmV4cG9ydHMucnVubmluZyA9IDA7XG5cbmZ1bmN0aW9uIGJpbmQoZm4sIHNjb3BlKXtcbiAgICBpZih0eXBlb2YgZm4uYmluZCA9PT0gJ2Z1bmN0aW9uJyl7XG4gICAgICAgIHJldHVybiBmbi5iaW5kKHNjb3BlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCl7XG4gICAgICAgIHJldHVybiBmbi5hcHBseShzY29wZSwgYXJndW1lbnRzKTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBmdW5jdGlvbnMob2JqKXtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgdmFyIGFyciA9IFtdO1xuICAgIGZvcih2YXIgaT0wOyBpPGtleXMubGVuZ3RoOyBpKyspe1xuICAgICAgICBpZih0eXBlb2Ygb2JqW2tleXNbaV1dID09PSAnZnVuY3Rpb24nKXtcbiAgICAgICAgICAgIGFyci5wdXNoKGtleXNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG59XG5cblxuXG4vL3BvbHlmaWxsIERhdGUubm93IGZvciByZWFsLW9sZCBicm93c2Vyc1xuRGF0ZS5ub3cgPSBEYXRlLm5vdyB8fCBmdW5jdGlvbiBub3coKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xufTtcbiIsInZhciBhc24xID0gZXhwb3J0cztcblxuYXNuMS5iaWdudW0gPSByZXF1aXJlKCdibi5qcycpO1xuXG5hc24xLmRlZmluZSA9IHJlcXVpcmUoJy4vYXNuMS9hcGknKS5kZWZpbmU7XG5hc24xLmJhc2UgPSByZXF1aXJlKCcuL2FzbjEvYmFzZScpO1xuYXNuMS5jb25zdGFudHMgPSByZXF1aXJlKCcuL2FzbjEvY29uc3RhbnRzJyk7XG5hc24xLmRlY29kZXJzID0gcmVxdWlyZSgnLi9hc24xL2RlY29kZXJzJyk7XG5hc24xLmVuY29kZXJzID0gcmVxdWlyZSgnLi9hc24xL2VuY29kZXJzJyk7XG4iLCJ2YXIgYXNuMSA9IHJlcXVpcmUoJy4uL2FzbjEnKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbnZhciBhcGkgPSBleHBvcnRzO1xuXG5hcGkuZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKG5hbWUsIGJvZHkpIHtcbiAgcmV0dXJuIG5ldyBFbnRpdHkobmFtZSwgYm9keSk7XG59O1xuXG5mdW5jdGlvbiBFbnRpdHkobmFtZSwgYm9keSkge1xuICB0aGlzLm5hbWUgPSBuYW1lO1xuICB0aGlzLmJvZHkgPSBib2R5O1xuXG4gIHRoaXMuZGVjb2RlcnMgPSB7fTtcbiAgdGhpcy5lbmNvZGVycyA9IHt9O1xufTtcblxuRW50aXR5LnByb3RvdHlwZS5fY3JlYXRlTmFtZWQgPSBmdW5jdGlvbiBjcmVhdGVOYW1lZChiYXNlKSB7XG4gIHZhciBuYW1lZDtcbiAgdHJ5IHtcbiAgICBuYW1lZCA9IHJlcXVpcmUoJ3ZtJykucnVuSW5UaGlzQ29udGV4dChcbiAgICAgICcoZnVuY3Rpb24gJyArIHRoaXMubmFtZSArICcoZW50aXR5KSB7XFxuJyArXG4gICAgICAnICB0aGlzLl9pbml0TmFtZWQoZW50aXR5KTtcXG4nICtcbiAgICAgICd9KSdcbiAgICApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbmFtZWQgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICB0aGlzLl9pbml0TmFtZWQoZW50aXR5KTtcbiAgICB9O1xuICB9XG4gIGluaGVyaXRzKG5hbWVkLCBiYXNlKTtcbiAgbmFtZWQucHJvdG90eXBlLl9pbml0TmFtZWQgPSBmdW5jdGlvbiBpbml0bmFtZWQoZW50aXR5KSB7XG4gICAgYmFzZS5jYWxsKHRoaXMsIGVudGl0eSk7XG4gIH07XG5cbiAgcmV0dXJuIG5ldyBuYW1lZCh0aGlzKTtcbn07XG5cbkVudGl0eS5wcm90b3R5cGUuX2dldERlY29kZXIgPSBmdW5jdGlvbiBfZ2V0RGVjb2RlcihlbmMpIHtcbiAgZW5jID0gZW5jIHx8ICdkZXInO1xuICAvLyBMYXppbHkgY3JlYXRlIGRlY29kZXJcbiAgaWYgKCF0aGlzLmRlY29kZXJzLmhhc093blByb3BlcnR5KGVuYykpXG4gICAgdGhpcy5kZWNvZGVyc1tlbmNdID0gdGhpcy5fY3JlYXRlTmFtZWQoYXNuMS5kZWNvZGVyc1tlbmNdKTtcbiAgcmV0dXJuIHRoaXMuZGVjb2RlcnNbZW5jXTtcbn07XG5cbkVudGl0eS5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKGRhdGEsIGVuYywgb3B0aW9ucykge1xuICByZXR1cm4gdGhpcy5fZ2V0RGVjb2RlcihlbmMpLmRlY29kZShkYXRhLCBvcHRpb25zKTtcbn07XG5cbkVudGl0eS5wcm90b3R5cGUuX2dldEVuY29kZXIgPSBmdW5jdGlvbiBfZ2V0RW5jb2RlcihlbmMpIHtcbiAgZW5jID0gZW5jIHx8ICdkZXInO1xuICAvLyBMYXppbHkgY3JlYXRlIGVuY29kZXJcbiAgaWYgKCF0aGlzLmVuY29kZXJzLmhhc093blByb3BlcnR5KGVuYykpXG4gICAgdGhpcy5lbmNvZGVyc1tlbmNdID0gdGhpcy5fY3JlYXRlTmFtZWQoYXNuMS5lbmNvZGVyc1tlbmNdKTtcbiAgcmV0dXJuIHRoaXMuZW5jb2RlcnNbZW5jXTtcbn07XG5cbkVudGl0eS5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGRhdGEsIGVuYywgLyogaW50ZXJuYWwgKi8gcmVwb3J0ZXIpIHtcbiAgcmV0dXJuIHRoaXMuX2dldEVuY29kZXIoZW5jKS5lbmNvZGUoZGF0YSwgcmVwb3J0ZXIpO1xufTtcbiIsInZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG52YXIgUmVwb3J0ZXIgPSByZXF1aXJlKCcuLi9iYXNlJykuUmVwb3J0ZXI7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG5mdW5jdGlvbiBEZWNvZGVyQnVmZmVyKGJhc2UsIG9wdGlvbnMpIHtcbiAgUmVwb3J0ZXIuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYmFzZSkpIHtcbiAgICB0aGlzLmVycm9yKCdJbnB1dCBub3QgQnVmZmVyJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5iYXNlID0gYmFzZTtcbiAgdGhpcy5vZmZzZXQgPSAwO1xuICB0aGlzLmxlbmd0aCA9IGJhc2UubGVuZ3RoO1xufVxuaW5oZXJpdHMoRGVjb2RlckJ1ZmZlciwgUmVwb3J0ZXIpO1xuZXhwb3J0cy5EZWNvZGVyQnVmZmVyID0gRGVjb2RlckJ1ZmZlcjtcblxuRGVjb2RlckJ1ZmZlci5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uIHNhdmUoKSB7XG4gIHJldHVybiB7IG9mZnNldDogdGhpcy5vZmZzZXQsIHJlcG9ydGVyOiBSZXBvcnRlci5wcm90b3R5cGUuc2F2ZS5jYWxsKHRoaXMpIH07XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5yZXN0b3JlID0gZnVuY3Rpb24gcmVzdG9yZShzYXZlKSB7XG4gIC8vIFJldHVybiBza2lwcGVkIGRhdGFcbiAgdmFyIHJlcyA9IG5ldyBEZWNvZGVyQnVmZmVyKHRoaXMuYmFzZSk7XG4gIHJlcy5vZmZzZXQgPSBzYXZlLm9mZnNldDtcbiAgcmVzLmxlbmd0aCA9IHRoaXMub2Zmc2V0O1xuXG4gIHRoaXMub2Zmc2V0ID0gc2F2ZS5vZmZzZXQ7XG4gIFJlcG9ydGVyLnByb3RvdHlwZS5yZXN0b3JlLmNhbGwodGhpcywgc2F2ZS5yZXBvcnRlcik7XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbkRlY29kZXJCdWZmZXIucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiBpc0VtcHR5KCkge1xuICByZXR1cm4gdGhpcy5vZmZzZXQgPT09IHRoaXMubGVuZ3RoO1xufTtcblxuRGVjb2RlckJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4KGZhaWwpIHtcbiAgaWYgKHRoaXMub2Zmc2V0ICsgMSA8PSB0aGlzLmxlbmd0aClcbiAgICByZXR1cm4gdGhpcy5iYXNlLnJlYWRVSW50OCh0aGlzLm9mZnNldCsrLCB0cnVlKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmVycm9yKGZhaWwgfHwgJ0RlY29kZXJCdWZmZXIgb3ZlcnJ1bicpO1xufVxuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5za2lwID0gZnVuY3Rpb24gc2tpcChieXRlcywgZmFpbCkge1xuICBpZiAoISh0aGlzLm9mZnNldCArIGJ5dGVzIDw9IHRoaXMubGVuZ3RoKSlcbiAgICByZXR1cm4gdGhpcy5lcnJvcihmYWlsIHx8ICdEZWNvZGVyQnVmZmVyIG92ZXJydW4nKTtcblxuICB2YXIgcmVzID0gbmV3IERlY29kZXJCdWZmZXIodGhpcy5iYXNlKTtcblxuICAvLyBTaGFyZSByZXBvcnRlciBzdGF0ZVxuICByZXMuX3JlcG9ydGVyU3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuXG4gIHJlcy5vZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgcmVzLmxlbmd0aCA9IHRoaXMub2Zmc2V0ICsgYnl0ZXM7XG4gIHRoaXMub2Zmc2V0ICs9IGJ5dGVzO1xuICByZXR1cm4gcmVzO1xufVxuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5yYXcgPSBmdW5jdGlvbiByYXcoc2F2ZSkge1xuICByZXR1cm4gdGhpcy5iYXNlLnNsaWNlKHNhdmUgPyBzYXZlLm9mZnNldCA6IHRoaXMub2Zmc2V0LCB0aGlzLmxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIEVuY29kZXJCdWZmZXIodmFsdWUsIHJlcG9ydGVyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWUubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgIGlmICghKGl0ZW0gaW5zdGFuY2VvZiBFbmNvZGVyQnVmZmVyKSlcbiAgICAgICAgaXRlbSA9IG5ldyBFbmNvZGVyQnVmZmVyKGl0ZW0sIHJlcG9ydGVyKTtcbiAgICAgIHRoaXMubGVuZ3RoICs9IGl0ZW0ubGVuZ3RoO1xuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfSwgdGhpcyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIGlmICghKDAgPD0gdmFsdWUgJiYgdmFsdWUgPD0gMHhmZikpXG4gICAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ25vbi1ieXRlIEVuY29kZXJCdWZmZXIgdmFsdWUnKTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5sZW5ndGggPSAxO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5sZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aCh2YWx1ZSk7XG4gIH0gZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ1Vuc3VwcG9ydGVkIHR5cGU6ICcgKyB0eXBlb2YgdmFsdWUpO1xuICB9XG59XG5leHBvcnRzLkVuY29kZXJCdWZmZXIgPSBFbmNvZGVyQnVmZmVyO1xuXG5FbmNvZGVyQnVmZmVyLnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24gam9pbihvdXQsIG9mZnNldCkge1xuICBpZiAoIW91dClcbiAgICBvdXQgPSBuZXcgQnVmZmVyKHRoaXMubGVuZ3RoKTtcbiAgaWYgKCFvZmZzZXQpXG4gICAgb2Zmc2V0ID0gMDtcblxuICBpZiAodGhpcy5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuIG91dDtcblxuICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkge1xuICAgIHRoaXMudmFsdWUuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7XG4gICAgICBpdGVtLmpvaW4ob3V0LCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IGl0ZW0ubGVuZ3RoO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ251bWJlcicpXG4gICAgICBvdXRbb2Zmc2V0XSA9IHRoaXMudmFsdWU7XG4gICAgZWxzZSBpZiAodHlwZW9mIHRoaXMudmFsdWUgPT09ICdzdHJpbmcnKVxuICAgICAgb3V0LndyaXRlKHRoaXMudmFsdWUsIG9mZnNldCk7XG4gICAgZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKHRoaXMudmFsdWUpKVxuICAgICAgdGhpcy52YWx1ZS5jb3B5KG91dCwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gdGhpcy5sZW5ndGg7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufTtcbiIsInZhciBiYXNlID0gZXhwb3J0cztcblxuYmFzZS5SZXBvcnRlciA9IHJlcXVpcmUoJy4vcmVwb3J0ZXInKS5SZXBvcnRlcjtcbmJhc2UuRGVjb2RlckJ1ZmZlciA9IHJlcXVpcmUoJy4vYnVmZmVyJykuRGVjb2RlckJ1ZmZlcjtcbmJhc2UuRW5jb2RlckJ1ZmZlciA9IHJlcXVpcmUoJy4vYnVmZmVyJykuRW5jb2RlckJ1ZmZlcjtcbmJhc2UuTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xuIiwidmFyIFJlcG9ydGVyID0gcmVxdWlyZSgnLi4vYmFzZScpLlJlcG9ydGVyO1xudmFyIEVuY29kZXJCdWZmZXIgPSByZXF1aXJlKCcuLi9iYXNlJykuRW5jb2RlckJ1ZmZlcjtcbnZhciBEZWNvZGVyQnVmZmVyID0gcmVxdWlyZSgnLi4vYmFzZScpLkRlY29kZXJCdWZmZXI7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG4vLyBTdXBwb3J0ZWQgdGFnc1xudmFyIHRhZ3MgPSBbXG4gICdzZXEnLCAnc2Vxb2YnLCAnc2V0JywgJ3NldG9mJywgJ29iamlkJywgJ2Jvb2wnLFxuICAnZ2VudGltZScsICd1dGN0aW1lJywgJ251bGxfJywgJ2VudW0nLCAnaW50JywgJ29iakRlc2MnLFxuICAnYml0c3RyJywgJ2JtcHN0cicsICdjaGFyc3RyJywgJ2dlbnN0cicsICdncmFwaHN0cicsICdpYTVzdHInLCAnaXNvNjQ2c3RyJyxcbiAgJ251bXN0cicsICdvY3RzdHInLCAncHJpbnRzdHInLCAndDYxc3RyJywgJ3VuaXN0cicsICd1dGY4c3RyJywgJ3ZpZGVvc3RyJ1xuXTtcblxuLy8gUHVibGljIG1ldGhvZHMgbGlzdFxudmFyIG1ldGhvZHMgPSBbXG4gICdrZXknLCAnb2JqJywgJ3VzZScsICdvcHRpb25hbCcsICdleHBsaWNpdCcsICdpbXBsaWNpdCcsICdkZWYnLCAnY2hvaWNlJyxcbiAgJ2FueScsICdjb250YWlucydcbl0uY29uY2F0KHRhZ3MpO1xuXG4vLyBPdmVycmlkZWQgbWV0aG9kcyBsaXN0XG52YXIgb3ZlcnJpZGVkID0gW1xuICAnX3BlZWtUYWcnLCAnX2RlY29kZVRhZycsICdfdXNlJyxcbiAgJ19kZWNvZGVTdHInLCAnX2RlY29kZU9iamlkJywgJ19kZWNvZGVUaW1lJyxcbiAgJ19kZWNvZGVOdWxsJywgJ19kZWNvZGVJbnQnLCAnX2RlY29kZUJvb2wnLCAnX2RlY29kZUxpc3QnLFxuXG4gICdfZW5jb2RlQ29tcG9zaXRlJywgJ19lbmNvZGVTdHInLCAnX2VuY29kZU9iamlkJywgJ19lbmNvZGVUaW1lJyxcbiAgJ19lbmNvZGVOdWxsJywgJ19lbmNvZGVJbnQnLCAnX2VuY29kZUJvb2wnXG5dO1xuXG5mdW5jdGlvbiBOb2RlKGVuYywgcGFyZW50KSB7XG4gIHZhciBzdGF0ZSA9IHt9O1xuICB0aGlzLl9iYXNlU3RhdGUgPSBzdGF0ZTtcblxuICBzdGF0ZS5lbmMgPSBlbmM7XG5cbiAgc3RhdGUucGFyZW50ID0gcGFyZW50IHx8IG51bGw7XG4gIHN0YXRlLmNoaWxkcmVuID0gbnVsbDtcblxuICAvLyBTdGF0ZVxuICBzdGF0ZS50YWcgPSBudWxsO1xuICBzdGF0ZS5hcmdzID0gbnVsbDtcbiAgc3RhdGUucmV2ZXJzZUFyZ3MgPSBudWxsO1xuICBzdGF0ZS5jaG9pY2UgPSBudWxsO1xuICBzdGF0ZS5vcHRpb25hbCA9IGZhbHNlO1xuICBzdGF0ZS5hbnkgPSBmYWxzZTtcbiAgc3RhdGUub2JqID0gZmFsc2U7XG4gIHN0YXRlLnVzZSA9IG51bGw7XG4gIHN0YXRlLnVzZURlY29kZXIgPSBudWxsO1xuICBzdGF0ZS5rZXkgPSBudWxsO1xuICBzdGF0ZVsnZGVmYXVsdCddID0gbnVsbDtcbiAgc3RhdGUuZXhwbGljaXQgPSBudWxsO1xuICBzdGF0ZS5pbXBsaWNpdCA9IG51bGw7XG4gIHN0YXRlLmNvbnRhaW5zID0gbnVsbDtcblxuICAvLyBTaG91bGQgY3JlYXRlIG5ldyBpbnN0YW5jZSBvbiBlYWNoIG1ldGhvZFxuICBpZiAoIXN0YXRlLnBhcmVudCkge1xuICAgIHN0YXRlLmNoaWxkcmVuID0gW107XG4gICAgdGhpcy5fd3JhcCgpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IE5vZGU7XG5cbnZhciBzdGF0ZVByb3BzID0gW1xuICAnZW5jJywgJ3BhcmVudCcsICdjaGlsZHJlbicsICd0YWcnLCAnYXJncycsICdyZXZlcnNlQXJncycsICdjaG9pY2UnLFxuICAnb3B0aW9uYWwnLCAnYW55JywgJ29iaicsICd1c2UnLCAnYWx0ZXJlZFVzZScsICdrZXknLCAnZGVmYXVsdCcsICdleHBsaWNpdCcsXG4gICdpbXBsaWNpdCcsICdjb250YWlucydcbl07XG5cbk5vZGUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gY2xvbmUoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgdmFyIGNzdGF0ZSA9IHt9O1xuICBzdGF0ZVByb3BzLmZvckVhY2goZnVuY3Rpb24ocHJvcCkge1xuICAgIGNzdGF0ZVtwcm9wXSA9IHN0YXRlW3Byb3BdO1xuICB9KTtcbiAgdmFyIHJlcyA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKGNzdGF0ZS5wYXJlbnQpO1xuICByZXMuX2Jhc2VTdGF0ZSA9IGNzdGF0ZTtcbiAgcmV0dXJuIHJlcztcbn07XG5cbk5vZGUucHJvdG90eXBlLl93cmFwID0gZnVuY3Rpb24gd3JhcCgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICBtZXRob2RzLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgdGhpc1ttZXRob2RdID0gZnVuY3Rpb24gX3dyYXBwZWRNZXRob2QoKSB7XG4gICAgICB2YXIgY2xvbmUgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzKTtcbiAgICAgIHN0YXRlLmNoaWxkcmVuLnB1c2goY2xvbmUpO1xuICAgICAgcmV0dXJuIGNsb25lW21ldGhvZF0uYXBwbHkoY2xvbmUsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfSwgdGhpcyk7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIGluaXQoYm9keSkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLnBhcmVudCA9PT0gbnVsbCk7XG4gIGJvZHkuY2FsbCh0aGlzKTtcblxuICAvLyBGaWx0ZXIgY2hpbGRyZW5cbiAgc3RhdGUuY2hpbGRyZW4gPSBzdGF0ZS5jaGlsZHJlbi5maWx0ZXIoZnVuY3Rpb24oY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQuX2Jhc2VTdGF0ZS5wYXJlbnQgPT09IHRoaXM7XG4gIH0sIHRoaXMpO1xuICBhc3NlcnQuZXF1YWwoc3RhdGUuY2hpbGRyZW4ubGVuZ3RoLCAxLCAnUm9vdCBub2RlIGNhbiBoYXZlIG9ubHkgb25lIGNoaWxkJyk7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fdXNlQXJncyA9IGZ1bmN0aW9uIHVzZUFyZ3MoYXJncykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgLy8gRmlsdGVyIGNoaWxkcmVuIGFuZCBhcmdzXG4gIHZhciBjaGlsZHJlbiA9IGFyZ3MuZmlsdGVyKGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBhcmcgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yO1xuICB9LCB0aGlzKTtcbiAgYXJncyA9IGFyZ3MuZmlsdGVyKGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiAhKGFyZyBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3IpO1xuICB9LCB0aGlzKTtcblxuICBpZiAoY2hpbGRyZW4ubGVuZ3RoICE9PSAwKSB7XG4gICAgYXNzZXJ0KHN0YXRlLmNoaWxkcmVuID09PSBudWxsKTtcbiAgICBzdGF0ZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuXG4gICAgLy8gUmVwbGFjZSBwYXJlbnQgdG8gbWFpbnRhaW4gYmFja3dhcmQgbGlua1xuICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLl9iYXNlU3RhdGUucGFyZW50ID0gdGhpcztcbiAgICB9LCB0aGlzKTtcbiAgfVxuICBpZiAoYXJncy5sZW5ndGggIT09IDApIHtcbiAgICBhc3NlcnQoc3RhdGUuYXJncyA9PT0gbnVsbCk7XG4gICAgc3RhdGUuYXJncyA9IGFyZ3M7XG4gICAgc3RhdGUucmV2ZXJzZUFyZ3MgPSBhcmdzLm1hcChmdW5jdGlvbihhcmcpIHtcbiAgICAgIGlmICh0eXBlb2YgYXJnICE9PSAnb2JqZWN0JyB8fCBhcmcuY29uc3RydWN0b3IgIT09IE9iamVjdClcbiAgICAgICAgcmV0dXJuIGFyZztcblxuICAgICAgdmFyIHJlcyA9IHt9O1xuICAgICAgT2JqZWN0LmtleXMoYXJnKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBpZiAoa2V5ID09IChrZXkgfCAwKSlcbiAgICAgICAgICBrZXkgfD0gMDtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJnW2tleV07XG4gICAgICAgIHJlc1t2YWx1ZV0gPSBrZXk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSk7XG4gIH1cbn07XG5cbi8vXG4vLyBPdmVycmlkZWQgbWV0aG9kc1xuLy9cblxub3ZlcnJpZGVkLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gIE5vZGUucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiBfb3ZlcnJpZGVkKCkge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWV0aG9kICsgJyBub3QgaW1wbGVtZW50ZWQgZm9yIGVuY29kaW5nOiAnICsgc3RhdGUuZW5jKTtcbiAgfTtcbn0pO1xuXG4vL1xuLy8gUHVibGljIG1ldGhvZHNcbi8vXG5cbnRhZ3MuZm9yRWFjaChmdW5jdGlvbih0YWcpIHtcbiAgTm9kZS5wcm90b3R5cGVbdGFnXSA9IGZ1bmN0aW9uIF90YWdNZXRob2QoKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblxuICAgIGFzc2VydChzdGF0ZS50YWcgPT09IG51bGwpO1xuICAgIHN0YXRlLnRhZyA9IHRhZztcblxuICAgIHRoaXMuX3VzZUFyZ3MoYXJncyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn0pO1xuXG5Ob2RlLnByb3RvdHlwZS51c2UgPSBmdW5jdGlvbiB1c2UoaXRlbSkge1xuICBhc3NlcnQoaXRlbSk7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUudXNlID09PSBudWxsKTtcbiAgc3RhdGUudXNlID0gaXRlbTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLm9wdGlvbmFsID0gZnVuY3Rpb24gb3B0aW9uYWwoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBzdGF0ZS5vcHRpb25hbCA9IHRydWU7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5kZWYgPSBmdW5jdGlvbiBkZWYodmFsKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGVbJ2RlZmF1bHQnXSA9PT0gbnVsbCk7XG4gIHN0YXRlWydkZWZhdWx0J10gPSB2YWw7XG4gIHN0YXRlLm9wdGlvbmFsID0gdHJ1ZTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmV4cGxpY2l0ID0gZnVuY3Rpb24gZXhwbGljaXQobnVtKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUuZXhwbGljaXQgPT09IG51bGwgJiYgc3RhdGUuaW1wbGljaXQgPT09IG51bGwpO1xuICBzdGF0ZS5leHBsaWNpdCA9IG51bTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmltcGxpY2l0ID0gZnVuY3Rpb24gaW1wbGljaXQobnVtKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUuZXhwbGljaXQgPT09IG51bGwgJiYgc3RhdGUuaW1wbGljaXQgPT09IG51bGwpO1xuICBzdGF0ZS5pbXBsaWNpdCA9IG51bTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLm9iaiA9IGZ1bmN0aW9uIG9iaigpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cbiAgc3RhdGUub2JqID0gdHJ1ZTtcblxuICBpZiAoYXJncy5sZW5ndGggIT09IDApXG4gICAgdGhpcy5fdXNlQXJncyhhcmdzKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmtleSA9IGZ1bmN0aW9uIGtleShuZXdLZXkpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZS5rZXkgPT09IG51bGwpO1xuICBzdGF0ZS5rZXkgPSBuZXdLZXk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5hbnkgPSBmdW5jdGlvbiBhbnkoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBzdGF0ZS5hbnkgPSB0cnVlO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTm9kZS5wcm90b3R5cGUuY2hvaWNlID0gZnVuY3Rpb24gY2hvaWNlKG9iaikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLmNob2ljZSA9PT0gbnVsbCk7XG4gIHN0YXRlLmNob2ljZSA9IG9iajtcbiAgdGhpcy5fdXNlQXJncyhPYmplY3Qua2V5cyhvYmopLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH0pKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gY29udGFpbnMoaXRlbSkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLnVzZSA9PT0gbnVsbCk7XG4gIHN0YXRlLmNvbnRhaW5zID0gaXRlbTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vXG4vLyBEZWNvZGluZ1xuLy9cblxuTm9kZS5wcm90b3R5cGUuX2RlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgb3B0aW9ucykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgLy8gRGVjb2RlIHJvb3Qgbm9kZVxuICBpZiAoc3RhdGUucGFyZW50ID09PSBudWxsKVxuICAgIHJldHVybiBpbnB1dC53cmFwUmVzdWx0KHN0YXRlLmNoaWxkcmVuWzBdLl9kZWNvZGUoaW5wdXQsIG9wdGlvbnMpKTtcblxuICB2YXIgcmVzdWx0ID0gc3RhdGVbJ2RlZmF1bHQnXTtcbiAgdmFyIHByZXNlbnQgPSB0cnVlO1xuXG4gIHZhciBwcmV2S2V5ID0gbnVsbDtcbiAgaWYgKHN0YXRlLmtleSAhPT0gbnVsbClcbiAgICBwcmV2S2V5ID0gaW5wdXQuZW50ZXJLZXkoc3RhdGUua2V5KTtcblxuICAvLyBDaGVjayBpZiB0YWcgaXMgdGhlcmVcbiAgaWYgKHN0YXRlLm9wdGlvbmFsKSB7XG4gICAgdmFyIHRhZyA9IG51bGw7XG4gICAgaWYgKHN0YXRlLmV4cGxpY2l0ICE9PSBudWxsKVxuICAgICAgdGFnID0gc3RhdGUuZXhwbGljaXQ7XG4gICAgZWxzZSBpZiAoc3RhdGUuaW1wbGljaXQgIT09IG51bGwpXG4gICAgICB0YWcgPSBzdGF0ZS5pbXBsaWNpdDtcbiAgICBlbHNlIGlmIChzdGF0ZS50YWcgIT09IG51bGwpXG4gICAgICB0YWcgPSBzdGF0ZS50YWc7XG5cbiAgICBpZiAodGFnID09PSBudWxsICYmICFzdGF0ZS5hbnkpIHtcbiAgICAgIC8vIFRyaWFsIGFuZCBFcnJvclxuICAgICAgdmFyIHNhdmUgPSBpbnB1dC5zYXZlKCk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoc3RhdGUuY2hvaWNlID09PSBudWxsKVxuICAgICAgICAgIHRoaXMuX2RlY29kZUdlbmVyaWMoc3RhdGUudGFnLCBpbnB1dCwgb3B0aW9ucyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB0aGlzLl9kZWNvZGVDaG9pY2UoaW5wdXQsIG9wdGlvbnMpO1xuICAgICAgICBwcmVzZW50ID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcHJlc2VudCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaW5wdXQucmVzdG9yZShzYXZlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJlc2VudCA9IHRoaXMuX3BlZWtUYWcoaW5wdXQsIHRhZywgc3RhdGUuYW55KTtcblxuICAgICAgaWYgKGlucHV0LmlzRXJyb3IocHJlc2VudCkpXG4gICAgICAgIHJldHVybiBwcmVzZW50O1xuICAgIH1cbiAgfVxuXG4gIC8vIFB1c2ggb2JqZWN0IG9uIHN0YWNrXG4gIHZhciBwcmV2T2JqO1xuICBpZiAoc3RhdGUub2JqICYmIHByZXNlbnQpXG4gICAgcHJldk9iaiA9IGlucHV0LmVudGVyT2JqZWN0KCk7XG5cbiAgaWYgKHByZXNlbnQpIHtcbiAgICAvLyBVbndyYXAgZXhwbGljaXQgdmFsdWVzXG4gICAgaWYgKHN0YXRlLmV4cGxpY2l0ICE9PSBudWxsKSB7XG4gICAgICB2YXIgZXhwbGljaXQgPSB0aGlzLl9kZWNvZGVUYWcoaW5wdXQsIHN0YXRlLmV4cGxpY2l0KTtcbiAgICAgIGlmIChpbnB1dC5pc0Vycm9yKGV4cGxpY2l0KSlcbiAgICAgICAgcmV0dXJuIGV4cGxpY2l0O1xuICAgICAgaW5wdXQgPSBleHBsaWNpdDtcbiAgICB9XG5cbiAgICB2YXIgc3RhcnQgPSBpbnB1dC5vZmZzZXQ7XG5cbiAgICAvLyBVbndyYXAgaW1wbGljaXQgYW5kIG5vcm1hbCB2YWx1ZXNcbiAgICBpZiAoc3RhdGUudXNlID09PSBudWxsICYmIHN0YXRlLmNob2ljZSA9PT0gbnVsbCkge1xuICAgICAgaWYgKHN0YXRlLmFueSlcbiAgICAgICAgdmFyIHNhdmUgPSBpbnB1dC5zYXZlKCk7XG4gICAgICB2YXIgYm9keSA9IHRoaXMuX2RlY29kZVRhZyhcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIHN0YXRlLmltcGxpY2l0ICE9PSBudWxsID8gc3RhdGUuaW1wbGljaXQgOiBzdGF0ZS50YWcsXG4gICAgICAgIHN0YXRlLmFueVxuICAgICAgKTtcbiAgICAgIGlmIChpbnB1dC5pc0Vycm9yKGJvZHkpKVxuICAgICAgICByZXR1cm4gYm9keTtcblxuICAgICAgaWYgKHN0YXRlLmFueSlcbiAgICAgICAgcmVzdWx0ID0gaW5wdXQucmF3KHNhdmUpO1xuICAgICAgZWxzZVxuICAgICAgICBpbnB1dCA9IGJvZHk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy50cmFjayAmJiBzdGF0ZS50YWcgIT09IG51bGwpXG4gICAgICBvcHRpb25zLnRyYWNrKGlucHV0LnBhdGgoKSwgc3RhcnQsIGlucHV0Lmxlbmd0aCwgJ3RhZ2dlZCcpO1xuXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy50cmFjayAmJiBzdGF0ZS50YWcgIT09IG51bGwpXG4gICAgICBvcHRpb25zLnRyYWNrKGlucHV0LnBhdGgoKSwgaW5wdXQub2Zmc2V0LCBpbnB1dC5sZW5ndGgsICdjb250ZW50Jyk7XG5cbiAgICAvLyBTZWxlY3QgcHJvcGVyIG1ldGhvZCBmb3IgdGFnXG4gICAgaWYgKHN0YXRlLmFueSlcbiAgICAgIHJlc3VsdCA9IHJlc3VsdDtcbiAgICBlbHNlIGlmIChzdGF0ZS5jaG9pY2UgPT09IG51bGwpXG4gICAgICByZXN1bHQgPSB0aGlzLl9kZWNvZGVHZW5lcmljKHN0YXRlLnRhZywgaW5wdXQsIG9wdGlvbnMpO1xuICAgIGVsc2VcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2RlY29kZUNob2ljZShpbnB1dCwgb3B0aW9ucyk7XG5cbiAgICBpZiAoaW5wdXQuaXNFcnJvcihyZXN1bHQpKVxuICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgIC8vIERlY29kZSBjaGlsZHJlblxuICAgIGlmICghc3RhdGUuYW55ICYmIHN0YXRlLmNob2ljZSA9PT0gbnVsbCAmJiBzdGF0ZS5jaGlsZHJlbiAhPT0gbnVsbCkge1xuICAgICAgc3RhdGUuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiBkZWNvZGVDaGlsZHJlbihjaGlsZCkge1xuICAgICAgICAvLyBOT1RFOiBXZSBhcmUgaWdub3JpbmcgZXJyb3JzIGhlcmUsIHRvIGxldCBwYXJzZXIgY29udGludWUgd2l0aCBvdGhlclxuICAgICAgICAvLyBwYXJ0cyBvZiBlbmNvZGVkIGRhdGFcbiAgICAgICAgY2hpbGQuX2RlY29kZShpbnB1dCwgb3B0aW9ucyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEZWNvZGUgY29udGFpbmVkL2VuY29kZWQgYnkgc2NoZW1hLCBvbmx5IGluIGJpdCBvciBvY3RldCBzdHJpbmdzXG4gICAgaWYgKHN0YXRlLmNvbnRhaW5zICYmIChzdGF0ZS50YWcgPT09ICdvY3RzdHInIHx8IHN0YXRlLnRhZyA9PT0gJ2JpdHN0cicpKSB7XG4gICAgICB2YXIgZGF0YSA9IG5ldyBEZWNvZGVyQnVmZmVyKHJlc3VsdCk7XG4gICAgICByZXN1bHQgPSB0aGlzLl9nZXRVc2Uoc3RhdGUuY29udGFpbnMsIGlucHV0Ll9yZXBvcnRlclN0YXRlLm9iailcbiAgICAgICAgICAuX2RlY29kZShkYXRhLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvLyBQb3Agb2JqZWN0XG4gIGlmIChzdGF0ZS5vYmogJiYgcHJlc2VudClcbiAgICByZXN1bHQgPSBpbnB1dC5sZWF2ZU9iamVjdChwcmV2T2JqKTtcblxuICAvLyBTZXQga2V5XG4gIGlmIChzdGF0ZS5rZXkgIT09IG51bGwgJiYgKHJlc3VsdCAhPT0gbnVsbCB8fCBwcmVzZW50ID09PSB0cnVlKSlcbiAgICBpbnB1dC5sZWF2ZUtleShwcmV2S2V5LCBzdGF0ZS5rZXksIHJlc3VsdCk7XG4gIGVsc2UgaWYgKHByZXZLZXkgIT09IG51bGwpXG4gICAgaW5wdXQuZXhpdEtleShwcmV2S2V5KTtcblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2RlY29kZUdlbmVyaWMgPSBmdW5jdGlvbiBkZWNvZGVHZW5lcmljKHRhZywgaW5wdXQsIG9wdGlvbnMpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGlmICh0YWcgPT09ICdzZXEnIHx8IHRhZyA9PT0gJ3NldCcpXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmICh0YWcgPT09ICdzZXFvZicgfHwgdGFnID09PSAnc2V0b2YnKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVMaXN0KGlucHV0LCB0YWcsIHN0YXRlLmFyZ3NbMF0sIG9wdGlvbnMpO1xuICBlbHNlIGlmICgvc3RyJC8udGVzdCh0YWcpKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVTdHIoaW5wdXQsIHRhZywgb3B0aW9ucyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iamlkJyAmJiBzdGF0ZS5hcmdzKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVPYmppZChpbnB1dCwgc3RhdGUuYXJnc1swXSwgc3RhdGUuYXJnc1sxXSwgb3B0aW9ucyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iamlkJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlT2JqaWQoaW5wdXQsIG51bGwsIG51bGwsIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdnZW50aW1lJyB8fCB0YWcgPT09ICd1dGN0aW1lJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlVGltZShpbnB1dCwgdGFnLCBvcHRpb25zKTtcbiAgZWxzZSBpZiAodGFnID09PSAnbnVsbF8nKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVOdWxsKGlucHV0LCBvcHRpb25zKTtcbiAgZWxzZSBpZiAodGFnID09PSAnYm9vbCcpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZUJvb2woaW5wdXQsIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdvYmpEZXNjJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlU3RyKGlucHV0LCB0YWcsIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdpbnQnIHx8IHRhZyA9PT0gJ2VudW0nKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVJbnQoaW5wdXQsIHN0YXRlLmFyZ3MgJiYgc3RhdGUuYXJnc1swXSwgb3B0aW9ucyk7XG5cbiAgaWYgKHN0YXRlLnVzZSAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRVc2Uoc3RhdGUudXNlLCBpbnB1dC5fcmVwb3J0ZXJTdGF0ZS5vYmopXG4gICAgICAgIC5fZGVjb2RlKGlucHV0LCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW5wdXQuZXJyb3IoJ3Vua25vd24gdGFnOiAnICsgdGFnKTtcbiAgfVxufTtcblxuTm9kZS5wcm90b3R5cGUuX2dldFVzZSA9IGZ1bmN0aW9uIF9nZXRVc2UoZW50aXR5LCBvYmopIHtcblxuICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIC8vIENyZWF0ZSBhbHRlcmVkIHVzZSBkZWNvZGVyIGlmIGltcGxpY2l0IGlzIHNldFxuICBzdGF0ZS51c2VEZWNvZGVyID0gdGhpcy5fdXNlKGVudGl0eSwgb2JqKTtcbiAgYXNzZXJ0KHN0YXRlLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5wYXJlbnQgPT09IG51bGwpO1xuICBzdGF0ZS51c2VEZWNvZGVyID0gc3RhdGUudXNlRGVjb2Rlci5fYmFzZVN0YXRlLmNoaWxkcmVuWzBdO1xuICBpZiAoc3RhdGUuaW1wbGljaXQgIT09IHN0YXRlLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5pbXBsaWNpdCkge1xuICAgIHN0YXRlLnVzZURlY29kZXIgPSBzdGF0ZS51c2VEZWNvZGVyLmNsb25lKCk7XG4gICAgc3RhdGUudXNlRGVjb2Rlci5fYmFzZVN0YXRlLmltcGxpY2l0ID0gc3RhdGUuaW1wbGljaXQ7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLnVzZURlY29kZXI7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZGVjb2RlQ2hvaWNlID0gZnVuY3Rpb24gZGVjb2RlQ2hvaWNlKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgdmFyIHJlc3VsdCA9IG51bGw7XG4gIHZhciBtYXRjaCA9IGZhbHNlO1xuXG4gIE9iamVjdC5rZXlzKHN0YXRlLmNob2ljZSkuc29tZShmdW5jdGlvbihrZXkpIHtcbiAgICB2YXIgc2F2ZSA9IGlucHV0LnNhdmUoKTtcbiAgICB2YXIgbm9kZSA9IHN0YXRlLmNob2ljZVtrZXldO1xuICAgIHRyeSB7XG4gICAgICB2YXIgdmFsdWUgPSBub2RlLl9kZWNvZGUoaW5wdXQsIG9wdGlvbnMpO1xuICAgICAgaWYgKGlucHV0LmlzRXJyb3IodmFsdWUpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJlc3VsdCA9IHsgdHlwZToga2V5LCB2YWx1ZTogdmFsdWUgfTtcbiAgICAgIG1hdGNoID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpbnB1dC5yZXN0b3JlKHNhdmUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSwgdGhpcyk7XG5cbiAgaWYgKCFtYXRjaClcbiAgICByZXR1cm4gaW5wdXQuZXJyb3IoJ0Nob2ljZSBub3QgbWF0Y2hlZCcpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vL1xuLy8gRW5jb2Rpbmdcbi8vXG5cbk5vZGUucHJvdG90eXBlLl9jcmVhdGVFbmNvZGVyQnVmZmVyID0gZnVuY3Rpb24gY3JlYXRlRW5jb2RlckJ1ZmZlcihkYXRhKSB7XG4gIHJldHVybiBuZXcgRW5jb2RlckJ1ZmZlcihkYXRhLCB0aGlzLnJlcG9ydGVyKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoZGF0YSwgcmVwb3J0ZXIsIHBhcmVudCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIGlmIChzdGF0ZVsnZGVmYXVsdCddICE9PSBudWxsICYmIHN0YXRlWydkZWZhdWx0J10gPT09IGRhdGEpXG4gICAgcmV0dXJuO1xuXG4gIHZhciByZXN1bHQgPSB0aGlzLl9lbmNvZGVWYWx1ZShkYXRhLCByZXBvcnRlciwgcGFyZW50KTtcbiAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybjtcblxuICBpZiAodGhpcy5fc2tpcERlZmF1bHQocmVzdWx0LCByZXBvcnRlciwgcGFyZW50KSlcbiAgICByZXR1cm47XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9lbmNvZGVWYWx1ZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCByZXBvcnRlciwgcGFyZW50KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICAvLyBEZWNvZGUgcm9vdCBub2RlXG4gIGlmIChzdGF0ZS5wYXJlbnQgPT09IG51bGwpXG4gICAgcmV0dXJuIHN0YXRlLmNoaWxkcmVuWzBdLl9lbmNvZGUoZGF0YSwgcmVwb3J0ZXIgfHwgbmV3IFJlcG9ydGVyKCkpO1xuXG4gIHZhciByZXN1bHQgPSBudWxsO1xuXG4gIC8vIFNldCByZXBvcnRlciB0byBzaGFyZSBpdCB3aXRoIGEgY2hpbGQgY2xhc3NcbiAgdGhpcy5yZXBvcnRlciA9IHJlcG9ydGVyO1xuXG4gIC8vIENoZWNrIGlmIGRhdGEgaXMgdGhlcmVcbiAgaWYgKHN0YXRlLm9wdGlvbmFsICYmIGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzdGF0ZVsnZGVmYXVsdCddICE9PSBudWxsKVxuICAgICAgZGF0YSA9IHN0YXRlWydkZWZhdWx0J11cbiAgICBlbHNlXG4gICAgICByZXR1cm47XG4gIH1cblxuICAvLyBFbmNvZGUgY2hpbGRyZW4gZmlyc3RcbiAgdmFyIGNvbnRlbnQgPSBudWxsO1xuICB2YXIgcHJpbWl0aXZlID0gZmFsc2U7XG4gIGlmIChzdGF0ZS5hbnkpIHtcbiAgICAvLyBBbnl0aGluZyB0aGF0IHdhcyBnaXZlbiBpcyB0cmFuc2xhdGVkIHRvIGJ1ZmZlclxuICAgIHJlc3VsdCA9IHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoZGF0YSk7XG4gIH0gZWxzZSBpZiAoc3RhdGUuY2hvaWNlKSB7XG4gICAgcmVzdWx0ID0gdGhpcy5fZW5jb2RlQ2hvaWNlKGRhdGEsIHJlcG9ydGVyKTtcbiAgfSBlbHNlIGlmIChzdGF0ZS5jb250YWlucykge1xuICAgIGNvbnRlbnQgPSB0aGlzLl9nZXRVc2Uoc3RhdGUuY29udGFpbnMsIHBhcmVudCkuX2VuY29kZShkYXRhLCByZXBvcnRlcik7XG4gICAgcHJpbWl0aXZlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChzdGF0ZS5jaGlsZHJlbikge1xuICAgIGNvbnRlbnQgPSBzdGF0ZS5jaGlsZHJlbi5tYXAoZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGlmIChjaGlsZC5fYmFzZVN0YXRlLnRhZyA9PT0gJ251bGxfJylcbiAgICAgICAgcmV0dXJuIGNoaWxkLl9lbmNvZGUobnVsbCwgcmVwb3J0ZXIsIGRhdGEpO1xuXG4gICAgICBpZiAoY2hpbGQuX2Jhc2VTdGF0ZS5rZXkgPT09IG51bGwpXG4gICAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignQ2hpbGQgc2hvdWxkIGhhdmUgYSBrZXknKTtcbiAgICAgIHZhciBwcmV2S2V5ID0gcmVwb3J0ZXIuZW50ZXJLZXkoY2hpbGQuX2Jhc2VTdGF0ZS5rZXkpO1xuXG4gICAgICBpZiAodHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKVxuICAgICAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ0NoaWxkIGV4cGVjdGVkLCBidXQgaW5wdXQgaXMgbm90IG9iamVjdCcpO1xuXG4gICAgICB2YXIgcmVzID0gY2hpbGQuX2VuY29kZShkYXRhW2NoaWxkLl9iYXNlU3RhdGUua2V5XSwgcmVwb3J0ZXIsIGRhdGEpO1xuICAgICAgcmVwb3J0ZXIubGVhdmVLZXkocHJldktleSk7XG5cbiAgICAgIHJldHVybiByZXM7XG4gICAgfSwgdGhpcykuZmlsdGVyKGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfSk7XG4gICAgY29udGVudCA9IHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoY29udGVudCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHN0YXRlLnRhZyA9PT0gJ3NlcW9mJyB8fCBzdGF0ZS50YWcgPT09ICdzZXRvZicpIHtcbiAgICAgIC8vIFRPRE8oaW5kdXRueSk6IHRoaXMgc2hvdWxkIGJlIHRocm93biBvbiBEU0wgbGV2ZWxcbiAgICAgIGlmICghKHN0YXRlLmFyZ3MgJiYgc3RhdGUuYXJncy5sZW5ndGggPT09IDEpKVxuICAgICAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ1RvbyBtYW55IGFyZ3MgZm9yIDogJyArIHN0YXRlLnRhZyk7XG5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSlcbiAgICAgICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdzZXFvZi9zZXRvZiwgYnV0IGRhdGEgaXMgbm90IEFycmF5Jyk7XG5cbiAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgIGNoaWxkLl9iYXNlU3RhdGUuaW1wbGljaXQgPSBudWxsO1xuICAgICAgY29udGVudCA9IHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoZGF0YS5tYXAoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFVzZShzdGF0ZS5hcmdzWzBdLCBkYXRhKS5fZW5jb2RlKGl0ZW0sIHJlcG9ydGVyKTtcbiAgICAgIH0sIGNoaWxkKSk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS51c2UgIT09IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2dldFVzZShzdGF0ZS51c2UsIHBhcmVudCkuX2VuY29kZShkYXRhLCByZXBvcnRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnQgPSB0aGlzLl9lbmNvZGVQcmltaXRpdmUoc3RhdGUudGFnLCBkYXRhKTtcbiAgICAgIHByaW1pdGl2ZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gRW5jb2RlIGRhdGEgaXRzZWxmXG4gIHZhciByZXN1bHQ7XG4gIGlmICghc3RhdGUuYW55ICYmIHN0YXRlLmNob2ljZSA9PT0gbnVsbCkge1xuICAgIHZhciB0YWcgPSBzdGF0ZS5pbXBsaWNpdCAhPT0gbnVsbCA/IHN0YXRlLmltcGxpY2l0IDogc3RhdGUudGFnO1xuICAgIHZhciBjbHMgPSBzdGF0ZS5pbXBsaWNpdCA9PT0gbnVsbCA/ICd1bml2ZXJzYWwnIDogJ2NvbnRleHQnO1xuXG4gICAgaWYgKHRhZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKHN0YXRlLnVzZSA9PT0gbnVsbClcbiAgICAgICAgcmVwb3J0ZXIuZXJyb3IoJ1RhZyBjb3VsZCBiZSBvbWl0dGVkIG9ubHkgZm9yIC51c2UoKScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhdGUudXNlID09PSBudWxsKVxuICAgICAgICByZXN1bHQgPSB0aGlzLl9lbmNvZGVDb21wb3NpdGUodGFnLCBwcmltaXRpdmUsIGNscywgY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgLy8gV3JhcCBpbiBleHBsaWNpdFxuICBpZiAoc3RhdGUuZXhwbGljaXQgIT09IG51bGwpXG4gICAgcmVzdWx0ID0gdGhpcy5fZW5jb2RlQ29tcG9zaXRlKHN0YXRlLmV4cGxpY2l0LCBmYWxzZSwgJ2NvbnRleHQnLCByZXN1bHQpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZW5jb2RlQ2hvaWNlID0gZnVuY3Rpb24gZW5jb2RlQ2hvaWNlKGRhdGEsIHJlcG9ydGVyKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICB2YXIgbm9kZSA9IHN0YXRlLmNob2ljZVtkYXRhLnR5cGVdO1xuICBpZiAoIW5vZGUpIHtcbiAgICBhc3NlcnQoXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBkYXRhLnR5cGUgKyAnIG5vdCBmb3VuZCBpbiAnICtcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKHN0YXRlLmNob2ljZSkpKTtcbiAgfVxuICByZXR1cm4gbm9kZS5fZW5jb2RlKGRhdGEudmFsdWUsIHJlcG9ydGVyKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9lbmNvZGVQcmltaXRpdmUgPSBmdW5jdGlvbiBlbmNvZGVQcmltaXRpdmUodGFnLCBkYXRhKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBpZiAoL3N0ciQvLnRlc3QodGFnKSlcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlU3RyKGRhdGEsIHRhZyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iamlkJyAmJiBzdGF0ZS5hcmdzKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVPYmppZChkYXRhLCBzdGF0ZS5yZXZlcnNlQXJnc1swXSwgc3RhdGUuYXJnc1sxXSk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iamlkJylcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlT2JqaWQoZGF0YSwgbnVsbCwgbnVsbCk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2dlbnRpbWUnIHx8IHRhZyA9PT0gJ3V0Y3RpbWUnKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVUaW1lKGRhdGEsIHRhZyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ251bGxfJylcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlTnVsbCgpO1xuICBlbHNlIGlmICh0YWcgPT09ICdpbnQnIHx8IHRhZyA9PT0gJ2VudW0nKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVJbnQoZGF0YSwgc3RhdGUuYXJncyAmJiBzdGF0ZS5yZXZlcnNlQXJnc1swXSk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2Jvb2wnKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVCb29sKGRhdGEpO1xuICBlbHNlIGlmICh0YWcgPT09ICdvYmpEZXNjJylcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlU3RyKGRhdGEsIHRhZyk7XG4gIGVsc2VcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIHRhZzogJyArIHRhZyk7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5faXNOdW1zdHIgPSBmdW5jdGlvbiBpc051bXN0cihzdHIpIHtcbiAgcmV0dXJuIC9eWzAtOSBdKiQvLnRlc3Qoc3RyKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9pc1ByaW50c3RyID0gZnVuY3Rpb24gaXNQcmludHN0cihzdHIpIHtcbiAgcmV0dXJuIC9eW0EtWmEtejAtOSAnXFwoXFwpXFwrLFxcLVxcLlxcLzo9XFw/XSokLy50ZXN0KHN0cik7XG59O1xuIiwidmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuZnVuY3Rpb24gUmVwb3J0ZXIob3B0aW9ucykge1xuICB0aGlzLl9yZXBvcnRlclN0YXRlID0ge1xuICAgIG9iajogbnVsbCxcbiAgICBwYXRoOiBbXSxcbiAgICBvcHRpb25zOiBvcHRpb25zIHx8IHt9LFxuICAgIGVycm9yczogW11cbiAgfTtcbn1cbmV4cG9ydHMuUmVwb3J0ZXIgPSBSZXBvcnRlcjtcblxuUmVwb3J0ZXIucHJvdG90eXBlLmlzRXJyb3IgPSBmdW5jdGlvbiBpc0Vycm9yKG9iaikge1xuICByZXR1cm4gb2JqIGluc3RhbmNlb2YgUmVwb3J0ZXJFcnJvcjtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5zYXZlID0gZnVuY3Rpb24gc2F2ZSgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICByZXR1cm4geyBvYmo6IHN0YXRlLm9iaiwgcGF0aExlbjogc3RhdGUucGF0aC5sZW5ndGggfTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5yZXN0b3JlID0gZnVuY3Rpb24gcmVzdG9yZShkYXRhKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgc3RhdGUub2JqID0gZGF0YS5vYmo7XG4gIHN0YXRlLnBhdGggPSBzdGF0ZS5wYXRoLnNsaWNlKDAsIGRhdGEucGF0aExlbik7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUuZW50ZXJLZXkgPSBmdW5jdGlvbiBlbnRlcktleShrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX3JlcG9ydGVyU3RhdGUucGF0aC5wdXNoKGtleSk7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUuZXhpdEtleSA9IGZ1bmN0aW9uIGV4aXRLZXkoaW5kZXgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICBzdGF0ZS5wYXRoID0gc3RhdGUucGF0aC5zbGljZSgwLCBpbmRleCAtIDEpO1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLmxlYXZlS2V5ID0gZnVuY3Rpb24gbGVhdmVLZXkoaW5kZXgsIGtleSwgdmFsdWUpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICB0aGlzLmV4aXRLZXkoaW5kZXgpO1xuICBpZiAoc3RhdGUub2JqICE9PSBudWxsKVxuICAgIHN0YXRlLm9ialtrZXldID0gdmFsdWU7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUucGF0aCA9IGZ1bmN0aW9uIHBhdGgoKSB7XG4gIHJldHVybiB0aGlzLl9yZXBvcnRlclN0YXRlLnBhdGguam9pbignLycpO1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLmVudGVyT2JqZWN0ID0gZnVuY3Rpb24gZW50ZXJPYmplY3QoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgdmFyIHByZXYgPSBzdGF0ZS5vYmo7XG4gIHN0YXRlLm9iaiA9IHt9O1xuICByZXR1cm4gcHJldjtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5sZWF2ZU9iamVjdCA9IGZ1bmN0aW9uIGxlYXZlT2JqZWN0KHByZXYpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICB2YXIgbm93ID0gc3RhdGUub2JqO1xuICBzdGF0ZS5vYmogPSBwcmV2O1xuICByZXR1cm4gbm93O1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gZXJyb3IobXNnKSB7XG4gIHZhciBlcnI7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgdmFyIGluaGVyaXRlZCA9IG1zZyBpbnN0YW5jZW9mIFJlcG9ydGVyRXJyb3I7XG4gIGlmIChpbmhlcml0ZWQpIHtcbiAgICBlcnIgPSBtc2c7XG4gIH0gZWxzZSB7XG4gICAgZXJyID0gbmV3IFJlcG9ydGVyRXJyb3Ioc3RhdGUucGF0aC5tYXAoZnVuY3Rpb24oZWxlbSkge1xuICAgICAgcmV0dXJuICdbJyArIEpTT04uc3RyaW5naWZ5KGVsZW0pICsgJ10nO1xuICAgIH0pLmpvaW4oJycpLCBtc2cubWVzc2FnZSB8fCBtc2csIG1zZy5zdGFjayk7XG4gIH1cblxuICBpZiAoIXN0YXRlLm9wdGlvbnMucGFydGlhbClcbiAgICB0aHJvdyBlcnI7XG5cbiAgaWYgKCFpbmhlcml0ZWQpXG4gICAgc3RhdGUuZXJyb3JzLnB1c2goZXJyKTtcblxuICByZXR1cm4gZXJyO1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLndyYXBSZXN1bHQgPSBmdW5jdGlvbiB3cmFwUmVzdWx0KHJlc3VsdCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuICBpZiAoIXN0YXRlLm9wdGlvbnMucGFydGlhbClcbiAgICByZXR1cm4gcmVzdWx0O1xuXG4gIHJldHVybiB7XG4gICAgcmVzdWx0OiB0aGlzLmlzRXJyb3IocmVzdWx0KSA/IG51bGwgOiByZXN1bHQsXG4gICAgZXJyb3JzOiBzdGF0ZS5lcnJvcnNcbiAgfTtcbn07XG5cbmZ1bmN0aW9uIFJlcG9ydGVyRXJyb3IocGF0aCwgbXNnKSB7XG4gIHRoaXMucGF0aCA9IHBhdGg7XG4gIHRoaXMucmV0aHJvdyhtc2cpO1xufTtcbmluaGVyaXRzKFJlcG9ydGVyRXJyb3IsIEVycm9yKTtcblxuUmVwb3J0ZXJFcnJvci5wcm90b3R5cGUucmV0aHJvdyA9IGZ1bmN0aW9uIHJldGhyb3cobXNnKSB7XG4gIHRoaXMubWVzc2FnZSA9IG1zZyArICcgYXQ6ICcgKyAodGhpcy5wYXRoIHx8ICcoc2hhbGxvdyknKTtcbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFJlcG9ydGVyRXJyb3IpO1xuXG4gIGlmICghdGhpcy5zdGFjaykge1xuICAgIHRyeSB7XG4gICAgICAvLyBJRSBvbmx5IGFkZHMgc3RhY2sgd2hlbiB0aHJvd25cbiAgICAgIHRocm93IG5ldyBFcnJvcih0aGlzLm1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuc3RhY2sgPSBlLnN0YWNrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG4iLCJ2YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi4vY29uc3RhbnRzJyk7XG5cbmV4cG9ydHMudGFnQ2xhc3MgPSB7XG4gIDA6ICd1bml2ZXJzYWwnLFxuICAxOiAnYXBwbGljYXRpb24nLFxuICAyOiAnY29udGV4dCcsXG4gIDM6ICdwcml2YXRlJ1xufTtcbmV4cG9ydHMudGFnQ2xhc3NCeU5hbWUgPSBjb25zdGFudHMuX3JldmVyc2UoZXhwb3J0cy50YWdDbGFzcyk7XG5cbmV4cG9ydHMudGFnID0ge1xuICAweDAwOiAnZW5kJyxcbiAgMHgwMTogJ2Jvb2wnLFxuICAweDAyOiAnaW50JyxcbiAgMHgwMzogJ2JpdHN0cicsXG4gIDB4MDQ6ICdvY3RzdHInLFxuICAweDA1OiAnbnVsbF8nLFxuICAweDA2OiAnb2JqaWQnLFxuICAweDA3OiAnb2JqRGVzYycsXG4gIDB4MDg6ICdleHRlcm5hbCcsXG4gIDB4MDk6ICdyZWFsJyxcbiAgMHgwYTogJ2VudW0nLFxuICAweDBiOiAnZW1iZWQnLFxuICAweDBjOiAndXRmOHN0cicsXG4gIDB4MGQ6ICdyZWxhdGl2ZU9pZCcsXG4gIDB4MTA6ICdzZXEnLFxuICAweDExOiAnc2V0JyxcbiAgMHgxMjogJ251bXN0cicsXG4gIDB4MTM6ICdwcmludHN0cicsXG4gIDB4MTQ6ICd0NjFzdHInLFxuICAweDE1OiAndmlkZW9zdHInLFxuICAweDE2OiAnaWE1c3RyJyxcbiAgMHgxNzogJ3V0Y3RpbWUnLFxuICAweDE4OiAnZ2VudGltZScsXG4gIDB4MTk6ICdncmFwaHN0cicsXG4gIDB4MWE6ICdpc282NDZzdHInLFxuICAweDFiOiAnZ2Vuc3RyJyxcbiAgMHgxYzogJ3VuaXN0cicsXG4gIDB4MWQ6ICdjaGFyc3RyJyxcbiAgMHgxZTogJ2JtcHN0cidcbn07XG5leHBvcnRzLnRhZ0J5TmFtZSA9IGNvbnN0YW50cy5fcmV2ZXJzZShleHBvcnRzLnRhZyk7XG4iLCJ2YXIgY29uc3RhbnRzID0gZXhwb3J0cztcblxuLy8gSGVscGVyXG5jb25zdGFudHMuX3JldmVyc2UgPSBmdW5jdGlvbiByZXZlcnNlKG1hcCkge1xuICB2YXIgcmVzID0ge307XG5cbiAgT2JqZWN0LmtleXMobWFwKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIC8vIENvbnZlcnQga2V5IHRvIGludGVnZXIgaWYgaXQgaXMgc3RyaW5naWZpZWRcbiAgICBpZiAoKGtleSB8IDApID09IGtleSlcbiAgICAgIGtleSA9IGtleSB8IDA7XG5cbiAgICB2YXIgdmFsdWUgPSBtYXBba2V5XTtcbiAgICByZXNbdmFsdWVdID0ga2V5O1xuICB9KTtcblxuICByZXR1cm4gcmVzO1xufTtcblxuY29uc3RhbnRzLmRlciA9IHJlcXVpcmUoJy4vZGVyJyk7XG4iLCJ2YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG52YXIgYXNuMSA9IHJlcXVpcmUoJy4uLy4uL2FzbjEnKTtcbnZhciBiYXNlID0gYXNuMS5iYXNlO1xudmFyIGJpZ251bSA9IGFzbjEuYmlnbnVtO1xuXG4vLyBJbXBvcnQgREVSIGNvbnN0YW50c1xudmFyIGRlciA9IGFzbjEuY29uc3RhbnRzLmRlcjtcblxuZnVuY3Rpb24gREVSRGVjb2RlcihlbnRpdHkpIHtcbiAgdGhpcy5lbmMgPSAnZGVyJztcbiAgdGhpcy5uYW1lID0gZW50aXR5Lm5hbWU7XG4gIHRoaXMuZW50aXR5ID0gZW50aXR5O1xuXG4gIC8vIENvbnN0cnVjdCBiYXNlIHRyZWVcbiAgdGhpcy50cmVlID0gbmV3IERFUk5vZGUoKTtcbiAgdGhpcy50cmVlLl9pbml0KGVudGl0eS5ib2R5KTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IERFUkRlY29kZXI7XG5cbkRFUkRlY29kZXIucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShkYXRhLCBvcHRpb25zKSB7XG4gIGlmICghKGRhdGEgaW5zdGFuY2VvZiBiYXNlLkRlY29kZXJCdWZmZXIpKVxuICAgIGRhdGEgPSBuZXcgYmFzZS5EZWNvZGVyQnVmZmVyKGRhdGEsIG9wdGlvbnMpO1xuXG4gIHJldHVybiB0aGlzLnRyZWUuX2RlY29kZShkYXRhLCBvcHRpb25zKTtcbn07XG5cbi8vIFRyZWUgbWV0aG9kc1xuXG5mdW5jdGlvbiBERVJOb2RlKHBhcmVudCkge1xuICBiYXNlLk5vZGUuY2FsbCh0aGlzLCAnZGVyJywgcGFyZW50KTtcbn1cbmluaGVyaXRzKERFUk5vZGUsIGJhc2UuTm9kZSk7XG5cbkRFUk5vZGUucHJvdG90eXBlLl9wZWVrVGFnID0gZnVuY3Rpb24gcGVla1RhZyhidWZmZXIsIHRhZywgYW55KSB7XG4gIGlmIChidWZmZXIuaXNFbXB0eSgpKVxuICAgIHJldHVybiBmYWxzZTtcblxuICB2YXIgc3RhdGUgPSBidWZmZXIuc2F2ZSgpO1xuICB2YXIgZGVjb2RlZFRhZyA9IGRlckRlY29kZVRhZyhidWZmZXIsICdGYWlsZWQgdG8gcGVlayB0YWc6IFwiJyArIHRhZyArICdcIicpO1xuICBpZiAoYnVmZmVyLmlzRXJyb3IoZGVjb2RlZFRhZykpXG4gICAgcmV0dXJuIGRlY29kZWRUYWc7XG5cbiAgYnVmZmVyLnJlc3RvcmUoc3RhdGUpO1xuXG4gIHJldHVybiBkZWNvZGVkVGFnLnRhZyA9PT0gdGFnIHx8IGRlY29kZWRUYWcudGFnU3RyID09PSB0YWcgfHxcbiAgICAoZGVjb2RlZFRhZy50YWdTdHIgKyAnb2YnKSA9PT0gdGFnIHx8IGFueTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVUYWcgPSBmdW5jdGlvbiBkZWNvZGVUYWcoYnVmZmVyLCB0YWcsIGFueSkge1xuICB2YXIgZGVjb2RlZFRhZyA9IGRlckRlY29kZVRhZyhidWZmZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGYWlsZWQgdG8gZGVjb2RlIHRhZyBvZiBcIicgKyB0YWcgKyAnXCInKTtcbiAgaWYgKGJ1ZmZlci5pc0Vycm9yKGRlY29kZWRUYWcpKVxuICAgIHJldHVybiBkZWNvZGVkVGFnO1xuXG4gIHZhciBsZW4gPSBkZXJEZWNvZGVMZW4oYnVmZmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRUYWcucHJpbWl0aXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICdGYWlsZWQgdG8gZ2V0IGxlbmd0aCBvZiBcIicgKyB0YWcgKyAnXCInKTtcblxuICAvLyBGYWlsdXJlXG4gIGlmIChidWZmZXIuaXNFcnJvcihsZW4pKVxuICAgIHJldHVybiBsZW47XG5cbiAgaWYgKCFhbnkgJiZcbiAgICAgIGRlY29kZWRUYWcudGFnICE9PSB0YWcgJiZcbiAgICAgIGRlY29kZWRUYWcudGFnU3RyICE9PSB0YWcgJiZcbiAgICAgIGRlY29kZWRUYWcudGFnU3RyICsgJ29mJyAhPT0gdGFnKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5lcnJvcignRmFpbGVkIHRvIG1hdGNoIHRhZzogXCInICsgdGFnICsgJ1wiJyk7XG4gIH1cblxuICBpZiAoZGVjb2RlZFRhZy5wcmltaXRpdmUgfHwgbGVuICE9PSBudWxsKVxuICAgIHJldHVybiBidWZmZXIuc2tpcChsZW4sICdGYWlsZWQgdG8gbWF0Y2ggYm9keSBvZjogXCInICsgdGFnICsgJ1wiJyk7XG5cbiAgLy8gSW5kZWZpbml0ZSBsZW5ndGguLi4gZmluZCBFTkQgdGFnXG4gIHZhciBzdGF0ZSA9IGJ1ZmZlci5zYXZlKCk7XG4gIHZhciByZXMgPSB0aGlzLl9za2lwVW50aWxFbmQoXG4gICAgICBidWZmZXIsXG4gICAgICAnRmFpbGVkIHRvIHNraXAgaW5kZWZpbml0ZSBsZW5ndGggYm9keTogXCInICsgdGhpcy50YWcgKyAnXCInKTtcbiAgaWYgKGJ1ZmZlci5pc0Vycm9yKHJlcykpXG4gICAgcmV0dXJuIHJlcztcblxuICBsZW4gPSBidWZmZXIub2Zmc2V0IC0gc3RhdGUub2Zmc2V0O1xuICBidWZmZXIucmVzdG9yZShzdGF0ZSk7XG4gIHJldHVybiBidWZmZXIuc2tpcChsZW4sICdGYWlsZWQgdG8gbWF0Y2ggYm9keSBvZjogXCInICsgdGFnICsgJ1wiJyk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fc2tpcFVudGlsRW5kID0gZnVuY3Rpb24gc2tpcFVudGlsRW5kKGJ1ZmZlciwgZmFpbCkge1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciB0YWcgPSBkZXJEZWNvZGVUYWcoYnVmZmVyLCBmYWlsKTtcbiAgICBpZiAoYnVmZmVyLmlzRXJyb3IodGFnKSlcbiAgICAgIHJldHVybiB0YWc7XG4gICAgdmFyIGxlbiA9IGRlckRlY29kZUxlbihidWZmZXIsIHRhZy5wcmltaXRpdmUsIGZhaWwpO1xuICAgIGlmIChidWZmZXIuaXNFcnJvcihsZW4pKVxuICAgICAgcmV0dXJuIGxlbjtcblxuICAgIHZhciByZXM7XG4gICAgaWYgKHRhZy5wcmltaXRpdmUgfHwgbGVuICE9PSBudWxsKVxuICAgICAgcmVzID0gYnVmZmVyLnNraXAobGVuKVxuICAgIGVsc2VcbiAgICAgIHJlcyA9IHRoaXMuX3NraXBVbnRpbEVuZChidWZmZXIsIGZhaWwpO1xuXG4gICAgLy8gRmFpbHVyZVxuICAgIGlmIChidWZmZXIuaXNFcnJvcihyZXMpKVxuICAgICAgcmV0dXJuIHJlcztcblxuICAgIGlmICh0YWcudGFnU3RyID09PSAnZW5kJylcbiAgICAgIGJyZWFrO1xuICB9XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlTGlzdCA9IGZ1bmN0aW9uIGRlY29kZUxpc3QoYnVmZmVyLCB0YWcsIGRlY29kZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucykge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHdoaWxlICghYnVmZmVyLmlzRW1wdHkoKSkge1xuICAgIHZhciBwb3NzaWJsZUVuZCA9IHRoaXMuX3BlZWtUYWcoYnVmZmVyLCAnZW5kJyk7XG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKHBvc3NpYmxlRW5kKSlcbiAgICAgIHJldHVybiBwb3NzaWJsZUVuZDtcblxuICAgIHZhciByZXMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIsICdkZXInLCBvcHRpb25zKTtcbiAgICBpZiAoYnVmZmVyLmlzRXJyb3IocmVzKSAmJiBwb3NzaWJsZUVuZClcbiAgICAgIGJyZWFrO1xuICAgIHJlc3VsdC5wdXNoKHJlcyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVTdHIgPSBmdW5jdGlvbiBkZWNvZGVTdHIoYnVmZmVyLCB0YWcpIHtcbiAgaWYgKHRhZyA9PT0gJ2JpdHN0cicpIHtcbiAgICB2YXIgdW51c2VkID0gYnVmZmVyLnJlYWRVSW50OCgpO1xuICAgIGlmIChidWZmZXIuaXNFcnJvcih1bnVzZWQpKVxuICAgICAgcmV0dXJuIHVudXNlZDtcbiAgICByZXR1cm4geyB1bnVzZWQ6IHVudXNlZCwgZGF0YTogYnVmZmVyLnJhdygpIH07XG4gIH0gZWxzZSBpZiAodGFnID09PSAnYm1wc3RyJykge1xuICAgIHZhciByYXcgPSBidWZmZXIucmF3KCk7XG4gICAgaWYgKHJhdy5sZW5ndGggJSAyID09PSAxKVxuICAgICAgcmV0dXJuIGJ1ZmZlci5lcnJvcignRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IGJtcHN0ciBsZW5ndGggbWlzbWF0Y2gnKTtcblxuICAgIHZhciBzdHIgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhdy5sZW5ndGggLyAyOyBpKyspIHtcbiAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHJhdy5yZWFkVUludDE2QkUoaSAqIDIpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdudW1zdHInKSB7XG4gICAgdmFyIG51bXN0ciA9IGJ1ZmZlci5yYXcoKS50b1N0cmluZygnYXNjaWknKTtcbiAgICBpZiAoIXRoaXMuX2lzTnVtc3RyKG51bXN0cikpIHtcbiAgICAgIHJldHVybiBidWZmZXIuZXJyb3IoJ0RlY29kaW5nIG9mIHN0cmluZyB0eXBlOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ251bXN0ciB1bnN1cHBvcnRlZCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICAgIHJldHVybiBudW1zdHI7XG4gIH0gZWxzZSBpZiAodGFnID09PSAnb2N0c3RyJykge1xuICAgIHJldHVybiBidWZmZXIucmF3KCk7XG4gIH0gZWxzZSBpZiAodGFnID09PSAnb2JqRGVzYycpIHtcbiAgICByZXR1cm4gYnVmZmVyLnJhdygpO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ3ByaW50c3RyJykge1xuICAgIHZhciBwcmludHN0ciA9IGJ1ZmZlci5yYXcoKS50b1N0cmluZygnYXNjaWknKTtcbiAgICBpZiAoIXRoaXMuX2lzUHJpbnRzdHIocHJpbnRzdHIpKSB7XG4gICAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyBvZiBzdHJpbmcgdHlwZTogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdwcmludHN0ciB1bnN1cHBvcnRlZCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICAgIHJldHVybiBwcmludHN0cjtcbiAgfSBlbHNlIGlmICgvc3RyJC8udGVzdCh0YWcpKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5yYXcoKS50b1N0cmluZygpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBidWZmZXIuZXJyb3IoJ0RlY29kaW5nIG9mIHN0cmluZyB0eXBlOiAnICsgdGFnICsgJyB1bnN1cHBvcnRlZCcpO1xuICB9XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlT2JqaWQgPSBmdW5jdGlvbiBkZWNvZGVPYmppZChidWZmZXIsIHZhbHVlcywgcmVsYXRpdmUpIHtcbiAgdmFyIHJlc3VsdDtcbiAgdmFyIGlkZW50aWZpZXJzID0gW107XG4gIHZhciBpZGVudCA9IDA7XG4gIHdoaWxlICghYnVmZmVyLmlzRW1wdHkoKSkge1xuICAgIHZhciBzdWJpZGVudCA9IGJ1ZmZlci5yZWFkVUludDgoKTtcbiAgICBpZGVudCA8PD0gNztcbiAgICBpZGVudCB8PSBzdWJpZGVudCAmIDB4N2Y7XG4gICAgaWYgKChzdWJpZGVudCAmIDB4ODApID09PSAwKSB7XG4gICAgICBpZGVudGlmaWVycy5wdXNoKGlkZW50KTtcbiAgICAgIGlkZW50ID0gMDtcbiAgICB9XG4gIH1cbiAgaWYgKHN1YmlkZW50ICYgMHg4MClcbiAgICBpZGVudGlmaWVycy5wdXNoKGlkZW50KTtcblxuICB2YXIgZmlyc3QgPSAoaWRlbnRpZmllcnNbMF0gLyA0MCkgfCAwO1xuICB2YXIgc2Vjb25kID0gaWRlbnRpZmllcnNbMF0gJSA0MDtcblxuICBpZiAocmVsYXRpdmUpXG4gICAgcmVzdWx0ID0gaWRlbnRpZmllcnM7XG4gIGVsc2VcbiAgICByZXN1bHQgPSBbZmlyc3QsIHNlY29uZF0uY29uY2F0KGlkZW50aWZpZXJzLnNsaWNlKDEpKTtcblxuICBpZiAodmFsdWVzKSB7XG4gICAgdmFyIHRtcCA9IHZhbHVlc1tyZXN1bHQuam9pbignICcpXTtcbiAgICBpZiAodG1wID09PSB1bmRlZmluZWQpXG4gICAgICB0bXAgPSB2YWx1ZXNbcmVzdWx0LmpvaW4oJy4nKV07XG4gICAgaWYgKHRtcCAhPT0gdW5kZWZpbmVkKVxuICAgICAgcmVzdWx0ID0gdG1wO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVUaW1lID0gZnVuY3Rpb24gZGVjb2RlVGltZShidWZmZXIsIHRhZykge1xuICB2YXIgc3RyID0gYnVmZmVyLnJhdygpLnRvU3RyaW5nKCk7XG4gIGlmICh0YWcgPT09ICdnZW50aW1lJykge1xuICAgIHZhciB5ZWFyID0gc3RyLnNsaWNlKDAsIDQpIHwgMDtcbiAgICB2YXIgbW9uID0gc3RyLnNsaWNlKDQsIDYpIHwgMDtcbiAgICB2YXIgZGF5ID0gc3RyLnNsaWNlKDYsIDgpIHwgMDtcbiAgICB2YXIgaG91ciA9IHN0ci5zbGljZSg4LCAxMCkgfCAwO1xuICAgIHZhciBtaW4gPSBzdHIuc2xpY2UoMTAsIDEyKSB8IDA7XG4gICAgdmFyIHNlYyA9IHN0ci5zbGljZSgxMiwgMTQpIHwgMDtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICd1dGN0aW1lJykge1xuICAgIHZhciB5ZWFyID0gc3RyLnNsaWNlKDAsIDIpIHwgMDtcbiAgICB2YXIgbW9uID0gc3RyLnNsaWNlKDIsIDQpIHwgMDtcbiAgICB2YXIgZGF5ID0gc3RyLnNsaWNlKDQsIDYpIHwgMDtcbiAgICB2YXIgaG91ciA9IHN0ci5zbGljZSg2LCA4KSB8IDA7XG4gICAgdmFyIG1pbiA9IHN0ci5zbGljZSg4LCAxMCkgfCAwO1xuICAgIHZhciBzZWMgPSBzdHIuc2xpY2UoMTAsIDEyKSB8IDA7XG4gICAgaWYgKHllYXIgPCA3MClcbiAgICAgIHllYXIgPSAyMDAwICsgeWVhcjtcbiAgICBlbHNlXG4gICAgICB5ZWFyID0gMTkwMCArIHllYXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5lcnJvcignRGVjb2RpbmcgJyArIHRhZyArICcgdGltZSBpcyBub3Qgc3VwcG9ydGVkIHlldCcpO1xuICB9XG5cbiAgcmV0dXJuIERhdGUuVVRDKHllYXIsIG1vbiAtIDEsIGRheSwgaG91ciwgbWluLCBzZWMsIDApO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZU51bGwgPSBmdW5jdGlvbiBkZWNvZGVOdWxsKGJ1ZmZlcikge1xuICByZXR1cm4gbnVsbDtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVCb29sID0gZnVuY3Rpb24gZGVjb2RlQm9vbChidWZmZXIpIHtcbiAgdmFyIHJlcyA9IGJ1ZmZlci5yZWFkVUludDgoKTtcbiAgaWYgKGJ1ZmZlci5pc0Vycm9yKHJlcykpXG4gICAgcmV0dXJuIHJlcztcbiAgZWxzZVxuICAgIHJldHVybiByZXMgIT09IDA7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlSW50ID0gZnVuY3Rpb24gZGVjb2RlSW50KGJ1ZmZlciwgdmFsdWVzKSB7XG4gIC8vIEJpZ2ludCwgcmV0dXJuIGFzIGl0IGlzIChhc3N1bWUgYmlnIGVuZGlhbilcbiAgdmFyIHJhdyA9IGJ1ZmZlci5yYXcoKTtcbiAgdmFyIHJlcyA9IG5ldyBiaWdudW0ocmF3KTtcblxuICBpZiAodmFsdWVzKVxuICAgIHJlcyA9IHZhbHVlc1tyZXMudG9TdHJpbmcoMTApXSB8fCByZXM7XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl91c2UgPSBmdW5jdGlvbiB1c2UoZW50aXR5LCBvYmopIHtcbiAgaWYgKHR5cGVvZiBlbnRpdHkgPT09ICdmdW5jdGlvbicpXG4gICAgZW50aXR5ID0gZW50aXR5KG9iaik7XG4gIHJldHVybiBlbnRpdHkuX2dldERlY29kZXIoJ2RlcicpLnRyZWU7XG59O1xuXG4vLyBVdGlsaXR5IG1ldGhvZHNcblxuZnVuY3Rpb24gZGVyRGVjb2RlVGFnKGJ1ZiwgZmFpbCkge1xuICB2YXIgdGFnID0gYnVmLnJlYWRVSW50OChmYWlsKTtcbiAgaWYgKGJ1Zi5pc0Vycm9yKHRhZykpXG4gICAgcmV0dXJuIHRhZztcblxuICB2YXIgY2xzID0gZGVyLnRhZ0NsYXNzW3RhZyA+PiA2XTtcbiAgdmFyIHByaW1pdGl2ZSA9ICh0YWcgJiAweDIwKSA9PT0gMDtcblxuICAvLyBNdWx0aS1vY3RldCB0YWcgLSBsb2FkXG4gIGlmICgodGFnICYgMHgxZikgPT09IDB4MWYpIHtcbiAgICB2YXIgb2N0ID0gdGFnO1xuICAgIHRhZyA9IDA7XG4gICAgd2hpbGUgKChvY3QgJiAweDgwKSA9PT0gMHg4MCkge1xuICAgICAgb2N0ID0gYnVmLnJlYWRVSW50OChmYWlsKTtcbiAgICAgIGlmIChidWYuaXNFcnJvcihvY3QpKVxuICAgICAgICByZXR1cm4gb2N0O1xuXG4gICAgICB0YWcgPDw9IDc7XG4gICAgICB0YWcgfD0gb2N0ICYgMHg3ZjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGFnICY9IDB4MWY7XG4gIH1cbiAgdmFyIHRhZ1N0ciA9IGRlci50YWdbdGFnXTtcblxuICByZXR1cm4ge1xuICAgIGNsczogY2xzLFxuICAgIHByaW1pdGl2ZTogcHJpbWl0aXZlLFxuICAgIHRhZzogdGFnLFxuICAgIHRhZ1N0cjogdGFnU3RyXG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlckRlY29kZUxlbihidWYsIHByaW1pdGl2ZSwgZmFpbCkge1xuICB2YXIgbGVuID0gYnVmLnJlYWRVSW50OChmYWlsKTtcbiAgaWYgKGJ1Zi5pc0Vycm9yKGxlbikpXG4gICAgcmV0dXJuIGxlbjtcblxuICAvLyBJbmRlZmluaXRlIGZvcm1cbiAgaWYgKCFwcmltaXRpdmUgJiYgbGVuID09PSAweDgwKVxuICAgIHJldHVybiBudWxsO1xuXG4gIC8vIERlZmluaXRlIGZvcm1cbiAgaWYgKChsZW4gJiAweDgwKSA9PT0gMCkge1xuICAgIC8vIFNob3J0IGZvcm1cbiAgICByZXR1cm4gbGVuO1xuICB9XG5cbiAgLy8gTG9uZyBmb3JtXG4gIHZhciBudW0gPSBsZW4gJiAweDdmO1xuICBpZiAobnVtID4gNClcbiAgICByZXR1cm4gYnVmLmVycm9yKCdsZW5ndGggb2N0ZWN0IGlzIHRvbyBsb25nJyk7XG5cbiAgbGVuID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW07IGkrKykge1xuICAgIGxlbiA8PD0gODtcbiAgICB2YXIgaiA9IGJ1Zi5yZWFkVUludDgoZmFpbCk7XG4gICAgaWYgKGJ1Zi5pc0Vycm9yKGopKVxuICAgICAgcmV0dXJuIGo7XG4gICAgbGVuIHw9IGo7XG4gIH1cblxuICByZXR1cm4gbGVuO1xufVxuIiwidmFyIGRlY29kZXJzID0gZXhwb3J0cztcblxuZGVjb2RlcnMuZGVyID0gcmVxdWlyZSgnLi9kZXInKTtcbmRlY29kZXJzLnBlbSA9IHJlcXVpcmUoJy4vcGVtJyk7XG4iLCJ2YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxudmFyIERFUkRlY29kZXIgPSByZXF1aXJlKCcuL2RlcicpO1xuXG5mdW5jdGlvbiBQRU1EZWNvZGVyKGVudGl0eSkge1xuICBERVJEZWNvZGVyLmNhbGwodGhpcywgZW50aXR5KTtcbiAgdGhpcy5lbmMgPSAncGVtJztcbn07XG5pbmhlcml0cyhQRU1EZWNvZGVyLCBERVJEZWNvZGVyKTtcbm1vZHVsZS5leHBvcnRzID0gUEVNRGVjb2RlcjtcblxuUEVNRGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKGRhdGEsIG9wdGlvbnMpIHtcbiAgdmFyIGxpbmVzID0gZGF0YS50b1N0cmluZygpLnNwbGl0KC9bXFxyXFxuXSsvZyk7XG5cbiAgdmFyIGxhYmVsID0gb3B0aW9ucy5sYWJlbC50b1VwcGVyQ2FzZSgpO1xuXG4gIHZhciByZSA9IC9eLS0tLS0oQkVHSU58RU5EKSAoW14tXSspLS0tLS0kLztcbiAgdmFyIHN0YXJ0ID0gLTE7XG4gIHZhciBlbmQgPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtYXRjaCA9IGxpbmVzW2ldLm1hdGNoKHJlKTtcbiAgICBpZiAobWF0Y2ggPT09IG51bGwpXG4gICAgICBjb250aW51ZTtcblxuICAgIGlmIChtYXRjaFsyXSAhPT0gbGFiZWwpXG4gICAgICBjb250aW51ZTtcblxuICAgIGlmIChzdGFydCA9PT0gLTEpIHtcbiAgICAgIGlmIChtYXRjaFsxXSAhPT0gJ0JFR0lOJylcbiAgICAgICAgYnJlYWs7XG4gICAgICBzdGFydCA9IGk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChtYXRjaFsxXSAhPT0gJ0VORCcpXG4gICAgICAgIGJyZWFrO1xuICAgICAgZW5kID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoc3RhcnQgPT09IC0xIHx8IGVuZCA9PT0gLTEpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdQRU0gc2VjdGlvbiBub3QgZm91bmQgZm9yOiAnICsgbGFiZWwpO1xuXG4gIHZhciBiYXNlNjQgPSBsaW5lcy5zbGljZShzdGFydCArIDEsIGVuZCkuam9pbignJyk7XG4gIC8vIFJlbW92ZSBleGNlc3NpdmUgc3ltYm9sc1xuICBiYXNlNjQucmVwbGFjZSgvW15hLXowLTlcXCtcXC89XSsvZ2ksICcnKTtcblxuICB2YXIgaW5wdXQgPSBuZXcgQnVmZmVyKGJhc2U2NCwgJ2Jhc2U2NCcpO1xuICByZXR1cm4gREVSRGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlLmNhbGwodGhpcywgaW5wdXQsIG9wdGlvbnMpO1xufTtcbiIsInZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG52YXIgYXNuMSA9IHJlcXVpcmUoJy4uLy4uL2FzbjEnKTtcbnZhciBiYXNlID0gYXNuMS5iYXNlO1xuXG4vLyBJbXBvcnQgREVSIGNvbnN0YW50c1xudmFyIGRlciA9IGFzbjEuY29uc3RhbnRzLmRlcjtcblxuZnVuY3Rpb24gREVSRW5jb2RlcihlbnRpdHkpIHtcbiAgdGhpcy5lbmMgPSAnZGVyJztcbiAgdGhpcy5uYW1lID0gZW50aXR5Lm5hbWU7XG4gIHRoaXMuZW50aXR5ID0gZW50aXR5O1xuXG4gIC8vIENvbnN0cnVjdCBiYXNlIHRyZWVcbiAgdGhpcy50cmVlID0gbmV3IERFUk5vZGUoKTtcbiAgdGhpcy50cmVlLl9pbml0KGVudGl0eS5ib2R5KTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IERFUkVuY29kZXI7XG5cbkRFUkVuY29kZXIucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCByZXBvcnRlcikge1xuICByZXR1cm4gdGhpcy50cmVlLl9lbmNvZGUoZGF0YSwgcmVwb3J0ZXIpLmpvaW4oKTtcbn07XG5cbi8vIFRyZWUgbWV0aG9kc1xuXG5mdW5jdGlvbiBERVJOb2RlKHBhcmVudCkge1xuICBiYXNlLk5vZGUuY2FsbCh0aGlzLCAnZGVyJywgcGFyZW50KTtcbn1cbmluaGVyaXRzKERFUk5vZGUsIGJhc2UuTm9kZSk7XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVDb21wb3NpdGUgPSBmdW5jdGlvbiBlbmNvZGVDb21wb3NpdGUodGFnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltaXRpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCkge1xuICB2YXIgZW5jb2RlZFRhZyA9IGVuY29kZVRhZyh0YWcsIHByaW1pdGl2ZSwgY2xzLCB0aGlzLnJlcG9ydGVyKTtcblxuICAvLyBTaG9ydCBmb3JtXG4gIGlmIChjb250ZW50Lmxlbmd0aCA8IDB4ODApIHtcbiAgICB2YXIgaGVhZGVyID0gbmV3IEJ1ZmZlcigyKTtcbiAgICBoZWFkZXJbMF0gPSBlbmNvZGVkVGFnO1xuICAgIGhlYWRlclsxXSA9IGNvbnRlbnQubGVuZ3RoO1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFsgaGVhZGVyLCBjb250ZW50IF0pO1xuICB9XG5cbiAgLy8gTG9uZyBmb3JtXG4gIC8vIENvdW50IG9jdGV0cyByZXF1aXJlZCB0byBzdG9yZSBsZW5ndGhcbiAgdmFyIGxlbk9jdGV0cyA9IDE7XG4gIGZvciAodmFyIGkgPSBjb250ZW50Lmxlbmd0aDsgaSA+PSAweDEwMDsgaSA+Pj0gOClcbiAgICBsZW5PY3RldHMrKztcblxuICB2YXIgaGVhZGVyID0gbmV3IEJ1ZmZlcigxICsgMSArIGxlbk9jdGV0cyk7XG4gIGhlYWRlclswXSA9IGVuY29kZWRUYWc7XG4gIGhlYWRlclsxXSA9IDB4ODAgfCBsZW5PY3RldHM7XG5cbiAgZm9yICh2YXIgaSA9IDEgKyBsZW5PY3RldHMsIGogPSBjb250ZW50Lmxlbmd0aDsgaiA+IDA7IGktLSwgaiA+Pj0gOClcbiAgICBoZWFkZXJbaV0gPSBqICYgMHhmZjtcblxuICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihbIGhlYWRlciwgY29udGVudCBdKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVTdHIgPSBmdW5jdGlvbiBlbmNvZGVTdHIoc3RyLCB0YWcpIHtcbiAgaWYgKHRhZyA9PT0gJ2JpdHN0cicpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihbIHN0ci51bnVzZWQgfCAwLCBzdHIuZGF0YSBdKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdibXBzdHInKSB7XG4gICAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoc3RyLmxlbmd0aCAqIDIpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBidWYud3JpdGVVSW50MTZCRShzdHIuY2hhckNvZGVBdChpKSwgaSAqIDIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihidWYpO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ251bXN0cicpIHtcbiAgICBpZiAoIXRoaXMuX2lzTnVtc3RyKHN0cikpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdFbmNvZGluZyBvZiBzdHJpbmcgdHlwZTogbnVtc3RyIHN1cHBvcnRzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29ubHkgZGlnaXRzIGFuZCBzcGFjZScpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihzdHIpO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ3ByaW50c3RyJykge1xuICAgIGlmICghdGhpcy5faXNQcmludHN0cihzdHIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignRW5jb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IHByaW50c3RyIHN1cHBvcnRzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29ubHkgbGF0aW4gdXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVycywgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlnaXRzLCBzcGFjZSwgYXBvc3Ryb3BoZSwgbGVmdCBhbmQgcmlndGggJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFyZW50aGVzaXMsIHBsdXMgc2lnbiwgY29tbWEsIGh5cGhlbiwgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZG90LCBzbGFzaCwgY29sb24sIGVxdWFsIHNpZ24sICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3F1ZXN0aW9uIG1hcmsnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoc3RyKTtcbiAgfSBlbHNlIGlmICgvc3RyJC8udGVzdCh0YWcpKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoc3RyKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdvYmpEZXNjJykge1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHN0cik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ0VuY29kaW5nIG9mIHN0cmluZyB0eXBlOiAnICsgdGFnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIHVuc3VwcG9ydGVkJyk7XG4gIH1cbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVPYmppZCA9IGZ1bmN0aW9uIGVuY29kZU9iamlkKGlkLCB2YWx1ZXMsIHJlbGF0aXZlKSB7XG4gIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCF2YWx1ZXMpXG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignc3RyaW5nIG9iamlkIGdpdmVuLCBidXQgbm8gdmFsdWVzIG1hcCBmb3VuZCcpO1xuICAgIGlmICghdmFsdWVzLmhhc093blByb3BlcnR5KGlkKSlcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdvYmppZCBub3QgZm91bmQgaW4gdmFsdWVzIG1hcCcpO1xuICAgIGlkID0gdmFsdWVzW2lkXS5zcGxpdCgvW1xcc1xcLl0rL2cpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWQubGVuZ3RoOyBpKyspXG4gICAgICBpZFtpXSB8PSAwO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaWQpKSB7XG4gICAgaWQgPSBpZC5zbGljZSgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWQubGVuZ3RoOyBpKyspXG4gICAgICBpZFtpXSB8PSAwO1xuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGlkKSkge1xuICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdvYmppZCgpIHNob3VsZCBiZSBlaXRoZXIgYXJyYXkgb3Igc3RyaW5nLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ290OiAnICsgSlNPTi5zdHJpbmdpZnkoaWQpKTtcbiAgfVxuXG4gIGlmICghcmVsYXRpdmUpIHtcbiAgICBpZiAoaWRbMV0gPj0gNDApXG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignU2Vjb25kIG9iamlkIGlkZW50aWZpZXIgT09CJyk7XG4gICAgaWQuc3BsaWNlKDAsIDIsIGlkWzBdICogNDAgKyBpZFsxXSk7XG4gIH1cblxuICAvLyBDb3VudCBudW1iZXIgb2Ygb2N0ZXRzXG4gIHZhciBzaXplID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpZGVudCA9IGlkW2ldO1xuICAgIGZvciAoc2l6ZSsrOyBpZGVudCA+PSAweDgwOyBpZGVudCA+Pj0gNylcbiAgICAgIHNpemUrKztcbiAgfVxuXG4gIHZhciBvYmppZCA9IG5ldyBCdWZmZXIoc2l6ZSk7XG4gIHZhciBvZmZzZXQgPSBvYmppZC5sZW5ndGggLSAxO1xuICBmb3IgKHZhciBpID0gaWQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgaWRlbnQgPSBpZFtpXTtcbiAgICBvYmppZFtvZmZzZXQtLV0gPSBpZGVudCAmIDB4N2Y7XG4gICAgd2hpbGUgKChpZGVudCA+Pj0gNykgPiAwKVxuICAgICAgb2JqaWRbb2Zmc2V0LS1dID0gMHg4MCB8IChpZGVudCAmIDB4N2YpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIob2JqaWQpO1xufTtcblxuZnVuY3Rpb24gdHdvKG51bSkge1xuICBpZiAobnVtIDwgMTApXG4gICAgcmV0dXJuICcwJyArIG51bTtcbiAgZWxzZVxuICAgIHJldHVybiBudW07XG59XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVUaW1lID0gZnVuY3Rpb24gZW5jb2RlVGltZSh0aW1lLCB0YWcpIHtcbiAgdmFyIHN0cjtcbiAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh0aW1lKTtcblxuICBpZiAodGFnID09PSAnZ2VudGltZScpIHtcbiAgICBzdHIgPSBbXG4gICAgICB0d28oZGF0ZS5nZXRGdWxsWWVhcigpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ01vbnRoKCkgKyAxKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ0RhdGUoKSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENIb3VycygpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ01pbnV0ZXMoKSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENTZWNvbmRzKCkpLFxuICAgICAgJ1onXG4gICAgXS5qb2luKCcnKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICd1dGN0aW1lJykge1xuICAgIHN0ciA9IFtcbiAgICAgIHR3byhkYXRlLmdldEZ1bGxZZWFyKCkgJSAxMDApLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDRGF0ZSgpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ0hvdXJzKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDTWludXRlcygpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ1NlY29uZHMoKSksXG4gICAgICAnWidcbiAgICBdLmpvaW4oJycpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ0VuY29kaW5nICcgKyB0YWcgKyAnIHRpbWUgaXMgbm90IHN1cHBvcnRlZCB5ZXQnKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9lbmNvZGVTdHIoc3RyLCAnb2N0c3RyJyk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlTnVsbCA9IGZ1bmN0aW9uIGVuY29kZU51bGwoKSB7XG4gIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKCcnKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVJbnQgPSBmdW5jdGlvbiBlbmNvZGVJbnQobnVtLCB2YWx1ZXMpIHtcbiAgaWYgKHR5cGVvZiBudW0gPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCF2YWx1ZXMpXG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignU3RyaW5nIGludCBvciBlbnVtIGdpdmVuLCBidXQgbm8gdmFsdWVzIG1hcCcpO1xuICAgIGlmICghdmFsdWVzLmhhc093blByb3BlcnR5KG51bSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdWYWx1ZXMgbWFwIGRvZXNuXFwndCBjb250YWluOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG51bSkpO1xuICAgIH1cbiAgICBudW0gPSB2YWx1ZXNbbnVtXTtcbiAgfVxuXG4gIC8vIEJpZ251bSwgYXNzdW1lIGJpZyBlbmRpYW5cbiAgaWYgKHR5cGVvZiBudW0gIT09ICdudW1iZXInICYmICFCdWZmZXIuaXNCdWZmZXIobnVtKSkge1xuICAgIHZhciBudW1BcnJheSA9IG51bS50b0FycmF5KCk7XG4gICAgaWYgKCFudW0uc2lnbiAmJiBudW1BcnJheVswXSAmIDB4ODApIHtcbiAgICAgIG51bUFycmF5LnVuc2hpZnQoMCk7XG4gICAgfVxuICAgIG51bSA9IG5ldyBCdWZmZXIobnVtQXJyYXkpO1xuICB9XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihudW0pKSB7XG4gICAgdmFyIHNpemUgPSBudW0ubGVuZ3RoO1xuICAgIGlmIChudW0ubGVuZ3RoID09PSAwKVxuICAgICAgc2l6ZSsrO1xuXG4gICAgdmFyIG91dCA9IG5ldyBCdWZmZXIoc2l6ZSk7XG4gICAgbnVtLmNvcHkob3V0KTtcbiAgICBpZiAobnVtLmxlbmd0aCA9PT0gMClcbiAgICAgIG91dFswXSA9IDBcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihvdXQpO1xuICB9XG5cbiAgaWYgKG51bSA8IDB4ODApXG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIobnVtKTtcblxuICBpZiAobnVtIDwgMHgxMDApXG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoWzAsIG51bV0pO1xuXG4gIHZhciBzaXplID0gMTtcbiAgZm9yICh2YXIgaSA9IG51bTsgaSA+PSAweDEwMDsgaSA+Pj0gOClcbiAgICBzaXplKys7XG5cbiAgdmFyIG91dCA9IG5ldyBBcnJheShzaXplKTtcbiAgZm9yICh2YXIgaSA9IG91dC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIG91dFtpXSA9IG51bSAmIDB4ZmY7XG4gICAgbnVtID4+PSA4O1xuICB9XG4gIGlmKG91dFswXSAmIDB4ODApIHtcbiAgICBvdXQudW5zaGlmdCgwKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKG5ldyBCdWZmZXIob3V0KSk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlQm9vbCA9IGZ1bmN0aW9uIGVuY29kZUJvb2wodmFsdWUpIHtcbiAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIodmFsdWUgPyAweGZmIDogMCk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fdXNlID0gZnVuY3Rpb24gdXNlKGVudGl0eSwgb2JqKSB7XG4gIGlmICh0eXBlb2YgZW50aXR5ID09PSAnZnVuY3Rpb24nKVxuICAgIGVudGl0eSA9IGVudGl0eShvYmopO1xuICByZXR1cm4gZW50aXR5Ll9nZXRFbmNvZGVyKCdkZXInKS50cmVlO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX3NraXBEZWZhdWx0ID0gZnVuY3Rpb24gc2tpcERlZmF1bHQoZGF0YUJ1ZmZlciwgcmVwb3J0ZXIsIHBhcmVudCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIHZhciBpO1xuICBpZiAoc3RhdGVbJ2RlZmF1bHQnXSA9PT0gbnVsbClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGRhdGEgPSBkYXRhQnVmZmVyLmpvaW4oKTtcbiAgaWYgKHN0YXRlLmRlZmF1bHRCdWZmZXIgPT09IHVuZGVmaW5lZClcbiAgICBzdGF0ZS5kZWZhdWx0QnVmZmVyID0gdGhpcy5fZW5jb2RlVmFsdWUoc3RhdGVbJ2RlZmF1bHQnXSwgcmVwb3J0ZXIsIHBhcmVudCkuam9pbigpO1xuXG4gIGlmIChkYXRhLmxlbmd0aCAhPT0gc3RhdGUuZGVmYXVsdEJ1ZmZlci5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGZvciAoaT0wOyBpIDwgZGF0YS5sZW5ndGg7IGkrKylcbiAgICBpZiAoZGF0YVtpXSAhPT0gc3RhdGUuZGVmYXVsdEJ1ZmZlcltpXSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIFV0aWxpdHkgbWV0aG9kc1xuXG5mdW5jdGlvbiBlbmNvZGVUYWcodGFnLCBwcmltaXRpdmUsIGNscywgcmVwb3J0ZXIpIHtcbiAgdmFyIHJlcztcblxuICBpZiAodGFnID09PSAnc2Vxb2YnKVxuICAgIHRhZyA9ICdzZXEnO1xuICBlbHNlIGlmICh0YWcgPT09ICdzZXRvZicpXG4gICAgdGFnID0gJ3NldCc7XG5cbiAgaWYgKGRlci50YWdCeU5hbWUuaGFzT3duUHJvcGVydHkodGFnKSlcbiAgICByZXMgPSBkZXIudGFnQnlOYW1lW3RhZ107XG4gIGVsc2UgaWYgKHR5cGVvZiB0YWcgPT09ICdudW1iZXInICYmICh0YWcgfCAwKSA9PT0gdGFnKVxuICAgIHJlcyA9IHRhZztcbiAgZWxzZVxuICAgIHJldHVybiByZXBvcnRlci5lcnJvcignVW5rbm93biB0YWc6ICcgKyB0YWcpO1xuXG4gIGlmIChyZXMgPj0gMHgxZilcbiAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ011bHRpLW9jdGV0IHRhZyBlbmNvZGluZyB1bnN1cHBvcnRlZCcpO1xuXG4gIGlmICghcHJpbWl0aXZlKVxuICAgIHJlcyB8PSAweDIwO1xuXG4gIHJlcyB8PSAoZGVyLnRhZ0NsYXNzQnlOYW1lW2NscyB8fCAndW5pdmVyc2FsJ10gPDwgNik7XG5cbiAgcmV0dXJuIHJlcztcbn1cbiIsInZhciBlbmNvZGVycyA9IGV4cG9ydHM7XG5cbmVuY29kZXJzLmRlciA9IHJlcXVpcmUoJy4vZGVyJyk7XG5lbmNvZGVycy5wZW0gPSByZXF1aXJlKCcuL3BlbScpO1xuIiwidmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxudmFyIERFUkVuY29kZXIgPSByZXF1aXJlKCcuL2RlcicpO1xuXG5mdW5jdGlvbiBQRU1FbmNvZGVyKGVudGl0eSkge1xuICBERVJFbmNvZGVyLmNhbGwodGhpcywgZW50aXR5KTtcbiAgdGhpcy5lbmMgPSAncGVtJztcbn07XG5pbmhlcml0cyhQRU1FbmNvZGVyLCBERVJFbmNvZGVyKTtcbm1vZHVsZS5leHBvcnRzID0gUEVNRW5jb2RlcjtcblxuUEVNRW5jb2Rlci5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGRhdGEsIG9wdGlvbnMpIHtcbiAgdmFyIGJ1ZiA9IERFUkVuY29kZXIucHJvdG90eXBlLmVuY29kZS5jYWxsKHRoaXMsIGRhdGEpO1xuXG4gIHZhciBwID0gYnVmLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgdmFyIG91dCA9IFsgJy0tLS0tQkVHSU4gJyArIG9wdGlvbnMubGFiZWwgKyAnLS0tLS0nIF07XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcC5sZW5ndGg7IGkgKz0gNjQpXG4gICAgb3V0LnB1c2gocC5zbGljZShpLCBpICsgNjQpKTtcbiAgb3V0LnB1c2goJy0tLS0tRU5EICcgKyBvcHRpb25zLmxhYmVsICsgJy0tLS0tJyk7XG4gIHJldHVybiBvdXQuam9pbignXFxuJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGF1dG9iaW5kO1xuLyoqXG4gKiBAY29weXJpZ2h0IDIwMTUsIEFuZHJleSBQb3BwIDw4bWF5ZGF5QGdtYWlsLmNvbT5cbiAqXG4gKiBUaGUgZGVjb3JhdG9yIG1heSBiZSB1c2VkIG9uIGNsYXNzZXMgb3IgbWV0aG9kc1xuICogYGBgXG4gKiBAYXV0b2JpbmRcbiAqIGNsYXNzIEZ1bGxCb3VuZCB7fVxuICpcbiAqIGNsYXNzIFBhcnRCb3VuZCB7XG4gKiAgIEBhdXRvYmluZFxuICogICBtZXRob2QgKCkge31cbiAqIH1cbiAqIGBgYFxuICovXG5mdW5jdGlvbiBhdXRvYmluZCgpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gYm91bmRDbGFzcy5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJvdW5kTWV0aG9kLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgfVxufVxuXG4vKipcbiAqIFVzZSBib3VuZE1ldGhvZCB0byBiaW5kIGFsbCBtZXRob2RzIG9uIHRoZSB0YXJnZXQucHJvdG90eXBlXG4gKi9cbmZ1bmN0aW9uIGJvdW5kQ2xhc3ModGFyZ2V0KSB7XG4gIC8vIChVc2luZyByZWZsZWN0IHRvIGdldCBhbGwga2V5cyBpbmNsdWRpbmcgc3ltYm9scylcbiAgdmFyIGtleXMgPSB2b2lkIDA7XG4gIC8vIFVzZSBSZWZsZWN0IGlmIGV4aXN0c1xuICBpZiAodHlwZW9mIFJlZmxlY3QgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBSZWZsZWN0Lm93bktleXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBrZXlzID0gUmVmbGVjdC5vd25LZXlzKHRhcmdldC5wcm90b3R5cGUpO1xuICB9IGVsc2Uge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQucHJvdG90eXBlKTtcbiAgICAvLyB1c2Ugc3ltYm9scyBpZiBzdXBwb3J0IGlzIHByb3ZpZGVkXG4gICAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBrZXlzID0ga2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXQucHJvdG90eXBlKSk7XG4gICAgfVxuICB9XG5cbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAvLyBJZ25vcmUgc3BlY2lhbCBjYXNlIHRhcmdldCBtZXRob2RcbiAgICBpZiAoa2V5ID09PSAnY29uc3RydWN0b3InKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldC5wcm90b3R5cGUsIGtleSk7XG5cbiAgICAvLyBPbmx5IG1ldGhvZHMgbmVlZCBiaW5kaW5nXG4gICAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LnByb3RvdHlwZSwga2V5LCBib3VuZE1ldGhvZCh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcikpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgZGVzY3JpcHRvciByZW1vdmluZyB0aGUgdmFsdWUgYW5kIHJldHVybmluZyBhIGdldHRlclxuICogVGhlIGdldHRlciB3aWxsIHJldHVybiBhIC5iaW5kIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uXG4gKiBhbmQgbWVtb2l6ZSB0aGUgcmVzdWx0IGFnYWluc3QgYSBzeW1ib2wgb24gdGhlIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIGJvdW5kTWV0aG9kKHRhcmdldCwga2V5LCBkZXNjcmlwdG9yKSB7XG4gIHZhciBmbiA9IGRlc2NyaXB0b3IudmFsdWU7XG5cbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignQGF1dG9iaW5kIGRlY29yYXRvciBjYW4gb25seSBiZSBhcHBsaWVkIHRvIG1ldGhvZHMgbm90OiAnICsgKHR5cGVvZiBmbiA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YoZm4pKSk7XG4gIH1cblxuICAvLyBJbiBJRTExIGNhbGxpbmcgT2JqZWN0LmRlZmluZVByb3BlcnR5IGhhcyBhIHNpZGUtZWZmZWN0IG9mIGV2YWx1YXRpbmcgdGhlXG4gIC8vIGdldHRlciBmb3IgdGhlIHByb3BlcnR5IHdoaWNoIGlzIGJlaW5nIHJlcGxhY2VkLiBUaGlzIGNhdXNlcyBpbmZpbml0ZVxuICAvLyByZWN1cnNpb24gYW5kIGFuIFwiT3V0IG9mIHN0YWNrIHNwYWNlXCIgZXJyb3IuXG4gIHZhciBkZWZpbmluZ1Byb3BlcnR5ID0gZmFsc2U7XG5cbiAgcmV0dXJuIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAoZGVmaW5pbmdQcm9wZXJ0eSB8fCB0aGlzID09PSB0YXJnZXQucHJvdG90eXBlIHx8IHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSB8fCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGZuO1xuICAgICAgfVxuXG4gICAgICB2YXIgYm91bmRGbiA9IGZuLmJpbmQodGhpcyk7XG4gICAgICBkZWZpbmluZ1Byb3BlcnR5ID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXksIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gYm91bmRGbjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgICAgICBmbiA9IHZhbHVlO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZGVmaW5pbmdQcm9wZXJ0eSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGJvdW5kRm47XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgZm4gPSB2YWx1ZTtcbiAgICB9XG4gIH07XG59XG4iLCIndXNlIHN0cmljdCdcblxuZXhwb3J0cy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuZXhwb3J0cy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5XG5leHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5XG5cbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG5cbnZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG5mb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxufVxuXG4vLyBTdXBwb3J0IGRlY29kaW5nIFVSTC1zYWZlIGJhc2U2NCBzdHJpbmdzLCBhcyBOb2RlLmpzIGRvZXMuXG4vLyBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jhc2U2NCNVUkxfYXBwbGljYXRpb25zXG5yZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbnJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xuXG5mdW5jdGlvbiBnZXRMZW5zIChiNjQpIHtcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGhcblxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKVxuICB9XG5cbiAgLy8gVHJpbSBvZmYgZXh0cmEgYnl0ZXMgYWZ0ZXIgcGxhY2Vob2xkZXIgYnl0ZXMgYXJlIGZvdW5kXG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JlYXRnYW1taXQvYmFzZTY0LWpzL2lzc3Vlcy80MlxuICB2YXIgdmFsaWRMZW4gPSBiNjQuaW5kZXhPZignPScpXG4gIGlmICh2YWxpZExlbiA9PT0gLTEpIHZhbGlkTGVuID0gbGVuXG5cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IHZhbGlkTGVuID09PSBsZW5cbiAgICA/IDBcbiAgICA6IDQgLSAodmFsaWRMZW4gJSA0KVxuXG4gIHJldHVybiBbdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbl1cbn1cblxuLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChiNjQpIHtcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW5cbn1cblxuZnVuY3Rpb24gX2J5dGVMZW5ndGggKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikge1xuICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW5cbn1cblxuZnVuY3Rpb24gdG9CeXRlQXJyYXkgKGI2NCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cblxuICB2YXIgYXJyID0gbmV3IEFycihfYnl0ZUxlbmd0aChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pKVxuXG4gIHZhciBjdXJCeXRlID0gMFxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgdmFyIGxlbiA9IHBsYWNlSG9sZGVyc0xlbiA+IDBcbiAgICA/IHZhbGlkTGVuIC0gNFxuICAgIDogdmFsaWRMZW5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgMTIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA8PCA2KSB8XG4gICAgICByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMikge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPj4gNClcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDEpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCA0KSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPj4gMilcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NCAobnVtKSB7XG4gIHJldHVybiBsb29rdXBbbnVtID4+IDE4ICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gMTIgJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gJiAweDNGXVxufVxuXG5mdW5jdGlvbiBlbmNvZGVDaHVuayAodWludDgsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHRtcFxuICB2YXIgb3V0cHV0ID0gW11cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHtcbiAgICB0bXAgPVxuICAgICAgKCh1aW50OFtpXSA8PCAxNikgJiAweEZGMDAwMCkgK1xuICAgICAgKCh1aW50OFtpICsgMV0gPDwgOCkgJiAweEZGMDApICtcbiAgICAgICh1aW50OFtpICsgMl0gJiAweEZGKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgcGFydHMgPSBbXVxuICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDNcblxuICAvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG4gIGZvciAodmFyIGkgPSAwLCBsZW4yID0gbGVuIC0gZXh0cmFCeXRlczsgaSA8IGxlbjI7IGkgKz0gbWF4Q2h1bmtMZW5ndGgpIHtcbiAgICBwYXJ0cy5wdXNoKGVuY29kZUNodW5rKFxuICAgICAgdWludDgsIGksIChpICsgbWF4Q2h1bmtMZW5ndGgpID4gbGVuMiA/IGxlbjIgOiAoaSArIG1heENodW5rTGVuZ3RoKVxuICAgICkpXG4gIH1cblxuICAvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG4gIGlmIChleHRyYUJ5dGVzID09PSAxKSB7XG4gICAgdG1wID0gdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAyXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCA0KSAmIDB4M0ZdICtcbiAgICAgICc9PSdcbiAgICApXG4gIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA9PT0gMikge1xuICAgIHRtcCA9ICh1aW50OFtsZW4gLSAyXSA8PCA4KSArIHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMTBdICtcbiAgICAgIGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXSArXG4gICAgICAnPSdcbiAgICApXG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignJylcbn1cbiIsIihmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBVdGlsc1xuICBmdW5jdGlvbiBhc3NlcnQgKHZhbCwgbXNnKSB7XG4gICAgaWYgKCF2YWwpIHRocm93IG5ldyBFcnJvcihtc2cgfHwgJ0Fzc2VydGlvbiBmYWlsZWQnKTtcbiAgfVxuXG4gIC8vIENvdWxkIHVzZSBgaW5oZXJpdHNgIG1vZHVsZSwgYnV0IGRvbid0IHdhbnQgdG8gbW92ZSBmcm9tIHNpbmdsZSBmaWxlXG4gIC8vIGFyY2hpdGVjdHVyZSB5ZXQuXG4gIGZ1bmN0aW9uIGluaGVyaXRzIChjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvcjtcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlO1xuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKCk7XG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yO1xuICB9XG5cbiAgLy8gQk5cblxuICBmdW5jdGlvbiBCTiAobnVtYmVyLCBiYXNlLCBlbmRpYW4pIHtcbiAgICBpZiAoQk4uaXNCTihudW1iZXIpKSB7XG4gICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH1cblxuICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgIHRoaXMud29yZHMgPSBudWxsO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcblxuICAgIC8vIFJlZHVjdGlvbiBjb250ZXh0XG4gICAgdGhpcy5yZWQgPSBudWxsO1xuXG4gICAgaWYgKG51bWJlciAhPT0gbnVsbCkge1xuICAgICAgaWYgKGJhc2UgPT09ICdsZScgfHwgYmFzZSA9PT0gJ2JlJykge1xuICAgICAgICBlbmRpYW4gPSBiYXNlO1xuICAgICAgICBiYXNlID0gMTA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2luaXQobnVtYmVyIHx8IDAsIGJhc2UgfHwgMTAsIGVuZGlhbiB8fCAnYmUnKTtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBCTjtcbiAgfSBlbHNlIHtcbiAgICBleHBvcnRzLkJOID0gQk47XG4gIH1cblxuICBCTi5CTiA9IEJOO1xuICBCTi53b3JkU2l6ZSA9IDI2O1xuXG4gIHZhciBCdWZmZXI7XG4gIHRyeSB7XG4gICAgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuICB9IGNhdGNoIChlKSB7XG4gIH1cblxuICBCTi5pc0JOID0gZnVuY3Rpb24gaXNCTiAobnVtKSB7XG4gICAgaWYgKG51bSBpbnN0YW5jZW9mIEJOKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVtICE9PSBudWxsICYmIHR5cGVvZiBudW0gPT09ICdvYmplY3QnICYmXG4gICAgICBudW0uY29uc3RydWN0b3Iud29yZFNpemUgPT09IEJOLndvcmRTaXplICYmIEFycmF5LmlzQXJyYXkobnVtLndvcmRzKTtcbiAgfTtcblxuICBCTi5tYXggPSBmdW5jdGlvbiBtYXggKGxlZnQsIHJpZ2h0KSB7XG4gICAgaWYgKGxlZnQuY21wKHJpZ2h0KSA+IDApIHJldHVybiBsZWZ0O1xuICAgIHJldHVybiByaWdodDtcbiAgfTtcblxuICBCTi5taW4gPSBmdW5jdGlvbiBtaW4gKGxlZnQsIHJpZ2h0KSB7XG4gICAgaWYgKGxlZnQuY21wKHJpZ2h0KSA8IDApIHJldHVybiBsZWZ0O1xuICAgIHJldHVybiByaWdodDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiBpbml0IChudW1iZXIsIGJhc2UsIGVuZGlhbikge1xuICAgIGlmICh0eXBlb2YgbnVtYmVyID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHRoaXMuX2luaXROdW1iZXIobnVtYmVyLCBiYXNlLCBlbmRpYW4pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbnVtYmVyID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHRoaXMuX2luaXRBcnJheShudW1iZXIsIGJhc2UsIGVuZGlhbik7XG4gICAgfVxuXG4gICAgaWYgKGJhc2UgPT09ICdoZXgnKSB7XG4gICAgICBiYXNlID0gMTY7XG4gICAgfVxuICAgIGFzc2VydChiYXNlID09PSAoYmFzZSB8IDApICYmIGJhc2UgPj0gMiAmJiBiYXNlIDw9IDM2KTtcblxuICAgIG51bWJlciA9IG51bWJlci50b1N0cmluZygpLnJlcGxhY2UoL1xccysvZywgJycpO1xuICAgIHZhciBzdGFydCA9IDA7XG4gICAgaWYgKG51bWJlclswXSA9PT0gJy0nKSB7XG4gICAgICBzdGFydCsrO1xuICAgIH1cblxuICAgIGlmIChiYXNlID09PSAxNikge1xuICAgICAgdGhpcy5fcGFyc2VIZXgobnVtYmVyLCBzdGFydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3BhcnNlQmFzZShudW1iZXIsIGJhc2UsIHN0YXJ0KTtcbiAgICB9XG5cbiAgICBpZiAobnVtYmVyWzBdID09PSAnLScpIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgIH1cblxuICAgIHRoaXMuc3RyaXAoKTtcblxuICAgIGlmIChlbmRpYW4gIT09ICdsZScpIHJldHVybjtcblxuICAgIHRoaXMuX2luaXRBcnJheSh0aGlzLnRvQXJyYXkoKSwgYmFzZSwgZW5kaWFuKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2luaXROdW1iZXIgPSBmdW5jdGlvbiBfaW5pdE51bWJlciAobnVtYmVyLCBiYXNlLCBlbmRpYW4pIHtcbiAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgICBudW1iZXIgPSAtbnVtYmVyO1xuICAgIH1cbiAgICBpZiAobnVtYmVyIDwgMHg0MDAwMDAwKSB7XG4gICAgICB0aGlzLndvcmRzID0gWyBudW1iZXIgJiAweDNmZmZmZmYgXTtcbiAgICAgIHRoaXMubGVuZ3RoID0gMTtcbiAgICB9IGVsc2UgaWYgKG51bWJlciA8IDB4MTAwMDAwMDAwMDAwMDApIHtcbiAgICAgIHRoaXMud29yZHMgPSBbXG4gICAgICAgIG51bWJlciAmIDB4M2ZmZmZmZixcbiAgICAgICAgKG51bWJlciAvIDB4NDAwMDAwMCkgJiAweDNmZmZmZmZcbiAgICAgIF07XG4gICAgICB0aGlzLmxlbmd0aCA9IDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChudW1iZXIgPCAweDIwMDAwMDAwMDAwMDAwKTsgLy8gMiBeIDUzICh1bnNhZmUpXG4gICAgICB0aGlzLndvcmRzID0gW1xuICAgICAgICBudW1iZXIgJiAweDNmZmZmZmYsXG4gICAgICAgIChudW1iZXIgLyAweDQwMDAwMDApICYgMHgzZmZmZmZmLFxuICAgICAgICAxXG4gICAgICBdO1xuICAgICAgdGhpcy5sZW5ndGggPSAzO1xuICAgIH1cblxuICAgIGlmIChlbmRpYW4gIT09ICdsZScpIHJldHVybjtcblxuICAgIC8vIFJldmVyc2UgdGhlIGJ5dGVzXG4gICAgdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLCBiYXNlLCBlbmRpYW4pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5faW5pdEFycmF5ID0gZnVuY3Rpb24gX2luaXRBcnJheSAobnVtYmVyLCBiYXNlLCBlbmRpYW4pIHtcbiAgICAvLyBQZXJoYXBzIGEgVWludDhBcnJheVxuICAgIGFzc2VydCh0eXBlb2YgbnVtYmVyLmxlbmd0aCA9PT0gJ251bWJlcicpO1xuICAgIGlmIChudW1iZXIubGVuZ3RoIDw9IDApIHtcbiAgICAgIHRoaXMud29yZHMgPSBbIDAgXTtcbiAgICAgIHRoaXMubGVuZ3RoID0gMTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5jZWlsKG51bWJlci5sZW5ndGggLyAzKTtcbiAgICB0aGlzLndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSAwO1xuICAgIH1cblxuICAgIHZhciBqLCB3O1xuICAgIHZhciBvZmYgPSAwO1xuICAgIGlmIChlbmRpYW4gPT09ICdiZScpIHtcbiAgICAgIGZvciAoaSA9IG51bWJlci5sZW5ndGggLSAxLCBqID0gMDsgaSA+PSAwOyBpIC09IDMpIHtcbiAgICAgICAgdyA9IG51bWJlcltpXSB8IChudW1iZXJbaSAtIDFdIDw8IDgpIHwgKG51bWJlcltpIC0gMl0gPDwgMTYpO1xuICAgICAgICB0aGlzLndvcmRzW2pdIHw9ICh3IDw8IG9mZikgJiAweDNmZmZmZmY7XG4gICAgICAgIHRoaXMud29yZHNbaiArIDFdID0gKHcgPj4+ICgyNiAtIG9mZikpICYgMHgzZmZmZmZmO1xuICAgICAgICBvZmYgKz0gMjQ7XG4gICAgICAgIGlmIChvZmYgPj0gMjYpIHtcbiAgICAgICAgICBvZmYgLT0gMjY7XG4gICAgICAgICAgaisrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlbmRpYW4gPT09ICdsZScpIHtcbiAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgbnVtYmVyLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIHcgPSBudW1iZXJbaV0gfCAobnVtYmVyW2kgKyAxXSA8PCA4KSB8IChudW1iZXJbaSArIDJdIDw8IDE2KTtcbiAgICAgICAgdGhpcy53b3Jkc1tqXSB8PSAodyA8PCBvZmYpICYgMHgzZmZmZmZmO1xuICAgICAgICB0aGlzLndvcmRzW2ogKyAxXSA9ICh3ID4+PiAoMjYgLSBvZmYpKSAmIDB4M2ZmZmZmZjtcbiAgICAgICAgb2ZmICs9IDI0O1xuICAgICAgICBpZiAob2ZmID49IDI2KSB7XG4gICAgICAgICAgb2ZmIC09IDI2O1xuICAgICAgICAgIGorKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHBhcnNlSGV4IChzdHIsIHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgciA9IDA7XG4gICAgdmFyIGxlbiA9IE1hdGgubWluKHN0ci5sZW5ndGgsIGVuZCk7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHZhciBjID0gc3RyLmNoYXJDb2RlQXQoaSkgLSA0ODtcblxuICAgICAgciA8PD0gNDtcblxuICAgICAgLy8gJ2EnIC0gJ2YnXG4gICAgICBpZiAoYyA+PSA0OSAmJiBjIDw9IDU0KSB7XG4gICAgICAgIHIgfD0gYyAtIDQ5ICsgMHhhO1xuXG4gICAgICAvLyAnQScgLSAnRidcbiAgICAgIH0gZWxzZSBpZiAoYyA+PSAxNyAmJiBjIDw9IDIyKSB7XG4gICAgICAgIHIgfD0gYyAtIDE3ICsgMHhhO1xuXG4gICAgICAvLyAnMCcgLSAnOSdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHIgfD0gYyAmIDB4ZjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICBCTi5wcm90b3R5cGUuX3BhcnNlSGV4ID0gZnVuY3Rpb24gX3BhcnNlSGV4IChudW1iZXIsIHN0YXJ0KSB7XG4gICAgLy8gQ3JlYXRlIHBvc3NpYmx5IGJpZ2dlciBhcnJheSB0byBlbnN1cmUgdGhhdCBpdCBmaXRzIHRoZSBudW1iZXJcbiAgICB0aGlzLmxlbmd0aCA9IE1hdGguY2VpbCgobnVtYmVyLmxlbmd0aCAtIHN0YXJ0KSAvIDYpO1xuICAgIHRoaXMud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IDA7XG4gICAgfVxuXG4gICAgdmFyIGosIHc7XG4gICAgLy8gU2NhbiAyNC1iaXQgY2h1bmtzIGFuZCBhZGQgdGhlbSB0byB0aGUgbnVtYmVyXG4gICAgdmFyIG9mZiA9IDA7XG4gICAgZm9yIChpID0gbnVtYmVyLmxlbmd0aCAtIDYsIGogPSAwOyBpID49IHN0YXJ0OyBpIC09IDYpIHtcbiAgICAgIHcgPSBwYXJzZUhleChudW1iZXIsIGksIGkgKyA2KTtcbiAgICAgIHRoaXMud29yZHNbal0gfD0gKHcgPDwgb2ZmKSAmIDB4M2ZmZmZmZjtcbiAgICAgIC8vIE5PVEU6IGAweDNmZmZmZmAgaXMgaW50ZW50aW9uYWwgaGVyZSwgMjZiaXRzIG1heCBzaGlmdCArIDI0Yml0IGhleCBsaW1iXG4gICAgICB0aGlzLndvcmRzW2ogKyAxXSB8PSB3ID4+PiAoMjYgLSBvZmYpICYgMHgzZmZmZmY7XG4gICAgICBvZmYgKz0gMjQ7XG4gICAgICBpZiAob2ZmID49IDI2KSB7XG4gICAgICAgIG9mZiAtPSAyNjtcbiAgICAgICAgaisrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaSArIDYgIT09IHN0YXJ0KSB7XG4gICAgICB3ID0gcGFyc2VIZXgobnVtYmVyLCBzdGFydCwgaSArIDYpO1xuICAgICAgdGhpcy53b3Jkc1tqXSB8PSAodyA8PCBvZmYpICYgMHgzZmZmZmZmO1xuICAgICAgdGhpcy53b3Jkc1tqICsgMV0gfD0gdyA+Pj4gKDI2IC0gb2ZmKSAmIDB4M2ZmZmZmO1xuICAgIH1cbiAgICB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gcGFyc2VCYXNlIChzdHIsIHN0YXJ0LCBlbmQsIG11bCkge1xuICAgIHZhciByID0gMDtcbiAgICB2YXIgbGVuID0gTWF0aC5taW4oc3RyLmxlbmd0aCwgZW5kKTtcbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBsZW47IGkrKykge1xuICAgICAgdmFyIGMgPSBzdHIuY2hhckNvZGVBdChpKSAtIDQ4O1xuXG4gICAgICByICo9IG11bDtcblxuICAgICAgLy8gJ2EnXG4gICAgICBpZiAoYyA+PSA0OSkge1xuICAgICAgICByICs9IGMgLSA0OSArIDB4YTtcblxuICAgICAgLy8gJ0EnXG4gICAgICB9IGVsc2UgaWYgKGMgPj0gMTcpIHtcbiAgICAgICAgciArPSBjIC0gMTcgKyAweGE7XG5cbiAgICAgIC8vICcwJyAtICc5J1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgciArPSBjO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIEJOLnByb3RvdHlwZS5fcGFyc2VCYXNlID0gZnVuY3Rpb24gX3BhcnNlQmFzZSAobnVtYmVyLCBiYXNlLCBzdGFydCkge1xuICAgIC8vIEluaXRpYWxpemUgYXMgemVyb1xuICAgIHRoaXMud29yZHMgPSBbIDAgXTtcbiAgICB0aGlzLmxlbmd0aCA9IDE7XG5cbiAgICAvLyBGaW5kIGxlbmd0aCBvZiBsaW1iIGluIGJhc2VcbiAgICBmb3IgKHZhciBsaW1iTGVuID0gMCwgbGltYlBvdyA9IDE7IGxpbWJQb3cgPD0gMHgzZmZmZmZmOyBsaW1iUG93ICo9IGJhc2UpIHtcbiAgICAgIGxpbWJMZW4rKztcbiAgICB9XG4gICAgbGltYkxlbi0tO1xuICAgIGxpbWJQb3cgPSAobGltYlBvdyAvIGJhc2UpIHwgMDtcblxuICAgIHZhciB0b3RhbCA9IG51bWJlci5sZW5ndGggLSBzdGFydDtcbiAgICB2YXIgbW9kID0gdG90YWwgJSBsaW1iTGVuO1xuICAgIHZhciBlbmQgPSBNYXRoLm1pbih0b3RhbCwgdG90YWwgLSBtb2QpICsgc3RhcnQ7XG5cbiAgICB2YXIgd29yZCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGxpbWJMZW4pIHtcbiAgICAgIHdvcmQgPSBwYXJzZUJhc2UobnVtYmVyLCBpLCBpICsgbGltYkxlbiwgYmFzZSk7XG5cbiAgICAgIHRoaXMuaW11bG4obGltYlBvdyk7XG4gICAgICBpZiAodGhpcy53b3Jkc1swXSArIHdvcmQgPCAweDQwMDAwMDApIHtcbiAgICAgICAgdGhpcy53b3Jkc1swXSArPSB3b3JkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faWFkZG4od29yZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vZCAhPT0gMCkge1xuICAgICAgdmFyIHBvdyA9IDE7XG4gICAgICB3b3JkID0gcGFyc2VCYXNlKG51bWJlciwgaSwgbnVtYmVyLmxlbmd0aCwgYmFzZSk7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBtb2Q7IGkrKykge1xuICAgICAgICBwb3cgKj0gYmFzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pbXVsbihwb3cpO1xuICAgICAgaWYgKHRoaXMud29yZHNbMF0gKyB3b3JkIDwgMHg0MDAwMDAwKSB7XG4gICAgICAgIHRoaXMud29yZHNbMF0gKz0gd29yZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2lhZGRuKHdvcmQpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBCTi5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKGRlc3QpIHtcbiAgICBkZXN0LndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlc3Qud29yZHNbaV0gPSB0aGlzLndvcmRzW2ldO1xuICAgIH1cbiAgICBkZXN0Lmxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgIGRlc3QubmVnYXRpdmUgPSB0aGlzLm5lZ2F0aXZlO1xuICAgIGRlc3QucmVkID0gdGhpcy5yZWQ7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gY2xvbmUgKCkge1xuICAgIHZhciByID0gbmV3IEJOKG51bGwpO1xuICAgIHRoaXMuY29weShyKTtcbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2V4cGFuZCA9IGZ1bmN0aW9uIF9leHBhbmQgKHNpemUpIHtcbiAgICB3aGlsZSAodGhpcy5sZW5ndGggPCBzaXplKSB7XG4gICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gUmVtb3ZlIGxlYWRpbmcgYDBgIGZyb20gYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5zdHJpcCA9IGZ1bmN0aW9uIHN0cmlwICgpIHtcbiAgICB3aGlsZSAodGhpcy5sZW5ndGggPiAxICYmIHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXSA9PT0gMCkge1xuICAgICAgdGhpcy5sZW5ndGgtLTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX25vcm1TaWduKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9ub3JtU2lnbiA9IGZ1bmN0aW9uIF9ub3JtU2lnbiAoKSB7XG4gICAgLy8gLTAgPSAwXG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICAgIHJldHVybiAodGhpcy5yZWQgPyAnPEJOLVI6ICcgOiAnPEJOOiAnKSArIHRoaXMudG9TdHJpbmcoMTYpICsgJz4nO1xuICB9O1xuXG4gIC8qXG5cbiAgdmFyIHplcm9zID0gW107XG4gIHZhciBncm91cFNpemVzID0gW107XG4gIHZhciBncm91cEJhc2VzID0gW107XG5cbiAgdmFyIHMgPSAnJztcbiAgdmFyIGkgPSAtMTtcbiAgd2hpbGUgKCsraSA8IEJOLndvcmRTaXplKSB7XG4gICAgemVyb3NbaV0gPSBzO1xuICAgIHMgKz0gJzAnO1xuICB9XG4gIGdyb3VwU2l6ZXNbMF0gPSAwO1xuICBncm91cFNpemVzWzFdID0gMDtcbiAgZ3JvdXBCYXNlc1swXSA9IDA7XG4gIGdyb3VwQmFzZXNbMV0gPSAwO1xuICB2YXIgYmFzZSA9IDIgLSAxO1xuICB3aGlsZSAoKytiYXNlIDwgMzYgKyAxKSB7XG4gICAgdmFyIGdyb3VwU2l6ZSA9IDA7XG4gICAgdmFyIGdyb3VwQmFzZSA9IDE7XG4gICAgd2hpbGUgKGdyb3VwQmFzZSA8ICgxIDw8IEJOLndvcmRTaXplKSAvIGJhc2UpIHtcbiAgICAgIGdyb3VwQmFzZSAqPSBiYXNlO1xuICAgICAgZ3JvdXBTaXplICs9IDE7XG4gICAgfVxuICAgIGdyb3VwU2l6ZXNbYmFzZV0gPSBncm91cFNpemU7XG4gICAgZ3JvdXBCYXNlc1tiYXNlXSA9IGdyb3VwQmFzZTtcbiAgfVxuXG4gICovXG5cbiAgdmFyIHplcm9zID0gW1xuICAgICcnLFxuICAgICcwJyxcbiAgICAnMDAnLFxuICAgICcwMDAnLFxuICAgICcwMDAwJyxcbiAgICAnMDAwMDAnLFxuICAgICcwMDAwMDAnLFxuICAgICcwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJ1xuICBdO1xuXG4gIHZhciBncm91cFNpemVzID0gW1xuICAgIDAsIDAsXG4gICAgMjUsIDE2LCAxMiwgMTEsIDEwLCA5LCA4LFxuICAgIDgsIDcsIDcsIDcsIDcsIDYsIDYsXG4gICAgNiwgNiwgNiwgNiwgNiwgNSwgNSxcbiAgICA1LCA1LCA1LCA1LCA1LCA1LCA1LFxuICAgIDUsIDUsIDUsIDUsIDUsIDUsIDVcbiAgXTtcblxuICB2YXIgZ3JvdXBCYXNlcyA9IFtcbiAgICAwLCAwLFxuICAgIDMzNTU0NDMyLCA0MzA0NjcyMSwgMTY3NzcyMTYsIDQ4ODI4MTI1LCA2MDQ2NjE3NiwgNDAzNTM2MDcsIDE2Nzc3MjE2LFxuICAgIDQzMDQ2NzIxLCAxMDAwMDAwMCwgMTk0ODcxNzEsIDM1ODMxODA4LCA2Mjc0ODUxNywgNzUyOTUzNiwgMTEzOTA2MjUsXG4gICAgMTY3NzcyMTYsIDI0MTM3NTY5LCAzNDAxMjIyNCwgNDcwNDU4ODEsIDY0MDAwMDAwLCA0MDg0MTAxLCA1MTUzNjMyLFxuICAgIDY0MzYzNDMsIDc5NjI2MjQsIDk3NjU2MjUsIDExODgxMzc2LCAxNDM0ODkwNywgMTcyMTAzNjgsIDIwNTExMTQ5LFxuICAgIDI0MzAwMDAwLCAyODYyOTE1MSwgMzM1NTQ0MzIsIDM5MTM1MzkzLCA0NTQzNTQyNCwgNTI1MjE4NzUsIDYwNDY2MTc2XG4gIF07XG5cbiAgQk4ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKGJhc2UsIHBhZGRpbmcpIHtcbiAgICBiYXNlID0gYmFzZSB8fCAxMDtcbiAgICBwYWRkaW5nID0gcGFkZGluZyB8IDAgfHwgMTtcblxuICAgIHZhciBvdXQ7XG4gICAgaWYgKGJhc2UgPT09IDE2IHx8IGJhc2UgPT09ICdoZXgnKSB7XG4gICAgICBvdXQgPSAnJztcbiAgICAgIHZhciBvZmYgPSAwO1xuICAgICAgdmFyIGNhcnJ5ID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdyA9IHRoaXMud29yZHNbaV07XG4gICAgICAgIHZhciB3b3JkID0gKCgodyA8PCBvZmYpIHwgY2FycnkpICYgMHhmZmZmZmYpLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgY2FycnkgPSAodyA+Pj4gKDI0IC0gb2ZmKSkgJiAweGZmZmZmZjtcbiAgICAgICAgaWYgKGNhcnJ5ICE9PSAwIHx8IGkgIT09IHRoaXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIG91dCA9IHplcm9zWzYgLSB3b3JkLmxlbmd0aF0gKyB3b3JkICsgb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCA9IHdvcmQgKyBvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgb2ZmICs9IDI7XG4gICAgICAgIGlmIChvZmYgPj0gMjYpIHtcbiAgICAgICAgICBvZmYgLT0gMjY7XG4gICAgICAgICAgaS0tO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgICAgb3V0ID0gY2FycnkudG9TdHJpbmcoMTYpICsgb3V0O1xuICAgICAgfVxuICAgICAgd2hpbGUgKG91dC5sZW5ndGggJSBwYWRkaW5nICE9PSAwKSB7XG4gICAgICAgIG91dCA9ICcwJyArIG91dDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgIG91dCA9ICctJyArIG91dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgaWYgKGJhc2UgPT09IChiYXNlIHwgMCkgJiYgYmFzZSA+PSAyICYmIGJhc2UgPD0gMzYpIHtcbiAgICAgIC8vIHZhciBncm91cFNpemUgPSBNYXRoLmZsb29yKEJOLndvcmRTaXplICogTWF0aC5MTjIgLyBNYXRoLmxvZyhiYXNlKSk7XG4gICAgICB2YXIgZ3JvdXBTaXplID0gZ3JvdXBTaXplc1tiYXNlXTtcbiAgICAgIC8vIHZhciBncm91cEJhc2UgPSBNYXRoLnBvdyhiYXNlLCBncm91cFNpemUpO1xuICAgICAgdmFyIGdyb3VwQmFzZSA9IGdyb3VwQmFzZXNbYmFzZV07XG4gICAgICBvdXQgPSAnJztcbiAgICAgIHZhciBjID0gdGhpcy5jbG9uZSgpO1xuICAgICAgYy5uZWdhdGl2ZSA9IDA7XG4gICAgICB3aGlsZSAoIWMuaXNaZXJvKCkpIHtcbiAgICAgICAgdmFyIHIgPSBjLm1vZG4oZ3JvdXBCYXNlKS50b1N0cmluZyhiYXNlKTtcbiAgICAgICAgYyA9IGMuaWRpdm4oZ3JvdXBCYXNlKTtcblxuICAgICAgICBpZiAoIWMuaXNaZXJvKCkpIHtcbiAgICAgICAgICBvdXQgPSB6ZXJvc1tncm91cFNpemUgLSByLmxlbmd0aF0gKyByICsgb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCA9IHIgKyBvdXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzWmVybygpKSB7XG4gICAgICAgIG91dCA9ICcwJyArIG91dDtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChvdXQubGVuZ3RoICUgcGFkZGluZyAhPT0gMCkge1xuICAgICAgICBvdXQgPSAnMCcgKyBvdXQ7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgICBvdXQgPSAnLScgKyBvdXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIGFzc2VydChmYWxzZSwgJ0Jhc2Ugc2hvdWxkIGJlIGJldHdlZW4gMiBhbmQgMzYnKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9OdW1iZXIgPSBmdW5jdGlvbiB0b051bWJlciAoKSB7XG4gICAgdmFyIHJldCA9IHRoaXMud29yZHNbMF07XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAyKSB7XG4gICAgICByZXQgKz0gdGhpcy53b3Jkc1sxXSAqIDB4NDAwMDAwMDtcbiAgICB9IGVsc2UgaWYgKHRoaXMubGVuZ3RoID09PSAzICYmIHRoaXMud29yZHNbMl0gPT09IDB4MDEpIHtcbiAgICAgIC8vIE5PVEU6IGF0IHRoaXMgc3RhZ2UgaXQgaXMga25vd24gdGhhdCB0aGUgdG9wIGJpdCBpcyBzZXRcbiAgICAgIHJldCArPSAweDEwMDAwMDAwMDAwMDAwICsgKHRoaXMud29yZHNbMV0gKiAweDQwMDAwMDApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5sZW5ndGggPiAyKSB7XG4gICAgICBhc3NlcnQoZmFsc2UsICdOdW1iZXIgY2FuIG9ubHkgc2FmZWx5IHN0b3JlIHVwIHRvIDUzIGJpdHMnKTtcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLm5lZ2F0aXZlICE9PSAwKSA/IC1yZXQgOiByZXQ7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoMTYpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b0J1ZmZlciA9IGZ1bmN0aW9uIHRvQnVmZmVyIChlbmRpYW4sIGxlbmd0aCkge1xuICAgIGFzc2VydCh0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJyk7XG4gICAgcmV0dXJuIHRoaXMudG9BcnJheUxpa2UoQnVmZmVyLCBlbmRpYW4sIGxlbmd0aCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiB0b0FycmF5IChlbmRpYW4sIGxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLnRvQXJyYXlMaWtlKEFycmF5LCBlbmRpYW4sIGxlbmd0aCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvQXJyYXlMaWtlID0gZnVuY3Rpb24gdG9BcnJheUxpa2UgKEFycmF5VHlwZSwgZW5kaWFuLCBsZW5ndGgpIHtcbiAgICB2YXIgYnl0ZUxlbmd0aCA9IHRoaXMuYnl0ZUxlbmd0aCgpO1xuICAgIHZhciByZXFMZW5ndGggPSBsZW5ndGggfHwgTWF0aC5tYXgoMSwgYnl0ZUxlbmd0aCk7XG4gICAgYXNzZXJ0KGJ5dGVMZW5ndGggPD0gcmVxTGVuZ3RoLCAnYnl0ZSBhcnJheSBsb25nZXIgdGhhbiBkZXNpcmVkIGxlbmd0aCcpO1xuICAgIGFzc2VydChyZXFMZW5ndGggPiAwLCAnUmVxdWVzdGVkIGFycmF5IGxlbmd0aCA8PSAwJyk7XG5cbiAgICB0aGlzLnN0cmlwKCk7XG4gICAgdmFyIGxpdHRsZUVuZGlhbiA9IGVuZGlhbiA9PT0gJ2xlJztcbiAgICB2YXIgcmVzID0gbmV3IEFycmF5VHlwZShyZXFMZW5ndGgpO1xuXG4gICAgdmFyIGIsIGk7XG4gICAgdmFyIHEgPSB0aGlzLmNsb25lKCk7XG4gICAgaWYgKCFsaXR0bGVFbmRpYW4pIHtcbiAgICAgIC8vIEFzc3VtZSBiaWctZW5kaWFuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgcmVxTGVuZ3RoIC0gYnl0ZUxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc1tpXSA9IDA7XG4gICAgICB9XG5cbiAgICAgIGZvciAoaSA9IDA7ICFxLmlzWmVybygpOyBpKyspIHtcbiAgICAgICAgYiA9IHEuYW5kbG4oMHhmZik7XG4gICAgICAgIHEuaXVzaHJuKDgpO1xuXG4gICAgICAgIHJlc1tyZXFMZW5ndGggLSBpIC0gMV0gPSBiO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGkgPSAwOyAhcS5pc1plcm8oKTsgaSsrKSB7XG4gICAgICAgIGIgPSBxLmFuZGxuKDB4ZmYpO1xuICAgICAgICBxLml1c2hybig4KTtcblxuICAgICAgICByZXNbaV0gPSBiO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgaSA8IHJlcUxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc1tpXSA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBpZiAoTWF0aC5jbHozMikge1xuICAgIEJOLnByb3RvdHlwZS5fY291bnRCaXRzID0gZnVuY3Rpb24gX2NvdW50Qml0cyAodykge1xuICAgICAgcmV0dXJuIDMyIC0gTWF0aC5jbHozMih3KTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIEJOLnByb3RvdHlwZS5fY291bnRCaXRzID0gZnVuY3Rpb24gX2NvdW50Qml0cyAodykge1xuICAgICAgdmFyIHQgPSB3O1xuICAgICAgdmFyIHIgPSAwO1xuICAgICAgaWYgKHQgPj0gMHgxMDAwKSB7XG4gICAgICAgIHIgKz0gMTM7XG4gICAgICAgIHQgPj4+PSAxMztcbiAgICAgIH1cbiAgICAgIGlmICh0ID49IDB4NDApIHtcbiAgICAgICAgciArPSA3O1xuICAgICAgICB0ID4+Pj0gNztcbiAgICAgIH1cbiAgICAgIGlmICh0ID49IDB4OCkge1xuICAgICAgICByICs9IDQ7XG4gICAgICAgIHQgPj4+PSA0O1xuICAgICAgfVxuICAgICAgaWYgKHQgPj0gMHgwMikge1xuICAgICAgICByICs9IDI7XG4gICAgICAgIHQgPj4+PSAyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHIgKyB0O1xuICAgIH07XG4gIH1cblxuICBCTi5wcm90b3R5cGUuX3plcm9CaXRzID0gZnVuY3Rpb24gX3plcm9CaXRzICh3KSB7XG4gICAgLy8gU2hvcnQtY3V0XG4gICAgaWYgKHcgPT09IDApIHJldHVybiAyNjtcblxuICAgIHZhciB0ID0gdztcbiAgICB2YXIgciA9IDA7XG4gICAgaWYgKCh0ICYgMHgxZmZmKSA9PT0gMCkge1xuICAgICAgciArPSAxMztcbiAgICAgIHQgPj4+PSAxMztcbiAgICB9XG4gICAgaWYgKCh0ICYgMHg3ZikgPT09IDApIHtcbiAgICAgIHIgKz0gNztcbiAgICAgIHQgPj4+PSA3O1xuICAgIH1cbiAgICBpZiAoKHQgJiAweGYpID09PSAwKSB7XG4gICAgICByICs9IDQ7XG4gICAgICB0ID4+Pj0gNDtcbiAgICB9XG4gICAgaWYgKCh0ICYgMHgzKSA9PT0gMCkge1xuICAgICAgciArPSAyO1xuICAgICAgdCA+Pj49IDI7XG4gICAgfVxuICAgIGlmICgodCAmIDB4MSkgPT09IDApIHtcbiAgICAgIHIrKztcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG51bWJlciBvZiB1c2VkIGJpdHMgaW4gYSBCTlxuICBCTi5wcm90b3R5cGUuYml0TGVuZ3RoID0gZnVuY3Rpb24gYml0TGVuZ3RoICgpIHtcbiAgICB2YXIgdyA9IHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXTtcbiAgICB2YXIgaGkgPSB0aGlzLl9jb3VudEJpdHModyk7XG4gICAgcmV0dXJuICh0aGlzLmxlbmd0aCAtIDEpICogMjYgKyBoaTtcbiAgfTtcblxuICBmdW5jdGlvbiB0b0JpdEFycmF5IChudW0pIHtcbiAgICB2YXIgdyA9IG5ldyBBcnJheShudW0uYml0TGVuZ3RoKCkpO1xuXG4gICAgZm9yICh2YXIgYml0ID0gMDsgYml0IDwgdy5sZW5ndGg7IGJpdCsrKSB7XG4gICAgICB2YXIgb2ZmID0gKGJpdCAvIDI2KSB8IDA7XG4gICAgICB2YXIgd2JpdCA9IGJpdCAlIDI2O1xuXG4gICAgICB3W2JpdF0gPSAobnVtLndvcmRzW29mZl0gJiAoMSA8PCB3Yml0KSkgPj4+IHdiaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHc7XG4gIH1cblxuICAvLyBOdW1iZXIgb2YgdHJhaWxpbmcgemVybyBiaXRzXG4gIEJOLnByb3RvdHlwZS56ZXJvQml0cyA9IGZ1bmN0aW9uIHplcm9CaXRzICgpIHtcbiAgICBpZiAodGhpcy5pc1plcm8oKSkgcmV0dXJuIDA7XG5cbiAgICB2YXIgciA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYiA9IHRoaXMuX3plcm9CaXRzKHRoaXMud29yZHNbaV0pO1xuICAgICAgciArPSBiO1xuICAgICAgaWYgKGIgIT09IDI2KSBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmJ5dGVMZW5ndGggPSBmdW5jdGlvbiBieXRlTGVuZ3RoICgpIHtcbiAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMuYml0TGVuZ3RoKCkgLyA4KTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9Ud29zID0gZnVuY3Rpb24gdG9Ud29zICh3aWR0aCkge1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5hYnMoKS5pbm90bih3aWR0aCkuaWFkZG4oMSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNsb25lKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmZyb21Ud29zID0gZnVuY3Rpb24gZnJvbVR3b3MgKHdpZHRoKSB7XG4gICAgaWYgKHRoaXMudGVzdG4od2lkdGggLSAxKSkge1xuICAgICAgcmV0dXJuIHRoaXMubm90bih3aWR0aCkuaWFkZG4oMSkuaW5lZygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc05lZyA9IGZ1bmN0aW9uIGlzTmVnICgpIHtcbiAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMDtcbiAgfTtcblxuICAvLyBSZXR1cm4gbmVnYXRpdmUgY2xvbmUgb2YgYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcgKCkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW5lZygpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pbmVnID0gZnVuY3Rpb24gaW5lZyAoKSB7XG4gICAgaWYgKCF0aGlzLmlzWmVybygpKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlIF49IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gT3IgYG51bWAgd2l0aCBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLml1b3IgPSBmdW5jdGlvbiBpdW9yIChudW0pIHtcbiAgICB3aGlsZSAodGhpcy5sZW5ndGggPCBudW0ubGVuZ3RoKSB7XG4gICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdID0gMDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bS5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHRoaXMud29yZHNbaV0gfCBudW0ud29yZHNbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaW9yID0gZnVuY3Rpb24gaW9yIChudW0pIHtcbiAgICBhc3NlcnQoKHRoaXMubmVnYXRpdmUgfCBudW0ubmVnYXRpdmUpID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdW9yKG51bSk7XG4gIH07XG5cbiAgLy8gT3IgYG51bWAgd2l0aCBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLm9yID0gZnVuY3Rpb24gb3IgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaW9yKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLmlvcih0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudW9yID0gZnVuY3Rpb24gdW9yIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLml1b3IobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaXVvcih0aGlzKTtcbiAgfTtcblxuICAvLyBBbmQgYG51bWAgd2l0aCBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLml1YW5kID0gZnVuY3Rpb24gaXVhbmQgKG51bSkge1xuICAgIC8vIGIgPSBtaW4tbGVuZ3RoKG51bSwgdGhpcylcbiAgICB2YXIgYjtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSB7XG4gICAgICBiID0gbnVtO1xuICAgIH0gZWxzZSB7XG4gICAgICBiID0gdGhpcztcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB0aGlzLndvcmRzW2ldICYgbnVtLndvcmRzW2ldO1xuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gYi5sZW5ndGg7XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pYW5kID0gZnVuY3Rpb24gaWFuZCAobnVtKSB7XG4gICAgYXNzZXJ0KCh0aGlzLm5lZ2F0aXZlIHwgbnVtLm5lZ2F0aXZlKSA9PT0gMCk7XG4gICAgcmV0dXJuIHRoaXMuaXVhbmQobnVtKTtcbiAgfTtcblxuICAvLyBBbmQgYG51bWAgd2l0aCBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLmFuZCA9IGZ1bmN0aW9uIGFuZCAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYW5kKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLmlhbmQodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnVhbmQgPSBmdW5jdGlvbiB1YW5kIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLml1YW5kKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLml1YW5kKHRoaXMpO1xuICB9O1xuXG4gIC8vIFhvciBgbnVtYCB3aXRoIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXV4b3IgPSBmdW5jdGlvbiBpdXhvciAobnVtKSB7XG4gICAgLy8gYS5sZW5ndGggPiBiLmxlbmd0aFxuICAgIHZhciBhO1xuICAgIHZhciBiO1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHtcbiAgICAgIGEgPSB0aGlzO1xuICAgICAgYiA9IG51bTtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IG51bTtcbiAgICAgIGIgPSB0aGlzO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IGEud29yZHNbaV0gXiBiLndvcmRzW2ldO1xuICAgIH1cblxuICAgIGlmICh0aGlzICE9PSBhKSB7XG4gICAgICBmb3IgKDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IGEud29yZHNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSBhLmxlbmd0aDtcblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLml4b3IgPSBmdW5jdGlvbiBpeG9yIChudW0pIHtcbiAgICBhc3NlcnQoKHRoaXMubmVnYXRpdmUgfCBudW0ubmVnYXRpdmUpID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdXhvcihudW0pO1xuICB9O1xuXG4gIC8vIFhvciBgbnVtYCB3aXRoIGB0aGlzYFxuICBCTi5wcm90b3R5cGUueG9yID0gZnVuY3Rpb24geG9yIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLml4b3IobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaXhvcih0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudXhvciA9IGZ1bmN0aW9uIHV4b3IgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaXV4b3IobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaXV4b3IodGhpcyk7XG4gIH07XG5cbiAgLy8gTm90IGBgdGhpc2BgIHdpdGggYGB3aWR0aGBgIGJpdHdpZHRoXG4gIEJOLnByb3RvdHlwZS5pbm90biA9IGZ1bmN0aW9uIGlub3RuICh3aWR0aCkge1xuICAgIGFzc2VydCh0eXBlb2Ygd2lkdGggPT09ICdudW1iZXInICYmIHdpZHRoID49IDApO1xuXG4gICAgdmFyIGJ5dGVzTmVlZGVkID0gTWF0aC5jZWlsKHdpZHRoIC8gMjYpIHwgMDtcbiAgICB2YXIgYml0c0xlZnQgPSB3aWR0aCAlIDI2O1xuXG4gICAgLy8gRXh0ZW5kIHRoZSBidWZmZXIgd2l0aCBsZWFkaW5nIHplcm9lc1xuICAgIHRoaXMuX2V4cGFuZChieXRlc05lZWRlZCk7XG5cbiAgICBpZiAoYml0c0xlZnQgPiAwKSB7XG4gICAgICBieXRlc05lZWRlZC0tO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBjb21wbGV0ZSB3b3Jkc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXNOZWVkZWQ7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IH50aGlzLndvcmRzW2ldICYgMHgzZmZmZmZmO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSB0aGUgcmVzaWR1ZVxuICAgIGlmIChiaXRzTGVmdCA+IDApIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB+dGhpcy53b3Jkc1tpXSAmICgweDNmZmZmZmYgPj4gKDI2IC0gYml0c0xlZnQpKTtcbiAgICB9XG5cbiAgICAvLyBBbmQgcmVtb3ZlIGxlYWRpbmcgemVyb2VzXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubm90biA9IGZ1bmN0aW9uIG5vdG4gKHdpZHRoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbm90bih3aWR0aCk7XG4gIH07XG5cbiAgLy8gU2V0IGBiaXRgIG9mIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuc2V0biA9IGZ1bmN0aW9uIHNldG4gKGJpdCwgdmFsKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXQgPT09ICdudW1iZXInICYmIGJpdCA+PSAwKTtcblxuICAgIHZhciBvZmYgPSAoYml0IC8gMjYpIHwgMDtcbiAgICB2YXIgd2JpdCA9IGJpdCAlIDI2O1xuXG4gICAgdGhpcy5fZXhwYW5kKG9mZiArIDEpO1xuXG4gICAgaWYgKHZhbCkge1xuICAgICAgdGhpcy53b3Jkc1tvZmZdID0gdGhpcy53b3Jkc1tvZmZdIHwgKDEgPDwgd2JpdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud29yZHNbb2ZmXSA9IHRoaXMud29yZHNbb2ZmXSAmIH4oMSA8PCB3Yml0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIC8vIEFkZCBgbnVtYCB0byBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLmlhZGQgPSBmdW5jdGlvbiBpYWRkIChudW0pIHtcbiAgICB2YXIgcjtcblxuICAgIC8vIG5lZ2F0aXZlICsgcG9zaXRpdmVcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiBudW0ubmVnYXRpdmUgPT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgciA9IHRoaXMuaXN1YihudW0pO1xuICAgICAgdGhpcy5uZWdhdGl2ZSBePSAxO1xuICAgICAgcmV0dXJuIHRoaXMuX25vcm1TaWduKCk7XG5cbiAgICAvLyBwb3NpdGl2ZSArIG5lZ2F0aXZlXG4gICAgfSBlbHNlIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIG51bS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgbnVtLm5lZ2F0aXZlID0gMDtcbiAgICAgIHIgPSB0aGlzLmlzdWIobnVtKTtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gci5fbm9ybVNpZ24oKTtcbiAgICB9XG5cbiAgICAvLyBhLmxlbmd0aCA+IGIubGVuZ3RoXG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkge1xuICAgICAgYSA9IHRoaXM7XG4gICAgICBiID0gbnVtO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gbnVtO1xuICAgICAgYiA9IHRoaXM7XG4gICAgfVxuXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHIgPSAoYS53b3Jkc1tpXSB8IDApICsgKGIud29yZHNbaV0gfCAwKSArIGNhcnJ5O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHIgJiAweDNmZmZmZmY7XG4gICAgICBjYXJyeSA9IHIgPj4+IDI2O1xuICAgIH1cbiAgICBmb3IgKDsgY2FycnkgIT09IDAgJiYgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIHIgPSAoYS53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICB0aGlzLndvcmRzW2ldID0gciAmIDB4M2ZmZmZmZjtcbiAgICAgIGNhcnJ5ID0gciA+Pj4gMjY7XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSBhLmxlbmd0aDtcbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGhdID0gY2Fycnk7XG4gICAgICB0aGlzLmxlbmd0aCsrO1xuICAgIC8vIENvcHkgdGhlIHJlc3Qgb2YgdGhlIHdvcmRzXG4gICAgfSBlbHNlIGlmIChhICE9PSB0aGlzKSB7XG4gICAgICBmb3IgKDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IGEud29yZHNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gQWRkIGBudW1gIHRvIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkIChudW0pIHtcbiAgICB2YXIgcmVzO1xuICAgIGlmIChudW0ubmVnYXRpdmUgIT09IDAgJiYgdGhpcy5uZWdhdGl2ZSA9PT0gMCkge1xuICAgICAgbnVtLm5lZ2F0aXZlID0gMDtcbiAgICAgIHJlcyA9IHRoaXMuc3ViKG51bSk7XG4gICAgICBudW0ubmVnYXRpdmUgXj0gMTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSBlbHNlIGlmIChudW0ubmVnYXRpdmUgPT09IDAgJiYgdGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICByZXMgPSBudW0uc3ViKHRoaXMpO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaWFkZChudW0pO1xuXG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLmlhZGQodGhpcyk7XG4gIH07XG5cbiAgLy8gU3VidHJhY3QgYG51bWAgZnJvbSBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLmlzdWIgPSBmdW5jdGlvbiBpc3ViIChudW0pIHtcbiAgICAvLyB0aGlzIC0gKC1udW0pID0gdGhpcyArIG51bVxuICAgIGlmIChudW0ubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDA7XG4gICAgICB2YXIgciA9IHRoaXMuaWFkZChudW0pO1xuICAgICAgbnVtLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiByLl9ub3JtU2lnbigpO1xuXG4gICAgLy8gLXRoaXMgLSBudW0gPSAtKHRoaXMgKyBudW0pXG4gICAgfSBlbHNlIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHRoaXMuaWFkZChudW0pO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gdGhpcy5fbm9ybVNpZ24oKTtcbiAgICB9XG5cbiAgICAvLyBBdCB0aGlzIHBvaW50IGJvdGggbnVtYmVycyBhcmUgcG9zaXRpdmVcbiAgICB2YXIgY21wID0gdGhpcy5jbXAobnVtKTtcblxuICAgIC8vIE9wdGltaXphdGlvbiAtIHplcm9pZnlcbiAgICBpZiAoY21wID09PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHRoaXMubGVuZ3RoID0gMTtcbiAgICAgIHRoaXMud29yZHNbMF0gPSAwO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gYSA+IGJcbiAgICB2YXIgYSwgYjtcbiAgICBpZiAoY21wID4gMCkge1xuICAgICAgYSA9IHRoaXM7XG4gICAgICBiID0gbnVtO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gbnVtO1xuICAgICAgYiA9IHRoaXM7XG4gICAgfVxuXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHIgPSAoYS53b3Jkc1tpXSB8IDApIC0gKGIud29yZHNbaV0gfCAwKSArIGNhcnJ5O1xuICAgICAgY2FycnkgPSByID4+IDI2O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHIgJiAweDNmZmZmZmY7XG4gICAgfVxuICAgIGZvciAoOyBjYXJyeSAhPT0gMCAmJiBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgciA9IChhLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gciA+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSByICYgMHgzZmZmZmZmO1xuICAgIH1cblxuICAgIC8vIENvcHkgcmVzdCBvZiB0aGUgd29yZHNcbiAgICBpZiAoY2FycnkgPT09IDAgJiYgaSA8IGEubGVuZ3RoICYmIGEgIT09IHRoaXMpIHtcbiAgICAgIGZvciAoOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gYS53b3Jkc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGgubWF4KHRoaXMubGVuZ3RoLCBpKTtcblxuICAgIGlmIChhICE9PSB0aGlzKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIC8vIFN1YnRyYWN0IGBudW1gIGZyb20gYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5zdWIgPSBmdW5jdGlvbiBzdWIgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXN1YihudW0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHNtYWxsTXVsVG8gKHNlbGYsIG51bSwgb3V0KSB7XG4gICAgb3V0Lm5lZ2F0aXZlID0gbnVtLm5lZ2F0aXZlIF4gc2VsZi5uZWdhdGl2ZTtcbiAgICB2YXIgbGVuID0gKHNlbGYubGVuZ3RoICsgbnVtLmxlbmd0aCkgfCAwO1xuICAgIG91dC5sZW5ndGggPSBsZW47XG4gICAgbGVuID0gKGxlbiAtIDEpIHwgMDtcblxuICAgIC8vIFBlZWwgb25lIGl0ZXJhdGlvbiAoY29tcGlsZXIgY2FuJ3QgZG8gaXQsIGJlY2F1c2Ugb2YgY29kZSBjb21wbGV4aXR5KVxuICAgIHZhciBhID0gc2VsZi53b3Jkc1swXSB8IDA7XG4gICAgdmFyIGIgPSBudW0ud29yZHNbMF0gfCAwO1xuICAgIHZhciByID0gYSAqIGI7XG5cbiAgICB2YXIgbG8gPSByICYgMHgzZmZmZmZmO1xuICAgIHZhciBjYXJyeSA9IChyIC8gMHg0MDAwMDAwKSB8IDA7XG4gICAgb3V0LndvcmRzWzBdID0gbG87XG5cbiAgICBmb3IgKHZhciBrID0gMTsgayA8IGxlbjsgaysrKSB7XG4gICAgICAvLyBTdW0gYWxsIHdvcmRzIHdpdGggdGhlIHNhbWUgYGkgKyBqID0ga2AgYW5kIGFjY3VtdWxhdGUgYG5jYXJyeWAsXG4gICAgICAvLyBub3RlIHRoYXQgbmNhcnJ5IGNvdWxkIGJlID49IDB4M2ZmZmZmZlxuICAgICAgdmFyIG5jYXJyeSA9IGNhcnJ5ID4+PiAyNjtcbiAgICAgIHZhciByd29yZCA9IGNhcnJ5ICYgMHgzZmZmZmZmO1xuICAgICAgdmFyIG1heEogPSBNYXRoLm1pbihrLCBudW0ubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBqID0gTWF0aC5tYXgoMCwgayAtIHNlbGYubGVuZ3RoICsgMSk7IGogPD0gbWF4SjsgaisrKSB7XG4gICAgICAgIHZhciBpID0gKGsgLSBqKSB8IDA7XG4gICAgICAgIGEgPSBzZWxmLndvcmRzW2ldIHwgMDtcbiAgICAgICAgYiA9IG51bS53b3Jkc1tqXSB8IDA7XG4gICAgICAgIHIgPSBhICogYiArIHJ3b3JkO1xuICAgICAgICBuY2FycnkgKz0gKHIgLyAweDQwMDAwMDApIHwgMDtcbiAgICAgICAgcndvcmQgPSByICYgMHgzZmZmZmZmO1xuICAgICAgfVxuICAgICAgb3V0LndvcmRzW2tdID0gcndvcmQgfCAwO1xuICAgICAgY2FycnkgPSBuY2FycnkgfCAwO1xuICAgIH1cbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIG91dC53b3Jkc1trXSA9IGNhcnJ5IHwgMDtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0Lmxlbmd0aC0tO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQuc3RyaXAoKTtcbiAgfVxuXG4gIC8vIFRPRE8oaW5kdXRueSk6IGl0IG1heSBiZSByZWFzb25hYmxlIHRvIG9taXQgaXQgZm9yIHVzZXJzIHdobyBkb24ndCBuZWVkXG4gIC8vIHRvIHdvcmsgd2l0aCAyNTYtYml0IG51bWJlcnMsIG90aGVyd2lzZSBpdCBnaXZlcyAyMCUgaW1wcm92ZW1lbnQgZm9yIDI1Ni1iaXRcbiAgLy8gbXVsdGlwbGljYXRpb24gKGxpa2UgZWxsaXB0aWMgc2VjcDI1NmsxKS5cbiAgdmFyIGNvbWIxME11bFRvID0gZnVuY3Rpb24gY29tYjEwTXVsVG8gKHNlbGYsIG51bSwgb3V0KSB7XG4gICAgdmFyIGEgPSBzZWxmLndvcmRzO1xuICAgIHZhciBiID0gbnVtLndvcmRzO1xuICAgIHZhciBvID0gb3V0LndvcmRzO1xuICAgIHZhciBjID0gMDtcbiAgICB2YXIgbG87XG4gICAgdmFyIG1pZDtcbiAgICB2YXIgaGk7XG4gICAgdmFyIGEwID0gYVswXSB8IDA7XG4gICAgdmFyIGFsMCA9IGEwICYgMHgxZmZmO1xuICAgIHZhciBhaDAgPSBhMCA+Pj4gMTM7XG4gICAgdmFyIGExID0gYVsxXSB8IDA7XG4gICAgdmFyIGFsMSA9IGExICYgMHgxZmZmO1xuICAgIHZhciBhaDEgPSBhMSA+Pj4gMTM7XG4gICAgdmFyIGEyID0gYVsyXSB8IDA7XG4gICAgdmFyIGFsMiA9IGEyICYgMHgxZmZmO1xuICAgIHZhciBhaDIgPSBhMiA+Pj4gMTM7XG4gICAgdmFyIGEzID0gYVszXSB8IDA7XG4gICAgdmFyIGFsMyA9IGEzICYgMHgxZmZmO1xuICAgIHZhciBhaDMgPSBhMyA+Pj4gMTM7XG4gICAgdmFyIGE0ID0gYVs0XSB8IDA7XG4gICAgdmFyIGFsNCA9IGE0ICYgMHgxZmZmO1xuICAgIHZhciBhaDQgPSBhNCA+Pj4gMTM7XG4gICAgdmFyIGE1ID0gYVs1XSB8IDA7XG4gICAgdmFyIGFsNSA9IGE1ICYgMHgxZmZmO1xuICAgIHZhciBhaDUgPSBhNSA+Pj4gMTM7XG4gICAgdmFyIGE2ID0gYVs2XSB8IDA7XG4gICAgdmFyIGFsNiA9IGE2ICYgMHgxZmZmO1xuICAgIHZhciBhaDYgPSBhNiA+Pj4gMTM7XG4gICAgdmFyIGE3ID0gYVs3XSB8IDA7XG4gICAgdmFyIGFsNyA9IGE3ICYgMHgxZmZmO1xuICAgIHZhciBhaDcgPSBhNyA+Pj4gMTM7XG4gICAgdmFyIGE4ID0gYVs4XSB8IDA7XG4gICAgdmFyIGFsOCA9IGE4ICYgMHgxZmZmO1xuICAgIHZhciBhaDggPSBhOCA+Pj4gMTM7XG4gICAgdmFyIGE5ID0gYVs5XSB8IDA7XG4gICAgdmFyIGFsOSA9IGE5ICYgMHgxZmZmO1xuICAgIHZhciBhaDkgPSBhOSA+Pj4gMTM7XG4gICAgdmFyIGIwID0gYlswXSB8IDA7XG4gICAgdmFyIGJsMCA9IGIwICYgMHgxZmZmO1xuICAgIHZhciBiaDAgPSBiMCA+Pj4gMTM7XG4gICAgdmFyIGIxID0gYlsxXSB8IDA7XG4gICAgdmFyIGJsMSA9IGIxICYgMHgxZmZmO1xuICAgIHZhciBiaDEgPSBiMSA+Pj4gMTM7XG4gICAgdmFyIGIyID0gYlsyXSB8IDA7XG4gICAgdmFyIGJsMiA9IGIyICYgMHgxZmZmO1xuICAgIHZhciBiaDIgPSBiMiA+Pj4gMTM7XG4gICAgdmFyIGIzID0gYlszXSB8IDA7XG4gICAgdmFyIGJsMyA9IGIzICYgMHgxZmZmO1xuICAgIHZhciBiaDMgPSBiMyA+Pj4gMTM7XG4gICAgdmFyIGI0ID0gYls0XSB8IDA7XG4gICAgdmFyIGJsNCA9IGI0ICYgMHgxZmZmO1xuICAgIHZhciBiaDQgPSBiNCA+Pj4gMTM7XG4gICAgdmFyIGI1ID0gYls1XSB8IDA7XG4gICAgdmFyIGJsNSA9IGI1ICYgMHgxZmZmO1xuICAgIHZhciBiaDUgPSBiNSA+Pj4gMTM7XG4gICAgdmFyIGI2ID0gYls2XSB8IDA7XG4gICAgdmFyIGJsNiA9IGI2ICYgMHgxZmZmO1xuICAgIHZhciBiaDYgPSBiNiA+Pj4gMTM7XG4gICAgdmFyIGI3ID0gYls3XSB8IDA7XG4gICAgdmFyIGJsNyA9IGI3ICYgMHgxZmZmO1xuICAgIHZhciBiaDcgPSBiNyA+Pj4gMTM7XG4gICAgdmFyIGI4ID0gYls4XSB8IDA7XG4gICAgdmFyIGJsOCA9IGI4ICYgMHgxZmZmO1xuICAgIHZhciBiaDggPSBiOCA+Pj4gMTM7XG4gICAgdmFyIGI5ID0gYls5XSB8IDA7XG4gICAgdmFyIGJsOSA9IGI5ICYgMHgxZmZmO1xuICAgIHZhciBiaDkgPSBiOSA+Pj4gMTM7XG5cbiAgICBvdXQubmVnYXRpdmUgPSBzZWxmLm5lZ2F0aXZlIF4gbnVtLm5lZ2F0aXZlO1xuICAgIG91dC5sZW5ndGggPSAxOTtcbiAgICAvKiBrID0gMCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsMCwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWwwLCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgwLCBiaDApO1xuICAgIHZhciB3MCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzAgPj4+IDI2KSkgfCAwO1xuICAgIHcwICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsMSwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWwxLCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgxLCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoMSkpIHwgMDtcbiAgICB2YXIgdzEgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxID4+PiAyNikpIHwgMDtcbiAgICB3MSAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDIgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDIsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsMiwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoMiwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmgyKSkgfCAwO1xuICAgIHZhciB3MiA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzIgPj4+IDI2KSkgfCAwO1xuICAgIHcyICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMyAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsMywgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWwzLCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgzLCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmgzKSkgfCAwO1xuICAgIHZhciB3MyA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzMgPj4+IDI2KSkgfCAwO1xuICAgIHczICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gNCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsNCwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw0LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg0LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoNCkpIHwgMDtcbiAgICB2YXIgdzQgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHc0ID4+PiAyNikpIHwgMDtcbiAgICB3NCAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDUgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDUsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsNSwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoNSwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg1KSkgfCAwO1xuICAgIHZhciB3NSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzUgPj4+IDI2KSkgfCAwO1xuICAgIHc1ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gNiAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsNiwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw2LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg2LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg2KSkgfCAwO1xuICAgIHZhciB3NiA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzYgPj4+IDI2KSkgfCAwO1xuICAgIHc2ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gNyAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsNywgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw3LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg3LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoNykpIHwgMDtcbiAgICB2YXIgdzcgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHc3ID4+PiAyNikpIHwgMDtcbiAgICB3NyAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDggKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDgsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOCwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOCwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg4KSkgfCAwO1xuICAgIHZhciB3OCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzggPj4+IDI2KSkgfCAwO1xuICAgIHc4ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gOSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg5KSkgfCAwO1xuICAgIHZhciB3OSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzkgPj4+IDI2KSkgfCAwO1xuICAgIHc5ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTAgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsMSk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmgxKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmwxKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmgxKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTAgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxMCA+Pj4gMjYpKSB8IDA7XG4gICAgdzEwICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTEgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsMik7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmgyKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmwyKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmgyKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxMSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzExID4+PiAyNikpIHwgMDtcbiAgICB3MTEgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxMiAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmwzKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDMpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDMpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDMpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg5KSkgfCAwO1xuICAgIHZhciB3MTIgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxMiA+Pj4gMjYpKSB8IDA7XG4gICAgdzEyICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTMgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsNCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg0KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw0KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg0KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTMgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxMyA+Pj4gMjYpKSB8IDA7XG4gICAgdzEzICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTQgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsNSk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg1KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw1KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg1KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxNCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzE0ID4+PiAyNikpIHwgMDtcbiAgICB3MTQgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxNSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw2KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDYpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDYpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDYpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTUgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxNSA+Pj4gMjYpKSB8IDA7XG4gICAgdzE1ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTYgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsNyk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg3KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw3KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg3KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg5KSkgfCAwO1xuICAgIHZhciB3MTYgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxNiA+Pj4gMjYpKSB8IDA7XG4gICAgdzE2ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTcgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsOCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg4KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw4KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg4KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxNyA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzE3ID4+PiAyNikpIHwgMDtcbiAgICB3MTcgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxOCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw5KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDkpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDkpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDkpO1xuICAgIHZhciB3MTggPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxOCA+Pj4gMjYpKSB8IDA7XG4gICAgdzE4ICY9IDB4M2ZmZmZmZjtcbiAgICBvWzBdID0gdzA7XG4gICAgb1sxXSA9IHcxO1xuICAgIG9bMl0gPSB3MjtcbiAgICBvWzNdID0gdzM7XG4gICAgb1s0XSA9IHc0O1xuICAgIG9bNV0gPSB3NTtcbiAgICBvWzZdID0gdzY7XG4gICAgb1s3XSA9IHc3O1xuICAgIG9bOF0gPSB3ODtcbiAgICBvWzldID0gdzk7XG4gICAgb1sxMF0gPSB3MTA7XG4gICAgb1sxMV0gPSB3MTE7XG4gICAgb1sxMl0gPSB3MTI7XG4gICAgb1sxM10gPSB3MTM7XG4gICAgb1sxNF0gPSB3MTQ7XG4gICAgb1sxNV0gPSB3MTU7XG4gICAgb1sxNl0gPSB3MTY7XG4gICAgb1sxN10gPSB3MTc7XG4gICAgb1sxOF0gPSB3MTg7XG4gICAgaWYgKGMgIT09IDApIHtcbiAgICAgIG9bMTldID0gYztcbiAgICAgIG91dC5sZW5ndGgrKztcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfTtcblxuICAvLyBQb2x5ZmlsbCBjb21iXG4gIGlmICghTWF0aC5pbXVsKSB7XG4gICAgY29tYjEwTXVsVG8gPSBzbWFsbE11bFRvO1xuICB9XG5cbiAgZnVuY3Rpb24gYmlnTXVsVG8gKHNlbGYsIG51bSwgb3V0KSB7XG4gICAgb3V0Lm5lZ2F0aXZlID0gbnVtLm5lZ2F0aXZlIF4gc2VsZi5uZWdhdGl2ZTtcbiAgICBvdXQubGVuZ3RoID0gc2VsZi5sZW5ndGggKyBudW0ubGVuZ3RoO1xuXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICB2YXIgaG5jYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBvdXQubGVuZ3RoIC0gMTsgaysrKSB7XG4gICAgICAvLyBTdW0gYWxsIHdvcmRzIHdpdGggdGhlIHNhbWUgYGkgKyBqID0ga2AgYW5kIGFjY3VtdWxhdGUgYG5jYXJyeWAsXG4gICAgICAvLyBub3RlIHRoYXQgbmNhcnJ5IGNvdWxkIGJlID49IDB4M2ZmZmZmZlxuICAgICAgdmFyIG5jYXJyeSA9IGhuY2Fycnk7XG4gICAgICBobmNhcnJ5ID0gMDtcbiAgICAgIHZhciByd29yZCA9IGNhcnJ5ICYgMHgzZmZmZmZmO1xuICAgICAgdmFyIG1heEogPSBNYXRoLm1pbihrLCBudW0ubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBqID0gTWF0aC5tYXgoMCwgayAtIHNlbGYubGVuZ3RoICsgMSk7IGogPD0gbWF4SjsgaisrKSB7XG4gICAgICAgIHZhciBpID0gayAtIGo7XG4gICAgICAgIHZhciBhID0gc2VsZi53b3Jkc1tpXSB8IDA7XG4gICAgICAgIHZhciBiID0gbnVtLndvcmRzW2pdIHwgMDtcbiAgICAgICAgdmFyIHIgPSBhICogYjtcblxuICAgICAgICB2YXIgbG8gPSByICYgMHgzZmZmZmZmO1xuICAgICAgICBuY2FycnkgPSAobmNhcnJ5ICsgKChyIC8gMHg0MDAwMDAwKSB8IDApKSB8IDA7XG4gICAgICAgIGxvID0gKGxvICsgcndvcmQpIHwgMDtcbiAgICAgICAgcndvcmQgPSBsbyAmIDB4M2ZmZmZmZjtcbiAgICAgICAgbmNhcnJ5ID0gKG5jYXJyeSArIChsbyA+Pj4gMjYpKSB8IDA7XG5cbiAgICAgICAgaG5jYXJyeSArPSBuY2FycnkgPj4+IDI2O1xuICAgICAgICBuY2FycnkgJj0gMHgzZmZmZmZmO1xuICAgICAgfVxuICAgICAgb3V0LndvcmRzW2tdID0gcndvcmQ7XG4gICAgICBjYXJyeSA9IG5jYXJyeTtcbiAgICAgIG5jYXJyeSA9IGhuY2Fycnk7XG4gICAgfVxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgb3V0LndvcmRzW2tdID0gY2Fycnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dC5sZW5ndGgtLTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0LnN0cmlwKCk7XG4gIH1cblxuICBmdW5jdGlvbiBqdW1ib011bFRvIChzZWxmLCBudW0sIG91dCkge1xuICAgIHZhciBmZnRtID0gbmV3IEZGVE0oKTtcbiAgICByZXR1cm4gZmZ0bS5tdWxwKHNlbGYsIG51bSwgb3V0KTtcbiAgfVxuXG4gIEJOLnByb3RvdHlwZS5tdWxUbyA9IGZ1bmN0aW9uIG11bFRvIChudW0sIG91dCkge1xuICAgIHZhciByZXM7XG4gICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoICsgbnVtLmxlbmd0aDtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEwICYmIG51bS5sZW5ndGggPT09IDEwKSB7XG4gICAgICByZXMgPSBjb21iMTBNdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gICAgfSBlbHNlIGlmIChsZW4gPCA2Mykge1xuICAgICAgcmVzID0gc21hbGxNdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gICAgfSBlbHNlIGlmIChsZW4gPCAxMDI0KSB7XG4gICAgICByZXMgPSBiaWdNdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcyA9IGp1bWJvTXVsVG8odGhpcywgbnVtLCBvdXQpO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy8gQ29vbGV5LVR1a2V5IGFsZ29yaXRobSBmb3IgRkZUXG4gIC8vIHNsaWdodGx5IHJldmlzaXRlZCB0byByZWx5IG9uIGxvb3BpbmcgaW5zdGVhZCBvZiByZWN1cnNpb25cblxuICBmdW5jdGlvbiBGRlRNICh4LCB5KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICB9XG5cbiAgRkZUTS5wcm90b3R5cGUubWFrZVJCVCA9IGZ1bmN0aW9uIG1ha2VSQlQgKE4pIHtcbiAgICB2YXIgdCA9IG5ldyBBcnJheShOKTtcbiAgICB2YXIgbCA9IEJOLnByb3RvdHlwZS5fY291bnRCaXRzKE4pIC0gMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgdFtpXSA9IHRoaXMucmV2QmluKGksIGwsIE4pO1xuICAgIH1cblxuICAgIHJldHVybiB0O1xuICB9O1xuXG4gIC8vIFJldHVybnMgYmluYXJ5LXJldmVyc2VkIHJlcHJlc2VudGF0aW9uIG9mIGB4YFxuICBGRlRNLnByb3RvdHlwZS5yZXZCaW4gPSBmdW5jdGlvbiByZXZCaW4gKHgsIGwsIE4pIHtcbiAgICBpZiAoeCA9PT0gMCB8fCB4ID09PSBOIC0gMSkgcmV0dXJuIHg7XG5cbiAgICB2YXIgcmIgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICByYiB8PSAoeCAmIDEpIDw8IChsIC0gaSAtIDEpO1xuICAgICAgeCA+Pj0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmI7XG4gIH07XG5cbiAgLy8gUGVyZm9ybXMgXCJ0d2VlZGxpbmdcIiBwaGFzZSwgdGhlcmVmb3JlICdlbXVsYXRpbmcnXG4gIC8vIGJlaGF2aW91ciBvZiB0aGUgcmVjdXJzaXZlIGFsZ29yaXRobVxuICBGRlRNLnByb3RvdHlwZS5wZXJtdXRlID0gZnVuY3Rpb24gcGVybXV0ZSAocmJ0LCByd3MsIGl3cywgcnR3cywgaXR3cywgTikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICBydHdzW2ldID0gcndzW3JidFtpXV07XG4gICAgICBpdHdzW2ldID0gaXdzW3JidFtpXV07XG4gICAgfVxuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uIHRyYW5zZm9ybSAocndzLCBpd3MsIHJ0d3MsIGl0d3MsIE4sIHJidCkge1xuICAgIHRoaXMucGVybXV0ZShyYnQsIHJ3cywgaXdzLCBydHdzLCBpdHdzLCBOKTtcblxuICAgIGZvciAodmFyIHMgPSAxOyBzIDwgTjsgcyA8PD0gMSkge1xuICAgICAgdmFyIGwgPSBzIDw8IDE7XG5cbiAgICAgIHZhciBydHdkZiA9IE1hdGguY29zKDIgKiBNYXRoLlBJIC8gbCk7XG4gICAgICB2YXIgaXR3ZGYgPSBNYXRoLnNpbigyICogTWF0aC5QSSAvIGwpO1xuXG4gICAgICBmb3IgKHZhciBwID0gMDsgcCA8IE47IHAgKz0gbCkge1xuICAgICAgICB2YXIgcnR3ZGZfID0gcnR3ZGY7XG4gICAgICAgIHZhciBpdHdkZl8gPSBpdHdkZjtcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHM7IGorKykge1xuICAgICAgICAgIHZhciByZSA9IHJ0d3NbcCArIGpdO1xuICAgICAgICAgIHZhciBpZSA9IGl0d3NbcCArIGpdO1xuXG4gICAgICAgICAgdmFyIHJvID0gcnR3c1twICsgaiArIHNdO1xuICAgICAgICAgIHZhciBpbyA9IGl0d3NbcCArIGogKyBzXTtcblxuICAgICAgICAgIHZhciByeCA9IHJ0d2RmXyAqIHJvIC0gaXR3ZGZfICogaW87XG5cbiAgICAgICAgICBpbyA9IHJ0d2RmXyAqIGlvICsgaXR3ZGZfICogcm87XG4gICAgICAgICAgcm8gPSByeDtcblxuICAgICAgICAgIHJ0d3NbcCArIGpdID0gcmUgKyBybztcbiAgICAgICAgICBpdHdzW3AgKyBqXSA9IGllICsgaW87XG5cbiAgICAgICAgICBydHdzW3AgKyBqICsgc10gPSByZSAtIHJvO1xuICAgICAgICAgIGl0d3NbcCArIGogKyBzXSA9IGllIC0gaW87XG5cbiAgICAgICAgICAvKiBqc2hpbnQgbWF4ZGVwdGggOiBmYWxzZSAqL1xuICAgICAgICAgIGlmIChqICE9PSBsKSB7XG4gICAgICAgICAgICByeCA9IHJ0d2RmICogcnR3ZGZfIC0gaXR3ZGYgKiBpdHdkZl87XG5cbiAgICAgICAgICAgIGl0d2RmXyA9IHJ0d2RmICogaXR3ZGZfICsgaXR3ZGYgKiBydHdkZl87XG4gICAgICAgICAgICBydHdkZl8gPSByeDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUuZ3Vlc3NMZW4xM2IgPSBmdW5jdGlvbiBndWVzc0xlbjEzYiAobiwgbSkge1xuICAgIHZhciBOID0gTWF0aC5tYXgobSwgbikgfCAxO1xuICAgIHZhciBvZGQgPSBOICYgMTtcbiAgICB2YXIgaSA9IDA7XG4gICAgZm9yIChOID0gTiAvIDIgfCAwOyBOOyBOID0gTiA+Pj4gMSkge1xuICAgICAgaSsrO1xuICAgIH1cblxuICAgIHJldHVybiAxIDw8IGkgKyAxICsgb2RkO1xuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLmNvbmp1Z2F0ZSA9IGZ1bmN0aW9uIGNvbmp1Z2F0ZSAocndzLCBpd3MsIE4pIHtcbiAgICBpZiAoTiA8PSAxKSByZXR1cm47XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE4gLyAyOyBpKyspIHtcbiAgICAgIHZhciB0ID0gcndzW2ldO1xuXG4gICAgICByd3NbaV0gPSByd3NbTiAtIGkgLSAxXTtcbiAgICAgIHJ3c1tOIC0gaSAtIDFdID0gdDtcblxuICAgICAgdCA9IGl3c1tpXTtcblxuICAgICAgaXdzW2ldID0gLWl3c1tOIC0gaSAtIDFdO1xuICAgICAgaXdzW04gLSBpIC0gMV0gPSAtdDtcbiAgICB9XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUubm9ybWFsaXplMTNiID0gZnVuY3Rpb24gbm9ybWFsaXplMTNiICh3cywgTikge1xuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOIC8gMjsgaSsrKSB7XG4gICAgICB2YXIgdyA9IE1hdGgucm91bmQod3NbMiAqIGkgKyAxXSAvIE4pICogMHgyMDAwICtcbiAgICAgICAgTWF0aC5yb3VuZCh3c1syICogaV0gLyBOKSArXG4gICAgICAgIGNhcnJ5O1xuXG4gICAgICB3c1tpXSA9IHcgJiAweDNmZmZmZmY7XG5cbiAgICAgIGlmICh3IDwgMHg0MDAwMDAwKSB7XG4gICAgICAgIGNhcnJ5ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhcnJ5ID0gdyAvIDB4NDAwMDAwMCB8IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHdzO1xuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLmNvbnZlcnQxM2IgPSBmdW5jdGlvbiBjb252ZXJ0MTNiICh3cywgbGVuLCByd3MsIE4pIHtcbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNhcnJ5ID0gY2FycnkgKyAod3NbaV0gfCAwKTtcblxuICAgICAgcndzWzIgKiBpXSA9IGNhcnJ5ICYgMHgxZmZmOyBjYXJyeSA9IGNhcnJ5ID4+PiAxMztcbiAgICAgIHJ3c1syICogaSArIDFdID0gY2FycnkgJiAweDFmZmY7IGNhcnJ5ID0gY2FycnkgPj4+IDEzO1xuICAgIH1cblxuICAgIC8vIFBhZCB3aXRoIHplcm9lc1xuICAgIGZvciAoaSA9IDIgKiBsZW47IGkgPCBOOyArK2kpIHtcbiAgICAgIHJ3c1tpXSA9IDA7XG4gICAgfVxuXG4gICAgYXNzZXJ0KGNhcnJ5ID09PSAwKTtcbiAgICBhc3NlcnQoKGNhcnJ5ICYgfjB4MWZmZikgPT09IDApO1xuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLnN0dWIgPSBmdW5jdGlvbiBzdHViIChOKSB7XG4gICAgdmFyIHBoID0gbmV3IEFycmF5KE4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICBwaFtpXSA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBoO1xuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLm11bHAgPSBmdW5jdGlvbiBtdWxwICh4LCB5LCBvdXQpIHtcbiAgICB2YXIgTiA9IDIgKiB0aGlzLmd1ZXNzTGVuMTNiKHgubGVuZ3RoLCB5Lmxlbmd0aCk7XG5cbiAgICB2YXIgcmJ0ID0gdGhpcy5tYWtlUkJUKE4pO1xuXG4gICAgdmFyIF8gPSB0aGlzLnN0dWIoTik7XG5cbiAgICB2YXIgcndzID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciByd3N0ID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciBpd3N0ID0gbmV3IEFycmF5KE4pO1xuXG4gICAgdmFyIG5yd3MgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIG5yd3N0ID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciBuaXdzdCA9IG5ldyBBcnJheShOKTtcblxuICAgIHZhciBybXdzID0gb3V0LndvcmRzO1xuICAgIHJtd3MubGVuZ3RoID0gTjtcblxuICAgIHRoaXMuY29udmVydDEzYih4LndvcmRzLCB4Lmxlbmd0aCwgcndzLCBOKTtcbiAgICB0aGlzLmNvbnZlcnQxM2IoeS53b3JkcywgeS5sZW5ndGgsIG5yd3MsIE4pO1xuXG4gICAgdGhpcy50cmFuc2Zvcm0ocndzLCBfLCByd3N0LCBpd3N0LCBOLCByYnQpO1xuICAgIHRoaXMudHJhbnNmb3JtKG5yd3MsIF8sIG5yd3N0LCBuaXdzdCwgTiwgcmJ0KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICB2YXIgcnggPSByd3N0W2ldICogbnJ3c3RbaV0gLSBpd3N0W2ldICogbml3c3RbaV07XG4gICAgICBpd3N0W2ldID0gcndzdFtpXSAqIG5pd3N0W2ldICsgaXdzdFtpXSAqIG5yd3N0W2ldO1xuICAgICAgcndzdFtpXSA9IHJ4O1xuICAgIH1cblxuICAgIHRoaXMuY29uanVnYXRlKHJ3c3QsIGl3c3QsIE4pO1xuICAgIHRoaXMudHJhbnNmb3JtKHJ3c3QsIGl3c3QsIHJtd3MsIF8sIE4sIHJidCk7XG4gICAgdGhpcy5jb25qdWdhdGUocm13cywgXywgTik7XG4gICAgdGhpcy5ub3JtYWxpemUxM2Iocm13cywgTik7XG5cbiAgICBvdXQubmVnYXRpdmUgPSB4Lm5lZ2F0aXZlIF4geS5uZWdhdGl2ZTtcbiAgICBvdXQubGVuZ3RoID0geC5sZW5ndGggKyB5Lmxlbmd0aDtcbiAgICByZXR1cm4gb3V0LnN0cmlwKCk7XG4gIH07XG5cbiAgLy8gTXVsdGlwbHkgYHRoaXNgIGJ5IGBudW1gXG4gIEJOLnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwgKG51bSkge1xuICAgIHZhciBvdXQgPSBuZXcgQk4obnVsbCk7XG4gICAgb3V0LndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoICsgbnVtLmxlbmd0aCk7XG4gICAgcmV0dXJuIHRoaXMubXVsVG8obnVtLCBvdXQpO1xuICB9O1xuXG4gIC8vIE11bHRpcGx5IGVtcGxveWluZyBGRlRcbiAgQk4ucHJvdG90eXBlLm11bGYgPSBmdW5jdGlvbiBtdWxmIChudW0pIHtcbiAgICB2YXIgb3V0ID0gbmV3IEJOKG51bGwpO1xuICAgIG91dC53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCArIG51bS5sZW5ndGgpO1xuICAgIHJldHVybiBqdW1ib011bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgfTtcblxuICAvLyBJbi1wbGFjZSBNdWx0aXBsaWNhdGlvblxuICBCTi5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uIGltdWwgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkubXVsVG8obnVtLCB0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaW11bG4gPSBmdW5jdGlvbiBpbXVsbiAobnVtKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBudW0gPT09ICdudW1iZXInKTtcbiAgICBhc3NlcnQobnVtIDwgMHg0MDAwMDAwKTtcblxuICAgIC8vIENhcnJ5XG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3ID0gKHRoaXMud29yZHNbaV0gfCAwKSAqIG51bTtcbiAgICAgIHZhciBsbyA9ICh3ICYgMHgzZmZmZmZmKSArIChjYXJyeSAmIDB4M2ZmZmZmZik7XG4gICAgICBjYXJyeSA+Pj0gMjY7XG4gICAgICBjYXJyeSArPSAodyAvIDB4NDAwMDAwMCkgfCAwO1xuICAgICAgLy8gTk9URTogbG8gaXMgMjdiaXQgbWF4aW11bVxuICAgICAgY2FycnkgKz0gbG8gPj4+IDI2O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IGxvICYgMHgzZmZmZmZmO1xuICAgIH1cblxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IGNhcnJ5O1xuICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubXVsbiA9IGZ1bmN0aW9uIG11bG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW11bG4obnVtKTtcbiAgfTtcblxuICAvLyBgdGhpc2AgKiBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnNxciA9IGZ1bmN0aW9uIHNxciAoKSB7XG4gICAgcmV0dXJuIHRoaXMubXVsKHRoaXMpO1xuICB9O1xuXG4gIC8vIGB0aGlzYCAqIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXNxciA9IGZ1bmN0aW9uIGlzcXIgKCkge1xuICAgIHJldHVybiB0aGlzLmltdWwodGhpcy5jbG9uZSgpKTtcbiAgfTtcblxuICAvLyBNYXRoLnBvdyhgdGhpc2AsIGBudW1gKVxuICBCTi5wcm90b3R5cGUucG93ID0gZnVuY3Rpb24gcG93IChudW0pIHtcbiAgICB2YXIgdyA9IHRvQml0QXJyYXkobnVtKTtcbiAgICBpZiAody5sZW5ndGggPT09IDApIHJldHVybiBuZXcgQk4oMSk7XG5cbiAgICAvLyBTa2lwIGxlYWRpbmcgemVyb2VzXG4gICAgdmFyIHJlcyA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3Lmxlbmd0aDsgaSsrLCByZXMgPSByZXMuc3FyKCkpIHtcbiAgICAgIGlmICh3W2ldICE9PSAwKSBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoKytpIDwgdy5sZW5ndGgpIHtcbiAgICAgIGZvciAodmFyIHEgPSByZXMuc3FyKCk7IGkgPCB3Lmxlbmd0aDsgaSsrLCBxID0gcS5zcXIoKSkge1xuICAgICAgICBpZiAod1tpXSA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgcmVzID0gcmVzLm11bChxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vIFNoaWZ0LWxlZnQgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLml1c2hsbiA9IGZ1bmN0aW9uIGl1c2hsbiAoYml0cykge1xuICAgIGFzc2VydCh0eXBlb2YgYml0cyA9PT0gJ251bWJlcicgJiYgYml0cyA+PSAwKTtcbiAgICB2YXIgciA9IGJpdHMgJSAyNjtcbiAgICB2YXIgcyA9IChiaXRzIC0gcikgLyAyNjtcbiAgICB2YXIgY2FycnlNYXNrID0gKDB4M2ZmZmZmZiA+Pj4gKDI2IC0gcikpIDw8ICgyNiAtIHIpO1xuICAgIHZhciBpO1xuXG4gICAgaWYgKHIgIT09IDApIHtcbiAgICAgIHZhciBjYXJyeSA9IDA7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBuZXdDYXJyeSA9IHRoaXMud29yZHNbaV0gJiBjYXJyeU1hc2s7XG4gICAgICAgIHZhciBjID0gKCh0aGlzLndvcmRzW2ldIHwgMCkgLSBuZXdDYXJyeSkgPDwgcjtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IGMgfCBjYXJyeTtcbiAgICAgICAgY2FycnkgPSBuZXdDYXJyeSA+Pj4gKDI2IC0gcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChjYXJyeSkge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gY2Fycnk7XG4gICAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHMgIT09IDApIHtcbiAgICAgIGZvciAoaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpICsgc10gPSB0aGlzLndvcmRzW2ldO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSAwO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxlbmd0aCArPSBzO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzaGxuID0gZnVuY3Rpb24gaXNobG4gKGJpdHMpIHtcbiAgICAvLyBUT0RPKGluZHV0bnkpOiBpbXBsZW1lbnQgbWVcbiAgICBhc3NlcnQodGhpcy5uZWdhdGl2ZSA9PT0gMCk7XG4gICAgcmV0dXJuIHRoaXMuaXVzaGxuKGJpdHMpO1xuICB9O1xuXG4gIC8vIFNoaWZ0LXJpZ2h0IGluLXBsYWNlXG4gIC8vIE5PVEU6IGBoaW50YCBpcyBhIGxvd2VzdCBiaXQgYmVmb3JlIHRyYWlsaW5nIHplcm9lc1xuICAvLyBOT1RFOiBpZiBgZXh0ZW5kZWRgIGlzIHByZXNlbnQgLSBpdCB3aWxsIGJlIGZpbGxlZCB3aXRoIGRlc3Ryb3llZCBiaXRzXG4gIEJOLnByb3RvdHlwZS5pdXNocm4gPSBmdW5jdGlvbiBpdXNocm4gKGJpdHMsIGhpbnQsIGV4dGVuZGVkKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXRzID09PSAnbnVtYmVyJyAmJiBiaXRzID49IDApO1xuICAgIHZhciBoO1xuICAgIGlmIChoaW50KSB7XG4gICAgICBoID0gKGhpbnQgLSAoaGludCAlIDI2KSkgLyAyNjtcbiAgICB9IGVsc2Uge1xuICAgICAgaCA9IDA7XG4gICAgfVxuXG4gICAgdmFyIHIgPSBiaXRzICUgMjY7XG4gICAgdmFyIHMgPSBNYXRoLm1pbigoYml0cyAtIHIpIC8gMjYsIHRoaXMubGVuZ3RoKTtcbiAgICB2YXIgbWFzayA9IDB4M2ZmZmZmZiBeICgoMHgzZmZmZmZmID4+PiByKSA8PCByKTtcbiAgICB2YXIgbWFza2VkV29yZHMgPSBleHRlbmRlZDtcblxuICAgIGggLT0gcztcbiAgICBoID0gTWF0aC5tYXgoMCwgaCk7XG5cbiAgICAvLyBFeHRlbmRlZCBtb2RlLCBjb3B5IG1hc2tlZCBwYXJ0XG4gICAgaWYgKG1hc2tlZFdvcmRzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHM7IGkrKykge1xuICAgICAgICBtYXNrZWRXb3Jkcy53b3Jkc1tpXSA9IHRoaXMud29yZHNbaV07XG4gICAgICB9XG4gICAgICBtYXNrZWRXb3Jkcy5sZW5ndGggPSBzO1xuICAgIH1cblxuICAgIGlmIChzID09PSAwKSB7XG4gICAgICAvLyBOby1vcCwgd2Ugc2hvdWxkIG5vdCBtb3ZlIGFueXRoaW5nIGF0IGFsbFxuICAgIH0gZWxzZSBpZiAodGhpcy5sZW5ndGggPiBzKSB7XG4gICAgICB0aGlzLmxlbmd0aCAtPSBzO1xuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IHRoaXMud29yZHNbaSArIHNdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLndvcmRzWzBdID0gMDtcbiAgICAgIHRoaXMubGVuZ3RoID0gMTtcbiAgICB9XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAoaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwICYmIChjYXJyeSAhPT0gMCB8fCBpID49IGgpOyBpLS0pIHtcbiAgICAgIHZhciB3b3JkID0gdGhpcy53b3Jkc1tpXSB8IDA7XG4gICAgICB0aGlzLndvcmRzW2ldID0gKGNhcnJ5IDw8ICgyNiAtIHIpKSB8ICh3b3JkID4+PiByKTtcbiAgICAgIGNhcnJ5ID0gd29yZCAmIG1hc2s7XG4gICAgfVxuXG4gICAgLy8gUHVzaCBjYXJyaWVkIGJpdHMgYXMgYSBtYXNrXG4gICAgaWYgKG1hc2tlZFdvcmRzICYmIGNhcnJ5ICE9PSAwKSB7XG4gICAgICBtYXNrZWRXb3Jkcy53b3Jkc1ttYXNrZWRXb3Jkcy5sZW5ndGgrK10gPSBjYXJyeTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMud29yZHNbMF0gPSAwO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzaHJuID0gZnVuY3Rpb24gaXNocm4gKGJpdHMsIGhpbnQsIGV4dGVuZGVkKSB7XG4gICAgLy8gVE9ETyhpbmR1dG55KTogaW1wbGVtZW50IG1lXG4gICAgYXNzZXJ0KHRoaXMubmVnYXRpdmUgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1c2hybihiaXRzLCBoaW50LCBleHRlbmRlZCk7XG4gIH07XG5cbiAgLy8gU2hpZnQtbGVmdFxuICBCTi5wcm90b3R5cGUuc2hsbiA9IGZ1bmN0aW9uIHNobG4gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzaGxuKGJpdHMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51c2hsbiA9IGZ1bmN0aW9uIHVzaGxuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNobG4oYml0cyk7XG4gIH07XG5cbiAgLy8gU2hpZnQtcmlnaHRcbiAgQk4ucHJvdG90eXBlLnNocm4gPSBmdW5jdGlvbiBzaHJuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hybihiaXRzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudXNocm4gPSBmdW5jdGlvbiB1c2hybiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXVzaHJuKGJpdHMpO1xuICB9O1xuXG4gIC8vIFRlc3QgaWYgbiBiaXQgaXMgc2V0XG4gIEJOLnByb3RvdHlwZS50ZXN0biA9IGZ1bmN0aW9uIHRlc3RuIChiaXQpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdCA9PT0gJ251bWJlcicgJiYgYml0ID49IDApO1xuICAgIHZhciByID0gYml0ICUgMjY7XG4gICAgdmFyIHMgPSAoYml0IC0gcikgLyAyNjtcbiAgICB2YXIgcSA9IDEgPDwgcjtcblxuICAgIC8vIEZhc3QgY2FzZTogYml0IGlzIG11Y2ggaGlnaGVyIHRoYW4gYWxsIGV4aXN0aW5nIHdvcmRzXG4gICAgaWYgKHRoaXMubGVuZ3RoIDw9IHMpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIENoZWNrIGJpdCBhbmQgcmV0dXJuXG4gICAgdmFyIHcgPSB0aGlzLndvcmRzW3NdO1xuXG4gICAgcmV0dXJuICEhKHcgJiBxKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gb25seSBsb3dlcnMgYml0cyBvZiBudW1iZXIgKGluLXBsYWNlKVxuICBCTi5wcm90b3R5cGUuaW1hc2tuID0gZnVuY3Rpb24gaW1hc2tuIChiaXRzKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXRzID09PSAnbnVtYmVyJyAmJiBiaXRzID49IDApO1xuICAgIHZhciByID0gYml0cyAlIDI2O1xuICAgIHZhciBzID0gKGJpdHMgLSByKSAvIDI2O1xuXG4gICAgYXNzZXJ0KHRoaXMubmVnYXRpdmUgPT09IDAsICdpbWFza24gd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlIG51bWJlcnMnKTtcblxuICAgIGlmICh0aGlzLmxlbmd0aCA8PSBzKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAociAhPT0gMCkge1xuICAgICAgcysrO1xuICAgIH1cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGgubWluKHMsIHRoaXMubGVuZ3RoKTtcblxuICAgIGlmIChyICE9PSAwKSB7XG4gICAgICB2YXIgbWFzayA9IDB4M2ZmZmZmZiBeICgoMHgzZmZmZmZmID4+PiByKSA8PCByKTtcbiAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXSAmPSBtYXNrO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG9ubHkgbG93ZXJzIGJpdHMgb2YgbnVtYmVyXG4gIEJOLnByb3RvdHlwZS5tYXNrbiA9IGZ1bmN0aW9uIG1hc2tuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbWFza24oYml0cyk7XG4gIH07XG5cbiAgLy8gQWRkIHBsYWluIG51bWJlciBgbnVtYCB0byBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLmlhZGRuID0gZnVuY3Rpb24gaWFkZG4gKG51bSkge1xuICAgIGFzc2VydCh0eXBlb2YgbnVtID09PSAnbnVtYmVyJyk7XG4gICAgYXNzZXJ0KG51bSA8IDB4NDAwMDAwMCk7XG4gICAgaWYgKG51bSA8IDApIHJldHVybiB0aGlzLmlzdWJuKC1udW0pO1xuXG4gICAgLy8gUG9zc2libGUgc2lnbiBjaGFuZ2VcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgaWYgKHRoaXMubGVuZ3RoID09PSAxICYmICh0aGlzLndvcmRzWzBdIHwgMCkgPCBudW0pIHtcbiAgICAgICAgdGhpcy53b3Jkc1swXSA9IG51bSAtICh0aGlzLndvcmRzWzBdIHwgMCk7XG4gICAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICB0aGlzLmlzdWJuKG51bSk7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCB3aXRob3V0IGNoZWNrc1xuICAgIHJldHVybiB0aGlzLl9pYWRkbihudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5faWFkZG4gPSBmdW5jdGlvbiBfaWFkZG4gKG51bSkge1xuICAgIHRoaXMud29yZHNbMF0gKz0gbnVtO1xuXG4gICAgLy8gQ2FycnlcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoICYmIHRoaXMud29yZHNbaV0gPj0gMHg0MDAwMDAwOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gLT0gMHg0MDAwMDAwO1xuICAgICAgaWYgKGkgPT09IHRoaXMubGVuZ3RoIC0gMSkge1xuICAgICAgICB0aGlzLndvcmRzW2kgKyAxXSA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLndvcmRzW2kgKyAxXSsrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGgubWF4KHRoaXMubGVuZ3RoLCBpICsgMSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBTdWJ0cmFjdCBwbGFpbiBudW1iZXIgYG51bWAgZnJvbSBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLmlzdWJuID0gZnVuY3Rpb24gaXN1Ym4gKG51bSkge1xuICAgIGFzc2VydCh0eXBlb2YgbnVtID09PSAnbnVtYmVyJyk7XG4gICAgYXNzZXJ0KG51bSA8IDB4NDAwMDAwMCk7XG4gICAgaWYgKG51bSA8IDApIHJldHVybiB0aGlzLmlhZGRuKC1udW0pO1xuXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgdGhpcy5pYWRkbihudW0pO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLndvcmRzWzBdIC09IG51bTtcblxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLndvcmRzWzBdIDwgMCkge1xuICAgICAgdGhpcy53b3Jkc1swXSA9IC10aGlzLndvcmRzWzBdO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENhcnJ5XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoICYmIHRoaXMud29yZHNbaV0gPCAwOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSArPSAweDQwMDAwMDA7XG4gICAgICAgIHRoaXMud29yZHNbaSArIDFdIC09IDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuYWRkbiA9IGZ1bmN0aW9uIGFkZG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWFkZG4obnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuc3VibiA9IGZ1bmN0aW9uIHN1Ym4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXN1Ym4obnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaWFicyA9IGZ1bmN0aW9uIGlhYnMgKCkge1xuICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmFicyA9IGZ1bmN0aW9uIGFicyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYWJzKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pc2hsbnN1Ym11bCA9IGZ1bmN0aW9uIF9pc2hsbnN1Ym11bCAobnVtLCBtdWwsIHNoaWZ0KSB7XG4gICAgdmFyIGxlbiA9IG51bS5sZW5ndGggKyBzaGlmdDtcbiAgICB2YXIgaTtcblxuICAgIHRoaXMuX2V4cGFuZChsZW4pO1xuXG4gICAgdmFyIHc7XG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICB3ID0gKHRoaXMud29yZHNbaSArIHNoaWZ0XSB8IDApICsgY2Fycnk7XG4gICAgICB2YXIgcmlnaHQgPSAobnVtLndvcmRzW2ldIHwgMCkgKiBtdWw7XG4gICAgICB3IC09IHJpZ2h0ICYgMHgzZmZmZmZmO1xuICAgICAgY2FycnkgPSAodyA+PiAyNikgLSAoKHJpZ2h0IC8gMHg0MDAwMDAwKSB8IDApO1xuICAgICAgdGhpcy53b3Jkc1tpICsgc2hpZnRdID0gdyAmIDB4M2ZmZmZmZjtcbiAgICB9XG4gICAgZm9yICg7IGkgPCB0aGlzLmxlbmd0aCAtIHNoaWZ0OyBpKyspIHtcbiAgICAgIHcgPSAodGhpcy53b3Jkc1tpICsgc2hpZnRdIHwgMCkgKyBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gdyA+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaSArIHNoaWZ0XSA9IHcgJiAweDNmZmZmZmY7XG4gICAgfVxuXG4gICAgaWYgKGNhcnJ5ID09PSAwKSByZXR1cm4gdGhpcy5zdHJpcCgpO1xuXG4gICAgLy8gU3VidHJhY3Rpb24gb3ZlcmZsb3dcbiAgICBhc3NlcnQoY2FycnkgPT09IC0xKTtcbiAgICBjYXJyeSA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHcgPSAtKHRoaXMud29yZHNbaV0gfCAwKSArIGNhcnJ5O1xuICAgICAgY2FycnkgPSB3ID4+IDI2O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHcgJiAweDNmZmZmZmY7XG4gICAgfVxuICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX3dvcmREaXYgPSBmdW5jdGlvbiBfd29yZERpdiAobnVtLCBtb2RlKSB7XG4gICAgdmFyIHNoaWZ0ID0gdGhpcy5sZW5ndGggLSBudW0ubGVuZ3RoO1xuXG4gICAgdmFyIGEgPSB0aGlzLmNsb25lKCk7XG4gICAgdmFyIGIgPSBudW07XG5cbiAgICAvLyBOb3JtYWxpemVcbiAgICB2YXIgYmhpID0gYi53b3Jkc1tiLmxlbmd0aCAtIDFdIHwgMDtcbiAgICB2YXIgYmhpQml0cyA9IHRoaXMuX2NvdW50Qml0cyhiaGkpO1xuICAgIHNoaWZ0ID0gMjYgLSBiaGlCaXRzO1xuICAgIGlmIChzaGlmdCAhPT0gMCkge1xuICAgICAgYiA9IGIudXNobG4oc2hpZnQpO1xuICAgICAgYS5pdXNobG4oc2hpZnQpO1xuICAgICAgYmhpID0gYi53b3Jkc1tiLmxlbmd0aCAtIDFdIHwgMDtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHF1b3RpZW50XG4gICAgdmFyIG0gPSBhLmxlbmd0aCAtIGIubGVuZ3RoO1xuICAgIHZhciBxO1xuXG4gICAgaWYgKG1vZGUgIT09ICdtb2QnKSB7XG4gICAgICBxID0gbmV3IEJOKG51bGwpO1xuICAgICAgcS5sZW5ndGggPSBtICsgMTtcbiAgICAgIHEud29yZHMgPSBuZXcgQXJyYXkocS5sZW5ndGgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHEud29yZHNbaV0gPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkaWZmID0gYS5jbG9uZSgpLl9pc2hsbnN1Ym11bChiLCAxLCBtKTtcbiAgICBpZiAoZGlmZi5uZWdhdGl2ZSA9PT0gMCkge1xuICAgICAgYSA9IGRpZmY7XG4gICAgICBpZiAocSkge1xuICAgICAgICBxLndvcmRzW21dID0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBqID0gbSAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICB2YXIgcWogPSAoYS53b3Jkc1tiLmxlbmd0aCArIGpdIHwgMCkgKiAweDQwMDAwMDAgK1xuICAgICAgICAoYS53b3Jkc1tiLmxlbmd0aCArIGogLSAxXSB8IDApO1xuXG4gICAgICAvLyBOT1RFOiAocWogLyBiaGkpIGlzICgweDNmZmZmZmYgKiAweDQwMDAwMDAgKyAweDNmZmZmZmYpIC8gMHgyMDAwMDAwIG1heFxuICAgICAgLy8gKDB4N2ZmZmZmZilcbiAgICAgIHFqID0gTWF0aC5taW4oKHFqIC8gYmhpKSB8IDAsIDB4M2ZmZmZmZik7XG5cbiAgICAgIGEuX2lzaGxuc3VibXVsKGIsIHFqLCBqKTtcbiAgICAgIHdoaWxlIChhLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgIHFqLS07XG4gICAgICAgIGEubmVnYXRpdmUgPSAwO1xuICAgICAgICBhLl9pc2hsbnN1Ym11bChiLCAxLCBqKTtcbiAgICAgICAgaWYgKCFhLmlzWmVybygpKSB7XG4gICAgICAgICAgYS5uZWdhdGl2ZSBePSAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocSkge1xuICAgICAgICBxLndvcmRzW2pdID0gcWo7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChxKSB7XG4gICAgICBxLnN0cmlwKCk7XG4gICAgfVxuICAgIGEuc3RyaXAoKTtcblxuICAgIC8vIERlbm9ybWFsaXplXG4gICAgaWYgKG1vZGUgIT09ICdkaXYnICYmIHNoaWZ0ICE9PSAwKSB7XG4gICAgICBhLml1c2hybihzaGlmdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpdjogcSB8fCBudWxsLFxuICAgICAgbW9kOiBhXG4gICAgfTtcbiAgfTtcblxuICAvLyBOT1RFOiAxKSBgbW9kZWAgY2FuIGJlIHNldCB0byBgbW9kYCB0byByZXF1ZXN0IG1vZCBvbmx5LFxuICAvLyAgICAgICB0byBgZGl2YCB0byByZXF1ZXN0IGRpdiBvbmx5LCBvciBiZSBhYnNlbnQgdG9cbiAgLy8gICAgICAgcmVxdWVzdCBib3RoIGRpdiAmIG1vZFxuICAvLyAgICAgICAyKSBgcG9zaXRpdmVgIGlzIHRydWUgaWYgdW5zaWduZWQgbW9kIGlzIHJlcXVlc3RlZFxuICBCTi5wcm90b3R5cGUuZGl2bW9kID0gZnVuY3Rpb24gZGl2bW9kIChudW0sIG1vZGUsIHBvc2l0aXZlKSB7XG4gICAgYXNzZXJ0KCFudW0uaXNaZXJvKCkpO1xuXG4gICAgaWYgKHRoaXMuaXNaZXJvKCkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogbmV3IEJOKDApLFxuICAgICAgICBtb2Q6IG5ldyBCTigwKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgZGl2LCBtb2QsIHJlcztcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiBudW0ubmVnYXRpdmUgPT09IDApIHtcbiAgICAgIHJlcyA9IHRoaXMubmVnKCkuZGl2bW9kKG51bSwgbW9kZSk7XG5cbiAgICAgIGlmIChtb2RlICE9PSAnbW9kJykge1xuICAgICAgICBkaXYgPSByZXMuZGl2Lm5lZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAobW9kZSAhPT0gJ2RpdicpIHtcbiAgICAgICAgbW9kID0gcmVzLm1vZC5uZWcoKTtcbiAgICAgICAgaWYgKHBvc2l0aXZlICYmIG1vZC5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgICAgIG1vZC5pYWRkKG51bSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiBkaXYsXG4gICAgICAgIG1vZDogbW9kXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIG51bS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgcmVzID0gdGhpcy5kaXZtb2QobnVtLm5lZygpLCBtb2RlKTtcblxuICAgICAgaWYgKG1vZGUgIT09ICdtb2QnKSB7XG4gICAgICAgIGRpdiA9IHJlcy5kaXYubmVnKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogZGl2LFxuICAgICAgICBtb2Q6IHJlcy5tb2RcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCh0aGlzLm5lZ2F0aXZlICYgbnVtLm5lZ2F0aXZlKSAhPT0gMCkge1xuICAgICAgcmVzID0gdGhpcy5uZWcoKS5kaXZtb2QobnVtLm5lZygpLCBtb2RlKTtcblxuICAgICAgaWYgKG1vZGUgIT09ICdkaXYnKSB7XG4gICAgICAgIG1vZCA9IHJlcy5tb2QubmVnKCk7XG4gICAgICAgIGlmIChwb3NpdGl2ZSAmJiBtb2QubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgICBtb2QuaXN1YihudW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogcmVzLmRpdixcbiAgICAgICAgbW9kOiBtb2RcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQm90aCBudW1iZXJzIGFyZSBwb3NpdGl2ZSBhdCB0aGlzIHBvaW50XG5cbiAgICAvLyBTdHJpcCBib3RoIG51bWJlcnMgdG8gYXBwcm94aW1hdGUgc2hpZnQgdmFsdWVcbiAgICBpZiAobnVtLmxlbmd0aCA+IHRoaXMubGVuZ3RoIHx8IHRoaXMuY21wKG51bSkgPCAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IG5ldyBCTigwKSxcbiAgICAgICAgbW9kOiB0aGlzXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFZlcnkgc2hvcnQgcmVkdWN0aW9uXG4gICAgaWYgKG51bS5sZW5ndGggPT09IDEpIHtcbiAgICAgIGlmIChtb2RlID09PSAnZGl2Jykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRpdjogdGhpcy5kaXZuKG51bS53b3Jkc1swXSksXG4gICAgICAgICAgbW9kOiBudWxsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChtb2RlID09PSAnbW9kJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRpdjogbnVsbCxcbiAgICAgICAgICBtb2Q6IG5ldyBCTih0aGlzLm1vZG4obnVtLndvcmRzWzBdKSlcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiB0aGlzLmRpdm4obnVtLndvcmRzWzBdKSxcbiAgICAgICAgbW9kOiBuZXcgQk4odGhpcy5tb2RuKG51bS53b3Jkc1swXSkpXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl93b3JkRGl2KG51bSwgbW9kZSk7XG4gIH07XG5cbiAgLy8gRmluZCBgdGhpc2AgLyBgbnVtYFxuICBCTi5wcm90b3R5cGUuZGl2ID0gZnVuY3Rpb24gZGl2IChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5kaXZtb2QobnVtLCAnZGl2JywgZmFsc2UpLmRpdjtcbiAgfTtcblxuICAvLyBGaW5kIGB0aGlzYCAlIGBudW1gXG4gIEJOLnByb3RvdHlwZS5tb2QgPSBmdW5jdGlvbiBtb2QgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmRpdm1vZChudW0sICdtb2QnLCBmYWxzZSkubW9kO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51bW9kID0gZnVuY3Rpb24gdW1vZCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuZGl2bW9kKG51bSwgJ21vZCcsIHRydWUpLm1vZDtcbiAgfTtcblxuICAvLyBGaW5kIFJvdW5kKGB0aGlzYCAvIGBudW1gKVxuICBCTi5wcm90b3R5cGUuZGl2Um91bmQgPSBmdW5jdGlvbiBkaXZSb3VuZCAobnVtKSB7XG4gICAgdmFyIGRtID0gdGhpcy5kaXZtb2QobnVtKTtcblxuICAgIC8vIEZhc3QgY2FzZSAtIGV4YWN0IGRpdmlzaW9uXG4gICAgaWYgKGRtLm1vZC5pc1plcm8oKSkgcmV0dXJuIGRtLmRpdjtcblxuICAgIHZhciBtb2QgPSBkbS5kaXYubmVnYXRpdmUgIT09IDAgPyBkbS5tb2QuaXN1YihudW0pIDogZG0ubW9kO1xuXG4gICAgdmFyIGhhbGYgPSBudW0udXNocm4oMSk7XG4gICAgdmFyIHIyID0gbnVtLmFuZGxuKDEpO1xuICAgIHZhciBjbXAgPSBtb2QuY21wKGhhbGYpO1xuXG4gICAgLy8gUm91bmQgZG93blxuICAgIGlmIChjbXAgPCAwIHx8IHIyID09PSAxICYmIGNtcCA9PT0gMCkgcmV0dXJuIGRtLmRpdjtcblxuICAgIC8vIFJvdW5kIHVwXG4gICAgcmV0dXJuIGRtLmRpdi5uZWdhdGl2ZSAhPT0gMCA/IGRtLmRpdi5pc3VibigxKSA6IGRtLmRpdi5pYWRkbigxKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubW9kbiA9IGZ1bmN0aW9uIG1vZG4gKG51bSkge1xuICAgIGFzc2VydChudW0gPD0gMHgzZmZmZmZmKTtcbiAgICB2YXIgcCA9ICgxIDw8IDI2KSAlIG51bTtcblxuICAgIHZhciBhY2MgPSAwO1xuICAgIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBhY2MgPSAocCAqIGFjYyArICh0aGlzLndvcmRzW2ldIHwgMCkpICUgbnVtO1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH07XG5cbiAgLy8gSW4tcGxhY2UgZGl2aXNpb24gYnkgbnVtYmVyXG4gIEJOLnByb3RvdHlwZS5pZGl2biA9IGZ1bmN0aW9uIGlkaXZuIChudW0pIHtcbiAgICBhc3NlcnQobnVtIDw9IDB4M2ZmZmZmZik7XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgdyA9ICh0aGlzLndvcmRzW2ldIHwgMCkgKyBjYXJyeSAqIDB4NDAwMDAwMDtcbiAgICAgIHRoaXMud29yZHNbaV0gPSAodyAvIG51bSkgfCAwO1xuICAgICAgY2FycnkgPSB3ICUgbnVtO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmRpdm4gPSBmdW5jdGlvbiBkaXZuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlkaXZuKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmVnY2QgPSBmdW5jdGlvbiBlZ2NkIChwKSB7XG4gICAgYXNzZXJ0KHAubmVnYXRpdmUgPT09IDApO1xuICAgIGFzc2VydCghcC5pc1plcm8oKSk7XG5cbiAgICB2YXIgeCA9IHRoaXM7XG4gICAgdmFyIHkgPSBwLmNsb25lKCk7XG5cbiAgICBpZiAoeC5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgeCA9IHgudW1vZChwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IHguY2xvbmUoKTtcbiAgICB9XG5cbiAgICAvLyBBICogeCArIEIgKiB5ID0geFxuICAgIHZhciBBID0gbmV3IEJOKDEpO1xuICAgIHZhciBCID0gbmV3IEJOKDApO1xuXG4gICAgLy8gQyAqIHggKyBEICogeSA9IHlcbiAgICB2YXIgQyA9IG5ldyBCTigwKTtcbiAgICB2YXIgRCA9IG5ldyBCTigxKTtcblxuICAgIHZhciBnID0gMDtcblxuICAgIHdoaWxlICh4LmlzRXZlbigpICYmIHkuaXNFdmVuKCkpIHtcbiAgICAgIHguaXVzaHJuKDEpO1xuICAgICAgeS5pdXNocm4oMSk7XG4gICAgICArK2c7XG4gICAgfVxuXG4gICAgdmFyIHlwID0geS5jbG9uZSgpO1xuICAgIHZhciB4cCA9IHguY2xvbmUoKTtcblxuICAgIHdoaWxlICgheC5pc1plcm8oKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGltID0gMTsgKHgud29yZHNbMF0gJiBpbSkgPT09IDAgJiYgaSA8IDI2OyArK2ksIGltIDw8PSAxKTtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICB4Lml1c2hybihpKTtcbiAgICAgICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgICAgICBpZiAoQS5pc09kZCgpIHx8IEIuaXNPZGQoKSkge1xuICAgICAgICAgICAgQS5pYWRkKHlwKTtcbiAgICAgICAgICAgIEIuaXN1Yih4cCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQS5pdXNocm4oMSk7XG4gICAgICAgICAgQi5pdXNocm4oMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaiA9IDAsIGptID0gMTsgKHkud29yZHNbMF0gJiBqbSkgPT09IDAgJiYgaiA8IDI2OyArK2osIGptIDw8PSAxKTtcbiAgICAgIGlmIChqID4gMCkge1xuICAgICAgICB5Lml1c2hybihqKTtcbiAgICAgICAgd2hpbGUgKGotLSA+IDApIHtcbiAgICAgICAgICBpZiAoQy5pc09kZCgpIHx8IEQuaXNPZGQoKSkge1xuICAgICAgICAgICAgQy5pYWRkKHlwKTtcbiAgICAgICAgICAgIEQuaXN1Yih4cCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQy5pdXNocm4oMSk7XG4gICAgICAgICAgRC5pdXNocm4oMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHguY21wKHkpID49IDApIHtcbiAgICAgICAgeC5pc3ViKHkpO1xuICAgICAgICBBLmlzdWIoQyk7XG4gICAgICAgIEIuaXN1YihEKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHkuaXN1Yih4KTtcbiAgICAgICAgQy5pc3ViKEEpO1xuICAgICAgICBELmlzdWIoQik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGE6IEMsXG4gICAgICBiOiBELFxuICAgICAgZ2NkOiB5Lml1c2hsbihnKVxuICAgIH07XG4gIH07XG5cbiAgLy8gVGhpcyBpcyByZWR1Y2VkIGluY2FybmF0aW9uIG9mIHRoZSBiaW5hcnkgRUVBXG4gIC8vIGFib3ZlLCBkZXNpZ25hdGVkIHRvIGludmVydCBtZW1iZXJzIG9mIHRoZVxuICAvLyBfcHJpbWVfIGZpZWxkcyBGKHApIGF0IGEgbWF4aW1hbCBzcGVlZFxuICBCTi5wcm90b3R5cGUuX2ludm1wID0gZnVuY3Rpb24gX2ludm1wIChwKSB7XG4gICAgYXNzZXJ0KHAubmVnYXRpdmUgPT09IDApO1xuICAgIGFzc2VydCghcC5pc1plcm8oKSk7XG5cbiAgICB2YXIgYSA9IHRoaXM7XG4gICAgdmFyIGIgPSBwLmNsb25lKCk7XG5cbiAgICBpZiAoYS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgYSA9IGEudW1vZChwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IGEuY2xvbmUoKTtcbiAgICB9XG5cbiAgICB2YXIgeDEgPSBuZXcgQk4oMSk7XG4gICAgdmFyIHgyID0gbmV3IEJOKDApO1xuXG4gICAgdmFyIGRlbHRhID0gYi5jbG9uZSgpO1xuXG4gICAgd2hpbGUgKGEuY21wbigxKSA+IDAgJiYgYi5jbXBuKDEpID4gMCkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGltID0gMTsgKGEud29yZHNbMF0gJiBpbSkgPT09IDAgJiYgaSA8IDI2OyArK2ksIGltIDw8PSAxKTtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICBhLml1c2hybihpKTtcbiAgICAgICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgICAgICBpZiAoeDEuaXNPZGQoKSkge1xuICAgICAgICAgICAgeDEuaWFkZChkZWx0YSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgeDEuaXVzaHJuKDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGogPSAwLCBqbSA9IDE7IChiLndvcmRzWzBdICYgam0pID09PSAwICYmIGogPCAyNjsgKytqLCBqbSA8PD0gMSk7XG4gICAgICBpZiAoaiA+IDApIHtcbiAgICAgICAgYi5pdXNocm4oaik7XG4gICAgICAgIHdoaWxlIChqLS0gPiAwKSB7XG4gICAgICAgICAgaWYgKHgyLmlzT2RkKCkpIHtcbiAgICAgICAgICAgIHgyLmlhZGQoZGVsdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHgyLml1c2hybigxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYS5jbXAoYikgPj0gMCkge1xuICAgICAgICBhLmlzdWIoYik7XG4gICAgICAgIHgxLmlzdWIoeDIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYi5pc3ViKGEpO1xuICAgICAgICB4Mi5pc3ViKHgxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcmVzO1xuICAgIGlmIChhLmNtcG4oMSkgPT09IDApIHtcbiAgICAgIHJlcyA9IHgxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMgPSB4MjtcbiAgICB9XG5cbiAgICBpZiAocmVzLmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMuaWFkZChwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5nY2QgPSBmdW5jdGlvbiBnY2QgKG51bSkge1xuICAgIGlmICh0aGlzLmlzWmVybygpKSByZXR1cm4gbnVtLmFicygpO1xuICAgIGlmIChudW0uaXNaZXJvKCkpIHJldHVybiB0aGlzLmFicygpO1xuXG4gICAgdmFyIGEgPSB0aGlzLmNsb25lKCk7XG4gICAgdmFyIGIgPSBudW0uY2xvbmUoKTtcbiAgICBhLm5lZ2F0aXZlID0gMDtcbiAgICBiLm5lZ2F0aXZlID0gMDtcblxuICAgIC8vIFJlbW92ZSBjb21tb24gZmFjdG9yIG9mIHR3b1xuICAgIGZvciAodmFyIHNoaWZ0ID0gMDsgYS5pc0V2ZW4oKSAmJiBiLmlzRXZlbigpOyBzaGlmdCsrKSB7XG4gICAgICBhLml1c2hybigxKTtcbiAgICAgIGIuaXVzaHJuKDEpO1xuICAgIH1cblxuICAgIGRvIHtcbiAgICAgIHdoaWxlIChhLmlzRXZlbigpKSB7XG4gICAgICAgIGEuaXVzaHJuKDEpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKGIuaXNFdmVuKCkpIHtcbiAgICAgICAgYi5pdXNocm4oMSk7XG4gICAgICB9XG5cbiAgICAgIHZhciByID0gYS5jbXAoYik7XG4gICAgICBpZiAociA8IDApIHtcbiAgICAgICAgLy8gU3dhcCBgYWAgYW5kIGBiYCB0byBtYWtlIGBhYCBhbHdheXMgYmlnZ2VyIHRoYW4gYGJgXG4gICAgICAgIHZhciB0ID0gYTtcbiAgICAgICAgYSA9IGI7XG4gICAgICAgIGIgPSB0O1xuICAgICAgfSBlbHNlIGlmIChyID09PSAwIHx8IGIuY21wbigxKSA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgYS5pc3ViKGIpO1xuICAgIH0gd2hpbGUgKHRydWUpO1xuXG4gICAgcmV0dXJuIGIuaXVzaGxuKHNoaWZ0KTtcbiAgfTtcblxuICAvLyBJbnZlcnQgbnVtYmVyIGluIHRoZSBmaWVsZCBGKG51bSlcbiAgQk4ucHJvdG90eXBlLmludm0gPSBmdW5jdGlvbiBpbnZtIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5lZ2NkKG51bSkuYS51bW9kKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzRXZlbiA9IGZ1bmN0aW9uIGlzRXZlbiAoKSB7XG4gICAgcmV0dXJuICh0aGlzLndvcmRzWzBdICYgMSkgPT09IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzT2RkID0gZnVuY3Rpb24gaXNPZGQgKCkge1xuICAgIHJldHVybiAodGhpcy53b3Jkc1swXSAmIDEpID09PSAxO1xuICB9O1xuXG4gIC8vIEFuZCBmaXJzdCB3b3JkIGFuZCBudW1cbiAgQk4ucHJvdG90eXBlLmFuZGxuID0gZnVuY3Rpb24gYW5kbG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLndvcmRzWzBdICYgbnVtO1xuICB9O1xuXG4gIC8vIEluY3JlbWVudCBhdCB0aGUgYml0IHBvc2l0aW9uIGluLWxpbmVcbiAgQk4ucHJvdG90eXBlLmJpbmNuID0gZnVuY3Rpb24gYmluY24gKGJpdCkge1xuICAgIGFzc2VydCh0eXBlb2YgYml0ID09PSAnbnVtYmVyJyk7XG4gICAgdmFyIHIgPSBiaXQgJSAyNjtcbiAgICB2YXIgcyA9IChiaXQgLSByKSAvIDI2O1xuICAgIHZhciBxID0gMSA8PCByO1xuXG4gICAgLy8gRmFzdCBjYXNlOiBiaXQgaXMgbXVjaCBoaWdoZXIgdGhhbiBhbGwgZXhpc3Rpbmcgd29yZHNcbiAgICBpZiAodGhpcy5sZW5ndGggPD0gcykge1xuICAgICAgdGhpcy5fZXhwYW5kKHMgKyAxKTtcbiAgICAgIHRoaXMud29yZHNbc10gfD0gcTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBiaXQgYW5kIHByb3BhZ2F0ZSwgaWYgbmVlZGVkXG4gICAgdmFyIGNhcnJ5ID0gcTtcbiAgICBmb3IgKHZhciBpID0gczsgY2FycnkgIT09IDAgJiYgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3ID0gdGhpcy53b3Jkc1tpXSB8IDA7XG4gICAgICB3ICs9IGNhcnJ5O1xuICAgICAgY2FycnkgPSB3ID4+PiAyNjtcbiAgICAgIHcgJj0gMHgzZmZmZmZmO1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHc7XG4gICAgfVxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IGNhcnJ5O1xuICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzWmVybyA9IGZ1bmN0aW9uIGlzWmVybyAoKSB7XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPT09IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmNtcG4gPSBmdW5jdGlvbiBjbXBuIChudW0pIHtcbiAgICB2YXIgbmVnYXRpdmUgPSBudW0gPCAwO1xuXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgIW5lZ2F0aXZlKSByZXR1cm4gLTE7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgbmVnYXRpdmUpIHJldHVybiAxO1xuXG4gICAgdGhpcy5zdHJpcCgpO1xuXG4gICAgdmFyIHJlcztcbiAgICBpZiAodGhpcy5sZW5ndGggPiAxKSB7XG4gICAgICByZXMgPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobmVnYXRpdmUpIHtcbiAgICAgICAgbnVtID0gLW51bTtcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0KG51bSA8PSAweDNmZmZmZmYsICdOdW1iZXIgaXMgdG9vIGJpZycpO1xuXG4gICAgICB2YXIgdyA9IHRoaXMud29yZHNbMF0gfCAwO1xuICAgICAgcmVzID0gdyA9PT0gbnVtID8gMCA6IHcgPCBudW0gPyAtMSA6IDE7XG4gICAgfVxuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSByZXR1cm4gLXJlcyB8IDA7XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvLyBDb21wYXJlIHR3byBudW1iZXJzIGFuZCByZXR1cm46XG4gIC8vIDEgLSBpZiBgdGhpc2AgPiBgbnVtYFxuICAvLyAwIC0gaWYgYHRoaXNgID09IGBudW1gXG4gIC8vIC0xIC0gaWYgYHRoaXNgIDwgYG51bWBcbiAgQk4ucHJvdG90eXBlLmNtcCA9IGZ1bmN0aW9uIGNtcCAobnVtKSB7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgbnVtLm5lZ2F0aXZlID09PSAwKSByZXR1cm4gLTE7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgbnVtLm5lZ2F0aXZlICE9PSAwKSByZXR1cm4gMTtcblxuICAgIHZhciByZXMgPSB0aGlzLnVjbXAobnVtKTtcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkgcmV0dXJuIC1yZXMgfCAwO1xuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy8gVW5zaWduZWQgY29tcGFyaXNvblxuICBCTi5wcm90b3R5cGUudWNtcCA9IGZ1bmN0aW9uIHVjbXAgKG51bSkge1xuICAgIC8vIEF0IHRoaXMgcG9pbnQgYm90aCBudW1iZXJzIGhhdmUgdGhlIHNhbWUgc2lnblxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiAxO1xuICAgIGlmICh0aGlzLmxlbmd0aCA8IG51bS5sZW5ndGgpIHJldHVybiAtMTtcblxuICAgIHZhciByZXMgPSAwO1xuICAgIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgYSA9IHRoaXMud29yZHNbaV0gfCAwO1xuICAgICAgdmFyIGIgPSBudW0ud29yZHNbaV0gfCAwO1xuXG4gICAgICBpZiAoYSA9PT0gYikgY29udGludWU7XG4gICAgICBpZiAoYSA8IGIpIHtcbiAgICAgICAgcmVzID0gLTE7XG4gICAgICB9IGVsc2UgaWYgKGEgPiBiKSB7XG4gICAgICAgIHJlcyA9IDE7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZ3RuID0gZnVuY3Rpb24gZ3RuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXBuKG51bSkgPT09IDE7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmd0ID0gZnVuY3Rpb24gZ3QgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pID09PSAxO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ndGVuID0gZnVuY3Rpb24gZ3RlbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pID49IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmd0ZSA9IGZ1bmN0aW9uIGd0ZSAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPj0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubHRuID0gZnVuY3Rpb24gbHRuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXBuKG51bSkgPT09IC0xO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5sdCA9IGZ1bmN0aW9uIGx0IChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXAobnVtKSA9PT0gLTE7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmx0ZW4gPSBmdW5jdGlvbiBsdGVuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXBuKG51bSkgPD0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubHRlID0gZnVuY3Rpb24gbHRlIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXAobnVtKSA8PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5lcW4gPSBmdW5jdGlvbiBlcW4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcG4obnVtKSA9PT0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcSAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPT09IDA7XG4gIH07XG5cbiAgLy9cbiAgLy8gQSByZWR1Y2UgY29udGV4dCwgY291bGQgYmUgdXNpbmcgbW9udGdvbWVyeSBvciBzb21ldGhpbmcgYmV0dGVyLCBkZXBlbmRpbmdcbiAgLy8gb24gdGhlIGBtYCBpdHNlbGYuXG4gIC8vXG4gIEJOLnJlZCA9IGZ1bmN0aW9uIHJlZCAobnVtKSB7XG4gICAgcmV0dXJuIG5ldyBSZWQobnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9SZWQgPSBmdW5jdGlvbiB0b1JlZCAoY3R4KSB7XG4gICAgYXNzZXJ0KCF0aGlzLnJlZCwgJ0FscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHQnKTtcbiAgICBhc3NlcnQodGhpcy5uZWdhdGl2ZSA9PT0gMCwgJ3JlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzJyk7XG4gICAgcmV0dXJuIGN0eC5jb252ZXJ0VG8odGhpcykuX2ZvcmNlUmVkKGN0eCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmZyb21SZWQgPSBmdW5jdGlvbiBmcm9tUmVkICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdmcm9tUmVkIHdvcmtzIG9ubHkgd2l0aCBudW1iZXJzIGluIHJlZHVjdGlvbiBjb250ZXh0Jyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmNvbnZlcnRGcm9tKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5fZm9yY2VSZWQgPSBmdW5jdGlvbiBfZm9yY2VSZWQgKGN0eCkge1xuICAgIHRoaXMucmVkID0gY3R4O1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5mb3JjZVJlZCA9IGZ1bmN0aW9uIGZvcmNlUmVkIChjdHgpIHtcbiAgICBhc3NlcnQoIXRoaXMucmVkLCAnQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dCcpO1xuICAgIHJldHVybiB0aGlzLl9mb3JjZVJlZChjdHgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRBZGQgPSBmdW5jdGlvbiByZWRBZGQgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZEFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuYWRkKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZElBZGQgPSBmdW5jdGlvbiByZWRJQWRkIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRJQWRkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5pYWRkKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZFN1YiA9IGZ1bmN0aW9uIHJlZFN1YiAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkU3ViIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5zdWIodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkSVN1YiA9IGZ1bmN0aW9uIHJlZElTdWIgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZElTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmlzdWIodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkU2hsID0gZnVuY3Rpb24gcmVkU2hsIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRTaGwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLnNobCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRNdWwgPSBmdW5jdGlvbiByZWRNdWwgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLCBudW0pO1xuICAgIHJldHVybiB0aGlzLnJlZC5tdWwodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkSU11bCA9IGZ1bmN0aW9uIHJlZElNdWwgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLCBudW0pO1xuICAgIHJldHVybiB0aGlzLnJlZC5pbXVsKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZFNxciA9IGZ1bmN0aW9uIHJlZFNxciAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkU3FyIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5zcXIodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZElTcXIgPSBmdW5jdGlvbiByZWRJU3FyICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRJU3FyIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5pc3FyKHRoaXMpO1xuICB9O1xuXG4gIC8vIFNxdWFyZSByb290IG92ZXIgcFxuICBCTi5wcm90b3R5cGUucmVkU3FydCA9IGZ1bmN0aW9uIHJlZFNxcnQgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZFNxcnQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLnNxcnQodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZEludm0gPSBmdW5jdGlvbiByZWRJbnZtICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRJbnZtIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5pbnZtKHRoaXMpO1xuICB9O1xuXG4gIC8vIFJldHVybiBuZWdhdGl2ZSBjbG9uZSBvZiBgdGhpc2AgJSBgcmVkIG1vZHVsb2BcbiAgQk4ucHJvdG90eXBlLnJlZE5lZyA9IGZ1bmN0aW9uIHJlZE5lZyAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkTmVnIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5uZWcodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZFBvdyA9IGZ1bmN0aW9uIHJlZFBvdyAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkICYmICFudW0ucmVkLCAncmVkUG93KG5vcm1hbE51bSknKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQucG93KHRoaXMsIG51bSk7XG4gIH07XG5cbiAgLy8gUHJpbWUgbnVtYmVycyB3aXRoIGVmZmljaWVudCByZWR1Y3Rpb25cbiAgdmFyIHByaW1lcyA9IHtcbiAgICBrMjU2OiBudWxsLFxuICAgIHAyMjQ6IG51bGwsXG4gICAgcDE5MjogbnVsbCxcbiAgICBwMjU1MTk6IG51bGxcbiAgfTtcblxuICAvLyBQc2V1ZG8tTWVyc2VubmUgcHJpbWVcbiAgZnVuY3Rpb24gTVByaW1lIChuYW1lLCBwKSB7XG4gICAgLy8gUCA9IDIgXiBOIC0gS1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5wID0gbmV3IEJOKHAsIDE2KTtcbiAgICB0aGlzLm4gPSB0aGlzLnAuYml0TGVuZ3RoKCk7XG4gICAgdGhpcy5rID0gbmV3IEJOKDEpLml1c2hsbih0aGlzLm4pLmlzdWIodGhpcy5wKTtcblxuICAgIHRoaXMudG1wID0gdGhpcy5fdG1wKCk7XG4gIH1cblxuICBNUHJpbWUucHJvdG90eXBlLl90bXAgPSBmdW5jdGlvbiBfdG1wICgpIHtcbiAgICB2YXIgdG1wID0gbmV3IEJOKG51bGwpO1xuICAgIHRtcC53b3JkcyA9IG5ldyBBcnJheShNYXRoLmNlaWwodGhpcy5uIC8gMTMpKTtcbiAgICByZXR1cm4gdG1wO1xuICB9O1xuXG4gIE1QcmltZS5wcm90b3R5cGUuaXJlZHVjZSA9IGZ1bmN0aW9uIGlyZWR1Y2UgKG51bSkge1xuICAgIC8vIEFzc3VtZXMgdGhhdCBgbnVtYCBpcyBsZXNzIHRoYW4gYFBeMmBcbiAgICAvLyBudW0gPSBISSAqICgyIF4gTiAtIEspICsgSEkgKiBLICsgTE8gPSBISSAqIEsgKyBMTyAobW9kIFApXG4gICAgdmFyIHIgPSBudW07XG4gICAgdmFyIHJsZW47XG5cbiAgICBkbyB7XG4gICAgICB0aGlzLnNwbGl0KHIsIHRoaXMudG1wKTtcbiAgICAgIHIgPSB0aGlzLmltdWxLKHIpO1xuICAgICAgciA9IHIuaWFkZCh0aGlzLnRtcCk7XG4gICAgICBybGVuID0gci5iaXRMZW5ndGgoKTtcbiAgICB9IHdoaWxlIChybGVuID4gdGhpcy5uKTtcblxuICAgIHZhciBjbXAgPSBybGVuIDwgdGhpcy5uID8gLTEgOiByLnVjbXAodGhpcy5wKTtcbiAgICBpZiAoY21wID09PSAwKSB7XG4gICAgICByLndvcmRzWzBdID0gMDtcbiAgICAgIHIubGVuZ3RoID0gMTtcbiAgICB9IGVsc2UgaWYgKGNtcCA+IDApIHtcbiAgICAgIHIuaXN1Yih0aGlzLnApO1xuICAgIH0gZWxzZSB7XG4gICAgICByLnN0cmlwKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgTVByaW1lLnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uIHNwbGl0IChpbnB1dCwgb3V0KSB7XG4gICAgaW5wdXQuaXVzaHJuKHRoaXMubiwgMCwgb3V0KTtcbiAgfTtcblxuICBNUHJpbWUucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24gaW11bEsgKG51bSkge1xuICAgIHJldHVybiBudW0uaW11bCh0aGlzLmspO1xuICB9O1xuXG4gIGZ1bmN0aW9uIEsyNTYgKCkge1xuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICdrMjU2JyxcbiAgICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmMyZicpO1xuICB9XG4gIGluaGVyaXRzKEsyNTYsIE1QcmltZSk7XG5cbiAgSzI1Ni5wcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbiBzcGxpdCAoaW5wdXQsIG91dHB1dCkge1xuICAgIC8vIDI1NiA9IDkgKiAyNiArIDIyXG4gICAgdmFyIG1hc2sgPSAweDNmZmZmZjtcblxuICAgIHZhciBvdXRMZW4gPSBNYXRoLm1pbihpbnB1dC5sZW5ndGgsIDkpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3V0TGVuOyBpKyspIHtcbiAgICAgIG91dHB1dC53b3Jkc1tpXSA9IGlucHV0LndvcmRzW2ldO1xuICAgIH1cbiAgICBvdXRwdXQubGVuZ3RoID0gb3V0TGVuO1xuXG4gICAgaWYgKGlucHV0Lmxlbmd0aCA8PSA5KSB7XG4gICAgICBpbnB1dC53b3Jkc1swXSA9IDA7XG4gICAgICBpbnB1dC5sZW5ndGggPSAxO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNoaWZ0IGJ5IDkgbGltYnNcbiAgICB2YXIgcHJldiA9IGlucHV0LndvcmRzWzldO1xuICAgIG91dHB1dC53b3Jkc1tvdXRwdXQubGVuZ3RoKytdID0gcHJldiAmIG1hc2s7XG5cbiAgICBmb3IgKGkgPSAxMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbmV4dCA9IGlucHV0LndvcmRzW2ldIHwgMDtcbiAgICAgIGlucHV0LndvcmRzW2kgLSAxMF0gPSAoKG5leHQgJiBtYXNrKSA8PCA0KSB8IChwcmV2ID4+PiAyMik7XG4gICAgICBwcmV2ID0gbmV4dDtcbiAgICB9XG4gICAgcHJldiA+Pj49IDIyO1xuICAgIGlucHV0LndvcmRzW2kgLSAxMF0gPSBwcmV2O1xuICAgIGlmIChwcmV2ID09PSAwICYmIGlucHV0Lmxlbmd0aCA+IDEwKSB7XG4gICAgICBpbnB1dC5sZW5ndGggLT0gMTA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlucHV0Lmxlbmd0aCAtPSA5O1xuICAgIH1cbiAgfTtcblxuICBLMjU2LnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uIGltdWxLIChudW0pIHtcbiAgICAvLyBLID0gMHgxMDAwMDAzZDEgPSBbIDB4NDAsIDB4M2QxIF1cbiAgICBudW0ud29yZHNbbnVtLmxlbmd0aF0gPSAwO1xuICAgIG51bS53b3Jkc1tudW0ubGVuZ3RoICsgMV0gPSAwO1xuICAgIG51bS5sZW5ndGggKz0gMjtcblxuICAgIC8vIGJvdW5kZWQgYXQ6IDB4NDAgKiAweDNmZmZmZmYgKyAweDNkMCA9IDB4MTAwMDAwMzkwXG4gICAgdmFyIGxvID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHcgPSBudW0ud29yZHNbaV0gfCAwO1xuICAgICAgbG8gKz0gdyAqIDB4M2QxO1xuICAgICAgbnVtLndvcmRzW2ldID0gbG8gJiAweDNmZmZmZmY7XG4gICAgICBsbyA9IHcgKiAweDQwICsgKChsbyAvIDB4NDAwMDAwMCkgfCAwKTtcbiAgICB9XG5cbiAgICAvLyBGYXN0IGxlbmd0aCByZWR1Y3Rpb25cbiAgICBpZiAobnVtLndvcmRzW251bS5sZW5ndGggLSAxXSA9PT0gMCkge1xuICAgICAgbnVtLmxlbmd0aC0tO1xuICAgICAgaWYgKG51bS53b3Jkc1tudW0ubGVuZ3RoIC0gMV0gPT09IDApIHtcbiAgICAgICAgbnVtLmxlbmd0aC0tO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVtO1xuICB9O1xuXG4gIGZ1bmN0aW9uIFAyMjQgKCkge1xuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICdwMjI0JyxcbiAgICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMScpO1xuICB9XG4gIGluaGVyaXRzKFAyMjQsIE1QcmltZSk7XG5cbiAgZnVuY3Rpb24gUDE5MiAoKSB7XG4gICAgTVByaW1lLmNhbGwoXG4gICAgICB0aGlzLFxuICAgICAgJ3AxOTInLFxuICAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmJyk7XG4gIH1cbiAgaW5oZXJpdHMoUDE5MiwgTVByaW1lKTtcblxuICBmdW5jdGlvbiBQMjU1MTkgKCkge1xuICAgIC8vIDIgXiAyNTUgLSAxOVxuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICcyNTUxOScsXG4gICAgICAnN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZCcpO1xuICB9XG4gIGluaGVyaXRzKFAyNTUxOSwgTVByaW1lKTtcblxuICBQMjU1MTkucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24gaW11bEsgKG51bSkge1xuICAgIC8vIEsgPSAweDEzXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhpID0gKG51bS53b3Jkc1tpXSB8IDApICogMHgxMyArIGNhcnJ5O1xuICAgICAgdmFyIGxvID0gaGkgJiAweDNmZmZmZmY7XG4gICAgICBoaSA+Pj49IDI2O1xuXG4gICAgICBudW0ud29yZHNbaV0gPSBsbztcbiAgICAgIGNhcnJ5ID0gaGk7XG4gICAgfVxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgbnVtLndvcmRzW251bS5sZW5ndGgrK10gPSBjYXJyeTtcbiAgICB9XG4gICAgcmV0dXJuIG51bTtcbiAgfTtcblxuICAvLyBFeHBvcnRlZCBtb3N0bHkgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHVzZSBwbGFpbiBuYW1lIGluc3RlYWRcbiAgQk4uX3ByaW1lID0gZnVuY3Rpb24gcHJpbWUgKG5hbWUpIHtcbiAgICAvLyBDYWNoZWQgdmVyc2lvbiBvZiBwcmltZVxuICAgIGlmIChwcmltZXNbbmFtZV0pIHJldHVybiBwcmltZXNbbmFtZV07XG5cbiAgICB2YXIgcHJpbWU7XG4gICAgaWYgKG5hbWUgPT09ICdrMjU2Jykge1xuICAgICAgcHJpbWUgPSBuZXcgSzI1NigpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3AyMjQnKSB7XG4gICAgICBwcmltZSA9IG5ldyBQMjI0KCk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAncDE5MicpIHtcbiAgICAgIHByaW1lID0gbmV3IFAxOTIoKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdwMjU1MTknKSB7XG4gICAgICBwcmltZSA9IG5ldyBQMjU1MTkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHByaW1lICcgKyBuYW1lKTtcbiAgICB9XG4gICAgcHJpbWVzW25hbWVdID0gcHJpbWU7XG5cbiAgICByZXR1cm4gcHJpbWU7XG4gIH07XG5cbiAgLy9cbiAgLy8gQmFzZSByZWR1Y3Rpb24gZW5naW5lXG4gIC8vXG4gIGZ1bmN0aW9uIFJlZCAobSkge1xuICAgIGlmICh0eXBlb2YgbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhciBwcmltZSA9IEJOLl9wcmltZShtKTtcbiAgICAgIHRoaXMubSA9IHByaW1lLnA7XG4gICAgICB0aGlzLnByaW1lID0gcHJpbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChtLmd0bigxKSwgJ21vZHVsdXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMScpO1xuICAgICAgdGhpcy5tID0gbTtcbiAgICAgIHRoaXMucHJpbWUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIFJlZC5wcm90b3R5cGUuX3ZlcmlmeTEgPSBmdW5jdGlvbiBfdmVyaWZ5MSAoYSkge1xuICAgIGFzc2VydChhLm5lZ2F0aXZlID09PSAwLCAncmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMnKTtcbiAgICBhc3NlcnQoYS5yZWQsICdyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5fdmVyaWZ5MiA9IGZ1bmN0aW9uIF92ZXJpZnkyIChhLCBiKSB7XG4gICAgYXNzZXJ0KChhLm5lZ2F0aXZlIHwgYi5uZWdhdGl2ZSkgPT09IDAsICdyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcycpO1xuICAgIGFzc2VydChhLnJlZCAmJiBhLnJlZCA9PT0gYi5yZWQsXG4gICAgICAncmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaW1vZCA9IGZ1bmN0aW9uIGltb2QgKGEpIHtcbiAgICBpZiAodGhpcy5wcmltZSkgcmV0dXJuIHRoaXMucHJpbWUuaXJlZHVjZShhKS5fZm9yY2VSZWQodGhpcyk7XG4gICAgcmV0dXJuIGEudW1vZCh0aGlzLm0pLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uIG5lZyAoYSkge1xuICAgIGlmIChhLmlzWmVybygpKSB7XG4gICAgICByZXR1cm4gYS5jbG9uZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm0uc3ViKGEpLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5hZGQoYik7XG4gICAgaWYgKHJlcy5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMuaXN1Yih0aGlzLm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmlhZGQgPSBmdW5jdGlvbiBpYWRkIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcblxuICAgIHZhciByZXMgPSBhLmlhZGQoYik7XG4gICAgaWYgKHJlcy5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMuaXN1Yih0aGlzLm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuc3ViID0gZnVuY3Rpb24gc3ViIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcblxuICAgIHZhciByZXMgPSBhLnN1YihiKTtcbiAgICBpZiAocmVzLmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMuaWFkZCh0aGlzLm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmlzdWIgPSBmdW5jdGlvbiBpc3ViIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcblxuICAgIHZhciByZXMgPSBhLmlzdWIoYik7XG4gICAgaWYgKHJlcy5jbXBuKDApIDwgMCkge1xuICAgICAgcmVzLmlhZGQodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnNobCA9IGZ1bmN0aW9uIHNobCAoYSwgbnVtKSB7XG4gICAgdGhpcy5fdmVyaWZ5MShhKTtcbiAgICByZXR1cm4gdGhpcy5pbW9kKGEudXNobG4obnVtKSk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24gaW11bCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG4gICAgcmV0dXJuIHRoaXMuaW1vZChhLmltdWwoYikpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcbiAgICByZXR1cm4gdGhpcy5pbW9kKGEubXVsKGIpKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmlzcXIgPSBmdW5jdGlvbiBpc3FyIChhKSB7XG4gICAgcmV0dXJuIHRoaXMuaW11bChhLCBhLmNsb25lKCkpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuc3FyID0gZnVuY3Rpb24gc3FyIChhKSB7XG4gICAgcmV0dXJuIHRoaXMubXVsKGEsIGEpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuc3FydCA9IGZ1bmN0aW9uIHNxcnQgKGEpIHtcbiAgICBpZiAoYS5pc1plcm8oKSkgcmV0dXJuIGEuY2xvbmUoKTtcblxuICAgIHZhciBtb2QzID0gdGhpcy5tLmFuZGxuKDMpO1xuICAgIGFzc2VydChtb2QzICUgMiA9PT0gMSk7XG5cbiAgICAvLyBGYXN0IGNhc2VcbiAgICBpZiAobW9kMyA9PT0gMykge1xuICAgICAgdmFyIHBvdyA9IHRoaXMubS5hZGQobmV3IEJOKDEpKS5pdXNocm4oMik7XG4gICAgICByZXR1cm4gdGhpcy5wb3coYSwgcG93KTtcbiAgICB9XG5cbiAgICAvLyBUb25lbGxpLVNoYW5rcyBhbGdvcml0aG0gKFRvdGFsbHkgdW5vcHRpbWl6ZWQgYW5kIHNsb3cpXG4gICAgLy9cbiAgICAvLyBGaW5kIFEgYW5kIFMsIHRoYXQgUSAqIDIgXiBTID0gKFAgLSAxKVxuICAgIHZhciBxID0gdGhpcy5tLnN1Ym4oMSk7XG4gICAgdmFyIHMgPSAwO1xuICAgIHdoaWxlICghcS5pc1plcm8oKSAmJiBxLmFuZGxuKDEpID09PSAwKSB7XG4gICAgICBzKys7XG4gICAgICBxLml1c2hybigxKTtcbiAgICB9XG4gICAgYXNzZXJ0KCFxLmlzWmVybygpKTtcblxuICAgIHZhciBvbmUgPSBuZXcgQk4oMSkudG9SZWQodGhpcyk7XG4gICAgdmFyIG5PbmUgPSBvbmUucmVkTmVnKCk7XG5cbiAgICAvLyBGaW5kIHF1YWRyYXRpYyBub24tcmVzaWR1ZVxuICAgIC8vIE5PVEU6IE1heCBpcyBzdWNoIGJlY2F1c2Ugb2YgZ2VuZXJhbGl6ZWQgUmllbWFubiBoeXBvdGhlc2lzLlxuICAgIHZhciBscG93ID0gdGhpcy5tLnN1Ym4oMSkuaXVzaHJuKDEpO1xuICAgIHZhciB6ID0gdGhpcy5tLmJpdExlbmd0aCgpO1xuICAgIHogPSBuZXcgQk4oMiAqIHogKiB6KS50b1JlZCh0aGlzKTtcblxuICAgIHdoaWxlICh0aGlzLnBvdyh6LCBscG93KS5jbXAobk9uZSkgIT09IDApIHtcbiAgICAgIHoucmVkSUFkZChuT25lKTtcbiAgICB9XG5cbiAgICB2YXIgYyA9IHRoaXMucG93KHosIHEpO1xuICAgIHZhciByID0gdGhpcy5wb3coYSwgcS5hZGRuKDEpLml1c2hybigxKSk7XG4gICAgdmFyIHQgPSB0aGlzLnBvdyhhLCBxKTtcbiAgICB2YXIgbSA9IHM7XG4gICAgd2hpbGUgKHQuY21wKG9uZSkgIT09IDApIHtcbiAgICAgIHZhciB0bXAgPSB0O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IHRtcC5jbXAob25lKSAhPT0gMDsgaSsrKSB7XG4gICAgICAgIHRtcCA9IHRtcC5yZWRTcXIoKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChpIDwgbSk7XG4gICAgICB2YXIgYiA9IHRoaXMucG93KGMsIG5ldyBCTigxKS5pdXNobG4obSAtIGkgLSAxKSk7XG5cbiAgICAgIHIgPSByLnJlZE11bChiKTtcbiAgICAgIGMgPSBiLnJlZFNxcigpO1xuICAgICAgdCA9IHQucmVkTXVsKGMpO1xuICAgICAgbSA9IGk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24gaW52bSAoYSkge1xuICAgIHZhciBpbnYgPSBhLl9pbnZtcCh0aGlzLm0pO1xuICAgIGlmIChpbnYubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIGludi5uZWdhdGl2ZSA9IDA7XG4gICAgICByZXR1cm4gdGhpcy5pbW9kKGludikucmVkTmVnKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmltb2QoaW52KTtcbiAgICB9XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5wb3cgPSBmdW5jdGlvbiBwb3cgKGEsIG51bSkge1xuICAgIGlmIChudW0uaXNaZXJvKCkpIHJldHVybiBuZXcgQk4oMSkudG9SZWQodGhpcyk7XG4gICAgaWYgKG51bS5jbXBuKDEpID09PSAwKSByZXR1cm4gYS5jbG9uZSgpO1xuXG4gICAgdmFyIHdpbmRvd1NpemUgPSA0O1xuICAgIHZhciB3bmQgPSBuZXcgQXJyYXkoMSA8PCB3aW5kb3dTaXplKTtcbiAgICB3bmRbMF0gPSBuZXcgQk4oMSkudG9SZWQodGhpcyk7XG4gICAgd25kWzFdID0gYTtcbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IHduZC5sZW5ndGg7IGkrKykge1xuICAgICAgd25kW2ldID0gdGhpcy5tdWwod25kW2kgLSAxXSwgYSk7XG4gICAgfVxuXG4gICAgdmFyIHJlcyA9IHduZFswXTtcbiAgICB2YXIgY3VycmVudCA9IDA7XG4gICAgdmFyIGN1cnJlbnRMZW4gPSAwO1xuICAgIHZhciBzdGFydCA9IG51bS5iaXRMZW5ndGgoKSAlIDI2O1xuICAgIGlmIChzdGFydCA9PT0gMCkge1xuICAgICAgc3RhcnQgPSAyNjtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSBudW0ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciB3b3JkID0gbnVtLndvcmRzW2ldO1xuICAgICAgZm9yICh2YXIgaiA9IHN0YXJ0IC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgdmFyIGJpdCA9ICh3b3JkID4+IGopICYgMTtcbiAgICAgICAgaWYgKHJlcyAhPT0gd25kWzBdKSB7XG4gICAgICAgICAgcmVzID0gdGhpcy5zcXIocmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiaXQgPT09IDAgJiYgY3VycmVudCA9PT0gMCkge1xuICAgICAgICAgIGN1cnJlbnRMZW4gPSAwO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudCA8PD0gMTtcbiAgICAgICAgY3VycmVudCB8PSBiaXQ7XG4gICAgICAgIGN1cnJlbnRMZW4rKztcbiAgICAgICAgaWYgKGN1cnJlbnRMZW4gIT09IHdpbmRvd1NpemUgJiYgKGkgIT09IDAgfHwgaiAhPT0gMCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIHJlcyA9IHRoaXMubXVsKHJlcywgd25kW2N1cnJlbnRdKTtcbiAgICAgICAgY3VycmVudExlbiA9IDA7XG4gICAgICAgIGN1cnJlbnQgPSAwO1xuICAgICAgfVxuICAgICAgc3RhcnQgPSAyNjtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuY29udmVydFRvID0gZnVuY3Rpb24gY29udmVydFRvIChudW0pIHtcbiAgICB2YXIgciA9IG51bS51bW9kKHRoaXMubSk7XG5cbiAgICByZXR1cm4gciA9PT0gbnVtID8gci5jbG9uZSgpIDogcjtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmNvbnZlcnRGcm9tID0gZnVuY3Rpb24gY29udmVydEZyb20gKG51bSkge1xuICAgIHZhciByZXMgPSBudW0uY2xvbmUoKTtcbiAgICByZXMucmVkID0gbnVsbDtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vXG4gIC8vIE1vbnRnb21lcnkgbWV0aG9kIGVuZ2luZVxuICAvL1xuXG4gIEJOLm1vbnQgPSBmdW5jdGlvbiBtb250IChudW0pIHtcbiAgICByZXR1cm4gbmV3IE1vbnQobnVtKTtcbiAgfTtcblxuICBmdW5jdGlvbiBNb250IChtKSB7XG4gICAgUmVkLmNhbGwodGhpcywgbSk7XG5cbiAgICB0aGlzLnNoaWZ0ID0gdGhpcy5tLmJpdExlbmd0aCgpO1xuICAgIGlmICh0aGlzLnNoaWZ0ICUgMjYgIT09IDApIHtcbiAgICAgIHRoaXMuc2hpZnQgKz0gMjYgLSAodGhpcy5zaGlmdCAlIDI2KTtcbiAgICB9XG5cbiAgICB0aGlzLnIgPSBuZXcgQk4oMSkuaXVzaGxuKHRoaXMuc2hpZnQpO1xuICAgIHRoaXMucjIgPSB0aGlzLmltb2QodGhpcy5yLnNxcigpKTtcbiAgICB0aGlzLnJpbnYgPSB0aGlzLnIuX2ludm1wKHRoaXMubSk7XG5cbiAgICB0aGlzLm1pbnYgPSB0aGlzLnJpbnYubXVsKHRoaXMucikuaXN1Ym4oMSkuZGl2KHRoaXMubSk7XG4gICAgdGhpcy5taW52ID0gdGhpcy5taW52LnVtb2QodGhpcy5yKTtcbiAgICB0aGlzLm1pbnYgPSB0aGlzLnIuc3ViKHRoaXMubWludik7XG4gIH1cbiAgaW5oZXJpdHMoTW9udCwgUmVkKTtcblxuICBNb250LnByb3RvdHlwZS5jb252ZXJ0VG8gPSBmdW5jdGlvbiBjb252ZXJ0VG8gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmltb2QobnVtLnVzaGxuKHRoaXMuc2hpZnQpKTtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5jb252ZXJ0RnJvbSA9IGZ1bmN0aW9uIGNvbnZlcnRGcm9tIChudW0pIHtcbiAgICB2YXIgciA9IHRoaXMuaW1vZChudW0ubXVsKHRoaXMucmludikpO1xuICAgIHIucmVkID0gbnVsbDtcbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24gaW11bCAoYSwgYikge1xuICAgIGlmIChhLmlzWmVybygpIHx8IGIuaXNaZXJvKCkpIHtcbiAgICAgIGEud29yZHNbMF0gPSAwO1xuICAgICAgYS5sZW5ndGggPSAxO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfVxuXG4gICAgdmFyIHQgPSBhLmltdWwoYik7XG4gICAgdmFyIGMgPSB0Lm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKTtcbiAgICB2YXIgdSA9IHQuaXN1YihjKS5pdXNocm4odGhpcy5zaGlmdCk7XG4gICAgdmFyIHJlcyA9IHU7XG5cbiAgICBpZiAodS5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMgPSB1LmlzdWIodGhpcy5tKTtcbiAgICB9IGVsc2UgaWYgKHUuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcyA9IHUuaWFkZCh0aGlzLm0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXMuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xuXG4gIE1vbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bCAoYSwgYikge1xuICAgIGlmIChhLmlzWmVybygpIHx8IGIuaXNaZXJvKCkpIHJldHVybiBuZXcgQk4oMCkuX2ZvcmNlUmVkKHRoaXMpO1xuXG4gICAgdmFyIHQgPSBhLm11bChiKTtcbiAgICB2YXIgYyA9IHQubWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubWludikuaW1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm0pO1xuICAgIHZhciB1ID0gdC5pc3ViKGMpLml1c2hybih0aGlzLnNoaWZ0KTtcbiAgICB2YXIgcmVzID0gdTtcbiAgICBpZiAodS5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMgPSB1LmlzdWIodGhpcy5tKTtcbiAgICB9IGVsc2UgaWYgKHUuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcyA9IHUuaWFkZCh0aGlzLm0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXMuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xuXG4gIE1vbnQucHJvdG90eXBlLmludm0gPSBmdW5jdGlvbiBpbnZtIChhKSB7XG4gICAgLy8gKEFSKV4tMSAqIFJeMiA9IChBXi0xICogUl4tMSkgKiBSXjIgPSBBXi0xICogUlxuICAgIHZhciByZXMgPSB0aGlzLmltb2QoYS5faW52bXAodGhpcy5tKS5tdWwodGhpcy5yMikpO1xuICAgIHJldHVybiByZXMuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xufSkodHlwZW9mIG1vZHVsZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbW9kdWxlLCB0aGlzKTtcbiIsInZhciByO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJhbmQobGVuKSB7XG4gIGlmICghcilcbiAgICByID0gbmV3IFJhbmQobnVsbCk7XG5cbiAgcmV0dXJuIHIuZ2VuZXJhdGUobGVuKTtcbn07XG5cbmZ1bmN0aW9uIFJhbmQocmFuZCkge1xuICB0aGlzLnJhbmQgPSByYW5kO1xufVxubW9kdWxlLmV4cG9ydHMuUmFuZCA9IFJhbmQ7XG5cblJhbmQucHJvdG90eXBlLmdlbmVyYXRlID0gZnVuY3Rpb24gZ2VuZXJhdGUobGVuKSB7XG4gIHJldHVybiB0aGlzLl9yYW5kKGxlbik7XG59O1xuXG4vLyBFbXVsYXRlIGNyeXB0byBBUEkgdXNpbmcgcmFuZHlcblJhbmQucHJvdG90eXBlLl9yYW5kID0gZnVuY3Rpb24gX3JhbmQobikge1xuICBpZiAodGhpcy5yYW5kLmdldEJ5dGVzKVxuICAgIHJldHVybiB0aGlzLnJhbmQuZ2V0Qnl0ZXMobik7XG5cbiAgdmFyIHJlcyA9IG5ldyBVaW50OEFycmF5KG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcy5sZW5ndGg7IGkrKylcbiAgICByZXNbaV0gPSB0aGlzLnJhbmQuZ2V0Qnl0ZSgpO1xuICByZXR1cm4gcmVzO1xufTtcblxuaWYgKHR5cGVvZiBzZWxmID09PSAnb2JqZWN0Jykge1xuICBpZiAoc2VsZi5jcnlwdG8gJiYgc2VsZi5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgLy8gTW9kZXJuIGJyb3dzZXJzXG4gICAgUmFuZC5wcm90b3R5cGUuX3JhbmQgPSBmdW5jdGlvbiBfcmFuZChuKSB7XG4gICAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gICAgICBzZWxmLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyKTtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfTtcbiAgfSBlbHNlIGlmIChzZWxmLm1zQ3J5cHRvICYmIHNlbGYubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgLy8gSUVcbiAgICBSYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uIF9yYW5kKG4pIHtcbiAgICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheShuKTtcbiAgICAgIHNlbGYubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycik7XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH07XG5cbiAgLy8gU2FmYXJpJ3MgV2ViV29ya2VycyBkbyBub3QgaGF2ZSBgY3J5cHRvYFxuICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gT2xkIGp1bmtcbiAgICBSYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQgeWV0Jyk7XG4gICAgfTtcbiAgfVxufSBlbHNlIHtcbiAgLy8gTm9kZS5qcyBvciBXZWIgd29ya2VyIHdpdGggbm8gY3J5cHRvIHN1cHBvcnRcbiAgdHJ5IHtcbiAgICB2YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG4gICAgaWYgKHR5cGVvZiBjcnlwdG8ucmFuZG9tQnl0ZXMgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBzdXBwb3J0ZWQnKTtcblxuICAgIFJhbmQucHJvdG90eXBlLl9yYW5kID0gZnVuY3Rpb24gX3JhbmQobikge1xuICAgICAgcmV0dXJuIGNyeXB0by5yYW5kb21CeXRlcyhuKTtcbiAgICB9O1xuICB9IGNhdGNoIChlKSB7XG4gIH1cbn1cbiIsIi8vIGJhc2VkIG9uIHRoZSBhZXMgaW1wbGltZW50YXRpb24gaW4gdHJpcGxlIHNlY1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2tleWJhc2UvdHJpcGxlc2VjXG4vLyB3aGljaCBpcyBpbiB0dXJuIGJhc2VkIG9uIHRoZSBvbmUgZnJvbSBjcnlwdG8tanNcbi8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL1xuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcblxuZnVuY3Rpb24gYXNVSW50MzJBcnJheSAoYnVmKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIGJ1ZiA9IEJ1ZmZlci5mcm9tKGJ1ZilcblxuICB2YXIgbGVuID0gKGJ1Zi5sZW5ndGggLyA0KSB8IDBcbiAgdmFyIG91dCA9IG5ldyBBcnJheShsZW4pXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIG91dFtpXSA9IGJ1Zi5yZWFkVUludDMyQkUoaSAqIDQpXG4gIH1cblxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHNjcnViVmVjICh2KSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdi5sZW5ndGg7IHYrKykge1xuICAgIHZbaV0gPSAwXG4gIH1cbn1cblxuZnVuY3Rpb24gY3J5cHRCbG9jayAoTSwga2V5U2NoZWR1bGUsIFNVQl9NSVgsIFNCT1gsIG5Sb3VuZHMpIHtcbiAgdmFyIFNVQl9NSVgwID0gU1VCX01JWFswXVxuICB2YXIgU1VCX01JWDEgPSBTVUJfTUlYWzFdXG4gIHZhciBTVUJfTUlYMiA9IFNVQl9NSVhbMl1cbiAgdmFyIFNVQl9NSVgzID0gU1VCX01JWFszXVxuXG4gIHZhciBzMCA9IE1bMF0gXiBrZXlTY2hlZHVsZVswXVxuICB2YXIgczEgPSBNWzFdIF4ga2V5U2NoZWR1bGVbMV1cbiAgdmFyIHMyID0gTVsyXSBeIGtleVNjaGVkdWxlWzJdXG4gIHZhciBzMyA9IE1bM10gXiBrZXlTY2hlZHVsZVszXVxuICB2YXIgdDAsIHQxLCB0MiwgdDNcbiAgdmFyIGtzUm93ID0gNFxuXG4gIGZvciAodmFyIHJvdW5kID0gMTsgcm91bmQgPCBuUm91bmRzOyByb3VuZCsrKSB7XG4gICAgdDAgPSBTVUJfTUlYMFtzMCA+Pj4gMjRdIF4gU1VCX01JWDFbKHMxID4+PiAxNikgJiAweGZmXSBeIFNVQl9NSVgyWyhzMiA+Pj4gOCkgJiAweGZmXSBeIFNVQl9NSVgzW3MzICYgMHhmZl0gXiBrZXlTY2hlZHVsZVtrc1JvdysrXVxuICAgIHQxID0gU1VCX01JWDBbczEgPj4+IDI0XSBeIFNVQl9NSVgxWyhzMiA+Pj4gMTYpICYgMHhmZl0gXiBTVUJfTUlYMlsoczMgPj4+IDgpICYgMHhmZl0gXiBTVUJfTUlYM1tzMCAmIDB4ZmZdIF4ga2V5U2NoZWR1bGVba3NSb3crK11cbiAgICB0MiA9IFNVQl9NSVgwW3MyID4+PiAyNF0gXiBTVUJfTUlYMVsoczMgPj4+IDE2KSAmIDB4ZmZdIF4gU1VCX01JWDJbKHMwID4+PiA4KSAmIDB4ZmZdIF4gU1VCX01JWDNbczEgJiAweGZmXSBeIGtleVNjaGVkdWxlW2tzUm93KytdXG4gICAgdDMgPSBTVUJfTUlYMFtzMyA+Pj4gMjRdIF4gU1VCX01JWDFbKHMwID4+PiAxNikgJiAweGZmXSBeIFNVQl9NSVgyWyhzMSA+Pj4gOCkgJiAweGZmXSBeIFNVQl9NSVgzW3MyICYgMHhmZl0gXiBrZXlTY2hlZHVsZVtrc1JvdysrXVxuICAgIHMwID0gdDBcbiAgICBzMSA9IHQxXG4gICAgczIgPSB0MlxuICAgIHMzID0gdDNcbiAgfVxuXG4gIHQwID0gKChTQk9YW3MwID4+PiAyNF0gPDwgMjQpIHwgKFNCT1hbKHMxID4+PiAxNikgJiAweGZmXSA8PCAxNikgfCAoU0JPWFsoczIgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBTQk9YW3MzICYgMHhmZl0pIF4ga2V5U2NoZWR1bGVba3NSb3crK11cbiAgdDEgPSAoKFNCT1hbczEgPj4+IDI0XSA8PCAyNCkgfCAoU0JPWFsoczIgPj4+IDE2KSAmIDB4ZmZdIDw8IDE2KSB8IChTQk9YWyhzMyA+Pj4gOCkgJiAweGZmXSA8PCA4KSB8IFNCT1hbczAgJiAweGZmXSkgXiBrZXlTY2hlZHVsZVtrc1JvdysrXVxuICB0MiA9ICgoU0JPWFtzMiA+Pj4gMjRdIDw8IDI0KSB8IChTQk9YWyhzMyA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHwgKFNCT1hbKHMwID4+PiA4KSAmIDB4ZmZdIDw8IDgpIHwgU0JPWFtzMSAmIDB4ZmZdKSBeIGtleVNjaGVkdWxlW2tzUm93KytdXG4gIHQzID0gKChTQk9YW3MzID4+PiAyNF0gPDwgMjQpIHwgKFNCT1hbKHMwID4+PiAxNikgJiAweGZmXSA8PCAxNikgfCAoU0JPWFsoczEgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBTQk9YW3MyICYgMHhmZl0pIF4ga2V5U2NoZWR1bGVba3NSb3crK11cbiAgdDAgPSB0MCA+Pj4gMFxuICB0MSA9IHQxID4+PiAwXG4gIHQyID0gdDIgPj4+IDBcbiAgdDMgPSB0MyA+Pj4gMFxuXG4gIHJldHVybiBbdDAsIHQxLCB0MiwgdDNdXG59XG5cbi8vIEFFUyBjb25zdGFudHNcbnZhciBSQ09OID0gWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzZdXG52YXIgRyA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIENvbXB1dGUgZG91YmxlIHRhYmxlXG4gIHZhciBkID0gbmV3IEFycmF5KDI1NilcbiAgZm9yICh2YXIgaiA9IDA7IGogPCAyNTY7IGorKykge1xuICAgIGlmIChqIDwgMTI4KSB7XG4gICAgICBkW2pdID0gaiA8PCAxXG4gICAgfSBlbHNlIHtcbiAgICAgIGRbal0gPSAoaiA8PCAxKSBeIDB4MTFiXG4gICAgfVxuICB9XG5cbiAgdmFyIFNCT1ggPSBbXVxuICB2YXIgSU5WX1NCT1ggPSBbXVxuICB2YXIgU1VCX01JWCA9IFtbXSwgW10sIFtdLCBbXV1cbiAgdmFyIElOVl9TVUJfTUlYID0gW1tdLCBbXSwgW10sIFtdXVxuXG4gIC8vIFdhbGsgR0YoMl44KVxuICB2YXIgeCA9IDBcbiAgdmFyIHhpID0gMFxuICBmb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gICAgLy8gQ29tcHV0ZSBzYm94XG4gICAgdmFyIHN4ID0geGkgXiAoeGkgPDwgMSkgXiAoeGkgPDwgMikgXiAoeGkgPDwgMykgXiAoeGkgPDwgNClcbiAgICBzeCA9IChzeCA+Pj4gOCkgXiAoc3ggJiAweGZmKSBeIDB4NjNcbiAgICBTQk9YW3hdID0gc3hcbiAgICBJTlZfU0JPWFtzeF0gPSB4XG5cbiAgICAvLyBDb21wdXRlIG11bHRpcGxpY2F0aW9uXG4gICAgdmFyIHgyID0gZFt4XVxuICAgIHZhciB4NCA9IGRbeDJdXG4gICAgdmFyIHg4ID0gZFt4NF1cblxuICAgIC8vIENvbXB1dGUgc3ViIGJ5dGVzLCBtaXggY29sdW1ucyB0YWJsZXNcbiAgICB2YXIgdCA9IChkW3N4XSAqIDB4MTAxKSBeIChzeCAqIDB4MTAxMDEwMClcbiAgICBTVUJfTUlYWzBdW3hdID0gKHQgPDwgMjQpIHwgKHQgPj4+IDgpXG4gICAgU1VCX01JWFsxXVt4XSA9ICh0IDw8IDE2KSB8ICh0ID4+PiAxNilcbiAgICBTVUJfTUlYWzJdW3hdID0gKHQgPDwgOCkgfCAodCA+Pj4gMjQpXG4gICAgU1VCX01JWFszXVt4XSA9IHRcblxuICAgIC8vIENvbXB1dGUgaW52IHN1YiBieXRlcywgaW52IG1peCBjb2x1bW5zIHRhYmxlc1xuICAgIHQgPSAoeDggKiAweDEwMTAxMDEpIF4gKHg0ICogMHgxMDAwMSkgXiAoeDIgKiAweDEwMSkgXiAoeCAqIDB4MTAxMDEwMClcbiAgICBJTlZfU1VCX01JWFswXVtzeF0gPSAodCA8PCAyNCkgfCAodCA+Pj4gOClcbiAgICBJTlZfU1VCX01JWFsxXVtzeF0gPSAodCA8PCAxNikgfCAodCA+Pj4gMTYpXG4gICAgSU5WX1NVQl9NSVhbMl1bc3hdID0gKHQgPDwgOCkgfCAodCA+Pj4gMjQpXG4gICAgSU5WX1NVQl9NSVhbM11bc3hdID0gdFxuXG4gICAgaWYgKHggPT09IDApIHtcbiAgICAgIHggPSB4aSA9IDFcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IHgyIF4gZFtkW2RbeDggXiB4Ml1dXVxuICAgICAgeGkgXj0gZFtkW3hpXV1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIFNCT1g6IFNCT1gsXG4gICAgSU5WX1NCT1g6IElOVl9TQk9YLFxuICAgIFNVQl9NSVg6IFNVQl9NSVgsXG4gICAgSU5WX1NVQl9NSVg6IElOVl9TVUJfTUlYXG4gIH1cbn0pKClcblxuZnVuY3Rpb24gQUVTIChrZXkpIHtcbiAgdGhpcy5fa2V5ID0gYXNVSW50MzJBcnJheShrZXkpXG4gIHRoaXMuX3Jlc2V0KClcbn1cblxuQUVTLmJsb2NrU2l6ZSA9IDQgKiA0XG5BRVMua2V5U2l6ZSA9IDI1NiAvIDhcbkFFUy5wcm90b3R5cGUuYmxvY2tTaXplID0gQUVTLmJsb2NrU2l6ZVxuQUVTLnByb3RvdHlwZS5rZXlTaXplID0gQUVTLmtleVNpemVcbkFFUy5wcm90b3R5cGUuX3Jlc2V0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIga2V5V29yZHMgPSB0aGlzLl9rZXlcbiAgdmFyIGtleVNpemUgPSBrZXlXb3Jkcy5sZW5ndGhcbiAgdmFyIG5Sb3VuZHMgPSBrZXlTaXplICsgNlxuICB2YXIga3NSb3dzID0gKG5Sb3VuZHMgKyAxKSAqIDRcblxuICB2YXIga2V5U2NoZWR1bGUgPSBbXVxuICBmb3IgKHZhciBrID0gMDsgayA8IGtleVNpemU7IGsrKykge1xuICAgIGtleVNjaGVkdWxlW2tdID0ga2V5V29yZHNba11cbiAgfVxuXG4gIGZvciAoayA9IGtleVNpemU7IGsgPCBrc1Jvd3M7IGsrKykge1xuICAgIHZhciB0ID0ga2V5U2NoZWR1bGVbayAtIDFdXG5cbiAgICBpZiAoayAlIGtleVNpemUgPT09IDApIHtcbiAgICAgIHQgPSAodCA8PCA4KSB8ICh0ID4+PiAyNClcbiAgICAgIHQgPVxuICAgICAgICAoRy5TQk9YW3QgPj4+IDI0XSA8PCAyNCkgfFxuICAgICAgICAoRy5TQk9YWyh0ID4+PiAxNikgJiAweGZmXSA8PCAxNikgfFxuICAgICAgICAoRy5TQk9YWyh0ID4+PiA4KSAmIDB4ZmZdIDw8IDgpIHxcbiAgICAgICAgKEcuU0JPWFt0ICYgMHhmZl0pXG5cbiAgICAgIHQgXj0gUkNPTlsoayAvIGtleVNpemUpIHwgMF0gPDwgMjRcbiAgICB9IGVsc2UgaWYgKGtleVNpemUgPiA2ICYmIGsgJSBrZXlTaXplID09PSA0KSB7XG4gICAgICB0ID1cbiAgICAgICAgKEcuU0JPWFt0ID4+PiAyNF0gPDwgMjQpIHxcbiAgICAgICAgKEcuU0JPWFsodCA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHxcbiAgICAgICAgKEcuU0JPWFsodCA+Pj4gOCkgJiAweGZmXSA8PCA4KSB8XG4gICAgICAgIChHLlNCT1hbdCAmIDB4ZmZdKVxuICAgIH1cblxuICAgIGtleVNjaGVkdWxlW2tdID0ga2V5U2NoZWR1bGVbayAtIGtleVNpemVdIF4gdFxuICB9XG5cbiAgdmFyIGludktleVNjaGVkdWxlID0gW11cbiAgZm9yICh2YXIgaWsgPSAwOyBpayA8IGtzUm93czsgaWsrKykge1xuICAgIHZhciBrc1IgPSBrc1Jvd3MgLSBpa1xuICAgIHZhciB0dCA9IGtleVNjaGVkdWxlW2tzUiAtIChpayAlIDQgPyAwIDogNCldXG5cbiAgICBpZiAoaWsgPCA0IHx8IGtzUiA8PSA0KSB7XG4gICAgICBpbnZLZXlTY2hlZHVsZVtpa10gPSB0dFxuICAgIH0gZWxzZSB7XG4gICAgICBpbnZLZXlTY2hlZHVsZVtpa10gPVxuICAgICAgICBHLklOVl9TVUJfTUlYWzBdW0cuU0JPWFt0dCA+Pj4gMjRdXSBeXG4gICAgICAgIEcuSU5WX1NVQl9NSVhbMV1bRy5TQk9YWyh0dCA+Pj4gMTYpICYgMHhmZl1dIF5cbiAgICAgICAgRy5JTlZfU1VCX01JWFsyXVtHLlNCT1hbKHR0ID4+PiA4KSAmIDB4ZmZdXSBeXG4gICAgICAgIEcuSU5WX1NVQl9NSVhbM11bRy5TQk9YW3R0ICYgMHhmZl1dXG4gICAgfVxuICB9XG5cbiAgdGhpcy5fblJvdW5kcyA9IG5Sb3VuZHNcbiAgdGhpcy5fa2V5U2NoZWR1bGUgPSBrZXlTY2hlZHVsZVxuICB0aGlzLl9pbnZLZXlTY2hlZHVsZSA9IGludktleVNjaGVkdWxlXG59XG5cbkFFUy5wcm90b3R5cGUuZW5jcnlwdEJsb2NrUmF3ID0gZnVuY3Rpb24gKE0pIHtcbiAgTSA9IGFzVUludDMyQXJyYXkoTSlcbiAgcmV0dXJuIGNyeXB0QmxvY2soTSwgdGhpcy5fa2V5U2NoZWR1bGUsIEcuU1VCX01JWCwgRy5TQk9YLCB0aGlzLl9uUm91bmRzKVxufVxuXG5BRVMucHJvdG90eXBlLmVuY3J5cHRCbG9jayA9IGZ1bmN0aW9uIChNKSB7XG4gIHZhciBvdXQgPSB0aGlzLmVuY3J5cHRCbG9ja1JhdyhNKVxuICB2YXIgYnVmID0gQnVmZmVyLmFsbG9jVW5zYWZlKDE2KVxuICBidWYud3JpdGVVSW50MzJCRShvdXRbMF0sIDApXG4gIGJ1Zi53cml0ZVVJbnQzMkJFKG91dFsxXSwgNClcbiAgYnVmLndyaXRlVUludDMyQkUob3V0WzJdLCA4KVxuICBidWYud3JpdGVVSW50MzJCRShvdXRbM10sIDEyKVxuICByZXR1cm4gYnVmXG59XG5cbkFFUy5wcm90b3R5cGUuZGVjcnlwdEJsb2NrID0gZnVuY3Rpb24gKE0pIHtcbiAgTSA9IGFzVUludDMyQXJyYXkoTSlcblxuICAvLyBzd2FwXG4gIHZhciBtMSA9IE1bMV1cbiAgTVsxXSA9IE1bM11cbiAgTVszXSA9IG0xXG5cbiAgdmFyIG91dCA9IGNyeXB0QmxvY2soTSwgdGhpcy5faW52S2V5U2NoZWR1bGUsIEcuSU5WX1NVQl9NSVgsIEcuSU5WX1NCT1gsIHRoaXMuX25Sb3VuZHMpXG4gIHZhciBidWYgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMTYpXG4gIGJ1Zi53cml0ZVVJbnQzMkJFKG91dFswXSwgMClcbiAgYnVmLndyaXRlVUludDMyQkUob3V0WzNdLCA0KVxuICBidWYud3JpdGVVSW50MzJCRShvdXRbMl0sIDgpXG4gIGJ1Zi53cml0ZVVJbnQzMkJFKG91dFsxXSwgMTIpXG4gIHJldHVybiBidWZcbn1cblxuQUVTLnByb3RvdHlwZS5zY3J1YiA9IGZ1bmN0aW9uICgpIHtcbiAgc2NydWJWZWModGhpcy5fa2V5U2NoZWR1bGUpXG4gIHNjcnViVmVjKHRoaXMuX2ludktleVNjaGVkdWxlKVxuICBzY3J1YlZlYyh0aGlzLl9rZXkpXG59XG5cbm1vZHVsZS5leHBvcnRzLkFFUyA9IEFFU1xuIiwidmFyIGFlcyA9IHJlcXVpcmUoJy4vYWVzJylcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlclxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJ2NpcGhlci1iYXNlJylcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBHSEFTSCA9IHJlcXVpcmUoJy4vZ2hhc2gnKVxudmFyIHhvciA9IHJlcXVpcmUoJ2J1ZmZlci14b3InKVxudmFyIGluY3IzMiA9IHJlcXVpcmUoJy4vaW5jcjMyJylcblxuZnVuY3Rpb24geG9yVGVzdCAoYSwgYikge1xuICB2YXIgb3V0ID0gMFxuICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSBvdXQrK1xuXG4gIHZhciBsZW4gPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBvdXQgKz0gKGFbaV0gXiBiW2ldKVxuICB9XG5cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiBjYWxjSXYgKHNlbGYsIGl2LCBjaykge1xuICBpZiAoaXYubGVuZ3RoID09PSAxMikge1xuICAgIHNlbGYuX2ZpbklEID0gQnVmZmVyLmNvbmNhdChbaXYsIEJ1ZmZlci5mcm9tKFswLCAwLCAwLCAxXSldKVxuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFtpdiwgQnVmZmVyLmZyb20oWzAsIDAsIDAsIDJdKV0pXG4gIH1cbiAgdmFyIGdoYXNoID0gbmV3IEdIQVNIKGNrKVxuICB2YXIgbGVuID0gaXYubGVuZ3RoXG4gIHZhciB0b1BhZCA9IGxlbiAlIDE2XG4gIGdoYXNoLnVwZGF0ZShpdilcbiAgaWYgKHRvUGFkKSB7XG4gICAgdG9QYWQgPSAxNiAtIHRvUGFkXG4gICAgZ2hhc2gudXBkYXRlKEJ1ZmZlci5hbGxvYyh0b1BhZCwgMCkpXG4gIH1cbiAgZ2hhc2gudXBkYXRlKEJ1ZmZlci5hbGxvYyg4LCAwKSlcbiAgdmFyIGl2Qml0cyA9IGxlbiAqIDhcbiAgdmFyIHRhaWwgPSBCdWZmZXIuYWxsb2MoOClcbiAgdGFpbC53cml0ZVVJbnRCRShpdkJpdHMsIDAsIDgpXG4gIGdoYXNoLnVwZGF0ZSh0YWlsKVxuICBzZWxmLl9maW5JRCA9IGdoYXNoLnN0YXRlXG4gIHZhciBvdXQgPSBCdWZmZXIuZnJvbShzZWxmLl9maW5JRClcbiAgaW5jcjMyKG91dClcbiAgcmV0dXJuIG91dFxufVxuZnVuY3Rpb24gU3RyZWFtQ2lwaGVyIChtb2RlLCBrZXksIGl2LCBkZWNyeXB0KSB7XG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMpXG5cbiAgdmFyIGggPSBCdWZmZXIuYWxsb2MoNCwgMClcblxuICB0aGlzLl9jaXBoZXIgPSBuZXcgYWVzLkFFUyhrZXkpXG4gIHZhciBjayA9IHRoaXMuX2NpcGhlci5lbmNyeXB0QmxvY2soaClcbiAgdGhpcy5fZ2hhc2ggPSBuZXcgR0hBU0goY2spXG4gIGl2ID0gY2FsY0l2KHRoaXMsIGl2LCBjaylcblxuICB0aGlzLl9wcmV2ID0gQnVmZmVyLmZyb20oaXYpXG4gIHRoaXMuX2NhY2hlID0gQnVmZmVyLmFsbG9jVW5zYWZlKDApXG4gIHRoaXMuX3NlY0NhY2hlID0gQnVmZmVyLmFsbG9jVW5zYWZlKDApXG4gIHRoaXMuX2RlY3J5cHQgPSBkZWNyeXB0XG4gIHRoaXMuX2FsZW4gPSAwXG4gIHRoaXMuX2xlbiA9IDBcbiAgdGhpcy5fbW9kZSA9IG1vZGVcblxuICB0aGlzLl9hdXRoVGFnID0gbnVsbFxuICB0aGlzLl9jYWxsZWQgPSBmYWxzZVxufVxuXG5pbmhlcml0cyhTdHJlYW1DaXBoZXIsIFRyYW5zZm9ybSlcblxuU3RyZWFtQ2lwaGVyLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIGlmICghdGhpcy5fY2FsbGVkICYmIHRoaXMuX2FsZW4pIHtcbiAgICB2YXIgcnVtcCA9IDE2IC0gKHRoaXMuX2FsZW4gJSAxNilcbiAgICBpZiAocnVtcCA8IDE2KSB7XG4gICAgICBydW1wID0gQnVmZmVyLmFsbG9jKHJ1bXAsIDApXG4gICAgICB0aGlzLl9naGFzaC51cGRhdGUocnVtcClcbiAgICB9XG4gIH1cblxuICB0aGlzLl9jYWxsZWQgPSB0cnVlXG4gIHZhciBvdXQgPSB0aGlzLl9tb2RlLmVuY3J5cHQodGhpcywgY2h1bmspXG4gIGlmICh0aGlzLl9kZWNyeXB0KSB7XG4gICAgdGhpcy5fZ2hhc2gudXBkYXRlKGNodW5rKVxuICB9IGVsc2Uge1xuICAgIHRoaXMuX2doYXNoLnVwZGF0ZShvdXQpXG4gIH1cbiAgdGhpcy5fbGVuICs9IGNodW5rLmxlbmd0aFxuICByZXR1cm4gb3V0XG59XG5cblN0cmVhbUNpcGhlci5wcm90b3R5cGUuX2ZpbmFsID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5fZGVjcnlwdCAmJiAhdGhpcy5fYXV0aFRhZykgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBzdGF0ZSBvciB1bmFibGUgdG8gYXV0aGVudGljYXRlIGRhdGEnKVxuXG4gIHZhciB0YWcgPSB4b3IodGhpcy5fZ2hhc2guZmluYWwodGhpcy5fYWxlbiAqIDgsIHRoaXMuX2xlbiAqIDgpLCB0aGlzLl9jaXBoZXIuZW5jcnlwdEJsb2NrKHRoaXMuX2ZpbklEKSlcbiAgaWYgKHRoaXMuX2RlY3J5cHQgJiYgeG9yVGVzdCh0YWcsIHRoaXMuX2F1dGhUYWcpKSB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIHN0YXRlIG9yIHVuYWJsZSB0byBhdXRoZW50aWNhdGUgZGF0YScpXG5cbiAgdGhpcy5fYXV0aFRhZyA9IHRhZ1xuICB0aGlzLl9jaXBoZXIuc2NydWIoKVxufVxuXG5TdHJlYW1DaXBoZXIucHJvdG90eXBlLmdldEF1dGhUYWcgPSBmdW5jdGlvbiBnZXRBdXRoVGFnICgpIHtcbiAgaWYgKHRoaXMuX2RlY3J5cHQgfHwgIUJ1ZmZlci5pc0J1ZmZlcih0aGlzLl9hdXRoVGFnKSkgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0aW5nIHRvIGdldCBhdXRoIHRhZyBpbiB1bnN1cHBvcnRlZCBzdGF0ZScpXG5cbiAgcmV0dXJuIHRoaXMuX2F1dGhUYWdcbn1cblxuU3RyZWFtQ2lwaGVyLnByb3RvdHlwZS5zZXRBdXRoVGFnID0gZnVuY3Rpb24gc2V0QXV0aFRhZyAodGFnKSB7XG4gIGlmICghdGhpcy5fZGVjcnlwdCkgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0aW5nIHRvIHNldCBhdXRoIHRhZyBpbiB1bnN1cHBvcnRlZCBzdGF0ZScpXG5cbiAgdGhpcy5fYXV0aFRhZyA9IHRhZ1xufVxuXG5TdHJlYW1DaXBoZXIucHJvdG90eXBlLnNldEFBRCA9IGZ1bmN0aW9uIHNldEFBRCAoYnVmKSB7XG4gIGlmICh0aGlzLl9jYWxsZWQpIHRocm93IG5ldyBFcnJvcignQXR0ZW1wdGluZyB0byBzZXQgQUFEIGluIHVuc3VwcG9ydGVkIHN0YXRlJylcblxuICB0aGlzLl9naGFzaC51cGRhdGUoYnVmKVxuICB0aGlzLl9hbGVuICs9IGJ1Zi5sZW5ndGhcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTdHJlYW1DaXBoZXJcbiIsInZhciBjaXBoZXJzID0gcmVxdWlyZSgnLi9lbmNyeXB0ZXInKVxudmFyIGRlY2lwaGVycyA9IHJlcXVpcmUoJy4vZGVjcnlwdGVyJylcbnZhciBtb2RlcyA9IHJlcXVpcmUoJy4vbW9kZXMvbGlzdC5qc29uJylcblxuZnVuY3Rpb24gZ2V0Q2lwaGVycyAoKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhtb2Rlcylcbn1cblxuZXhwb3J0cy5jcmVhdGVDaXBoZXIgPSBleHBvcnRzLkNpcGhlciA9IGNpcGhlcnMuY3JlYXRlQ2lwaGVyXG5leHBvcnRzLmNyZWF0ZUNpcGhlcml2ID0gZXhwb3J0cy5DaXBoZXJpdiA9IGNpcGhlcnMuY3JlYXRlQ2lwaGVyaXZcbmV4cG9ydHMuY3JlYXRlRGVjaXBoZXIgPSBleHBvcnRzLkRlY2lwaGVyID0gZGVjaXBoZXJzLmNyZWF0ZURlY2lwaGVyXG5leHBvcnRzLmNyZWF0ZURlY2lwaGVyaXYgPSBleHBvcnRzLkRlY2lwaGVyaXYgPSBkZWNpcGhlcnMuY3JlYXRlRGVjaXBoZXJpdlxuZXhwb3J0cy5saXN0Q2lwaGVycyA9IGV4cG9ydHMuZ2V0Q2lwaGVycyA9IGdldENpcGhlcnNcbiIsInZhciBBdXRoQ2lwaGVyID0gcmVxdWlyZSgnLi9hdXRoQ2lwaGVyJylcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlclxudmFyIE1PREVTID0gcmVxdWlyZSgnLi9tb2RlcycpXG52YXIgU3RyZWFtQ2lwaGVyID0gcmVxdWlyZSgnLi9zdHJlYW1DaXBoZXInKVxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJ2NpcGhlci1iYXNlJylcbnZhciBhZXMgPSByZXF1aXJlKCcuL2FlcycpXG52YXIgZWJ0ayA9IHJlcXVpcmUoJ2V2cF9ieXRlc3Rva2V5JylcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcblxuZnVuY3Rpb24gRGVjaXBoZXIgKG1vZGUsIGtleSwgaXYpIHtcbiAgVHJhbnNmb3JtLmNhbGwodGhpcylcblxuICB0aGlzLl9jYWNoZSA9IG5ldyBTcGxpdHRlcigpXG4gIHRoaXMuX2xhc3QgPSB2b2lkIDBcbiAgdGhpcy5fY2lwaGVyID0gbmV3IGFlcy5BRVMoa2V5KVxuICB0aGlzLl9wcmV2ID0gQnVmZmVyLmZyb20oaXYpXG4gIHRoaXMuX21vZGUgPSBtb2RlXG4gIHRoaXMuX2F1dG9wYWRkaW5nID0gdHJ1ZVxufVxuXG5pbmhlcml0cyhEZWNpcGhlciwgVHJhbnNmb3JtKVxuXG5EZWNpcGhlci5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHRoaXMuX2NhY2hlLmFkZChkYXRhKVxuICB2YXIgY2h1bmtcbiAgdmFyIHRoaW5nXG4gIHZhciBvdXQgPSBbXVxuICB3aGlsZSAoKGNodW5rID0gdGhpcy5fY2FjaGUuZ2V0KHRoaXMuX2F1dG9wYWRkaW5nKSkpIHtcbiAgICB0aGluZyA9IHRoaXMuX21vZGUuZGVjcnlwdCh0aGlzLCBjaHVuaylcbiAgICBvdXQucHVzaCh0aGluZylcbiAgfVxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChvdXQpXG59XG5cbkRlY2lwaGVyLnByb3RvdHlwZS5fZmluYWwgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjaHVuayA9IHRoaXMuX2NhY2hlLmZsdXNoKClcbiAgaWYgKHRoaXMuX2F1dG9wYWRkaW5nKSB7XG4gICAgcmV0dXJuIHVucGFkKHRoaXMuX21vZGUuZGVjcnlwdCh0aGlzLCBjaHVuaykpXG4gIH0gZWxzZSBpZiAoY2h1bmspIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2RhdGEgbm90IG11bHRpcGxlIG9mIGJsb2NrIGxlbmd0aCcpXG4gIH1cbn1cblxuRGVjaXBoZXIucHJvdG90eXBlLnNldEF1dG9QYWRkaW5nID0gZnVuY3Rpb24gKHNldFRvKSB7XG4gIHRoaXMuX2F1dG9wYWRkaW5nID0gISFzZXRUb1xuICByZXR1cm4gdGhpc1xufVxuXG5mdW5jdGlvbiBTcGxpdHRlciAoKSB7XG4gIHRoaXMuY2FjaGUgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMClcbn1cblxuU3BsaXR0ZXIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHRoaXMuY2FjaGUgPSBCdWZmZXIuY29uY2F0KFt0aGlzLmNhY2hlLCBkYXRhXSlcbn1cblxuU3BsaXR0ZXIucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChhdXRvUGFkZGluZykge1xuICB2YXIgb3V0XG4gIGlmIChhdXRvUGFkZGluZykge1xuICAgIGlmICh0aGlzLmNhY2hlLmxlbmd0aCA+IDE2KSB7XG4gICAgICBvdXQgPSB0aGlzLmNhY2hlLnNsaWNlKDAsIDE2KVxuICAgICAgdGhpcy5jYWNoZSA9IHRoaXMuY2FjaGUuc2xpY2UoMTYpXG4gICAgICByZXR1cm4gb3V0XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh0aGlzLmNhY2hlLmxlbmd0aCA+PSAxNikge1xuICAgICAgb3V0ID0gdGhpcy5jYWNoZS5zbGljZSgwLCAxNilcbiAgICAgIHRoaXMuY2FjaGUgPSB0aGlzLmNhY2hlLnNsaWNlKDE2KVxuICAgICAgcmV0dXJuIG91dFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cblNwbGl0dGVyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY2FjaGUubGVuZ3RoKSByZXR1cm4gdGhpcy5jYWNoZVxufVxuXG5mdW5jdGlvbiB1bnBhZCAobGFzdCkge1xuICB2YXIgcGFkZGVkID0gbGFzdFsxNV1cbiAgaWYgKHBhZGRlZCA8IDEgfHwgcGFkZGVkID4gMTYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuYWJsZSB0byBkZWNyeXB0IGRhdGEnKVxuICB9XG4gIHZhciBpID0gLTFcbiAgd2hpbGUgKCsraSA8IHBhZGRlZCkge1xuICAgIGlmIChsYXN0WyhpICsgKDE2IC0gcGFkZGVkKSldICE9PSBwYWRkZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5hYmxlIHRvIGRlY3J5cHQgZGF0YScpXG4gICAgfVxuICB9XG4gIGlmIChwYWRkZWQgPT09IDE2KSByZXR1cm5cblxuICByZXR1cm4gbGFzdC5zbGljZSgwLCAxNiAtIHBhZGRlZClcbn1cblxuZnVuY3Rpb24gY3JlYXRlRGVjaXBoZXJpdiAoc3VpdGUsIHBhc3N3b3JkLCBpdikge1xuICB2YXIgY29uZmlnID0gTU9ERVNbc3VpdGUudG9Mb3dlckNhc2UoKV1cbiAgaWYgKCFjb25maWcpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgc3VpdGUgdHlwZScpXG5cbiAgaWYgKHR5cGVvZiBpdiA9PT0gJ3N0cmluZycpIGl2ID0gQnVmZmVyLmZyb20oaXYpXG4gIGlmIChjb25maWcubW9kZSAhPT0gJ0dDTScgJiYgaXYubGVuZ3RoICE9PSBjb25maWcuaXYpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgaXYgbGVuZ3RoICcgKyBpdi5sZW5ndGgpXG5cbiAgaWYgKHR5cGVvZiBwYXNzd29yZCA9PT0gJ3N0cmluZycpIHBhc3N3b3JkID0gQnVmZmVyLmZyb20ocGFzc3dvcmQpXG4gIGlmIChwYXNzd29yZC5sZW5ndGggIT09IGNvbmZpZy5rZXkgLyA4KSB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIGtleSBsZW5ndGggJyArIHBhc3N3b3JkLmxlbmd0aClcblxuICBpZiAoY29uZmlnLnR5cGUgPT09ICdzdHJlYW0nKSB7XG4gICAgcmV0dXJuIG5ldyBTdHJlYW1DaXBoZXIoY29uZmlnLm1vZHVsZSwgcGFzc3dvcmQsIGl2LCB0cnVlKVxuICB9IGVsc2UgaWYgKGNvbmZpZy50eXBlID09PSAnYXV0aCcpIHtcbiAgICByZXR1cm4gbmV3IEF1dGhDaXBoZXIoY29uZmlnLm1vZHVsZSwgcGFzc3dvcmQsIGl2LCB0cnVlKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBEZWNpcGhlcihjb25maWcubW9kdWxlLCBwYXNzd29yZCwgaXYpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURlY2lwaGVyIChzdWl0ZSwgcGFzc3dvcmQpIHtcbiAgdmFyIGNvbmZpZyA9IE1PREVTW3N1aXRlLnRvTG93ZXJDYXNlKCldXG4gIGlmICghY29uZmlnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHN1aXRlIHR5cGUnKVxuXG4gIHZhciBrZXlzID0gZWJ0ayhwYXNzd29yZCwgZmFsc2UsIGNvbmZpZy5rZXksIGNvbmZpZy5pdilcbiAgcmV0dXJuIGNyZWF0ZURlY2lwaGVyaXYoc3VpdGUsIGtleXMua2V5LCBrZXlzLml2KVxufVxuXG5leHBvcnRzLmNyZWF0ZURlY2lwaGVyID0gY3JlYXRlRGVjaXBoZXJcbmV4cG9ydHMuY3JlYXRlRGVjaXBoZXJpdiA9IGNyZWF0ZURlY2lwaGVyaXZcbiIsInZhciBNT0RFUyA9IHJlcXVpcmUoJy4vbW9kZXMnKVxudmFyIEF1dGhDaXBoZXIgPSByZXF1aXJlKCcuL2F1dGhDaXBoZXInKVxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyXG52YXIgU3RyZWFtQ2lwaGVyID0gcmVxdWlyZSgnLi9zdHJlYW1DaXBoZXInKVxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJ2NpcGhlci1iYXNlJylcbnZhciBhZXMgPSByZXF1aXJlKCcuL2FlcycpXG52YXIgZWJ0ayA9IHJlcXVpcmUoJ2V2cF9ieXRlc3Rva2V5JylcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcblxuZnVuY3Rpb24gQ2lwaGVyIChtb2RlLCBrZXksIGl2KSB7XG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMpXG5cbiAgdGhpcy5fY2FjaGUgPSBuZXcgU3BsaXR0ZXIoKVxuICB0aGlzLl9jaXBoZXIgPSBuZXcgYWVzLkFFUyhrZXkpXG4gIHRoaXMuX3ByZXYgPSBCdWZmZXIuZnJvbShpdilcbiAgdGhpcy5fbW9kZSA9IG1vZGVcbiAgdGhpcy5fYXV0b3BhZGRpbmcgPSB0cnVlXG59XG5cbmluaGVyaXRzKENpcGhlciwgVHJhbnNmb3JtKVxuXG5DaXBoZXIucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICB0aGlzLl9jYWNoZS5hZGQoZGF0YSlcbiAgdmFyIGNodW5rXG4gIHZhciB0aGluZ1xuICB2YXIgb3V0ID0gW11cblxuICB3aGlsZSAoKGNodW5rID0gdGhpcy5fY2FjaGUuZ2V0KCkpKSB7XG4gICAgdGhpbmcgPSB0aGlzLl9tb2RlLmVuY3J5cHQodGhpcywgY2h1bmspXG4gICAgb3V0LnB1c2godGhpbmcpXG4gIH1cblxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChvdXQpXG59XG5cbnZhciBQQURESU5HID0gQnVmZmVyLmFsbG9jKDE2LCAweDEwKVxuXG5DaXBoZXIucHJvdG90eXBlLl9maW5hbCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNodW5rID0gdGhpcy5fY2FjaGUuZmx1c2goKVxuICBpZiAodGhpcy5fYXV0b3BhZGRpbmcpIHtcbiAgICBjaHVuayA9IHRoaXMuX21vZGUuZW5jcnlwdCh0aGlzLCBjaHVuaylcbiAgICB0aGlzLl9jaXBoZXIuc2NydWIoKVxuICAgIHJldHVybiBjaHVua1xuICB9XG5cbiAgaWYgKCFjaHVuay5lcXVhbHMoUEFERElORykpIHtcbiAgICB0aGlzLl9jaXBoZXIuc2NydWIoKVxuICAgIHRocm93IG5ldyBFcnJvcignZGF0YSBub3QgbXVsdGlwbGUgb2YgYmxvY2sgbGVuZ3RoJylcbiAgfVxufVxuXG5DaXBoZXIucHJvdG90eXBlLnNldEF1dG9QYWRkaW5nID0gZnVuY3Rpb24gKHNldFRvKSB7XG4gIHRoaXMuX2F1dG9wYWRkaW5nID0gISFzZXRUb1xuICByZXR1cm4gdGhpc1xufVxuXG5mdW5jdGlvbiBTcGxpdHRlciAoKSB7XG4gIHRoaXMuY2FjaGUgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMClcbn1cblxuU3BsaXR0ZXIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHRoaXMuY2FjaGUgPSBCdWZmZXIuY29uY2F0KFt0aGlzLmNhY2hlLCBkYXRhXSlcbn1cblxuU3BsaXR0ZXIucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY2FjaGUubGVuZ3RoID4gMTUpIHtcbiAgICB2YXIgb3V0ID0gdGhpcy5jYWNoZS5zbGljZSgwLCAxNilcbiAgICB0aGlzLmNhY2hlID0gdGhpcy5jYWNoZS5zbGljZSgxNilcbiAgICByZXR1cm4gb3V0XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuU3BsaXR0ZXIucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbGVuID0gMTYgLSB0aGlzLmNhY2hlLmxlbmd0aFxuICB2YXIgcGFkQnVmZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW4pXG5cbiAgdmFyIGkgPSAtMVxuICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgcGFkQnVmZi53cml0ZVVJbnQ4KGxlbiwgaSlcbiAgfVxuXG4gIHJldHVybiBCdWZmZXIuY29uY2F0KFt0aGlzLmNhY2hlLCBwYWRCdWZmXSlcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2lwaGVyaXYgKHN1aXRlLCBwYXNzd29yZCwgaXYpIHtcbiAgdmFyIGNvbmZpZyA9IE1PREVTW3N1aXRlLnRvTG93ZXJDYXNlKCldXG4gIGlmICghY29uZmlnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHN1aXRlIHR5cGUnKVxuXG4gIGlmICh0eXBlb2YgcGFzc3dvcmQgPT09ICdzdHJpbmcnKSBwYXNzd29yZCA9IEJ1ZmZlci5mcm9tKHBhc3N3b3JkKVxuICBpZiAocGFzc3dvcmQubGVuZ3RoICE9PSBjb25maWcua2V5IC8gOCkgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBrZXkgbGVuZ3RoICcgKyBwYXNzd29yZC5sZW5ndGgpXG5cbiAgaWYgKHR5cGVvZiBpdiA9PT0gJ3N0cmluZycpIGl2ID0gQnVmZmVyLmZyb20oaXYpXG4gIGlmIChjb25maWcubW9kZSAhPT0gJ0dDTScgJiYgaXYubGVuZ3RoICE9PSBjb25maWcuaXYpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgaXYgbGVuZ3RoICcgKyBpdi5sZW5ndGgpXG5cbiAgaWYgKGNvbmZpZy50eXBlID09PSAnc3RyZWFtJykge1xuICAgIHJldHVybiBuZXcgU3RyZWFtQ2lwaGVyKGNvbmZpZy5tb2R1bGUsIHBhc3N3b3JkLCBpdilcbiAgfSBlbHNlIGlmIChjb25maWcudHlwZSA9PT0gJ2F1dGgnKSB7XG4gICAgcmV0dXJuIG5ldyBBdXRoQ2lwaGVyKGNvbmZpZy5tb2R1bGUsIHBhc3N3b3JkLCBpdilcbiAgfVxuXG4gIHJldHVybiBuZXcgQ2lwaGVyKGNvbmZpZy5tb2R1bGUsIHBhc3N3b3JkLCBpdilcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2lwaGVyIChzdWl0ZSwgcGFzc3dvcmQpIHtcbiAgdmFyIGNvbmZpZyA9IE1PREVTW3N1aXRlLnRvTG93ZXJDYXNlKCldXG4gIGlmICghY29uZmlnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHN1aXRlIHR5cGUnKVxuXG4gIHZhciBrZXlzID0gZWJ0ayhwYXNzd29yZCwgZmFsc2UsIGNvbmZpZy5rZXksIGNvbmZpZy5pdilcbiAgcmV0dXJuIGNyZWF0ZUNpcGhlcml2KHN1aXRlLCBrZXlzLmtleSwga2V5cy5pdilcbn1cblxuZXhwb3J0cy5jcmVhdGVDaXBoZXJpdiA9IGNyZWF0ZUNpcGhlcml2XG5leHBvcnRzLmNyZWF0ZUNpcGhlciA9IGNyZWF0ZUNpcGhlclxuIiwidmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyXG52YXIgWkVST0VTID0gQnVmZmVyLmFsbG9jKDE2LCAwKVxuXG5mdW5jdGlvbiB0b0FycmF5IChidWYpIHtcbiAgcmV0dXJuIFtcbiAgICBidWYucmVhZFVJbnQzMkJFKDApLFxuICAgIGJ1Zi5yZWFkVUludDMyQkUoNCksXG4gICAgYnVmLnJlYWRVSW50MzJCRSg4KSxcbiAgICBidWYucmVhZFVJbnQzMkJFKDEyKVxuICBdXG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheSAob3V0KSB7XG4gIHZhciBidWYgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMTYpXG4gIGJ1Zi53cml0ZVVJbnQzMkJFKG91dFswXSA+Pj4gMCwgMClcbiAgYnVmLndyaXRlVUludDMyQkUob3V0WzFdID4+PiAwLCA0KVxuICBidWYud3JpdGVVSW50MzJCRShvdXRbMl0gPj4+IDAsIDgpXG4gIGJ1Zi53cml0ZVVJbnQzMkJFKG91dFszXSA+Pj4gMCwgMTIpXG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gR0hBU0ggKGtleSkge1xuICB0aGlzLmggPSBrZXlcbiAgdGhpcy5zdGF0ZSA9IEJ1ZmZlci5hbGxvYygxNiwgMClcbiAgdGhpcy5jYWNoZSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgwKVxufVxuXG4vLyBmcm9tIGh0dHA6Ly9iaXR3aXNlc2hpZnRsZWZ0LmdpdGh1Yi5pby9zamNsL2RvYy9zeW1ib2xzL3NyYy9jb3JlX2djbS5qcy5odG1sXG4vLyBieSBKdWhvIFbDpGjDpC1IZXJ0dHVhXG5HSEFTSC5wcm90b3R5cGUuZ2hhc2ggPSBmdW5jdGlvbiAoYmxvY2spIHtcbiAgdmFyIGkgPSAtMVxuICB3aGlsZSAoKytpIDwgYmxvY2subGVuZ3RoKSB7XG4gICAgdGhpcy5zdGF0ZVtpXSBePSBibG9ja1tpXVxuICB9XG4gIHRoaXMuX211bHRpcGx5KClcbn1cblxuR0hBU0gucHJvdG90eXBlLl9tdWx0aXBseSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIFZpID0gdG9BcnJheSh0aGlzLmgpXG4gIHZhciBaaSA9IFswLCAwLCAwLCAwXVxuICB2YXIgaiwgeGksIGxzYlZpXG4gIHZhciBpID0gLTFcbiAgd2hpbGUgKCsraSA8IDEyOCkge1xuICAgIHhpID0gKHRoaXMuc3RhdGVbfn4oaSAvIDgpXSAmICgxIDw8ICg3IC0gKGkgJSA4KSkpKSAhPT0gMFxuICAgIGlmICh4aSkge1xuICAgICAgLy8gWl9pKzEgPSBaX2kgXiBWX2lcbiAgICAgIFppWzBdIF49IFZpWzBdXG4gICAgICBaaVsxXSBePSBWaVsxXVxuICAgICAgWmlbMl0gXj0gVmlbMl1cbiAgICAgIFppWzNdIF49IFZpWzNdXG4gICAgfVxuXG4gICAgLy8gU3RvcmUgdGhlIHZhbHVlIG9mIExTQihWX2kpXG4gICAgbHNiVmkgPSAoVmlbM10gJiAxKSAhPT0gMFxuXG4gICAgLy8gVl9pKzEgPSBWX2kgPj4gMVxuICAgIGZvciAoaiA9IDM7IGogPiAwOyBqLS0pIHtcbiAgICAgIFZpW2pdID0gKFZpW2pdID4+PiAxKSB8ICgoVmlbaiAtIDFdICYgMSkgPDwgMzEpXG4gICAgfVxuICAgIFZpWzBdID0gVmlbMF0gPj4+IDFcblxuICAgIC8vIElmIExTQihWX2kpIGlzIDEsIFZfaSsxID0gKFZfaSA+PiAxKSBeIFJcbiAgICBpZiAobHNiVmkpIHtcbiAgICAgIFZpWzBdID0gVmlbMF0gXiAoMHhlMSA8PCAyNClcbiAgICB9XG4gIH1cbiAgdGhpcy5zdGF0ZSA9IGZyb21BcnJheShaaSlcbn1cblxuR0hBU0gucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChidWYpIHtcbiAgdGhpcy5jYWNoZSA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuY2FjaGUsIGJ1Zl0pXG4gIHZhciBjaHVua1xuICB3aGlsZSAodGhpcy5jYWNoZS5sZW5ndGggPj0gMTYpIHtcbiAgICBjaHVuayA9IHRoaXMuY2FjaGUuc2xpY2UoMCwgMTYpXG4gICAgdGhpcy5jYWNoZSA9IHRoaXMuY2FjaGUuc2xpY2UoMTYpXG4gICAgdGhpcy5naGFzaChjaHVuaylcbiAgfVxufVxuXG5HSEFTSC5wcm90b3R5cGUuZmluYWwgPSBmdW5jdGlvbiAoYWJsLCBibCkge1xuICBpZiAodGhpcy5jYWNoZS5sZW5ndGgpIHtcbiAgICB0aGlzLmdoYXNoKEJ1ZmZlci5jb25jYXQoW3RoaXMuY2FjaGUsIFpFUk9FU10sIDE2KSlcbiAgfVxuXG4gIHRoaXMuZ2hhc2goZnJvbUFycmF5KFswLCBhYmwsIDAsIGJsXSkpXG4gIHJldHVybiB0aGlzLnN0YXRlXG59XG5cbm1vZHVsZS5leHBvcnRzID0gR0hBU0hcbiIsImZ1bmN0aW9uIGluY3IzMiAoaXYpIHtcbiAgdmFyIGxlbiA9IGl2Lmxlbmd0aFxuICB2YXIgaXRlbVxuICB3aGlsZSAobGVuLS0pIHtcbiAgICBpdGVtID0gaXYucmVhZFVJbnQ4KGxlbilcbiAgICBpZiAoaXRlbSA9PT0gMjU1KSB7XG4gICAgICBpdi53cml0ZVVJbnQ4KDAsIGxlbilcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbSsrXG4gICAgICBpdi53cml0ZVVJbnQ4KGl0ZW0sIGxlbilcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluY3IzMlxuIiwidmFyIHhvciA9IHJlcXVpcmUoJ2J1ZmZlci14b3InKVxuXG5leHBvcnRzLmVuY3J5cHQgPSBmdW5jdGlvbiAoc2VsZiwgYmxvY2spIHtcbiAgdmFyIGRhdGEgPSB4b3IoYmxvY2ssIHNlbGYuX3ByZXYpXG5cbiAgc2VsZi5fcHJldiA9IHNlbGYuX2NpcGhlci5lbmNyeXB0QmxvY2soZGF0YSlcbiAgcmV0dXJuIHNlbGYuX3ByZXZcbn1cblxuZXhwb3J0cy5kZWNyeXB0ID0gZnVuY3Rpb24gKHNlbGYsIGJsb2NrKSB7XG4gIHZhciBwYWQgPSBzZWxmLl9wcmV2XG5cbiAgc2VsZi5fcHJldiA9IGJsb2NrXG4gIHZhciBvdXQgPSBzZWxmLl9jaXBoZXIuZGVjcnlwdEJsb2NrKGJsb2NrKVxuXG4gIHJldHVybiB4b3Iob3V0LCBwYWQpXG59XG4iLCJ2YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcbnZhciB4b3IgPSByZXF1aXJlKCdidWZmZXIteG9yJylcblxuZnVuY3Rpb24gZW5jcnlwdFN0YXJ0IChzZWxmLCBkYXRhLCBkZWNyeXB0KSB7XG4gIHZhciBsZW4gPSBkYXRhLmxlbmd0aFxuICB2YXIgb3V0ID0geG9yKGRhdGEsIHNlbGYuX2NhY2hlKVxuICBzZWxmLl9jYWNoZSA9IHNlbGYuX2NhY2hlLnNsaWNlKGxlbilcbiAgc2VsZi5fcHJldiA9IEJ1ZmZlci5jb25jYXQoW3NlbGYuX3ByZXYsIGRlY3J5cHQgPyBkYXRhIDogb3V0XSlcbiAgcmV0dXJuIG91dFxufVxuXG5leHBvcnRzLmVuY3J5cHQgPSBmdW5jdGlvbiAoc2VsZiwgZGF0YSwgZGVjcnlwdCkge1xuICB2YXIgb3V0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKDApXG4gIHZhciBsZW5cblxuICB3aGlsZSAoZGF0YS5sZW5ndGgpIHtcbiAgICBpZiAoc2VsZi5fY2FjaGUubGVuZ3RoID09PSAwKSB7XG4gICAgICBzZWxmLl9jYWNoZSA9IHNlbGYuX2NpcGhlci5lbmNyeXB0QmxvY2soc2VsZi5fcHJldilcbiAgICAgIHNlbGYuX3ByZXYgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMClcbiAgICB9XG5cbiAgICBpZiAoc2VsZi5fY2FjaGUubGVuZ3RoIDw9IGRhdGEubGVuZ3RoKSB7XG4gICAgICBsZW4gPSBzZWxmLl9jYWNoZS5sZW5ndGhcbiAgICAgIG91dCA9IEJ1ZmZlci5jb25jYXQoW291dCwgZW5jcnlwdFN0YXJ0KHNlbGYsIGRhdGEuc2xpY2UoMCwgbGVuKSwgZGVjcnlwdCldKVxuICAgICAgZGF0YSA9IGRhdGEuc2xpY2UobGVuKVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgPSBCdWZmZXIuY29uY2F0KFtvdXQsIGVuY3J5cHRTdGFydChzZWxmLCBkYXRhLCBkZWNyeXB0KV0pXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRcbn1cbiIsInZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlclxuXG5mdW5jdGlvbiBlbmNyeXB0Qnl0ZSAoc2VsZiwgYnl0ZVBhcmFtLCBkZWNyeXB0KSB7XG4gIHZhciBwYWRcbiAgdmFyIGkgPSAtMVxuICB2YXIgbGVuID0gOFxuICB2YXIgb3V0ID0gMFxuICB2YXIgYml0LCB2YWx1ZVxuICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgcGFkID0gc2VsZi5fY2lwaGVyLmVuY3J5cHRCbG9jayhzZWxmLl9wcmV2KVxuICAgIGJpdCA9IChieXRlUGFyYW0gJiAoMSA8PCAoNyAtIGkpKSkgPyAweDgwIDogMFxuICAgIHZhbHVlID0gcGFkWzBdIF4gYml0XG4gICAgb3V0ICs9ICgodmFsdWUgJiAweDgwKSA+PiAoaSAlIDgpKVxuICAgIHNlbGYuX3ByZXYgPSBzaGlmdEluKHNlbGYuX3ByZXYsIGRlY3J5cHQgPyBiaXQgOiB2YWx1ZSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHNoaWZ0SW4gKGJ1ZmZlciwgdmFsdWUpIHtcbiAgdmFyIGxlbiA9IGJ1ZmZlci5sZW5ndGhcbiAgdmFyIGkgPSAtMVxuICB2YXIgb3V0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKGJ1ZmZlci5sZW5ndGgpXG4gIGJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW2J1ZmZlciwgQnVmZmVyLmZyb20oW3ZhbHVlXSldKVxuXG4gIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICBvdXRbaV0gPSBidWZmZXJbaV0gPDwgMSB8IGJ1ZmZlcltpICsgMV0gPj4gKDcpXG4gIH1cblxuICByZXR1cm4gb3V0XG59XG5cbmV4cG9ydHMuZW5jcnlwdCA9IGZ1bmN0aW9uIChzZWxmLCBjaHVuaywgZGVjcnlwdCkge1xuICB2YXIgbGVuID0gY2h1bmsubGVuZ3RoXG4gIHZhciBvdXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuKVxuICB2YXIgaSA9IC0xXG5cbiAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgIG91dFtpXSA9IGVuY3J5cHRCeXRlKHNlbGYsIGNodW5rW2ldLCBkZWNyeXB0KVxuICB9XG5cbiAgcmV0dXJuIG91dFxufVxuIiwidmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyXG5cbmZ1bmN0aW9uIGVuY3J5cHRCeXRlIChzZWxmLCBieXRlUGFyYW0sIGRlY3J5cHQpIHtcbiAgdmFyIHBhZCA9IHNlbGYuX2NpcGhlci5lbmNyeXB0QmxvY2soc2VsZi5fcHJldilcbiAgdmFyIG91dCA9IHBhZFswXSBeIGJ5dGVQYXJhbVxuXG4gIHNlbGYuX3ByZXYgPSBCdWZmZXIuY29uY2F0KFtcbiAgICBzZWxmLl9wcmV2LnNsaWNlKDEpLFxuICAgIEJ1ZmZlci5mcm9tKFtkZWNyeXB0ID8gYnl0ZVBhcmFtIDogb3V0XSlcbiAgXSlcblxuICByZXR1cm4gb3V0XG59XG5cbmV4cG9ydHMuZW5jcnlwdCA9IGZ1bmN0aW9uIChzZWxmLCBjaHVuaywgZGVjcnlwdCkge1xuICB2YXIgbGVuID0gY2h1bmsubGVuZ3RoXG4gIHZhciBvdXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuKVxuICB2YXIgaSA9IC0xXG5cbiAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgIG91dFtpXSA9IGVuY3J5cHRCeXRlKHNlbGYsIGNodW5rW2ldLCBkZWNyeXB0KVxuICB9XG5cbiAgcmV0dXJuIG91dFxufVxuIiwidmFyIHhvciA9IHJlcXVpcmUoJ2J1ZmZlci14b3InKVxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyXG52YXIgaW5jcjMyID0gcmVxdWlyZSgnLi4vaW5jcjMyJylcblxuZnVuY3Rpb24gZ2V0QmxvY2sgKHNlbGYpIHtcbiAgdmFyIG91dCA9IHNlbGYuX2NpcGhlci5lbmNyeXB0QmxvY2tSYXcoc2VsZi5fcHJldilcbiAgaW5jcjMyKHNlbGYuX3ByZXYpXG4gIHJldHVybiBvdXRcbn1cblxudmFyIGJsb2NrU2l6ZSA9IDE2XG5leHBvcnRzLmVuY3J5cHQgPSBmdW5jdGlvbiAoc2VsZiwgY2h1bmspIHtcbiAgdmFyIGNodW5rTnVtID0gTWF0aC5jZWlsKGNodW5rLmxlbmd0aCAvIGJsb2NrU2l6ZSlcbiAgdmFyIHN0YXJ0ID0gc2VsZi5fY2FjaGUubGVuZ3RoXG4gIHNlbGYuX2NhY2hlID0gQnVmZmVyLmNvbmNhdChbXG4gICAgc2VsZi5fY2FjaGUsXG4gICAgQnVmZmVyLmFsbG9jVW5zYWZlKGNodW5rTnVtICogYmxvY2tTaXplKVxuICBdKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNodW5rTnVtOyBpKyspIHtcbiAgICB2YXIgb3V0ID0gZ2V0QmxvY2soc2VsZilcbiAgICB2YXIgb2Zmc2V0ID0gc3RhcnQgKyBpICogYmxvY2tTaXplXG4gICAgc2VsZi5fY2FjaGUud3JpdGVVSW50MzJCRShvdXRbMF0sIG9mZnNldCArIDApXG4gICAgc2VsZi5fY2FjaGUud3JpdGVVSW50MzJCRShvdXRbMV0sIG9mZnNldCArIDQpXG4gICAgc2VsZi5fY2FjaGUud3JpdGVVSW50MzJCRShvdXRbMl0sIG9mZnNldCArIDgpXG4gICAgc2VsZi5fY2FjaGUud3JpdGVVSW50MzJCRShvdXRbM10sIG9mZnNldCArIDEyKVxuICB9XG4gIHZhciBwYWQgPSBzZWxmLl9jYWNoZS5zbGljZSgwLCBjaHVuay5sZW5ndGgpXG4gIHNlbGYuX2NhY2hlID0gc2VsZi5fY2FjaGUuc2xpY2UoY2h1bmsubGVuZ3RoKVxuICByZXR1cm4geG9yKGNodW5rLCBwYWQpXG59XG4iLCJleHBvcnRzLmVuY3J5cHQgPSBmdW5jdGlvbiAoc2VsZiwgYmxvY2spIHtcbiAgcmV0dXJuIHNlbGYuX2NpcGhlci5lbmNyeXB0QmxvY2soYmxvY2spXG59XG5cbmV4cG9ydHMuZGVjcnlwdCA9IGZ1bmN0aW9uIChzZWxmLCBibG9jaykge1xuICByZXR1cm4gc2VsZi5fY2lwaGVyLmRlY3J5cHRCbG9jayhibG9jaylcbn1cbiIsInZhciBtb2RlTW9kdWxlcyA9IHtcbiAgRUNCOiByZXF1aXJlKCcuL2VjYicpLFxuICBDQkM6IHJlcXVpcmUoJy4vY2JjJyksXG4gIENGQjogcmVxdWlyZSgnLi9jZmInKSxcbiAgQ0ZCODogcmVxdWlyZSgnLi9jZmI4JyksXG4gIENGQjE6IHJlcXVpcmUoJy4vY2ZiMScpLFxuICBPRkI6IHJlcXVpcmUoJy4vb2ZiJyksXG4gIENUUjogcmVxdWlyZSgnLi9jdHInKSxcbiAgR0NNOiByZXF1aXJlKCcuL2N0cicpXG59XG5cbnZhciBtb2RlcyA9IHJlcXVpcmUoJy4vbGlzdC5qc29uJylcblxuZm9yICh2YXIga2V5IGluIG1vZGVzKSB7XG4gIG1vZGVzW2tleV0ubW9kdWxlID0gbW9kZU1vZHVsZXNbbW9kZXNba2V5XS5tb2RlXVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1vZGVzXG4iLCJ2YXIgeG9yID0gcmVxdWlyZSgnYnVmZmVyLXhvcicpXG5cbmZ1bmN0aW9uIGdldEJsb2NrIChzZWxmKSB7XG4gIHNlbGYuX3ByZXYgPSBzZWxmLl9jaXBoZXIuZW5jcnlwdEJsb2NrKHNlbGYuX3ByZXYpXG4gIHJldHVybiBzZWxmLl9wcmV2XG59XG5cbmV4cG9ydHMuZW5jcnlwdCA9IGZ1bmN0aW9uIChzZWxmLCBjaHVuaykge1xuICB3aGlsZSAoc2VsZi5fY2FjaGUubGVuZ3RoIDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgc2VsZi5fY2FjaGUgPSBCdWZmZXIuY29uY2F0KFtzZWxmLl9jYWNoZSwgZ2V0QmxvY2soc2VsZildKVxuICB9XG5cbiAgdmFyIHBhZCA9IHNlbGYuX2NhY2hlLnNsaWNlKDAsIGNodW5rLmxlbmd0aClcbiAgc2VsZi5fY2FjaGUgPSBzZWxmLl9jYWNoZS5zbGljZShjaHVuay5sZW5ndGgpXG4gIHJldHVybiB4b3IoY2h1bmssIHBhZClcbn1cbiIsInZhciBhZXMgPSByZXF1aXJlKCcuL2FlcycpXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcbnZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCdjaXBoZXItYmFzZScpXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG5cbmZ1bmN0aW9uIFN0cmVhbUNpcGhlciAobW9kZSwga2V5LCBpdiwgZGVjcnlwdCkge1xuICBUcmFuc2Zvcm0uY2FsbCh0aGlzKVxuXG4gIHRoaXMuX2NpcGhlciA9IG5ldyBhZXMuQUVTKGtleSlcbiAgdGhpcy5fcHJldiA9IEJ1ZmZlci5mcm9tKGl2KVxuICB0aGlzLl9jYWNoZSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgwKVxuICB0aGlzLl9zZWNDYWNoZSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgwKVxuICB0aGlzLl9kZWNyeXB0ID0gZGVjcnlwdFxuICB0aGlzLl9tb2RlID0gbW9kZVxufVxuXG5pbmhlcml0cyhTdHJlYW1DaXBoZXIsIFRyYW5zZm9ybSlcblxuU3RyZWFtQ2lwaGVyLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHJldHVybiB0aGlzLl9tb2RlLmVuY3J5cHQodGhpcywgY2h1bmssIHRoaXMuX2RlY3J5cHQpXG59XG5cblN0cmVhbUNpcGhlci5wcm90b3R5cGUuX2ZpbmFsID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9jaXBoZXIuc2NydWIoKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmVhbUNpcGhlclxuIiwidmFyIERFUyA9IHJlcXVpcmUoJ2Jyb3dzZXJpZnktZGVzJylcbnZhciBhZXMgPSByZXF1aXJlKCdicm93c2VyaWZ5LWFlcy9icm93c2VyJylcbnZhciBhZXNNb2RlcyA9IHJlcXVpcmUoJ2Jyb3dzZXJpZnktYWVzL21vZGVzJylcbnZhciBkZXNNb2RlcyA9IHJlcXVpcmUoJ2Jyb3dzZXJpZnktZGVzL21vZGVzJylcbnZhciBlYnRrID0gcmVxdWlyZSgnZXZwX2J5dGVzdG9rZXknKVxuXG5mdW5jdGlvbiBjcmVhdGVDaXBoZXIgKHN1aXRlLCBwYXNzd29yZCkge1xuICBzdWl0ZSA9IHN1aXRlLnRvTG93ZXJDYXNlKClcblxuICB2YXIga2V5TGVuLCBpdkxlblxuICBpZiAoYWVzTW9kZXNbc3VpdGVdKSB7XG4gICAga2V5TGVuID0gYWVzTW9kZXNbc3VpdGVdLmtleVxuICAgIGl2TGVuID0gYWVzTW9kZXNbc3VpdGVdLml2XG4gIH0gZWxzZSBpZiAoZGVzTW9kZXNbc3VpdGVdKSB7XG4gICAga2V5TGVuID0gZGVzTW9kZXNbc3VpdGVdLmtleSAqIDhcbiAgICBpdkxlbiA9IGRlc01vZGVzW3N1aXRlXS5pdlxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgc3VpdGUgdHlwZScpXG4gIH1cblxuICB2YXIga2V5cyA9IGVidGsocGFzc3dvcmQsIGZhbHNlLCBrZXlMZW4sIGl2TGVuKVxuICByZXR1cm4gY3JlYXRlQ2lwaGVyaXYoc3VpdGUsIGtleXMua2V5LCBrZXlzLml2KVxufVxuXG5mdW5jdGlvbiBjcmVhdGVEZWNpcGhlciAoc3VpdGUsIHBhc3N3b3JkKSB7XG4gIHN1aXRlID0gc3VpdGUudG9Mb3dlckNhc2UoKVxuXG4gIHZhciBrZXlMZW4sIGl2TGVuXG4gIGlmIChhZXNNb2Rlc1tzdWl0ZV0pIHtcbiAgICBrZXlMZW4gPSBhZXNNb2Rlc1tzdWl0ZV0ua2V5XG4gICAgaXZMZW4gPSBhZXNNb2Rlc1tzdWl0ZV0uaXZcbiAgfSBlbHNlIGlmIChkZXNNb2Rlc1tzdWl0ZV0pIHtcbiAgICBrZXlMZW4gPSBkZXNNb2Rlc1tzdWl0ZV0ua2V5ICogOFxuICAgIGl2TGVuID0gZGVzTW9kZXNbc3VpdGVdLml2XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBzdWl0ZSB0eXBlJylcbiAgfVxuXG4gIHZhciBrZXlzID0gZWJ0ayhwYXNzd29yZCwgZmFsc2UsIGtleUxlbiwgaXZMZW4pXG4gIHJldHVybiBjcmVhdGVEZWNpcGhlcml2KHN1aXRlLCBrZXlzLmtleSwga2V5cy5pdilcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2lwaGVyaXYgKHN1aXRlLCBrZXksIGl2KSB7XG4gIHN1aXRlID0gc3VpdGUudG9Mb3dlckNhc2UoKVxuICBpZiAoYWVzTW9kZXNbc3VpdGVdKSByZXR1cm4gYWVzLmNyZWF0ZUNpcGhlcml2KHN1aXRlLCBrZXksIGl2KVxuICBpZiAoZGVzTW9kZXNbc3VpdGVdKSByZXR1cm4gbmV3IERFUyh7IGtleToga2V5LCBpdjogaXYsIG1vZGU6IHN1aXRlIH0pXG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBzdWl0ZSB0eXBlJylcbn1cblxuZnVuY3Rpb24gY3JlYXRlRGVjaXBoZXJpdiAoc3VpdGUsIGtleSwgaXYpIHtcbiAgc3VpdGUgPSBzdWl0ZS50b0xvd2VyQ2FzZSgpXG4gIGlmIChhZXNNb2Rlc1tzdWl0ZV0pIHJldHVybiBhZXMuY3JlYXRlRGVjaXBoZXJpdihzdWl0ZSwga2V5LCBpdilcbiAgaWYgKGRlc01vZGVzW3N1aXRlXSkgcmV0dXJuIG5ldyBERVMoeyBrZXk6IGtleSwgaXY6IGl2LCBtb2RlOiBzdWl0ZSwgZGVjcnlwdDogdHJ1ZSB9KVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgc3VpdGUgdHlwZScpXG59XG5cbmZ1bmN0aW9uIGdldENpcGhlcnMgKCkge1xuICByZXR1cm4gT2JqZWN0LmtleXMoZGVzTW9kZXMpLmNvbmNhdChhZXMuZ2V0Q2lwaGVycygpKVxufVxuXG5leHBvcnRzLmNyZWF0ZUNpcGhlciA9IGV4cG9ydHMuQ2lwaGVyID0gY3JlYXRlQ2lwaGVyXG5leHBvcnRzLmNyZWF0ZUNpcGhlcml2ID0gZXhwb3J0cy5DaXBoZXJpdiA9IGNyZWF0ZUNpcGhlcml2XG5leHBvcnRzLmNyZWF0ZURlY2lwaGVyID0gZXhwb3J0cy5EZWNpcGhlciA9IGNyZWF0ZURlY2lwaGVyXG5leHBvcnRzLmNyZWF0ZURlY2lwaGVyaXYgPSBleHBvcnRzLkRlY2lwaGVyaXYgPSBjcmVhdGVEZWNpcGhlcml2XG5leHBvcnRzLmxpc3RDaXBoZXJzID0gZXhwb3J0cy5nZXRDaXBoZXJzID0gZ2V0Q2lwaGVyc1xuIiwidmFyIENpcGhlckJhc2UgPSByZXF1aXJlKCdjaXBoZXItYmFzZScpXG52YXIgZGVzID0gcmVxdWlyZSgnZGVzLmpzJylcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlclxuXG52YXIgbW9kZXMgPSB7XG4gICdkZXMtZWRlMy1jYmMnOiBkZXMuQ0JDLmluc3RhbnRpYXRlKGRlcy5FREUpLFxuICAnZGVzLWVkZTMnOiBkZXMuRURFLFxuICAnZGVzLWVkZS1jYmMnOiBkZXMuQ0JDLmluc3RhbnRpYXRlKGRlcy5FREUpLFxuICAnZGVzLWVkZSc6IGRlcy5FREUsXG4gICdkZXMtY2JjJzogZGVzLkNCQy5pbnN0YW50aWF0ZShkZXMuREVTKSxcbiAgJ2Rlcy1lY2InOiBkZXMuREVTXG59XG5tb2Rlcy5kZXMgPSBtb2Rlc1snZGVzLWNiYyddXG5tb2Rlcy5kZXMzID0gbW9kZXNbJ2Rlcy1lZGUzLWNiYyddXG5tb2R1bGUuZXhwb3J0cyA9IERFU1xuaW5oZXJpdHMoREVTLCBDaXBoZXJCYXNlKVxuZnVuY3Rpb24gREVTIChvcHRzKSB7XG4gIENpcGhlckJhc2UuY2FsbCh0aGlzKVxuICB2YXIgbW9kZU5hbWUgPSBvcHRzLm1vZGUudG9Mb3dlckNhc2UoKVxuICB2YXIgbW9kZSA9IG1vZGVzW21vZGVOYW1lXVxuICB2YXIgdHlwZVxuICBpZiAob3B0cy5kZWNyeXB0KSB7XG4gICAgdHlwZSA9ICdkZWNyeXB0J1xuICB9IGVsc2Uge1xuICAgIHR5cGUgPSAnZW5jcnlwdCdcbiAgfVxuICB2YXIga2V5ID0gb3B0cy5rZXlcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoa2V5KSkge1xuICAgIGtleSA9IEJ1ZmZlci5mcm9tKGtleSlcbiAgfVxuICBpZiAobW9kZU5hbWUgPT09ICdkZXMtZWRlJyB8fCBtb2RlTmFtZSA9PT0gJ2Rlcy1lZGUtY2JjJykge1xuICAgIGtleSA9IEJ1ZmZlci5jb25jYXQoW2tleSwga2V5LnNsaWNlKDAsIDgpXSlcbiAgfVxuICB2YXIgaXYgPSBvcHRzLml2XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGl2KSkge1xuICAgIGl2ID0gQnVmZmVyLmZyb20oaXYpXG4gIH1cbiAgdGhpcy5fZGVzID0gbW9kZS5jcmVhdGUoe1xuICAgIGtleToga2V5LFxuICAgIGl2OiBpdixcbiAgICB0eXBlOiB0eXBlXG4gIH0pXG59XG5ERVMucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICByZXR1cm4gQnVmZmVyLmZyb20odGhpcy5fZGVzLnVwZGF0ZShkYXRhKSlcbn1cbkRFUy5wcm90b3R5cGUuX2ZpbmFsID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gQnVmZmVyLmZyb20odGhpcy5fZGVzLmZpbmFsKCkpXG59XG4iLCJleHBvcnRzWydkZXMtZWNiJ10gPSB7XG4gIGtleTogOCxcbiAgaXY6IDBcbn1cbmV4cG9ydHNbJ2Rlcy1jYmMnXSA9IGV4cG9ydHMuZGVzID0ge1xuICBrZXk6IDgsXG4gIGl2OiA4XG59XG5leHBvcnRzWydkZXMtZWRlMy1jYmMnXSA9IGV4cG9ydHMuZGVzMyA9IHtcbiAga2V5OiAyNCxcbiAgaXY6IDhcbn1cbmV4cG9ydHNbJ2Rlcy1lZGUzJ10gPSB7XG4gIGtleTogMjQsXG4gIGl2OiAwXG59XG5leHBvcnRzWydkZXMtZWRlLWNiYyddID0ge1xuICBrZXk6IDE2LFxuICBpdjogOFxufVxuZXhwb3J0c1snZGVzLWVkZSddID0ge1xuICBrZXk6IDE2LFxuICBpdjogMFxufVxuIiwidmFyIGJuID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciByYW5kb21CeXRlcyA9IHJlcXVpcmUoJ3JhbmRvbWJ5dGVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGNydDtcbmZ1bmN0aW9uIGJsaW5kKHByaXYpIHtcbiAgdmFyIHIgPSBnZXRyKHByaXYpO1xuICB2YXIgYmxpbmRlciA9IHIudG9SZWQoYm4ubW9udChwcml2Lm1vZHVsdXMpKVxuICAucmVkUG93KG5ldyBibihwcml2LnB1YmxpY0V4cG9uZW50KSkuZnJvbVJlZCgpO1xuICByZXR1cm4ge1xuICAgIGJsaW5kZXI6IGJsaW5kZXIsXG4gICAgdW5ibGluZGVyOnIuaW52bShwcml2Lm1vZHVsdXMpXG4gIH07XG59XG5mdW5jdGlvbiBjcnQobXNnLCBwcml2KSB7XG4gIHZhciBibGluZHMgPSBibGluZChwcml2KTtcbiAgdmFyIGxlbiA9IHByaXYubW9kdWx1cy5ieXRlTGVuZ3RoKCk7XG4gIHZhciBtb2QgPSBibi5tb250KHByaXYubW9kdWx1cyk7XG4gIHZhciBibGluZGVkID0gbmV3IGJuKG1zZykubXVsKGJsaW5kcy5ibGluZGVyKS51bW9kKHByaXYubW9kdWx1cyk7XG4gIHZhciBjMSA9IGJsaW5kZWQudG9SZWQoYm4ubW9udChwcml2LnByaW1lMSkpO1xuICB2YXIgYzIgPSBibGluZGVkLnRvUmVkKGJuLm1vbnQocHJpdi5wcmltZTIpKTtcbiAgdmFyIHFpbnYgPSBwcml2LmNvZWZmaWNpZW50O1xuICB2YXIgcCA9IHByaXYucHJpbWUxO1xuICB2YXIgcSA9IHByaXYucHJpbWUyO1xuICB2YXIgbTEgPSBjMS5yZWRQb3cocHJpdi5leHBvbmVudDEpO1xuICB2YXIgbTIgPSBjMi5yZWRQb3cocHJpdi5leHBvbmVudDIpO1xuICBtMSA9IG0xLmZyb21SZWQoKTtcbiAgbTIgPSBtMi5mcm9tUmVkKCk7XG4gIHZhciBoID0gbTEuaXN1YihtMikuaW11bChxaW52KS51bW9kKHApO1xuICBoLmltdWwocSk7XG4gIG0yLmlhZGQoaCk7XG4gIHJldHVybiBuZXcgQnVmZmVyKG0yLmltdWwoYmxpbmRzLnVuYmxpbmRlcikudW1vZChwcml2Lm1vZHVsdXMpLnRvQXJyYXkoZmFsc2UsIGxlbikpO1xufVxuY3J0LmdldHIgPSBnZXRyO1xuZnVuY3Rpb24gZ2V0cihwcml2KSB7XG4gIHZhciBsZW4gPSBwcml2Lm1vZHVsdXMuYnl0ZUxlbmd0aCgpO1xuICB2YXIgciA9IG5ldyBibihyYW5kb21CeXRlcyhsZW4pKTtcbiAgd2hpbGUgKHIuY21wKHByaXYubW9kdWx1cykgPj0gIDAgfHwgIXIudW1vZChwcml2LnByaW1lMSkgfHwgIXIudW1vZChwcml2LnByaW1lMikpIHtcbiAgICByID0gbmV3IGJuKHJhbmRvbUJ5dGVzKGxlbikpO1xuICB9XG4gIHJldHVybiByO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Jyb3dzZXIvYWxnb3JpdGhtcy5qc29uJylcbiIsInZhciBjcmVhdGVIYXNoID0gcmVxdWlyZSgnY3JlYXRlLWhhc2gnKVxudmFyIHN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG52YXIgc2lnbiA9IHJlcXVpcmUoJy4vc2lnbicpXG52YXIgdmVyaWZ5ID0gcmVxdWlyZSgnLi92ZXJpZnknKVxuXG52YXIgYWxnb3JpdGhtcyA9IHJlcXVpcmUoJy4vYWxnb3JpdGhtcy5qc29uJylcbk9iamVjdC5rZXlzKGFsZ29yaXRobXMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICBhbGdvcml0aG1zW2tleV0uaWQgPSBuZXcgQnVmZmVyKGFsZ29yaXRobXNba2V5XS5pZCwgJ2hleCcpXG4gIGFsZ29yaXRobXNba2V5LnRvTG93ZXJDYXNlKCldID0gYWxnb3JpdGhtc1trZXldXG59KVxuXG5mdW5jdGlvbiBTaWduIChhbGdvcml0aG0pIHtcbiAgc3RyZWFtLldyaXRhYmxlLmNhbGwodGhpcylcblxuICB2YXIgZGF0YSA9IGFsZ29yaXRobXNbYWxnb3JpdGhtXVxuICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcignVW5rbm93biBtZXNzYWdlIGRpZ2VzdCcpXG5cbiAgdGhpcy5faGFzaFR5cGUgPSBkYXRhLmhhc2hcbiAgdGhpcy5faGFzaCA9IGNyZWF0ZUhhc2goZGF0YS5oYXNoKVxuICB0aGlzLl90YWcgPSBkYXRhLmlkXG4gIHRoaXMuX3NpZ25UeXBlID0gZGF0YS5zaWduXG59XG5pbmhlcml0cyhTaWduLCBzdHJlYW0uV3JpdGFibGUpXG5cblNpZ24ucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIF93cml0ZSAoZGF0YSwgXywgZG9uZSkge1xuICB0aGlzLl9oYXNoLnVwZGF0ZShkYXRhKVxuICBkb25lKClcbn1cblxuU2lnbi5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlIChkYXRhLCBlbmMpIHtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykgZGF0YSA9IG5ldyBCdWZmZXIoZGF0YSwgZW5jKVxuXG4gIHRoaXMuX2hhc2gudXBkYXRlKGRhdGEpXG4gIHJldHVybiB0aGlzXG59XG5cblNpZ24ucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbiBzaWduTWV0aG9kIChrZXksIGVuYykge1xuICB0aGlzLmVuZCgpXG4gIHZhciBoYXNoID0gdGhpcy5faGFzaC5kaWdlc3QoKVxuICB2YXIgc2lnID0gc2lnbihoYXNoLCBrZXksIHRoaXMuX2hhc2hUeXBlLCB0aGlzLl9zaWduVHlwZSwgdGhpcy5fdGFnKVxuXG4gIHJldHVybiBlbmMgPyBzaWcudG9TdHJpbmcoZW5jKSA6IHNpZ1xufVxuXG5mdW5jdGlvbiBWZXJpZnkgKGFsZ29yaXRobSkge1xuICBzdHJlYW0uV3JpdGFibGUuY2FsbCh0aGlzKVxuXG4gIHZhciBkYXRhID0gYWxnb3JpdGhtc1thbGdvcml0aG1dXG4gIGlmICghZGF0YSkgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG1lc3NhZ2UgZGlnZXN0JylcblxuICB0aGlzLl9oYXNoID0gY3JlYXRlSGFzaChkYXRhLmhhc2gpXG4gIHRoaXMuX3RhZyA9IGRhdGEuaWRcbiAgdGhpcy5fc2lnblR5cGUgPSBkYXRhLnNpZ25cbn1cbmluaGVyaXRzKFZlcmlmeSwgc3RyZWFtLldyaXRhYmxlKVxuXG5WZXJpZnkucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIF93cml0ZSAoZGF0YSwgXywgZG9uZSkge1xuICB0aGlzLl9oYXNoLnVwZGF0ZShkYXRhKVxuICBkb25lKClcbn1cblxuVmVyaWZ5LnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUgKGRhdGEsIGVuYykge1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSBkYXRhID0gbmV3IEJ1ZmZlcihkYXRhLCBlbmMpXG5cbiAgdGhpcy5faGFzaC51cGRhdGUoZGF0YSlcbiAgcmV0dXJuIHRoaXNcbn1cblxuVmVyaWZ5LnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiB2ZXJpZnlNZXRob2QgKGtleSwgc2lnLCBlbmMpIHtcbiAgaWYgKHR5cGVvZiBzaWcgPT09ICdzdHJpbmcnKSBzaWcgPSBuZXcgQnVmZmVyKHNpZywgZW5jKVxuXG4gIHRoaXMuZW5kKClcbiAgdmFyIGhhc2ggPSB0aGlzLl9oYXNoLmRpZ2VzdCgpXG4gIHJldHVybiB2ZXJpZnkoc2lnLCBoYXNoLCBrZXksIHRoaXMuX3NpZ25UeXBlLCB0aGlzLl90YWcpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNpZ24gKGFsZ29yaXRobSkge1xuICByZXR1cm4gbmV3IFNpZ24oYWxnb3JpdGhtKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVWZXJpZnkgKGFsZ29yaXRobSkge1xuICByZXR1cm4gbmV3IFZlcmlmeShhbGdvcml0aG0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBTaWduOiBjcmVhdGVTaWduLFxuICBWZXJpZnk6IGNyZWF0ZVZlcmlmeSxcbiAgY3JlYXRlU2lnbjogY3JlYXRlU2lnbixcbiAgY3JlYXRlVmVyaWZ5OiBjcmVhdGVWZXJpZnlcbn1cbiIsIi8vIG11Y2ggb2YgdGhpcyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vaW5kdXRueS9zZWxmLXNpZ25lZC9ibG9iL2doLXBhZ2VzL2xpYi9yc2EuanNcbnZhciBjcmVhdGVIbWFjID0gcmVxdWlyZSgnY3JlYXRlLWhtYWMnKVxudmFyIGNydCA9IHJlcXVpcmUoJ2Jyb3dzZXJpZnktcnNhJylcbnZhciBFQyA9IHJlcXVpcmUoJ2VsbGlwdGljJykuZWNcbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJylcbnZhciBwYXJzZUtleXMgPSByZXF1aXJlKCdwYXJzZS1hc24xJylcbnZhciBjdXJ2ZXMgPSByZXF1aXJlKCcuL2N1cnZlcy5qc29uJylcblxuZnVuY3Rpb24gc2lnbiAoaGFzaCwga2V5LCBoYXNoVHlwZSwgc2lnblR5cGUsIHRhZykge1xuICB2YXIgcHJpdiA9IHBhcnNlS2V5cyhrZXkpXG4gIGlmIChwcml2LmN1cnZlKSB7XG4gICAgLy8gcnNhIGtleXMgY2FuIGJlIGludGVycHJldGVkIGFzIGVjZHNhIG9uZXMgaW4gb3BlbnNzbFxuICAgIGlmIChzaWduVHlwZSAhPT0gJ2VjZHNhJyAmJiBzaWduVHlwZSAhPT0gJ2VjZHNhL3JzYScpIHRocm93IG5ldyBFcnJvcignd3JvbmcgcHJpdmF0ZSBrZXkgdHlwZScpXG4gICAgcmV0dXJuIGVjU2lnbihoYXNoLCBwcml2KVxuICB9IGVsc2UgaWYgKHByaXYudHlwZSA9PT0gJ2RzYScpIHtcbiAgICBpZiAoc2lnblR5cGUgIT09ICdkc2EnKSB0aHJvdyBuZXcgRXJyb3IoJ3dyb25nIHByaXZhdGUga2V5IHR5cGUnKVxuICAgIHJldHVybiBkc2FTaWduKGhhc2gsIHByaXYsIGhhc2hUeXBlKVxuICB9IGVsc2Uge1xuICAgIGlmIChzaWduVHlwZSAhPT0gJ3JzYScgJiYgc2lnblR5cGUgIT09ICdlY2RzYS9yc2EnKSB0aHJvdyBuZXcgRXJyb3IoJ3dyb25nIHByaXZhdGUga2V5IHR5cGUnKVxuICB9XG4gIGhhc2ggPSBCdWZmZXIuY29uY2F0KFt0YWcsIGhhc2hdKVxuICB2YXIgbGVuID0gcHJpdi5tb2R1bHVzLmJ5dGVMZW5ndGgoKVxuICB2YXIgcGFkID0gWyAwLCAxIF1cbiAgd2hpbGUgKGhhc2gubGVuZ3RoICsgcGFkLmxlbmd0aCArIDEgPCBsZW4pIHBhZC5wdXNoKDB4ZmYpXG4gIHBhZC5wdXNoKDB4MDApXG4gIHZhciBpID0gLTFcbiAgd2hpbGUgKCsraSA8IGhhc2gubGVuZ3RoKSBwYWQucHVzaChoYXNoW2ldKVxuXG4gIHZhciBvdXQgPSBjcnQocGFkLCBwcml2KVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIGVjU2lnbiAoaGFzaCwgcHJpdikge1xuICB2YXIgY3VydmVJZCA9IGN1cnZlc1twcml2LmN1cnZlLmpvaW4oJy4nKV1cbiAgaWYgKCFjdXJ2ZUlkKSB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gY3VydmUgJyArIHByaXYuY3VydmUuam9pbignLicpKVxuXG4gIHZhciBjdXJ2ZSA9IG5ldyBFQyhjdXJ2ZUlkKVxuICB2YXIga2V5ID0gY3VydmUua2V5RnJvbVByaXZhdGUocHJpdi5wcml2YXRlS2V5KVxuICB2YXIgb3V0ID0ga2V5LnNpZ24oaGFzaClcblxuICByZXR1cm4gbmV3IEJ1ZmZlcihvdXQudG9ERVIoKSlcbn1cblxuZnVuY3Rpb24gZHNhU2lnbiAoaGFzaCwgcHJpdiwgYWxnbykge1xuICB2YXIgeCA9IHByaXYucGFyYW1zLnByaXZfa2V5XG4gIHZhciBwID0gcHJpdi5wYXJhbXMucFxuICB2YXIgcSA9IHByaXYucGFyYW1zLnFcbiAgdmFyIGcgPSBwcml2LnBhcmFtcy5nXG4gIHZhciByID0gbmV3IEJOKDApXG4gIHZhciBrXG4gIHZhciBIID0gYml0czJpbnQoaGFzaCwgcSkubW9kKHEpXG4gIHZhciBzID0gZmFsc2VcbiAgdmFyIGt2ID0gZ2V0S2V5KHgsIHEsIGhhc2gsIGFsZ28pXG4gIHdoaWxlIChzID09PSBmYWxzZSkge1xuICAgIGsgPSBtYWtlS2V5KHEsIGt2LCBhbGdvKVxuICAgIHIgPSBtYWtlUihnLCBrLCBwLCBxKVxuICAgIHMgPSBrLmludm0ocSkuaW11bChILmFkZCh4Lm11bChyKSkpLm1vZChxKVxuICAgIGlmIChzLmNtcG4oMCkgPT09IDApIHtcbiAgICAgIHMgPSBmYWxzZVxuICAgICAgciA9IG5ldyBCTigwKVxuICAgIH1cbiAgfVxuICByZXR1cm4gdG9ERVIociwgcylcbn1cblxuZnVuY3Rpb24gdG9ERVIgKHIsIHMpIHtcbiAgciA9IHIudG9BcnJheSgpXG4gIHMgPSBzLnRvQXJyYXkoKVxuXG4gIC8vIFBhZCB2YWx1ZXNcbiAgaWYgKHJbMF0gJiAweDgwKSByID0gWyAwIF0uY29uY2F0KHIpXG4gIGlmIChzWzBdICYgMHg4MCkgcyA9IFsgMCBdLmNvbmNhdChzKVxuXG4gIHZhciB0b3RhbCA9IHIubGVuZ3RoICsgcy5sZW5ndGggKyA0XG4gIHZhciByZXMgPSBbIDB4MzAsIHRvdGFsLCAweDAyLCByLmxlbmd0aCBdXG4gIHJlcyA9IHJlcy5jb25jYXQociwgWyAweDAyLCBzLmxlbmd0aCBdLCBzKVxuICByZXR1cm4gbmV3IEJ1ZmZlcihyZXMpXG59XG5cbmZ1bmN0aW9uIGdldEtleSAoeCwgcSwgaGFzaCwgYWxnbykge1xuICB4ID0gbmV3IEJ1ZmZlcih4LnRvQXJyYXkoKSlcbiAgaWYgKHgubGVuZ3RoIDwgcS5ieXRlTGVuZ3RoKCkpIHtcbiAgICB2YXIgemVyb3MgPSBuZXcgQnVmZmVyKHEuYnl0ZUxlbmd0aCgpIC0geC5sZW5ndGgpXG4gICAgemVyb3MuZmlsbCgwKVxuICAgIHggPSBCdWZmZXIuY29uY2F0KFsgemVyb3MsIHggXSlcbiAgfVxuICB2YXIgaGxlbiA9IGhhc2gubGVuZ3RoXG4gIHZhciBoYml0cyA9IGJpdHMyb2N0ZXRzKGhhc2gsIHEpXG4gIHZhciB2ID0gbmV3IEJ1ZmZlcihobGVuKVxuICB2LmZpbGwoMSlcbiAgdmFyIGsgPSBuZXcgQnVmZmVyKGhsZW4pXG4gIGsuZmlsbCgwKVxuICBrID0gY3JlYXRlSG1hYyhhbGdvLCBrKS51cGRhdGUodikudXBkYXRlKG5ldyBCdWZmZXIoWyAwIF0pKS51cGRhdGUoeCkudXBkYXRlKGhiaXRzKS5kaWdlc3QoKVxuICB2ID0gY3JlYXRlSG1hYyhhbGdvLCBrKS51cGRhdGUodikuZGlnZXN0KClcbiAgayA9IGNyZWF0ZUhtYWMoYWxnbywgaykudXBkYXRlKHYpLnVwZGF0ZShuZXcgQnVmZmVyKFsgMSBdKSkudXBkYXRlKHgpLnVwZGF0ZShoYml0cykuZGlnZXN0KClcbiAgdiA9IGNyZWF0ZUhtYWMoYWxnbywgaykudXBkYXRlKHYpLmRpZ2VzdCgpXG4gIHJldHVybiB7IGs6IGssIHY6IHYgfVxufVxuXG5mdW5jdGlvbiBiaXRzMmludCAob2JpdHMsIHEpIHtcbiAgdmFyIGJpdHMgPSBuZXcgQk4ob2JpdHMpXG4gIHZhciBzaGlmdCA9IChvYml0cy5sZW5ndGggPDwgMykgLSBxLmJpdExlbmd0aCgpXG4gIGlmIChzaGlmdCA+IDApIGJpdHMuaXNocm4oc2hpZnQpXG4gIHJldHVybiBiaXRzXG59XG5cbmZ1bmN0aW9uIGJpdHMyb2N0ZXRzIChiaXRzLCBxKSB7XG4gIGJpdHMgPSBiaXRzMmludChiaXRzLCBxKVxuICBiaXRzID0gYml0cy5tb2QocSlcbiAgdmFyIG91dCA9IG5ldyBCdWZmZXIoYml0cy50b0FycmF5KCkpXG4gIGlmIChvdXQubGVuZ3RoIDwgcS5ieXRlTGVuZ3RoKCkpIHtcbiAgICB2YXIgemVyb3MgPSBuZXcgQnVmZmVyKHEuYnl0ZUxlbmd0aCgpIC0gb3V0Lmxlbmd0aClcbiAgICB6ZXJvcy5maWxsKDApXG4gICAgb3V0ID0gQnVmZmVyLmNvbmNhdChbIHplcm9zLCBvdXQgXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIG1ha2VLZXkgKHEsIGt2LCBhbGdvKSB7XG4gIHZhciB0XG4gIHZhciBrXG5cbiAgZG8ge1xuICAgIHQgPSBuZXcgQnVmZmVyKDApXG5cbiAgICB3aGlsZSAodC5sZW5ndGggKiA4IDwgcS5iaXRMZW5ndGgoKSkge1xuICAgICAga3YudiA9IGNyZWF0ZUhtYWMoYWxnbywga3YuaykudXBkYXRlKGt2LnYpLmRpZ2VzdCgpXG4gICAgICB0ID0gQnVmZmVyLmNvbmNhdChbIHQsIGt2LnYgXSlcbiAgICB9XG5cbiAgICBrID0gYml0czJpbnQodCwgcSlcbiAgICBrdi5rID0gY3JlYXRlSG1hYyhhbGdvLCBrdi5rKS51cGRhdGUoa3YudikudXBkYXRlKG5ldyBCdWZmZXIoWyAwIF0pKS5kaWdlc3QoKVxuICAgIGt2LnYgPSBjcmVhdGVIbWFjKGFsZ28sIGt2LmspLnVwZGF0ZShrdi52KS5kaWdlc3QoKVxuICB9IHdoaWxlIChrLmNtcChxKSAhPT0gLTEpXG5cbiAgcmV0dXJuIGtcbn1cblxuZnVuY3Rpb24gbWFrZVIgKGcsIGssIHAsIHEpIHtcbiAgcmV0dXJuIGcudG9SZWQoQk4ubW9udChwKSkucmVkUG93KGspLmZyb21SZWQoKS5tb2QocSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaWduXG5tb2R1bGUuZXhwb3J0cy5nZXRLZXkgPSBnZXRLZXlcbm1vZHVsZS5leHBvcnRzLm1ha2VLZXkgPSBtYWtlS2V5XG4iLCIvLyBtdWNoIG9mIHRoaXMgYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2luZHV0bnkvc2VsZi1zaWduZWQvYmxvYi9naC1wYWdlcy9saWIvcnNhLmpzXG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpXG52YXIgRUMgPSByZXF1aXJlKCdlbGxpcHRpYycpLmVjXG52YXIgcGFyc2VLZXlzID0gcmVxdWlyZSgncGFyc2UtYXNuMScpXG52YXIgY3VydmVzID0gcmVxdWlyZSgnLi9jdXJ2ZXMuanNvbicpXG5cbmZ1bmN0aW9uIHZlcmlmeSAoc2lnLCBoYXNoLCBrZXksIHNpZ25UeXBlLCB0YWcpIHtcbiAgdmFyIHB1YiA9IHBhcnNlS2V5cyhrZXkpXG4gIGlmIChwdWIudHlwZSA9PT0gJ2VjJykge1xuICAgIC8vIHJzYSBrZXlzIGNhbiBiZSBpbnRlcnByZXRlZCBhcyBlY2RzYSBvbmVzIGluIG9wZW5zc2xcbiAgICBpZiAoc2lnblR5cGUgIT09ICdlY2RzYScgJiYgc2lnblR5cGUgIT09ICdlY2RzYS9yc2EnKSB0aHJvdyBuZXcgRXJyb3IoJ3dyb25nIHB1YmxpYyBrZXkgdHlwZScpXG4gICAgcmV0dXJuIGVjVmVyaWZ5KHNpZywgaGFzaCwgcHViKVxuICB9IGVsc2UgaWYgKHB1Yi50eXBlID09PSAnZHNhJykge1xuICAgIGlmIChzaWduVHlwZSAhPT0gJ2RzYScpIHRocm93IG5ldyBFcnJvcignd3JvbmcgcHVibGljIGtleSB0eXBlJylcbiAgICByZXR1cm4gZHNhVmVyaWZ5KHNpZywgaGFzaCwgcHViKVxuICB9IGVsc2Uge1xuICAgIGlmIChzaWduVHlwZSAhPT0gJ3JzYScgJiYgc2lnblR5cGUgIT09ICdlY2RzYS9yc2EnKSB0aHJvdyBuZXcgRXJyb3IoJ3dyb25nIHB1YmxpYyBrZXkgdHlwZScpXG4gIH1cbiAgaGFzaCA9IEJ1ZmZlci5jb25jYXQoW3RhZywgaGFzaF0pXG4gIHZhciBsZW4gPSBwdWIubW9kdWx1cy5ieXRlTGVuZ3RoKClcbiAgdmFyIHBhZCA9IFsgMSBdXG4gIHZhciBwYWROdW0gPSAwXG4gIHdoaWxlIChoYXNoLmxlbmd0aCArIHBhZC5sZW5ndGggKyAyIDwgbGVuKSB7XG4gICAgcGFkLnB1c2goMHhmZilcbiAgICBwYWROdW0rK1xuICB9XG4gIHBhZC5wdXNoKDB4MDApXG4gIHZhciBpID0gLTFcbiAgd2hpbGUgKCsraSA8IGhhc2gubGVuZ3RoKSB7XG4gICAgcGFkLnB1c2goaGFzaFtpXSlcbiAgfVxuICBwYWQgPSBuZXcgQnVmZmVyKHBhZClcbiAgdmFyIHJlZCA9IEJOLm1vbnQocHViLm1vZHVsdXMpXG4gIHNpZyA9IG5ldyBCTihzaWcpLnRvUmVkKHJlZClcblxuICBzaWcgPSBzaWcucmVkUG93KG5ldyBCTihwdWIucHVibGljRXhwb25lbnQpKVxuICBzaWcgPSBuZXcgQnVmZmVyKHNpZy5mcm9tUmVkKCkudG9BcnJheSgpKVxuICB2YXIgb3V0ID0gcGFkTnVtIDwgOCA/IDEgOiAwXG4gIGxlbiA9IE1hdGgubWluKHNpZy5sZW5ndGgsIHBhZC5sZW5ndGgpXG4gIGlmIChzaWcubGVuZ3RoICE9PSBwYWQubGVuZ3RoKSBvdXQgPSAxXG5cbiAgaSA9IC0xXG4gIHdoaWxlICgrK2kgPCBsZW4pIG91dCB8PSBzaWdbaV0gXiBwYWRbaV1cbiAgcmV0dXJuIG91dCA9PT0gMFxufVxuXG5mdW5jdGlvbiBlY1ZlcmlmeSAoc2lnLCBoYXNoLCBwdWIpIHtcbiAgdmFyIGN1cnZlSWQgPSBjdXJ2ZXNbcHViLmRhdGEuYWxnb3JpdGhtLmN1cnZlLmpvaW4oJy4nKV1cbiAgaWYgKCFjdXJ2ZUlkKSB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gY3VydmUgJyArIHB1Yi5kYXRhLmFsZ29yaXRobS5jdXJ2ZS5qb2luKCcuJykpXG5cbiAgdmFyIGN1cnZlID0gbmV3IEVDKGN1cnZlSWQpXG4gIHZhciBwdWJrZXkgPSBwdWIuZGF0YS5zdWJqZWN0UHJpdmF0ZUtleS5kYXRhXG5cbiAgcmV0dXJuIGN1cnZlLnZlcmlmeShoYXNoLCBzaWcsIHB1YmtleSlcbn1cblxuZnVuY3Rpb24gZHNhVmVyaWZ5IChzaWcsIGhhc2gsIHB1Yikge1xuICB2YXIgcCA9IHB1Yi5kYXRhLnBcbiAgdmFyIHEgPSBwdWIuZGF0YS5xXG4gIHZhciBnID0gcHViLmRhdGEuZ1xuICB2YXIgeSA9IHB1Yi5kYXRhLnB1Yl9rZXlcbiAgdmFyIHVucGFja2VkID0gcGFyc2VLZXlzLnNpZ25hdHVyZS5kZWNvZGUoc2lnLCAnZGVyJylcbiAgdmFyIHMgPSB1bnBhY2tlZC5zXG4gIHZhciByID0gdW5wYWNrZWQuclxuICBjaGVja1ZhbHVlKHMsIHEpXG4gIGNoZWNrVmFsdWUociwgcSlcbiAgdmFyIG1vbnRwID0gQk4ubW9udChwKVxuICB2YXIgdyA9IHMuaW52bShxKVxuICB2YXIgdiA9IGcudG9SZWQobW9udHApXG4gICAgLnJlZFBvdyhuZXcgQk4oaGFzaCkubXVsKHcpLm1vZChxKSlcbiAgICAuZnJvbVJlZCgpXG4gICAgLm11bCh5LnRvUmVkKG1vbnRwKS5yZWRQb3coci5tdWwodykubW9kKHEpKS5mcm9tUmVkKCkpXG4gICAgLm1vZChwKVxuICAgIC5tb2QocSlcbiAgcmV0dXJuIHYuY21wKHIpID09PSAwXG59XG5cbmZ1bmN0aW9uIGNoZWNrVmFsdWUgKGIsIHEpIHtcbiAgaWYgKGIuY21wbigwKSA8PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2lnJylcbiAgaWYgKGIuY21wKHEpID49IHEpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzaWcnKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHZlcmlmeVxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB4b3IgKGEsIGIpIHtcbiAgdmFyIGxlbmd0aCA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aClcbiAgdmFyIGJ1ZmZlciA9IG5ldyBCdWZmZXIobGVuZ3RoKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBidWZmZXJbaV0gPSBhW2ldIF4gYltpXVxuICB9XG5cbiAgcmV0dXJuIGJ1ZmZlclxufVxuIiwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCdiYXNlNjQtanMnKVxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbi8qXG4gKiBFeHBvcnQga01heExlbmd0aCBhZnRlciB0eXBlZCBhcnJheSBzdXBwb3J0IGlzIGRldGVybWluZWQuXG4gKi9cbmV4cG9ydHMua01heExlbmd0aCA9IGtNYXhMZW5ndGgoKVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgYXJyLl9fcHJvdG9fXyA9IHtfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLCBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH19XG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDIgJiYgLy8gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWRcbiAgICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBjaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgICAgICAgYXJyLnN1YmFycmF5KDEsIDEpLmJ5dGVMZW5ndGggPT09IDAgLy8gaWUxMCBoYXMgYnJva2VuIGBzdWJhcnJheWBcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGggKCkge1xuICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgICA/IDB4N2ZmZmZmZmZcbiAgICA6IDB4M2ZmZmZmZmZcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKGtNYXhMZW5ndGgoKSA8IGxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpXG4gIH1cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgaWYgKHRoYXQgPT09IG51bGwpIHtcbiAgICAgIHRoYXQgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgICB9XG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZydcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHRoaXMsIGFyZylcbiAgfVxuICByZXR1cm4gZnJvbSh0aGlzLCBhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbi8vIFRPRE86IExlZ2FjeSwgbm90IG5lZWRlZCBhbnltb3JlLiBSZW1vdmUgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLlxuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gKGFycikge1xuICBhcnIuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIGZyb20gKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbShudWxsLCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5pZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgJiZcbiAgICAgIEJ1ZmZlcltTeW1ib2wuc3BlY2llc10gPT09IEJ1ZmZlcikge1xuICAgIC8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKG51bGwsIHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAodGhhdCwgc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgdGhhdCA9IHRoYXQuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBhcnJheS5ieXRlTGVuZ3RoIC8vIHRoaXMgdGhyb3dzIGlmIGBhcnJheWAgaXMgbm90IGEgdmFsaWQgQXJyYXlCdWZmZXJcblxuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnb2Zmc2V0XFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdsZW5ndGhcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IGFycmF5XG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbilcblxuICAgIGlmICh0aGF0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoYXRcbiAgICB9XG5cbiAgICBvYmouY29weSh0aGF0LCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIHRoYXRcbiAgfVxuXG4gIGlmIChvYmopIHtcbiAgICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fCAnbGVuZ3RoJyBpbiBvYmopIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgaXNuYW4ob2JqLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCAwKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKVxuICAgIH1cblxuICAgIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iai5kYXRhKVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4nKVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwga01heExlbmd0aCgpYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH1cbiAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBzdHJpbmcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZ1xuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCBhbmQgYGlzLWJ1ZmZlcmAgKGluIFNhZmFyaSA1LTcpIHRvIGRldGVjdFxuLy8gQnVmZmVyIGluc3RhbmNlcy5cbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKGlzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiZcbiAgICAgICAgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChzdHJMZW4gJSAyICE9PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZlxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gICAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydFxuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyArK2kpIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG4gIHZhciBpXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDAgfHwgIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gYXNjZW5kaW5nIGNvcHkgZnJvbSBzdGFydFxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApXG4gICAgICBpZiAoY29kZSA8IDI1Nikge1xuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBpc25hbiAodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IHZhbCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuIiwidmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyXG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZSgnc3RyZWFtJykuVHJhbnNmb3JtXG52YXIgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyJykuU3RyaW5nRGVjb2RlclxudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxuXG5mdW5jdGlvbiBDaXBoZXJCYXNlIChoYXNoTW9kZSkge1xuICBUcmFuc2Zvcm0uY2FsbCh0aGlzKVxuICB0aGlzLmhhc2hNb2RlID0gdHlwZW9mIGhhc2hNb2RlID09PSAnc3RyaW5nJ1xuICBpZiAodGhpcy5oYXNoTW9kZSkge1xuICAgIHRoaXNbaGFzaE1vZGVdID0gdGhpcy5fZmluYWxPckRpZ2VzdFxuICB9IGVsc2Uge1xuICAgIHRoaXMuZmluYWwgPSB0aGlzLl9maW5hbE9yRGlnZXN0XG4gIH1cbiAgaWYgKHRoaXMuX2ZpbmFsKSB7XG4gICAgdGhpcy5fX2ZpbmFsID0gdGhpcy5fZmluYWxcbiAgICB0aGlzLl9maW5hbCA9IG51bGxcbiAgfVxuICB0aGlzLl9kZWNvZGVyID0gbnVsbFxuICB0aGlzLl9lbmNvZGluZyA9IG51bGxcbn1cbmluaGVyaXRzKENpcGhlckJhc2UsIFRyYW5zZm9ybSlcblxuQ2lwaGVyQmFzZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKGRhdGEsIGlucHV0RW5jLCBvdXRwdXRFbmMpIHtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIGRhdGEgPSBCdWZmZXIuZnJvbShkYXRhLCBpbnB1dEVuYylcbiAgfVxuXG4gIHZhciBvdXREYXRhID0gdGhpcy5fdXBkYXRlKGRhdGEpXG4gIGlmICh0aGlzLmhhc2hNb2RlKSByZXR1cm4gdGhpc1xuXG4gIGlmIChvdXRwdXRFbmMpIHtcbiAgICBvdXREYXRhID0gdGhpcy5fdG9TdHJpbmcob3V0RGF0YSwgb3V0cHV0RW5jKVxuICB9XG5cbiAgcmV0dXJuIG91dERhdGFcbn1cblxuQ2lwaGVyQmFzZS5wcm90b3R5cGUuc2V0QXV0b1BhZGRpbmcgPSBmdW5jdGlvbiAoKSB7fVxuQ2lwaGVyQmFzZS5wcm90b3R5cGUuZ2V0QXV0aFRhZyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCd0cnlpbmcgdG8gZ2V0IGF1dGggdGFnIGluIHVuc3VwcG9ydGVkIHN0YXRlJylcbn1cblxuQ2lwaGVyQmFzZS5wcm90b3R5cGUuc2V0QXV0aFRhZyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCd0cnlpbmcgdG8gc2V0IGF1dGggdGFnIGluIHVuc3VwcG9ydGVkIHN0YXRlJylcbn1cblxuQ2lwaGVyQmFzZS5wcm90b3R5cGUuc2V0QUFEID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ3RyeWluZyB0byBzZXQgYWFkIGluIHVuc3VwcG9ydGVkIHN0YXRlJylcbn1cblxuQ2lwaGVyQmFzZS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChkYXRhLCBfLCBuZXh0KSB7XG4gIHZhciBlcnJcbiAgdHJ5IHtcbiAgICBpZiAodGhpcy5oYXNoTW9kZSkge1xuICAgICAgdGhpcy5fdXBkYXRlKGRhdGEpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHVzaCh0aGlzLl91cGRhdGUoZGF0YSkpXG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgZXJyID0gZVxuICB9IGZpbmFsbHkge1xuICAgIG5leHQoZXJyKVxuICB9XG59XG5DaXBoZXJCYXNlLnByb3RvdHlwZS5fZmx1c2ggPSBmdW5jdGlvbiAoZG9uZSkge1xuICB2YXIgZXJyXG4gIHRyeSB7XG4gICAgdGhpcy5wdXNoKHRoaXMuX19maW5hbCgpKVxuICB9IGNhdGNoIChlKSB7XG4gICAgZXJyID0gZVxuICB9XG5cbiAgZG9uZShlcnIpXG59XG5DaXBoZXJCYXNlLnByb3RvdHlwZS5fZmluYWxPckRpZ2VzdCA9IGZ1bmN0aW9uIChvdXRwdXRFbmMpIHtcbiAgdmFyIG91dERhdGEgPSB0aGlzLl9fZmluYWwoKSB8fCBCdWZmZXIuYWxsb2MoMClcbiAgaWYgKG91dHB1dEVuYykge1xuICAgIG91dERhdGEgPSB0aGlzLl90b1N0cmluZyhvdXREYXRhLCBvdXRwdXRFbmMsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG91dERhdGFcbn1cblxuQ2lwaGVyQmFzZS5wcm90b3R5cGUuX3RvU3RyaW5nID0gZnVuY3Rpb24gKHZhbHVlLCBlbmMsIGZpbikge1xuICBpZiAoIXRoaXMuX2RlY29kZXIpIHtcbiAgICB0aGlzLl9kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKVxuICAgIHRoaXMuX2VuY29kaW5nID0gZW5jXG4gIH1cblxuICBpZiAodGhpcy5fZW5jb2RpbmcgIT09IGVuYykgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IHN3aXRjaCBlbmNvZGluZ3MnKVxuXG4gIHZhciBvdXQgPSB0aGlzLl9kZWNvZGVyLndyaXRlKHZhbHVlKVxuICBpZiAoZmluKSB7XG4gICAgb3V0ICs9IHRoaXMuX2RlY29kZXIuZW5kKClcbiAgfVxuXG4gIHJldHVybiBvdXRcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDaXBoZXJCYXNlXG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cblxuZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShhcmcpO1xuICB9XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhhcmcpID09PSAnW29iamVjdCBBcnJheV0nO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gQnVmZmVyLmlzQnVmZmVyO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG4iLCJ2YXIgZWxsaXB0aWMgPSByZXF1aXJlKCdlbGxpcHRpYycpXG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JlYXRlRUNESCAoY3VydmUpIHtcbiAgcmV0dXJuIG5ldyBFQ0RIKGN1cnZlKVxufVxuXG52YXIgYWxpYXNlcyA9IHtcbiAgc2VjcDI1NmsxOiB7XG4gICAgbmFtZTogJ3NlY3AyNTZrMScsXG4gICAgYnl0ZUxlbmd0aDogMzJcbiAgfSxcbiAgc2VjcDIyNHIxOiB7XG4gICAgbmFtZTogJ3AyMjQnLFxuICAgIGJ5dGVMZW5ndGg6IDI4XG4gIH0sXG4gIHByaW1lMjU2djE6IHtcbiAgICBuYW1lOiAncDI1NicsXG4gICAgYnl0ZUxlbmd0aDogMzJcbiAgfSxcbiAgcHJpbWUxOTJ2MToge1xuICAgIG5hbWU6ICdwMTkyJyxcbiAgICBieXRlTGVuZ3RoOiAyNFxuICB9LFxuICBlZDI1NTE5OiB7XG4gICAgbmFtZTogJ2VkMjU1MTknLFxuICAgIGJ5dGVMZW5ndGg6IDMyXG4gIH0sXG4gIHNlY3AzODRyMToge1xuICAgIG5hbWU6ICdwMzg0JyxcbiAgICBieXRlTGVuZ3RoOiA0OFxuICB9LFxuICBzZWNwNTIxcjE6IHtcbiAgICBuYW1lOiAncDUyMScsXG4gICAgYnl0ZUxlbmd0aDogNjZcbiAgfVxufVxuXG5hbGlhc2VzLnAyMjQgPSBhbGlhc2VzLnNlY3AyMjRyMVxuYWxpYXNlcy5wMjU2ID0gYWxpYXNlcy5zZWNwMjU2cjEgPSBhbGlhc2VzLnByaW1lMjU2djFcbmFsaWFzZXMucDE5MiA9IGFsaWFzZXMuc2VjcDE5MnIxID0gYWxpYXNlcy5wcmltZTE5MnYxXG5hbGlhc2VzLnAzODQgPSBhbGlhc2VzLnNlY3AzODRyMVxuYWxpYXNlcy5wNTIxID0gYWxpYXNlcy5zZWNwNTIxcjFcblxuZnVuY3Rpb24gRUNESCAoY3VydmUpIHtcbiAgdGhpcy5jdXJ2ZVR5cGUgPSBhbGlhc2VzW2N1cnZlXVxuICBpZiAoIXRoaXMuY3VydmVUeXBlKSB7XG4gICAgdGhpcy5jdXJ2ZVR5cGUgPSB7XG4gICAgICBuYW1lOiBjdXJ2ZVxuICAgIH1cbiAgfVxuICB0aGlzLmN1cnZlID0gbmV3IGVsbGlwdGljLmVjKHRoaXMuY3VydmVUeXBlLm5hbWUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcFxuICB0aGlzLmtleXMgPSB2b2lkIDBcbn1cblxuRUNESC5wcm90b3R5cGUuZ2VuZXJhdGVLZXlzID0gZnVuY3Rpb24gKGVuYywgZm9ybWF0KSB7XG4gIHRoaXMua2V5cyA9IHRoaXMuY3VydmUuZ2VuS2V5UGFpcigpXG4gIHJldHVybiB0aGlzLmdldFB1YmxpY0tleShlbmMsIGZvcm1hdClcbn1cblxuRUNESC5wcm90b3R5cGUuY29tcHV0ZVNlY3JldCA9IGZ1bmN0aW9uIChvdGhlciwgaW5lbmMsIGVuYykge1xuICBpbmVuYyA9IGluZW5jIHx8ICd1dGY4J1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihvdGhlcikpIHtcbiAgICBvdGhlciA9IG5ldyBCdWZmZXIob3RoZXIsIGluZW5jKVxuICB9XG4gIHZhciBvdGhlclB1YiA9IHRoaXMuY3VydmUua2V5RnJvbVB1YmxpYyhvdGhlcikuZ2V0UHVibGljKClcbiAgdmFyIG91dCA9IG90aGVyUHViLm11bCh0aGlzLmtleXMuZ2V0UHJpdmF0ZSgpKS5nZXRYKClcbiAgcmV0dXJuIGZvcm1hdFJldHVyblZhbHVlKG91dCwgZW5jLCB0aGlzLmN1cnZlVHlwZS5ieXRlTGVuZ3RoKVxufVxuXG5FQ0RILnByb3RvdHlwZS5nZXRQdWJsaWNLZXkgPSBmdW5jdGlvbiAoZW5jLCBmb3JtYXQpIHtcbiAgdmFyIGtleSA9IHRoaXMua2V5cy5nZXRQdWJsaWMoZm9ybWF0ID09PSAnY29tcHJlc3NlZCcsIHRydWUpXG4gIGlmIChmb3JtYXQgPT09ICdoeWJyaWQnKSB7XG4gICAgaWYgKGtleVtrZXkubGVuZ3RoIC0gMV0gJSAyKSB7XG4gICAgICBrZXlbMF0gPSA3XG4gICAgfSBlbHNlIHtcbiAgICAgIGtleVswXSA9IDZcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZvcm1hdFJldHVyblZhbHVlKGtleSwgZW5jKVxufVxuXG5FQ0RILnByb3RvdHlwZS5nZXRQcml2YXRlS2V5ID0gZnVuY3Rpb24gKGVuYykge1xuICByZXR1cm4gZm9ybWF0UmV0dXJuVmFsdWUodGhpcy5rZXlzLmdldFByaXZhdGUoKSwgZW5jKVxufVxuXG5FQ0RILnByb3RvdHlwZS5zZXRQdWJsaWNLZXkgPSBmdW5jdGlvbiAocHViLCBlbmMpIHtcbiAgZW5jID0gZW5jIHx8ICd1dGY4J1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihwdWIpKSB7XG4gICAgcHViID0gbmV3IEJ1ZmZlcihwdWIsIGVuYylcbiAgfVxuICB0aGlzLmtleXMuX2ltcG9ydFB1YmxpYyhwdWIpXG4gIHJldHVybiB0aGlzXG59XG5cbkVDREgucHJvdG90eXBlLnNldFByaXZhdGVLZXkgPSBmdW5jdGlvbiAocHJpdiwgZW5jKSB7XG4gIGVuYyA9IGVuYyB8fCAndXRmOCdcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIocHJpdikpIHtcbiAgICBwcml2ID0gbmV3IEJ1ZmZlcihwcml2LCBlbmMpXG4gIH1cblxuICB2YXIgX3ByaXYgPSBuZXcgQk4ocHJpdilcbiAgX3ByaXYgPSBfcHJpdi50b1N0cmluZygxNilcbiAgdGhpcy5rZXlzID0gdGhpcy5jdXJ2ZS5nZW5LZXlQYWlyKClcbiAgdGhpcy5rZXlzLl9pbXBvcnRQcml2YXRlKF9wcml2KVxuICByZXR1cm4gdGhpc1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXR1cm5WYWx1ZSAoYm4sIGVuYywgbGVuKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShibikpIHtcbiAgICBibiA9IGJuLnRvQXJyYXkoKVxuICB9XG4gIHZhciBidWYgPSBuZXcgQnVmZmVyKGJuKVxuICBpZiAobGVuICYmIGJ1Zi5sZW5ndGggPCBsZW4pIHtcbiAgICB2YXIgemVyb3MgPSBuZXcgQnVmZmVyKGxlbiAtIGJ1Zi5sZW5ndGgpXG4gICAgemVyb3MuZmlsbCgwKVxuICAgIGJ1ZiA9IEJ1ZmZlci5jb25jYXQoW3plcm9zLCBidWZdKVxuICB9XG4gIGlmICghZW5jKSB7XG4gICAgcmV0dXJuIGJ1ZlxuICB9IGVsc2Uge1xuICAgIHJldHVybiBidWYudG9TdHJpbmcoZW5jKVxuICB9XG59XG4iLCIndXNlIHN0cmljdCdcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBNRDUgPSByZXF1aXJlKCdtZDUuanMnKVxudmFyIFJJUEVNRDE2MCA9IHJlcXVpcmUoJ3JpcGVtZDE2MCcpXG52YXIgc2hhID0gcmVxdWlyZSgnc2hhLmpzJylcbnZhciBCYXNlID0gcmVxdWlyZSgnY2lwaGVyLWJhc2UnKVxuXG5mdW5jdGlvbiBIYXNoIChoYXNoKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCAnZGlnZXN0JylcblxuICB0aGlzLl9oYXNoID0gaGFzaFxufVxuXG5pbmhlcml0cyhIYXNoLCBCYXNlKVxuXG5IYXNoLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgdGhpcy5faGFzaC51cGRhdGUoZGF0YSlcbn1cblxuSGFzaC5wcm90b3R5cGUuX2ZpbmFsID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5faGFzaC5kaWdlc3QoKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZUhhc2ggKGFsZykge1xuICBhbGcgPSBhbGcudG9Mb3dlckNhc2UoKVxuICBpZiAoYWxnID09PSAnbWQ1JykgcmV0dXJuIG5ldyBNRDUoKVxuICBpZiAoYWxnID09PSAncm1kMTYwJyB8fCBhbGcgPT09ICdyaXBlbWQxNjAnKSByZXR1cm4gbmV3IFJJUEVNRDE2MCgpXG5cbiAgcmV0dXJuIG5ldyBIYXNoKHNoYShhbGcpKVxufVxuIiwidmFyIE1ENSA9IHJlcXVpcmUoJ21kNS5qcycpXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJ1ZmZlcikge1xuICByZXR1cm4gbmV3IE1ENSgpLnVwZGF0ZShidWZmZXIpLmRpZ2VzdCgpXG59XG4iLCIndXNlIHN0cmljdCdcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBMZWdhY3kgPSByZXF1aXJlKCcuL2xlZ2FjeScpXG52YXIgQmFzZSA9IHJlcXVpcmUoJ2NpcGhlci1iYXNlJylcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlclxudmFyIG1kNSA9IHJlcXVpcmUoJ2NyZWF0ZS1oYXNoL21kNScpXG52YXIgUklQRU1EMTYwID0gcmVxdWlyZSgncmlwZW1kMTYwJylcblxudmFyIHNoYSA9IHJlcXVpcmUoJ3NoYS5qcycpXG5cbnZhciBaRVJPUyA9IEJ1ZmZlci5hbGxvYygxMjgpXG5cbmZ1bmN0aW9uIEhtYWMgKGFsZywga2V5KSB7XG4gIEJhc2UuY2FsbCh0aGlzLCAnZGlnZXN0JylcbiAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAga2V5ID0gQnVmZmVyLmZyb20oa2V5KVxuICB9XG5cbiAgdmFyIGJsb2Nrc2l6ZSA9IChhbGcgPT09ICdzaGE1MTInIHx8IGFsZyA9PT0gJ3NoYTM4NCcpID8gMTI4IDogNjRcblxuICB0aGlzLl9hbGcgPSBhbGdcbiAgdGhpcy5fa2V5ID0ga2V5XG4gIGlmIChrZXkubGVuZ3RoID4gYmxvY2tzaXplKSB7XG4gICAgdmFyIGhhc2ggPSBhbGcgPT09ICdybWQxNjAnID8gbmV3IFJJUEVNRDE2MCgpIDogc2hhKGFsZylcbiAgICBrZXkgPSBoYXNoLnVwZGF0ZShrZXkpLmRpZ2VzdCgpXG4gIH0gZWxzZSBpZiAoa2V5Lmxlbmd0aCA8IGJsb2Nrc2l6ZSkge1xuICAgIGtleSA9IEJ1ZmZlci5jb25jYXQoW2tleSwgWkVST1NdLCBibG9ja3NpemUpXG4gIH1cblxuICB2YXIgaXBhZCA9IHRoaXMuX2lwYWQgPSBCdWZmZXIuYWxsb2NVbnNhZmUoYmxvY2tzaXplKVxuICB2YXIgb3BhZCA9IHRoaXMuX29wYWQgPSBCdWZmZXIuYWxsb2NVbnNhZmUoYmxvY2tzaXplKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tzaXplOyBpKyspIHtcbiAgICBpcGFkW2ldID0ga2V5W2ldIF4gMHgzNlxuICAgIG9wYWRbaV0gPSBrZXlbaV0gXiAweDVDXG4gIH1cbiAgdGhpcy5faGFzaCA9IGFsZyA9PT0gJ3JtZDE2MCcgPyBuZXcgUklQRU1EMTYwKCkgOiBzaGEoYWxnKVxuICB0aGlzLl9oYXNoLnVwZGF0ZShpcGFkKVxufVxuXG5pbmhlcml0cyhIbWFjLCBCYXNlKVxuXG5IbWFjLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgdGhpcy5faGFzaC51cGRhdGUoZGF0YSlcbn1cblxuSG1hYy5wcm90b3R5cGUuX2ZpbmFsID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaCA9IHRoaXMuX2hhc2guZGlnZXN0KClcbiAgdmFyIGhhc2ggPSB0aGlzLl9hbGcgPT09ICdybWQxNjAnID8gbmV3IFJJUEVNRDE2MCgpIDogc2hhKHRoaXMuX2FsZylcbiAgcmV0dXJuIGhhc2gudXBkYXRlKHRoaXMuX29wYWQpLnVwZGF0ZShoKS5kaWdlc3QoKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZUhtYWMgKGFsZywga2V5KSB7XG4gIGFsZyA9IGFsZy50b0xvd2VyQ2FzZSgpXG4gIGlmIChhbGcgPT09ICdybWQxNjAnIHx8IGFsZyA9PT0gJ3JpcGVtZDE2MCcpIHtcbiAgICByZXR1cm4gbmV3IEhtYWMoJ3JtZDE2MCcsIGtleSlcbiAgfVxuICBpZiAoYWxnID09PSAnbWQ1Jykge1xuICAgIHJldHVybiBuZXcgTGVnYWN5KG1kNSwga2V5KVxuICB9XG4gIHJldHVybiBuZXcgSG1hYyhhbGcsIGtleSlcbn1cbiIsIid1c2Ugc3RyaWN0J1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyXG5cbnZhciBCYXNlID0gcmVxdWlyZSgnY2lwaGVyLWJhc2UnKVxuXG52YXIgWkVST1MgPSBCdWZmZXIuYWxsb2MoMTI4KVxudmFyIGJsb2Nrc2l6ZSA9IDY0XG5cbmZ1bmN0aW9uIEhtYWMgKGFsZywga2V5KSB7XG4gIEJhc2UuY2FsbCh0aGlzLCAnZGlnZXN0JylcbiAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAga2V5ID0gQnVmZmVyLmZyb20oa2V5KVxuICB9XG5cbiAgdGhpcy5fYWxnID0gYWxnXG4gIHRoaXMuX2tleSA9IGtleVxuXG4gIGlmIChrZXkubGVuZ3RoID4gYmxvY2tzaXplKSB7XG4gICAga2V5ID0gYWxnKGtleSlcbiAgfSBlbHNlIGlmIChrZXkubGVuZ3RoIDwgYmxvY2tzaXplKSB7XG4gICAga2V5ID0gQnVmZmVyLmNvbmNhdChba2V5LCBaRVJPU10sIGJsb2Nrc2l6ZSlcbiAgfVxuXG4gIHZhciBpcGFkID0gdGhpcy5faXBhZCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShibG9ja3NpemUpXG4gIHZhciBvcGFkID0gdGhpcy5fb3BhZCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShibG9ja3NpemUpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja3NpemU7IGkrKykge1xuICAgIGlwYWRbaV0gPSBrZXlbaV0gXiAweDM2XG4gICAgb3BhZFtpXSA9IGtleVtpXSBeIDB4NUNcbiAgfVxuXG4gIHRoaXMuX2hhc2ggPSBbaXBhZF1cbn1cblxuaW5oZXJpdHMoSG1hYywgQmFzZSlcblxuSG1hYy5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHRoaXMuX2hhc2gucHVzaChkYXRhKVxufVxuXG5IbWFjLnByb3RvdHlwZS5fZmluYWwgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBoID0gdGhpcy5fYWxnKEJ1ZmZlci5jb25jYXQodGhpcy5faGFzaCkpXG4gIHJldHVybiB0aGlzLl9hbGcoQnVmZmVyLmNvbmNhdChbdGhpcy5fb3BhZCwgaF0pKVxufVxubW9kdWxlLmV4cG9ydHMgPSBIbWFjXG4iLCIndXNlIHN0cmljdCdcblxuZXhwb3J0cy5yYW5kb21CeXRlcyA9IGV4cG9ydHMucm5nID0gZXhwb3J0cy5wc2V1ZG9SYW5kb21CeXRlcyA9IGV4cG9ydHMucHJuZyA9IHJlcXVpcmUoJ3JhbmRvbWJ5dGVzJylcbmV4cG9ydHMuY3JlYXRlSGFzaCA9IGV4cG9ydHMuSGFzaCA9IHJlcXVpcmUoJ2NyZWF0ZS1oYXNoJylcbmV4cG9ydHMuY3JlYXRlSG1hYyA9IGV4cG9ydHMuSG1hYyA9IHJlcXVpcmUoJ2NyZWF0ZS1obWFjJylcblxudmFyIGFsZ29zID0gcmVxdWlyZSgnYnJvd3NlcmlmeS1zaWduL2FsZ29zJylcbnZhciBhbGdvS2V5cyA9IE9iamVjdC5rZXlzKGFsZ29zKVxudmFyIGhhc2hlcyA9IFsnc2hhMScsICdzaGEyMjQnLCAnc2hhMjU2JywgJ3NoYTM4NCcsICdzaGE1MTInLCAnbWQ1JywgJ3JtZDE2MCddLmNvbmNhdChhbGdvS2V5cylcbmV4cG9ydHMuZ2V0SGFzaGVzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaGFzaGVzXG59XG5cbnZhciBwID0gcmVxdWlyZSgncGJrZGYyJylcbmV4cG9ydHMucGJrZGYyID0gcC5wYmtkZjJcbmV4cG9ydHMucGJrZGYyU3luYyA9IHAucGJrZGYyU3luY1xuXG52YXIgYWVzID0gcmVxdWlyZSgnYnJvd3NlcmlmeS1jaXBoZXInKVxuXG5leHBvcnRzLkNpcGhlciA9IGFlcy5DaXBoZXJcbmV4cG9ydHMuY3JlYXRlQ2lwaGVyID0gYWVzLmNyZWF0ZUNpcGhlclxuZXhwb3J0cy5DaXBoZXJpdiA9IGFlcy5DaXBoZXJpdlxuZXhwb3J0cy5jcmVhdGVDaXBoZXJpdiA9IGFlcy5jcmVhdGVDaXBoZXJpdlxuZXhwb3J0cy5EZWNpcGhlciA9IGFlcy5EZWNpcGhlclxuZXhwb3J0cy5jcmVhdGVEZWNpcGhlciA9IGFlcy5jcmVhdGVEZWNpcGhlclxuZXhwb3J0cy5EZWNpcGhlcml2ID0gYWVzLkRlY2lwaGVyaXZcbmV4cG9ydHMuY3JlYXRlRGVjaXBoZXJpdiA9IGFlcy5jcmVhdGVEZWNpcGhlcml2XG5leHBvcnRzLmdldENpcGhlcnMgPSBhZXMuZ2V0Q2lwaGVyc1xuZXhwb3J0cy5saXN0Q2lwaGVycyA9IGFlcy5saXN0Q2lwaGVyc1xuXG52YXIgZGggPSByZXF1aXJlKCdkaWZmaWUtaGVsbG1hbicpXG5cbmV4cG9ydHMuRGlmZmllSGVsbG1hbkdyb3VwID0gZGguRGlmZmllSGVsbG1hbkdyb3VwXG5leHBvcnRzLmNyZWF0ZURpZmZpZUhlbGxtYW5Hcm91cCA9IGRoLmNyZWF0ZURpZmZpZUhlbGxtYW5Hcm91cFxuZXhwb3J0cy5nZXREaWZmaWVIZWxsbWFuID0gZGguZ2V0RGlmZmllSGVsbG1hblxuZXhwb3J0cy5jcmVhdGVEaWZmaWVIZWxsbWFuID0gZGguY3JlYXRlRGlmZmllSGVsbG1hblxuZXhwb3J0cy5EaWZmaWVIZWxsbWFuID0gZGguRGlmZmllSGVsbG1hblxuXG52YXIgc2lnbiA9IHJlcXVpcmUoJ2Jyb3dzZXJpZnktc2lnbicpXG5cbmV4cG9ydHMuY3JlYXRlU2lnbiA9IHNpZ24uY3JlYXRlU2lnblxuZXhwb3J0cy5TaWduID0gc2lnbi5TaWduXG5leHBvcnRzLmNyZWF0ZVZlcmlmeSA9IHNpZ24uY3JlYXRlVmVyaWZ5XG5leHBvcnRzLlZlcmlmeSA9IHNpZ24uVmVyaWZ5XG5cbmV4cG9ydHMuY3JlYXRlRUNESCA9IHJlcXVpcmUoJ2NyZWF0ZS1lY2RoJylcblxudmFyIHB1YmxpY0VuY3J5cHQgPSByZXF1aXJlKCdwdWJsaWMtZW5jcnlwdCcpXG5cbmV4cG9ydHMucHVibGljRW5jcnlwdCA9IHB1YmxpY0VuY3J5cHQucHVibGljRW5jcnlwdFxuZXhwb3J0cy5wcml2YXRlRW5jcnlwdCA9IHB1YmxpY0VuY3J5cHQucHJpdmF0ZUVuY3J5cHRcbmV4cG9ydHMucHVibGljRGVjcnlwdCA9IHB1YmxpY0VuY3J5cHQucHVibGljRGVjcnlwdFxuZXhwb3J0cy5wcml2YXRlRGVjcnlwdCA9IHB1YmxpY0VuY3J5cHQucHJpdmF0ZURlY3J5cHRcblxuLy8gdGhlIGxlYXN0IEkgY2FuIGRvIGlzIG1ha2UgZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSByZXN0IG9mIHRoZSBub2RlLmpzL2NyeXB0byBhcGkuXG4vLyA7W1xuLy8gICAnY3JlYXRlQ3JlZGVudGlhbHMnXG4vLyBdLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbi8vICAgZXhwb3J0c1tuYW1lXSA9IGZ1bmN0aW9uICgpIHtcbi8vICAgICB0aHJvdyBuZXcgRXJyb3IoW1xuLy8gICAgICAgJ3NvcnJ5LCAnICsgbmFtZSArICcgaXMgbm90IGltcGxlbWVudGVkIHlldCcsXG4vLyAgICAgICAnd2UgYWNjZXB0IHB1bGwgcmVxdWVzdHMnLFxuLy8gICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9jcnlwdG8tYnJvd3NlcmlmeS9jcnlwdG8tYnJvd3NlcmlmeSdcbi8vICAgICBdLmpvaW4oJ1xcbicpKVxuLy8gICB9XG4vLyB9KVxuXG52YXIgcmYgPSByZXF1aXJlKCdyYW5kb21maWxsJylcblxuZXhwb3J0cy5yYW5kb21GaWxsID0gcmYucmFuZG9tRmlsbFxuZXhwb3J0cy5yYW5kb21GaWxsU3luYyA9IHJmLnJhbmRvbUZpbGxTeW5jXG5cbmV4cG9ydHMuY3JlYXRlQ3JlZGVudGlhbHMgPSBmdW5jdGlvbiAoKSB7XG4gIHRocm93IG5ldyBFcnJvcihbXG4gICAgJ3NvcnJ5LCBjcmVhdGVDcmVkZW50aWFscyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0JyxcbiAgICAnd2UgYWNjZXB0IHB1bGwgcmVxdWVzdHMnLFxuICAgICdodHRwczovL2dpdGh1Yi5jb20vY3J5cHRvLWJyb3dzZXJpZnkvY3J5cHRvLWJyb3dzZXJpZnknXG4gIF0uam9pbignXFxuJykpXG59XG5cbmV4cG9ydHMuY29uc3RhbnRzID0ge1xuICAnREhfQ0hFQ0tfUF9OT1RfU0FGRV9QUklNRSc6IDIsXG4gICdESF9DSEVDS19QX05PVF9QUklNRSc6IDEsXG4gICdESF9VTkFCTEVfVE9fQ0hFQ0tfR0VORVJBVE9SJzogNCxcbiAgJ0RIX05PVF9TVUlUQUJMRV9HRU5FUkFUT1InOiA4LFxuICAnTlBOX0VOQUJMRUQnOiAxLFxuICAnQUxQTl9FTkFCTEVEJzogMSxcbiAgJ1JTQV9QS0NTMV9QQURESU5HJzogMSxcbiAgJ1JTQV9TU0xWMjNfUEFERElORyc6IDIsXG4gICdSU0FfTk9fUEFERElORyc6IDMsXG4gICdSU0FfUEtDUzFfT0FFUF9QQURESU5HJzogNCxcbiAgJ1JTQV9YOTMxX1BBRERJTkcnOiA1LFxuICAnUlNBX1BLQ1MxX1BTU19QQURESU5HJzogNixcbiAgJ1BPSU5UX0NPTlZFUlNJT05fQ09NUFJFU1NFRCc6IDIsXG4gICdQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRCc6IDQsXG4gICdQT0lOVF9DT05WRVJTSU9OX0hZQlJJRCc6IDZcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy51dGlscyA9IHJlcXVpcmUoJy4vZGVzL3V0aWxzJyk7XG5leHBvcnRzLkNpcGhlciA9IHJlcXVpcmUoJy4vZGVzL2NpcGhlcicpO1xuZXhwb3J0cy5ERVMgPSByZXF1aXJlKCcuL2Rlcy9kZXMnKTtcbmV4cG9ydHMuQ0JDID0gcmVxdWlyZSgnLi9kZXMvY2JjJyk7XG5leHBvcnRzLkVERSA9IHJlcXVpcmUoJy4vZGVzL2VkZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxudmFyIHByb3RvID0ge307XG5cbmZ1bmN0aW9uIENCQ1N0YXRlKGl2KSB7XG4gIGFzc2VydC5lcXVhbChpdi5sZW5ndGgsIDgsICdJbnZhbGlkIElWIGxlbmd0aCcpO1xuXG4gIHRoaXMuaXYgPSBuZXcgQXJyYXkoOCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdi5sZW5ndGg7IGkrKylcbiAgICB0aGlzLml2W2ldID0gaXZbaV07XG59XG5cbmZ1bmN0aW9uIGluc3RhbnRpYXRlKEJhc2UpIHtcbiAgZnVuY3Rpb24gQ0JDKG9wdGlvbnMpIHtcbiAgICBCYXNlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgdGhpcy5fY2JjSW5pdCgpO1xuICB9XG4gIGluaGVyaXRzKENCQywgQmFzZSk7XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhwcm90byk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIENCQy5wcm90b3R5cGVba2V5XSA9IHByb3RvW2tleV07XG4gIH1cblxuICBDQkMuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IENCQyhvcHRpb25zKTtcbiAgfTtcblxuICByZXR1cm4gQ0JDO1xufVxuXG5leHBvcnRzLmluc3RhbnRpYXRlID0gaW5zdGFudGlhdGU7XG5cbnByb3RvLl9jYmNJbml0ID0gZnVuY3Rpb24gX2NiY0luaXQoKSB7XG4gIHZhciBzdGF0ZSA9IG5ldyBDQkNTdGF0ZSh0aGlzLm9wdGlvbnMuaXYpO1xuICB0aGlzLl9jYmNTdGF0ZSA9IHN0YXRlO1xufTtcblxucHJvdG8uX3VwZGF0ZSA9IGZ1bmN0aW9uIF91cGRhdGUoaW5wLCBpbk9mZiwgb3V0LCBvdXRPZmYpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fY2JjU3RhdGU7XG4gIHZhciBzdXBlclByb3RvID0gdGhpcy5jb25zdHJ1Y3Rvci5zdXBlcl8ucHJvdG90eXBlO1xuXG4gIHZhciBpdiA9IHN0YXRlLml2O1xuICBpZiAodGhpcy50eXBlID09PSAnZW5jcnlwdCcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYmxvY2tTaXplOyBpKyspXG4gICAgICBpdltpXSBePSBpbnBbaW5PZmYgKyBpXTtcblxuICAgIHN1cGVyUHJvdG8uX3VwZGF0ZS5jYWxsKHRoaXMsIGl2LCAwLCBvdXQsIG91dE9mZik7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYmxvY2tTaXplOyBpKyspXG4gICAgICBpdltpXSA9IG91dFtvdXRPZmYgKyBpXTtcbiAgfSBlbHNlIHtcbiAgICBzdXBlclByb3RvLl91cGRhdGUuY2FsbCh0aGlzLCBpbnAsIGluT2ZmLCBvdXQsIG91dE9mZik7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYmxvY2tTaXplOyBpKyspXG4gICAgICBvdXRbb3V0T2ZmICsgaV0gXj0gaXZbaV07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYmxvY2tTaXplOyBpKyspXG4gICAgICBpdltpXSA9IGlucFtpbk9mZiArIGldO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG5mdW5jdGlvbiBDaXBoZXIob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gIHRoaXMudHlwZSA9IHRoaXMub3B0aW9ucy50eXBlO1xuICB0aGlzLmJsb2NrU2l6ZSA9IDg7XG4gIHRoaXMuX2luaXQoKTtcblxuICB0aGlzLmJ1ZmZlciA9IG5ldyBBcnJheSh0aGlzLmJsb2NrU2l6ZSk7XG4gIHRoaXMuYnVmZmVyT2ZmID0gMDtcbn1cbm1vZHVsZS5leHBvcnRzID0gQ2lwaGVyO1xuXG5DaXBoZXIucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gX2luaXQoKSB7XG4gIC8vIE1pZ2h0IGJlIG92ZXJyaWRlZFxufTtcblxuQ2lwaGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoZGF0YSkge1xuICBpZiAoZGF0YS5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuIFtdO1xuXG4gIGlmICh0aGlzLnR5cGUgPT09ICdkZWNyeXB0JylcbiAgICByZXR1cm4gdGhpcy5fdXBkYXRlRGVjcnlwdChkYXRhKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLl91cGRhdGVFbmNyeXB0KGRhdGEpO1xufTtcblxuQ2lwaGVyLnByb3RvdHlwZS5fYnVmZmVyID0gZnVuY3Rpb24gX2J1ZmZlcihkYXRhLCBvZmYpIHtcbiAgLy8gQXBwZW5kIGRhdGEgdG8gYnVmZmVyXG4gIHZhciBtaW4gPSBNYXRoLm1pbih0aGlzLmJ1ZmZlci5sZW5ndGggLSB0aGlzLmJ1ZmZlck9mZiwgZGF0YS5sZW5ndGggLSBvZmYpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG1pbjsgaSsrKVxuICAgIHRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyT2ZmICsgaV0gPSBkYXRhW29mZiArIGldO1xuICB0aGlzLmJ1ZmZlck9mZiArPSBtaW47XG5cbiAgLy8gU2hpZnQgbmV4dFxuICByZXR1cm4gbWluO1xufTtcblxuQ2lwaGVyLnByb3RvdHlwZS5fZmx1c2hCdWZmZXIgPSBmdW5jdGlvbiBfZmx1c2hCdWZmZXIob3V0LCBvZmYpIHtcbiAgdGhpcy5fdXBkYXRlKHRoaXMuYnVmZmVyLCAwLCBvdXQsIG9mZik7XG4gIHRoaXMuYnVmZmVyT2ZmID0gMDtcbiAgcmV0dXJuIHRoaXMuYmxvY2tTaXplO1xufTtcblxuQ2lwaGVyLnByb3RvdHlwZS5fdXBkYXRlRW5jcnlwdCA9IGZ1bmN0aW9uIF91cGRhdGVFbmNyeXB0KGRhdGEpIHtcbiAgdmFyIGlucHV0T2ZmID0gMDtcbiAgdmFyIG91dHB1dE9mZiA9IDA7XG5cbiAgdmFyIGNvdW50ID0gKCh0aGlzLmJ1ZmZlck9mZiArIGRhdGEubGVuZ3RoKSAvIHRoaXMuYmxvY2tTaXplKSB8IDA7XG4gIHZhciBvdXQgPSBuZXcgQXJyYXkoY291bnQgKiB0aGlzLmJsb2NrU2l6ZSk7XG5cbiAgaWYgKHRoaXMuYnVmZmVyT2ZmICE9PSAwKSB7XG4gICAgaW5wdXRPZmYgKz0gdGhpcy5fYnVmZmVyKGRhdGEsIGlucHV0T2ZmKTtcblxuICAgIGlmICh0aGlzLmJ1ZmZlck9mZiA9PT0gdGhpcy5idWZmZXIubGVuZ3RoKVxuICAgICAgb3V0cHV0T2ZmICs9IHRoaXMuX2ZsdXNoQnVmZmVyKG91dCwgb3V0cHV0T2ZmKTtcbiAgfVxuXG4gIC8vIFdyaXRlIGJsb2Nrc1xuICB2YXIgbWF4ID0gZGF0YS5sZW5ndGggLSAoKGRhdGEubGVuZ3RoIC0gaW5wdXRPZmYpICUgdGhpcy5ibG9ja1NpemUpO1xuICBmb3IgKDsgaW5wdXRPZmYgPCBtYXg7IGlucHV0T2ZmICs9IHRoaXMuYmxvY2tTaXplKSB7XG4gICAgdGhpcy5fdXBkYXRlKGRhdGEsIGlucHV0T2ZmLCBvdXQsIG91dHB1dE9mZik7XG4gICAgb3V0cHV0T2ZmICs9IHRoaXMuYmxvY2tTaXplO1xuICB9XG5cbiAgLy8gUXVldWUgcmVzdFxuICBmb3IgKDsgaW5wdXRPZmYgPCBkYXRhLmxlbmd0aDsgaW5wdXRPZmYrKywgdGhpcy5idWZmZXJPZmYrKylcbiAgICB0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlck9mZl0gPSBkYXRhW2lucHV0T2ZmXTtcblxuICByZXR1cm4gb3V0O1xufTtcblxuQ2lwaGVyLnByb3RvdHlwZS5fdXBkYXRlRGVjcnlwdCA9IGZ1bmN0aW9uIF91cGRhdGVEZWNyeXB0KGRhdGEpIHtcbiAgdmFyIGlucHV0T2ZmID0gMDtcbiAgdmFyIG91dHB1dE9mZiA9IDA7XG5cbiAgdmFyIGNvdW50ID0gTWF0aC5jZWlsKCh0aGlzLmJ1ZmZlck9mZiArIGRhdGEubGVuZ3RoKSAvIHRoaXMuYmxvY2tTaXplKSAtIDE7XG4gIHZhciBvdXQgPSBuZXcgQXJyYXkoY291bnQgKiB0aGlzLmJsb2NrU2l6ZSk7XG5cbiAgLy8gVE9ETyhpbmR1dG55KTogb3B0aW1pemUgaXQsIHRoaXMgaXMgZmFyIGZyb20gb3B0aW1hbFxuICBmb3IgKDsgY291bnQgPiAwOyBjb3VudC0tKSB7XG4gICAgaW5wdXRPZmYgKz0gdGhpcy5fYnVmZmVyKGRhdGEsIGlucHV0T2ZmKTtcbiAgICBvdXRwdXRPZmYgKz0gdGhpcy5fZmx1c2hCdWZmZXIob3V0LCBvdXRwdXRPZmYpO1xuICB9XG5cbiAgLy8gQnVmZmVyIHJlc3Qgb2YgdGhlIGlucHV0XG4gIGlucHV0T2ZmICs9IHRoaXMuX2J1ZmZlcihkYXRhLCBpbnB1dE9mZik7XG5cbiAgcmV0dXJuIG91dDtcbn07XG5cbkNpcGhlci5wcm90b3R5cGUuZmluYWwgPSBmdW5jdGlvbiBmaW5hbChidWZmZXIpIHtcbiAgdmFyIGZpcnN0O1xuICBpZiAoYnVmZmVyKVxuICAgIGZpcnN0ID0gdGhpcy51cGRhdGUoYnVmZmVyKTtcblxuICB2YXIgbGFzdDtcbiAgaWYgKHRoaXMudHlwZSA9PT0gJ2VuY3J5cHQnKVxuICAgIGxhc3QgPSB0aGlzLl9maW5hbEVuY3J5cHQoKTtcbiAgZWxzZVxuICAgIGxhc3QgPSB0aGlzLl9maW5hbERlY3J5cHQoKTtcblxuICBpZiAoZmlyc3QpXG4gICAgcmV0dXJuIGZpcnN0LmNvbmNhdChsYXN0KTtcbiAgZWxzZVxuICAgIHJldHVybiBsYXN0O1xufTtcblxuQ2lwaGVyLnByb3RvdHlwZS5fcGFkID0gZnVuY3Rpb24gX3BhZChidWZmZXIsIG9mZikge1xuICBpZiAob2ZmID09PSAwKVxuICAgIHJldHVybiBmYWxzZTtcblxuICB3aGlsZSAob2ZmIDwgYnVmZmVyLmxlbmd0aClcbiAgICBidWZmZXJbb2ZmKytdID0gMDtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbkNpcGhlci5wcm90b3R5cGUuX2ZpbmFsRW5jcnlwdCA9IGZ1bmN0aW9uIF9maW5hbEVuY3J5cHQoKSB7XG4gIGlmICghdGhpcy5fcGFkKHRoaXMuYnVmZmVyLCB0aGlzLmJ1ZmZlck9mZikpXG4gICAgcmV0dXJuIFtdO1xuXG4gIHZhciBvdXQgPSBuZXcgQXJyYXkodGhpcy5ibG9ja1NpemUpO1xuICB0aGlzLl91cGRhdGUodGhpcy5idWZmZXIsIDAsIG91dCwgMCk7XG4gIHJldHVybiBvdXQ7XG59O1xuXG5DaXBoZXIucHJvdG90eXBlLl91bnBhZCA9IGZ1bmN0aW9uIF91bnBhZChidWZmZXIpIHtcbiAgcmV0dXJuIGJ1ZmZlcjtcbn07XG5cbkNpcGhlci5wcm90b3R5cGUuX2ZpbmFsRGVjcnlwdCA9IGZ1bmN0aW9uIF9maW5hbERlY3J5cHQoKSB7XG4gIGFzc2VydC5lcXVhbCh0aGlzLmJ1ZmZlck9mZiwgdGhpcy5ibG9ja1NpemUsICdOb3QgZW5vdWdoIGRhdGEgdG8gZGVjcnlwdCcpO1xuICB2YXIgb3V0ID0gbmV3IEFycmF5KHRoaXMuYmxvY2tTaXplKTtcbiAgdGhpcy5fZmx1c2hCdWZmZXIob3V0LCAwKTtcblxuICByZXR1cm4gdGhpcy5fdW5wYWQob3V0KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG52YXIgZGVzID0gcmVxdWlyZSgnLi4vZGVzJyk7XG52YXIgdXRpbHMgPSBkZXMudXRpbHM7XG52YXIgQ2lwaGVyID0gZGVzLkNpcGhlcjtcblxuZnVuY3Rpb24gREVTU3RhdGUoKSB7XG4gIHRoaXMudG1wID0gbmV3IEFycmF5KDIpO1xuICB0aGlzLmtleXMgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBERVMob3B0aW9ucykge1xuICBDaXBoZXIuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICB2YXIgc3RhdGUgPSBuZXcgREVTU3RhdGUoKTtcbiAgdGhpcy5fZGVzU3RhdGUgPSBzdGF0ZTtcblxuICB0aGlzLmRlcml2ZUtleXMoc3RhdGUsIG9wdGlvbnMua2V5KTtcbn1cbmluaGVyaXRzKERFUywgQ2lwaGVyKTtcbm1vZHVsZS5leHBvcnRzID0gREVTO1xuXG5ERVMuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBERVMob3B0aW9ucyk7XG59O1xuXG52YXIgc2hpZnRUYWJsZSA9IFtcbiAgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMixcbiAgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMVxuXTtcblxuREVTLnByb3RvdHlwZS5kZXJpdmVLZXlzID0gZnVuY3Rpb24gZGVyaXZlS2V5cyhzdGF0ZSwga2V5KSB7XG4gIHN0YXRlLmtleXMgPSBuZXcgQXJyYXkoMTYgKiAyKTtcblxuICBhc3NlcnQuZXF1YWwoa2V5Lmxlbmd0aCwgdGhpcy5ibG9ja1NpemUsICdJbnZhbGlkIGtleSBsZW5ndGgnKTtcblxuICB2YXIga0wgPSB1dGlscy5yZWFkVUludDMyQkUoa2V5LCAwKTtcbiAgdmFyIGtSID0gdXRpbHMucmVhZFVJbnQzMkJFKGtleSwgNCk7XG5cbiAgdXRpbHMucGMxKGtMLCBrUiwgc3RhdGUudG1wLCAwKTtcbiAga0wgPSBzdGF0ZS50bXBbMF07XG4gIGtSID0gc3RhdGUudG1wWzFdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlLmtleXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgc2hpZnQgPSBzaGlmdFRhYmxlW2kgPj4+IDFdO1xuICAgIGtMID0gdXRpbHMucjI4c2hsKGtMLCBzaGlmdCk7XG4gICAga1IgPSB1dGlscy5yMjhzaGwoa1IsIHNoaWZ0KTtcbiAgICB1dGlscy5wYzIoa0wsIGtSLCBzdGF0ZS5rZXlzLCBpKTtcbiAgfVxufTtcblxuREVTLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gX3VwZGF0ZShpbnAsIGluT2ZmLCBvdXQsIG91dE9mZikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9kZXNTdGF0ZTtcblxuICB2YXIgbCA9IHV0aWxzLnJlYWRVSW50MzJCRShpbnAsIGluT2ZmKTtcbiAgdmFyIHIgPSB1dGlscy5yZWFkVUludDMyQkUoaW5wLCBpbk9mZiArIDQpO1xuXG4gIC8vIEluaXRpYWwgUGVybXV0YXRpb25cbiAgdXRpbHMuaXAobCwgciwgc3RhdGUudG1wLCAwKTtcbiAgbCA9IHN0YXRlLnRtcFswXTtcbiAgciA9IHN0YXRlLnRtcFsxXTtcblxuICBpZiAodGhpcy50eXBlID09PSAnZW5jcnlwdCcpXG4gICAgdGhpcy5fZW5jcnlwdChzdGF0ZSwgbCwgciwgc3RhdGUudG1wLCAwKTtcbiAgZWxzZVxuICAgIHRoaXMuX2RlY3J5cHQoc3RhdGUsIGwsIHIsIHN0YXRlLnRtcCwgMCk7XG5cbiAgbCA9IHN0YXRlLnRtcFswXTtcbiAgciA9IHN0YXRlLnRtcFsxXTtcblxuICB1dGlscy53cml0ZVVJbnQzMkJFKG91dCwgbCwgb3V0T2ZmKTtcbiAgdXRpbHMud3JpdGVVSW50MzJCRShvdXQsIHIsIG91dE9mZiArIDQpO1xufTtcblxuREVTLnByb3RvdHlwZS5fcGFkID0gZnVuY3Rpb24gX3BhZChidWZmZXIsIG9mZikge1xuICB2YXIgdmFsdWUgPSBidWZmZXIubGVuZ3RoIC0gb2ZmO1xuICBmb3IgKHZhciBpID0gb2ZmOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKVxuICAgIGJ1ZmZlcltpXSA9IHZhbHVlO1xuXG4gIHJldHVybiB0cnVlO1xufTtcblxuREVTLnByb3RvdHlwZS5fdW5wYWQgPSBmdW5jdGlvbiBfdW5wYWQoYnVmZmVyKSB7XG4gIHZhciBwYWQgPSBidWZmZXJbYnVmZmVyLmxlbmd0aCAtIDFdO1xuICBmb3IgKHZhciBpID0gYnVmZmVyLmxlbmd0aCAtIHBhZDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKylcbiAgICBhc3NlcnQuZXF1YWwoYnVmZmVyW2ldLCBwYWQpO1xuXG4gIHJldHVybiBidWZmZXIuc2xpY2UoMCwgYnVmZmVyLmxlbmd0aCAtIHBhZCk7XG59O1xuXG5ERVMucHJvdG90eXBlLl9lbmNyeXB0ID0gZnVuY3Rpb24gX2VuY3J5cHQoc3RhdGUsIGxTdGFydCwgclN0YXJ0LCBvdXQsIG9mZikge1xuICB2YXIgbCA9IGxTdGFydDtcbiAgdmFyIHIgPSByU3RhcnQ7XG5cbiAgLy8gQXBwbHkgZigpIHgxNiB0aW1lc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlLmtleXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIga2V5TCA9IHN0YXRlLmtleXNbaV07XG4gICAgdmFyIGtleVIgPSBzdGF0ZS5rZXlzW2kgKyAxXTtcblxuICAgIC8vIGYociwgaylcbiAgICB1dGlscy5leHBhbmQociwgc3RhdGUudG1wLCAwKTtcblxuICAgIGtleUwgXj0gc3RhdGUudG1wWzBdO1xuICAgIGtleVIgXj0gc3RhdGUudG1wWzFdO1xuICAgIHZhciBzID0gdXRpbHMuc3Vic3RpdHV0ZShrZXlMLCBrZXlSKTtcbiAgICB2YXIgZiA9IHV0aWxzLnBlcm11dGUocyk7XG5cbiAgICB2YXIgdCA9IHI7XG4gICAgciA9IChsIF4gZikgPj4+IDA7XG4gICAgbCA9IHQ7XG4gIH1cblxuICAvLyBSZXZlcnNlIEluaXRpYWwgUGVybXV0YXRpb25cbiAgdXRpbHMucmlwKHIsIGwsIG91dCwgb2ZmKTtcbn07XG5cbkRFUy5wcm90b3R5cGUuX2RlY3J5cHQgPSBmdW5jdGlvbiBfZGVjcnlwdChzdGF0ZSwgbFN0YXJ0LCByU3RhcnQsIG91dCwgb2ZmKSB7XG4gIHZhciBsID0gclN0YXJ0O1xuICB2YXIgciA9IGxTdGFydDtcblxuICAvLyBBcHBseSBmKCkgeDE2IHRpbWVzXG4gIGZvciAodmFyIGkgPSBzdGF0ZS5rZXlzLmxlbmd0aCAtIDI7IGkgPj0gMDsgaSAtPSAyKSB7XG4gICAgdmFyIGtleUwgPSBzdGF0ZS5rZXlzW2ldO1xuICAgIHZhciBrZXlSID0gc3RhdGUua2V5c1tpICsgMV07XG5cbiAgICAvLyBmKHIsIGspXG4gICAgdXRpbHMuZXhwYW5kKGwsIHN0YXRlLnRtcCwgMCk7XG5cbiAgICBrZXlMIF49IHN0YXRlLnRtcFswXTtcbiAgICBrZXlSIF49IHN0YXRlLnRtcFsxXTtcbiAgICB2YXIgcyA9IHV0aWxzLnN1YnN0aXR1dGUoa2V5TCwga2V5Uik7XG4gICAgdmFyIGYgPSB1dGlscy5wZXJtdXRlKHMpO1xuXG4gICAgdmFyIHQgPSBsO1xuICAgIGwgPSAociBeIGYpID4+PiAwO1xuICAgIHIgPSB0O1xuICB9XG5cbiAgLy8gUmV2ZXJzZSBJbml0aWFsIFBlcm11dGF0aW9uXG4gIHV0aWxzLnJpcChsLCByLCBvdXQsIG9mZik7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxudmFyIGRlcyA9IHJlcXVpcmUoJy4uL2RlcycpO1xudmFyIENpcGhlciA9IGRlcy5DaXBoZXI7XG52YXIgREVTID0gZGVzLkRFUztcblxuZnVuY3Rpb24gRURFU3RhdGUodHlwZSwga2V5KSB7XG4gIGFzc2VydC5lcXVhbChrZXkubGVuZ3RoLCAyNCwgJ0ludmFsaWQga2V5IGxlbmd0aCcpO1xuXG4gIHZhciBrMSA9IGtleS5zbGljZSgwLCA4KTtcbiAgdmFyIGsyID0ga2V5LnNsaWNlKDgsIDE2KTtcbiAgdmFyIGszID0ga2V5LnNsaWNlKDE2LCAyNCk7XG5cbiAgaWYgKHR5cGUgPT09ICdlbmNyeXB0Jykge1xuICAgIHRoaXMuY2lwaGVycyA9IFtcbiAgICAgIERFUy5jcmVhdGUoeyB0eXBlOiAnZW5jcnlwdCcsIGtleTogazEgfSksXG4gICAgICBERVMuY3JlYXRlKHsgdHlwZTogJ2RlY3J5cHQnLCBrZXk6IGsyIH0pLFxuICAgICAgREVTLmNyZWF0ZSh7IHR5cGU6ICdlbmNyeXB0Jywga2V5OiBrMyB9KVxuICAgIF07XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5jaXBoZXJzID0gW1xuICAgICAgREVTLmNyZWF0ZSh7IHR5cGU6ICdkZWNyeXB0Jywga2V5OiBrMyB9KSxcbiAgICAgIERFUy5jcmVhdGUoeyB0eXBlOiAnZW5jcnlwdCcsIGtleTogazIgfSksXG4gICAgICBERVMuY3JlYXRlKHsgdHlwZTogJ2RlY3J5cHQnLCBrZXk6IGsxIH0pXG4gICAgXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBFREUob3B0aW9ucykge1xuICBDaXBoZXIuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICB2YXIgc3RhdGUgPSBuZXcgRURFU3RhdGUodGhpcy50eXBlLCB0aGlzLm9wdGlvbnMua2V5KTtcbiAgdGhpcy5fZWRlU3RhdGUgPSBzdGF0ZTtcbn1cbmluaGVyaXRzKEVERSwgQ2lwaGVyKTtcblxubW9kdWxlLmV4cG9ydHMgPSBFREU7XG5cbkVERS5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUob3B0aW9ucykge1xuICByZXR1cm4gbmV3IEVERShvcHRpb25zKTtcbn07XG5cbkVERS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIF91cGRhdGUoaW5wLCBpbk9mZiwgb3V0LCBvdXRPZmYpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fZWRlU3RhdGU7XG5cbiAgc3RhdGUuY2lwaGVyc1swXS5fdXBkYXRlKGlucCwgaW5PZmYsIG91dCwgb3V0T2ZmKTtcbiAgc3RhdGUuY2lwaGVyc1sxXS5fdXBkYXRlKG91dCwgb3V0T2ZmLCBvdXQsIG91dE9mZik7XG4gIHN0YXRlLmNpcGhlcnNbMl0uX3VwZGF0ZShvdXQsIG91dE9mZiwgb3V0LCBvdXRPZmYpO1xufTtcblxuRURFLnByb3RvdHlwZS5fcGFkID0gREVTLnByb3RvdHlwZS5fcGFkO1xuRURFLnByb3RvdHlwZS5fdW5wYWQgPSBERVMucHJvdG90eXBlLl91bnBhZDtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUoYnl0ZXMsIG9mZikge1xuICB2YXIgcmVzID0gIChieXRlc1swICsgb2ZmXSA8PCAyNCkgfFxuICAgICAgICAgICAgIChieXRlc1sxICsgb2ZmXSA8PCAxNikgfFxuICAgICAgICAgICAgIChieXRlc1syICsgb2ZmXSA8PCA4KSB8XG4gICAgICAgICAgICAgYnl0ZXNbMyArIG9mZl07XG4gIHJldHVybiByZXMgPj4+IDA7XG59O1xuXG5leHBvcnRzLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFKGJ5dGVzLCB2YWx1ZSwgb2ZmKSB7XG4gIGJ5dGVzWzAgKyBvZmZdID0gdmFsdWUgPj4+IDI0O1xuICBieXRlc1sxICsgb2ZmXSA9ICh2YWx1ZSA+Pj4gMTYpICYgMHhmZjtcbiAgYnl0ZXNbMiArIG9mZl0gPSAodmFsdWUgPj4+IDgpICYgMHhmZjtcbiAgYnl0ZXNbMyArIG9mZl0gPSB2YWx1ZSAmIDB4ZmY7XG59O1xuXG5leHBvcnRzLmlwID0gZnVuY3Rpb24gaXAoaW5MLCBpblIsIG91dCwgb2ZmKSB7XG4gIHZhciBvdXRMID0gMDtcbiAgdmFyIG91dFIgPSAwO1xuXG4gIGZvciAodmFyIGkgPSA2OyBpID49IDA7IGkgLT0gMikge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDw9IDI0OyBqICs9IDgpIHtcbiAgICAgIG91dEwgPDw9IDE7XG4gICAgICBvdXRMIHw9IChpblIgPj4+IChqICsgaSkpICYgMTtcbiAgICB9XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPD0gMjQ7IGogKz0gOCkge1xuICAgICAgb3V0TCA8PD0gMTtcbiAgICAgIG91dEwgfD0gKGluTCA+Pj4gKGogKyBpKSkgJiAxO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSA2OyBpID49IDA7IGkgLT0gMikge1xuICAgIGZvciAodmFyIGogPSAxOyBqIDw9IDI1OyBqICs9IDgpIHtcbiAgICAgIG91dFIgPDw9IDE7XG4gICAgICBvdXRSIHw9IChpblIgPj4+IChqICsgaSkpICYgMTtcbiAgICB9XG4gICAgZm9yICh2YXIgaiA9IDE7IGogPD0gMjU7IGogKz0gOCkge1xuICAgICAgb3V0UiA8PD0gMTtcbiAgICAgIG91dFIgfD0gKGluTCA+Pj4gKGogKyBpKSkgJiAxO1xuICAgIH1cbiAgfVxuXG4gIG91dFtvZmYgKyAwXSA9IG91dEwgPj4+IDA7XG4gIG91dFtvZmYgKyAxXSA9IG91dFIgPj4+IDA7XG59O1xuXG5leHBvcnRzLnJpcCA9IGZ1bmN0aW9uIHJpcChpbkwsIGluUiwgb3V0LCBvZmYpIHtcbiAgdmFyIG91dEwgPSAwO1xuICB2YXIgb3V0UiA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMjQ7IGogPj0gMDsgaiAtPSA4KSB7XG4gICAgICBvdXRMIDw8PSAxO1xuICAgICAgb3V0TCB8PSAoaW5SID4+PiAoaiArIGkpKSAmIDE7XG4gICAgICBvdXRMIDw8PSAxO1xuICAgICAgb3V0TCB8PSAoaW5MID4+PiAoaiArIGkpKSAmIDE7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIGkgPSA0OyBpIDwgODsgaSsrKSB7XG4gICAgZm9yICh2YXIgaiA9IDI0OyBqID49IDA7IGogLT0gOCkge1xuICAgICAgb3V0UiA8PD0gMTtcbiAgICAgIG91dFIgfD0gKGluUiA+Pj4gKGogKyBpKSkgJiAxO1xuICAgICAgb3V0UiA8PD0gMTtcbiAgICAgIG91dFIgfD0gKGluTCA+Pj4gKGogKyBpKSkgJiAxO1xuICAgIH1cbiAgfVxuXG4gIG91dFtvZmYgKyAwXSA9IG91dEwgPj4+IDA7XG4gIG91dFtvZmYgKyAxXSA9IG91dFIgPj4+IDA7XG59O1xuXG5leHBvcnRzLnBjMSA9IGZ1bmN0aW9uIHBjMShpbkwsIGluUiwgb3V0LCBvZmYpIHtcbiAgdmFyIG91dEwgPSAwO1xuICB2YXIgb3V0UiA9IDA7XG5cbiAgLy8gNywgMTUsIDIzLCAzMSwgMzksIDQ3LCA1NSwgNjNcbiAgLy8gNiwgMTQsIDIyLCAzMCwgMzksIDQ3LCA1NSwgNjNcbiAgLy8gNSwgMTMsIDIxLCAyOSwgMzksIDQ3LCA1NSwgNjNcbiAgLy8gNCwgMTIsIDIwLCAyOFxuICBmb3IgKHZhciBpID0gNzsgaSA+PSA1OyBpLS0pIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8PSAyNDsgaiArPSA4KSB7XG4gICAgICBvdXRMIDw8PSAxO1xuICAgICAgb3V0TCB8PSAoaW5SID4+IChqICsgaSkpICYgMTtcbiAgICB9XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPD0gMjQ7IGogKz0gOCkge1xuICAgICAgb3V0TCA8PD0gMTtcbiAgICAgIG91dEwgfD0gKGluTCA+PiAoaiArIGkpKSAmIDE7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIGogPSAwOyBqIDw9IDI0OyBqICs9IDgpIHtcbiAgICBvdXRMIDw8PSAxO1xuICAgIG91dEwgfD0gKGluUiA+PiAoaiArIGkpKSAmIDE7XG4gIH1cblxuICAvLyAxLCA5LCAxNywgMjUsIDMzLCA0MSwgNDksIDU3XG4gIC8vIDIsIDEwLCAxOCwgMjYsIDM0LCA0MiwgNTAsIDU4XG4gIC8vIDMsIDExLCAxOSwgMjcsIDM1LCA0MywgNTEsIDU5XG4gIC8vIDM2LCA0NCwgNTIsIDYwXG4gIGZvciAodmFyIGkgPSAxOyBpIDw9IDM7IGkrKykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDw9IDI0OyBqICs9IDgpIHtcbiAgICAgIG91dFIgPDw9IDE7XG4gICAgICBvdXRSIHw9IChpblIgPj4gKGogKyBpKSkgJiAxO1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8PSAyNDsgaiArPSA4KSB7XG4gICAgICBvdXRSIDw8PSAxO1xuICAgICAgb3V0UiB8PSAoaW5MID4+IChqICsgaSkpICYgMTtcbiAgICB9XG4gIH1cbiAgZm9yICh2YXIgaiA9IDA7IGogPD0gMjQ7IGogKz0gOCkge1xuICAgIG91dFIgPDw9IDE7XG4gICAgb3V0UiB8PSAoaW5MID4+IChqICsgaSkpICYgMTtcbiAgfVxuXG4gIG91dFtvZmYgKyAwXSA9IG91dEwgPj4+IDA7XG4gIG91dFtvZmYgKyAxXSA9IG91dFIgPj4+IDA7XG59O1xuXG5leHBvcnRzLnIyOHNobCA9IGZ1bmN0aW9uIHIyOHNobChudW0sIHNoaWZ0KSB7XG4gIHJldHVybiAoKG51bSA8PCBzaGlmdCkgJiAweGZmZmZmZmYpIHwgKG51bSA+Pj4gKDI4IC0gc2hpZnQpKTtcbn07XG5cbnZhciBwYzJ0YWJsZSA9IFtcbiAgLy8gaW5MID0+IG91dExcbiAgMTQsIDExLCAxNywgNCwgMjcsIDIzLCAyNSwgMCxcbiAgMTMsIDIyLCA3LCAxOCwgNSwgOSwgMTYsIDI0LFxuICAyLCAyMCwgMTIsIDIxLCAxLCA4LCAxNSwgMjYsXG5cbiAgLy8gaW5SID0+IG91dFJcbiAgMTUsIDQsIDI1LCAxOSwgOSwgMSwgMjYsIDE2LFxuICA1LCAxMSwgMjMsIDgsIDEyLCA3LCAxNywgMCxcbiAgMjIsIDMsIDEwLCAxNCwgNiwgMjAsIDI3LCAyNFxuXTtcblxuZXhwb3J0cy5wYzIgPSBmdW5jdGlvbiBwYzIoaW5MLCBpblIsIG91dCwgb2ZmKSB7XG4gIHZhciBvdXRMID0gMDtcbiAgdmFyIG91dFIgPSAwO1xuXG4gIHZhciBsZW4gPSBwYzJ0YWJsZS5sZW5ndGggPj4+IDE7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBvdXRMIDw8PSAxO1xuICAgIG91dEwgfD0gKGluTCA+Pj4gcGMydGFibGVbaV0pICYgMHgxO1xuICB9XG4gIGZvciAodmFyIGkgPSBsZW47IGkgPCBwYzJ0YWJsZS5sZW5ndGg7IGkrKykge1xuICAgIG91dFIgPDw9IDE7XG4gICAgb3V0UiB8PSAoaW5SID4+PiBwYzJ0YWJsZVtpXSkgJiAweDE7XG4gIH1cblxuICBvdXRbb2ZmICsgMF0gPSBvdXRMID4+PiAwO1xuICBvdXRbb2ZmICsgMV0gPSBvdXRSID4+PiAwO1xufTtcblxuZXhwb3J0cy5leHBhbmQgPSBmdW5jdGlvbiBleHBhbmQociwgb3V0LCBvZmYpIHtcbiAgdmFyIG91dEwgPSAwO1xuICB2YXIgb3V0UiA9IDA7XG5cbiAgb3V0TCA9ICgociAmIDEpIDw8IDUpIHwgKHIgPj4+IDI3KTtcbiAgZm9yICh2YXIgaSA9IDIzOyBpID49IDE1OyBpIC09IDQpIHtcbiAgICBvdXRMIDw8PSA2O1xuICAgIG91dEwgfD0gKHIgPj4+IGkpICYgMHgzZjtcbiAgfVxuICBmb3IgKHZhciBpID0gMTE7IGkgPj0gMzsgaSAtPSA0KSB7XG4gICAgb3V0UiB8PSAociA+Pj4gaSkgJiAweDNmO1xuICAgIG91dFIgPDw9IDY7XG4gIH1cbiAgb3V0UiB8PSAoKHIgJiAweDFmKSA8PCAxKSB8IChyID4+PiAzMSk7XG5cbiAgb3V0W29mZiArIDBdID0gb3V0TCA+Pj4gMDtcbiAgb3V0W29mZiArIDFdID0gb3V0UiA+Pj4gMDtcbn07XG5cbnZhciBzVGFibGUgPSBbXG4gIDE0LCAwLCA0LCAxNSwgMTMsIDcsIDEsIDQsIDIsIDE0LCAxNSwgMiwgMTEsIDEzLCA4LCAxLFxuICAzLCAxMCwgMTAsIDYsIDYsIDEyLCAxMiwgMTEsIDUsIDksIDksIDUsIDAsIDMsIDcsIDgsXG4gIDQsIDE1LCAxLCAxMiwgMTQsIDgsIDgsIDIsIDEzLCA0LCA2LCA5LCAyLCAxLCAxMSwgNyxcbiAgMTUsIDUsIDEyLCAxMSwgOSwgMywgNywgMTQsIDMsIDEwLCAxMCwgMCwgNSwgNiwgMCwgMTMsXG5cbiAgMTUsIDMsIDEsIDEzLCA4LCA0LCAxNCwgNywgNiwgMTUsIDExLCAyLCAzLCA4LCA0LCAxNCxcbiAgOSwgMTIsIDcsIDAsIDIsIDEsIDEzLCAxMCwgMTIsIDYsIDAsIDksIDUsIDExLCAxMCwgNSxcbiAgMCwgMTMsIDE0LCA4LCA3LCAxMCwgMTEsIDEsIDEwLCAzLCA0LCAxNSwgMTMsIDQsIDEsIDIsXG4gIDUsIDExLCA4LCA2LCAxMiwgNywgNiwgMTIsIDksIDAsIDMsIDUsIDIsIDE0LCAxNSwgOSxcblxuICAxMCwgMTMsIDAsIDcsIDksIDAsIDE0LCA5LCA2LCAzLCAzLCA0LCAxNSwgNiwgNSwgMTAsXG4gIDEsIDIsIDEzLCA4LCAxMiwgNSwgNywgMTQsIDExLCAxMiwgNCwgMTEsIDIsIDE1LCA4LCAxLFxuICAxMywgMSwgNiwgMTAsIDQsIDEzLCA5LCAwLCA4LCA2LCAxNSwgOSwgMywgOCwgMCwgNyxcbiAgMTEsIDQsIDEsIDE1LCAyLCAxNCwgMTIsIDMsIDUsIDExLCAxMCwgNSwgMTQsIDIsIDcsIDEyLFxuXG4gIDcsIDEzLCAxMywgOCwgMTQsIDExLCAzLCA1LCAwLCA2LCA2LCAxNSwgOSwgMCwgMTAsIDMsXG4gIDEsIDQsIDIsIDcsIDgsIDIsIDUsIDEyLCAxMSwgMSwgMTIsIDEwLCA0LCAxNCwgMTUsIDksXG4gIDEwLCAzLCA2LCAxNSwgOSwgMCwgMCwgNiwgMTIsIDEwLCAxMSwgMSwgNywgMTMsIDEzLCA4LFxuICAxNSwgOSwgMSwgNCwgMywgNSwgMTQsIDExLCA1LCAxMiwgMiwgNywgOCwgMiwgNCwgMTQsXG5cbiAgMiwgMTQsIDEyLCAxMSwgNCwgMiwgMSwgMTIsIDcsIDQsIDEwLCA3LCAxMSwgMTMsIDYsIDEsXG4gIDgsIDUsIDUsIDAsIDMsIDE1LCAxNSwgMTAsIDEzLCAzLCAwLCA5LCAxNCwgOCwgOSwgNixcbiAgNCwgMTEsIDIsIDgsIDEsIDEyLCAxMSwgNywgMTAsIDEsIDEzLCAxNCwgNywgMiwgOCwgMTMsXG4gIDE1LCA2LCA5LCAxNSwgMTIsIDAsIDUsIDksIDYsIDEwLCAzLCA0LCAwLCA1LCAxNCwgMyxcblxuICAxMiwgMTAsIDEsIDE1LCAxMCwgNCwgMTUsIDIsIDksIDcsIDIsIDEyLCA2LCA5LCA4LCA1LFxuICAwLCA2LCAxMywgMSwgMywgMTMsIDQsIDE0LCAxNCwgMCwgNywgMTEsIDUsIDMsIDExLCA4LFxuICA5LCA0LCAxNCwgMywgMTUsIDIsIDUsIDEyLCAyLCA5LCA4LCA1LCAxMiwgMTUsIDMsIDEwLFxuICA3LCAxMSwgMCwgMTQsIDQsIDEsIDEwLCA3LCAxLCA2LCAxMywgMCwgMTEsIDgsIDYsIDEzLFxuXG4gIDQsIDEzLCAxMSwgMCwgMiwgMTEsIDE0LCA3LCAxNSwgNCwgMCwgOSwgOCwgMSwgMTMsIDEwLFxuICAzLCAxNCwgMTIsIDMsIDksIDUsIDcsIDEyLCA1LCAyLCAxMCwgMTUsIDYsIDgsIDEsIDYsXG4gIDEsIDYsIDQsIDExLCAxMSwgMTMsIDEzLCA4LCAxMiwgMSwgMywgNCwgNywgMTAsIDE0LCA3LFxuICAxMCwgOSwgMTUsIDUsIDYsIDAsIDgsIDE1LCAwLCAxNCwgNSwgMiwgOSwgMywgMiwgMTIsXG5cbiAgMTMsIDEsIDIsIDE1LCA4LCAxMywgNCwgOCwgNiwgMTAsIDE1LCAzLCAxMSwgNywgMSwgNCxcbiAgMTAsIDEyLCA5LCA1LCAzLCA2LCAxNCwgMTEsIDUsIDAsIDAsIDE0LCAxMiwgOSwgNywgMixcbiAgNywgMiwgMTEsIDEsIDQsIDE0LCAxLCA3LCA5LCA0LCAxMiwgMTAsIDE0LCA4LCAyLCAxMyxcbiAgMCwgMTUsIDYsIDEyLCAxMCwgOSwgMTMsIDAsIDE1LCAzLCAzLCA1LCA1LCA2LCA4LCAxMVxuXTtcblxuZXhwb3J0cy5zdWJzdGl0dXRlID0gZnVuY3Rpb24gc3Vic3RpdHV0ZShpbkwsIGluUikge1xuICB2YXIgb3V0ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICB2YXIgYiA9IChpbkwgPj4+ICgxOCAtIGkgKiA2KSkgJiAweDNmO1xuICAgIHZhciBzYiA9IHNUYWJsZVtpICogMHg0MCArIGJdO1xuXG4gICAgb3V0IDw8PSA0O1xuICAgIG91dCB8PSBzYjtcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgIHZhciBiID0gKGluUiA+Pj4gKDE4IC0gaSAqIDYpKSAmIDB4M2Y7XG4gICAgdmFyIHNiID0gc1RhYmxlWzQgKiAweDQwICsgaSAqIDB4NDAgKyBiXTtcblxuICAgIG91dCA8PD0gNDtcbiAgICBvdXQgfD0gc2I7XG4gIH1cbiAgcmV0dXJuIG91dCA+Pj4gMDtcbn07XG5cbnZhciBwZXJtdXRlVGFibGUgPSBbXG4gIDE2LCAyNSwgMTIsIDExLCAzLCAyMCwgNCwgMTUsIDMxLCAxNywgOSwgNiwgMjcsIDE0LCAxLCAyMixcbiAgMzAsIDI0LCA4LCAxOCwgMCwgNSwgMjksIDIzLCAxMywgMTksIDIsIDI2LCAxMCwgMjEsIDI4LCA3XG5dO1xuXG5leHBvcnRzLnBlcm11dGUgPSBmdW5jdGlvbiBwZXJtdXRlKG51bSkge1xuICB2YXIgb3V0ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwZXJtdXRlVGFibGUubGVuZ3RoOyBpKyspIHtcbiAgICBvdXQgPDw9IDE7XG4gICAgb3V0IHw9IChudW0gPj4+IHBlcm11dGVUYWJsZVtpXSkgJiAweDE7XG4gIH1cbiAgcmV0dXJuIG91dCA+Pj4gMDtcbn07XG5cbmV4cG9ydHMucGFkU3BsaXQgPSBmdW5jdGlvbiBwYWRTcGxpdChudW0sIHNpemUsIGdyb3VwKSB7XG4gIHZhciBzdHIgPSBudW0udG9TdHJpbmcoMik7XG4gIHdoaWxlIChzdHIubGVuZ3RoIDwgc2l6ZSlcbiAgICBzdHIgPSAnMCcgKyBzdHI7XG5cbiAgdmFyIG91dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkgKz0gZ3JvdXApXG4gICAgb3V0LnB1c2goc3RyLnNsaWNlKGksIGkgKyBncm91cCkpO1xuICByZXR1cm4gb3V0LmpvaW4oJyAnKTtcbn07XG4iLCJ2YXIgZ2VuZXJhdGVQcmltZSA9IHJlcXVpcmUoJy4vbGliL2dlbmVyYXRlUHJpbWUnKVxudmFyIHByaW1lcyA9IHJlcXVpcmUoJy4vbGliL3ByaW1lcy5qc29uJylcblxudmFyIERIID0gcmVxdWlyZSgnLi9saWIvZGgnKVxuXG5mdW5jdGlvbiBnZXREaWZmaWVIZWxsbWFuIChtb2QpIHtcbiAgdmFyIHByaW1lID0gbmV3IEJ1ZmZlcihwcmltZXNbbW9kXS5wcmltZSwgJ2hleCcpXG4gIHZhciBnZW4gPSBuZXcgQnVmZmVyKHByaW1lc1ttb2RdLmdlbiwgJ2hleCcpXG5cbiAgcmV0dXJuIG5ldyBESChwcmltZSwgZ2VuKVxufVxuXG52YXIgRU5DT0RJTkdTID0ge1xuICAnYmluYXJ5JzogdHJ1ZSwgJ2hleCc6IHRydWUsICdiYXNlNjQnOiB0cnVlXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURpZmZpZUhlbGxtYW4gKHByaW1lLCBlbmMsIGdlbmVyYXRvciwgZ2VuYykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGVuYykgfHwgRU5DT0RJTkdTW2VuY10gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjcmVhdGVEaWZmaWVIZWxsbWFuKHByaW1lLCAnYmluYXJ5JywgZW5jLCBnZW5lcmF0b3IpXG4gIH1cblxuICBlbmMgPSBlbmMgfHwgJ2JpbmFyeSdcbiAgZ2VuYyA9IGdlbmMgfHwgJ2JpbmFyeSdcbiAgZ2VuZXJhdG9yID0gZ2VuZXJhdG9yIHx8IG5ldyBCdWZmZXIoWzJdKVxuXG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGdlbmVyYXRvcikpIHtcbiAgICBnZW5lcmF0b3IgPSBuZXcgQnVmZmVyKGdlbmVyYXRvciwgZ2VuYylcbiAgfVxuXG4gIGlmICh0eXBlb2YgcHJpbWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIG5ldyBESChnZW5lcmF0ZVByaW1lKHByaW1lLCBnZW5lcmF0b3IpLCBnZW5lcmF0b3IsIHRydWUpXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihwcmltZSkpIHtcbiAgICBwcmltZSA9IG5ldyBCdWZmZXIocHJpbWUsIGVuYylcbiAgfVxuXG4gIHJldHVybiBuZXcgREgocHJpbWUsIGdlbmVyYXRvciwgdHJ1ZSlcbn1cblxuZXhwb3J0cy5EaWZmaWVIZWxsbWFuR3JvdXAgPSBleHBvcnRzLmNyZWF0ZURpZmZpZUhlbGxtYW5Hcm91cCA9IGV4cG9ydHMuZ2V0RGlmZmllSGVsbG1hbiA9IGdldERpZmZpZUhlbGxtYW5cbmV4cG9ydHMuY3JlYXRlRGlmZmllSGVsbG1hbiA9IGV4cG9ydHMuRGlmZmllSGVsbG1hbiA9IGNyZWF0ZURpZmZpZUhlbGxtYW5cbiIsInZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgTWlsbGVyUmFiaW4gPSByZXF1aXJlKCdtaWxsZXItcmFiaW4nKTtcbnZhciBtaWxsZXJSYWJpbiA9IG5ldyBNaWxsZXJSYWJpbigpO1xudmFyIFRXRU5UWUZPVVIgPSBuZXcgQk4oMjQpO1xudmFyIEVMRVZFTiA9IG5ldyBCTigxMSk7XG52YXIgVEVOID0gbmV3IEJOKDEwKTtcbnZhciBUSFJFRSA9IG5ldyBCTigzKTtcbnZhciBTRVZFTiA9IG5ldyBCTig3KTtcbnZhciBwcmltZXMgPSByZXF1aXJlKCcuL2dlbmVyYXRlUHJpbWUnKTtcbnZhciByYW5kb21CeXRlcyA9IHJlcXVpcmUoJ3JhbmRvbWJ5dGVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IERIO1xuXG5mdW5jdGlvbiBzZXRQdWJsaWNLZXkocHViLCBlbmMpIHtcbiAgZW5jID0gZW5jIHx8ICd1dGY4JztcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIocHViKSkge1xuICAgIHB1YiA9IG5ldyBCdWZmZXIocHViLCBlbmMpO1xuICB9XG4gIHRoaXMuX3B1YiA9IG5ldyBCTihwdWIpO1xuICByZXR1cm4gdGhpcztcbn1cblxuZnVuY3Rpb24gc2V0UHJpdmF0ZUtleShwcml2LCBlbmMpIHtcbiAgZW5jID0gZW5jIHx8ICd1dGY4JztcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIocHJpdikpIHtcbiAgICBwcml2ID0gbmV3IEJ1ZmZlcihwcml2LCBlbmMpO1xuICB9XG4gIHRoaXMuX3ByaXYgPSBuZXcgQk4ocHJpdik7XG4gIHJldHVybiB0aGlzO1xufVxuXG52YXIgcHJpbWVDYWNoZSA9IHt9O1xuZnVuY3Rpb24gY2hlY2tQcmltZShwcmltZSwgZ2VuZXJhdG9yKSB7XG4gIHZhciBnZW4gPSBnZW5lcmF0b3IudG9TdHJpbmcoJ2hleCcpO1xuICB2YXIgaGV4ID0gW2dlbiwgcHJpbWUudG9TdHJpbmcoMTYpXS5qb2luKCdfJyk7XG4gIGlmIChoZXggaW4gcHJpbWVDYWNoZSkge1xuICAgIHJldHVybiBwcmltZUNhY2hlW2hleF07XG4gIH1cbiAgdmFyIGVycm9yID0gMDtcblxuICBpZiAocHJpbWUuaXNFdmVuKCkgfHxcbiAgICAhcHJpbWVzLnNpbXBsZVNpZXZlIHx8XG4gICAgIXByaW1lcy5mZXJtYXRUZXN0KHByaW1lKSB8fFxuICAgICFtaWxsZXJSYWJpbi50ZXN0KHByaW1lKSkge1xuICAgIC8vbm90IGEgcHJpbWUgc28gKzFcbiAgICBlcnJvciArPSAxO1xuXG4gICAgaWYgKGdlbiA9PT0gJzAyJyB8fCBnZW4gPT09ICcwNScpIHtcbiAgICAgIC8vIHdlJ2QgYmUgYWJsZSB0byBjaGVjayB0aGUgZ2VuZXJhdG9yXG4gICAgICAvLyBpdCB3b3VsZCBmYWlsIHNvICs4XG4gICAgICBlcnJvciArPSA4O1xuICAgIH0gZWxzZSB7XG4gICAgICAvL3dlIHdvdWxkbid0IGJlIGFibGUgdG8gdGVzdCB0aGUgZ2VuZXJhdG9yXG4gICAgICAvLyBzbyArNFxuICAgICAgZXJyb3IgKz0gNDtcbiAgICB9XG4gICAgcHJpbWVDYWNoZVtoZXhdID0gZXJyb3I7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG4gIGlmICghbWlsbGVyUmFiaW4udGVzdChwcmltZS5zaHJuKDEpKSkge1xuICAgIC8vbm90IGEgc2FmZSBwcmltZVxuICAgIGVycm9yICs9IDI7XG4gIH1cbiAgdmFyIHJlbTtcbiAgc3dpdGNoIChnZW4pIHtcbiAgICBjYXNlICcwMic6XG4gICAgICBpZiAocHJpbWUubW9kKFRXRU5UWUZPVVIpLmNtcChFTEVWRU4pKSB7XG4gICAgICAgIC8vIHVuc3VpZGFibGUgZ2VuZXJhdG9yXG4gICAgICAgIGVycm9yICs9IDg7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICcwNSc6XG4gICAgICByZW0gPSBwcmltZS5tb2QoVEVOKTtcbiAgICAgIGlmIChyZW0uY21wKFRIUkVFKSAmJiByZW0uY21wKFNFVkVOKSkge1xuICAgICAgICAvLyBwcmltZSBtb2QgMTAgbmVlZHMgdG8gZXF1YWwgMyBvciA3XG4gICAgICAgIGVycm9yICs9IDg7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgZXJyb3IgKz0gNDtcbiAgfVxuICBwcmltZUNhY2hlW2hleF0gPSBlcnJvcjtcbiAgcmV0dXJuIGVycm9yO1xufVxuXG5mdW5jdGlvbiBESChwcmltZSwgZ2VuZXJhdG9yLCBtYWxsZWFibGUpIHtcbiAgdGhpcy5zZXRHZW5lcmF0b3IoZ2VuZXJhdG9yKTtcbiAgdGhpcy5fX3ByaW1lID0gbmV3IEJOKHByaW1lKTtcbiAgdGhpcy5fcHJpbWUgPSBCTi5tb250KHRoaXMuX19wcmltZSk7XG4gIHRoaXMuX3ByaW1lTGVuID0gcHJpbWUubGVuZ3RoO1xuICB0aGlzLl9wdWIgPSB1bmRlZmluZWQ7XG4gIHRoaXMuX3ByaXYgPSB1bmRlZmluZWQ7XG4gIHRoaXMuX3ByaW1lQ29kZSA9IHVuZGVmaW5lZDtcbiAgaWYgKG1hbGxlYWJsZSkge1xuICAgIHRoaXMuc2V0UHVibGljS2V5ID0gc2V0UHVibGljS2V5O1xuICAgIHRoaXMuc2V0UHJpdmF0ZUtleSA9IHNldFByaXZhdGVLZXk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fcHJpbWVDb2RlID0gODtcbiAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KERILnByb3RvdHlwZSwgJ3ZlcmlmeUVycm9yJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3ByaW1lQ29kZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuX3ByaW1lQ29kZSA9IGNoZWNrUHJpbWUodGhpcy5fX3ByaW1lLCB0aGlzLl9fZ2VuKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3ByaW1lQ29kZTtcbiAgfVxufSk7XG5ESC5wcm90b3R5cGUuZ2VuZXJhdGVLZXlzID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuX3ByaXYpIHtcbiAgICB0aGlzLl9wcml2ID0gbmV3IEJOKHJhbmRvbUJ5dGVzKHRoaXMuX3ByaW1lTGVuKSk7XG4gIH1cbiAgdGhpcy5fcHViID0gdGhpcy5fZ2VuLnRvUmVkKHRoaXMuX3ByaW1lKS5yZWRQb3codGhpcy5fcHJpdikuZnJvbVJlZCgpO1xuICByZXR1cm4gdGhpcy5nZXRQdWJsaWNLZXkoKTtcbn07XG5cbkRILnByb3RvdHlwZS5jb21wdXRlU2VjcmV0ID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gIG90aGVyID0gbmV3IEJOKG90aGVyKTtcbiAgb3RoZXIgPSBvdGhlci50b1JlZCh0aGlzLl9wcmltZSk7XG4gIHZhciBzZWNyZXQgPSBvdGhlci5yZWRQb3codGhpcy5fcHJpdikuZnJvbVJlZCgpO1xuICB2YXIgb3V0ID0gbmV3IEJ1ZmZlcihzZWNyZXQudG9BcnJheSgpKTtcbiAgdmFyIHByaW1lID0gdGhpcy5nZXRQcmltZSgpO1xuICBpZiAob3V0Lmxlbmd0aCA8IHByaW1lLmxlbmd0aCkge1xuICAgIHZhciBmcm9udCA9IG5ldyBCdWZmZXIocHJpbWUubGVuZ3RoIC0gb3V0Lmxlbmd0aCk7XG4gICAgZnJvbnQuZmlsbCgwKTtcbiAgICBvdXQgPSBCdWZmZXIuY29uY2F0KFtmcm9udCwgb3V0XSk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn07XG5cbkRILnByb3RvdHlwZS5nZXRQdWJsaWNLZXkgPSBmdW5jdGlvbiBnZXRQdWJsaWNLZXkoZW5jKSB7XG4gIHJldHVybiBmb3JtYXRSZXR1cm5WYWx1ZSh0aGlzLl9wdWIsIGVuYyk7XG59O1xuXG5ESC5wcm90b3R5cGUuZ2V0UHJpdmF0ZUtleSA9IGZ1bmN0aW9uIGdldFByaXZhdGVLZXkoZW5jKSB7XG4gIHJldHVybiBmb3JtYXRSZXR1cm5WYWx1ZSh0aGlzLl9wcml2LCBlbmMpO1xufTtcblxuREgucHJvdG90eXBlLmdldFByaW1lID0gZnVuY3Rpb24gKGVuYykge1xuICByZXR1cm4gZm9ybWF0UmV0dXJuVmFsdWUodGhpcy5fX3ByaW1lLCBlbmMpO1xufTtcblxuREgucHJvdG90eXBlLmdldEdlbmVyYXRvciA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgcmV0dXJuIGZvcm1hdFJldHVyblZhbHVlKHRoaXMuX2dlbiwgZW5jKTtcbn07XG5cbkRILnByb3RvdHlwZS5zZXRHZW5lcmF0b3IgPSBmdW5jdGlvbiAoZ2VuLCBlbmMpIHtcbiAgZW5jID0gZW5jIHx8ICd1dGY4JztcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoZ2VuKSkge1xuICAgIGdlbiA9IG5ldyBCdWZmZXIoZ2VuLCBlbmMpO1xuICB9XG4gIHRoaXMuX19nZW4gPSBnZW47XG4gIHRoaXMuX2dlbiA9IG5ldyBCTihnZW4pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIGZvcm1hdFJldHVyblZhbHVlKGJuLCBlbmMpIHtcbiAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoYm4udG9BcnJheSgpKTtcbiAgaWYgKCFlbmMpIHtcbiAgICByZXR1cm4gYnVmO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBidWYudG9TdHJpbmcoZW5jKTtcbiAgfVxufVxuIiwidmFyIHJhbmRvbUJ5dGVzID0gcmVxdWlyZSgncmFuZG9tYnl0ZXMnKTtcbm1vZHVsZS5leHBvcnRzID0gZmluZFByaW1lO1xuZmluZFByaW1lLnNpbXBsZVNpZXZlID0gc2ltcGxlU2lldmU7XG5maW5kUHJpbWUuZmVybWF0VGVzdCA9IGZlcm1hdFRlc3Q7XG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIFRXRU5UWUZPVVIgPSBuZXcgQk4oMjQpO1xudmFyIE1pbGxlclJhYmluID0gcmVxdWlyZSgnbWlsbGVyLXJhYmluJyk7XG52YXIgbWlsbGVyUmFiaW4gPSBuZXcgTWlsbGVyUmFiaW4oKTtcbnZhciBPTkUgPSBuZXcgQk4oMSk7XG52YXIgVFdPID0gbmV3IEJOKDIpO1xudmFyIEZJVkUgPSBuZXcgQk4oNSk7XG52YXIgU0lYVEVFTiA9IG5ldyBCTigxNik7XG52YXIgRUlHSFQgPSBuZXcgQk4oOCk7XG52YXIgVEVOID0gbmV3IEJOKDEwKTtcbnZhciBUSFJFRSA9IG5ldyBCTigzKTtcbnZhciBTRVZFTiA9IG5ldyBCTig3KTtcbnZhciBFTEVWRU4gPSBuZXcgQk4oMTEpO1xudmFyIEZPVVIgPSBuZXcgQk4oNCk7XG52YXIgVFdFTFZFID0gbmV3IEJOKDEyKTtcbnZhciBwcmltZXMgPSBudWxsO1xuXG5mdW5jdGlvbiBfZ2V0UHJpbWVzKCkge1xuICBpZiAocHJpbWVzICE9PSBudWxsKVxuICAgIHJldHVybiBwcmltZXM7XG5cbiAgdmFyIGxpbWl0ID0gMHgxMDAwMDA7XG4gIHZhciByZXMgPSBbXTtcbiAgcmVzWzBdID0gMjtcbiAgZm9yICh2YXIgaSA9IDEsIGsgPSAzOyBrIDwgbGltaXQ7IGsgKz0gMikge1xuICAgIHZhciBzcXJ0ID0gTWF0aC5jZWlsKE1hdGguc3FydChrKSk7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBpICYmIHJlc1tqXSA8PSBzcXJ0OyBqKyspXG4gICAgICBpZiAoayAlIHJlc1tqXSA9PT0gMClcbiAgICAgICAgYnJlYWs7XG5cbiAgICBpZiAoaSAhPT0gaiAmJiByZXNbal0gPD0gc3FydClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgcmVzW2krK10gPSBrO1xuICB9XG4gIHByaW1lcyA9IHJlcztcbiAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gc2ltcGxlU2lldmUocCkge1xuICB2YXIgcHJpbWVzID0gX2dldFByaW1lcygpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJpbWVzLmxlbmd0aDsgaSsrKVxuICAgIGlmIChwLm1vZG4ocHJpbWVzW2ldKSA9PT0gMCkge1xuICAgICAgaWYgKHAuY21wbihwcmltZXNbaV0pID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZmVybWF0VGVzdChwKSB7XG4gIHZhciByZWQgPSBCTi5tb250KHApO1xuICByZXR1cm4gVFdPLnRvUmVkKHJlZCkucmVkUG93KHAuc3VibigxKSkuZnJvbVJlZCgpLmNtcG4oMSkgPT09IDA7XG59XG5cbmZ1bmN0aW9uIGZpbmRQcmltZShiaXRzLCBnZW4pIHtcbiAgaWYgKGJpdHMgPCAxNikge1xuICAgIC8vIHRoaXMgaXMgd2hhdCBvcGVuc3NsIGRvZXNcbiAgICBpZiAoZ2VuID09PSAyIHx8IGdlbiA9PT0gNSkge1xuICAgICAgcmV0dXJuIG5ldyBCTihbMHg4YywgMHg3Yl0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IEJOKFsweDhjLCAweDI3XSk7XG4gICAgfVxuICB9XG4gIGdlbiA9IG5ldyBCTihnZW4pO1xuXG4gIHZhciBudW0sIG4yO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgbnVtID0gbmV3IEJOKHJhbmRvbUJ5dGVzKE1hdGguY2VpbChiaXRzIC8gOCkpKTtcbiAgICB3aGlsZSAobnVtLmJpdExlbmd0aCgpID4gYml0cykge1xuICAgICAgbnVtLmlzaHJuKDEpO1xuICAgIH1cbiAgICBpZiAobnVtLmlzRXZlbigpKSB7XG4gICAgICBudW0uaWFkZChPTkUpO1xuICAgIH1cbiAgICBpZiAoIW51bS50ZXN0bigxKSkge1xuICAgICAgbnVtLmlhZGQoVFdPKTtcbiAgICB9XG4gICAgaWYgKCFnZW4uY21wKFRXTykpIHtcbiAgICAgIHdoaWxlIChudW0ubW9kKFRXRU5UWUZPVVIpLmNtcChFTEVWRU4pKSB7XG4gICAgICAgIG51bS5pYWRkKEZPVVIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWdlbi5jbXAoRklWRSkpIHtcbiAgICAgIHdoaWxlIChudW0ubW9kKFRFTikuY21wKFRIUkVFKSkge1xuICAgICAgICBudW0uaWFkZChGT1VSKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbjIgPSBudW0uc2hybigxKTtcbiAgICBpZiAoc2ltcGxlU2lldmUobjIpICYmIHNpbXBsZVNpZXZlKG51bSkgJiZcbiAgICAgIGZlcm1hdFRlc3QobjIpICYmIGZlcm1hdFRlc3QobnVtKSAmJlxuICAgICAgbWlsbGVyUmFiaW4udGVzdChuMikgJiYgbWlsbGVyUmFiaW4udGVzdChudW0pKSB7XG4gICAgICByZXR1cm4gbnVtO1xuICAgIH1cbiAgfVxuXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBlbGxpcHRpYyA9IGV4cG9ydHM7XG5cbmVsbGlwdGljLnZlcnNpb24gPSByZXF1aXJlKCcuLi9wYWNrYWdlLmpzb24nKS52ZXJzaW9uO1xuZWxsaXB0aWMudXRpbHMgPSByZXF1aXJlKCcuL2VsbGlwdGljL3V0aWxzJyk7XG5lbGxpcHRpYy5yYW5kID0gcmVxdWlyZSgnYnJvcmFuZCcpO1xuZWxsaXB0aWMuY3VydmUgPSByZXF1aXJlKCcuL2VsbGlwdGljL2N1cnZlJyk7XG5lbGxpcHRpYy5jdXJ2ZXMgPSByZXF1aXJlKCcuL2VsbGlwdGljL2N1cnZlcycpO1xuXG4vLyBQcm90b2NvbHNcbmVsbGlwdGljLmVjID0gcmVxdWlyZSgnLi9lbGxpcHRpYy9lYycpO1xuZWxsaXB0aWMuZWRkc2EgPSByZXF1aXJlKCcuL2VsbGlwdGljL2VkZHNhJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgZWxsaXB0aWMgPSByZXF1aXJlKCcuLi8uLi9lbGxpcHRpYycpO1xudmFyIHV0aWxzID0gZWxsaXB0aWMudXRpbHM7XG52YXIgZ2V0TkFGID0gdXRpbHMuZ2V0TkFGO1xudmFyIGdldEpTRiA9IHV0aWxzLmdldEpTRjtcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIEJhc2VDdXJ2ZSh0eXBlLCBjb25mKSB7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMucCA9IG5ldyBCTihjb25mLnAsIDE2KTtcblxuICAvLyBVc2UgTW9udGdvbWVyeSwgd2hlbiB0aGVyZSBpcyBubyBmYXN0IHJlZHVjdGlvbiBmb3IgdGhlIHByaW1lXG4gIHRoaXMucmVkID0gY29uZi5wcmltZSA/IEJOLnJlZChjb25mLnByaW1lKSA6IEJOLm1vbnQodGhpcy5wKTtcblxuICAvLyBVc2VmdWwgZm9yIG1hbnkgY3VydmVzXG4gIHRoaXMuemVybyA9IG5ldyBCTigwKS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMub25lID0gbmV3IEJOKDEpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy50d28gPSBuZXcgQk4oMikudG9SZWQodGhpcy5yZWQpO1xuXG4gIC8vIEN1cnZlIGNvbmZpZ3VyYXRpb24sIG9wdGlvbmFsXG4gIHRoaXMubiA9IGNvbmYubiAmJiBuZXcgQk4oY29uZi5uLCAxNik7XG4gIHRoaXMuZyA9IGNvbmYuZyAmJiB0aGlzLnBvaW50RnJvbUpTT04oY29uZi5nLCBjb25mLmdSZWQpO1xuXG4gIC8vIFRlbXBvcmFyeSBhcnJheXNcbiAgdGhpcy5fd25hZlQxID0gbmV3IEFycmF5KDQpO1xuICB0aGlzLl93bmFmVDIgPSBuZXcgQXJyYXkoNCk7XG4gIHRoaXMuX3duYWZUMyA9IG5ldyBBcnJheSg0KTtcbiAgdGhpcy5fd25hZlQ0ID0gbmV3IEFycmF5KDQpO1xuXG4gIC8vIEdlbmVyYWxpemVkIEdyZWcgTWF4d2VsbCdzIHRyaWNrXG4gIHZhciBhZGp1c3RDb3VudCA9IHRoaXMubiAmJiB0aGlzLnAuZGl2KHRoaXMubik7XG4gIGlmICghYWRqdXN0Q291bnQgfHwgYWRqdXN0Q291bnQuY21wbigxMDApID4gMCkge1xuICAgIHRoaXMucmVkTiA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fbWF4d2VsbFRyaWNrID0gdHJ1ZTtcbiAgICB0aGlzLnJlZE4gPSB0aGlzLm4udG9SZWQodGhpcy5yZWQpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IEJhc2VDdXJ2ZTtcblxuQmFzZUN1cnZlLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uIHBvaW50KCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuQmFzZUN1cnZlLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuQmFzZUN1cnZlLnByb3RvdHlwZS5fZml4ZWROYWZNdWwgPSBmdW5jdGlvbiBfZml4ZWROYWZNdWwocCwgaykge1xuICBhc3NlcnQocC5wcmVjb21wdXRlZCk7XG4gIHZhciBkb3VibGVzID0gcC5fZ2V0RG91YmxlcygpO1xuXG4gIHZhciBuYWYgPSBnZXROQUYoaywgMSk7XG4gIHZhciBJID0gKDEgPDwgKGRvdWJsZXMuc3RlcCArIDEpKSAtIChkb3VibGVzLnN0ZXAgJSAyID09PSAwID8gMiA6IDEpO1xuICBJIC89IDM7XG5cbiAgLy8gVHJhbnNsYXRlIGludG8gbW9yZSB3aW5kb3dlZCBmb3JtXG4gIHZhciByZXByID0gW107XG4gIGZvciAodmFyIGogPSAwOyBqIDwgbmFmLmxlbmd0aDsgaiArPSBkb3VibGVzLnN0ZXApIHtcbiAgICB2YXIgbmFmVyA9IDA7XG4gICAgZm9yICh2YXIgayA9IGogKyBkb3VibGVzLnN0ZXAgLSAxOyBrID49IGo7IGstLSlcbiAgICAgIG5hZlcgPSAobmFmVyA8PCAxKSArIG5hZltrXTtcbiAgICByZXByLnB1c2gobmFmVyk7XG4gIH1cblxuICB2YXIgYSA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICB2YXIgYiA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICBmb3IgKHZhciBpID0gSTsgaSA+IDA7IGktLSkge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmVwci5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIG5hZlcgPSByZXByW2pdO1xuICAgICAgaWYgKG5hZlcgPT09IGkpXG4gICAgICAgIGIgPSBiLm1peGVkQWRkKGRvdWJsZXMucG9pbnRzW2pdKTtcbiAgICAgIGVsc2UgaWYgKG5hZlcgPT09IC1pKVxuICAgICAgICBiID0gYi5taXhlZEFkZChkb3VibGVzLnBvaW50c1tqXS5uZWcoKSk7XG4gICAgfVxuICAgIGEgPSBhLmFkZChiKTtcbiAgfVxuICByZXR1cm4gYS50b1AoKTtcbn07XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUuX3duYWZNdWwgPSBmdW5jdGlvbiBfd25hZk11bChwLCBrKSB7XG4gIHZhciB3ID0gNDtcblxuICAvLyBQcmVjb21wdXRlIHdpbmRvd1xuICB2YXIgbmFmUG9pbnRzID0gcC5fZ2V0TkFGUG9pbnRzKHcpO1xuICB3ID0gbmFmUG9pbnRzLnduZDtcbiAgdmFyIHduZCA9IG5hZlBvaW50cy5wb2ludHM7XG5cbiAgLy8gR2V0IE5BRiBmb3JtXG4gIHZhciBuYWYgPSBnZXROQUYoaywgdyk7XG5cbiAgLy8gQWRkIGB0aGlzYCooTisxKSBmb3IgZXZlcnkgdy1OQUYgaW5kZXhcbiAgdmFyIGFjYyA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICBmb3IgKHZhciBpID0gbmFmLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgLy8gQ291bnQgemVyb2VzXG4gICAgZm9yICh2YXIgayA9IDA7IGkgPj0gMCAmJiBuYWZbaV0gPT09IDA7IGktLSlcbiAgICAgIGsrKztcbiAgICBpZiAoaSA+PSAwKVxuICAgICAgaysrO1xuICAgIGFjYyA9IGFjYy5kYmxwKGspO1xuXG4gICAgaWYgKGkgPCAwKVxuICAgICAgYnJlYWs7XG4gICAgdmFyIHogPSBuYWZbaV07XG4gICAgYXNzZXJ0KHogIT09IDApO1xuICAgIGlmIChwLnR5cGUgPT09ICdhZmZpbmUnKSB7XG4gICAgICAvLyBKICstIFBcbiAgICAgIGlmICh6ID4gMClcbiAgICAgICAgYWNjID0gYWNjLm1peGVkQWRkKHduZFsoeiAtIDEpID4+IDFdKTtcbiAgICAgIGVsc2VcbiAgICAgICAgYWNjID0gYWNjLm1peGVkQWRkKHduZFsoLXogLSAxKSA+PiAxXS5uZWcoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEogKy0gSlxuICAgICAgaWYgKHogPiAwKVxuICAgICAgICBhY2MgPSBhY2MuYWRkKHduZFsoeiAtIDEpID4+IDFdKTtcbiAgICAgIGVsc2VcbiAgICAgICAgYWNjID0gYWNjLmFkZCh3bmRbKC16IC0gMSkgPj4gMV0ubmVnKCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcC50eXBlID09PSAnYWZmaW5lJyA/IGFjYy50b1AoKSA6IGFjYztcbn07XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUuX3duYWZNdWxBZGQgPSBmdW5jdGlvbiBfd25hZk11bEFkZChkZWZXLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphY29iaWFuUmVzdWx0KSB7XG4gIHZhciB3bmRXaWR0aCA9IHRoaXMuX3duYWZUMTtcbiAgdmFyIHduZCA9IHRoaXMuX3duYWZUMjtcbiAgdmFyIG5hZiA9IHRoaXMuX3duYWZUMztcblxuICAvLyBGaWxsIGFsbCBhcnJheXNcbiAgdmFyIG1heCA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgcCA9IHBvaW50c1tpXTtcbiAgICB2YXIgbmFmUG9pbnRzID0gcC5fZ2V0TkFGUG9pbnRzKGRlZlcpO1xuICAgIHduZFdpZHRoW2ldID0gbmFmUG9pbnRzLnduZDtcbiAgICB3bmRbaV0gPSBuYWZQb2ludHMucG9pbnRzO1xuICB9XG5cbiAgLy8gQ29tYiBzbWFsbCB3aW5kb3cgTkFGc1xuICBmb3IgKHZhciBpID0gbGVuIC0gMTsgaSA+PSAxOyBpIC09IDIpIHtcbiAgICB2YXIgYSA9IGkgLSAxO1xuICAgIHZhciBiID0gaTtcbiAgICBpZiAod25kV2lkdGhbYV0gIT09IDEgfHwgd25kV2lkdGhbYl0gIT09IDEpIHtcbiAgICAgIG5hZlthXSA9IGdldE5BRihjb2VmZnNbYV0sIHduZFdpZHRoW2FdKTtcbiAgICAgIG5hZltiXSA9IGdldE5BRihjb2VmZnNbYl0sIHduZFdpZHRoW2JdKTtcbiAgICAgIG1heCA9IE1hdGgubWF4KG5hZlthXS5sZW5ndGgsIG1heCk7XG4gICAgICBtYXggPSBNYXRoLm1heChuYWZbYl0ubGVuZ3RoLCBtYXgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGNvbWIgPSBbXG4gICAgICBwb2ludHNbYV0sIC8qIDEgKi9cbiAgICAgIG51bGwsIC8qIDMgKi9cbiAgICAgIG51bGwsIC8qIDUgKi9cbiAgICAgIHBvaW50c1tiXSAvKiA3ICovXG4gICAgXTtcblxuICAgIC8vIFRyeSB0byBhdm9pZCBQcm9qZWN0aXZlIHBvaW50cywgaWYgcG9zc2libGVcbiAgICBpZiAocG9pbnRzW2FdLnkuY21wKHBvaW50c1tiXS55KSA9PT0gMCkge1xuICAgICAgY29tYlsxXSA9IHBvaW50c1thXS5hZGQocG9pbnRzW2JdKTtcbiAgICAgIGNvbWJbMl0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdLm5lZygpKTtcbiAgICB9IGVsc2UgaWYgKHBvaW50c1thXS55LmNtcChwb2ludHNbYl0ueS5yZWROZWcoKSkgPT09IDApIHtcbiAgICAgIGNvbWJbMV0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdKTtcbiAgICAgIGNvbWJbMl0gPSBwb2ludHNbYV0uYWRkKHBvaW50c1tiXS5uZWcoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbWJbMV0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdKTtcbiAgICAgIGNvbWJbMl0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdLm5lZygpKTtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXggPSBbXG4gICAgICAtMywgLyogLTEgLTEgKi9cbiAgICAgIC0xLCAvKiAtMSAwICovXG4gICAgICAtNSwgLyogLTEgMSAqL1xuICAgICAgLTcsIC8qIDAgLTEgKi9cbiAgICAgIDAsIC8qIDAgMCAqL1xuICAgICAgNywgLyogMCAxICovXG4gICAgICA1LCAvKiAxIC0xICovXG4gICAgICAxLCAvKiAxIDAgKi9cbiAgICAgIDMgIC8qIDEgMSAqL1xuICAgIF07XG5cbiAgICB2YXIganNmID0gZ2V0SlNGKGNvZWZmc1thXSwgY29lZmZzW2JdKTtcbiAgICBtYXggPSBNYXRoLm1heChqc2ZbMF0ubGVuZ3RoLCBtYXgpO1xuICAgIG5hZlthXSA9IG5ldyBBcnJheShtYXgpO1xuICAgIG5hZltiXSA9IG5ldyBBcnJheShtYXgpO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbWF4OyBqKyspIHtcbiAgICAgIHZhciBqYSA9IGpzZlswXVtqXSB8IDA7XG4gICAgICB2YXIgamIgPSBqc2ZbMV1bal0gfCAwO1xuXG4gICAgICBuYWZbYV1bal0gPSBpbmRleFsoamEgKyAxKSAqIDMgKyAoamIgKyAxKV07XG4gICAgICBuYWZbYl1bal0gPSAwO1xuICAgICAgd25kW2FdID0gY29tYjtcbiAgICB9XG4gIH1cblxuICB2YXIgYWNjID0gdGhpcy5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG4gIHZhciB0bXAgPSB0aGlzLl93bmFmVDQ7XG4gIGZvciAodmFyIGkgPSBtYXg7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGsgPSAwO1xuXG4gICAgd2hpbGUgKGkgPj0gMCkge1xuICAgICAgdmFyIHplcm8gPSB0cnVlO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW47IGorKykge1xuICAgICAgICB0bXBbal0gPSBuYWZbal1baV0gfCAwO1xuICAgICAgICBpZiAodG1wW2pdICE9PSAwKVxuICAgICAgICAgIHplcm8gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghemVybylcbiAgICAgICAgYnJlYWs7XG4gICAgICBrKys7XG4gICAgICBpLS07XG4gICAgfVxuICAgIGlmIChpID49IDApXG4gICAgICBrKys7XG4gICAgYWNjID0gYWNjLmRibHAoayk7XG4gICAgaWYgKGkgPCAwKVxuICAgICAgYnJlYWs7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICB2YXIgeiA9IHRtcFtqXTtcbiAgICAgIHZhciBwO1xuICAgICAgaWYgKHogPT09IDApXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgZWxzZSBpZiAoeiA+IDApXG4gICAgICAgIHAgPSB3bmRbal1bKHogLSAxKSA+PiAxXTtcbiAgICAgIGVsc2UgaWYgKHogPCAwKVxuICAgICAgICBwID0gd25kW2pdWygteiAtIDEpID4+IDFdLm5lZygpO1xuXG4gICAgICBpZiAocC50eXBlID09PSAnYWZmaW5lJylcbiAgICAgICAgYWNjID0gYWNjLm1peGVkQWRkKHApO1xuICAgICAgZWxzZVxuICAgICAgICBhY2MgPSBhY2MuYWRkKHApO1xuICAgIH1cbiAgfVxuICAvLyBaZXJvaWZ5IHJlZmVyZW5jZXNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICB3bmRbaV0gPSBudWxsO1xuXG4gIGlmIChqYWNvYmlhblJlc3VsdClcbiAgICByZXR1cm4gYWNjO1xuICBlbHNlXG4gICAgcmV0dXJuIGFjYy50b1AoKTtcbn07XG5cbmZ1bmN0aW9uIEJhc2VQb2ludChjdXJ2ZSwgdHlwZSkge1xuICB0aGlzLmN1cnZlID0gY3VydmU7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMucHJlY29tcHV0ZWQgPSBudWxsO1xufVxuQmFzZUN1cnZlLkJhc2VQb2ludCA9IEJhc2VQb2ludDtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxKC8qb3RoZXIqLykge1xuICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuICByZXR1cm4gdGhpcy5jdXJ2ZS52YWxpZGF0ZSh0aGlzKTtcbn07XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUuZGVjb2RlUG9pbnQgPSBmdW5jdGlvbiBkZWNvZGVQb2ludChieXRlcywgZW5jKSB7XG4gIGJ5dGVzID0gdXRpbHMudG9BcnJheShieXRlcywgZW5jKTtcblxuICB2YXIgbGVuID0gdGhpcy5wLmJ5dGVMZW5ndGgoKTtcblxuICAvLyB1bmNvbXByZXNzZWQsIGh5YnJpZC1vZGQsIGh5YnJpZC1ldmVuXG4gIGlmICgoYnl0ZXNbMF0gPT09IDB4MDQgfHwgYnl0ZXNbMF0gPT09IDB4MDYgfHwgYnl0ZXNbMF0gPT09IDB4MDcpICYmXG4gICAgICBieXRlcy5sZW5ndGggLSAxID09PSAyICogbGVuKSB7XG4gICAgaWYgKGJ5dGVzWzBdID09PSAweDA2KVxuICAgICAgYXNzZXJ0KGJ5dGVzW2J5dGVzLmxlbmd0aCAtIDFdICUgMiA9PT0gMCk7XG4gICAgZWxzZSBpZiAoYnl0ZXNbMF0gPT09IDB4MDcpXG4gICAgICBhc3NlcnQoYnl0ZXNbYnl0ZXMubGVuZ3RoIC0gMV0gJSAyID09PSAxKTtcblxuICAgIHZhciByZXMgPSAgdGhpcy5wb2ludChieXRlcy5zbGljZSgxLCAxICsgbGVuKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMuc2xpY2UoMSArIGxlbiwgMSArIDIgKiBsZW4pKTtcblxuICAgIHJldHVybiByZXM7XG4gIH0gZWxzZSBpZiAoKGJ5dGVzWzBdID09PSAweDAyIHx8IGJ5dGVzWzBdID09PSAweDAzKSAmJlxuICAgICAgICAgICAgICBieXRlcy5sZW5ndGggLSAxID09PSBsZW4pIHtcbiAgICByZXR1cm4gdGhpcy5wb2ludEZyb21YKGJ5dGVzLnNsaWNlKDEsIDEgKyBsZW4pLCBieXRlc1swXSA9PT0gMHgwMyk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHBvaW50IGZvcm1hdCcpO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5lbmNvZGVDb21wcmVzc2VkID0gZnVuY3Rpb24gZW5jb2RlQ29tcHJlc3NlZChlbmMpIHtcbiAgcmV0dXJuIHRoaXMuZW5jb2RlKGVuYywgdHJ1ZSk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9lbmNvZGUgPSBmdW5jdGlvbiBfZW5jb2RlKGNvbXBhY3QpIHtcbiAgdmFyIGxlbiA9IHRoaXMuY3VydmUucC5ieXRlTGVuZ3RoKCk7XG4gIHZhciB4ID0gdGhpcy5nZXRYKCkudG9BcnJheSgnYmUnLCBsZW4pO1xuXG4gIGlmIChjb21wYWN0KVxuICAgIHJldHVybiBbIHRoaXMuZ2V0WSgpLmlzRXZlbigpID8gMHgwMiA6IDB4MDMgXS5jb25jYXQoeCk7XG5cbiAgcmV0dXJuIFsgMHgwNCBdLmNvbmNhdCh4LCB0aGlzLmdldFkoKS50b0FycmF5KCdiZScsIGxlbikpIDtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGVuYywgY29tcGFjdCkge1xuICByZXR1cm4gdXRpbHMuZW5jb2RlKHRoaXMuX2VuY29kZShjb21wYWN0KSwgZW5jKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUucHJlY29tcHV0ZSA9IGZ1bmN0aW9uIHByZWNvbXB1dGUocG93ZXIpIHtcbiAgaWYgKHRoaXMucHJlY29tcHV0ZWQpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgdmFyIHByZWNvbXB1dGVkID0ge1xuICAgIGRvdWJsZXM6IG51bGwsXG4gICAgbmFmOiBudWxsLFxuICAgIGJldGE6IG51bGxcbiAgfTtcbiAgcHJlY29tcHV0ZWQubmFmID0gdGhpcy5fZ2V0TkFGUG9pbnRzKDgpO1xuICBwcmVjb21wdXRlZC5kb3VibGVzID0gdGhpcy5fZ2V0RG91Ymxlcyg0LCBwb3dlcik7XG4gIHByZWNvbXB1dGVkLmJldGEgPSB0aGlzLl9nZXRCZXRhKCk7XG4gIHRoaXMucHJlY29tcHV0ZWQgPSBwcmVjb21wdXRlZDtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2hhc0RvdWJsZXMgPSBmdW5jdGlvbiBfaGFzRG91YmxlcyhrKSB7XG4gIGlmICghdGhpcy5wcmVjb21wdXRlZClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGRvdWJsZXMgPSB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXM7XG4gIGlmICghZG91YmxlcylcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIGRvdWJsZXMucG9pbnRzLmxlbmd0aCA+PSBNYXRoLmNlaWwoKGsuYml0TGVuZ3RoKCkgKyAxKSAvIGRvdWJsZXMuc3RlcCk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9nZXREb3VibGVzID0gZnVuY3Rpb24gX2dldERvdWJsZXMoc3RlcCwgcG93ZXIpIHtcbiAgaWYgKHRoaXMucHJlY29tcHV0ZWQgJiYgdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzKVxuICAgIHJldHVybiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXM7XG5cbiAgdmFyIGRvdWJsZXMgPSBbIHRoaXMgXTtcbiAgdmFyIGFjYyA9IHRoaXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcG93ZXI7IGkgKz0gc3RlcCkge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3RlcDsgaisrKVxuICAgICAgYWNjID0gYWNjLmRibCgpO1xuICAgIGRvdWJsZXMucHVzaChhY2MpO1xuICB9XG4gIHJldHVybiB7XG4gICAgc3RlcDogc3RlcCxcbiAgICBwb2ludHM6IGRvdWJsZXNcbiAgfTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2dldE5BRlBvaW50cyA9IGZ1bmN0aW9uIF9nZXROQUZQb2ludHMod25kKSB7XG4gIGlmICh0aGlzLnByZWNvbXB1dGVkICYmIHRoaXMucHJlY29tcHV0ZWQubmFmKVxuICAgIHJldHVybiB0aGlzLnByZWNvbXB1dGVkLm5hZjtcblxuICB2YXIgcmVzID0gWyB0aGlzIF07XG4gIHZhciBtYXggPSAoMSA8PCB3bmQpIC0gMTtcbiAgdmFyIGRibCA9IG1heCA9PT0gMSA/IG51bGwgOiB0aGlzLmRibCgpO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IG1heDsgaSsrKVxuICAgIHJlc1tpXSA9IHJlc1tpIC0gMV0uYWRkKGRibCk7XG4gIHJldHVybiB7XG4gICAgd25kOiB3bmQsXG4gICAgcG9pbnRzOiByZXNcbiAgfTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2dldEJldGEgPSBmdW5jdGlvbiBfZ2V0QmV0YSgpIHtcbiAgcmV0dXJuIG51bGw7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLmRibHAgPSBmdW5jdGlvbiBkYmxwKGspIHtcbiAgdmFyIHIgPSB0aGlzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGs7IGkrKylcbiAgICByID0gci5kYmwoKTtcbiAgcmV0dXJuIHI7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3VydmUgPSByZXF1aXJlKCcuLi9jdXJ2ZScpO1xudmFyIGVsbGlwdGljID0gcmVxdWlyZSgnLi4vLi4vZWxsaXB0aWMnKTtcbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xudmFyIEJhc2UgPSBjdXJ2ZS5iYXNlO1xuXG52YXIgYXNzZXJ0ID0gZWxsaXB0aWMudXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBFZHdhcmRzQ3VydmUoY29uZikge1xuICAvLyBOT1RFOiBJbXBvcnRhbnQgYXMgd2UgYXJlIGNyZWF0aW5nIHBvaW50IGluIEJhc2UuY2FsbCgpXG4gIHRoaXMudHdpc3RlZCA9IChjb25mLmEgfCAwKSAhPT0gMTtcbiAgdGhpcy5tT25lQSA9IHRoaXMudHdpc3RlZCAmJiAoY29uZi5hIHwgMCkgPT09IC0xO1xuICB0aGlzLmV4dGVuZGVkID0gdGhpcy5tT25lQTtcblxuICBCYXNlLmNhbGwodGhpcywgJ2Vkd2FyZHMnLCBjb25mKTtcblxuICB0aGlzLmEgPSBuZXcgQk4oY29uZi5hLCAxNikudW1vZCh0aGlzLnJlZC5tKTtcbiAgdGhpcy5hID0gdGhpcy5hLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5jID0gbmV3IEJOKGNvbmYuYywgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5jMiA9IHRoaXMuYy5yZWRTcXIoKTtcbiAgdGhpcy5kID0gbmV3IEJOKGNvbmYuZCwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5kZCA9IHRoaXMuZC5yZWRBZGQodGhpcy5kKTtcblxuICBhc3NlcnQoIXRoaXMudHdpc3RlZCB8fCB0aGlzLmMuZnJvbVJlZCgpLmNtcG4oMSkgPT09IDApO1xuICB0aGlzLm9uZUMgPSAoY29uZi5jIHwgMCkgPT09IDE7XG59XG5pbmhlcml0cyhFZHdhcmRzQ3VydmUsIEJhc2UpO1xubW9kdWxlLmV4cG9ydHMgPSBFZHdhcmRzQ3VydmU7XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUuX211bEEgPSBmdW5jdGlvbiBfbXVsQShudW0pIHtcbiAgaWYgKHRoaXMubU9uZUEpXG4gICAgcmV0dXJuIG51bS5yZWROZWcoKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmEucmVkTXVsKG51bSk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLl9tdWxDID0gZnVuY3Rpb24gX211bEMobnVtKSB7XG4gIGlmICh0aGlzLm9uZUMpXG4gICAgcmV0dXJuIG51bTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmMucmVkTXVsKG51bSk7XG59O1xuXG4vLyBKdXN0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggU2hvcnQgY3VydmVcbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUuanBvaW50ID0gZnVuY3Rpb24ganBvaW50KHgsIHksIHosIHQpIHtcbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSwgeiwgdCk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnBvaW50RnJvbVggPSBmdW5jdGlvbiBwb2ludEZyb21YKHgsIG9kZCkge1xuICB4ID0gbmV3IEJOKHgsIDE2KTtcbiAgaWYgKCF4LnJlZClcbiAgICB4ID0geC50b1JlZCh0aGlzLnJlZCk7XG5cbiAgdmFyIHgyID0geC5yZWRTcXIoKTtcbiAgdmFyIHJocyA9IHRoaXMuYzIucmVkU3ViKHRoaXMuYS5yZWRNdWwoeDIpKTtcbiAgdmFyIGxocyA9IHRoaXMub25lLnJlZFN1Yih0aGlzLmMyLnJlZE11bCh0aGlzLmQpLnJlZE11bCh4MikpO1xuXG4gIHZhciB5MiA9IHJocy5yZWRNdWwobGhzLnJlZEludm0oKSk7XG4gIHZhciB5ID0geTIucmVkU3FydCgpO1xuICBpZiAoeS5yZWRTcXIoKS5yZWRTdWIoeTIpLmNtcCh0aGlzLnplcm8pICE9PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwb2ludCcpO1xuXG4gIHZhciBpc09kZCA9IHkuZnJvbVJlZCgpLmlzT2RkKCk7XG4gIGlmIChvZGQgJiYgIWlzT2RkIHx8ICFvZGQgJiYgaXNPZGQpXG4gICAgeSA9IHkucmVkTmVnKCk7XG5cbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnBvaW50RnJvbVkgPSBmdW5jdGlvbiBwb2ludEZyb21ZKHksIG9kZCkge1xuICB5ID0gbmV3IEJOKHksIDE2KTtcbiAgaWYgKCF5LnJlZClcbiAgICB5ID0geS50b1JlZCh0aGlzLnJlZCk7XG5cbiAgLy8geF4yID0gKHleMiAtIGNeMikgLyAoY14yIGQgeV4yIC0gYSlcbiAgdmFyIHkyID0geS5yZWRTcXIoKTtcbiAgdmFyIGxocyA9IHkyLnJlZFN1Yih0aGlzLmMyKTtcbiAgdmFyIHJocyA9IHkyLnJlZE11bCh0aGlzLmQpLnJlZE11bCh0aGlzLmMyKS5yZWRTdWIodGhpcy5hKTtcbiAgdmFyIHgyID0gbGhzLnJlZE11bChyaHMucmVkSW52bSgpKTtcblxuICBpZiAoeDIuY21wKHRoaXMuemVybykgPT09IDApIHtcbiAgICBpZiAob2RkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBvaW50Jyk7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIHRoaXMucG9pbnQodGhpcy56ZXJvLCB5KTtcbiAgfVxuXG4gIHZhciB4ID0geDIucmVkU3FydCgpO1xuICBpZiAoeC5yZWRTcXIoKS5yZWRTdWIoeDIpLmNtcCh0aGlzLnplcm8pICE9PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwb2ludCcpO1xuXG4gIGlmICh4LmZyb21SZWQoKS5pc09kZCgpICE9PSBvZGQpXG4gICAgeCA9IHgucmVkTmVnKCk7XG5cbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUocG9pbnQpIHtcbiAgaWYgKHBvaW50LmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdHJ1ZTtcblxuICAvLyBDdXJ2ZTogQSAqIFheMiArIFleMiA9IENeMiAqICgxICsgRCAqIFheMiAqIFleMilcbiAgcG9pbnQubm9ybWFsaXplKCk7XG5cbiAgdmFyIHgyID0gcG9pbnQueC5yZWRTcXIoKTtcbiAgdmFyIHkyID0gcG9pbnQueS5yZWRTcXIoKTtcbiAgdmFyIGxocyA9IHgyLnJlZE11bCh0aGlzLmEpLnJlZEFkZCh5Mik7XG4gIHZhciByaHMgPSB0aGlzLmMyLnJlZE11bCh0aGlzLm9uZS5yZWRBZGQodGhpcy5kLnJlZE11bCh4MikucmVkTXVsKHkyKSkpO1xuXG4gIHJldHVybiBsaHMuY21wKHJocykgPT09IDA7XG59O1xuXG5mdW5jdGlvbiBQb2ludChjdXJ2ZSwgeCwgeSwgeiwgdCkge1xuICBCYXNlLkJhc2VQb2ludC5jYWxsKHRoaXMsIGN1cnZlLCAncHJvamVjdGl2ZScpO1xuICBpZiAoeCA9PT0gbnVsbCAmJiB5ID09PSBudWxsICYmIHogPT09IG51bGwpIHtcbiAgICB0aGlzLnggPSB0aGlzLmN1cnZlLnplcm87XG4gICAgdGhpcy55ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy56ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy50ID0gdGhpcy5jdXJ2ZS56ZXJvO1xuICAgIHRoaXMuek9uZSA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy54ID0gbmV3IEJOKHgsIDE2KTtcbiAgICB0aGlzLnkgPSBuZXcgQk4oeSwgMTYpO1xuICAgIHRoaXMueiA9IHogPyBuZXcgQk4oeiwgMTYpIDogdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy50ID0gdCAmJiBuZXcgQk4odCwgMTYpO1xuICAgIGlmICghdGhpcy54LnJlZClcbiAgICAgIHRoaXMueCA9IHRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgaWYgKCF0aGlzLnkucmVkKVxuICAgICAgdGhpcy55ID0gdGhpcy55LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAoIXRoaXMuei5yZWQpXG4gICAgICB0aGlzLnogPSB0aGlzLnoudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIGlmICh0aGlzLnQgJiYgIXRoaXMudC5yZWQpXG4gICAgICB0aGlzLnQgPSB0aGlzLnQudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIHRoaXMuek9uZSA9IHRoaXMueiA9PT0gdGhpcy5jdXJ2ZS5vbmU7XG5cbiAgICAvLyBVc2UgZXh0ZW5kZWQgY29vcmRpbmF0ZXNcbiAgICBpZiAodGhpcy5jdXJ2ZS5leHRlbmRlZCAmJiAhdGhpcy50KSB7XG4gICAgICB0aGlzLnQgPSB0aGlzLngucmVkTXVsKHRoaXMueSk7XG4gICAgICBpZiAoIXRoaXMuek9uZSlcbiAgICAgICAgdGhpcy50ID0gdGhpcy50LnJlZE11bCh0aGlzLnoucmVkSW52bSgpKTtcbiAgICB9XG4gIH1cbn1cbmluaGVyaXRzKFBvaW50LCBCYXNlLkJhc2VQb2ludCk7XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tSlNPTiA9IGZ1bmN0aW9uIHBvaW50RnJvbUpTT04ob2JqKSB7XG4gIHJldHVybiBQb2ludC5mcm9tSlNPTih0aGlzLCBvYmopO1xufTtcblxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uIHBvaW50KHgsIHksIHosIHQpIHtcbiAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLCB4LCB5LCB6LCB0KTtcbn07XG5cblBvaW50LmZyb21KU09OID0gZnVuY3Rpb24gZnJvbUpTT04oY3VydmUsIG9iaikge1xuICByZXR1cm4gbmV3IFBvaW50KGN1cnZlLCBvYmpbMF0sIG9ialsxXSwgb2JqWzJdKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIFBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIFBvaW50IHg6ICcgKyB0aGlzLnguZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHk6ICcgKyB0aGlzLnkuZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHo6ICcgKyB0aGlzLnouZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArICc+Jztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgLy8gWFhYIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgemVybyBpcyBhbHdheXMgemVybyBpbiByZWRcbiAgcmV0dXJuIHRoaXMueC5jbXBuKDApID09PSAwICYmXG4gICAgKHRoaXMueS5jbXAodGhpcy56KSA9PT0gMCB8fFxuICAgICh0aGlzLnpPbmUgJiYgdGhpcy55LmNtcCh0aGlzLmN1cnZlLmMpID09PSAwKSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuX2V4dERibCA9IGZ1bmN0aW9uIF9leHREYmwoKSB7XG4gIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLWV4dGVuZGVkLTEuaHRtbFxuICAvLyAgICAgI2RvdWJsaW5nLWRibC0yMDA4LWh3Y2RcbiAgLy8gNE0gKyA0U1xuXG4gIC8vIEEgPSBYMV4yXG4gIHZhciBhID0gdGhpcy54LnJlZFNxcigpO1xuICAvLyBCID0gWTFeMlxuICB2YXIgYiA9IHRoaXMueS5yZWRTcXIoKTtcbiAgLy8gQyA9IDIgKiBaMV4yXG4gIHZhciBjID0gdGhpcy56LnJlZFNxcigpO1xuICBjID0gYy5yZWRJQWRkKGMpO1xuICAvLyBEID0gYSAqIEFcbiAgdmFyIGQgPSB0aGlzLmN1cnZlLl9tdWxBKGEpO1xuICAvLyBFID0gKFgxICsgWTEpXjIgLSBBIC0gQlxuICB2YXIgZSA9IHRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRTcXIoKS5yZWRJU3ViKGEpLnJlZElTdWIoYik7XG4gIC8vIEcgPSBEICsgQlxuICB2YXIgZyA9IGQucmVkQWRkKGIpO1xuICAvLyBGID0gRyAtIENcbiAgdmFyIGYgPSBnLnJlZFN1YihjKTtcbiAgLy8gSCA9IEQgLSBCXG4gIHZhciBoID0gZC5yZWRTdWIoYik7XG4gIC8vIFgzID0gRSAqIEZcbiAgdmFyIG54ID0gZS5yZWRNdWwoZik7XG4gIC8vIFkzID0gRyAqIEhcbiAgdmFyIG55ID0gZy5yZWRNdWwoaCk7XG4gIC8vIFQzID0gRSAqIEhcbiAgdmFyIG50ID0gZS5yZWRNdWwoaCk7XG4gIC8vIFozID0gRiAqIEdcbiAgdmFyIG56ID0gZi5yZWRNdWwoZyk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSwgbnosIG50KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fcHJvakRibCA9IGZ1bmN0aW9uIF9wcm9qRGJsKCkge1xuICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tdHdpc3RlZC1wcm9qZWN0aXZlLmh0bWxcbiAgLy8gICAgICNkb3VibGluZy1kYmwtMjAwOC1iYmpscFxuICAvLyAgICAgI2RvdWJsaW5nLWRibC0yMDA3LWJsXG4gIC8vIGFuZCBvdGhlcnNcbiAgLy8gR2VuZXJhbGx5IDNNICsgNFMgb3IgMk0gKyA0U1xuXG4gIC8vIEIgPSAoWDEgKyBZMSleMlxuICB2YXIgYiA9IHRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRTcXIoKTtcbiAgLy8gQyA9IFgxXjJcbiAgdmFyIGMgPSB0aGlzLngucmVkU3FyKCk7XG4gIC8vIEQgPSBZMV4yXG4gIHZhciBkID0gdGhpcy55LnJlZFNxcigpO1xuXG4gIHZhciBueDtcbiAgdmFyIG55O1xuICB2YXIgbno7XG4gIGlmICh0aGlzLmN1cnZlLnR3aXN0ZWQpIHtcbiAgICAvLyBFID0gYSAqIENcbiAgICB2YXIgZSA9IHRoaXMuY3VydmUuX211bEEoYyk7XG4gICAgLy8gRiA9IEUgKyBEXG4gICAgdmFyIGYgPSBlLnJlZEFkZChkKTtcbiAgICBpZiAodGhpcy56T25lKSB7XG4gICAgICAvLyBYMyA9IChCIC0gQyAtIEQpICogKEYgLSAyKVxuICAgICAgbnggPSBiLnJlZFN1YihjKS5yZWRTdWIoZCkucmVkTXVsKGYucmVkU3ViKHRoaXMuY3VydmUudHdvKSk7XG4gICAgICAvLyBZMyA9IEYgKiAoRSAtIEQpXG4gICAgICBueSA9IGYucmVkTXVsKGUucmVkU3ViKGQpKTtcbiAgICAgIC8vIFozID0gRl4yIC0gMiAqIEZcbiAgICAgIG56ID0gZi5yZWRTcXIoKS5yZWRTdWIoZikucmVkU3ViKGYpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIID0gWjFeMlxuICAgICAgdmFyIGggPSB0aGlzLnoucmVkU3FyKCk7XG4gICAgICAvLyBKID0gRiAtIDIgKiBIXG4gICAgICB2YXIgaiA9IGYucmVkU3ViKGgpLnJlZElTdWIoaCk7XG4gICAgICAvLyBYMyA9IChCLUMtRCkqSlxuICAgICAgbnggPSBiLnJlZFN1YihjKS5yZWRJU3ViKGQpLnJlZE11bChqKTtcbiAgICAgIC8vIFkzID0gRiAqIChFIC0gRClcbiAgICAgIG55ID0gZi5yZWRNdWwoZS5yZWRTdWIoZCkpO1xuICAgICAgLy8gWjMgPSBGICogSlxuICAgICAgbnogPSBmLnJlZE11bChqKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gRSA9IEMgKyBEXG4gICAgdmFyIGUgPSBjLnJlZEFkZChkKTtcbiAgICAvLyBIID0gKGMgKiBaMSleMlxuICAgIHZhciBoID0gdGhpcy5jdXJ2ZS5fbXVsQyh0aGlzLnopLnJlZFNxcigpO1xuICAgIC8vIEogPSBFIC0gMiAqIEhcbiAgICB2YXIgaiA9IGUucmVkU3ViKGgpLnJlZFN1YihoKTtcbiAgICAvLyBYMyA9IGMgKiAoQiAtIEUpICogSlxuICAgIG54ID0gdGhpcy5jdXJ2ZS5fbXVsQyhiLnJlZElTdWIoZSkpLnJlZE11bChqKTtcbiAgICAvLyBZMyA9IGMgKiBFICogKEMgLSBEKVxuICAgIG55ID0gdGhpcy5jdXJ2ZS5fbXVsQyhlKS5yZWRNdWwoYy5yZWRJU3ViKGQpKTtcbiAgICAvLyBaMyA9IEUgKiBKXG4gICAgbnogPSBlLnJlZE11bChqKTtcbiAgfVxuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnksIG56KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kYmwgPSBmdW5jdGlvbiBkYmwoKSB7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBEb3VibGUgaW4gZXh0ZW5kZWQgY29vcmRpbmF0ZXNcbiAgaWYgKHRoaXMuY3VydmUuZXh0ZW5kZWQpXG4gICAgcmV0dXJuIHRoaXMuX2V4dERibCgpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuX3Byb2pEYmwoKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fZXh0QWRkID0gZnVuY3Rpb24gX2V4dEFkZChwKSB7XG4gIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLWV4dGVuZGVkLTEuaHRtbFxuICAvLyAgICAgI2FkZGl0aW9uLWFkZC0yMDA4LWh3Y2QtM1xuICAvLyA4TVxuXG4gIC8vIEEgPSAoWTEgLSBYMSkgKiAoWTIgLSBYMilcbiAgdmFyIGEgPSB0aGlzLnkucmVkU3ViKHRoaXMueCkucmVkTXVsKHAueS5yZWRTdWIocC54KSk7XG4gIC8vIEIgPSAoWTEgKyBYMSkgKiAoWTIgKyBYMilcbiAgdmFyIGIgPSB0aGlzLnkucmVkQWRkKHRoaXMueCkucmVkTXVsKHAueS5yZWRBZGQocC54KSk7XG4gIC8vIEMgPSBUMSAqIGsgKiBUMlxuICB2YXIgYyA9IHRoaXMudC5yZWRNdWwodGhpcy5jdXJ2ZS5kZCkucmVkTXVsKHAudCk7XG4gIC8vIEQgPSBaMSAqIDIgKiBaMlxuICB2YXIgZCA9IHRoaXMuei5yZWRNdWwocC56LnJlZEFkZChwLnopKTtcbiAgLy8gRSA9IEIgLSBBXG4gIHZhciBlID0gYi5yZWRTdWIoYSk7XG4gIC8vIEYgPSBEIC0gQ1xuICB2YXIgZiA9IGQucmVkU3ViKGMpO1xuICAvLyBHID0gRCArIENcbiAgdmFyIGcgPSBkLnJlZEFkZChjKTtcbiAgLy8gSCA9IEIgKyBBXG4gIHZhciBoID0gYi5yZWRBZGQoYSk7XG4gIC8vIFgzID0gRSAqIEZcbiAgdmFyIG54ID0gZS5yZWRNdWwoZik7XG4gIC8vIFkzID0gRyAqIEhcbiAgdmFyIG55ID0gZy5yZWRNdWwoaCk7XG4gIC8vIFQzID0gRSAqIEhcbiAgdmFyIG50ID0gZS5yZWRNdWwoaCk7XG4gIC8vIFozID0gRiAqIEdcbiAgdmFyIG56ID0gZi5yZWRNdWwoZyk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSwgbnosIG50KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fcHJvakFkZCA9IGZ1bmN0aW9uIF9wcm9qQWRkKHApIHtcbiAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtcHJvamVjdGl2ZS5odG1sXG4gIC8vICAgICAjYWRkaXRpb24tYWRkLTIwMDgtYmJqbHBcbiAgLy8gICAgICNhZGRpdGlvbi1hZGQtMjAwNy1ibFxuICAvLyAxME0gKyAxU1xuXG4gIC8vIEEgPSBaMSAqIFoyXG4gIHZhciBhID0gdGhpcy56LnJlZE11bChwLnopO1xuICAvLyBCID0gQV4yXG4gIHZhciBiID0gYS5yZWRTcXIoKTtcbiAgLy8gQyA9IFgxICogWDJcbiAgdmFyIGMgPSB0aGlzLngucmVkTXVsKHAueCk7XG4gIC8vIEQgPSBZMSAqIFkyXG4gIHZhciBkID0gdGhpcy55LnJlZE11bChwLnkpO1xuICAvLyBFID0gZCAqIEMgKiBEXG4gIHZhciBlID0gdGhpcy5jdXJ2ZS5kLnJlZE11bChjKS5yZWRNdWwoZCk7XG4gIC8vIEYgPSBCIC0gRVxuICB2YXIgZiA9IGIucmVkU3ViKGUpO1xuICAvLyBHID0gQiArIEVcbiAgdmFyIGcgPSBiLnJlZEFkZChlKTtcbiAgLy8gWDMgPSBBICogRiAqICgoWDEgKyBZMSkgKiAoWDIgKyBZMikgLSBDIC0gRClcbiAgdmFyIHRtcCA9IHRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRNdWwocC54LnJlZEFkZChwLnkpKS5yZWRJU3ViKGMpLnJlZElTdWIoZCk7XG4gIHZhciBueCA9IGEucmVkTXVsKGYpLnJlZE11bCh0bXApO1xuICB2YXIgbnk7XG4gIHZhciBuejtcbiAgaWYgKHRoaXMuY3VydmUudHdpc3RlZCkge1xuICAgIC8vIFkzID0gQSAqIEcgKiAoRCAtIGEgKiBDKVxuICAgIG55ID0gYS5yZWRNdWwoZykucmVkTXVsKGQucmVkU3ViKHRoaXMuY3VydmUuX211bEEoYykpKTtcbiAgICAvLyBaMyA9IEYgKiBHXG4gICAgbnogPSBmLnJlZE11bChnKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBZMyA9IEEgKiBHICogKEQgLSBDKVxuICAgIG55ID0gYS5yZWRNdWwoZykucmVkTXVsKGQucmVkU3ViKGMpKTtcbiAgICAvLyBaMyA9IGMgKiBGICogR1xuICAgIG56ID0gdGhpcy5jdXJ2ZS5fbXVsQyhmKS5yZWRNdWwoZyk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55LCBueik7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKHApIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiBwO1xuICBpZiAocC5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgaWYgKHRoaXMuY3VydmUuZXh0ZW5kZWQpXG4gICAgcmV0dXJuIHRoaXMuX2V4dEFkZChwKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLl9wcm9qQWRkKHApO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bChrKSB7XG4gIGlmICh0aGlzLl9oYXNEb3VibGVzKGspKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9maXhlZE5hZk11bCh0aGlzLCBrKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsIGspO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bEFkZCA9IGZ1bmN0aW9uIG11bEFkZChrMSwgcCwgazIpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSwgWyB0aGlzLCBwIF0sIFsgazEsIGsyIF0sIDIsIGZhbHNlKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5qbXVsQWRkID0gZnVuY3Rpb24gam11bEFkZChrMSwgcCwgazIpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSwgWyB0aGlzLCBwIF0sIFsgazEsIGsyIF0sIDIsIHRydWUpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIG5vcm1hbGl6ZSgpIHtcbiAgaWYgKHRoaXMuek9uZSlcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBOb3JtYWxpemUgY29vcmRpbmF0ZXNcbiAgdmFyIHppID0gdGhpcy56LnJlZEludm0oKTtcbiAgdGhpcy54ID0gdGhpcy54LnJlZE11bCh6aSk7XG4gIHRoaXMueSA9IHRoaXMueS5yZWRNdWwoemkpO1xuICBpZiAodGhpcy50KVxuICAgIHRoaXMudCA9IHRoaXMudC5yZWRNdWwoemkpO1xuICB0aGlzLnogPSB0aGlzLmN1cnZlLm9uZTtcbiAgdGhpcy56T25lID0gdHJ1ZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24gbmVnKCkge1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngucmVkTmVnKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnQgJiYgdGhpcy50LnJlZE5lZygpKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gZ2V0WCgpIHtcbiAgdGhpcy5ub3JtYWxpemUoKTtcbiAgcmV0dXJuIHRoaXMueC5mcm9tUmVkKCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WSA9IGZ1bmN0aW9uIGdldFkoKSB7XG4gIHRoaXMubm9ybWFsaXplKCk7XG4gIHJldHVybiB0aGlzLnkuZnJvbVJlZCgpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEob3RoZXIpIHtcbiAgcmV0dXJuIHRoaXMgPT09IG90aGVyIHx8XG4gICAgICAgICB0aGlzLmdldFgoKS5jbXAob3RoZXIuZ2V0WCgpKSA9PT0gMCAmJlxuICAgICAgICAgdGhpcy5nZXRZKCkuY21wKG90aGVyLmdldFkoKSkgPT09IDA7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXFYVG9QID0gZnVuY3Rpb24gZXFYVG9QKHgpIHtcbiAgdmFyIHJ4ID0geC50b1JlZCh0aGlzLmN1cnZlLnJlZCkucmVkTXVsKHRoaXMueik7XG4gIGlmICh0aGlzLnguY21wKHJ4KSA9PT0gMClcbiAgICByZXR1cm4gdHJ1ZTtcblxuICB2YXIgeGMgPSB4LmNsb25lKCk7XG4gIHZhciB0ID0gdGhpcy5jdXJ2ZS5yZWROLnJlZE11bCh0aGlzLnopO1xuICBmb3IgKDs7KSB7XG4gICAgeGMuaWFkZCh0aGlzLmN1cnZlLm4pO1xuICAgIGlmICh4Yy5jbXAodGhpcy5jdXJ2ZS5wKSA+PSAwKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgcngucmVkSUFkZCh0KTtcbiAgICBpZiAodGhpcy54LmNtcChyeCkgPT09IDApXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuLy8gQ29tcGF0aWJpbGl0eSB3aXRoIEJhc2VDdXJ2ZVxuUG9pbnQucHJvdG90eXBlLnRvUCA9IFBvaW50LnByb3RvdHlwZS5ub3JtYWxpemU7XG5Qb2ludC5wcm90b3R5cGUubWl4ZWRBZGQgPSBQb2ludC5wcm90b3R5cGUuYWRkO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3VydmUgPSBleHBvcnRzO1xuXG5jdXJ2ZS5iYXNlID0gcmVxdWlyZSgnLi9iYXNlJyk7XG5jdXJ2ZS5zaG9ydCA9IHJlcXVpcmUoJy4vc2hvcnQnKTtcbmN1cnZlLm1vbnQgPSByZXF1aXJlKCcuL21vbnQnKTtcbmN1cnZlLmVkd2FyZHMgPSByZXF1aXJlKCcuL2Vkd2FyZHMnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGN1cnZlID0gcmVxdWlyZSgnLi4vY3VydmUnKTtcbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xudmFyIEJhc2UgPSBjdXJ2ZS5iYXNlO1xuXG52YXIgZWxsaXB0aWMgPSByZXF1aXJlKCcuLi8uLi9lbGxpcHRpYycpO1xudmFyIHV0aWxzID0gZWxsaXB0aWMudXRpbHM7XG5cbmZ1bmN0aW9uIE1vbnRDdXJ2ZShjb25mKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCAnbW9udCcsIGNvbmYpO1xuXG4gIHRoaXMuYSA9IG5ldyBCTihjb25mLmEsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuYiA9IG5ldyBCTihjb25mLmIsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuaTQgPSBuZXcgQk4oNCkudG9SZWQodGhpcy5yZWQpLnJlZEludm0oKTtcbiAgdGhpcy50d28gPSBuZXcgQk4oMikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmEyNCA9IHRoaXMuaTQucmVkTXVsKHRoaXMuYS5yZWRBZGQodGhpcy50d28pKTtcbn1cbmluaGVyaXRzKE1vbnRDdXJ2ZSwgQmFzZSk7XG5tb2R1bGUuZXhwb3J0cyA9IE1vbnRDdXJ2ZTtcblxuTW9udEN1cnZlLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKHBvaW50KSB7XG4gIHZhciB4ID0gcG9pbnQubm9ybWFsaXplKCkueDtcbiAgdmFyIHgyID0geC5yZWRTcXIoKTtcbiAgdmFyIHJocyA9IHgyLnJlZE11bCh4KS5yZWRBZGQoeDIucmVkTXVsKHRoaXMuYSkpLnJlZEFkZCh4KTtcbiAgdmFyIHkgPSByaHMucmVkU3FydCgpO1xuXG4gIHJldHVybiB5LnJlZFNxcigpLmNtcChyaHMpID09PSAwO1xufTtcblxuZnVuY3Rpb24gUG9pbnQoY3VydmUsIHgsIHopIHtcbiAgQmFzZS5CYXNlUG9pbnQuY2FsbCh0aGlzLCBjdXJ2ZSwgJ3Byb2plY3RpdmUnKTtcbiAgaWYgKHggPT09IG51bGwgJiYgeiA9PT0gbnVsbCkge1xuICAgIHRoaXMueCA9IHRoaXMuY3VydmUub25lO1xuICAgIHRoaXMueiA9IHRoaXMuY3VydmUuemVybztcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnggPSBuZXcgQk4oeCwgMTYpO1xuICAgIHRoaXMueiA9IG5ldyBCTih6LCAxNik7XG4gICAgaWYgKCF0aGlzLngucmVkKVxuICAgICAgdGhpcy54ID0gdGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAoIXRoaXMuei5yZWQpXG4gICAgICB0aGlzLnogPSB0aGlzLnoudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICB9XG59XG5pbmhlcml0cyhQb2ludCwgQmFzZS5CYXNlUG9pbnQpO1xuXG5Nb250Q3VydmUucHJvdG90eXBlLmRlY29kZVBvaW50ID0gZnVuY3Rpb24gZGVjb2RlUG9pbnQoYnl0ZXMsIGVuYykge1xuICByZXR1cm4gdGhpcy5wb2ludCh1dGlscy50b0FycmF5KGJ5dGVzLCBlbmMpLCAxKTtcbn07XG5cbk1vbnRDdXJ2ZS5wcm90b3R5cGUucG9pbnQgPSBmdW5jdGlvbiBwb2ludCh4LCB6KSB7XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcywgeCwgeik7XG59O1xuXG5Nb250Q3VydmUucHJvdG90eXBlLnBvaW50RnJvbUpTT04gPSBmdW5jdGlvbiBwb2ludEZyb21KU09OKG9iaikge1xuICByZXR1cm4gUG9pbnQuZnJvbUpTT04odGhpcywgb2JqKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5wcmVjb21wdXRlID0gZnVuY3Rpb24gcHJlY29tcHV0ZSgpIHtcbiAgLy8gTm8tb3Bcbn07XG5cblBvaW50LnByb3RvdHlwZS5fZW5jb2RlID0gZnVuY3Rpb24gX2VuY29kZSgpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0WCgpLnRvQXJyYXkoJ2JlJywgdGhpcy5jdXJ2ZS5wLmJ5dGVMZW5ndGgoKSk7XG59O1xuXG5Qb2ludC5mcm9tSlNPTiA9IGZ1bmN0aW9uIGZyb21KU09OKGN1cnZlLCBvYmopIHtcbiAgcmV0dXJuIG5ldyBQb2ludChjdXJ2ZSwgb2JqWzBdLCBvYmpbMV0gfHwgY3VydmUub25lKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIFBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIFBvaW50IHg6ICcgKyB0aGlzLnguZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHo6ICcgKyB0aGlzLnouZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArICc+Jztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgLy8gWFhYIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgemVybyBpcyBhbHdheXMgemVybyBpbiByZWRcbiAgcmV0dXJuIHRoaXMuei5jbXBuKDApID09PSAwO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmRibCA9IGZ1bmN0aW9uIGRibCgpIHtcbiAgLy8gaHR0cDovL2h5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1tb250Z29tLXh6Lmh0bWwjZG91YmxpbmctZGJsLTE5ODctbS0zXG4gIC8vIDJNICsgMlMgKyA0QVxuXG4gIC8vIEEgPSBYMSArIFoxXG4gIHZhciBhID0gdGhpcy54LnJlZEFkZCh0aGlzLnopO1xuICAvLyBBQSA9IEFeMlxuICB2YXIgYWEgPSBhLnJlZFNxcigpO1xuICAvLyBCID0gWDEgLSBaMVxuICB2YXIgYiA9IHRoaXMueC5yZWRTdWIodGhpcy56KTtcbiAgLy8gQkIgPSBCXjJcbiAgdmFyIGJiID0gYi5yZWRTcXIoKTtcbiAgLy8gQyA9IEFBIC0gQkJcbiAgdmFyIGMgPSBhYS5yZWRTdWIoYmIpO1xuICAvLyBYMyA9IEFBICogQkJcbiAgdmFyIG54ID0gYWEucmVkTXVsKGJiKTtcbiAgLy8gWjMgPSBDICogKEJCICsgQTI0ICogQylcbiAgdmFyIG56ID0gYy5yZWRNdWwoYmIucmVkQWRkKHRoaXMuY3VydmUuYTI0LnJlZE11bChjKSkpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnopO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkIG9uIE1vbnRnb21lcnkgY3VydmUnKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kaWZmQWRkID0gZnVuY3Rpb24gZGlmZkFkZChwLCBkaWZmKSB7XG4gIC8vIGh0dHA6Ly9oeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tbW9udGdvbS14ei5odG1sI2RpZmZhZGQtZGFkZC0xOTg3LW0tM1xuICAvLyA0TSArIDJTICsgNkFcblxuICAvLyBBID0gWDIgKyBaMlxuICB2YXIgYSA9IHRoaXMueC5yZWRBZGQodGhpcy56KTtcbiAgLy8gQiA9IFgyIC0gWjJcbiAgdmFyIGIgPSB0aGlzLngucmVkU3ViKHRoaXMueik7XG4gIC8vIEMgPSBYMyArIFozXG4gIHZhciBjID0gcC54LnJlZEFkZChwLnopO1xuICAvLyBEID0gWDMgLSBaM1xuICB2YXIgZCA9IHAueC5yZWRTdWIocC56KTtcbiAgLy8gREEgPSBEICogQVxuICB2YXIgZGEgPSBkLnJlZE11bChhKTtcbiAgLy8gQ0IgPSBDICogQlxuICB2YXIgY2IgPSBjLnJlZE11bChiKTtcbiAgLy8gWDUgPSBaMSAqIChEQSArIENCKV4yXG4gIHZhciBueCA9IGRpZmYuei5yZWRNdWwoZGEucmVkQWRkKGNiKS5yZWRTcXIoKSk7XG4gIC8vIFo1ID0gWDEgKiAoREEgLSBDQileMlxuICB2YXIgbnogPSBkaWZmLngucmVkTXVsKGRhLnJlZElTdWIoY2IpLnJlZFNxcigpKTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG56KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwoaykge1xuICB2YXIgdCA9IGsuY2xvbmUoKTtcbiAgdmFyIGEgPSB0aGlzOyAvLyAoTiAvIDIpICogUSArIFFcbiAgdmFyIGIgPSB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpOyAvLyAoTiAvIDIpICogUVxuICB2YXIgYyA9IHRoaXM7IC8vIFFcblxuICBmb3IgKHZhciBiaXRzID0gW107IHQuY21wbigwKSAhPT0gMDsgdC5pdXNocm4oMSkpXG4gICAgYml0cy5wdXNoKHQuYW5kbG4oMSkpO1xuXG4gIGZvciAodmFyIGkgPSBiaXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGJpdHNbaV0gPT09IDApIHtcbiAgICAgIC8vIE4gKiBRICsgUSA9ICgoTiAvIDIpICogUSArIFEpKSArIChOIC8gMikgKiBRXG4gICAgICBhID0gYS5kaWZmQWRkKGIsIGMpO1xuICAgICAgLy8gTiAqIFEgPSAyICogKChOIC8gMikgKiBRICsgUSkpXG4gICAgICBiID0gYi5kYmwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTiAqIFEgPSAoKE4gLyAyKSAqIFEgKyBRKSArICgoTiAvIDIpICogUSlcbiAgICAgIGIgPSBhLmRpZmZBZGQoYiwgYyk7XG4gICAgICAvLyBOICogUSArIFEgPSAyICogKChOIC8gMikgKiBRICsgUSlcbiAgICAgIGEgPSBhLmRibCgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYjtcbn07XG5cblBvaW50LnByb3RvdHlwZS5tdWxBZGQgPSBmdW5jdGlvbiBtdWxBZGQoKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IHN1cHBvcnRlZCBvbiBNb250Z29tZXJ5IGN1cnZlJyk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuanVtbEFkZCA9IGZ1bmN0aW9uIGp1bWxBZGQoKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IHN1cHBvcnRlZCBvbiBNb250Z29tZXJ5IGN1cnZlJyk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcShvdGhlcikge1xuICByZXR1cm4gdGhpcy5nZXRYKCkuY21wKG90aGVyLmdldFgoKSkgPT09IDA7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKCkge1xuICB0aGlzLnggPSB0aGlzLngucmVkTXVsKHRoaXMuei5yZWRJbnZtKCkpO1xuICB0aGlzLnogPSB0aGlzLmN1cnZlLm9uZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WCA9IGZ1bmN0aW9uIGdldFgoKSB7XG4gIC8vIE5vcm1hbGl6ZSBjb29yZGluYXRlc1xuICB0aGlzLm5vcm1hbGl6ZSgpO1xuXG4gIHJldHVybiB0aGlzLnguZnJvbVJlZCgpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGN1cnZlID0gcmVxdWlyZSgnLi4vY3VydmUnKTtcbnZhciBlbGxpcHRpYyA9IHJlcXVpcmUoJy4uLy4uL2VsbGlwdGljJyk7XG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbnZhciBCYXNlID0gY3VydmUuYmFzZTtcblxudmFyIGFzc2VydCA9IGVsbGlwdGljLnV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gU2hvcnRDdXJ2ZShjb25mKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCAnc2hvcnQnLCBjb25mKTtcblxuICB0aGlzLmEgPSBuZXcgQk4oY29uZi5hLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmIgPSBuZXcgQk4oY29uZi5iLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLnRpbnYgPSB0aGlzLnR3by5yZWRJbnZtKCk7XG5cbiAgdGhpcy56ZXJvQSA9IHRoaXMuYS5mcm9tUmVkKCkuY21wbigwKSA9PT0gMDtcbiAgdGhpcy50aHJlZUEgPSB0aGlzLmEuZnJvbVJlZCgpLnN1Yih0aGlzLnApLmNtcG4oLTMpID09PSAwO1xuXG4gIC8vIElmIHRoZSBjdXJ2ZSBpcyBlbmRvbW9ycGhpYywgcHJlY2FsY3VsYXRlIGJldGEgYW5kIGxhbWJkYVxuICB0aGlzLmVuZG8gPSB0aGlzLl9nZXRFbmRvbW9ycGhpc20oY29uZik7XG4gIHRoaXMuX2VuZG9XbmFmVDEgPSBuZXcgQXJyYXkoNCk7XG4gIHRoaXMuX2VuZG9XbmFmVDIgPSBuZXcgQXJyYXkoNCk7XG59XG5pbmhlcml0cyhTaG9ydEN1cnZlLCBCYXNlKTtcbm1vZHVsZS5leHBvcnRzID0gU2hvcnRDdXJ2ZTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuX2dldEVuZG9tb3JwaGlzbSA9IGZ1bmN0aW9uIF9nZXRFbmRvbW9ycGhpc20oY29uZikge1xuICAvLyBObyBlZmZpY2llbnQgZW5kb21vcnBoaXNtXG4gIGlmICghdGhpcy56ZXJvQSB8fCAhdGhpcy5nIHx8ICF0aGlzLm4gfHwgdGhpcy5wLm1vZG4oMykgIT09IDEpXG4gICAgcmV0dXJuO1xuXG4gIC8vIENvbXB1dGUgYmV0YSBhbmQgbGFtYmRhLCB0aGF0IGxhbWJkYSAqIFAgPSAoYmV0YSAqIFB4OyBQeSlcbiAgdmFyIGJldGE7XG4gIHZhciBsYW1iZGE7XG4gIGlmIChjb25mLmJldGEpIHtcbiAgICBiZXRhID0gbmV3IEJOKGNvbmYuYmV0YSwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgYmV0YXMgPSB0aGlzLl9nZXRFbmRvUm9vdHModGhpcy5wKTtcbiAgICAvLyBDaG9vc2UgdGhlIHNtYWxsZXN0IGJldGFcbiAgICBiZXRhID0gYmV0YXNbMF0uY21wKGJldGFzWzFdKSA8IDAgPyBiZXRhc1swXSA6IGJldGFzWzFdO1xuICAgIGJldGEgPSBiZXRhLnRvUmVkKHRoaXMucmVkKTtcbiAgfVxuICBpZiAoY29uZi5sYW1iZGEpIHtcbiAgICBsYW1iZGEgPSBuZXcgQk4oY29uZi5sYW1iZGEsIDE2KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDaG9vc2UgdGhlIGxhbWJkYSB0aGF0IGlzIG1hdGNoaW5nIHNlbGVjdGVkIGJldGFcbiAgICB2YXIgbGFtYmRhcyA9IHRoaXMuX2dldEVuZG9Sb290cyh0aGlzLm4pO1xuICAgIGlmICh0aGlzLmcubXVsKGxhbWJkYXNbMF0pLnguY21wKHRoaXMuZy54LnJlZE11bChiZXRhKSkgPT09IDApIHtcbiAgICAgIGxhbWJkYSA9IGxhbWJkYXNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhbWJkYSA9IGxhbWJkYXNbMV07XG4gICAgICBhc3NlcnQodGhpcy5nLm11bChsYW1iZGEpLnguY21wKHRoaXMuZy54LnJlZE11bChiZXRhKSkgPT09IDApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEdldCBiYXNpcyB2ZWN0b3JzLCB1c2VkIGZvciBiYWxhbmNlZCBsZW5ndGgtdHdvIHJlcHJlc2VudGF0aW9uXG4gIHZhciBiYXNpcztcbiAgaWYgKGNvbmYuYmFzaXMpIHtcbiAgICBiYXNpcyA9IGNvbmYuYmFzaXMubWFwKGZ1bmN0aW9uKHZlYykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYTogbmV3IEJOKHZlYy5hLCAxNiksXG4gICAgICAgIGI6IG5ldyBCTih2ZWMuYiwgMTYpXG4gICAgICB9O1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGJhc2lzID0gdGhpcy5fZ2V0RW5kb0Jhc2lzKGxhbWJkYSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJldGE6IGJldGEsXG4gICAgbGFtYmRhOiBsYW1iZGEsXG4gICAgYmFzaXM6IGJhc2lzXG4gIH07XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZ2V0RW5kb1Jvb3RzID0gZnVuY3Rpb24gX2dldEVuZG9Sb290cyhudW0pIHtcbiAgLy8gRmluZCByb290cyBvZiBmb3IgeF4yICsgeCArIDEgaW4gRlxuICAvLyBSb290ID0gKC0xICstIFNxcnQoLTMpKSAvIDJcbiAgLy9cbiAgdmFyIHJlZCA9IG51bSA9PT0gdGhpcy5wID8gdGhpcy5yZWQgOiBCTi5tb250KG51bSk7XG4gIHZhciB0aW52ID0gbmV3IEJOKDIpLnRvUmVkKHJlZCkucmVkSW52bSgpO1xuICB2YXIgbnRpbnYgPSB0aW52LnJlZE5lZygpO1xuXG4gIHZhciBzID0gbmV3IEJOKDMpLnRvUmVkKHJlZCkucmVkTmVnKCkucmVkU3FydCgpLnJlZE11bCh0aW52KTtcblxuICB2YXIgbDEgPSBudGludi5yZWRBZGQocykuZnJvbVJlZCgpO1xuICB2YXIgbDIgPSBudGludi5yZWRTdWIocykuZnJvbVJlZCgpO1xuICByZXR1cm4gWyBsMSwgbDIgXTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLl9nZXRFbmRvQmFzaXMgPSBmdW5jdGlvbiBfZ2V0RW5kb0Jhc2lzKGxhbWJkYSkge1xuICAvLyBhcHJ4U3FydCA+PSBzcXJ0KHRoaXMubilcbiAgdmFyIGFwcnhTcXJ0ID0gdGhpcy5uLnVzaHJuKE1hdGguZmxvb3IodGhpcy5uLmJpdExlbmd0aCgpIC8gMikpO1xuXG4gIC8vIDMuNzRcbiAgLy8gUnVuIEVHQ0QsIHVudGlsIHIoTCArIDEpIDwgYXByeFNxcnRcbiAgdmFyIHUgPSBsYW1iZGE7XG4gIHZhciB2ID0gdGhpcy5uLmNsb25lKCk7XG4gIHZhciB4MSA9IG5ldyBCTigxKTtcbiAgdmFyIHkxID0gbmV3IEJOKDApO1xuICB2YXIgeDIgPSBuZXcgQk4oMCk7XG4gIHZhciB5MiA9IG5ldyBCTigxKTtcblxuICAvLyBOT1RFOiBhbGwgdmVjdG9ycyBhcmUgcm9vdHMgb2Y6IGEgKyBiICogbGFtYmRhID0gMCAobW9kIG4pXG4gIHZhciBhMDtcbiAgdmFyIGIwO1xuICAvLyBGaXJzdCB2ZWN0b3JcbiAgdmFyIGExO1xuICB2YXIgYjE7XG4gIC8vIFNlY29uZCB2ZWN0b3JcbiAgdmFyIGEyO1xuICB2YXIgYjI7XG5cbiAgdmFyIHByZXZSO1xuICB2YXIgaSA9IDA7XG4gIHZhciByO1xuICB2YXIgeDtcbiAgd2hpbGUgKHUuY21wbigwKSAhPT0gMCkge1xuICAgIHZhciBxID0gdi5kaXYodSk7XG4gICAgciA9IHYuc3ViKHEubXVsKHUpKTtcbiAgICB4ID0geDIuc3ViKHEubXVsKHgxKSk7XG4gICAgdmFyIHkgPSB5Mi5zdWIocS5tdWwoeTEpKTtcblxuICAgIGlmICghYTEgJiYgci5jbXAoYXByeFNxcnQpIDwgMCkge1xuICAgICAgYTAgPSBwcmV2Ui5uZWcoKTtcbiAgICAgIGIwID0geDE7XG4gICAgICBhMSA9IHIubmVnKCk7XG4gICAgICBiMSA9IHg7XG4gICAgfSBlbHNlIGlmIChhMSAmJiArK2kgPT09IDIpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBwcmV2UiA9IHI7XG5cbiAgICB2ID0gdTtcbiAgICB1ID0gcjtcbiAgICB4MiA9IHgxO1xuICAgIHgxID0geDtcbiAgICB5MiA9IHkxO1xuICAgIHkxID0geTtcbiAgfVxuICBhMiA9IHIubmVnKCk7XG4gIGIyID0geDtcblxuICB2YXIgbGVuMSA9IGExLnNxcigpLmFkZChiMS5zcXIoKSk7XG4gIHZhciBsZW4yID0gYTIuc3FyKCkuYWRkKGIyLnNxcigpKTtcbiAgaWYgKGxlbjIuY21wKGxlbjEpID49IDApIHtcbiAgICBhMiA9IGEwO1xuICAgIGIyID0gYjA7XG4gIH1cblxuICAvLyBOb3JtYWxpemUgc2lnbnNcbiAgaWYgKGExLm5lZ2F0aXZlKSB7XG4gICAgYTEgPSBhMS5uZWcoKTtcbiAgICBiMSA9IGIxLm5lZygpO1xuICB9XG4gIGlmIChhMi5uZWdhdGl2ZSkge1xuICAgIGEyID0gYTIubmVnKCk7XG4gICAgYjIgPSBiMi5uZWcoKTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgeyBhOiBhMSwgYjogYjEgfSxcbiAgICB7IGE6IGEyLCBiOiBiMiB9XG4gIF07XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZW5kb1NwbGl0ID0gZnVuY3Rpb24gX2VuZG9TcGxpdChrKSB7XG4gIHZhciBiYXNpcyA9IHRoaXMuZW5kby5iYXNpcztcbiAgdmFyIHYxID0gYmFzaXNbMF07XG4gIHZhciB2MiA9IGJhc2lzWzFdO1xuXG4gIHZhciBjMSA9IHYyLmIubXVsKGspLmRpdlJvdW5kKHRoaXMubik7XG4gIHZhciBjMiA9IHYxLmIubmVnKCkubXVsKGspLmRpdlJvdW5kKHRoaXMubik7XG5cbiAgdmFyIHAxID0gYzEubXVsKHYxLmEpO1xuICB2YXIgcDIgPSBjMi5tdWwodjIuYSk7XG4gIHZhciBxMSA9IGMxLm11bCh2MS5iKTtcbiAgdmFyIHEyID0gYzIubXVsKHYyLmIpO1xuXG4gIC8vIENhbGN1bGF0ZSBhbnN3ZXJcbiAgdmFyIGsxID0gay5zdWIocDEpLnN1YihwMik7XG4gIHZhciBrMiA9IHExLmFkZChxMikubmVnKCk7XG4gIHJldHVybiB7IGsxOiBrMSwgazI6IGsyIH07XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5wb2ludEZyb21YID0gZnVuY3Rpb24gcG9pbnRGcm9tWCh4LCBvZGQpIHtcbiAgeCA9IG5ldyBCTih4LCAxNik7XG4gIGlmICgheC5yZWQpXG4gICAgeCA9IHgudG9SZWQodGhpcy5yZWQpO1xuXG4gIHZhciB5MiA9IHgucmVkU3FyKCkucmVkTXVsKHgpLnJlZElBZGQoeC5yZWRNdWwodGhpcy5hKSkucmVkSUFkZCh0aGlzLmIpO1xuICB2YXIgeSA9IHkyLnJlZFNxcnQoKTtcbiAgaWYgKHkucmVkU3FyKCkucmVkU3ViKHkyKS5jbXAodGhpcy56ZXJvKSAhPT0gMClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcG9pbnQnKTtcblxuICAvLyBYWFggSXMgdGhlcmUgYW55IHdheSB0byB0ZWxsIGlmIHRoZSBudW1iZXIgaXMgb2RkIHdpdGhvdXQgY29udmVydGluZyBpdFxuICAvLyB0byBub24tcmVkIGZvcm0/XG4gIHZhciBpc09kZCA9IHkuZnJvbVJlZCgpLmlzT2RkKCk7XG4gIGlmIChvZGQgJiYgIWlzT2RkIHx8ICFvZGQgJiYgaXNPZGQpXG4gICAgeSA9IHkucmVkTmVnKCk7XG5cbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSk7XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKHBvaW50KSB7XG4gIGlmIChwb2ludC5pbmYpXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgdmFyIHggPSBwb2ludC54O1xuICB2YXIgeSA9IHBvaW50Lnk7XG5cbiAgdmFyIGF4ID0gdGhpcy5hLnJlZE11bCh4KTtcbiAgdmFyIHJocyA9IHgucmVkU3FyKCkucmVkTXVsKHgpLnJlZElBZGQoYXgpLnJlZElBZGQodGhpcy5iKTtcbiAgcmV0dXJuIHkucmVkU3FyKCkucmVkSVN1YihyaHMpLmNtcG4oMCkgPT09IDA7XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZW5kb1duYWZNdWxBZGQgPVxuICAgIGZ1bmN0aW9uIF9lbmRvV25hZk11bEFkZChwb2ludHMsIGNvZWZmcywgamFjb2JpYW5SZXN1bHQpIHtcbiAgdmFyIG5wb2ludHMgPSB0aGlzLl9lbmRvV25hZlQxO1xuICB2YXIgbmNvZWZmcyA9IHRoaXMuX2VuZG9XbmFmVDI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNwbGl0ID0gdGhpcy5fZW5kb1NwbGl0KGNvZWZmc1tpXSk7XG4gICAgdmFyIHAgPSBwb2ludHNbaV07XG4gICAgdmFyIGJldGEgPSBwLl9nZXRCZXRhKCk7XG5cbiAgICBpZiAoc3BsaXQuazEubmVnYXRpdmUpIHtcbiAgICAgIHNwbGl0LmsxLmluZWcoKTtcbiAgICAgIHAgPSBwLm5lZyh0cnVlKTtcbiAgICB9XG4gICAgaWYgKHNwbGl0LmsyLm5lZ2F0aXZlKSB7XG4gICAgICBzcGxpdC5rMi5pbmVnKCk7XG4gICAgICBiZXRhID0gYmV0YS5uZWcodHJ1ZSk7XG4gICAgfVxuXG4gICAgbnBvaW50c1tpICogMl0gPSBwO1xuICAgIG5wb2ludHNbaSAqIDIgKyAxXSA9IGJldGE7XG4gICAgbmNvZWZmc1tpICogMl0gPSBzcGxpdC5rMTtcbiAgICBuY29lZmZzW2kgKiAyICsgMV0gPSBzcGxpdC5rMjtcbiAgfVxuICB2YXIgcmVzID0gdGhpcy5fd25hZk11bEFkZCgxLCBucG9pbnRzLCBuY29lZmZzLCBpICogMiwgamFjb2JpYW5SZXN1bHQpO1xuXG4gIC8vIENsZWFuLXVwIHJlZmVyZW5jZXMgdG8gcG9pbnRzIGFuZCBjb2VmZmljaWVudHNcbiAgZm9yICh2YXIgaiA9IDA7IGogPCBpICogMjsgaisrKSB7XG4gICAgbnBvaW50c1tqXSA9IG51bGw7XG4gICAgbmNvZWZmc1tqXSA9IG51bGw7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5cbmZ1bmN0aW9uIFBvaW50KGN1cnZlLCB4LCB5LCBpc1JlZCkge1xuICBCYXNlLkJhc2VQb2ludC5jYWxsKHRoaXMsIGN1cnZlLCAnYWZmaW5lJyk7XG4gIGlmICh4ID09PSBudWxsICYmIHkgPT09IG51bGwpIHtcbiAgICB0aGlzLnggPSBudWxsO1xuICAgIHRoaXMueSA9IG51bGw7XG4gICAgdGhpcy5pbmYgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMueCA9IG5ldyBCTih4LCAxNik7XG4gICAgdGhpcy55ID0gbmV3IEJOKHksIDE2KTtcbiAgICAvLyBGb3JjZSByZWRnb21lcnkgcmVwcmVzZW50YXRpb24gd2hlbiBsb2FkaW5nIGZyb20gSlNPTlxuICAgIGlmIChpc1JlZCkge1xuICAgICAgdGhpcy54LmZvcmNlUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICAgIHRoaXMueS5mb3JjZVJlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgfVxuICAgIGlmICghdGhpcy54LnJlZClcbiAgICAgIHRoaXMueCA9IHRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgaWYgKCF0aGlzLnkucmVkKVxuICAgICAgdGhpcy55ID0gdGhpcy55LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICB0aGlzLmluZiA9IGZhbHNlO1xuICB9XG59XG5pbmhlcml0cyhQb2ludCwgQmFzZS5CYXNlUG9pbnQpO1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uIHBvaW50KHgsIHksIGlzUmVkKSB7XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcywgeCwgeSwgaXNSZWQpO1xufTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tSlNPTiA9IGZ1bmN0aW9uIHBvaW50RnJvbUpTT04ob2JqLCByZWQpIHtcbiAgcmV0dXJuIFBvaW50LmZyb21KU09OKHRoaXMsIG9iaiwgcmVkKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fZ2V0QmV0YSA9IGZ1bmN0aW9uIF9nZXRCZXRhKCkge1xuICBpZiAoIXRoaXMuY3VydmUuZW5kbylcbiAgICByZXR1cm47XG5cbiAgdmFyIHByZSA9IHRoaXMucHJlY29tcHV0ZWQ7XG4gIGlmIChwcmUgJiYgcHJlLmJldGEpXG4gICAgcmV0dXJuIHByZS5iZXRhO1xuXG4gIHZhciBiZXRhID0gdGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngucmVkTXVsKHRoaXMuY3VydmUuZW5kby5iZXRhKSwgdGhpcy55KTtcbiAgaWYgKHByZSkge1xuICAgIHZhciBjdXJ2ZSA9IHRoaXMuY3VydmU7XG4gICAgdmFyIGVuZG9NdWwgPSBmdW5jdGlvbihwKSB7XG4gICAgICByZXR1cm4gY3VydmUucG9pbnQocC54LnJlZE11bChjdXJ2ZS5lbmRvLmJldGEpLCBwLnkpO1xuICAgIH07XG4gICAgcHJlLmJldGEgPSBiZXRhO1xuICAgIGJldGEucHJlY29tcHV0ZWQgPSB7XG4gICAgICBiZXRhOiBudWxsLFxuICAgICAgbmFmOiBwcmUubmFmICYmIHtcbiAgICAgICAgd25kOiBwcmUubmFmLnduZCxcbiAgICAgICAgcG9pbnRzOiBwcmUubmFmLnBvaW50cy5tYXAoZW5kb011bClcbiAgICAgIH0sXG4gICAgICBkb3VibGVzOiBwcmUuZG91YmxlcyAmJiB7XG4gICAgICAgIHN0ZXA6IHByZS5kb3VibGVzLnN0ZXAsXG4gICAgICAgIHBvaW50czogcHJlLmRvdWJsZXMucG9pbnRzLm1hcChlbmRvTXVsKVxuICAgICAgfVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIGJldGE7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKCkge1xuICBpZiAoIXRoaXMucHJlY29tcHV0ZWQpXG4gICAgcmV0dXJuIFsgdGhpcy54LCB0aGlzLnkgXTtcblxuICByZXR1cm4gWyB0aGlzLngsIHRoaXMueSwgdGhpcy5wcmVjb21wdXRlZCAmJiB7XG4gICAgZG91YmxlczogdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzICYmIHtcbiAgICAgIHN0ZXA6IHRoaXMucHJlY29tcHV0ZWQuZG91Ymxlcy5zdGVwLFxuICAgICAgcG9pbnRzOiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMucG9pbnRzLnNsaWNlKDEpXG4gICAgfSxcbiAgICBuYWY6IHRoaXMucHJlY29tcHV0ZWQubmFmICYmIHtcbiAgICAgIHduZDogdGhpcy5wcmVjb21wdXRlZC5uYWYud25kLFxuICAgICAgcG9pbnRzOiB0aGlzLnByZWNvbXB1dGVkLm5hZi5wb2ludHMuc2xpY2UoMSlcbiAgICB9XG4gIH0gXTtcbn07XG5cblBvaW50LmZyb21KU09OID0gZnVuY3Rpb24gZnJvbUpTT04oY3VydmUsIG9iaiwgcmVkKSB7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJylcbiAgICBvYmogPSBKU09OLnBhcnNlKG9iaik7XG4gIHZhciByZXMgPSBjdXJ2ZS5wb2ludChvYmpbMF0sIG9ialsxXSwgcmVkKTtcbiAgaWYgKCFvYmpbMl0pXG4gICAgcmV0dXJuIHJlcztcblxuICBmdW5jdGlvbiBvYmoycG9pbnQob2JqKSB7XG4gICAgcmV0dXJuIGN1cnZlLnBvaW50KG9ialswXSwgb2JqWzFdLCByZWQpO1xuICB9XG5cbiAgdmFyIHByZSA9IG9ialsyXTtcbiAgcmVzLnByZWNvbXB1dGVkID0ge1xuICAgIGJldGE6IG51bGwsXG4gICAgZG91YmxlczogcHJlLmRvdWJsZXMgJiYge1xuICAgICAgc3RlcDogcHJlLmRvdWJsZXMuc3RlcCxcbiAgICAgIHBvaW50czogWyByZXMgXS5jb25jYXQocHJlLmRvdWJsZXMucG9pbnRzLm1hcChvYmoycG9pbnQpKVxuICAgIH0sXG4gICAgbmFmOiBwcmUubmFmICYmIHtcbiAgICAgIHduZDogcHJlLm5hZi53bmQsXG4gICAgICBwb2ludHM6IFsgcmVzIF0uY29uY2F0KHByZS5uYWYucG9pbnRzLm1hcChvYmoycG9pbnQpKVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHJlcztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIFBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIFBvaW50IHg6ICcgKyB0aGlzLnguZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHk6ICcgKyB0aGlzLnkuZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArICc+Jztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgcmV0dXJuIHRoaXMuaW5mO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZChwKSB7XG4gIC8vIE8gKyBQID0gUFxuICBpZiAodGhpcy5pbmYpXG4gICAgcmV0dXJuIHA7XG5cbiAgLy8gUCArIE8gPSBQXG4gIGlmIChwLmluZilcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBQICsgUCA9IDJQXG4gIGlmICh0aGlzLmVxKHApKVxuICAgIHJldHVybiB0aGlzLmRibCgpO1xuXG4gIC8vIFAgKyAoLVApID0gT1xuICBpZiAodGhpcy5uZWcoKS5lcShwKSlcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTtcblxuICAvLyBQICsgUSA9IE9cbiAgaWYgKHRoaXMueC5jbXAocC54KSA9PT0gMClcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTtcblxuICB2YXIgYyA9IHRoaXMueS5yZWRTdWIocC55KTtcbiAgaWYgKGMuY21wbigwKSAhPT0gMClcbiAgICBjID0gYy5yZWRNdWwodGhpcy54LnJlZFN1YihwLngpLnJlZEludm0oKSk7XG4gIHZhciBueCA9IGMucmVkU3FyKCkucmVkSVN1Yih0aGlzLngpLnJlZElTdWIocC54KTtcbiAgdmFyIG55ID0gYy5yZWRNdWwodGhpcy54LnJlZFN1YihueCkpLnJlZElTdWIodGhpcy55KTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kYmwgPSBmdW5jdGlvbiBkYmwoKSB7XG4gIGlmICh0aGlzLmluZilcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyAyUCA9IE9cbiAgdmFyIHlzMSA9IHRoaXMueS5yZWRBZGQodGhpcy55KTtcbiAgaWYgKHlzMS5jbXBuKDApID09PSAwKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpO1xuXG4gIHZhciBhID0gdGhpcy5jdXJ2ZS5hO1xuXG4gIHZhciB4MiA9IHRoaXMueC5yZWRTcXIoKTtcbiAgdmFyIGR5aW52ID0geXMxLnJlZEludm0oKTtcbiAgdmFyIGMgPSB4Mi5yZWRBZGQoeDIpLnJlZElBZGQoeDIpLnJlZElBZGQoYSkucmVkTXVsKGR5aW52KTtcblxuICB2YXIgbnggPSBjLnJlZFNxcigpLnJlZElTdWIodGhpcy54LnJlZEFkZCh0aGlzLngpKTtcbiAgdmFyIG55ID0gYy5yZWRNdWwodGhpcy54LnJlZFN1YihueCkpLnJlZElTdWIodGhpcy55KTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gZ2V0WCgpIHtcbiAgcmV0dXJuIHRoaXMueC5mcm9tUmVkKCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WSA9IGZ1bmN0aW9uIGdldFkoKSB7XG4gIHJldHVybiB0aGlzLnkuZnJvbVJlZCgpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bChrKSB7XG4gIGsgPSBuZXcgQk4oaywgMTYpO1xuXG4gIGlmICh0aGlzLl9oYXNEb3VibGVzKGspKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9maXhlZE5hZk11bCh0aGlzLCBrKTtcbiAgZWxzZSBpZiAodGhpcy5jdXJ2ZS5lbmRvKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9lbmRvV25hZk11bEFkZChbIHRoaXMgXSwgWyBrIF0pO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWwodGhpcywgayk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubXVsQWRkID0gZnVuY3Rpb24gbXVsQWRkKGsxLCBwMiwgazIpIHtcbiAgdmFyIHBvaW50cyA9IFsgdGhpcywgcDIgXTtcbiAgdmFyIGNvZWZmcyA9IFsgazEsIGsyIF07XG4gIGlmICh0aGlzLmN1cnZlLmVuZG8pXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX2VuZG9XbmFmTXVsQWRkKHBvaW50cywgY29lZmZzKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEsIHBvaW50cywgY29lZmZzLCAyKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5qbXVsQWRkID0gZnVuY3Rpb24gam11bEFkZChrMSwgcDIsIGsyKSB7XG4gIHZhciBwb2ludHMgPSBbIHRoaXMsIHAyIF07XG4gIHZhciBjb2VmZnMgPSBbIGsxLCBrMiBdO1xuICBpZiAodGhpcy5jdXJ2ZS5lbmRvKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9lbmRvV25hZk11bEFkZChwb2ludHMsIGNvZWZmcywgdHJ1ZSk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bEFkZCgxLCBwb2ludHMsIGNvZWZmcywgMiwgdHJ1ZSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcShwKSB7XG4gIHJldHVybiB0aGlzID09PSBwIHx8XG4gICAgICAgICB0aGlzLmluZiA9PT0gcC5pbmYgJiZcbiAgICAgICAgICAgICAodGhpcy5pbmYgfHwgdGhpcy54LmNtcChwLngpID09PSAwICYmIHRoaXMueS5jbXAocC55KSA9PT0gMCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24gbmVnKF9wcmVjb21wdXRlKSB7XG4gIGlmICh0aGlzLmluZilcbiAgICByZXR1cm4gdGhpcztcblxuICB2YXIgcmVzID0gdGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngsIHRoaXMueS5yZWROZWcoKSk7XG4gIGlmIChfcHJlY29tcHV0ZSAmJiB0aGlzLnByZWNvbXB1dGVkKSB7XG4gICAgdmFyIHByZSA9IHRoaXMucHJlY29tcHV0ZWQ7XG4gICAgdmFyIG5lZ2F0ZSA9IGZ1bmN0aW9uKHApIHtcbiAgICAgIHJldHVybiBwLm5lZygpO1xuICAgIH07XG4gICAgcmVzLnByZWNvbXB1dGVkID0ge1xuICAgICAgbmFmOiBwcmUubmFmICYmIHtcbiAgICAgICAgd25kOiBwcmUubmFmLnduZCxcbiAgICAgICAgcG9pbnRzOiBwcmUubmFmLnBvaW50cy5tYXAobmVnYXRlKVxuICAgICAgfSxcbiAgICAgIGRvdWJsZXM6IHByZS5kb3VibGVzICYmIHtcbiAgICAgICAgc3RlcDogcHJlLmRvdWJsZXMuc3RlcCxcbiAgICAgICAgcG9pbnRzOiBwcmUuZG91Ymxlcy5wb2ludHMubWFwKG5lZ2F0ZSlcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUudG9KID0gZnVuY3Rpb24gdG9KKCkge1xuICBpZiAodGhpcy5pbmYpXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuXG4gIHZhciByZXMgPSB0aGlzLmN1cnZlLmpwb2ludCh0aGlzLngsIHRoaXMueSwgdGhpcy5jdXJ2ZS5vbmUpO1xuICByZXR1cm4gcmVzO1xufTtcblxuZnVuY3Rpb24gSlBvaW50KGN1cnZlLCB4LCB5LCB6KSB7XG4gIEJhc2UuQmFzZVBvaW50LmNhbGwodGhpcywgY3VydmUsICdqYWNvYmlhbicpO1xuICBpZiAoeCA9PT0gbnVsbCAmJiB5ID09PSBudWxsICYmIHogPT09IG51bGwpIHtcbiAgICB0aGlzLnggPSB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnkgPSB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnogPSBuZXcgQk4oMCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy54ID0gbmV3IEJOKHgsIDE2KTtcbiAgICB0aGlzLnkgPSBuZXcgQk4oeSwgMTYpO1xuICAgIHRoaXMueiA9IG5ldyBCTih6LCAxNik7XG4gIH1cbiAgaWYgKCF0aGlzLngucmVkKVxuICAgIHRoaXMueCA9IHRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gIGlmICghdGhpcy55LnJlZClcbiAgICB0aGlzLnkgPSB0aGlzLnkudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICBpZiAoIXRoaXMuei5yZWQpXG4gICAgdGhpcy56ID0gdGhpcy56LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcblxuICB0aGlzLnpPbmUgPSB0aGlzLnogPT09IHRoaXMuY3VydmUub25lO1xufVxuaW5oZXJpdHMoSlBvaW50LCBCYXNlLkJhc2VQb2ludCk7XG5cblNob3J0Q3VydmUucHJvdG90eXBlLmpwb2ludCA9IGZ1bmN0aW9uIGpwb2ludCh4LCB5LCB6KSB7XG4gIHJldHVybiBuZXcgSlBvaW50KHRoaXMsIHgsIHksIHopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS50b1AgPSBmdW5jdGlvbiB0b1AoKSB7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTtcblxuICB2YXIgemludiA9IHRoaXMuei5yZWRJbnZtKCk7XG4gIHZhciB6aW52MiA9IHppbnYucmVkU3FyKCk7XG4gIHZhciBheCA9IHRoaXMueC5yZWRNdWwoemludjIpO1xuICB2YXIgYXkgPSB0aGlzLnkucmVkTXVsKHppbnYyKS5yZWRNdWwoemludik7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQoYXgsIGF5KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24gbmVnKCkge1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQodGhpcy54LCB0aGlzLnkucmVkTmVnKCksIHRoaXMueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZChwKSB7XG4gIC8vIE8gKyBQID0gUFxuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHA7XG5cbiAgLy8gUCArIE8gPSBQXG4gIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyAxMk0gKyA0UyArIDdBXG4gIHZhciBwejIgPSBwLnoucmVkU3FyKCk7XG4gIHZhciB6MiA9IHRoaXMuei5yZWRTcXIoKTtcbiAgdmFyIHUxID0gdGhpcy54LnJlZE11bChwejIpO1xuICB2YXIgdTIgPSBwLngucmVkTXVsKHoyKTtcbiAgdmFyIHMxID0gdGhpcy55LnJlZE11bChwejIucmVkTXVsKHAueikpO1xuICB2YXIgczIgPSBwLnkucmVkTXVsKHoyLnJlZE11bCh0aGlzLnopKTtcblxuICB2YXIgaCA9IHUxLnJlZFN1Yih1Mik7XG4gIHZhciByID0gczEucmVkU3ViKHMyKTtcbiAgaWYgKGguY21wbigwKSA9PT0gMCkge1xuICAgIGlmIChyLmNtcG4oMCkgIT09IDApXG4gICAgICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIHRoaXMuZGJsKCk7XG4gIH1cblxuICB2YXIgaDIgPSBoLnJlZFNxcigpO1xuICB2YXIgaDMgPSBoMi5yZWRNdWwoaCk7XG4gIHZhciB2ID0gdTEucmVkTXVsKGgyKTtcblxuICB2YXIgbnggPSByLnJlZFNxcigpLnJlZElBZGQoaDMpLnJlZElTdWIodikucmVkSVN1Yih2KTtcbiAgdmFyIG55ID0gci5yZWRNdWwodi5yZWRJU3ViKG54KSkucmVkSVN1YihzMS5yZWRNdWwoaDMpKTtcbiAgdmFyIG56ID0gdGhpcy56LnJlZE11bChwLnopLnJlZE11bChoKTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLm1peGVkQWRkID0gZnVuY3Rpb24gbWl4ZWRBZGQocCkge1xuICAvLyBPICsgUCA9IFBcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiBwLnRvSigpO1xuXG4gIC8vIFAgKyBPID0gUFxuICBpZiAocC5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gOE0gKyAzUyArIDdBXG4gIHZhciB6MiA9IHRoaXMuei5yZWRTcXIoKTtcbiAgdmFyIHUxID0gdGhpcy54O1xuICB2YXIgdTIgPSBwLngucmVkTXVsKHoyKTtcbiAgdmFyIHMxID0gdGhpcy55O1xuICB2YXIgczIgPSBwLnkucmVkTXVsKHoyKS5yZWRNdWwodGhpcy56KTtcblxuICB2YXIgaCA9IHUxLnJlZFN1Yih1Mik7XG4gIHZhciByID0gczEucmVkU3ViKHMyKTtcbiAgaWYgKGguY21wbigwKSA9PT0gMCkge1xuICAgIGlmIChyLmNtcG4oMCkgIT09IDApXG4gICAgICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIHRoaXMuZGJsKCk7XG4gIH1cblxuICB2YXIgaDIgPSBoLnJlZFNxcigpO1xuICB2YXIgaDMgPSBoMi5yZWRNdWwoaCk7XG4gIHZhciB2ID0gdTEucmVkTXVsKGgyKTtcblxuICB2YXIgbnggPSByLnJlZFNxcigpLnJlZElBZGQoaDMpLnJlZElTdWIodikucmVkSVN1Yih2KTtcbiAgdmFyIG55ID0gci5yZWRNdWwodi5yZWRJU3ViKG54KSkucmVkSVN1YihzMS5yZWRNdWwoaDMpKTtcbiAgdmFyIG56ID0gdGhpcy56LnJlZE11bChoKTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmRibHAgPSBmdW5jdGlvbiBkYmxwKHBvdykge1xuICBpZiAocG93ID09PSAwKVxuICAgIHJldHVybiB0aGlzO1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG4gIGlmICghcG93KVxuICAgIHJldHVybiB0aGlzLmRibCgpO1xuXG4gIGlmICh0aGlzLmN1cnZlLnplcm9BIHx8IHRoaXMuY3VydmUudGhyZWVBKSB7XG4gICAgdmFyIHIgPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG93OyBpKyspXG4gICAgICByID0gci5kYmwoKTtcbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIC8vIDFNICsgMlMgKyAxQSArIE4gKiAoNFMgKyA1TSArIDhBKVxuICAvLyBOID0gMSA9PiA2TSArIDZTICsgOUFcbiAgdmFyIGEgPSB0aGlzLmN1cnZlLmE7XG4gIHZhciB0aW52ID0gdGhpcy5jdXJ2ZS50aW52O1xuXG4gIHZhciBqeCA9IHRoaXMueDtcbiAgdmFyIGp5ID0gdGhpcy55O1xuICB2YXIganogPSB0aGlzLno7XG4gIHZhciBqejQgPSBqei5yZWRTcXIoKS5yZWRTcXIoKTtcblxuICAvLyBSZXVzZSByZXN1bHRzXG4gIHZhciBqeWQgPSBqeS5yZWRBZGQoankpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBvdzsgaSsrKSB7XG4gICAgdmFyIGp4MiA9IGp4LnJlZFNxcigpO1xuICAgIHZhciBqeWQyID0ganlkLnJlZFNxcigpO1xuICAgIHZhciBqeWQ0ID0ganlkMi5yZWRTcXIoKTtcbiAgICB2YXIgYyA9IGp4Mi5yZWRBZGQoangyKS5yZWRJQWRkKGp4MikucmVkSUFkZChhLnJlZE11bChqejQpKTtcblxuICAgIHZhciB0MSA9IGp4LnJlZE11bChqeWQyKTtcbiAgICB2YXIgbnggPSBjLnJlZFNxcigpLnJlZElTdWIodDEucmVkQWRkKHQxKSk7XG4gICAgdmFyIHQyID0gdDEucmVkSVN1YihueCk7XG4gICAgdmFyIGRueSA9IGMucmVkTXVsKHQyKTtcbiAgICBkbnkgPSBkbnkucmVkSUFkZChkbnkpLnJlZElTdWIoanlkNCk7XG4gICAgdmFyIG56ID0ganlkLnJlZE11bChqeik7XG4gICAgaWYgKGkgKyAxIDwgcG93KVxuICAgICAgano0ID0gano0LnJlZE11bChqeWQ0KTtcblxuICAgIGp4ID0gbng7XG4gICAganogPSBuejtcbiAgICBqeWQgPSBkbnk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQoangsIGp5ZC5yZWRNdWwodGludiksIGp6KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuZGJsID0gZnVuY3Rpb24gZGJsKCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgaWYgKHRoaXMuY3VydmUuemVyb0EpXG4gICAgcmV0dXJuIHRoaXMuX3plcm9EYmwoKTtcbiAgZWxzZSBpZiAodGhpcy5jdXJ2ZS50aHJlZUEpXG4gICAgcmV0dXJuIHRoaXMuX3RocmVlRGJsKCk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5fZGJsKCk7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLl96ZXJvRGJsID0gZnVuY3Rpb24gX3plcm9EYmwoKSB7XG4gIHZhciBueDtcbiAgdmFyIG55O1xuICB2YXIgbno7XG4gIC8vIFogPSAxXG4gIGlmICh0aGlzLnpPbmUpIHtcbiAgICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTAuaHRtbFxuICAgIC8vICAgICAjZG91YmxpbmctbWRibC0yMDA3LWJsXG4gICAgLy8gMU0gKyA1UyArIDE0QVxuXG4gICAgLy8gWFggPSBYMV4yXG4gICAgdmFyIHh4ID0gdGhpcy54LnJlZFNxcigpO1xuICAgIC8vIFlZID0gWTFeMlxuICAgIHZhciB5eSA9IHRoaXMueS5yZWRTcXIoKTtcbiAgICAvLyBZWVlZID0gWVleMlxuICAgIHZhciB5eXl5ID0geXkucmVkU3FyKCk7XG4gICAgLy8gUyA9IDIgKiAoKFgxICsgWVkpXjIgLSBYWCAtIFlZWVkpXG4gICAgdmFyIHMgPSB0aGlzLngucmVkQWRkKHl5KS5yZWRTcXIoKS5yZWRJU3ViKHh4KS5yZWRJU3ViKHl5eXkpO1xuICAgIHMgPSBzLnJlZElBZGQocyk7XG4gICAgLy8gTSA9IDMgKiBYWCArIGE7IGEgPSAwXG4gICAgdmFyIG0gPSB4eC5yZWRBZGQoeHgpLnJlZElBZGQoeHgpO1xuICAgIC8vIFQgPSBNIF4gMiAtIDIqU1xuICAgIHZhciB0ID0gbS5yZWRTcXIoKS5yZWRJU3ViKHMpLnJlZElTdWIocyk7XG5cbiAgICAvLyA4ICogWVlZWVxuICAgIHZhciB5eXl5OCA9IHl5eXkucmVkSUFkZCh5eXl5KTtcbiAgICB5eXl5OCA9IHl5eXk4LnJlZElBZGQoeXl5eTgpO1xuICAgIHl5eXk4ID0geXl5eTgucmVkSUFkZCh5eXl5OCk7XG5cbiAgICAvLyBYMyA9IFRcbiAgICBueCA9IHQ7XG4gICAgLy8gWTMgPSBNICogKFMgLSBUKSAtIDggKiBZWVlZXG4gICAgbnkgPSBtLnJlZE11bChzLnJlZElTdWIodCkpLnJlZElTdWIoeXl5eTgpO1xuICAgIC8vIFozID0gMipZMVxuICAgIG56ID0gdGhpcy55LnJlZEFkZCh0aGlzLnkpO1xuICB9IGVsc2Uge1xuICAgIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1zaG9ydHctamFjb2JpYW4tMC5odG1sXG4gICAgLy8gICAgICNkb3VibGluZy1kYmwtMjAwOS1sXG4gICAgLy8gMk0gKyA1UyArIDEzQVxuXG4gICAgLy8gQSA9IFgxXjJcbiAgICB2YXIgYSA9IHRoaXMueC5yZWRTcXIoKTtcbiAgICAvLyBCID0gWTFeMlxuICAgIHZhciBiID0gdGhpcy55LnJlZFNxcigpO1xuICAgIC8vIEMgPSBCXjJcbiAgICB2YXIgYyA9IGIucmVkU3FyKCk7XG4gICAgLy8gRCA9IDIgKiAoKFgxICsgQileMiAtIEEgLSBDKVxuICAgIHZhciBkID0gdGhpcy54LnJlZEFkZChiKS5yZWRTcXIoKS5yZWRJU3ViKGEpLnJlZElTdWIoYyk7XG4gICAgZCA9IGQucmVkSUFkZChkKTtcbiAgICAvLyBFID0gMyAqIEFcbiAgICB2YXIgZSA9IGEucmVkQWRkKGEpLnJlZElBZGQoYSk7XG4gICAgLy8gRiA9IEVeMlxuICAgIHZhciBmID0gZS5yZWRTcXIoKTtcblxuICAgIC8vIDggKiBDXG4gICAgdmFyIGM4ID0gYy5yZWRJQWRkKGMpO1xuICAgIGM4ID0gYzgucmVkSUFkZChjOCk7XG4gICAgYzggPSBjOC5yZWRJQWRkKGM4KTtcblxuICAgIC8vIFgzID0gRiAtIDIgKiBEXG4gICAgbnggPSBmLnJlZElTdWIoZCkucmVkSVN1YihkKTtcbiAgICAvLyBZMyA9IEUgKiAoRCAtIFgzKSAtIDggKiBDXG4gICAgbnkgPSBlLnJlZE11bChkLnJlZElTdWIobngpKS5yZWRJU3ViKGM4KTtcbiAgICAvLyBaMyA9IDIgKiBZMSAqIFoxXG4gICAgbnogPSB0aGlzLnkucmVkTXVsKHRoaXMueik7XG4gICAgbnogPSBuei5yZWRJQWRkKG56KTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuX3RocmVlRGJsID0gZnVuY3Rpb24gX3RocmVlRGJsKCkge1xuICB2YXIgbng7XG4gIHZhciBueTtcbiAgdmFyIG56O1xuICAvLyBaID0gMVxuICBpZiAodGhpcy56T25lKSB7XG4gICAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXNob3J0dy1qYWNvYmlhbi0zLmh0bWxcbiAgICAvLyAgICAgI2RvdWJsaW5nLW1kYmwtMjAwNy1ibFxuICAgIC8vIDFNICsgNVMgKyAxNUFcblxuICAgIC8vIFhYID0gWDFeMlxuICAgIHZhciB4eCA9IHRoaXMueC5yZWRTcXIoKTtcbiAgICAvLyBZWSA9IFkxXjJcbiAgICB2YXIgeXkgPSB0aGlzLnkucmVkU3FyKCk7XG4gICAgLy8gWVlZWSA9IFlZXjJcbiAgICB2YXIgeXl5eSA9IHl5LnJlZFNxcigpO1xuICAgIC8vIFMgPSAyICogKChYMSArIFlZKV4yIC0gWFggLSBZWVlZKVxuICAgIHZhciBzID0gdGhpcy54LnJlZEFkZCh5eSkucmVkU3FyKCkucmVkSVN1Yih4eCkucmVkSVN1Yih5eXl5KTtcbiAgICBzID0gcy5yZWRJQWRkKHMpO1xuICAgIC8vIE0gPSAzICogWFggKyBhXG4gICAgdmFyIG0gPSB4eC5yZWRBZGQoeHgpLnJlZElBZGQoeHgpLnJlZElBZGQodGhpcy5jdXJ2ZS5hKTtcbiAgICAvLyBUID0gTV4yIC0gMiAqIFNcbiAgICB2YXIgdCA9IG0ucmVkU3FyKCkucmVkSVN1YihzKS5yZWRJU3ViKHMpO1xuICAgIC8vIFgzID0gVFxuICAgIG54ID0gdDtcbiAgICAvLyBZMyA9IE0gKiAoUyAtIFQpIC0gOCAqIFlZWVlcbiAgICB2YXIgeXl5eTggPSB5eXl5LnJlZElBZGQoeXl5eSk7XG4gICAgeXl5eTggPSB5eXl5OC5yZWRJQWRkKHl5eXk4KTtcbiAgICB5eXl5OCA9IHl5eXk4LnJlZElBZGQoeXl5eTgpO1xuICAgIG55ID0gbS5yZWRNdWwocy5yZWRJU3ViKHQpKS5yZWRJU3ViKHl5eXk4KTtcbiAgICAvLyBaMyA9IDIgKiBZMVxuICAgIG56ID0gdGhpcy55LnJlZEFkZCh0aGlzLnkpO1xuICB9IGVsc2Uge1xuICAgIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1zaG9ydHctamFjb2JpYW4tMy5odG1sI2RvdWJsaW5nLWRibC0yMDAxLWJcbiAgICAvLyAzTSArIDVTXG5cbiAgICAvLyBkZWx0YSA9IFoxXjJcbiAgICB2YXIgZGVsdGEgPSB0aGlzLnoucmVkU3FyKCk7XG4gICAgLy8gZ2FtbWEgPSBZMV4yXG4gICAgdmFyIGdhbW1hID0gdGhpcy55LnJlZFNxcigpO1xuICAgIC8vIGJldGEgPSBYMSAqIGdhbW1hXG4gICAgdmFyIGJldGEgPSB0aGlzLngucmVkTXVsKGdhbW1hKTtcbiAgICAvLyBhbHBoYSA9IDMgKiAoWDEgLSBkZWx0YSkgKiAoWDEgKyBkZWx0YSlcbiAgICB2YXIgYWxwaGEgPSB0aGlzLngucmVkU3ViKGRlbHRhKS5yZWRNdWwodGhpcy54LnJlZEFkZChkZWx0YSkpO1xuICAgIGFscGhhID0gYWxwaGEucmVkQWRkKGFscGhhKS5yZWRJQWRkKGFscGhhKTtcbiAgICAvLyBYMyA9IGFscGhhXjIgLSA4ICogYmV0YVxuICAgIHZhciBiZXRhNCA9IGJldGEucmVkSUFkZChiZXRhKTtcbiAgICBiZXRhNCA9IGJldGE0LnJlZElBZGQoYmV0YTQpO1xuICAgIHZhciBiZXRhOCA9IGJldGE0LnJlZEFkZChiZXRhNCk7XG4gICAgbnggPSBhbHBoYS5yZWRTcXIoKS5yZWRJU3ViKGJldGE4KTtcbiAgICAvLyBaMyA9IChZMSArIFoxKV4yIC0gZ2FtbWEgLSBkZWx0YVxuICAgIG56ID0gdGhpcy55LnJlZEFkZCh0aGlzLnopLnJlZFNxcigpLnJlZElTdWIoZ2FtbWEpLnJlZElTdWIoZGVsdGEpO1xuICAgIC8vIFkzID0gYWxwaGEgKiAoNCAqIGJldGEgLSBYMykgLSA4ICogZ2FtbWFeMlxuICAgIHZhciBnZ2FtbWE4ID0gZ2FtbWEucmVkU3FyKCk7XG4gICAgZ2dhbW1hOCA9IGdnYW1tYTgucmVkSUFkZChnZ2FtbWE4KTtcbiAgICBnZ2FtbWE4ID0gZ2dhbW1hOC5yZWRJQWRkKGdnYW1tYTgpO1xuICAgIGdnYW1tYTggPSBnZ2FtbWE4LnJlZElBZGQoZ2dhbW1hOCk7XG4gICAgbnkgPSBhbHBoYS5yZWRNdWwoYmV0YTQucmVkSVN1YihueCkpLnJlZElTdWIoZ2dhbW1hOCk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLl9kYmwgPSBmdW5jdGlvbiBfZGJsKCkge1xuICB2YXIgYSA9IHRoaXMuY3VydmUuYTtcblxuICAvLyA0TSArIDZTICsgMTBBXG4gIHZhciBqeCA9IHRoaXMueDtcbiAgdmFyIGp5ID0gdGhpcy55O1xuICB2YXIganogPSB0aGlzLno7XG4gIHZhciBqejQgPSBqei5yZWRTcXIoKS5yZWRTcXIoKTtcblxuICB2YXIgangyID0gangucmVkU3FyKCk7XG4gIHZhciBqeTIgPSBqeS5yZWRTcXIoKTtcblxuICB2YXIgYyA9IGp4Mi5yZWRBZGQoangyKS5yZWRJQWRkKGp4MikucmVkSUFkZChhLnJlZE11bChqejQpKTtcblxuICB2YXIganhkNCA9IGp4LnJlZEFkZChqeCk7XG4gIGp4ZDQgPSBqeGQ0LnJlZElBZGQoanhkNCk7XG4gIHZhciB0MSA9IGp4ZDQucmVkTXVsKGp5Mik7XG4gIHZhciBueCA9IGMucmVkU3FyKCkucmVkSVN1Yih0MS5yZWRBZGQodDEpKTtcbiAgdmFyIHQyID0gdDEucmVkSVN1YihueCk7XG5cbiAgdmFyIGp5ZDggPSBqeTIucmVkU3FyKCk7XG4gIGp5ZDggPSBqeWQ4LnJlZElBZGQoanlkOCk7XG4gIGp5ZDggPSBqeWQ4LnJlZElBZGQoanlkOCk7XG4gIGp5ZDggPSBqeWQ4LnJlZElBZGQoanlkOCk7XG4gIHZhciBueSA9IGMucmVkTXVsKHQyKS5yZWRJU3ViKGp5ZDgpO1xuICB2YXIgbnogPSBqeS5yZWRBZGQoankpLnJlZE11bChqeik7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS50cnBsID0gZnVuY3Rpb24gdHJwbCgpIHtcbiAgaWYgKCF0aGlzLmN1cnZlLnplcm9BKVxuICAgIHJldHVybiB0aGlzLmRibCgpLmFkZCh0aGlzKTtcblxuICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTAuaHRtbCN0cmlwbGluZy10cGwtMjAwNy1ibFxuICAvLyA1TSArIDEwUyArIC4uLlxuXG4gIC8vIFhYID0gWDFeMlxuICB2YXIgeHggPSB0aGlzLngucmVkU3FyKCk7XG4gIC8vIFlZID0gWTFeMlxuICB2YXIgeXkgPSB0aGlzLnkucmVkU3FyKCk7XG4gIC8vIFpaID0gWjFeMlxuICB2YXIgenogPSB0aGlzLnoucmVkU3FyKCk7XG4gIC8vIFlZWVkgPSBZWV4yXG4gIHZhciB5eXl5ID0geXkucmVkU3FyKCk7XG4gIC8vIE0gPSAzICogWFggKyBhICogWloyOyBhID0gMFxuICB2YXIgbSA9IHh4LnJlZEFkZCh4eCkucmVkSUFkZCh4eCk7XG4gIC8vIE1NID0gTV4yXG4gIHZhciBtbSA9IG0ucmVkU3FyKCk7XG4gIC8vIEUgPSA2ICogKChYMSArIFlZKV4yIC0gWFggLSBZWVlZKSAtIE1NXG4gIHZhciBlID0gdGhpcy54LnJlZEFkZCh5eSkucmVkU3FyKCkucmVkSVN1Yih4eCkucmVkSVN1Yih5eXl5KTtcbiAgZSA9IGUucmVkSUFkZChlKTtcbiAgZSA9IGUucmVkQWRkKGUpLnJlZElBZGQoZSk7XG4gIGUgPSBlLnJlZElTdWIobW0pO1xuICAvLyBFRSA9IEVeMlxuICB2YXIgZWUgPSBlLnJlZFNxcigpO1xuICAvLyBUID0gMTYqWVlZWVxuICB2YXIgdCA9IHl5eXkucmVkSUFkZCh5eXl5KTtcbiAgdCA9IHQucmVkSUFkZCh0KTtcbiAgdCA9IHQucmVkSUFkZCh0KTtcbiAgdCA9IHQucmVkSUFkZCh0KTtcbiAgLy8gVSA9IChNICsgRSleMiAtIE1NIC0gRUUgLSBUXG4gIHZhciB1ID0gbS5yZWRJQWRkKGUpLnJlZFNxcigpLnJlZElTdWIobW0pLnJlZElTdWIoZWUpLnJlZElTdWIodCk7XG4gIC8vIFgzID0gNCAqIChYMSAqIEVFIC0gNCAqIFlZICogVSlcbiAgdmFyIHl5dTQgPSB5eS5yZWRNdWwodSk7XG4gIHl5dTQgPSB5eXU0LnJlZElBZGQoeXl1NCk7XG4gIHl5dTQgPSB5eXU0LnJlZElBZGQoeXl1NCk7XG4gIHZhciBueCA9IHRoaXMueC5yZWRNdWwoZWUpLnJlZElTdWIoeXl1NCk7XG4gIG54ID0gbngucmVkSUFkZChueCk7XG4gIG54ID0gbngucmVkSUFkZChueCk7XG4gIC8vIFkzID0gOCAqIFkxICogKFUgKiAoVCAtIFUpIC0gRSAqIEVFKVxuICB2YXIgbnkgPSB0aGlzLnkucmVkTXVsKHUucmVkTXVsKHQucmVkSVN1Yih1KSkucmVkSVN1YihlLnJlZE11bChlZSkpKTtcbiAgbnkgPSBueS5yZWRJQWRkKG55KTtcbiAgbnkgPSBueS5yZWRJQWRkKG55KTtcbiAgbnkgPSBueS5yZWRJQWRkKG55KTtcbiAgLy8gWjMgPSAoWjEgKyBFKV4yIC0gWlogLSBFRVxuICB2YXIgbnogPSB0aGlzLnoucmVkQWRkKGUpLnJlZFNxcigpLnJlZElTdWIoenopLnJlZElTdWIoZWUpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsKGssIGtiYXNlKSB7XG4gIGsgPSBuZXcgQk4oaywga2Jhc2UpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsIGspO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxKHApIHtcbiAgaWYgKHAudHlwZSA9PT0gJ2FmZmluZScpXG4gICAgcmV0dXJuIHRoaXMuZXEocC50b0ooKSk7XG5cbiAgaWYgKHRoaXMgPT09IHApXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgLy8geDEgKiB6Ml4yID09IHgyICogejFeMlxuICB2YXIgejIgPSB0aGlzLnoucmVkU3FyKCk7XG4gIHZhciBwejIgPSBwLnoucmVkU3FyKCk7XG4gIGlmICh0aGlzLngucmVkTXVsKHB6MikucmVkSVN1YihwLngucmVkTXVsKHoyKSkuY21wbigwKSAhPT0gMClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8geTEgKiB6Ml4zID09IHkyICogejFeM1xuICB2YXIgejMgPSB6Mi5yZWRNdWwodGhpcy56KTtcbiAgdmFyIHB6MyA9IHB6Mi5yZWRNdWwocC56KTtcbiAgcmV0dXJuIHRoaXMueS5yZWRNdWwocHozKS5yZWRJU3ViKHAueS5yZWRNdWwoejMpKS5jbXBuKDApID09PSAwO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5lcVhUb1AgPSBmdW5jdGlvbiBlcVhUb1AoeCkge1xuICB2YXIgenMgPSB0aGlzLnoucmVkU3FyKCk7XG4gIHZhciByeCA9IHgudG9SZWQodGhpcy5jdXJ2ZS5yZWQpLnJlZE11bCh6cyk7XG4gIGlmICh0aGlzLnguY21wKHJ4KSA9PT0gMClcbiAgICByZXR1cm4gdHJ1ZTtcblxuICB2YXIgeGMgPSB4LmNsb25lKCk7XG4gIHZhciB0ID0gdGhpcy5jdXJ2ZS5yZWROLnJlZE11bCh6cyk7XG4gIGZvciAoOzspIHtcbiAgICB4Yy5pYWRkKHRoaXMuY3VydmUubik7XG4gICAgaWYgKHhjLmNtcCh0aGlzLmN1cnZlLnApID49IDApXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICByeC5yZWRJQWRkKHQpO1xuICAgIGlmICh0aGlzLnguY21wKHJ4KSA9PT0gMClcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuICc8RUMgSlBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIEpQb2ludCB4OiAnICsgdGhpcy54LnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHk6ICcgKyB0aGlzLnkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgejogJyArIHRoaXMuei50b1N0cmluZygxNiwgMikgKyAnPic7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbiBpc0luZmluaXR5KCkge1xuICAvLyBYWFggVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB6ZXJvIGlzIGFsd2F5cyB6ZXJvIGluIHJlZFxuICByZXR1cm4gdGhpcy56LmNtcG4oMCkgPT09IDA7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3VydmVzID0gZXhwb3J0cztcblxudmFyIGhhc2ggPSByZXF1aXJlKCdoYXNoLmpzJyk7XG52YXIgZWxsaXB0aWMgPSByZXF1aXJlKCcuLi9lbGxpcHRpYycpO1xuXG52YXIgYXNzZXJ0ID0gZWxsaXB0aWMudXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBQcmVzZXRDdXJ2ZShvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zLnR5cGUgPT09ICdzaG9ydCcpXG4gICAgdGhpcy5jdXJ2ZSA9IG5ldyBlbGxpcHRpYy5jdXJ2ZS5zaG9ydChvcHRpb25zKTtcbiAgZWxzZSBpZiAob3B0aW9ucy50eXBlID09PSAnZWR3YXJkcycpXG4gICAgdGhpcy5jdXJ2ZSA9IG5ldyBlbGxpcHRpYy5jdXJ2ZS5lZHdhcmRzKG9wdGlvbnMpO1xuICBlbHNlXG4gICAgdGhpcy5jdXJ2ZSA9IG5ldyBlbGxpcHRpYy5jdXJ2ZS5tb250KG9wdGlvbnMpO1xuICB0aGlzLmcgPSB0aGlzLmN1cnZlLmc7XG4gIHRoaXMubiA9IHRoaXMuY3VydmUubjtcbiAgdGhpcy5oYXNoID0gb3B0aW9ucy5oYXNoO1xuXG4gIGFzc2VydCh0aGlzLmcudmFsaWRhdGUoKSwgJ0ludmFsaWQgY3VydmUnKTtcbiAgYXNzZXJ0KHRoaXMuZy5tdWwodGhpcy5uKS5pc0luZmluaXR5KCksICdJbnZhbGlkIGN1cnZlLCBHKk4gIT0gTycpO1xufVxuY3VydmVzLlByZXNldEN1cnZlID0gUHJlc2V0Q3VydmU7XG5cbmZ1bmN0aW9uIGRlZmluZUN1cnZlKG5hbWUsIG9wdGlvbnMpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1cnZlcywgbmFtZSwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgY3VydmUgPSBuZXcgUHJlc2V0Q3VydmUob3B0aW9ucyk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3VydmVzLCBuYW1lLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGN1cnZlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjdXJ2ZTtcbiAgICB9XG4gIH0pO1xufVxuXG5kZWZpbmVDdXJ2ZSgncDE5MicsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6ICdwMTkyJyxcbiAgcDogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmJyxcbiAgYTogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZjJyxcbiAgYjogJzY0MjEwNTE5IGU1OWM4MGU3IDBmYTdlOWFiIDcyMjQzMDQ5IGZlYjhkZWVjIGMxNDZiOWIxJyxcbiAgbjogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDk5ZGVmODM2IDE0NmJjOWIxIGI0ZDIyODMxJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzE4OGRhODBlIGIwMzA5MGY2IDdjYmYyMGViIDQzYTE4ODAwIGY0ZmYwYWZkIDgyZmYxMDEyJyxcbiAgICAnMDcxOTJiOTUgZmZjOGRhNzggNjMxMDExZWQgNmIyNGNkZDUgNzNmOTc3YTEgMWU3OTQ4MTEnXG4gIF1cbn0pO1xuXG5kZWZpbmVDdXJ2ZSgncDIyNCcsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6ICdwMjI0JyxcbiAgcDogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxJyxcbiAgYTogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlJyxcbiAgYjogJ2I0MDUwYTg1IDBjMDRiM2FiIGY1NDEzMjU2IDUwNDRiMGI3IGQ3YmZkOGJhIDI3MGIzOTQzIDIzNTVmZmI0JyxcbiAgbjogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmYxNmEyIGUwYjhmMDNlIDEzZGQyOTQ1IDVjNWMyYTNkJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJ2I3MGUwY2JkIDZiYjRiZjdmIDMyMTM5MGI5IDRhMDNjMWQzIDU2YzIxMTIyIDM0MzI4MGQ2IDExNWMxZDIxJyxcbiAgICAnYmQzNzYzODggYjVmNzIzZmIgNGMyMmRmZTYgY2Q0Mzc1YTAgNWEwNzQ3NjQgNDRkNTgxOTkgODUwMDdlMzQnXG4gIF1cbn0pO1xuXG5kZWZpbmVDdXJ2ZSgncDI1NicsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6IG51bGwsXG4gIHA6ICdmZmZmZmZmZiAwMDAwMDAwMSAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZicsXG4gIGE6ICdmZmZmZmZmZiAwMDAwMDAwMSAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmYycsXG4gIGI6ICc1YWM2MzVkOCBhYTNhOTNlNyBiM2ViYmQ1NSA3Njk4ODZiYyA2NTFkMDZiMCBjYzUzYjBmNiAzYmNlM2MzZSAyN2QyNjA0YicsXG4gIG46ICdmZmZmZmZmZiAwMDAwMDAwMCBmZmZmZmZmZiBmZmZmZmZmZiBiY2U2ZmFhZCBhNzE3OWU4NCBmM2I5Y2FjMiBmYzYzMjU1MScsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICc2YjE3ZDFmMiBlMTJjNDI0NyBmOGJjZTZlNSA2M2E0NDBmMiA3NzAzN2Q4MSAyZGViMzNhMCBmNGExMzk0NSBkODk4YzI5NicsXG4gICAgJzRmZTM0MmUyIGZlMWE3ZjliIDhlZTdlYjRhIDdjMGY5ZTE2IDJiY2UzMzU3IDZiMzE1ZWNlIGNiYjY0MDY4IDM3YmY1MWY1J1xuICBdXG59KTtcblxuZGVmaW5lQ3VydmUoJ3AzODQnLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiBudWxsLFxuICBwOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZSBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmZicsXG4gIGE6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZlIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZjJyxcbiAgYjogJ2IzMzEyZmE3IGUyM2VlN2U0IDk4OGUwNTZiIGUzZjgyZDE5IDE4MWQ5YzZlIGZlODE0MTEyIDAzMTQwODhmICcgK1xuICAgICAnNTAxMzg3NWEgYzY1NjM5OGQgOGEyZWQxOWQgMmE4NWM4ZWQgZDNlYzJhZWYnLFxuICBuOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgYzc2MzRkODEgJyArXG4gICAgICdmNDM3MmRkZiA1ODFhMGRiMiA0OGIwYTc3YSBlY2VjMTk2YSBjY2M1Mjk3MycsXG4gIGhhc2g6IGhhc2guc2hhMzg0LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICdhYTg3Y2EyMiBiZThiMDUzNyA4ZWIxYzcxZSBmMzIwYWQ3NCA2ZTFkM2I2MiA4YmE3OWI5OCA1OWY3NDFlMCA4MjU0MmEzOCAnICtcbiAgICAnNTUwMmYyNWQgYmY1NTI5NmMgM2E1NDVlMzggNzI3NjBhYjcnLFxuICAgICczNjE3ZGU0YSA5NjI2MmM2ZiA1ZDllOThiZiA5MjkyZGMyOSBmOGY0MWRiZCAyODlhMTQ3YyBlOWRhMzExMyBiNWYwYjhjMCAnICtcbiAgICAnMGE2MGIxY2UgMWQ3ZTgxOWQgN2E0MzFkN2MgOTBlYTBlNWYnXG4gIF1cbn0pO1xuXG5kZWZpbmVDdXJ2ZSgncDUyMScsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6IG51bGwsXG4gIHA6ICcwMDAwMDFmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYnLFxuICBhOiAnMDAwMDAxZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZjJyxcbiAgYjogJzAwMDAwMDUxIDk1M2ViOTYxIDhlMWM5YTFmIDkyOWEyMWEwIGI2ODU0MGVlIGEyZGE3MjViICcgK1xuICAgICAnOTliMzE1ZjMgYjhiNDg5OTEgOGVmMTA5ZTEgNTYxOTM5NTEgZWM3ZTkzN2IgMTY1MmMwYmQgJyArXG4gICAgICczYmIxYmYwNyAzNTczZGY4OCAzZDJjMzRmMSBlZjQ1MWZkNCA2YjUwM2YwMCcsXG4gIG46ICcwMDAwMDFmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZhIDUxODY4NzgzIGJmMmY5NjZiIDdmY2MwMTQ4ICcgK1xuICAgICAnZjcwOWE1ZDAgM2JiNWM5YjggODk5YzQ3YWUgYmI2ZmI3MWUgOTEzODY0MDknLFxuICBoYXNoOiBoYXNoLnNoYTUxMixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnMDAwMDAwYzYgODU4ZTA2YjcgMDQwNGU5Y2QgOWUzZWNiNjYgMjM5NWI0NDIgOWM2NDgxMzkgJyArXG4gICAgJzA1M2ZiNTIxIGY4MjhhZjYwIDZiNGQzZGJhIGExNGI1ZTc3IGVmZTc1OTI4IGZlMWRjMTI3ICcgK1xuICAgICdhMmZmYThkZSAzMzQ4YjNjMSA4NTZhNDI5YiBmOTdlN2UzMSBjMmU1YmQ2NicsXG4gICAgJzAwMDAwMTE4IDM5Mjk2YTc4IDlhM2JjMDA0IDVjOGE1ZmI0IDJjN2QxYmQ5IDk4ZjU0NDQ5ICcgK1xuICAgICc1NzliNDQ2OCAxN2FmYmQxNyAyNzNlNjYyYyA5N2VlNzI5OSA1ZWY0MjY0MCBjNTUwYjkwMSAnICtcbiAgICAnM2ZhZDA3NjEgMzUzYzcwODYgYTI3MmMyNDAgODhiZTk0NzYgOWZkMTY2NTAnXG4gIF1cbn0pO1xuXG5kZWZpbmVDdXJ2ZSgnY3VydmUyNTUxOScsIHtcbiAgdHlwZTogJ21vbnQnLFxuICBwcmltZTogJ3AyNTUxOScsXG4gIHA6ICc3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkJyxcbiAgYTogJzc2ZDA2JyxcbiAgYjogJzEnLFxuICBuOiAnMTAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIDE0ZGVmOWRlYTJmNzljZDYgNTgxMjYzMWE1Y2Y1ZDNlZCcsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICc5J1xuICBdXG59KTtcblxuZGVmaW5lQ3VydmUoJ2VkMjU1MTknLCB7XG4gIHR5cGU6ICdlZHdhcmRzJyxcbiAgcHJpbWU6ICdwMjU1MTknLFxuICBwOiAnN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZCcsXG4gIGE6ICctMScsXG4gIGM6ICcxJyxcbiAgLy8gLTEyMTY2NSAqICgxMjE2NjZeKC0xKSkgKG1vZCBQKVxuICBkOiAnNTIwMzZjZWUyYjZmZmU3MyA4Y2M3NDA3OTc3NzllODk4IDAwNzAwYTRkNDE0MWQ4YWIgNzVlYjRkY2ExMzU5NzhhMycsXG4gIG46ICcxMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgMTRkZWY5ZGVhMmY3OWNkNiA1ODEyNjMxYTVjZjVkM2VkJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzIxNjkzNmQzY2Q2ZTUzZmVjMGE0ZTIzMWZkZDZkYzVjNjkyY2M3NjA5NTI1YTdiMmM5NTYyZDYwOGYyNWQ1MWEnLFxuXG4gICAgLy8gNC81XG4gICAgJzY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NTgnXG4gIF1cbn0pO1xuXG52YXIgcHJlO1xudHJ5IHtcbiAgcHJlID0gcmVxdWlyZSgnLi9wcmVjb21wdXRlZC9zZWNwMjU2azEnKTtcbn0gY2F0Y2ggKGUpIHtcbiAgcHJlID0gdW5kZWZpbmVkO1xufVxuXG5kZWZpbmVDdXJ2ZSgnc2VjcDI1NmsxJywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogJ2syNTYnLFxuICBwOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZjMmYnLFxuICBhOiAnMCcsXG4gIGI6ICc3JyxcbiAgbjogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGJhYWVkY2U2IGFmNDhhMDNiIGJmZDI1ZThjIGQwMzY0MTQxJyxcbiAgaDogJzEnLFxuICBoYXNoOiBoYXNoLnNoYTI1NixcblxuICAvLyBQcmVjb21wdXRlZCBlbmRvbW9ycGhpc21cbiAgYmV0YTogJzdhZTk2YTJiNjU3YzA3MTA2ZTY0NDc5ZWFjMzQzNGU5OWNmMDQ5NzUxMmY1ODk5NWMxMzk2YzI4NzE5NTAxZWUnLFxuICBsYW1iZGE6ICc1MzYzYWQ0Y2MwNWMzMGUwYTUyNjFjMDI4ODEyNjQ1YTEyMmUyMmVhMjA4MTY2NzhkZjAyOTY3YzFiMjNiZDcyJyxcbiAgYmFzaXM6IFtcbiAgICB7XG4gICAgICBhOiAnMzA4NmQyMjFhN2Q0NmJjZGU4NmM5MGU0OTI4NGViMTUnLFxuICAgICAgYjogJy1lNDQzN2VkNjAxMGU4ODI4NmY1NDdmYTkwYWJmZTRjMydcbiAgICB9LFxuICAgIHtcbiAgICAgIGE6ICcxMTRjYTUwZjdhOGUyZjNmNjU3YzExMDhkOWQ0NGNmZDgnLFxuICAgICAgYjogJzMwODZkMjIxYTdkNDZiY2RlODZjOTBlNDkyODRlYjE1J1xuICAgIH1cbiAgXSxcblxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICc3OWJlNjY3ZWY5ZGNiYmFjNTVhMDYyOTVjZTg3MGIwNzAyOWJmY2RiMmRjZTI4ZDk1OWYyODE1YjE2ZjgxNzk4JyxcbiAgICAnNDgzYWRhNzcyNmEzYzQ2NTVkYTRmYmZjMGUxMTA4YThmZDE3YjQ0OGE2ODU1NDE5OWM0N2QwOGZmYjEwZDRiOCcsXG4gICAgcHJlXG4gIF1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIEhtYWNEUkJHID0gcmVxdWlyZSgnaG1hYy1kcmJnJyk7XG52YXIgZWxsaXB0aWMgPSByZXF1aXJlKCcuLi8uLi9lbGxpcHRpYycpO1xudmFyIHV0aWxzID0gZWxsaXB0aWMudXRpbHM7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG52YXIgS2V5UGFpciA9IHJlcXVpcmUoJy4va2V5Jyk7XG52YXIgU2lnbmF0dXJlID0gcmVxdWlyZSgnLi9zaWduYXR1cmUnKTtcblxuZnVuY3Rpb24gRUMob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRUMpKVxuICAgIHJldHVybiBuZXcgRUMob3B0aW9ucyk7XG5cbiAgLy8gU2hvcnRjdXQgYGVsbGlwdGljLmVjKGN1cnZlLW5hbWUpYFxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgYXNzZXJ0KGVsbGlwdGljLmN1cnZlcy5oYXNPd25Qcm9wZXJ0eShvcHRpb25zKSwgJ1Vua25vd24gY3VydmUgJyArIG9wdGlvbnMpO1xuXG4gICAgb3B0aW9ucyA9IGVsbGlwdGljLmN1cnZlc1tvcHRpb25zXTtcbiAgfVxuXG4gIC8vIFNob3J0Y3V0IGZvciBgZWxsaXB0aWMuZWMoZWxsaXB0aWMuY3VydmVzLmN1cnZlTmFtZSlgXG4gIGlmIChvcHRpb25zIGluc3RhbmNlb2YgZWxsaXB0aWMuY3VydmVzLlByZXNldEN1cnZlKVxuICAgIG9wdGlvbnMgPSB7IGN1cnZlOiBvcHRpb25zIH07XG5cbiAgdGhpcy5jdXJ2ZSA9IG9wdGlvbnMuY3VydmUuY3VydmU7XG4gIHRoaXMubiA9IHRoaXMuY3VydmUubjtcbiAgdGhpcy5uaCA9IHRoaXMubi51c2hybigxKTtcbiAgdGhpcy5nID0gdGhpcy5jdXJ2ZS5nO1xuXG4gIC8vIFBvaW50IG9uIGN1cnZlXG4gIHRoaXMuZyA9IG9wdGlvbnMuY3VydmUuZztcbiAgdGhpcy5nLnByZWNvbXB1dGUob3B0aW9ucy5jdXJ2ZS5uLmJpdExlbmd0aCgpICsgMSk7XG5cbiAgLy8gSGFzaCBmb3IgZnVuY3Rpb24gZm9yIERSQkdcbiAgdGhpcy5oYXNoID0gb3B0aW9ucy5oYXNoIHx8IG9wdGlvbnMuY3VydmUuaGFzaDtcbn1cbm1vZHVsZS5leHBvcnRzID0gRUM7XG5cbkVDLnByb3RvdHlwZS5rZXlQYWlyID0gZnVuY3Rpb24ga2V5UGFpcihvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgS2V5UGFpcih0aGlzLCBvcHRpb25zKTtcbn07XG5cbkVDLnByb3RvdHlwZS5rZXlGcm9tUHJpdmF0ZSA9IGZ1bmN0aW9uIGtleUZyb21Qcml2YXRlKHByaXYsIGVuYykge1xuICByZXR1cm4gS2V5UGFpci5mcm9tUHJpdmF0ZSh0aGlzLCBwcml2LCBlbmMpO1xufTtcblxuRUMucHJvdG90eXBlLmtleUZyb21QdWJsaWMgPSBmdW5jdGlvbiBrZXlGcm9tUHVibGljKHB1YiwgZW5jKSB7XG4gIHJldHVybiBLZXlQYWlyLmZyb21QdWJsaWModGhpcywgcHViLCBlbmMpO1xufTtcblxuRUMucHJvdG90eXBlLmdlbktleVBhaXIgPSBmdW5jdGlvbiBnZW5LZXlQYWlyKG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKVxuICAgIG9wdGlvbnMgPSB7fTtcblxuICAvLyBJbnN0YW50aWF0ZSBIbWFjX0RSQkdcbiAgdmFyIGRyYmcgPSBuZXcgSG1hY0RSQkcoe1xuICAgIGhhc2g6IHRoaXMuaGFzaCxcbiAgICBwZXJzOiBvcHRpb25zLnBlcnMsXG4gICAgcGVyc0VuYzogb3B0aW9ucy5wZXJzRW5jIHx8ICd1dGY4JyxcbiAgICBlbnRyb3B5OiBvcHRpb25zLmVudHJvcHkgfHwgZWxsaXB0aWMucmFuZCh0aGlzLmhhc2guaG1hY1N0cmVuZ3RoKSxcbiAgICBlbnRyb3B5RW5jOiBvcHRpb25zLmVudHJvcHkgJiYgb3B0aW9ucy5lbnRyb3B5RW5jIHx8ICd1dGY4JyxcbiAgICBub25jZTogdGhpcy5uLnRvQXJyYXkoKVxuICB9KTtcblxuICB2YXIgYnl0ZXMgPSB0aGlzLm4uYnl0ZUxlbmd0aCgpO1xuICB2YXIgbnMyID0gdGhpcy5uLnN1YihuZXcgQk4oMikpO1xuICBkbyB7XG4gICAgdmFyIHByaXYgPSBuZXcgQk4oZHJiZy5nZW5lcmF0ZShieXRlcykpO1xuICAgIGlmIChwcml2LmNtcChuczIpID4gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgcHJpdi5pYWRkbigxKTtcbiAgICByZXR1cm4gdGhpcy5rZXlGcm9tUHJpdmF0ZShwcml2KTtcbiAgfSB3aGlsZSAodHJ1ZSk7XG59O1xuXG5FQy5wcm90b3R5cGUuX3RydW5jYXRlVG9OID0gZnVuY3Rpb24gdHJ1bmNhdGVUb04obXNnLCB0cnVuY09ubHkpIHtcbiAgdmFyIGRlbHRhID0gbXNnLmJ5dGVMZW5ndGgoKSAqIDggLSB0aGlzLm4uYml0TGVuZ3RoKCk7XG4gIGlmIChkZWx0YSA+IDApXG4gICAgbXNnID0gbXNnLnVzaHJuKGRlbHRhKTtcbiAgaWYgKCF0cnVuY09ubHkgJiYgbXNnLmNtcCh0aGlzLm4pID49IDApXG4gICAgcmV0dXJuIG1zZy5zdWIodGhpcy5uKTtcbiAgZWxzZVxuICAgIHJldHVybiBtc2c7XG59O1xuXG5FQy5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obXNnLCBrZXksIGVuYywgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGVuYyA9PT0gJ29iamVjdCcpIHtcbiAgICBvcHRpb25zID0gZW5jO1xuICAgIGVuYyA9IG51bGw7XG4gIH1cbiAgaWYgKCFvcHRpb25zKVxuICAgIG9wdGlvbnMgPSB7fTtcblxuICBrZXkgPSB0aGlzLmtleUZyb21Qcml2YXRlKGtleSwgZW5jKTtcbiAgbXNnID0gdGhpcy5fdHJ1bmNhdGVUb04obmV3IEJOKG1zZywgMTYpKTtcblxuICAvLyBaZXJvLWV4dGVuZCBrZXkgdG8gcHJvdmlkZSBlbm91Z2ggZW50cm9weVxuICB2YXIgYnl0ZXMgPSB0aGlzLm4uYnl0ZUxlbmd0aCgpO1xuICB2YXIgYmtleSA9IGtleS5nZXRQcml2YXRlKCkudG9BcnJheSgnYmUnLCBieXRlcyk7XG5cbiAgLy8gWmVyby1leHRlbmQgbm9uY2UgdG8gaGF2ZSB0aGUgc2FtZSBieXRlIHNpemUgYXMgTlxuICB2YXIgbm9uY2UgPSBtc2cudG9BcnJheSgnYmUnLCBieXRlcyk7XG5cbiAgLy8gSW5zdGFudGlhdGUgSG1hY19EUkJHXG4gIHZhciBkcmJnID0gbmV3IEhtYWNEUkJHKHtcbiAgICBoYXNoOiB0aGlzLmhhc2gsXG4gICAgZW50cm9weTogYmtleSxcbiAgICBub25jZTogbm9uY2UsXG4gICAgcGVyczogb3B0aW9ucy5wZXJzLFxuICAgIHBlcnNFbmM6IG9wdGlvbnMucGVyc0VuYyB8fCAndXRmOCdcbiAgfSk7XG5cbiAgLy8gTnVtYmVyIG9mIGJ5dGVzIHRvIGdlbmVyYXRlXG4gIHZhciBuczEgPSB0aGlzLm4uc3ViKG5ldyBCTigxKSk7XG5cbiAgZm9yICh2YXIgaXRlciA9IDA7IHRydWU7IGl0ZXIrKykge1xuICAgIHZhciBrID0gb3B0aW9ucy5rID9cbiAgICAgICAgb3B0aW9ucy5rKGl0ZXIpIDpcbiAgICAgICAgbmV3IEJOKGRyYmcuZ2VuZXJhdGUodGhpcy5uLmJ5dGVMZW5ndGgoKSkpO1xuICAgIGsgPSB0aGlzLl90cnVuY2F0ZVRvTihrLCB0cnVlKTtcbiAgICBpZiAoay5jbXBuKDEpIDw9IDAgfHwgay5jbXAobnMxKSA+PSAwKVxuICAgICAgY29udGludWU7XG5cbiAgICB2YXIga3AgPSB0aGlzLmcubXVsKGspO1xuICAgIGlmIChrcC5pc0luZmluaXR5KCkpXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciBrcFggPSBrcC5nZXRYKCk7XG4gICAgdmFyIHIgPSBrcFgudW1vZCh0aGlzLm4pO1xuICAgIGlmIChyLmNtcG4oMCkgPT09IDApXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciBzID0gay5pbnZtKHRoaXMubikubXVsKHIubXVsKGtleS5nZXRQcml2YXRlKCkpLmlhZGQobXNnKSk7XG4gICAgcyA9IHMudW1vZCh0aGlzLm4pO1xuICAgIGlmIChzLmNtcG4oMCkgPT09IDApXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciByZWNvdmVyeVBhcmFtID0gKGtwLmdldFkoKS5pc09kZCgpID8gMSA6IDApIHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChrcFguY21wKHIpICE9PSAwID8gMiA6IDApO1xuXG4gICAgLy8gVXNlIGNvbXBsZW1lbnQgb2YgYHNgLCBpZiBpdCBpcyA+IGBuIC8gMmBcbiAgICBpZiAob3B0aW9ucy5jYW5vbmljYWwgJiYgcy5jbXAodGhpcy5uaCkgPiAwKSB7XG4gICAgICBzID0gdGhpcy5uLnN1YihzKTtcbiAgICAgIHJlY292ZXJ5UGFyYW0gXj0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFNpZ25hdHVyZSh7IHI6IHIsIHM6IHMsIHJlY292ZXJ5UGFyYW06IHJlY292ZXJ5UGFyYW0gfSk7XG4gIH1cbn07XG5cbkVDLnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiB2ZXJpZnkobXNnLCBzaWduYXR1cmUsIGtleSwgZW5jKSB7XG4gIG1zZyA9IHRoaXMuX3RydW5jYXRlVG9OKG5ldyBCTihtc2csIDE2KSk7XG4gIGtleSA9IHRoaXMua2V5RnJvbVB1YmxpYyhrZXksIGVuYyk7XG4gIHNpZ25hdHVyZSA9IG5ldyBTaWduYXR1cmUoc2lnbmF0dXJlLCAnaGV4Jyk7XG5cbiAgLy8gUGVyZm9ybSBwcmltaXRpdmUgdmFsdWVzIHZhbGlkYXRpb25cbiAgdmFyIHIgPSBzaWduYXR1cmUucjtcbiAgdmFyIHMgPSBzaWduYXR1cmUucztcbiAgaWYgKHIuY21wbigxKSA8IDAgfHwgci5jbXAodGhpcy5uKSA+PSAwKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKHMuY21wbigxKSA8IDAgfHwgcy5jbXAodGhpcy5uKSA+PSAwKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBWYWxpZGF0ZSBzaWduYXR1cmVcbiAgdmFyIHNpbnYgPSBzLmludm0odGhpcy5uKTtcbiAgdmFyIHUxID0gc2ludi5tdWwobXNnKS51bW9kKHRoaXMubik7XG4gIHZhciB1MiA9IHNpbnYubXVsKHIpLnVtb2QodGhpcy5uKTtcblxuICBpZiAoIXRoaXMuY3VydmUuX21heHdlbGxUcmljaykge1xuICAgIHZhciBwID0gdGhpcy5nLm11bEFkZCh1MSwga2V5LmdldFB1YmxpYygpLCB1Mik7XG4gICAgaWYgKHAuaXNJbmZpbml0eSgpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIHAuZ2V0WCgpLnVtb2QodGhpcy5uKS5jbXAocikgPT09IDA7XG4gIH1cblxuICAvLyBOT1RFOiBHcmVnIE1heHdlbGwncyB0cmljaywgaW5zcGlyZWQgYnk6XG4gIC8vIGh0dHBzOi8vZ2l0LmlvL3ZhZDNLXG5cbiAgdmFyIHAgPSB0aGlzLmcuam11bEFkZCh1MSwga2V5LmdldFB1YmxpYygpLCB1Mik7XG4gIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gQ29tcGFyZSBgcC54YCBvZiBKYWNvYmlhbiBwb2ludCB3aXRoIGByYCxcbiAgLy8gdGhpcyB3aWxsIGRvIGBwLnggPT0gciAqIHAuel4yYCBpbnN0ZWFkIG9mIG11bHRpcGx5aW5nIGBwLnhgIGJ5IHRoZVxuICAvLyBpbnZlcnNlIG9mIGBwLnpeMmBcbiAgcmV0dXJuIHAuZXFYVG9QKHIpO1xufTtcblxuRUMucHJvdG90eXBlLnJlY292ZXJQdWJLZXkgPSBmdW5jdGlvbihtc2csIHNpZ25hdHVyZSwgaiwgZW5jKSB7XG4gIGFzc2VydCgoMyAmIGopID09PSBqLCAnVGhlIHJlY292ZXJ5IHBhcmFtIGlzIG1vcmUgdGhhbiB0d28gYml0cycpO1xuICBzaWduYXR1cmUgPSBuZXcgU2lnbmF0dXJlKHNpZ25hdHVyZSwgZW5jKTtcblxuICB2YXIgbiA9IHRoaXMubjtcbiAgdmFyIGUgPSBuZXcgQk4obXNnKTtcbiAgdmFyIHIgPSBzaWduYXR1cmUucjtcbiAgdmFyIHMgPSBzaWduYXR1cmUucztcblxuICAvLyBBIHNldCBMU0Igc2lnbmlmaWVzIHRoYXQgdGhlIHktY29vcmRpbmF0ZSBpcyBvZGRcbiAgdmFyIGlzWU9kZCA9IGogJiAxO1xuICB2YXIgaXNTZWNvbmRLZXkgPSBqID4+IDE7XG4gIGlmIChyLmNtcCh0aGlzLmN1cnZlLnAudW1vZCh0aGlzLmN1cnZlLm4pKSA+PSAwICYmIGlzU2Vjb25kS2V5KVxuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgc2VuY29uZCBrZXkgY2FuZGluYXRlJyk7XG5cbiAgLy8gMS4xLiBMZXQgeCA9IHIgKyBqbi5cbiAgaWYgKGlzU2Vjb25kS2V5KVxuICAgIHIgPSB0aGlzLmN1cnZlLnBvaW50RnJvbVgoci5hZGQodGhpcy5jdXJ2ZS5uKSwgaXNZT2RkKTtcbiAgZWxzZVxuICAgIHIgPSB0aGlzLmN1cnZlLnBvaW50RnJvbVgociwgaXNZT2RkKTtcblxuICB2YXIgckludiA9IHNpZ25hdHVyZS5yLmludm0obik7XG4gIHZhciBzMSA9IG4uc3ViKGUpLm11bChySW52KS51bW9kKG4pO1xuICB2YXIgczIgPSBzLm11bChySW52KS51bW9kKG4pO1xuXG4gIC8vIDEuNi4xIENvbXB1dGUgUSA9IHJeLTEgKHNSIC0gIGVHKVxuICAvLyAgICAgICAgICAgICAgIFEgPSByXi0xIChzUiArIC1lRylcbiAgcmV0dXJuIHRoaXMuZy5tdWxBZGQoczEsIHIsIHMyKTtcbn07XG5cbkVDLnByb3RvdHlwZS5nZXRLZXlSZWNvdmVyeVBhcmFtID0gZnVuY3Rpb24oZSwgc2lnbmF0dXJlLCBRLCBlbmMpIHtcbiAgc2lnbmF0dXJlID0gbmV3IFNpZ25hdHVyZShzaWduYXR1cmUsIGVuYyk7XG4gIGlmIChzaWduYXR1cmUucmVjb3ZlcnlQYXJhbSAhPT0gbnVsbClcbiAgICByZXR1cm4gc2lnbmF0dXJlLnJlY292ZXJ5UGFyYW07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICB2YXIgUXByaW1lO1xuICAgIHRyeSB7XG4gICAgICBRcHJpbWUgPSB0aGlzLnJlY292ZXJQdWJLZXkoZSwgc2lnbmF0dXJlLCBpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoUXByaW1lLmVxKFEpKVxuICAgICAgcmV0dXJuIGk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCB2YWxpZCByZWNvdmVyeSBmYWN0b3InKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgZWxsaXB0aWMgPSByZXF1aXJlKCcuLi8uLi9lbGxpcHRpYycpO1xudmFyIHV0aWxzID0gZWxsaXB0aWMudXRpbHM7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBLZXlQYWlyKGVjLCBvcHRpb25zKSB7XG4gIHRoaXMuZWMgPSBlYztcbiAgdGhpcy5wcml2ID0gbnVsbDtcbiAgdGhpcy5wdWIgPSBudWxsO1xuXG4gIC8vIEtleVBhaXIoZWMsIHsgcHJpdjogLi4uLCBwdWI6IC4uLiB9KVxuICBpZiAob3B0aW9ucy5wcml2KVxuICAgIHRoaXMuX2ltcG9ydFByaXZhdGUob3B0aW9ucy5wcml2LCBvcHRpb25zLnByaXZFbmMpO1xuICBpZiAob3B0aW9ucy5wdWIpXG4gICAgdGhpcy5faW1wb3J0UHVibGljKG9wdGlvbnMucHViLCBvcHRpb25zLnB1YkVuYyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEtleVBhaXI7XG5cbktleVBhaXIuZnJvbVB1YmxpYyA9IGZ1bmN0aW9uIGZyb21QdWJsaWMoZWMsIHB1YiwgZW5jKSB7XG4gIGlmIChwdWIgaW5zdGFuY2VvZiBLZXlQYWlyKVxuICAgIHJldHVybiBwdWI7XG5cbiAgcmV0dXJuIG5ldyBLZXlQYWlyKGVjLCB7XG4gICAgcHViOiBwdWIsXG4gICAgcHViRW5jOiBlbmNcbiAgfSk7XG59O1xuXG5LZXlQYWlyLmZyb21Qcml2YXRlID0gZnVuY3Rpb24gZnJvbVByaXZhdGUoZWMsIHByaXYsIGVuYykge1xuICBpZiAocHJpdiBpbnN0YW5jZW9mIEtleVBhaXIpXG4gICAgcmV0dXJuIHByaXY7XG5cbiAgcmV0dXJuIG5ldyBLZXlQYWlyKGVjLCB7XG4gICAgcHJpdjogcHJpdixcbiAgICBwcml2RW5jOiBlbmNcbiAgfSk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuICB2YXIgcHViID0gdGhpcy5nZXRQdWJsaWMoKTtcblxuICBpZiAocHViLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCByZWFzb246ICdJbnZhbGlkIHB1YmxpYyBrZXknIH07XG4gIGlmICghcHViLnZhbGlkYXRlKCkpXG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgcmVhc29uOiAnUHVibGljIGtleSBpcyBub3QgYSBwb2ludCcgfTtcbiAgaWYgKCFwdWIubXVsKHRoaXMuZWMuY3VydmUubikuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIHJlYXNvbjogJ1B1YmxpYyBrZXkgKiBOICE9IE8nIH07XG5cbiAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlLCByZWFzb246IG51bGwgfTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmdldFB1YmxpYyA9IGZ1bmN0aW9uIGdldFB1YmxpYyhjb21wYWN0LCBlbmMpIHtcbiAgLy8gY29tcGFjdCBpcyBvcHRpb25hbCBhcmd1bWVudFxuICBpZiAodHlwZW9mIGNvbXBhY3QgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jID0gY29tcGFjdDtcbiAgICBjb21wYWN0ID0gbnVsbDtcbiAgfVxuXG4gIGlmICghdGhpcy5wdWIpXG4gICAgdGhpcy5wdWIgPSB0aGlzLmVjLmcubXVsKHRoaXMucHJpdik7XG5cbiAgaWYgKCFlbmMpXG4gICAgcmV0dXJuIHRoaXMucHViO1xuXG4gIHJldHVybiB0aGlzLnB1Yi5lbmNvZGUoZW5jLCBjb21wYWN0KTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmdldFByaXZhdGUgPSBmdW5jdGlvbiBnZXRQcml2YXRlKGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdGhpcy5wcml2LnRvU3RyaW5nKDE2LCAyKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLnByaXY7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5faW1wb3J0UHJpdmF0ZSA9IGZ1bmN0aW9uIF9pbXBvcnRQcml2YXRlKGtleSwgZW5jKSB7XG4gIHRoaXMucHJpdiA9IG5ldyBCTihrZXksIGVuYyB8fCAxNik7XG5cbiAgLy8gRW5zdXJlIHRoYXQgdGhlIHByaXYgd29uJ3QgYmUgYmlnZ2VyIHRoYW4gbiwgb3RoZXJ3aXNlIHdlIG1heSBmYWlsXG4gIC8vIGluIGZpeGVkIG11bHRpcGxpY2F0aW9uIG1ldGhvZFxuICB0aGlzLnByaXYgPSB0aGlzLnByaXYudW1vZCh0aGlzLmVjLmN1cnZlLm4pO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuX2ltcG9ydFB1YmxpYyA9IGZ1bmN0aW9uIF9pbXBvcnRQdWJsaWMoa2V5LCBlbmMpIHtcbiAgaWYgKGtleS54IHx8IGtleS55KSB7XG4gICAgLy8gTW9udGdvbWVyeSBwb2ludHMgb25seSBoYXZlIGFuIGB4YCBjb29yZGluYXRlLlxuICAgIC8vIFdlaWVyc3RyYXNzL0Vkd2FyZHMgcG9pbnRzIG9uIHRoZSBvdGhlciBoYW5kIGhhdmUgYm90aCBgeGAgYW5kXG4gICAgLy8gYHlgIGNvb3JkaW5hdGVzLlxuICAgIGlmICh0aGlzLmVjLmN1cnZlLnR5cGUgPT09ICdtb250Jykge1xuICAgICAgYXNzZXJ0KGtleS54LCAnTmVlZCB4IGNvb3JkaW5hdGUnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZWMuY3VydmUudHlwZSA9PT0gJ3Nob3J0JyB8fFxuICAgICAgICAgICAgICAgdGhpcy5lYy5jdXJ2ZS50eXBlID09PSAnZWR3YXJkcycpIHtcbiAgICAgIGFzc2VydChrZXkueCAmJiBrZXkueSwgJ05lZWQgYm90aCB4IGFuZCB5IGNvb3JkaW5hdGUnKTtcbiAgICB9XG4gICAgdGhpcy5wdWIgPSB0aGlzLmVjLmN1cnZlLnBvaW50KGtleS54LCBrZXkueSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMucHViID0gdGhpcy5lYy5jdXJ2ZS5kZWNvZGVQb2ludChrZXksIGVuYyk7XG59O1xuXG4vLyBFQ0RIXG5LZXlQYWlyLnByb3RvdHlwZS5kZXJpdmUgPSBmdW5jdGlvbiBkZXJpdmUocHViKSB7XG4gIHJldHVybiBwdWIubXVsKHRoaXMucHJpdikuZ2V0WCgpO1xufTtcblxuLy8gRUNEU0FcbktleVBhaXIucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbiBzaWduKG1zZywgZW5jLCBvcHRpb25zKSB7XG4gIHJldHVybiB0aGlzLmVjLnNpZ24obXNnLCB0aGlzLCBlbmMsIG9wdGlvbnMpO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUudmVyaWZ5ID0gZnVuY3Rpb24gdmVyaWZ5KG1zZywgc2lnbmF0dXJlKSB7XG4gIHJldHVybiB0aGlzLmVjLnZlcmlmeShtc2csIHNpZ25hdHVyZSwgdGhpcyk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgcmV0dXJuICc8S2V5IHByaXY6ICcgKyAodGhpcy5wcml2ICYmIHRoaXMucHJpdi50b1N0cmluZygxNiwgMikpICtcbiAgICAgICAgICcgcHViOiAnICsgKHRoaXMucHViICYmIHRoaXMucHViLmluc3BlY3QoKSkgKyAnID4nO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcblxudmFyIGVsbGlwdGljID0gcmVxdWlyZSgnLi4vLi4vZWxsaXB0aWMnKTtcbnZhciB1dGlscyA9IGVsbGlwdGljLnV0aWxzO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gU2lnbmF0dXJlKG9wdGlvbnMsIGVuYykge1xuICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIFNpZ25hdHVyZSlcbiAgICByZXR1cm4gb3B0aW9ucztcblxuICBpZiAodGhpcy5faW1wb3J0REVSKG9wdGlvbnMsIGVuYykpXG4gICAgcmV0dXJuO1xuXG4gIGFzc2VydChvcHRpb25zLnIgJiYgb3B0aW9ucy5zLCAnU2lnbmF0dXJlIHdpdGhvdXQgciBvciBzJyk7XG4gIHRoaXMuciA9IG5ldyBCTihvcHRpb25zLnIsIDE2KTtcbiAgdGhpcy5zID0gbmV3IEJOKG9wdGlvbnMucywgMTYpO1xuICBpZiAob3B0aW9ucy5yZWNvdmVyeVBhcmFtID09PSB1bmRlZmluZWQpXG4gICAgdGhpcy5yZWNvdmVyeVBhcmFtID0gbnVsbDtcbiAgZWxzZVxuICAgIHRoaXMucmVjb3ZlcnlQYXJhbSA9IG9wdGlvbnMucmVjb3ZlcnlQYXJhbTtcbn1cbm1vZHVsZS5leHBvcnRzID0gU2lnbmF0dXJlO1xuXG5mdW5jdGlvbiBQb3NpdGlvbigpIHtcbiAgdGhpcy5wbGFjZSA9IDA7XG59XG5cbmZ1bmN0aW9uIGdldExlbmd0aChidWYsIHApIHtcbiAgdmFyIGluaXRpYWwgPSBidWZbcC5wbGFjZSsrXTtcbiAgaWYgKCEoaW5pdGlhbCAmIDB4ODApKSB7XG4gICAgcmV0dXJuIGluaXRpYWw7XG4gIH1cbiAgdmFyIG9jdGV0TGVuID0gaW5pdGlhbCAmIDB4ZjtcbiAgdmFyIHZhbCA9IDA7XG4gIGZvciAodmFyIGkgPSAwLCBvZmYgPSBwLnBsYWNlOyBpIDwgb2N0ZXRMZW47IGkrKywgb2ZmKyspIHtcbiAgICB2YWwgPDw9IDg7XG4gICAgdmFsIHw9IGJ1ZltvZmZdO1xuICB9XG4gIHAucGxhY2UgPSBvZmY7XG4gIHJldHVybiB2YWw7XG59XG5cbmZ1bmN0aW9uIHJtUGFkZGluZyhidWYpIHtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aCAtIDE7XG4gIHdoaWxlICghYnVmW2ldICYmICEoYnVmW2kgKyAxXSAmIDB4ODApICYmIGkgPCBsZW4pIHtcbiAgICBpKys7XG4gIH1cbiAgaWYgKGkgPT09IDApIHtcbiAgICByZXR1cm4gYnVmO1xuICB9XG4gIHJldHVybiBidWYuc2xpY2UoaSk7XG59XG5cblNpZ25hdHVyZS5wcm90b3R5cGUuX2ltcG9ydERFUiA9IGZ1bmN0aW9uIF9pbXBvcnRERVIoZGF0YSwgZW5jKSB7XG4gIGRhdGEgPSB1dGlscy50b0FycmF5KGRhdGEsIGVuYyk7XG4gIHZhciBwID0gbmV3IFBvc2l0aW9uKCk7XG4gIGlmIChkYXRhW3AucGxhY2UrK10gIT09IDB4MzApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGxlbiA9IGdldExlbmd0aChkYXRhLCBwKTtcbiAgaWYgKChsZW4gKyBwLnBsYWNlKSAhPT0gZGF0YS5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGRhdGFbcC5wbGFjZSsrXSAhPT0gMHgwMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcmxlbiA9IGdldExlbmd0aChkYXRhLCBwKTtcbiAgdmFyIHIgPSBkYXRhLnNsaWNlKHAucGxhY2UsIHJsZW4gKyBwLnBsYWNlKTtcbiAgcC5wbGFjZSArPSBybGVuO1xuICBpZiAoZGF0YVtwLnBsYWNlKytdICE9PSAweDAyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBzbGVuID0gZ2V0TGVuZ3RoKGRhdGEsIHApO1xuICBpZiAoZGF0YS5sZW5ndGggIT09IHNsZW4gKyBwLnBsYWNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBzID0gZGF0YS5zbGljZShwLnBsYWNlLCBzbGVuICsgcC5wbGFjZSk7XG4gIGlmIChyWzBdID09PSAwICYmIChyWzFdICYgMHg4MCkpIHtcbiAgICByID0gci5zbGljZSgxKTtcbiAgfVxuICBpZiAoc1swXSA9PT0gMCAmJiAoc1sxXSAmIDB4ODApKSB7XG4gICAgcyA9IHMuc2xpY2UoMSk7XG4gIH1cblxuICB0aGlzLnIgPSBuZXcgQk4ocik7XG4gIHRoaXMucyA9IG5ldyBCTihzKTtcbiAgdGhpcy5yZWNvdmVyeVBhcmFtID0gbnVsbDtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdExlbmd0aChhcnIsIGxlbikge1xuICBpZiAobGVuIDwgMHg4MCkge1xuICAgIGFyci5wdXNoKGxlbik7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBvY3RldHMgPSAxICsgKE1hdGgubG9nKGxlbikgLyBNYXRoLkxOMiA+Pj4gMyk7XG4gIGFyci5wdXNoKG9jdGV0cyB8IDB4ODApO1xuICB3aGlsZSAoLS1vY3RldHMpIHtcbiAgICBhcnIucHVzaCgobGVuID4+PiAob2N0ZXRzIDw8IDMpKSAmIDB4ZmYpO1xuICB9XG4gIGFyci5wdXNoKGxlbik7XG59XG5cblNpZ25hdHVyZS5wcm90b3R5cGUudG9ERVIgPSBmdW5jdGlvbiB0b0RFUihlbmMpIHtcbiAgdmFyIHIgPSB0aGlzLnIudG9BcnJheSgpO1xuICB2YXIgcyA9IHRoaXMucy50b0FycmF5KCk7XG5cbiAgLy8gUGFkIHZhbHVlc1xuICBpZiAoclswXSAmIDB4ODApXG4gICAgciA9IFsgMCBdLmNvbmNhdChyKTtcbiAgLy8gUGFkIHZhbHVlc1xuICBpZiAoc1swXSAmIDB4ODApXG4gICAgcyA9IFsgMCBdLmNvbmNhdChzKTtcblxuICByID0gcm1QYWRkaW5nKHIpO1xuICBzID0gcm1QYWRkaW5nKHMpO1xuXG4gIHdoaWxlICghc1swXSAmJiAhKHNbMV0gJiAweDgwKSkge1xuICAgIHMgPSBzLnNsaWNlKDEpO1xuICB9XG4gIHZhciBhcnIgPSBbIDB4MDIgXTtcbiAgY29uc3RydWN0TGVuZ3RoKGFyciwgci5sZW5ndGgpO1xuICBhcnIgPSBhcnIuY29uY2F0KHIpO1xuICBhcnIucHVzaCgweDAyKTtcbiAgY29uc3RydWN0TGVuZ3RoKGFyciwgcy5sZW5ndGgpO1xuICB2YXIgYmFja0hhbGYgPSBhcnIuY29uY2F0KHMpO1xuICB2YXIgcmVzID0gWyAweDMwIF07XG4gIGNvbnN0cnVjdExlbmd0aChyZXMsIGJhY2tIYWxmLmxlbmd0aCk7XG4gIHJlcyA9IHJlcy5jb25jYXQoYmFja0hhbGYpO1xuICByZXR1cm4gdXRpbHMuZW5jb2RlKHJlcywgZW5jKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNoID0gcmVxdWlyZSgnaGFzaC5qcycpO1xudmFyIGVsbGlwdGljID0gcmVxdWlyZSgnLi4vLi4vZWxsaXB0aWMnKTtcbnZhciB1dGlscyA9IGVsbGlwdGljLnV0aWxzO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcbnZhciBwYXJzZUJ5dGVzID0gdXRpbHMucGFyc2VCeXRlcztcbnZhciBLZXlQYWlyID0gcmVxdWlyZSgnLi9rZXknKTtcbnZhciBTaWduYXR1cmUgPSByZXF1aXJlKCcuL3NpZ25hdHVyZScpO1xuXG5mdW5jdGlvbiBFRERTQShjdXJ2ZSkge1xuICBhc3NlcnQoY3VydmUgPT09ICdlZDI1NTE5JywgJ29ubHkgdGVzdGVkIHdpdGggZWQyNTUxOSBzbyBmYXInKTtcblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRUREU0EpKVxuICAgIHJldHVybiBuZXcgRUREU0EoY3VydmUpO1xuXG4gIHZhciBjdXJ2ZSA9IGVsbGlwdGljLmN1cnZlc1tjdXJ2ZV0uY3VydmU7XG4gIHRoaXMuY3VydmUgPSBjdXJ2ZTtcbiAgdGhpcy5nID0gY3VydmUuZztcbiAgdGhpcy5nLnByZWNvbXB1dGUoY3VydmUubi5iaXRMZW5ndGgoKSArIDEpO1xuXG4gIHRoaXMucG9pbnRDbGFzcyA9IGN1cnZlLnBvaW50KCkuY29uc3RydWN0b3I7XG4gIHRoaXMuZW5jb2RpbmdMZW5ndGggPSBNYXRoLmNlaWwoY3VydmUubi5iaXRMZW5ndGgoKSAvIDgpO1xuICB0aGlzLmhhc2ggPSBoYXNoLnNoYTUxMjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBFRERTQTtcblxuLyoqXG4qIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSBtZXNzYWdlIC0gbWVzc2FnZSBieXRlc1xuKiBAcGFyYW0ge0FycmF5fFN0cmluZ3xLZXlQYWlyfSBzZWNyZXQgLSBzZWNyZXQgYnl0ZXMgb3IgYSBrZXlwYWlyXG4qIEByZXR1cm5zIHtTaWduYXR1cmV9IC0gc2lnbmF0dXJlXG4qL1xuRUREU0EucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbiBzaWduKG1lc3NhZ2UsIHNlY3JldCkge1xuICBtZXNzYWdlID0gcGFyc2VCeXRlcyhtZXNzYWdlKTtcbiAgdmFyIGtleSA9IHRoaXMua2V5RnJvbVNlY3JldChzZWNyZXQpO1xuICB2YXIgciA9IHRoaXMuaGFzaEludChrZXkubWVzc2FnZVByZWZpeCgpLCBtZXNzYWdlKTtcbiAgdmFyIFIgPSB0aGlzLmcubXVsKHIpO1xuICB2YXIgUmVuY29kZWQgPSB0aGlzLmVuY29kZVBvaW50KFIpO1xuICB2YXIgc18gPSB0aGlzLmhhc2hJbnQoUmVuY29kZWQsIGtleS5wdWJCeXRlcygpLCBtZXNzYWdlKVxuICAgICAgICAgICAgICAgLm11bChrZXkucHJpdigpKTtcbiAgdmFyIFMgPSByLmFkZChzXykudW1vZCh0aGlzLmN1cnZlLm4pO1xuICByZXR1cm4gdGhpcy5tYWtlU2lnbmF0dXJlKHsgUjogUiwgUzogUywgUmVuY29kZWQ6IFJlbmNvZGVkIH0pO1xufTtcblxuLyoqXG4qIEBwYXJhbSB7QXJyYXl9IG1lc3NhZ2UgLSBtZXNzYWdlIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXl8U3RyaW5nfFNpZ25hdHVyZX0gc2lnIC0gc2lnIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXl8U3RyaW5nfFBvaW50fEtleVBhaXJ9IHB1YiAtIHB1YmxpYyBrZXlcbiogQHJldHVybnMge0Jvb2xlYW59IC0gdHJ1ZSBpZiBwdWJsaWMga2V5IG1hdGNoZXMgc2lnIG9mIG1lc3NhZ2VcbiovXG5FRERTQS5wcm90b3R5cGUudmVyaWZ5ID0gZnVuY3Rpb24gdmVyaWZ5KG1lc3NhZ2UsIHNpZywgcHViKSB7XG4gIG1lc3NhZ2UgPSBwYXJzZUJ5dGVzKG1lc3NhZ2UpO1xuICBzaWcgPSB0aGlzLm1ha2VTaWduYXR1cmUoc2lnKTtcbiAgdmFyIGtleSA9IHRoaXMua2V5RnJvbVB1YmxpYyhwdWIpO1xuICB2YXIgaCA9IHRoaXMuaGFzaEludChzaWcuUmVuY29kZWQoKSwga2V5LnB1YkJ5dGVzKCksIG1lc3NhZ2UpO1xuICB2YXIgU0cgPSB0aGlzLmcubXVsKHNpZy5TKCkpO1xuICB2YXIgUnBsdXNBaCA9IHNpZy5SKCkuYWRkKGtleS5wdWIoKS5tdWwoaCkpO1xuICByZXR1cm4gUnBsdXNBaC5lcShTRyk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuaGFzaEludCA9IGZ1bmN0aW9uIGhhc2hJbnQoKSB7XG4gIHZhciBoYXNoID0gdGhpcy5oYXNoKCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxuICAgIGhhc2gudXBkYXRlKGFyZ3VtZW50c1tpXSk7XG4gIHJldHVybiB1dGlscy5pbnRGcm9tTEUoaGFzaC5kaWdlc3QoKSkudW1vZCh0aGlzLmN1cnZlLm4pO1xufTtcblxuRUREU0EucHJvdG90eXBlLmtleUZyb21QdWJsaWMgPSBmdW5jdGlvbiBrZXlGcm9tUHVibGljKHB1Yikge1xuICByZXR1cm4gS2V5UGFpci5mcm9tUHVibGljKHRoaXMsIHB1Yik7XG59O1xuXG5FRERTQS5wcm90b3R5cGUua2V5RnJvbVNlY3JldCA9IGZ1bmN0aW9uIGtleUZyb21TZWNyZXQoc2VjcmV0KSB7XG4gIHJldHVybiBLZXlQYWlyLmZyb21TZWNyZXQodGhpcywgc2VjcmV0KTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5tYWtlU2lnbmF0dXJlID0gZnVuY3Rpb24gbWFrZVNpZ25hdHVyZShzaWcpIHtcbiAgaWYgKHNpZyBpbnN0YW5jZW9mIFNpZ25hdHVyZSlcbiAgICByZXR1cm4gc2lnO1xuICByZXR1cm4gbmV3IFNpZ25hdHVyZSh0aGlzLCBzaWcpO1xufTtcblxuLyoqXG4qICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWpvc2Vmc3Nvbi1lZGRzYS1lZDI1NTE5LTAzI3NlY3Rpb24tNS4yXG4qXG4qIEVERFNBIGRlZmluZXMgbWV0aG9kcyBmb3IgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHBvaW50cyBhbmQgaW50ZWdlcnMuIFRoZXNlIGFyZVxuKiBoZWxwZXIgY29udmVuaWVuY2UgbWV0aG9kcywgdGhhdCBwYXNzIGFsb25nIHRvIHV0aWxpdHkgZnVuY3Rpb25zIGltcGxpZWRcbiogcGFyYW1ldGVycy5cbipcbiovXG5FRERTQS5wcm90b3R5cGUuZW5jb2RlUG9pbnQgPSBmdW5jdGlvbiBlbmNvZGVQb2ludChwb2ludCkge1xuICB2YXIgZW5jID0gcG9pbnQuZ2V0WSgpLnRvQXJyYXkoJ2xlJywgdGhpcy5lbmNvZGluZ0xlbmd0aCk7XG4gIGVuY1t0aGlzLmVuY29kaW5nTGVuZ3RoIC0gMV0gfD0gcG9pbnQuZ2V0WCgpLmlzT2RkKCkgPyAweDgwIDogMDtcbiAgcmV0dXJuIGVuYztcbn07XG5cbkVERFNBLnByb3RvdHlwZS5kZWNvZGVQb2ludCA9IGZ1bmN0aW9uIGRlY29kZVBvaW50KGJ5dGVzKSB7XG4gIGJ5dGVzID0gdXRpbHMucGFyc2VCeXRlcyhieXRlcyk7XG5cbiAgdmFyIGxhc3RJeCA9IGJ5dGVzLmxlbmd0aCAtIDE7XG4gIHZhciBub3JtZWQgPSBieXRlcy5zbGljZSgwLCBsYXN0SXgpLmNvbmNhdChieXRlc1tsYXN0SXhdICYgfjB4ODApO1xuICB2YXIgeElzT2RkID0gKGJ5dGVzW2xhc3RJeF0gJiAweDgwKSAhPT0gMDtcblxuICB2YXIgeSA9IHV0aWxzLmludEZyb21MRShub3JtZWQpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludEZyb21ZKHksIHhJc09kZCk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuZW5jb2RlSW50ID0gZnVuY3Rpb24gZW5jb2RlSW50KG51bSkge1xuICByZXR1cm4gbnVtLnRvQXJyYXkoJ2xlJywgdGhpcy5lbmNvZGluZ0xlbmd0aCk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuZGVjb2RlSW50ID0gZnVuY3Rpb24gZGVjb2RlSW50KGJ5dGVzKSB7XG4gIHJldHVybiB1dGlscy5pbnRGcm9tTEUoYnl0ZXMpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmlzUG9pbnQgPSBmdW5jdGlvbiBpc1BvaW50KHZhbCkge1xuICByZXR1cm4gdmFsIGluc3RhbmNlb2YgdGhpcy5wb2ludENsYXNzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGVsbGlwdGljID0gcmVxdWlyZSgnLi4vLi4vZWxsaXB0aWMnKTtcbnZhciB1dGlscyA9IGVsbGlwdGljLnV0aWxzO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcbnZhciBwYXJzZUJ5dGVzID0gdXRpbHMucGFyc2VCeXRlcztcbnZhciBjYWNoZWRQcm9wZXJ0eSA9IHV0aWxzLmNhY2hlZFByb3BlcnR5O1xuXG4vKipcbiogQHBhcmFtIHtFRERTQX0gZWRkc2EgLSBpbnN0YW5jZVxuKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcHVibGljL3ByaXZhdGUga2V5IHBhcmFtZXRlcnNcbipcbiogQHBhcmFtIHtBcnJheTxCeXRlPn0gW3BhcmFtcy5zZWNyZXRdIC0gc2VjcmV0IHNlZWQgYnl0ZXNcbiogQHBhcmFtIHtQb2ludH0gW3BhcmFtcy5wdWJdIC0gcHVibGljIGtleSBwb2ludCAoYWthIGBBYCBpbiBlZGRzYSB0ZXJtcylcbiogQHBhcmFtIHtBcnJheTxCeXRlPn0gW3BhcmFtcy5wdWJdIC0gcHVibGljIGtleSBwb2ludCBlbmNvZGVkIGFzIGJ5dGVzXG4qXG4qL1xuZnVuY3Rpb24gS2V5UGFpcihlZGRzYSwgcGFyYW1zKSB7XG4gIHRoaXMuZWRkc2EgPSBlZGRzYTtcbiAgdGhpcy5fc2VjcmV0ID0gcGFyc2VCeXRlcyhwYXJhbXMuc2VjcmV0KTtcbiAgaWYgKGVkZHNhLmlzUG9pbnQocGFyYW1zLnB1YikpXG4gICAgdGhpcy5fcHViID0gcGFyYW1zLnB1YjtcbiAgZWxzZVxuICAgIHRoaXMuX3B1YkJ5dGVzID0gcGFyc2VCeXRlcyhwYXJhbXMucHViKTtcbn1cblxuS2V5UGFpci5mcm9tUHVibGljID0gZnVuY3Rpb24gZnJvbVB1YmxpYyhlZGRzYSwgcHViKSB7XG4gIGlmIChwdWIgaW5zdGFuY2VvZiBLZXlQYWlyKVxuICAgIHJldHVybiBwdWI7XG4gIHJldHVybiBuZXcgS2V5UGFpcihlZGRzYSwgeyBwdWI6IHB1YiB9KTtcbn07XG5cbktleVBhaXIuZnJvbVNlY3JldCA9IGZ1bmN0aW9uIGZyb21TZWNyZXQoZWRkc2EsIHNlY3JldCkge1xuICBpZiAoc2VjcmV0IGluc3RhbmNlb2YgS2V5UGFpcilcbiAgICByZXR1cm4gc2VjcmV0O1xuICByZXR1cm4gbmV3IEtleVBhaXIoZWRkc2EsIHsgc2VjcmV0OiBzZWNyZXQgfSk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5zZWNyZXQgPSBmdW5jdGlvbiBzZWNyZXQoKSB7XG4gIHJldHVybiB0aGlzLl9zZWNyZXQ7XG59O1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAncHViQnl0ZXMnLCBmdW5jdGlvbiBwdWJCeXRlcygpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZW5jb2RlUG9pbnQodGhpcy5wdWIoKSk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgJ3B1YicsIGZ1bmN0aW9uIHB1YigpIHtcbiAgaWYgKHRoaXMuX3B1YkJ5dGVzKVxuICAgIHJldHVybiB0aGlzLmVkZHNhLmRlY29kZVBvaW50KHRoaXMuX3B1YkJ5dGVzKTtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZy5tdWwodGhpcy5wcml2KCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KEtleVBhaXIsICdwcml2Qnl0ZXMnLCBmdW5jdGlvbiBwcml2Qnl0ZXMoKSB7XG4gIHZhciBlZGRzYSA9IHRoaXMuZWRkc2E7XG4gIHZhciBoYXNoID0gdGhpcy5oYXNoKCk7XG4gIHZhciBsYXN0SXggPSBlZGRzYS5lbmNvZGluZ0xlbmd0aCAtIDE7XG5cbiAgdmFyIGEgPSBoYXNoLnNsaWNlKDAsIGVkZHNhLmVuY29kaW5nTGVuZ3RoKTtcbiAgYVswXSAmPSAyNDg7XG4gIGFbbGFzdEl4XSAmPSAxMjc7XG4gIGFbbGFzdEl4XSB8PSA2NDtcblxuICByZXR1cm4gYTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAncHJpdicsIGZ1bmN0aW9uIHByaXYoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmRlY29kZUludCh0aGlzLnByaXZCeXRlcygpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAnaGFzaCcsIGZ1bmN0aW9uIGhhc2goKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmhhc2goKS51cGRhdGUodGhpcy5zZWNyZXQoKSkuZGlnZXN0KCk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgJ21lc3NhZ2VQcmVmaXgnLCBmdW5jdGlvbiBtZXNzYWdlUHJlZml4KCkge1xuICByZXR1cm4gdGhpcy5oYXNoKCkuc2xpY2UodGhpcy5lZGRzYS5lbmNvZGluZ0xlbmd0aCk7XG59KTtcblxuS2V5UGFpci5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obWVzc2FnZSkge1xuICBhc3NlcnQodGhpcy5fc2VjcmV0LCAnS2V5UGFpciBjYW4gb25seSB2ZXJpZnknKTtcbiAgcmV0dXJuIHRoaXMuZWRkc2Euc2lnbihtZXNzYWdlLCB0aGlzKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeShtZXNzYWdlLCBzaWcpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EudmVyaWZ5KG1lc3NhZ2UsIHNpZywgdGhpcyk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5nZXRTZWNyZXQgPSBmdW5jdGlvbiBnZXRTZWNyZXQoZW5jKSB7XG4gIGFzc2VydCh0aGlzLl9zZWNyZXQsICdLZXlQYWlyIGlzIHB1YmxpYyBvbmx5Jyk7XG4gIHJldHVybiB1dGlscy5lbmNvZGUodGhpcy5zZWNyZXQoKSwgZW5jKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmdldFB1YmxpYyA9IGZ1bmN0aW9uIGdldFB1YmxpYyhlbmMpIHtcbiAgcmV0dXJuIHV0aWxzLmVuY29kZSh0aGlzLnB1YkJ5dGVzKCksIGVuYyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEtleVBhaXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgZWxsaXB0aWMgPSByZXF1aXJlKCcuLi8uLi9lbGxpcHRpYycpO1xudmFyIHV0aWxzID0gZWxsaXB0aWMudXRpbHM7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xudmFyIGNhY2hlZFByb3BlcnR5ID0gdXRpbHMuY2FjaGVkUHJvcGVydHk7XG52YXIgcGFyc2VCeXRlcyA9IHV0aWxzLnBhcnNlQnl0ZXM7XG5cbi8qKlxuKiBAcGFyYW0ge0VERFNBfSBlZGRzYSAtIGVkZHNhIGluc3RhbmNlXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fE9iamVjdH0gc2lnIC1cbiogQHBhcmFtIHtBcnJheTxCeXRlcz58UG9pbnR9IFtzaWcuUl0gLSBSIHBvaW50IGFzIFBvaW50IG9yIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fGJufSBbc2lnLlNdIC0gUyBzY2FsYXIgYXMgYm4gb3IgYnl0ZXNcbiogQHBhcmFtIHtBcnJheTxCeXRlcz59IFtzaWcuUmVuY29kZWRdIC0gUiBwb2ludCBlbmNvZGVkXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fSBbc2lnLlNlbmNvZGVkXSAtIFMgc2NhbGFyIGVuY29kZWRcbiovXG5mdW5jdGlvbiBTaWduYXR1cmUoZWRkc2EsIHNpZykge1xuICB0aGlzLmVkZHNhID0gZWRkc2E7XG5cbiAgaWYgKHR5cGVvZiBzaWcgIT09ICdvYmplY3QnKVxuICAgIHNpZyA9IHBhcnNlQnl0ZXMoc2lnKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShzaWcpKSB7XG4gICAgc2lnID0ge1xuICAgICAgUjogc2lnLnNsaWNlKDAsIGVkZHNhLmVuY29kaW5nTGVuZ3RoKSxcbiAgICAgIFM6IHNpZy5zbGljZShlZGRzYS5lbmNvZGluZ0xlbmd0aClcbiAgICB9O1xuICB9XG5cbiAgYXNzZXJ0KHNpZy5SICYmIHNpZy5TLCAnU2lnbmF0dXJlIHdpdGhvdXQgUiBvciBTJyk7XG5cbiAgaWYgKGVkZHNhLmlzUG9pbnQoc2lnLlIpKVxuICAgIHRoaXMuX1IgPSBzaWcuUjtcbiAgaWYgKHNpZy5TIGluc3RhbmNlb2YgQk4pXG4gICAgdGhpcy5fUyA9IHNpZy5TO1xuXG4gIHRoaXMuX1JlbmNvZGVkID0gQXJyYXkuaXNBcnJheShzaWcuUikgPyBzaWcuUiA6IHNpZy5SZW5jb2RlZDtcbiAgdGhpcy5fU2VuY29kZWQgPSBBcnJheS5pc0FycmF5KHNpZy5TKSA/IHNpZy5TIDogc2lnLlNlbmNvZGVkO1xufVxuXG5jYWNoZWRQcm9wZXJ0eShTaWduYXR1cmUsICdTJywgZnVuY3Rpb24gUygpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZGVjb2RlSW50KHRoaXMuU2VuY29kZWQoKSk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoU2lnbmF0dXJlLCAnUicsIGZ1bmN0aW9uIFIoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmRlY29kZVBvaW50KHRoaXMuUmVuY29kZWQoKSk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoU2lnbmF0dXJlLCAnUmVuY29kZWQnLCBmdW5jdGlvbiBSZW5jb2RlZCgpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZW5jb2RlUG9pbnQodGhpcy5SKCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KFNpZ25hdHVyZSwgJ1NlbmNvZGVkJywgZnVuY3Rpb24gU2VuY29kZWQoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmVuY29kZUludCh0aGlzLlMoKSk7XG59KTtcblxuU2lnbmF0dXJlLnByb3RvdHlwZS50b0J5dGVzID0gZnVuY3Rpb24gdG9CeXRlcygpIHtcbiAgcmV0dXJuIHRoaXMuUmVuY29kZWQoKS5jb25jYXQodGhpcy5TZW5jb2RlZCgpKTtcbn07XG5cblNpZ25hdHVyZS5wcm90b3R5cGUudG9IZXggPSBmdW5jdGlvbiB0b0hleCgpIHtcbiAgcmV0dXJuIHV0aWxzLmVuY29kZSh0aGlzLnRvQnl0ZXMoKSwgJ2hleCcpLnRvVXBwZXJDYXNlKCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNpZ25hdHVyZTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICBkb3VibGVzOiB7XG4gICAgc3RlcDogNCxcbiAgICBwb2ludHM6IFtcbiAgICAgIFtcbiAgICAgICAgJ2U2MGZjZTkzYjU5ZTllYzUzMDExYWFiYzIxYzIzZTk3YjJhMzEzNjliODdhNWFlOWM0NGVlODllMmE2ZGVjMGEnLFxuICAgICAgICAnZjdlMzUwNzM5OWU1OTU5MjlkYjk5ZjM0ZjU3OTM3MTAxMjk2ODkxZTQ0ZDIzZjBiZTFmMzJjY2U2OTYxNjgyMSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4MjgyMjYzMjEyYzYwOWQ5ZWEyYTZlM2UxNzJkZTIzOGQ4YzM5Y2FiZDVhYzFjYTEwNjQ2ZTIzZmQ1ZjUxNTA4JyxcbiAgICAgICAgJzExZjhhODA5ODU1N2RmZTQ1ZTgyNTZlODMwYjYwYWNlNjJkNjEzYWMyZjdiMTdiZWQzMWI2ZWFmZjZlMjZjYWYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTc1ZTE1OWY3MjhiODY1YTcyZjk5Y2M2YzZmYzg0NmRlMGI5MzgzM2ZkMjIyMmVkNzNmY2U1YjU1MWU1YjczOScsXG4gICAgICAgICdkMzUwNmUwZDllM2M3OWViYTRlZjk3YTUxZmY3MWY1ZWFjYjU5NTVhZGQyNDM0NWM2ZWZhNmZmZWU5ZmVkNjk1J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM2M2Q5MGQ0NDdiMDBjOWM5OWNlYWMwNWI2MjYyZWUwNTM0NDFjN2U1NTU1MmZmZTUyNmJhZDhmODNmZjQ2NDAnLFxuICAgICAgICAnNGUyNzNhZGZjNzMyMjIxOTUzYjQ0NTM5N2YzMzYzMTQ1YjlhODkwMDgxOTllY2I2MjAwM2M3ZjNiZWU5ZGU5J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhiNGI1ZjE2NWRmM2MyYmU4YzYyNDRiNWI3NDU2Mzg4NDNlNGE3ODFhMTViY2QxYjY5Zjc5YTU1ZGZmZGY4MGMnLFxuICAgICAgICAnNGFhZDBhNmY2OGQzMDhiNGIzZmJkNzgxM2FiMGRhMDRmOWUzMzY1NDYxNjJlZTU2YjNlZmYwYzY1ZmQ0ZmQzNidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3MjNjYmFhNmU1ZGI5OTZkNmJmNzcxYzAwYmQ1NDhjN2I3MDBkYmZmYTZjMGU3N2JjYjYxMTU5MjUyMzJmY2RhJyxcbiAgICAgICAgJzk2ZTg2N2I1NTk1Y2M0OThhOTIxMTM3NDg4ODI0ZDZlMjY2MGEwNjUzNzc5NDk0ODAxZGMwNjlkOWViMzlmNWYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWViZmE0ZDQ5M2JlYmY5OGJhNWZlZWM4MTJjMmQzYjUwOTQ3OTYxMjM3YTkxOTgzOWE1MzNlY2EwZTdkZDdmYScsXG4gICAgICAgICc1ZDlhOGNhMzk3MGVmMGYyNjllZTdlZGFmMTc4MDg5ZDlhZTRjZGMzYTcxMWY3MTJkZGZkNGZkYWUxZGU4OTk5J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzEwMGY0NGRhNjk2ZTcxNjcyNzkxZDBhMDliN2JkZTQ1OWYxMjE1YTI5YjNjMDNiZmVmZDc4MzViMzlhNDhkYjAnLFxuICAgICAgICAnY2RkOWUxMzE5MmEwMGI3NzJlYzhmMzMwMGMwOTA2NjZiN2ZmNGExOGZmNTE5NWFjMGZiZDVjZDYyYmM2NWEwOSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlMTAzMWJlMjYyYzdlZDFiMWRjOTIyN2E0YTA0YzAxN2E3N2Y4ZDQ0NjRmM2IzODUyYzhhY2RlNmU1MzRmZDJkJyxcbiAgICAgICAgJzlkNzA2MTkyODk0MDQwNWU2YmI2YTQxNzY1OTc1MzVhZjI5MmRkNDE5ZTFjZWQ3OWE0NGYxOGYyOTQ1NmEwMGQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmVlYTZjYWU0NmQ1NWI1MzBhYzI4MzlmMTQzYmQ3ZWM1Y2Y4YjI2NmE0MWQ2YWY1MmQ1ZTY4OGQ5MDk0Njk2ZCcsXG4gICAgICAgICdlNTdjNmI2Yzk3ZGNlMWJhYjA2ZTRlMTJiZjNlY2Q1Yzk4MWM4OTU3Y2M0MTQ0MmQzMTU1ZGViZjE4MDkwMDg4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RhNjdhOTFkOTEwNDljZGNiMzY3YmU0YmU2ZmZjYTNjZmVlZDY1N2Q4MDg1ODNkZTMzZmE5NzhiYzFlYzZjYjEnLFxuICAgICAgICAnOWJhY2FhMzU0ODE2NDJiYzQxZjQ2M2Y3ZWM5NzgwZTVkZWM3YWRjNTA4Zjc0MGExN2U5ZWE4ZTI3YTY4YmUxZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1MzkwNGZhYTBiMzM0Y2RkYTZlMDAwOTM1ZWYyMjE1MWVjMDhkMGY3YmIxMTA2OWY1NzU0NWNjYzFhMzdiN2MwJyxcbiAgICAgICAgJzViYzA4N2QwYmM4MDEwNmQ4OGM5ZWNjYWMyMGQzYzFjMTM5OTk5ODFlMTQ0MzQ2OTlkY2IwOTZiMDIyNzcxYzgnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGU3YmNkMGJkMzU5ODNhNzcxOWNjYTc3NjRjYTkwNjc3OWI1M2EwNDNhOWI4YmNhZWZmOTU5ZjQzYWQ4NjA0NycsXG4gICAgICAgICcxMGI3NzcwYjJhM2RhNGIzOTQwMzEwNDIwY2E5NTE0NTc5ZTg4ZTJlNDdmZDY4YjNlYTEwMDQ3ZTg0NjAzNzJhJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM4NWVlZDM0YzFjZGZmMjFlNmQwODE4Njg5YjgxYmRlNzFhN2Y0ZjE4Mzk3ZTY2OTBhODQxZTE1OTljNDM4NjInLFxuICAgICAgICAnMjgzYmViYzNlOGVhMjNmNTY3MDFkZTE5ZTllYmY0NTc2YjMwNGVlYzIwODZkYzhjYzA0NThmZTU1NDJlNTQ1MydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2ZjlkOWI4MDNlY2YxOTE2MzdjNzNhNDQxM2RmYTE4MGZkZGY4NGE1OTQ3ZmJjOWM2MDZlZDg2YzNmYWMzYTcnLFxuICAgICAgICAnN2M4MGM2OGU2MDMwNTliYTY5YjhlMmEzMGU0NWM0ZDQ3ZWE0ZGQyZjVjMjgxMDAyZDg2ODkwNjAzYTg0MjE2MCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMzIyZDQwMTI0M2M0ZTI1ODJhMjE0N2MxMDRkNmVjYmY3NzRkMTYzZGIwZjVlNTMxM2I3ZTBlNzQyZDBlNmJkJyxcbiAgICAgICAgJzU2ZTcwNzk3ZTk2NjRlZjViZmIwMTliYzRkZGFmOWI3MjgwNWY2M2VhMjg3M2FmNjI0ZjNhMmU5NmMyOGIyYTAnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODU2NzJjN2QyZGUwYjdkYTJiZDE3NzBkODk2NjU4Njg3NDFiM2Y5YWY3NjQzMzk3NzIxZDc0ZDI4MTM0YWI4MycsXG4gICAgICAgICc3YzQ4MWI5YjViNDNiMmViNjM3NDA0OWJmYTYyYzJlNWU3N2YxN2ZjYzUyOThmNDRjOGUzMDk0Zjc5MDMxM2E2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzk0OGJmODA5YjE5ODhhNDZiMDZjOWYxOTE5NDEzYjEwZjkyMjZjNjBmNjY4ODMyZmZkOTU5YWY2MGM4MmEwYScsXG4gICAgICAgICc1M2E1NjI4NTZkY2I2NjQ2ZGM2Yjc0YzVkMWMzNDE4YzZkNGRmZjA4Yzk3Y2QyYmVkNGNiN2Y4OGQ4YzhlNTg5J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzYyNjBjZTdmNDYxODAxYzM0ZjA2N2NlMGYwMjg3M2E4ZjFiMGU0NGRmYzY5NzUyYWNjZWNkODE5ZjM4ZmQ4ZTgnLFxuICAgICAgICAnYmMyZGE4MmI2ZmE1YjU3MWE3ZjA5MDQ5Nzc2YTFlZjdlY2QyOTIyMzgwNTFjMTk4YzFhODRlOTViMmI0YWUxNydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNTAzN2RlMGFmYzFkOGQ0M2Q4MzQ4NDE0YmJmNDEwMzA0M2VjOGY1NzViZmRjNDMyOTUzY2M4ZDIwMzdmYTJkJyxcbiAgICAgICAgJzQ1NzE1MzRiYWE5NGQzYjVmOWY5OGQwOWZiOTkwYmRkYmQ1ZjViMDNlYzQ4MWYxMGUwZTVkYzg0MWQ3NTViZGEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTA2MzcyYjBmNGEyMDdhZGY1ZWE5MDVlOGYxNzcxYjRlN2U4ZGJkMWM2YTZjNWI3MjU4NjZhMGFlNGZjZTcyNScsXG4gICAgICAgICc3YTkwODk3NGJjZTE4Y2ZlMTJhMjdiYjJhZDVhNDg4Y2Q3NDg0YTc3ODcxMDQ4NzBiMjcwMzRmOTRlZWUzMWRkJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzIxM2M3YTcxNWNkNWQ0NTM1OGQwYmJmOWRjMGNlMDIyMDRiMTBiZGRlMmEzZjU4NTQwYWQ2OTA4ZDA1NTk3NTQnLFxuICAgICAgICAnNGI2ZGFkMGI1YWU0NjI1MDcwMTNhZDA2MjQ1YmExOTBiYjQ4NTBmNWYzNmE3ZWVkZGZmMmMyNzUzNGI0NThmMidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0ZTdjMjcyYTdhZjRiMzRlOGRiYjkzNTJhNTQxOWE4N2UyODM4YzcwYWRjNjJjZGRmMGNjM2EzYjA4ZmJkNTNjJyxcbiAgICAgICAgJzE3NzQ5Yzc2NmM5ZDBiMThlMTZmZDA5ZjZkZWY2ODFiNTMwYjk2MTRiZmY3ZGQzM2UwYjM5NDE4MTdkY2FhZTYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmVhNzRlM2RiZTc3OGIxYjEwZjIzOGFkNjE2ODZhYTVjNzZlM2RiMmJlNDMwNTc2MzI0MjdlMjg0MGZiMjdiNicsXG4gICAgICAgICc2ZTA1NjhkYjliMGIxMzI5N2NmNjc0ZGVjY2I2YWY5MzEyNmI1OTZiOTczZjdiNzc3MDFkM2RiN2YyM2NiOTZmJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc2ZTY0MTEzZjY3N2NmMGUxMGEyNTcwZDU5OTk2OGQzMTU0NGUxNzliNzYwNDMyOTUyYzAyYTQ0MTdiZGRlMzknLFxuICAgICAgICAnYzkwZGRmOGRlZTRlOTVjZjU3NzA2NmQ3MDY4MWYwZDM1ZTJhMzNkMmI1NmQyMDMyYjRiMTc1MmQxOTAxYWMwMSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjNzM4YzU2YjAzYjJhYmUxZTgyODFiYWE3NDNmOGY5YThmN2NjNjQzZGYyNmNiZWUzYWIxNTAyNDJiY2JiODkxJyxcbiAgICAgICAgJzg5M2ZiNTc4OTUxYWQyNTM3ZjcxOGYyZWFjYmZiYmJiODIzMTRlZWY3ODgwY2ZlOTE3ZTczNWQ5Njk5YTg0YzMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDg5NTYyNjU0OGI2NWI4MWUyNjRjNzYzN2M5NzI4NzdkMWQ3MmU1ZjNhOTI1MDE0MzcyZTlmNjU4OGY2YzE0YicsXG4gICAgICAgICdmZWJmYWEzOGYyYmM3ZWFlNzI4ZWM2MDgxOGMzNDBlYjAzNDI4ZDYzMmJiMDY3ZTE3OTM2M2VkNzVkN2Q5OTFmJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2I4ZGE5NDAzMmE5NTc1MThlYjBmNjQzMzU3MWU4NzYxY2VmZmM3MzY5M2U4NGVkZDQ5MTUwYTU2NGY2NzZlMDMnLFxuICAgICAgICAnMjgwNGRmYTQ0ODA1YTFlNGQ3Yzk5Y2M5NzYyODA4YjA5MmNjNTg0ZDk1ZmYzYjUxMTQ4OGU0ZTc0ZWZkZjZlNydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlODBmZWExNDQ0MWZiMzNhN2Q4YWRhYjk0NzVkN2ZhYjIwMTllZmZiNTE1NmE3OTJmMWExMTc3OGUzYzBkZjVkJyxcbiAgICAgICAgJ2VlZDFkZTdmNjM4ZTAwNzcxZTg5NzY4Y2EzY2E5NDQ3MmQxNTVlODBhZjMyMmVhOWZjYjQyOTFiNmFjOWVjNzgnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTMwMTY5N2JkZmNkNzA0MzEzYmE0OGU1MWQ1Njc1NDNmMmExODIwMzFlZmQ2OTE1ZGRjMDdiYmNjNGUxNjA3MCcsXG4gICAgICAgICc3MzcwZjkxY2ZiNjdlNGY1MDgxODA5ZmEyNWQ0MGY5YjE3MzVkYmY3YzBhMTFhMTMwYzBkMWEwNDFlMTc3ZWExJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzkwYWQ4NWIzODlkNmI5MzY0NjNmOWQwNTEyNjc4ZGUyMDhjYzMzMGIxMTMwN2ZmZmFiN2FjNjNlM2ZiMDRlZDQnLFxuICAgICAgICAnZTUwN2EzNjIwYTM4MjYxYWZmZGNiZDk0MjcyMjJiODM5YWVmYWJlMTU4Mjg5NGQ5OTFkNGQ0OGNiNmVmMTUwJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhmNjhiOWQyZjYzYjVmMzM5MjM5YzFhZDk4MWYxNjJlZTg4YzU2Nzg3MjNlYTMzNTFiN2I0NDRjOWVjNGMwZGEnLFxuICAgICAgICAnNjYyYTlmMmRiYTA2Mzk4NmRlMWQ5MGMyYjZiZTIxNWRiYmVhMmNmZTk1NTEwYmZkZjIzY2JmNzk1MDFmZmY4MidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNGYzZmIwMTc2YWY4NWQ2NWZmOTlmZjkxOThjMzYwOTFmNDhlODY1MDM2ODFlM2U2Njg2ZmQ1MDUzMjMxZTExJyxcbiAgICAgICAgJzFlNjM2MzNhZDBlZjRmMWMxNjYxYTZkMGVhMDJiNzI4NmNjN2U3NGVjOTUxZDFjOTgyMmMzODU3NmZlYjczYmMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGMwMGZhOWIxOGViZjMzMWViOTYxNTM3YTQ1YTQyNjZjNzAzNGYyZjBkNGUxZDA3MTZmYjZlYWUyMGVhZTI5ZScsXG4gICAgICAgICdlZmE0NzI2N2ZlYTUyMWExYTlkYzM0M2EzNzM2Yzk3NGMyZmFkYWZhODFlMzZjNTRlN2QyYTRjNjY3MDI0MTRiJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2U3YTI2Y2U2OWRkNDgyOWYzZTEwY2VjMGE5ZTk4ZWQzMTQzZDA4NGYzMDhiOTJjMDk5N2ZkZGZjNjBjYjNlNDEnLFxuICAgICAgICAnMmE3NThlMzAwZmE3OTg0YjQ3MWIwMDZhMWFhZmJiMThkMGE2YjJjMDQyMGU4M2UyMGU4YTk0MjFjZjJjZmQ1MSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiNjQ1OWUwZWUzNjYyZWM4ZDIzNTQwYzIyM2JjYmRjNTcxY2JjYjk2N2Q3OTQyNGYzY2YyOWViM2RlNmI4MGVmJyxcbiAgICAgICAgJzY3Yzg3NmQwNmYzZTA2ZGUxZGFkZjE2ZTU2NjFkYjNjNGIzYWU2ZDQ4ZTM1YjJmZjMwYmYwYjYxYTcxYmE0NSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNjhhODBjODI4MGJiODQwNzkzMjM0YWExMThmMDYyMzFkNmYxZmM2N2U3M2M1YTVkZWRhMGY1YjQ5Njk0M2U4JyxcbiAgICAgICAgJ2RiOGJhOWZmZjRiNTg2ZDAwYzRiMWY5MTc3YjBlMjhiNWIwZTdiOGY3ODQ1Mjk1YTI5NGM4NDI2NmIxMzMxMjAnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzI0YWVkN2RmNjVjODA0MjUyZGMwMjcwOTA3YTMwYjA5NjEyYWViOTczNDQ5Y2VhNDA5NTk4MGZjMjhkM2Q1ZCcsXG4gICAgICAgICc2NDhhMzY1Nzc0YjYxZjJmZjEzMGMwYzM1YWVjMWY0ZjE5MjEzYjBjN2UzMzI4NDM5NjcyMjRhZjk2YWI3Yzg0J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzRkZjljMTQ5MTljZGU2MWY2ZDUxZGZkYmU1ZmVlNWRjZWVjNDE0M2JhOGQxY2E4ODhlOGJkMzczZmQwNTRjOTYnLFxuICAgICAgICAnMzVlYzUxMDkyZDg3MjgwNTA5NzRjMjNhMWQ4NWQ0YjVkNTA2Y2RjMjg4NDkwMTkyZWJhYzA2Y2FkMTBkNWQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOWMzOTE5YTg0YTQ3NDg3MGZhZWQ4YTljMWNjNjYwMjE1MjM0ODkwNTRkN2YwMzA4Y2JmYzk5YzhhYzFmOThjZCcsXG4gICAgICAgICdkZGI4NGYwZjRhNGRkZDU3NTg0ZjA0NGJmMjYwZTY0MTkwNTMyNmY3NmM2NGM4ZTZiZTdlNWUwM2Q0ZmM1OTlkJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzYwNTcxNzBiMWRkMTJmZGY4ZGUwNWYyODFkOGUwNmJiOTFlMTQ5M2E4YjkxZDRjYzVhMjEzODIxMjBhOTU5ZTUnLFxuICAgICAgICAnOWExYWYwYjI2YTZhNDgwN2FkZDlhMmRhZjcxZGYyNjI0NjUxNTJiYzNlZTI0YzY1ZTg5OWJlOTMyMzg1YTJhOCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhNTc2ZGY4ZTIzYTA4NDExNDIxNDM5YTQ1MThkYTMxODgwY2VmMGZiYTdkNGRmMTJiMWE2OTczZWVjYjk0MjY2JyxcbiAgICAgICAgJzQwYTZiZjIwZTc2NjQwYjJjOTJiOTdhZmU1OGNkODJjNDMyZTEwYTdmNTE0ZDlmM2VlOGJlMTFhZTFiMjhlYzgnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzc3OGE3OGMyOGRlYzNlMzBhMDVmZTk2MjlkZThjMzhiYjMwZDFmNWNmOWEzYTIwOGY3NjM4ODliZTU4YWQ3MScsXG4gICAgICAgICczNDYyNmQ5YWI1YTViMjJmZjcwOThlMTJmMmZmNTgwMDg3YjM4NDExZmYyNGFjNTYzYjUxM2ZjMWZkOWY0M2FjJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzkyODk1NWVlNjM3YTg0NDYzNzI5ZmQzMGU3YWZkMmVkNWY5NjI3NGU1YWQ3ZTVjYjA5ZWRhOWMwNmQ5MDNhYycsXG4gICAgICAgICdjMjU2MjEwMDNkM2Y0MmE4MjdiNzhhMTMwOTNhOTVlZWFjM2QyNmVmYThhOGQ4M2ZjNTE4MGU5MzViY2QwOTFmJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg1ZDBmZWYzZWM2ZGIxMDkzOTkwNjRmM2EwZTNiMjg1NTY0NWI0YTkwN2FkMzU0NTI3YWFlNzUxNjNkODI3NTEnLFxuICAgICAgICAnMWYwMzY0ODQxM2EzOGMwYmUyOWQ0OTZlNTgyY2Y1NjYzZTg3NTFlOTY4NzczMzE1ODJjMjM3YTI0ZWIxZjk2MidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmZjJiMGRjZTk3ZWVjZTk3YzFjOWI2MDQxNzk4Yjg1ZGZkZmI2ZDg4ODJkYTIwMzA4ZjU0MDQ4MjQ1MjYwODdlJyxcbiAgICAgICAgJzQ5M2QxM2ZlZjUyNGJhMTg4YWY0YzRkYzU0ZDA3OTM2YzdiN2VkNmZiOTBlMmNlYjJjOTUxZTAxZjBjMjk5MDcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODI3ZmJiZTRiMWU4ODBlYTllZDJiMmU2MzAxYjIxMmI1N2YxZWUxNDhjZDZkZDI4NzgwZTVlMmNmODU2ZTI0MScsXG4gICAgICAgICdjNjBmOWM5MjNjNzI3YjBiNzFiZWYyYzY3ZDFkMTI2ODdmZjdhNjMxODY5MDMxNjZkNjA1YjY4YmFlYzI5M2VjJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VhYTY0OWYyMWY1MWJkYmFlN2JlNGFlMzRjZTZlNTIxN2E1OGZkY2U3ZjQ3ZjlhYTdmM2I1OGZhMjEyMGUyYjMnLFxuICAgICAgICAnYmUzMjc5ZWQ1YmJiYjAzYWM2OWE4MGY4OTg3OWFhNWEwMWE2Yjk2NWYxM2Y3ZTU5ZDQ3YTUzMDViYTVhZDkzZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNGE0MmQ0M2M1Y2YxNjlkOTM5MWRmNmRlY2Y0MmVlNTQxYjZkOGYwYzlhMTM3NDAxZTIzNjMyZGRhMzRkMjRmJyxcbiAgICAgICAgJzRkOWY5MmU3MTZkMWM3MzUyNmZjOTljY2ZiOGFkMzRjZTg4NmVlZGZhOGQ4ZTRmMTNhN2Y3MTMxZGViYTk0MTQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMWVjODBmZWYzNjBjYmRkOTU0MTYwZmFkYWIzNTJiNmI5MmI1MzU3NmE4OGZlYTQ5NDcxNzNiOWQ0MzAwYmYxOScsXG4gICAgICAgICdhZWVmZTkzNzU2YjUzNDBkMmYzYTQ5NThhN2FiYmY1ZTAxNDZlNzdmNjI5NWEwN2I2NzFjZGMxY2MxMDdjZWZkJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE0NmE3NzhjMDQ2NzBjMmY5MWIwMGFmNDY4MGRmYThiY2UzNDkwNzE3ZDU4YmE4ODlkZGI1OTI4MzY2NjQyYmUnLFxuICAgICAgICAnYjMxOGUwZWMzMzU0MDI4YWRkNjY5ODI3ZjlkNGIyODcwYWFhOTcxZDJmN2U1ZWQxZDBiMjk3NDgzZDgzZWZkMCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmYTUwYzBmNjFkMjJlNWYwN2UzYWNlYmIxYWEwN2IxMjhkMDAxMjIwOWEyOGI5Nzc2ZDc2YTg3OTMxODBlZWY5JyxcbiAgICAgICAgJzZiODRjNjkyMjM5N2ViYTliNzJjZDI4NzIyODFhNjhhNWU2ODMyOTNhNTdhMjEzYjM4Y2Q4ZDdkM2Y0ZjI4MTEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGExZDYxZDBjYTcyMWExMWIxYTViZjZiN2Q4OGU4NDIxYTI4OGFiNWQ1YmJhNTIyMGU1M2QzMmI1ZjA2N2VjMicsXG4gICAgICAgICc4MTU3ZjU1YTdjOTkzMDZjNzljMDc2NjE2MWM5MWUyOTY2YTczODk5ZDI3OWI0OGE2NTVmYmEwZjFhZDgzNmYxJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2E4ZTI4MmZmMGM5NzA2OTA3MjE1ZmY5OGU4ZmQ0MTY2MTUzMTFkZTA0NDZmMWUwNjJhNzNiMDYxMGQwNjRlMTMnLFxuICAgICAgICAnN2Y5NzM1NWI4ZGI4MWMwOWFiZmI3ZjNjNWIyNTE1ODg4YjY3OWEzZTUwZGQ2YmQ2Y2VmN2M3MzExMWY0Y2MwYydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNzRhNTNiOWM5YTI4NTg3MmQzOWU1NmU2OTEzY2FiMTVkNTliMWZhNTEyNTA4YzAyMmYzODJkZTgzMTk0OTdjJyxcbiAgICAgICAgJ2NjYzlkYzM3YWJmYzljMTY1N2I0MTU1ZjJjNDdmOWU2NjQ2YjNhMWQ4Y2I5ODU0MzgzZGExM2FjMDc5YWZhNzMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOTU5Mzk2OTgxOTQzNzg1YzNkM2U1N2VkZjUwMThjZGJlMDM5ZTczMGU0OTE4YjNkODg0ZmRmZjA5NDc1YjdiYScsXG4gICAgICAgICcyZTdlNTUyODg4YzMzMWRkOGJhMDM4NmE0YjljZDY4NDljNjUzZjY0Yzg3MDkzODVlOWI4YWJmODc1MjRmMmZkJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2QyYTYzYTUwYWU0MDFlNTZkNjQ1YTExNTNiMTA5YThmY2NhMGE0M2Q1NjFmYmEyZGJiNTEzNDBjOWQ4MmIxNTEnLFxuICAgICAgICAnZTgyZDg2ZmI2NDQzZmNiNzU2NWFlZTU4YjI5NDgyMjBhNzBmNzUwYWY0ODRjYTUyZDQxNDIxNzRkY2Y4OTQwNSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2NDU4N2UyMzM1NDcxZWI4OTBlZTc4OTZkN2NmZGM4NjZiYWNiZGJkMzgzOTMxN2IzNDM2ZjliNDU2MTdlMDczJyxcbiAgICAgICAgJ2Q5OWZjZGQ1YmY2OTAyZTJhZTk2ZGQ2NDQ3YzI5OWExODViOTBhMzkxMzNhZWFiMzU4Mjk5ZTVlOWZhZjY1ODknXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODQ4MWJkZTBlNGU0ZDg4NWIzYTU0NmQzZTU0OWRlMDQyZjBhYTZjZWEyNTBlN2ZkMzU4ZDZjODZkZDQ1ZTQ1OCcsXG4gICAgICAgICczOGVlN2I4Y2JhNTQwNGRkODRhMjViZjM5Y2VjYjJjYTkwMGE3OWM0MmIyNjJlNTU2ZDY0YjFiNTk3NzkwNTdlJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzEzNDY0YTU3YTc4MTAyYWE2MmI2OTc5YWU4MTdmNDYzN2ZmY2ZlZDNjNGIxY2UzMGJjZDYzMDNmNmNhZjY2NmInLFxuICAgICAgICAnNjliZTE1OTAwNDYxNDU4MGVmN2U0MzM0NTNjY2IwY2E0OGYzMDBhODFkMDk0MmUxM2Y0OTVhOTA3ZjZlY2MyNydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiYzRhOWRmNWI3MTNmZTJlOWFlZjQzMGJjYzFkYzk3YTBjZDljY2VkZTJmMjg1ODhjYWRhM2EwZDJkODNmMzY2JyxcbiAgICAgICAgJ2QzYTgxY2E2ZTc4NWMwNjM4MzkzN2FkZjRiNzk4Y2FhNmU4YTlmYmZhNTQ3YjE2ZDc1OGQ2NjY1ODFmMzNjMSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4YzI4YTk3YmY4Mjk4YmMwZDIzZDhjNzQ5NDUyYTMyZTY5NGI2NWUzMGE5NDcyYTM5NTRhYjMwZmU1MzI0Y2FhJyxcbiAgICAgICAgJzQwYTMwNDYzYTMzMDUxOTMzNzhmZWRmMzFmN2NjMGViN2FlNzg0ZjA0NTFjYjk0NTllNzFkYzczY2JlZjk0ODInXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGVhOTY2NjEzOTUyN2E4YzFkZDk0Y2U0ZjA3MWZkMjNjOGIzNTBjNWE0YmIzMzc0OGM0YmExMTFmYWNjYWUwJyxcbiAgICAgICAgJzYyMGVmYWJiYzhlZTI3ODJlMjRlN2MwY2ZiOTVjNWQ3MzViNzgzYmU5Y2YwZjhlOTU1YWYzNGEzMGU2MmI5NDUnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGQzNjI1ZmFlZjViYTA2MDc0NjY5NzE2YmJkMzc4OGQ4OWJkZGU4MTU5NTk5NjgwOTJmNzZjYzRlYjlhOTc4NycsXG4gICAgICAgICc3YTE4OGZhMzUyMGUzMGQ0NjFkYTI1MDEwNDU3MzFjYTk0MTQ2MTk4Mjg4MzM5NTkzN2Y2OGQwMGM2NDRhNTczJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Y3MTBkNzlkOWViOTYyMjk3ZTRmNjIzMmI0MGU4ZjdmZWIyYmM2MzgxNDYxNGQ2OTJjMTJkZTc1MjQwODIyMWUnLFxuICAgICAgICAnZWE5OGU2NzIzMmQzYjMyOTVkM2I1MzU1MzIxMTVjY2FjODYxMmM3MjE4NTE2MTc1MjZhZTQ3YTljNzdiZmM4MidcbiAgICAgIF1cbiAgICBdXG4gIH0sXG4gIG5hZjoge1xuICAgIHduZDogNyxcbiAgICBwb2ludHM6IFtcbiAgICAgIFtcbiAgICAgICAgJ2Y5MzA4YTAxOTI1OGMzMTA0OTM0NGY4NWY4OWQ1MjI5YjUzMWM4NDU4MzZmOTliMDg2MDFmMTEzYmNlMDM2ZjknLFxuICAgICAgICAnMzg4ZjdiMGY2MzJkZTgxNDBmZTMzN2U2MmEzN2YzNTY2NTAwYTk5OTM0YzIyMzFiNmNiOWZkNzU4NGI4ZTY3MidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyZjhiZGU0ZDFhMDcyMDkzNTViNGE3MjUwYTVjNTEyOGU4OGI4NGJkZGM2MTlhYjdjYmE4ZDU2OWIyNDBlZmU0JyxcbiAgICAgICAgJ2Q4YWMyMjI2MzZlNWUzZDZkNGRiYTlkZGE2YzljNDI2Zjc4ODI3MWJhYjBkNjg0MGRjYTg3ZDNhYTZhYzYyZDYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNWNiZGYwNjQ2ZTVkYjRlYWEzOThmMzY1ZjJlYTdhMGUzZDQxOWI3ZTAzMzBlMzljZTkyYmRkZWRjYWM0ZjliYycsXG4gICAgICAgICc2YWViY2E0MGJhMjU1OTYwYTMxNzhkNmQ4NjFhNTRkYmE4MTNkMGI4MTNmZGU3YjVhNTA4MjYyODA4NzI2NGRhJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2FjZDQ4NGUyZjBjN2Y2NTMwOWFkMTc4YTlmNTU5YWJkZTA5Nzk2OTc0YzU3ZTcxNGMzNWYxMTBkZmMyN2NjYmUnLFxuICAgICAgICAnY2MzMzg5MjFiMGE3ZDlmZDY0MzgwOTcxNzYzYjYxZTlhZGQ4ODhhNDM3NWY4ZTBmMDVjYzI2MmFjNjRmOWMzNydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NzRhZTdmODU4YTk0MTFlNWVmNDI0NmI3MGM2NWFhYzU2NDk5ODBiZTVjMTc4OTFiYmVjMTc4OTVkYTAwOGNiJyxcbiAgICAgICAgJ2Q5ODRhMDMyZWI2YjVlMTkwMjQzZGQ1NmQ3YjdiMzY1MzcyZGIxZTJkZmY5ZDZhODMwMWQ3NGM5Yzk1M2M2MWInXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjI4NzczYzJkOTc1Mjg4YmM3ZDFkMjA1YzM3NDg2NTFiMDc1ZmJjNjYxMGU1OGNkZGVlZGRmOGYxOTQwNWFhOCcsXG4gICAgICAgICdhYjA5MDJlOGQ4ODBhODk3NTgyMTJlYjY1Y2RhZjQ3M2ExYTA2ZGE1MjFmYTkxZjI5YjVjYjUyZGIwM2VkODEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDc5MjRkNGY3ZDQzZWE5NjVhNDY1YWUzMDk1ZmY0MTEzMWU1OTQ2ZjNjODVmNzllNDRhZGJjZjhlMjdlMDgwZScsXG4gICAgICAgICc1ODFlMjg3MmE4NmM3MmE2ODM4NDJlYzIyOGNjNmRlZmVhNDBhZjJiZDg5NmQzYTVjNTA0ZGM5ZmY2YTI2YjU4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RlZmRlYTRjZGI2Nzc3NTBhNDIwZmVlODA3ZWFjZjIxZWI5ODk4YWU3OWI5NzY4NzY2ZTRmYWEwNGEyZDRhMzQnLFxuICAgICAgICAnNDIxMWFiMDY5NDYzNTE2OGU5OTdiMGVhZDJhOTNkYWVjZWQxZjRhMDRhOTVjMGY2Y2ZiMTk5ZjY5ZTU2ZWI3NydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyYjRlYTBhNzk3YTQ0M2QyOTNlZjVjZmY0NDRmNDk3OWYwNmFjZmViZDdlODZkMjc3NDc1NjU2MTM4Mzg1YjZjJyxcbiAgICAgICAgJzg1ZTg5YmMwMzc5NDVkOTNiMzQzMDgzYjVhMWM4NjEzMWEwMWY2MGM1MDI2OTc2M2I1NzBjODU0ZTVjMDliN2EnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzUyYmJmNGE0Y2RkMTI1NjRmOTNmYTMzMmNlMzMzMzAxZDlhZDQwMjcxZjgxMDcxODEzNDBhZWYyNWJlNTlkNScsXG4gICAgICAgICczMjFlYjQwNzUzNDhmNTM0ZDU5YzE4MjU5ZGRhM2UxZjRhMWIzYjJlNzFiMTAzOWM2N2JkM2Q4YmNmODE5OThjJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzJmYTIxMDRkNmIzOGQxMWIwMjMwMDEwNTU5ODc5MTI0ZTQyYWI4ZGZlZmY1ZmYyOWRjOWNkYWRkNGVjYWNjM2YnLFxuICAgICAgICAnMmRlMTA2ODI5NWRkODY1YjY0NTY5MzM1YmQ1ZGQ4MDE4MWQ3MGVjZmM4ODI2NDg0MjNiYTc2YjUzMmI3ZDY3J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzkyNDgyNzliMDliNGQ2OGRhYjIxYTliMDY2ZWRkYTgzMjYzYzNkODRlMDk1NzJlMjY5Y2EwY2Q3ZjU0NTM3MTQnLFxuICAgICAgICAnNzMwMTZmN2JmMjM0YWFkZTVkMWFhNzFiZGVhMmIxZmYzZmMwZGUyYTg4NzkxMmZmZTU0YTMyY2U5N2NiMzQwMidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkYWVkNGYyYmUzYThiZjI3OGU3MDEzMmZiMGJlYjc1MjJmNTcwZTE0NGJmNjE1YzA3ZTk5NmQ0NDNkZWU4NzI5JyxcbiAgICAgICAgJ2E2OWRjZTRhN2Q2Yzk4ZThkNGExYWNhODdlZjhkNzAwM2Y4M2MyMzBmM2FmYTcyNmFiNDBlNTIyOTBiZTFjNTUnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzQ0ZDEyYzcwNjVkODEyZThhY2YyOGQ3Y2JiMTlmOTAxMWVjZDllOWZkZjI4MWIwZTZhM2I1ZTg3ZDIyZTdkYicsXG4gICAgICAgICcyMTE5YTQ2MGNlMzI2Y2RjNzZjNDU5MjZjOTgyZmRhYzBlMTA2ZTg2MWVkZjYxYzVhMDM5MDYzZjBlMGU2NDgyJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzZhMjQ1YmY2ZGM2OTg1MDRjODlhMjBjZmRlZDYwODUzMTUyYjY5NTMzNmMyODA2M2I2MWM2NWNiZDI2OWU2YjQnLFxuICAgICAgICAnZTAyMmNmNDJjMmJkNGE3MDhiM2Y1MTI2ZjE2YTI0YWQ4YjMzYmE0OGQwNDIzYjZlZmQ1ZTYzNDgxMDBkOGE4MidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNjk3ZmZhNmZkOWRlNjI3YzA3N2UzZDJmZTU0MTA4NGNlMTMzMDBiMGJlYzExNDZmOTVhZTU3ZjBkMGJkNmE1JyxcbiAgICAgICAgJ2I5YzM5OGYxODY4MDZmNWQyNzU2MTUwNmU0NTU3NDMzYTJjZjE1MDA5ZTQ5OGFlN2FkZWU5ZDYzZDAxYjIzOTYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNjA1YmRiMDE5OTgxNzE4Yjk4NmQwZjA3ZTgzNGNiMGQ5ZGViODM2MGZmYjdmNjFkZjk4MjM0NWVmMjdhNzQ3OScsXG4gICAgICAgICcyOTcyZDJkZTRmOGQyMDY4MWE3OGQ5M2VjOTZmZTIzYzI2YmZhZTg0ZmIxNGRiNDNiMDFlMWU5MDU2YjhjNDknXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNjJkMTRkYWI0MTUwYmY0OTc0MDJmZGM0NWEyMTVlMTBkY2IwMWMzNTQ5NTliMTBjZmUzMWM3ZTlkODdmZjMzZCcsXG4gICAgICAgICc4MGZjMDZiZDhjYzViMDEwOTgwODhhMTk1MGVlZDBkYjAxYWExMzI5NjdhYjQ3MjIzNWY1NjQyNDgzYjI1ZWFmJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzgwYzYwYWQwMDQwZjI3ZGFkZTViNGIwNmM0MDhlNTZiMmM1MGU5ZjU2YjliOGI0MjVlNTU1YzJmODYzMDhiNmYnLFxuICAgICAgICAnMWMzODMwM2YxY2M1YzMwZjI2ZTY2YmFkN2ZlNzJmNzBhNjVlZWQ0Y2JlNzAyNGViMWFhMDFmNTY0MzBiZDU3YSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3YTkzNzVhZDYxNjdhZDU0YWE3NGM2MzQ4Y2M1NGQzNDRjYzVkYzk0ODdkODQ3MDQ5ZDVlYWJiMGZhMDNjOGZiJyxcbiAgICAgICAgJ2QwZTNmYTllY2E4NzI2OTA5NTU5ZTBkNzkyNjkwNDZiZGM1OWVhMTBjNzBjZTJiMDJkNDk5ZWMyMjRkYzdmNydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNTI4ZWNkOWI2OTZiNTRjOTA3YTllZDA0NTQ0N2E3OWJiNDA4ZWMzOWI2OGRmNTA0YmI1MWY0NTliYzNmZmM5JyxcbiAgICAgICAgJ2VlY2Y0MTI1MzEzNmU1Zjk5OTY2ZjIxODgxZmQ2NTZlYmM0MzQ1NDA1YzUyMGRiYzA2MzQ2NWI1MjE0MDk5MzMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDkzNzBhNGI1ZjQzNDEyZWEyNWY1MTRlOGVjZGFkMDUyNjYxMTVlNGE3ZWNiMTM4NzIzMTgwOGY4YjQ1OTYzJyxcbiAgICAgICAgJzc1OGYzZjQxYWZkNmVkNDI4YjMwODFiMDUxMmZkNjJhNTRjM2YzYWZiYjViNjc2NGI2NTMwNTJhMTI5NDljOWEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzdmMjMwOTM2ZWU4OGNiYmQ3M2RmOTMwZDY0NzAyZWY4ODFkODExZTBlMTQ5OGUyZjFjMTNlYjFmYzM0NWQ3NCcsXG4gICAgICAgICc5NThlZjQyYTc4ODZiNjQwMGEwODI2NmU5YmExYjM3ODk2Yzk1MzMwZDk3MDc3Y2JiZThlYjNjNzY3MWM2MGQ2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2YyZGFjOTkxY2M0Y2U0YjllYTQ0ODg3ZTVjN2MwYmNlNThjODAwNzRhYjlkNGRiYWViMjg1MzFiNzczOWY1MzAnLFxuICAgICAgICAnZTBkZWRjOWIzYjJmOGRhZDRkYTFmMzJkZWMyNTMxZGY5ZWI1ZmJlYjA1OThlNGZkMWExMTdkYmE3MDNhM2MzNydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0NjNiM2Q5ZjY2MjYyMWZiMWI0YmU4ZmJiZTI1MjAxMjVhMjE2Y2RmYzlkYWUzZGViY2JhNDg1MGM2OTBkNDViJyxcbiAgICAgICAgJzVlZDQzMGQ3OGMyOTZjMzU0MzExNDMwNmRkODYyMmQ3YzYyMmUyN2M5NzBhMWRlMzFjYjM3N2IwMWFmNzMwN2UnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjE2ZjgwNDI0NGU0NmUyYTA5MjMyZDRhZmYzYjU5OTc2Yjk4ZmFjMTQzMjhhMmQxYTMyNDk2YjQ5OTk4ZjI0NycsXG4gICAgICAgICdjZWRhYmQ5YjgyMjAzZjdlMTNkMjA2ZmNkZjRlMzNkOTJhNmM1M2MyNmU1Y2NlMjZkNjU3OTk2MmM0ZTMxZGY2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2NhZjc1NDI3MmRjODQ1NjNiMDM1MmI3YTE0MzExYWY1NWQyNDUzMTVhY2UyN2M2NTM2OWUxNWY3MTUxZDQxZDEnLFxuICAgICAgICAnY2I0NzQ2NjBlZjM1ZjVmMmE0MWI2NDNmYTVlNDYwNTc1ZjRmYTliNzk2MjIzMmE1YzMyZjkwODMxOGEwNDQ3NidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyNjAwY2E0YjI4MmNiOTg2Zjg1ZDBmMTcwOTk3OWQ4YjQ0YTA5YzA3Y2I4NmQ3YzEyNDQ5N2JjODZmMDgyMTIwJyxcbiAgICAgICAgJzQxMTliODg3NTNjMTViZDZhNjkzYjAzZmNkZGJiNDVkNWFjNmJlNzRhYjVmMGVmNDRiMGJlOTQ3NWE3ZTRiNDAnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzYzNWNhNzJkN2U4NDMyYzMzOGVjNTNjZDEyMjIwYmMwMWM0ODY4NWUyNGY3ZGM4YzYwMmE3NzQ2OTk4ZTQzNScsXG4gICAgICAgICc5MWI2NDk2MDk0ODlkNjEzZDFkNWU1OTBmNzhlNmQ3NGVjZmMwNjFkNTcwNDhiYWQ5ZTc2ZjMwMmM1YjljNjEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzU0ZTMyMzlmMzI1NTcwY2RiYmY0YTg3ZGVlZThhNjZiN2YyYjMzNDc5ZDQ2OGZiYzFhNTA3NDNiZjU2Y2MxOCcsXG4gICAgICAgICc2NzNmYjg2ZTViZGEzMGZiM2NkMGVkMzA0ZWE0OWEwMjNlZTMzZDAxOTdhNjk1ZDBjNWQ5ODA5M2M1MzY2ODMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTNlNmJkMTA3MWExZTk2YWZmNTc4NTljODJkNTcwZjAzMzA4MDA2NjFkMWM5NTJmOWZlMjY5NDY5MWQ5YjllOCcsXG4gICAgICAgICc1OWM5ZTBiYmEzOTRlNzZmNDBjMGFhNTgzNzlhM2NiNmE1YTIyODM5OTNlOTBjNDE2NzAwMmFmNDkyMGUzN2Y1J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE4NmI0ODNkMDU2YTAzMzgyNmFlNzNkODhmNzMyOTg1YzRjY2IxZjMyYmEzNWY0YjRjYzQ3ZmRjZjA0YWE2ZWInLFxuICAgICAgICAnM2I5NTJkMzJjNjdjZjc3ZTJlMTc0NDZlMjA0MTgwYWIyMWZiODA5MDg5NTEzOGI0YTRhNzk3Zjg2ZTgwODg4YidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkZjlkNzBhNmI5ODc2Y2U1NDRjOTg1NjFmNGJlNGY3MjU0NDJlNmQyYjczN2Q5YzkxYTgzMjE3MjRjZTA5NjNmJyxcbiAgICAgICAgJzU1ZWIyZGFmZDg0ZDZjY2Q1Zjg2MmI3ODVkYzM5ZDRhYjE1NzIyMjcyMGVmOWRhMjE3YjhjNDVjZjJiYTI0MTcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNWVkZDVjYzIzYzUxZTg3YTQ5N2NhODE1ZDVkY2UwZjhhYjUyNTU0Zjg0OWVkODk5NWRlNjRjNWYzNGNlNzE0MycsXG4gICAgICAgICdlZmFlOWM4ZGJjMTQxMzA2NjFlOGNlYzAzMGM4OWFkMGMxM2M2NmMwZDE3YTI5MDVjZGM3MDZhYjczOTlhODY4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzI5MDc5OGMyYjY0NzY4MzBkYTEyZmUwMjI4N2U5ZTc3N2FhM2ZiYTFjMzU1YjE3YTcyMmQzNjJmODQ2MTRmYmEnLFxuICAgICAgICAnZTM4ZGE3NmRjZDQ0MDYyMTk4OGQwMGJjZjc5YWYyNWQ1YjI5YzA5NGRiMmEyMzE0NmQwMDNhZmQ0MTk0M2U3YSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhZjNjNDIzYTk1ZDlmNWIzMDU0NzU0ZWZhMTUwYWMzOWNkMjk1NTJmZTM2MDI1NzM2MmRmZGVjZWY0MDUzYjQ1JyxcbiAgICAgICAgJ2Y5OGEzZmQ4MzFlYjJiNzQ5YTkzYjBlNmYzNWNmYjQwYzhjZDVhYTY2N2ExNTU4MWJjMmZlZGVkNDk4ZmQ5YzYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzY2ZGJiMjRkMTM0ZTc0NWNjY2FhMjhjOTliZjI3NDkwNmJiNjZiMjZkY2Y5OGRmOGQyZmVkNTBkODg0MjQ5YScsXG4gICAgICAgICc3NDRiMTE1MmVhY2JlNWUzOGRjYzg4Nzk4MGRhMzhiODk3NTg0YTY1ZmEwNmNlZGQyYzkyNGY5N2NiYWM1OTk2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzU5ZGJmNDZmOGM5NDc1OWJhMjEyNzdjMzM3ODRmNDE2NDVmN2I0NGY2YzU5NmE1OGNlOTJlNjY2MTkxYWJlM2UnLFxuICAgICAgICAnYzUzNGFkNDQxNzVmYmMzMDBmNGVhNmNlNjQ4MzA5YTA0MmNlNzM5YTc5MTk3OThjZDg1ZTIxNmM0YTMwN2Y2ZSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmMTNhZGE5NTEwM2M0NTM3MzA1ZTY5MWU3NGU5YTRhOGRkNjQ3ZTcxMWE5NWU3M2NiNjJkYzYwMThjZmQ4N2I4JyxcbiAgICAgICAgJ2UxMzgxN2I0NGVlMTRkZTY2M2JmNGJjODA4MzQxZjMyNjk0OWUyMWE2YTc1YzI1NzA3Nzg0MTliZGFmNTczM2QnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzc1NGI0ZmEwZThhY2VkMDZkNDE2N2EyYzU5Y2NhNGNkYTE4NjljMDZlYmFkZmI2NDg4NTUwMDE1YTg4NTIyYycsXG4gICAgICAgICczMGU5M2U4NjRlNjY5ZDgyMjI0Yjk2N2MzMDIwYjhmYThkMWU0ZTM1MGI2Y2JjYzUzN2E0OGI1Nzg0MTE2M2EyJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzk0OGRjYWRmNTk5MGUwNDhhYTM4NzRkNDZhYmVmOWQ3MDE4NThmOTVkZTgwNDFkMmE2ODI4Yzk5ZTIyNjI1MTknLFxuICAgICAgICAnZTQ5MWE0MjUzN2Y2ZTU5N2Q1ZDI4YTMyMjRiMWJjMjVkZjkxNTRlZmJkMmVmMWQyY2JiYTJjYWU1MzQ3ZDU3ZSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3OTYyNDE0NDUwYzc2YzE2ODljN2I0OGY4MjAyZWMzN2ZiMjI0Y2Y1YWMwYmZhMTU3MDMyOGE4YTNkN2M3N2FiJyxcbiAgICAgICAgJzEwMGI2MTBlYzRmZmI0NzYwZDVjMWZjMTMzZWY2ZjZiMTI1MDdhMDUxZjA0YWM1NzYwYWZhNWIyOWRiODM0MzcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzUxNDA4NzgzNDk2NGI1NGIxNWIxNjA2NDRkOTE1NDg1YTE2OTc3MjI1Yjg4NDdiYjBkZDA4NTEzN2VjNDdjYScsXG4gICAgICAgICdlZjBhZmJiMjA1NjIwNTQ0OGUxNjUyYzQ4ZTgxMjdmYzYwMzllNzdjMTVjMjM3OGI3ZTdkMTVhMGRlMjkzMzExJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2QzY2MzMGFkNmI0ODNlNGJjNzljZTJjOWRkOGJjNTQ5OTNlOTQ3ZWI4ZGY3ODdiNDQyOTQzZDNmN2I1MjdlYWYnLFxuICAgICAgICAnOGIzNzhhMjJkODI3Mjc4ZDg5YzVlOWJlOGY5NTA4YWUzYzJhZDQ2MjkwMzU4NjMwYWZiMzRkYjA0ZWVkZTBhNCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNjI0ZDg0NzgwNzMyODYwY2UxYzc4ZmNiZmVmZTA4YjJiMjk4MjNkYjkxM2Y2NDkzOTc1YmEwZmY0ODQ3NjEwJyxcbiAgICAgICAgJzY4NjUxY2Y5YjZkYTkwM2UwOTE0NDQ4YzZjZDlkNGNhODk2ODc4ZjUyODJiZTRjOGNjMDZlMmE0MDQwNzg1NzUnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzMzY2U4MGRhOTU1YThhMjY5MDJjOTU2MzNlNjJhOTg1MTkyNDc0YjVhZjIwN2RhNmRmN2I0ZmQ1ZmM2MWNkNCcsXG4gICAgICAgICdmNTQzNWEyYmQyYmFkZjdkNDg1YTRkOGI4ZGI5ZmNjZTNlMWVmOGUwMjAxZTQ1NzhjNTQ2NzNiYzFkYzVlYTFkJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE1ZDk0NDEyNTQ5NDUwNjRjZjFhMWMzM2JiZDNiNDlmODk2NmM1MDkyMTcxZTY5OWVmMjU4ZGZhYjgxYzA0NWMnLFxuICAgICAgICAnZDU2ZWIzMGI2OTQ2M2U3MjM0ZjUxMzdiNzNiODQxNzc0MzQ4MDBiYWNlYmZjNjg1ZmMzN2JiZTllZmU0MDcwZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhMWQwZmNmMmVjOWRlNjc1YjYxMjEzNmU1Y2U3MGQyNzFjMjE0MTdjOWQyYjhhYWFhYzEzODU5OWQwNzE3OTQwJyxcbiAgICAgICAgJ2VkZDc3ZjUwYmNiNWEzY2FiMmU5MDczNzMwOTY2N2YyNjQxNDYyYTU0MDcwZjNkNTE5MjEyZDM5YzE5N2E2MjknXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTIyZmJlMTVjMGFmOGNjYzU3ODBjMDczNWY4NGRiZTlhNzkwYmFkZWU4MjQ1YzA2YzdjYTM3MzMxY2IzNjk4MCcsXG4gICAgICAgICdhODU1YmFiYWQ1Y2Q2MGM4OGI0MzBhNjlmNTNhMWE3YTM4Mjg5MTU0OTY0Nzk5YmU0M2QwNmQ3N2QzMWRhMDYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzExMDkxZGQ5ODYwZThlMjBlZTEzNDczYzExNTVmNWY2OTYzNWUzOTQ3MDRlYWE3NDAwOTQ1MjI0NmNmYTliMycsXG4gICAgICAgICc2NmRiNjU2Zjg3ZDFmMDRmZmZkMWYwNDc4OGMwNjgzMDg3MWVjNWE2NGZlZWU2ODViZDgwZjBiMTI4NmQ4Mzc0J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM0YzFmZDA0ZDMwMWJlODliMzFjMDQ0MmQzZTZhYzI0ODgzOTI4YjQ1YTkzNDA3ODE4NjdkNDIzMmVjMmRiZGYnLFxuICAgICAgICAnOTQxNDY4NWU5N2IxYjU5NTRiZDQ2ZjczMDE3NDEzNmQ1N2YxY2VlYjQ4NzQ0M2RjNTMyMTg1N2JhNzNhYmVlJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2YyMTllYTVkNmI1NDcwMWMxYzE0ZGU1YjU1N2ViNDJhOGQxM2YzYWJiY2QwOGFmZmNjMmE1ZTZiMDQ5YjhkNjMnLFxuICAgICAgICAnNGNiOTU5NTdlODNkNDBiMGY3M2FmNDU0NGNjY2Y2YjFmNGIwOGQzYzA3YjI3ZmI4ZDhjMjk2MmE0MDA3NjZkMSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkN2I4NzQwZjc0YThmYmFhYjFmNjgzZGI4ZjQ1ZGUyNjU0M2E1NDkwYmNhNjI3MDg3MjM2OTEyNDY5YTBiNDQ4JyxcbiAgICAgICAgJ2ZhNzc5NjgxMjhkOWM5MmVlMTAxMGYzMzdhZDQ3MTdlZmYxNWRiNWVkM2MwNDliMzQxMWUwMzE1ZWFhNDU5M2InXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzJkMzFjMjIyZjhmNmYwZWY4NmY3Yzk4ZDNhMzMzNWVhZDViY2QzMmFiZGQ5NDI4OWZlNGQzMDkxYWE4MjRiZicsXG4gICAgICAgICc1ZjMwMzJmNTg5MjE1NmUzOWNjZDNkNzkxNWI5ZTFkYTJlNmRhYzllNmYyNmU5NjExMThkMTRiODQ2MmUxNjYxJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc0NjFmMzcxOTE0YWIzMjY3MTA0NWExNTVkOTgzMWVhODc5M2Q3N2NkNTk1OTJjNDM0MGY4NmNiYzE4MzQ3YjUnLFxuICAgICAgICAnOGVjMGJhMjM4Yjk2YmVjMGNiZGRkY2FlMGFhNDQyNTQyZWVlMWZmNTBjOTg2ZWE2YjM5ODQ3YjNjYzA5MmZmNidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlZTA3OWFkYjFkZjE4NjAwNzQzNTZhMjVhYTM4MjA2YTZkNzE2YjJjM2U2NzQ1M2QyODc2OThiYWQ3YjJiMmQ2JyxcbiAgICAgICAgJzhkYzI0MTJhYWZlM2JlNWM0YzVmMzdlMGVjYzVmOWY2YTQ0Njk4OWFmMDRjNGUyNWViYWFjNDc5ZWMxYzhjMWUnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTZlYzkzZTQ0N2VjODNmMDQ2N2IxODMwMmVlNjIwZjdlNjVkZTMzMTg3NGM5ZGM3MmJmZDg2MTZiYTlkYTZiNScsXG4gICAgICAgICc1ZTQ2MzExNTBlNjJmYjQwZDBlOGMyYTdjYTU4MDRhMzlkNTgxODZhNTBlNDk3MTM5NjI2Nzc4ZTI1YjA2NzRkJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VhYTVmOTgwYzI0NWY2ZjAzODk3ODI5MGFmYTcwYjZiZDg4NTU4OTdmOThiNmFhNDg1Yjk2MDY1ZDUzN2JkOTknLFxuICAgICAgICAnZjY1ZjVkM2UyOTJjMmUwODE5YTUyODM5MWM5OTQ2MjRkNzg0ODY5ZDdlNmVhNjdmYjE4MDQxMDI0ZWRjMDdkYydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3OGM5NDA3NTQ0YWMxMzI2OTJlZTE5MTBhMDI0Mzk5NThhZTA0ODc3MTUxMzQyZWE5NmM0YjZiMzVhNDlmNTEnLFxuICAgICAgICAnZjNlMDMxOTE2OWViOWI4NWQ1NDA0Nzk1NTM5YTVlNjhmYTFmYmQ1ODNjMDY0ZDI0NjJiNjc1ZjE5NGEzZGRiNCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0OTRmNGJlMjE5YTFhNzcwMTZkY2Q4Mzg0MzFhZWEwMDAxY2RjOGFlN2E2ZmM2ODg3MjY1NzhkOTcwMjg1N2E1JyxcbiAgICAgICAgJzQyMjQyYTk2OTI4M2E1ZjMzOWJhN2YwNzVlMzZiYTJhZjkyNWNlMzBkNzY3ZWQ2ZTU1ZjRiMDMxODgwZDU2MmMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTU5OGE4MDMwZGE2ZDg2YzZiYzdmMmY1MTQ0ZWE1NDlkMjgyMTFlYTU4ZmFhNzBlYmY0YzFlNjY1YzFmZTliNScsXG4gICAgICAgICcyMDRiNWQ2Zjg0ODIyYzMwN2U0YjRhNzE0MDczN2FlYzIzZmM2M2I2NWIzNWY4NmExMDAyNmRiZDJkODY0ZTZiJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2M0MTkxNjM2NWFiYjJiNWQwOTE5MmY1ZjJkYmVhZmVjMjA4ZjAyMGYxMjU3MGExODRkYmFkYzNlNTg1OTU5OTcnLFxuICAgICAgICAnNGYxNDM1MWQwMDg3ZWZhNDlkMjQ1YjMyODk4NDk4OWQ1Y2FmOTQ1MGYzNGJmYzBlZDE2ZTk2YjU4ZmE5OTEzJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg0MWQ2MDYzYTU4NmZhNDc1YTcyNDYwNGRhMDNiYzViOTJhMmUwZDJlMGEzNmFjZmU0YzczYTU1MTQ3NDI4ODEnLFxuICAgICAgICAnNzM4NjdmNTljMDY1OWU4MTkwNGY5YTFjNzU0MzY5OGU2MjU2MmQ2NzQ0YzE2OWNlN2EzNmRlMDFhOGQ2MTU0J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzVlOTViYjM5OWE2OTcxZDM3NjAyNjk0N2Y4OWJkZTJmMjgyYjMzODEwOTI4YmU0ZGVkMTEyYWM0ZDcwZTIwZDUnLFxuICAgICAgICAnMzlmMjNmMzY2ODA5MDg1YmVlYmZjNzExODEzMTM3NzVhOTljOWFlZDdkOGJhMzhiMTYxMzg0Yzc0NjAxMjg2NSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNmU0NjQxYTUzOTQ4ZmQ0NzZjMzlmOGE5OWZkOTc0ZTVlYzA3NTY0YjUzMTVkOGJmOTk0NzFiY2EwZWYyZjY2JyxcbiAgICAgICAgJ2QyNDI0YjFiMWFiZTRlYjgxNjQyMjdiMDg1YzlhYTk0NTZlYTEzNDkzZmQ1NjNlMDZmZDUxY2Y1Njk0Yzc4ZmMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzM2NTgxZWE3YmZiYmIyOTBjMTkxYTJmNTA3YTQxY2Y1NjQzODQyMTcwZTkxNGZhZWFiMjdjMmM1NzlmNzI2JyxcbiAgICAgICAgJ2VhZDEyMTY4NTk1ZmUxYmU5OTI1MjEyOWI2ZTU2YjMzOTFmN2FiMTQxMGNkMWUwZWYzZGNkY2FiZDJmZGEyMjQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGFiODk4MTZkYWRmZDZiNmExZjI2MzRmY2YwMGVjODQwMzc4MTAyNWVkNjg5MGM0ODQ5NzQyNzA2YmQ0M2VkZScsXG4gICAgICAgICc2ZmRjZWYwOWYyZjZkMGEwNDRlNjU0YWVmNjI0MTM2ZjUwM2Q0NTljM2U4OTg0NTg1OGE0N2E5MTI5Y2RkMjRlJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzFlMzNmMWE3NDZjOWM1Nzc4MTMzMzQ0ZDkyOTlmY2FhMjBiMDkzOGU4YWNmZjI1NDRiYjQwMjg0YjhjNWZiOTQnLFxuICAgICAgICAnNjA2NjAyNTdkZDExYjNhYTljOGVkNjE4ZDI0ZWRmZjIzMDZkMzIwZjFkMDMwMTBlMzNhN2QyMDU3ZjNiM2I2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg1YjdjMWRjYjNjZWMxYjdlZTdmMzBkZWQ3OWRkMjBhMGVkMWY0Y2MxOGNiY2ZjZmE0MTAzNjFmZDhmMDhmMzEnLFxuICAgICAgICAnM2Q5OGE5Y2RkMDI2ZGQ0M2YzOTA0OGYyNWE4ODQ3ZjRmY2FmYWQxODk1ZDdhNjMzYzZmZWQzYzM1ZTk5OTUxMSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyOWRmOWZiZDhkOWU0NjUwOTI3NWY0YjEyNWQ2ZDQ1ZDdmYmU5YTNiODc4YTdhZjg3MmEyODAwNjYxYWM1ZjUxJyxcbiAgICAgICAgJ2I0YzRmZTk5Yzc3NWE2MDZlMmQ4ODYyMTc5MTM5ZmZkYTYxZGM4NjFjMDE5ZTU1Y2QyODc2ZWIyYTI3ZDg0YidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhMGIxY2FlMDZiMGE4NDdhM2ZlYTZlNjcxYWFmOGFkZmRmZTU4Y2EyZjc2ODEwNWM4MDgyYjJlNDQ5ZmNlMjUyJyxcbiAgICAgICAgJ2FlNDM0MTAyZWRkZTA5NThlYzRiMTlkOTE3YTZhMjhlNmI3MmRhMTgzNGFmZjBlNjUwZjA0OTUwM2EyOTZjZjInXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNGU4Y2VhZmI5YjNlOWExMzZkYzdmZjY3ZTg0MDI5NWI0OTlkZmIzYjIxMzNlNGJhMTEzZjJlNGMwZTEyMWU1JyxcbiAgICAgICAgJ2NmMjE3NDExOGM4YjZkN2E0YjQ4ZjZkNTM0Y2U1Yzc5NDIyYzA4NmE2MzQ2MDUwMmI4MjdjZTYyYTMyNjY4M2MnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDI0YTQ0ZTA0N2UxOWI2ZjVhZmI4MWM3Y2EyZjY5MDgwYTUwNzY2ODlhMDEwOTE5ZjQyNzI1YzJiNzg5YTMzYicsXG4gICAgICAgICc2ZmI4ZDU1OTFiNDY2ZjhmYzYzZGI1MGYxYzBmMWM2OTAxM2Y5OTY4ODdiODI0NGQyY2RlYzQxN2FmZWE4ZmEzJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VhMDE2MDZhN2E2YzljZGQyNDlmZGZjZmFjYjk5NTg0MDAxZWRkMjhhYmJhYjc3YjUxMDRlOThlOGUzYjM1ZDQnLFxuICAgICAgICAnMzIyYWY0OTA4YzczMTJiMGNmYmZlMzY5ZjdhN2IzY2RiN2Q0NDk0YmMyODIzNzAwY2ZkNjUyMTg4YTNlYTk4ZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhZjhhZGRiZjJiNjYxYzhhNmM2MzI4NjU1ZWI5NjY1MTI1MjAwN2Q4YzVlYTMxYmU0YWQxOTZkZThjZTIxMzFmJyxcbiAgICAgICAgJzY3NDllNjdjMDI5Yjg1ZjUyYTAzNGVhZmQwOTY4MzZiMjUyMDgxODY4MGUyNmFjOGYzZGZiY2RiNzE3NDk3MDAnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTNhZTE5NzQ1NjZjYTA2Y2M1MTZkNDdlMGZiMTY1YTY3NGEzZGFiY2ZjYTE1ZTcyMmYwZTM0NTBmNDU4ODknLFxuICAgICAgICAnMmFlYWJlN2U0NTMxNTEwMTE2MjE3ZjA3YmY0ZDA3MzAwZGU5N2U0ODc0ZjgxZjUzMzQyMGE3MmVlYjBiZDZhNCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1OTFlZTM1NTMxM2Q5OTcyMWNmNjk5M2ZmZWQxZTNlMzAxOTkzZmYzZWQyNTg4MDIwNzVlYThjZWQzOTdlMjQ2JyxcbiAgICAgICAgJ2IwZWE1NThhMTEzYzMwYmVhNjBmYzQ3NzU0NjBjNzkwMWZmMGIwNTNkMjVjYTJiZGVlZTk4ZjFhNGJlNWQxOTYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTEzOTZkNTVmZGE1NGM0OWYxOWFhOTczMThkOGRhNjFmYTg1ODRlNDdiMDg0OTQ1MDc3Y2YwMzI1NWI1Mjk4NCcsXG4gICAgICAgICc5OThjNzRhOGNkNDVhYzAxMjg5ZDU4MzNhN2JlYjQ3NDRmZjUzNmIwMWIyNTdiZTRjNTc2N2JlYTkzZWE1N2E0J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzNjNWQyYTFiYTM5YzVhMTc5MDAwMDczOGM5ZTBjNDBiOGRjZGZkNTQ2ODc1NGI2NDA1NTQwMTU3ZTAxN2FhN2EnLFxuICAgICAgICAnYjIyODQyNzk5OTVhMzRlMmY5ZDRkZTczOTZmYzE4YjgwZjliOGI5ZmRkMjcwZjY2NjFmNzljYTRjODFiZDI1NydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjYzg3MDRiOGE2MGEwZGVmYTNhOTlhNzI5OWYyZTljM2ZiYzM5NWFmYjA0YWMwNzg0MjVlZjhhMTc5M2NjMDMwJyxcbiAgICAgICAgJ2JkZDQ2MDM5ZmVlZDE3ODgxZDFlMDg2MmRiMzQ3ZjhjZjM5NWI3NGZjNGJjZGM0ZTk0MGI3NGUzYWMxZjFiMTMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzUzM2U0ZjdlYTg1NTVhYWNkOTc3N2FjNWNhZDI5Yjk3ZGQ0ZGVmY2NjNTNlZTdlYTIwNDExOWIyODg5YjE5NycsXG4gICAgICAgICc2ZjBhMjU2YmM1ZWZkZjQyOWEyZmI2MjQyZjFhNDNhMmQ5YjkyNWJiNGE0YjNhMjZiYjhlMGY0NWViNTk2MDk2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2MxNGY4ZjJjY2IyN2Q2ZjEwOWY2ZDA4ZDAzY2M5NmE2OWJhOGMzNGVlYzA3YmJjZjU2NmQ0OGUzM2RhNjU5MycsXG4gICAgICAgICdjMzU5ZDY5MjNiYjM5OGY3ZmQ0NDczZTE2ZmUxYzI4NDc1Yjc0MGRkMDk4MDc1ZTZjMGU4NjQ5MTEzZGMzYTM4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2E2Y2JjMzA0NmJjNmE0NTBiYWMyNDc4OWZhMTcxMTVhNGM5NzM5ZWQ3NWY4ZjIxY2U0NDFmNzJlMGI5MGU2ZWYnLFxuICAgICAgICAnMjFhZTdmNDY4MGU4ODliYjEzMDYxOWUyYzBmOTVhMzYwY2ViNTczYzcwNjAzMTM5ODYyYWZkNjE3ZmE5YjlmJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM0N2Q2ZDlhMDJjNDg5MjdlYmZiODZjMTM1OWIxY2FmMTMwYTNjMDI2N2QxMWNlNjM0NGIzOWY5OWQ0M2NjMzgnLFxuICAgICAgICAnNjBlYTdmNjFhMzUzNTI0ZDFjOTg3ZjZlY2VjOTJmMDg2ZDU2NWFiNjg3ODcwY2IxMjY4OWZmMWUzMWM3NDQ0OCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkYTY1NDVkMjE4MWRiOGQ5ODNmN2RjYjM3NWVmNTg2NmQ0N2M2N2IxYmYzMWM4Y2Y4NTVlZjc0MzdiNzI2NTZhJyxcbiAgICAgICAgJzQ5Yjk2NzE1YWI2ODc4YTc5ZTc4ZjA3Y2U1NjgwYzVkNjY3MzA1MWI0OTM1YmQ4OTdmZWE4MjRiNzdkYzIwOGEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzQwNzQ3Y2M5ZDAxMmNiMWExM2I4MTQ4MzA5YzZkZTdlYzI1ZDY5NDVkNjU3MTQ2YjlkNTk5NGI4ZmViMTExMScsXG4gICAgICAgICc1Y2E1NjA3NTNiZTJhMTJmYzZkZTZjYWYyY2I0ODk1NjVkYjkzNjE1NmI5NTE0ZTFiYjVlODMwMzdlMGZhMmQ0J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzRlNDJjOGVjODJjOTk3OThjY2YzYTYxMGJlODcwZTc4MzM4YzdmNzEzMzQ4YmQzNGM4MjAzZWY0MDM3ZjM1MDInLFxuICAgICAgICAnNzU3MWQ3NGVlNWUwZmI5MmE3YThiMzNhMDc3ODMzNDFhNTQ5MjE0NGNjNTRiY2M0MGE5NDQ3MzY5MzYwNjQzNydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNzc1YWI3MDg5YmM2YWY4MjNhYmEyZTFhZjcwYjIzNmQyNTFjYWRiMGM4Njc0MzI4NzUyMmExYjNiMGRlZGVhJyxcbiAgICAgICAgJ2JlNTJkMTA3YmNmYTA5ZDhiY2I5NzM2YTgyOGNmYTdmYWM4ZGIxN2JmN2E3NmEyYzQyYWQ5NjE0MDkwMThjZjcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnY2VlMzFjYmY3ZTM0ZWMzNzlkOTRmYjgxNGQzZDc3NWFkOTU0NTk1ZDEzMTRiYTg4NDY5NTllM2U4MmY3NGUyNicsXG4gICAgICAgICc4ZmQ2NGExNGMwNmI1ODljMjZiOTQ3YWUyYmNmNmJmYTAxNDllZjBiZTE0ZWQ0ZDgwZjQ0OGEwMWM0M2IxYzZkJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2I0ZjllYWVhMDliNjkxNzYxOWY2ZWE2YTRlYjU0NjRlZmRkYjU4ZmQ0NWIxZWJlZmNkYzFhMDFkMDhiNDc5ODYnLFxuICAgICAgICAnMzllNWM5OTI1YjVhNTRiMDc0MzNhNGYxOGM2MTcyNmY4YmIxMzFjMDEyY2E1NDJlYjI0YThhYzA3MjAwNjgyYSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNDI2M2RmYzNkMmRmOTIzYTAxNzlhNDg5NjZkMzBjZTg0ZTI1MTVhZmMzZGNjYzFiNzc5MDc3OTJlYmNjNjBlJyxcbiAgICAgICAgJzYyZGZhZjA3YTBmNzhmZWIzMGUzMGQ2Mjk1ODUzY2UxODllMTI3NzYwYWQ2Y2Y3ZmFlMTY0ZTEyMmEyMDhkNTQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDg0NTc1MjQ4MjBmYTY1YTRmOGQzNWViNjkzMDg1N2MwMDMyYWNjMGE0YTJkZTQyMjIzM2VlZGE4OTc2MTJjNCcsXG4gICAgICAgICcyNWE3NDhhYjM2Nzk3OWQ5ODczM2MzOGExZmExYzJlN2RjNmNjMDdkYjJkNjBhOWFlN2E3NmFhYTQ5YmQwZjc3J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RmZWVlZjE4ODExMDFmMmNiMTE2NDRmM2EyYWZkZmMyMDQ1ZTE5OTE5MTUyOTIzZjM2N2ExNzY3YzExY2NlZGEnLFxuICAgICAgICAnZWNmYjcwNTZjZjFkZTA0MmY5NDIwYmFiMzk2NzkzYzBjMzkwYmRlNzRiNGJiZGZmMTZhODNhZTA5YTlhNzUxNydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2ZDdlZjZiMTc1NDNmODM3M2M1NzNmNDRlMWYzODk4MzVkODliY2JjNjA2MmNlZDM2YzgyZGY4M2I4ZmFlODU5JyxcbiAgICAgICAgJ2NkNDUwZWMzMzU0Mzg5ODZkZmVmYTEwYzU3ZmVhOWJjYzUyMWEwOTU5YjJkODBiYmY3NGIxOTBkY2E3MTJkMTAnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTc1NjA1ZDU5MTAyYTVhMjY4NDUwMGQzYjk5MWYyZTNmM2M4OGI5MzIyNTU0NzAzNWFmMjVhZjY2ZTA0NTQxZicsXG4gICAgICAgICdmNWM1NDc1NGE4ZjcxZWU1NDBiOWI0ODcyODQ3M2UzMTRmNzI5YWM1MzA4YjA2OTM4MzYwOTkwZTJiZmFkMTI1J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2ViOTg2NjBmNGM0ZGZhYTA2YTJiZTQ1M2Q1MDIwYmM5OWEwYzJlNjBhYmUzODg0NTdkZDQzZmVmYjFlZDYyMGMnLFxuICAgICAgICAnNmNiOWE4ODc2ZDljYjg1MjA2MDlhZjNhZGQyNmNkMjBhMGE3Y2Q4YTk0MTExMzFjZTg1ZjQ0MTAwMDk5MjIzZSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxM2U4N2IwMjdkODUxNGQzNTkzOWYyZTY4OTJiMTk5MjIxNTQ1OTY5NDE4ODgzMzZkYzM1NjNlM2I4ZGJhOTQyJyxcbiAgICAgICAgJ2ZlZjVhM2M2ODA1OWE2ZGVjNWQ2MjQxMTRiZjFlOTFhYWMyYjlkYTU2OGQ2YWJlYjI1NzBkNTU2NDZiOGFkZjEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWUxNjMwMjZlOWZkNmZlMDE3YzM4ZjA2YTViZTZmYzEyNTQyNGIzNzFjZTI3MDhlN2JmNDQ5MTY5MWU1NzY0YScsXG4gICAgICAgICcxYWNiMjUwZjI1NWRkNjFjNDNkOTRjY2M2NzBkMGY1OGY0OWFlM2ZhMTViOTY2MjNlNTQzMGRhMGFkNmM2MmIyJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2IyNjhmNWVmOWFkNTFlNGQ3OGRlM2E3NTBjMmRjODliMWU2MjZkNDM1MDU4Njc5OTk5MzJlNWRiMzNhZjNkODAnLFxuICAgICAgICAnNWYzMTBkNGIzYzk5YjllYmIxOWY3N2Q0MWMxZGVlMDE4Y2YwZDM0ZmQ0MTkxNjE0MDAzZTk0NWExMjE2ZTQyMydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmZjA3ZjMxMThhOWRmMDM1ZTlmYWQ4NWViNmM3YmZlNDJiMDJmMDFjYTk5Y2VlYTNiZjdmZmRiYTkzYzQ3NTBkJyxcbiAgICAgICAgJzQzODEzNmQ2MDNlODU4YTNhNWM0NDBjMzhlY2NiYWRkYzFkMjk0MjExNGUyZWRkZDQ3NDBkMDk4Y2VkMWYwZDgnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGQ4Yjk4NTVjN2MwNTJhMzQxNDZmZDIwZmZiNjU4YmVhNGI5ZjY5ZTBkODI1ZWJlYzE2ZThjM2NlMmI1MjZhMScsXG4gICAgICAgICdjZGI1NTllZWRjMmQ3OWY5MjZiYWY0NGZiODRlYTRkNDRiY2Y1MGZlZTUxZDdjZWIzMGUyZTdmNDYzMDM2NzU4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzUyZGIwYjUzODRkZmJmMDViZmE5ZDQ3MmQ3YWUyNmRmZTRiODUxY2VjYTkxYjFlYmE1NDI2MzE4MGRhMzJiNjMnLFxuICAgICAgICAnYzNiOTk3ZDA1MGVlNWQ0MjNlYmFmNjZhNmRiOWY1N2IzMTgwYzkwMjg3NTY3OWRlOTI0YjY5ZDg0YTdiMzc1J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2U2MmY5NDkwZDNkNTFkYTYzOTVlZmQyNGU4MDkxOWNjN2QwZjI5YzNmM2ZhNDhjNmZmZjU0M2JlY2JkNDMzNTInLFxuICAgICAgICAnNmQ4OWFkN2JhNDg3NmIwYjIyYzJjYTI4MGM2ODI4NjJmMzQyYzg1OTFmMWRhZjUxNzBlMDdiZmQ5Y2NhZmE3ZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3ZjMwZWEyNDc2YjM5OWI0OTU3NTA5Yzg4Zjc3ZDAxOTFhZmEyZmY1Y2I3YjE0ZmQ2ZDhlN2Q2NWFhYWIxMTkzJyxcbiAgICAgICAgJ2NhNWVmN2Q0YjIzMWM5NGMzYjE1Mzg5YTVmNjMxMWU5ZGFmZjdiYjY3YjEwM2U5ODgwZWY0YmZmNjM3YWNhZWMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNTA5OGZmMWUxZDlmMTRmYjQ2YTIxMGZhZGE2YzkwM2ZlZjBmYjdiNGExZGQxZDlhYzYwYTAzNjE4MDBiN2EwMCcsXG4gICAgICAgICc5NzMxMTQxZDgxZmM4ZjgwODRkMzdjNmU3NTQyMDA2YjNlZTFiNDBkNjBkZmU1MzYyYTViMTMyZmQxN2RkYzAnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzJiNzhjN2RlOWVlNTEyYTcyODk1YmU2YjljYmVmYTZlMmYzYzRjY2NlNDQ1Yzk2YjlmMmM4MWUyNzc4YWQ1OCcsXG4gICAgICAgICdlZTE4NDlmNTEzZGY3MWUzMmVmYzM4OTZlZTI4MjYwYzczYmI4MDU0N2FlMjI3NWJhNDk3MjM3Nzk0Yzg3NTNjJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UyY2I3NGZkZGM4ZTlmYmNkMDc2ZWVmMmE3YzcyYjBjZTM3ZDUwZjA4MjY5ZGZjMDc0YjU4MTU1MDU0N2E0ZjcnLFxuICAgICAgICAnZDNhYTJlZDcxYzlkZDIyNDdhNjJkZjA2MjczNmViMGJhZGRlYTllMzYxMjJkMmJlODY0MWFiY2IwMDVjYzRhNCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NDM4NDQ3NTY2ZDRkN2JlZGFkYzI5OTQ5NmFiMzU3NDI2MDA5YTM1ZjIzNWNiMTQxYmUwZDk5Y2QxMGFlM2E4JyxcbiAgICAgICAgJ2M0ZTEwMjA5MTY5ODBhNGRhNWQwMWFjNWU2YWQzMzA3MzRlZjBkNzkwNjYzMWM0ZjIzOTA0MjZiMmVkZDc5MWYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDE2MmQ0ODhiODk0MDIwMzliNTg0YzZmYzZjMzA4ODcwNTg3ZDljNDZmNjYwYjg3OGFiNjVjODJjNzExZDY3ZScsXG4gICAgICAgICc2NzE2M2U5MDMyMzYyODlmNzc2ZjIyYzI1ZmI4YTNhZmMxNzMyZjJiODRiNGU5NWRiZGE0N2FlNWEwODUyNjQ5J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzNmYWQzZmE4NGNhZjBmMzRmMGY4OWJmZDJkY2Y1NGZjMTc1ZDc2N2FlYzNlNTA2ODRmM2JhNGE0YmY1ZjY4M2QnLFxuICAgICAgICAnY2QxYmM3Y2I2Y2M0MDdiYjJmMGNhNjQ3YzcxOGE3MzBjZjcxODcyZTdkMGQyYTUzZmEyMGVmY2RmZTYxODI2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzY3NGYyNjAwYTMwMDdhMDA1NjhjMWE3Y2UwNWQwODE2YzFmYjg0YmYxMzcwNzk4ZjFjNjk1MzJmYWViMWE4NmInLFxuICAgICAgICAnMjk5ZDIxZjk0MTNmMzNiM2VkZjQzYjI1NzAwNDU4MGI3MGRiNTdkYTBiMTgyMjU5ZTA5ZWVjYzY5ZTBkMzhhNSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkMzJmNGRhNTRhZGU3NGFiYjgxYjgxNWFkMWZiM2IyNjNkODJkNmM2OTI3MTRiY2ZmODdkMjliZDVlZTlmMDhmJyxcbiAgICAgICAgJ2Y5NDI5ZTczOGI4ZTUzYjk2OGU5OTAxNmMwNTk3MDc3ODJlMTRmNDUzNTM1OWQ1ODJmYzQxNjkxMGIzZWVhODcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzBlNGU2NzA0MzUzODU1NTZlNTkzNjU3MTM1ODQ1ZDM2ZmJiNjkzMWY3MmIwOGNiMWVkOTU0ZjFlM2NlM2ZmNicsXG4gICAgICAgICc0NjJmOWJjZTYxOTg5ODYzODQ5OTM1MDExM2JiYzliMTBhODc4ZDM1ZGE3MDc0MGRjNjk1YTU1OWViODhkYjdiJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2JlMjA2MjAwM2M1MWNjMzAwNDY4MjkwNDMzMGU0ZGVlN2YzZGNkMTBiMDFlNTgwYmYxOTcxYjA0ZDRjYWQyOTcnLFxuICAgICAgICAnNjIxODhiYzQ5ZDYxZTU0Mjg1NzNkNDhhNzRlMWM2NTViMWM2MTA5MDkwNTY4MmEwZDU1NThlZDcyZGNjYjliYydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5MzE0NDQyM2FjZTM0NTFlZDI5ZTBmYjlhYzJhZjIxMWNiNmU4NGE2MDFkZjU5OTNjNDE5ODU5ZmZmNWRmMDRhJyxcbiAgICAgICAgJzdjMTBkZmIxNjRjMzQyNWY1YzcxYTNmOWQ3OTkyMDM4ZjEwNjUyMjRmNzJiYjlkMWQ5MDJhNmQxMzAzN2I0N2MnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYjAxNWY4MDQ0ZjVmY2JkY2YyMWNhMjZkNmMzNGZiODE5NzgyOTIwNWM3YjdkMmE3Y2I2NjQxOGMxNTdiMTEyYycsXG4gICAgICAgICdhYjhjMWUwODZkMDRlODEzNzQ0YTY1NWIyZGY4ZDVmODNiM2NkYzZmYWEzMDg4YzFkM2FlYTE0NTRlM2ExZDVmJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q1ZTllMWRhNjQ5ZDk3ZDg5ZTQ4NjgxMTdhNDY1YTNhNGY4YTE4ZGU1N2ExNDBkMzZiM2YyYWYzNDFhMjFiNTInLFxuICAgICAgICAnNGNiMDQ0MzdmMzkxZWQ3MzExMWExM2NjMWQ0ZGQwZGIxNjkzNDY1YzIyNDA0ODBkODk1NWU4NTkyZjI3NDQ3YSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkM2FlNDEwNDdkZDdjYTA2NWRiZjhlZDc3Yjk5MjQzOTk4MzAwNWNkNzJlMTZkNmY5OTZhNTMxNmQzNjk2NmJiJyxcbiAgICAgICAgJ2JkMWFlYjIxYWQyMmViYjIyYTEwZjAzMDM0MTdjNmQ5NjRmOGNkZDdkZjBhY2E2MTRiMTBkYzE0ZDEyNWFjNDYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDYzZTI3NjNkODg1Zjk1OGZjNjZjZGQyMjgwMGYwYTQ4NzE5N2QwYTgyZTM3N2I0OWY4MGFmODdjODk3YjA2NScsXG4gICAgICAgICdiZmVmYWNkYjBlNWQwZmQ3ZGYzYTMxMWE5NGRlMDYyYjI2YjgwYzYxZmJjOTc1MDhiNzk5OTI2NzFlZjdjYTdmJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc5ODVmZGZkMTI3YzA1NjdjNmY1M2VjMWJiNjNlYzMxNThlNTk3YzQwYmZlNzQ3YzgzY2RkZmM5MTA2NDE5MTcnLFxuICAgICAgICAnNjAzYzEyZGFmM2Q5ODYyZWYyYjI1ZmUxZGUyODlhZWQyNGVkMjkxZTBlYzY3MDg3MDNhNWJkNTY3ZjMyZWQwMydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NGExYWQ2YjVmNzZlMzlkYjJkZDI0OTQxMGVhYzdmOTllNzRjNTljYjgzZDJkMGVkNWZmMTU0M2RhNzcwM2U5JyxcbiAgICAgICAgJ2NjNjE1N2VmMThjOWM2M2NkNjE5M2Q4MzYzMWJiZWEwMDkzZTA5Njg5NDJlOGMzM2Q1NzM3ZmQ3OTBlMGRiMDgnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzA2ODJhNTA3MDMzNzVmNjAyZDQxNjY2NGJhMTliN2ZjOWJhYjQyYzcyNzQ3NDYzYTcxZDA4OTZiMjJmNmRhMycsXG4gICAgICAgICc1NTNlMDRmNmIwMThiNGZhNmM4ZjM5ZTdmMzExZDMxNzYyOTBkMGUwZjE5Y2E3M2YxNzcxNGQ5OTc3YTIyZmY4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzllMjE1OGYwZDdjMGQ1ZjI2YzM3OTFlZmVmYTc5NTk3NjU0ZTdhMmIyNDY0ZjUyYjFlZTZjMTM0Nzc2OWVmNTcnLFxuICAgICAgICAnNzEyZmNkZDFiOTA1M2YwOTAwM2EzNDgxZmE3NzYyZTlmZmQ3YzhlZjM1YTM4NTA5ZTJmYmYyNjI5MDA4MzczJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE3NmUyNjk4OWE0M2M5Y2ZlYmE0MDI5YzIwMjUzOGMyODE3MmU1NjZlM2M0ZmNlNzMyMjg1N2YzYmUzMjdkNjYnLFxuICAgICAgICAnZWQ4Y2M5ZDA0YjI5ZWI4NzdkMjcwYjQ4NzhkYzQzYzE5YWVmZDMxZjRlZWUwOWVlN2I0NzgzNGMxZmE0YjFjMydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NWQ0NmVmZWEzNzcxZTZlNjhhYmI4OWExM2FkNzQ3ZWNmMTg5MjM5M2RmYzRmMWI3MDA0Nzg4YzUwMzc0ZGE4JyxcbiAgICAgICAgJzk4NTIzOTBhOTk1MDc2NzlmZDBiODZmZDJiMzlhODY4ZDdlZmMyMjE1MTM0NmUxYTNjYTQ3MjY1ODZhNmJlZDgnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODA5YTIwYzY3ZDY0OTAwZmZiNjk4YzRjODI1ZjZkNWYyMzEwZmIwNDUxYzg2OTM0NWI3MzE5ZjY0NTYwNTcyMScsXG4gICAgICAgICc5ZTk5NDk4MGQ5OTE3ZTIyYjc2YjA2MTkyN2ZhMDQxNDNkMDk2Y2NjNTQ5NjNlNmE1ZWJmYTVmM2Y4ZTI4NmMxJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzFiMzg5MDNhNDNmN2YxMTRlZDQ1MDBiNGVhYzcwODNmZGVmZWNlMWNmMjljNjM1MjhkNTYzNDQ2Zjk3MmMxODAnLFxuICAgICAgICAnNDAzNmVkYzkzMWE2MGFlODg5MzUzZjc3ZmQ1M2RlNGEyNzA4YjI2YjZmNWRhNzJhZDMzOTQxMTlkYWY0MDhmOSdcbiAgICAgIF1cbiAgICBdXG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IGV4cG9ydHM7XG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIG1pbkFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcbnZhciBtaW5VdGlscyA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1jcnlwdG8tdXRpbHMnKTtcblxudXRpbHMuYXNzZXJ0ID0gbWluQXNzZXJ0O1xudXRpbHMudG9BcnJheSA9IG1pblV0aWxzLnRvQXJyYXk7XG51dGlscy56ZXJvMiA9IG1pblV0aWxzLnplcm8yO1xudXRpbHMudG9IZXggPSBtaW5VdGlscy50b0hleDtcbnV0aWxzLmVuY29kZSA9IG1pblV0aWxzLmVuY29kZTtcblxuLy8gUmVwcmVzZW50IG51bSBpbiBhIHctTkFGIGZvcm1cbmZ1bmN0aW9uIGdldE5BRihudW0sIHcpIHtcbiAgdmFyIG5hZiA9IFtdO1xuICB2YXIgd3MgPSAxIDw8ICh3ICsgMSk7XG4gIHZhciBrID0gbnVtLmNsb25lKCk7XG4gIHdoaWxlIChrLmNtcG4oMSkgPj0gMCkge1xuICAgIHZhciB6O1xuICAgIGlmIChrLmlzT2RkKCkpIHtcbiAgICAgIHZhciBtb2QgPSBrLmFuZGxuKHdzIC0gMSk7XG4gICAgICBpZiAobW9kID4gKHdzID4+IDEpIC0gMSlcbiAgICAgICAgeiA9ICh3cyA+PiAxKSAtIG1vZDtcbiAgICAgIGVsc2VcbiAgICAgICAgeiA9IG1vZDtcbiAgICAgIGsuaXN1Ym4oeik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHogPSAwO1xuICAgIH1cbiAgICBuYWYucHVzaCh6KTtcblxuICAgIC8vIE9wdGltaXphdGlvbiwgc2hpZnQgYnkgd29yZCBpZiBwb3NzaWJsZVxuICAgIHZhciBzaGlmdCA9IChrLmNtcG4oMCkgIT09IDAgJiYgay5hbmRsbih3cyAtIDEpID09PSAwKSA/ICh3ICsgMSkgOiAxO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgc2hpZnQ7IGkrKylcbiAgICAgIG5hZi5wdXNoKDApO1xuICAgIGsuaXVzaHJuKHNoaWZ0KTtcbiAgfVxuXG4gIHJldHVybiBuYWY7XG59XG51dGlscy5nZXROQUYgPSBnZXROQUY7XG5cbi8vIFJlcHJlc2VudCBrMSwgazIgaW4gYSBKb2ludCBTcGFyc2UgRm9ybVxuZnVuY3Rpb24gZ2V0SlNGKGsxLCBrMikge1xuICB2YXIganNmID0gW1xuICAgIFtdLFxuICAgIFtdXG4gIF07XG5cbiAgazEgPSBrMS5jbG9uZSgpO1xuICBrMiA9IGsyLmNsb25lKCk7XG4gIHZhciBkMSA9IDA7XG4gIHZhciBkMiA9IDA7XG4gIHdoaWxlIChrMS5jbXBuKC1kMSkgPiAwIHx8IGsyLmNtcG4oLWQyKSA+IDApIHtcblxuICAgIC8vIEZpcnN0IHBoYXNlXG4gICAgdmFyIG0xNCA9IChrMS5hbmRsbigzKSArIGQxKSAmIDM7XG4gICAgdmFyIG0yNCA9IChrMi5hbmRsbigzKSArIGQyKSAmIDM7XG4gICAgaWYgKG0xNCA9PT0gMylcbiAgICAgIG0xNCA9IC0xO1xuICAgIGlmIChtMjQgPT09IDMpXG4gICAgICBtMjQgPSAtMTtcbiAgICB2YXIgdTE7XG4gICAgaWYgKChtMTQgJiAxKSA9PT0gMCkge1xuICAgICAgdTEgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbTggPSAoazEuYW5kbG4oNykgKyBkMSkgJiA3O1xuICAgICAgaWYgKChtOCA9PT0gMyB8fCBtOCA9PT0gNSkgJiYgbTI0ID09PSAyKVxuICAgICAgICB1MSA9IC1tMTQ7XG4gICAgICBlbHNlXG4gICAgICAgIHUxID0gbTE0O1xuICAgIH1cbiAgICBqc2ZbMF0ucHVzaCh1MSk7XG5cbiAgICB2YXIgdTI7XG4gICAgaWYgKChtMjQgJiAxKSA9PT0gMCkge1xuICAgICAgdTIgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbTggPSAoazIuYW5kbG4oNykgKyBkMikgJiA3O1xuICAgICAgaWYgKChtOCA9PT0gMyB8fCBtOCA9PT0gNSkgJiYgbTE0ID09PSAyKVxuICAgICAgICB1MiA9IC1tMjQ7XG4gICAgICBlbHNlXG4gICAgICAgIHUyID0gbTI0O1xuICAgIH1cbiAgICBqc2ZbMV0ucHVzaCh1Mik7XG5cbiAgICAvLyBTZWNvbmQgcGhhc2VcbiAgICBpZiAoMiAqIGQxID09PSB1MSArIDEpXG4gICAgICBkMSA9IDEgLSBkMTtcbiAgICBpZiAoMiAqIGQyID09PSB1MiArIDEpXG4gICAgICBkMiA9IDEgLSBkMjtcbiAgICBrMS5pdXNocm4oMSk7XG4gICAgazIuaXVzaHJuKDEpO1xuICB9XG5cbiAgcmV0dXJuIGpzZjtcbn1cbnV0aWxzLmdldEpTRiA9IGdldEpTRjtcblxuZnVuY3Rpb24gY2FjaGVkUHJvcGVydHkob2JqLCBuYW1lLCBjb21wdXRlcikge1xuICB2YXIga2V5ID0gJ18nICsgbmFtZTtcbiAgb2JqLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uIGNhY2hlZFByb3BlcnR5KCkge1xuICAgIHJldHVybiB0aGlzW2tleV0gIT09IHVuZGVmaW5lZCA/IHRoaXNba2V5XSA6XG4gICAgICAgICAgIHRoaXNba2V5XSA9IGNvbXB1dGVyLmNhbGwodGhpcyk7XG4gIH07XG59XG51dGlscy5jYWNoZWRQcm9wZXJ0eSA9IGNhY2hlZFByb3BlcnR5O1xuXG5mdW5jdGlvbiBwYXJzZUJ5dGVzKGJ5dGVzKSB7XG4gIHJldHVybiB0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnID8gdXRpbHMudG9BcnJheShieXRlcywgJ2hleCcpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcztcbn1cbnV0aWxzLnBhcnNlQnl0ZXMgPSBwYXJzZUJ5dGVzO1xuXG5mdW5jdGlvbiBpbnRGcm9tTEUoYnl0ZXMpIHtcbiAgcmV0dXJuIG5ldyBCTihieXRlcywgJ2hleCcsICdsZScpO1xufVxudXRpbHMuaW50RnJvbUxFID0gaW50RnJvbUxFO1xuXG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICB0aGlzLl9ldmVudHMgPSB0aGlzLl9ldmVudHMgfHwge307XG4gIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcblxuLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG5vZGUgMC4xMC54XG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHMgPSB1bmRlZmluZWQ7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnMgPSB1bmRlZmluZWQ7XG5cbi8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZVxuLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy5cbkV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5cbi8vIE9idmlvdXNseSBub3QgYWxsIEVtaXR0ZXJzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDEwLiBUaGlzIGZ1bmN0aW9uIGFsbG93c1xuLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uKG4pIHtcbiAgaWYgKCFpc051bWJlcihuKSB8fCBuIDwgMCB8fCBpc05hTihuKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ24gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO1xuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIGVyLCBoYW5kbGVyLCBsZW4sIGFyZ3MsIGksIGxpc3RlbmVycztcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmICh0eXBlID09PSAnZXJyb3InKSB7XG4gICAgaWYgKCF0aGlzLl9ldmVudHMuZXJyb3IgfHxcbiAgICAgICAgKGlzT2JqZWN0KHRoaXMuX2V2ZW50cy5lcnJvcikgJiYgIXRoaXMuX2V2ZW50cy5lcnJvci5sZW5ndGgpKSB7XG4gICAgICBlciA9IGFyZ3VtZW50c1sxXTtcbiAgICAgIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgXCJlcnJvclwiIGV2ZW50LiAoJyArIGVyICsgJyknKTtcbiAgICAgICAgZXJyLmNvbnRleHQgPSBlcjtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZXIgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgaWYgKGlzVW5kZWZpbmVkKGhhbmRsZXIpKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBpZiAoaXNGdW5jdGlvbihoYW5kbGVyKSkge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgLy8gZmFzdCBjYXNlc1xuICAgICAgY2FzZSAxOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgYXJndW1lbnRzWzFdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gc2xvd2VyXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgaGFuZGxlci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoaGFuZGxlcikpIHtcbiAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICBsaXN0ZW5lcnMgPSBoYW5kbGVyLnNsaWNlKCk7XG4gICAgbGVuID0gbGlzdGVuZXJzLmxlbmd0aDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkodGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgbTtcblxuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgdGhpcy5fZXZlbnRzID0ge307XG5cbiAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICBpZiAodGhpcy5fZXZlbnRzLm5ld0xpc3RlbmVyKVxuICAgIHRoaXMuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICBpc0Z1bmN0aW9uKGxpc3RlbmVyLmxpc3RlbmVyKSA/XG4gICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICBlbHNlIGlmIChpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pKVxuICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2VcbiAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBbdGhpcy5fZXZlbnRzW3R5cGVdLCBsaXN0ZW5lcl07XG5cbiAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkgJiYgIXRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQpIHtcbiAgICBpZiAoIWlzVW5kZWZpbmVkKHRoaXMuX21heExpc3RlbmVycykpIHtcbiAgICAgIG0gPSB0aGlzLl9tYXhMaXN0ZW5lcnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgICB9XG5cbiAgICBpZiAobSAmJiBtID4gMCAmJiB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoID4gbSkge1xuICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmVycm9yKCcobm9kZSkgd2FybmluZzogcG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2xlYWsgZGV0ZWN0ZWQuICVkIGxpc3RlbmVycyBhZGRlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICdVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdC4nLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoKTtcbiAgICAgIGlmICh0eXBlb2YgY29uc29sZS50cmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIGluIElFIDEwXG4gICAgICAgIGNvbnNvbGUudHJhY2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgdmFyIGZpcmVkID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZygpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGcpO1xuXG4gICAgaWYgKCFmaXJlZCkge1xuICAgICAgZmlyZWQgPSB0cnVlO1xuICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH1cblxuICBnLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHRoaXMub24odHlwZSwgZyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBlbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWZmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZFxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBsaXN0LCBwb3NpdGlvbiwgbGVuZ3RoLCBpO1xuXG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIGxpc3QgPSB0aGlzLl9ldmVudHNbdHlwZV07XG4gIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICBwb3NpdGlvbiA9IC0xO1xuXG4gIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fFxuICAgICAgKGlzRnVuY3Rpb24obGlzdC5saXN0ZW5lcikgJiYgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyKTtcblxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGxpc3QpKSB7XG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gPiAwOykge1xuICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8XG4gICAgICAgICAgKGxpc3RbaV0ubGlzdGVuZXIgJiYgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICBsaXN0Lmxlbmd0aCA9IDA7XG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0LnNwbGljZShwb3NpdGlvbiwgMSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIga2V5LCBsaXN0ZW5lcnM7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICBpZiAoIXRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcikge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgZWxzZSBpZiAodGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGZvciAoa2V5IGluIHRoaXMuX2V2ZW50cykge1xuICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNGdW5jdGlvbihsaXN0ZW5lcnMpKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICB9IGVsc2UgaWYgKGxpc3RlbmVycykge1xuICAgIC8vIExJRk8gb3JkZXJcbiAgICB3aGlsZSAobGlzdGVuZXJzLmxlbmd0aClcbiAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2xpc3RlbmVycy5sZW5ndGggLSAxXSk7XG4gIH1cbiAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgcmV0O1xuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIHJldCA9IFtdO1xuICBlbHNlIGlmIChpc0Z1bmN0aW9uKHRoaXMuX2V2ZW50c1t0eXBlXSkpXG4gICAgcmV0ID0gW3RoaXMuX2V2ZW50c1t0eXBlXV07XG4gIGVsc2VcbiAgICByZXQgPSB0aGlzLl9ldmVudHNbdHlwZV0uc2xpY2UoKTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgaWYgKHRoaXMuX2V2ZW50cykge1xuICAgIHZhciBldmxpc3RlbmVyID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gICAgaWYgKGlzRnVuY3Rpb24oZXZsaXN0ZW5lcikpXG4gICAgICByZXR1cm4gMTtcbiAgICBlbHNlIGlmIChldmxpc3RlbmVyKVxuICAgICAgcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RoO1xuICB9XG4gIHJldHVybiAwO1xufTtcblxuRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7XG59O1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG4iLCJ2YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcbnZhciBNRDUgPSByZXF1aXJlKCdtZDUuanMnKVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbmZ1bmN0aW9uIEVWUF9CeXRlc1RvS2V5IChwYXNzd29yZCwgc2FsdCwga2V5Qml0cywgaXZMZW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIocGFzc3dvcmQpKSBwYXNzd29yZCA9IEJ1ZmZlci5mcm9tKHBhc3N3b3JkLCAnYmluYXJ5JylcbiAgaWYgKHNhbHQpIHtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihzYWx0KSkgc2FsdCA9IEJ1ZmZlci5mcm9tKHNhbHQsICdiaW5hcnknKVxuICAgIGlmIChzYWx0Lmxlbmd0aCAhPT0gOCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NhbHQgc2hvdWxkIGJlIEJ1ZmZlciB3aXRoIDggYnl0ZSBsZW5ndGgnKVxuICB9XG5cbiAgdmFyIGtleUxlbiA9IGtleUJpdHMgLyA4XG4gIHZhciBrZXkgPSBCdWZmZXIuYWxsb2Moa2V5TGVuKVxuICB2YXIgaXYgPSBCdWZmZXIuYWxsb2MoaXZMZW4gfHwgMClcbiAgdmFyIHRtcCA9IEJ1ZmZlci5hbGxvYygwKVxuXG4gIHdoaWxlIChrZXlMZW4gPiAwIHx8IGl2TGVuID4gMCkge1xuICAgIHZhciBoYXNoID0gbmV3IE1ENSgpXG4gICAgaGFzaC51cGRhdGUodG1wKVxuICAgIGhhc2gudXBkYXRlKHBhc3N3b3JkKVxuICAgIGlmIChzYWx0KSBoYXNoLnVwZGF0ZShzYWx0KVxuICAgIHRtcCA9IGhhc2guZGlnZXN0KClcblxuICAgIHZhciB1c2VkID0gMFxuXG4gICAgaWYgKGtleUxlbiA+IDApIHtcbiAgICAgIHZhciBrZXlTdGFydCA9IGtleS5sZW5ndGggLSBrZXlMZW5cbiAgICAgIHVzZWQgPSBNYXRoLm1pbihrZXlMZW4sIHRtcC5sZW5ndGgpXG4gICAgICB0bXAuY29weShrZXksIGtleVN0YXJ0LCAwLCB1c2VkKVxuICAgICAga2V5TGVuIC09IHVzZWRcbiAgICB9XG5cbiAgICBpZiAodXNlZCA8IHRtcC5sZW5ndGggJiYgaXZMZW4gPiAwKSB7XG4gICAgICB2YXIgaXZTdGFydCA9IGl2Lmxlbmd0aCAtIGl2TGVuXG4gICAgICB2YXIgbGVuZ3RoID0gTWF0aC5taW4oaXZMZW4sIHRtcC5sZW5ndGggLSB1c2VkKVxuICAgICAgdG1wLmNvcHkoaXYsIGl2U3RhcnQsIHVzZWQsIHVzZWQgKyBsZW5ndGgpXG4gICAgICBpdkxlbiAtPSBsZW5ndGhcbiAgICB9XG4gIH1cblxuICB0bXAuZmlsbCgwKVxuICByZXR1cm4geyBrZXk6IGtleSwgaXY6IGl2IH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBFVlBfQnl0ZXNUb0tleVxuIiwiJ3VzZSBzdHJpY3QnXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcbnZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCdzdHJlYW0nKS5UcmFuc2Zvcm1cbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcblxuZnVuY3Rpb24gdGhyb3dJZk5vdFN0cmluZ09yQnVmZmVyICh2YWwsIHByZWZpeCkge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih2YWwpICYmIHR5cGVvZiB2YWwgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihwcmVmaXggKyAnIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBidWZmZXInKVxuICB9XG59XG5cbmZ1bmN0aW9uIEhhc2hCYXNlIChibG9ja1NpemUpIHtcbiAgVHJhbnNmb3JtLmNhbGwodGhpcylcblxuICB0aGlzLl9ibG9jayA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShibG9ja1NpemUpXG4gIHRoaXMuX2Jsb2NrU2l6ZSA9IGJsb2NrU2l6ZVxuICB0aGlzLl9ibG9ja09mZnNldCA9IDBcbiAgdGhpcy5fbGVuZ3RoID0gWzAsIDAsIDAsIDBdXG5cbiAgdGhpcy5fZmluYWxpemVkID0gZmFsc2Vcbn1cblxuaW5oZXJpdHMoSGFzaEJhc2UsIFRyYW5zZm9ybSlcblxuSGFzaEJhc2UucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICB2YXIgZXJyb3IgPSBudWxsXG4gIHRyeSB7XG4gICAgdGhpcy51cGRhdGUoY2h1bmssIGVuY29kaW5nKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnJvciA9IGVyclxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3IpXG59XG5cbkhhc2hCYXNlLnByb3RvdHlwZS5fZmx1c2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdmFyIGVycm9yID0gbnVsbFxuICB0cnkge1xuICAgIHRoaXMucHVzaCh0aGlzLmRpZ2VzdCgpKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnJvciA9IGVyclxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3IpXG59XG5cbkhhc2hCYXNlLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoZGF0YSwgZW5jb2RpbmcpIHtcbiAgdGhyb3dJZk5vdFN0cmluZ09yQnVmZmVyKGRhdGEsICdEYXRhJylcbiAgaWYgKHRoaXMuX2ZpbmFsaXplZCkgdGhyb3cgbmV3IEVycm9yKCdEaWdlc3QgYWxyZWFkeSBjYWxsZWQnKVxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkgZGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEsIGVuY29kaW5nKVxuXG4gIC8vIGNvbnN1bWUgZGF0YVxuICB2YXIgYmxvY2sgPSB0aGlzLl9ibG9ja1xuICB2YXIgb2Zmc2V0ID0gMFxuICB3aGlsZSAodGhpcy5fYmxvY2tPZmZzZXQgKyBkYXRhLmxlbmd0aCAtIG9mZnNldCA+PSB0aGlzLl9ibG9ja1NpemUpIHtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5fYmxvY2tPZmZzZXQ7IGkgPCB0aGlzLl9ibG9ja1NpemU7KSBibG9ja1tpKytdID0gZGF0YVtvZmZzZXQrK11cbiAgICB0aGlzLl91cGRhdGUoKVxuICAgIHRoaXMuX2Jsb2NrT2Zmc2V0ID0gMFxuICB9XG4gIHdoaWxlIChvZmZzZXQgPCBkYXRhLmxlbmd0aCkgYmxvY2tbdGhpcy5fYmxvY2tPZmZzZXQrK10gPSBkYXRhW29mZnNldCsrXVxuXG4gIC8vIHVwZGF0ZSBsZW5ndGhcbiAgZm9yICh2YXIgaiA9IDAsIGNhcnJ5ID0gZGF0YS5sZW5ndGggKiA4OyBjYXJyeSA+IDA7ICsraikge1xuICAgIHRoaXMuX2xlbmd0aFtqXSArPSBjYXJyeVxuICAgIGNhcnJ5ID0gKHRoaXMuX2xlbmd0aFtqXSAvIDB4MDEwMDAwMDAwMCkgfCAwXG4gICAgaWYgKGNhcnJ5ID4gMCkgdGhpcy5fbGVuZ3RoW2pdIC09IDB4MDEwMDAwMDAwMCAqIGNhcnJ5XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG5IYXNoQmFzZS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdfdXBkYXRlIGlzIG5vdCBpbXBsZW1lbnRlZCcpXG59XG5cbkhhc2hCYXNlLnByb3RvdHlwZS5kaWdlc3QgPSBmdW5jdGlvbiAoZW5jb2RpbmcpIHtcbiAgaWYgKHRoaXMuX2ZpbmFsaXplZCkgdGhyb3cgbmV3IEVycm9yKCdEaWdlc3QgYWxyZWFkeSBjYWxsZWQnKVxuICB0aGlzLl9maW5hbGl6ZWQgPSB0cnVlXG5cbiAgdmFyIGRpZ2VzdCA9IHRoaXMuX2RpZ2VzdCgpXG4gIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSBkaWdlc3QgPSBkaWdlc3QudG9TdHJpbmcoZW5jb2RpbmcpXG5cbiAgLy8gcmVzZXQgc3RhdGVcbiAgdGhpcy5fYmxvY2suZmlsbCgwKVxuICB0aGlzLl9ibG9ja09mZnNldCA9IDBcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyArK2kpIHRoaXMuX2xlbmd0aFtpXSA9IDBcblxuICByZXR1cm4gZGlnZXN0XG59XG5cbkhhc2hCYXNlLnByb3RvdHlwZS5fZGlnZXN0ID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ19kaWdlc3QgaXMgbm90IGltcGxlbWVudGVkJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBIYXNoQmFzZVxuIiwidmFyIGhhc2ggPSBleHBvcnRzO1xuXG5oYXNoLnV0aWxzID0gcmVxdWlyZSgnLi9oYXNoL3V0aWxzJyk7XG5oYXNoLmNvbW1vbiA9IHJlcXVpcmUoJy4vaGFzaC9jb21tb24nKTtcbmhhc2guc2hhID0gcmVxdWlyZSgnLi9oYXNoL3NoYScpO1xuaGFzaC5yaXBlbWQgPSByZXF1aXJlKCcuL2hhc2gvcmlwZW1kJyk7XG5oYXNoLmhtYWMgPSByZXF1aXJlKCcuL2hhc2gvaG1hYycpO1xuXG4vLyBQcm94eSBoYXNoIGZ1bmN0aW9ucyB0byB0aGUgbWFpbiBvYmplY3Rcbmhhc2guc2hhMSA9IGhhc2guc2hhLnNoYTE7XG5oYXNoLnNoYTI1NiA9IGhhc2guc2hhLnNoYTI1Njtcbmhhc2guc2hhMjI0ID0gaGFzaC5zaGEuc2hhMjI0O1xuaGFzaC5zaGEzODQgPSBoYXNoLnNoYS5zaGEzODQ7XG5oYXNoLnNoYTUxMiA9IGhhc2guc2hhLnNoYTUxMjtcbmhhc2gucmlwZW1kMTYwID0gaGFzaC5yaXBlbWQucmlwZW1kMTYwO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG5mdW5jdGlvbiBCbG9ja0hhc2goKSB7XG4gIHRoaXMucGVuZGluZyA9IG51bGw7XG4gIHRoaXMucGVuZGluZ1RvdGFsID0gMDtcbiAgdGhpcy5ibG9ja1NpemUgPSB0aGlzLmNvbnN0cnVjdG9yLmJsb2NrU2l6ZTtcbiAgdGhpcy5vdXRTaXplID0gdGhpcy5jb25zdHJ1Y3Rvci5vdXRTaXplO1xuICB0aGlzLmhtYWNTdHJlbmd0aCA9IHRoaXMuY29uc3RydWN0b3IuaG1hY1N0cmVuZ3RoO1xuICB0aGlzLnBhZExlbmd0aCA9IHRoaXMuY29uc3RydWN0b3IucGFkTGVuZ3RoIC8gODtcbiAgdGhpcy5lbmRpYW4gPSAnYmlnJztcblxuICB0aGlzLl9kZWx0YTggPSB0aGlzLmJsb2NrU2l6ZSAvIDg7XG4gIHRoaXMuX2RlbHRhMzIgPSB0aGlzLmJsb2NrU2l6ZSAvIDMyO1xufVxuZXhwb3J0cy5CbG9ja0hhc2ggPSBCbG9ja0hhc2g7XG5cbkJsb2NrSGFzaC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKG1zZywgZW5jKSB7XG4gIC8vIENvbnZlcnQgbWVzc2FnZSB0byBhcnJheSwgcGFkIGl0LCBhbmQgam9pbiBpbnRvIDMyYml0IGJsb2Nrc1xuICBtc2cgPSB1dGlscy50b0FycmF5KG1zZywgZW5jKTtcbiAgaWYgKCF0aGlzLnBlbmRpbmcpXG4gICAgdGhpcy5wZW5kaW5nID0gbXNnO1xuICBlbHNlXG4gICAgdGhpcy5wZW5kaW5nID0gdGhpcy5wZW5kaW5nLmNvbmNhdChtc2cpO1xuICB0aGlzLnBlbmRpbmdUb3RhbCArPSBtc2cubGVuZ3RoO1xuXG4gIC8vIEVub3VnaCBkYXRhLCB0cnkgdXBkYXRpbmdcbiAgaWYgKHRoaXMucGVuZGluZy5sZW5ndGggPj0gdGhpcy5fZGVsdGE4KSB7XG4gICAgbXNnID0gdGhpcy5wZW5kaW5nO1xuXG4gICAgLy8gUHJvY2VzcyBwZW5kaW5nIGRhdGEgaW4gYmxvY2tzXG4gICAgdmFyIHIgPSBtc2cubGVuZ3RoICUgdGhpcy5fZGVsdGE4O1xuICAgIHRoaXMucGVuZGluZyA9IG1zZy5zbGljZShtc2cubGVuZ3RoIC0gciwgbXNnLmxlbmd0aCk7XG4gICAgaWYgKHRoaXMucGVuZGluZy5sZW5ndGggPT09IDApXG4gICAgICB0aGlzLnBlbmRpbmcgPSBudWxsO1xuXG4gICAgbXNnID0gdXRpbHMuam9pbjMyKG1zZywgMCwgbXNnLmxlbmd0aCAtIHIsIHRoaXMuZW5kaWFuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkgKz0gdGhpcy5fZGVsdGEzMilcbiAgICAgIHRoaXMuX3VwZGF0ZShtc2csIGksIGkgKyB0aGlzLl9kZWx0YTMyKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuQmxvY2tIYXNoLnByb3RvdHlwZS5kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIHRoaXMudXBkYXRlKHRoaXMuX3BhZCgpKTtcbiAgYXNzZXJ0KHRoaXMucGVuZGluZyA9PT0gbnVsbCk7XG5cbiAgcmV0dXJuIHRoaXMuX2RpZ2VzdChlbmMpO1xufTtcblxuQmxvY2tIYXNoLnByb3RvdHlwZS5fcGFkID0gZnVuY3Rpb24gcGFkKCkge1xuICB2YXIgbGVuID0gdGhpcy5wZW5kaW5nVG90YWw7XG4gIHZhciBieXRlcyA9IHRoaXMuX2RlbHRhODtcbiAgdmFyIGsgPSBieXRlcyAtICgobGVuICsgdGhpcy5wYWRMZW5ndGgpICUgYnl0ZXMpO1xuICB2YXIgcmVzID0gbmV3IEFycmF5KGsgKyB0aGlzLnBhZExlbmd0aCk7XG4gIHJlc1swXSA9IDB4ODA7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgazsgaSsrKVxuICAgIHJlc1tpXSA9IDA7XG5cbiAgLy8gQXBwZW5kIGxlbmd0aFxuICBsZW4gPDw9IDM7XG4gIGlmICh0aGlzLmVuZGlhbiA9PT0gJ2JpZycpIHtcbiAgICBmb3IgKHZhciB0ID0gODsgdCA8IHRoaXMucGFkTGVuZ3RoOyB0KyspXG4gICAgICByZXNbaSsrXSA9IDA7XG5cbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiAyNCkgJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gMTYpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDgpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IGxlbiAmIDB4ZmY7XG4gIH0gZWxzZSB7XG4gICAgcmVzW2krK10gPSBsZW4gJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gOCkgJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gMTYpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDI0KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuXG4gICAgZm9yICh0ID0gODsgdCA8IHRoaXMucGFkTGVuZ3RoOyB0KyspXG4gICAgICByZXNbaSsrXSA9IDA7XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxuZnVuY3Rpb24gSG1hYyhoYXNoLCBrZXksIGVuYykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSG1hYykpXG4gICAgcmV0dXJuIG5ldyBIbWFjKGhhc2gsIGtleSwgZW5jKTtcbiAgdGhpcy5IYXNoID0gaGFzaDtcbiAgdGhpcy5ibG9ja1NpemUgPSBoYXNoLmJsb2NrU2l6ZSAvIDg7XG4gIHRoaXMub3V0U2l6ZSA9IGhhc2gub3V0U2l6ZSAvIDg7XG4gIHRoaXMuaW5uZXIgPSBudWxsO1xuICB0aGlzLm91dGVyID0gbnVsbDtcblxuICB0aGlzLl9pbml0KHV0aWxzLnRvQXJyYXkoa2V5LCBlbmMpKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gSG1hYztcblxuSG1hYy5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiBpbml0KGtleSkge1xuICAvLyBTaG9ydGVuIGtleSwgaWYgbmVlZGVkXG4gIGlmIChrZXkubGVuZ3RoID4gdGhpcy5ibG9ja1NpemUpXG4gICAga2V5ID0gbmV3IHRoaXMuSGFzaCgpLnVwZGF0ZShrZXkpLmRpZ2VzdCgpO1xuICBhc3NlcnQoa2V5Lmxlbmd0aCA8PSB0aGlzLmJsb2NrU2l6ZSk7XG5cbiAgLy8gQWRkIHBhZGRpbmcgdG8ga2V5XG4gIGZvciAodmFyIGkgPSBrZXkubGVuZ3RoOyBpIDwgdGhpcy5ibG9ja1NpemU7IGkrKylcbiAgICBrZXkucHVzaCgwKTtcblxuICBmb3IgKGkgPSAwOyBpIDwga2V5Lmxlbmd0aDsgaSsrKVxuICAgIGtleVtpXSBePSAweDM2O1xuICB0aGlzLmlubmVyID0gbmV3IHRoaXMuSGFzaCgpLnVwZGF0ZShrZXkpO1xuXG4gIC8vIDB4MzYgXiAweDVjID0gMHg2YVxuICBmb3IgKGkgPSAwOyBpIDwga2V5Lmxlbmd0aDsgaSsrKVxuICAgIGtleVtpXSBePSAweDZhO1xuICB0aGlzLm91dGVyID0gbmV3IHRoaXMuSGFzaCgpLnVwZGF0ZShrZXkpO1xufTtcblxuSG1hYy5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKG1zZywgZW5jKSB7XG4gIHRoaXMuaW5uZXIudXBkYXRlKG1zZywgZW5jKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5IbWFjLnByb3RvdHlwZS5kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIHRoaXMub3V0ZXIudXBkYXRlKHRoaXMuaW5uZXIuZGlnZXN0KCkpO1xuICByZXR1cm4gdGhpcy5vdXRlci5kaWdlc3QoZW5jKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpO1xuXG52YXIgcm90bDMyID0gdXRpbHMucm90bDMyO1xudmFyIHN1bTMyID0gdXRpbHMuc3VtMzI7XG52YXIgc3VtMzJfMyA9IHV0aWxzLnN1bTMyXzM7XG52YXIgc3VtMzJfNCA9IHV0aWxzLnN1bTMyXzQ7XG52YXIgQmxvY2tIYXNoID0gY29tbW9uLkJsb2NrSGFzaDtcblxuZnVuY3Rpb24gUklQRU1EMTYwKCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUklQRU1EMTYwKSlcbiAgICByZXR1cm4gbmV3IFJJUEVNRDE2MCgpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuXG4gIHRoaXMuaCA9IFsgMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3NiwgMHhjM2QyZTFmMCBdO1xuICB0aGlzLmVuZGlhbiA9ICdsaXR0bGUnO1xufVxudXRpbHMuaW5oZXJpdHMoUklQRU1EMTYwLCBCbG9ja0hhc2gpO1xuZXhwb3J0cy5yaXBlbWQxNjAgPSBSSVBFTUQxNjA7XG5cblJJUEVNRDE2MC5ibG9ja1NpemUgPSA1MTI7XG5SSVBFTUQxNjAub3V0U2l6ZSA9IDE2MDtcblJJUEVNRDE2MC5obWFjU3RyZW5ndGggPSAxOTI7XG5SSVBFTUQxNjAucGFkTGVuZ3RoID0gNjQ7XG5cblJJUEVNRDE2MC5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShtc2csIHN0YXJ0KSB7XG4gIHZhciBBID0gdGhpcy5oWzBdO1xuICB2YXIgQiA9IHRoaXMuaFsxXTtcbiAgdmFyIEMgPSB0aGlzLmhbMl07XG4gIHZhciBEID0gdGhpcy5oWzNdO1xuICB2YXIgRSA9IHRoaXMuaFs0XTtcbiAgdmFyIEFoID0gQTtcbiAgdmFyIEJoID0gQjtcbiAgdmFyIENoID0gQztcbiAgdmFyIERoID0gRDtcbiAgdmFyIEVoID0gRTtcbiAgZm9yICh2YXIgaiA9IDA7IGogPCA4MDsgaisrKSB7XG4gICAgdmFyIFQgPSBzdW0zMihcbiAgICAgIHJvdGwzMihcbiAgICAgICAgc3VtMzJfNChBLCBmKGosIEIsIEMsIEQpLCBtc2dbcltqXSArIHN0YXJ0XSwgSyhqKSksXG4gICAgICAgIHNbal0pLFxuICAgICAgRSk7XG4gICAgQSA9IEU7XG4gICAgRSA9IEQ7XG4gICAgRCA9IHJvdGwzMihDLCAxMCk7XG4gICAgQyA9IEI7XG4gICAgQiA9IFQ7XG4gICAgVCA9IHN1bTMyKFxuICAgICAgcm90bDMyKFxuICAgICAgICBzdW0zMl80KEFoLCBmKDc5IC0gaiwgQmgsIENoLCBEaCksIG1zZ1tyaFtqXSArIHN0YXJ0XSwgS2goaikpLFxuICAgICAgICBzaFtqXSksXG4gICAgICBFaCk7XG4gICAgQWggPSBFaDtcbiAgICBFaCA9IERoO1xuICAgIERoID0gcm90bDMyKENoLCAxMCk7XG4gICAgQ2ggPSBCaDtcbiAgICBCaCA9IFQ7XG4gIH1cbiAgVCA9IHN1bTMyXzModGhpcy5oWzFdLCBDLCBEaCk7XG4gIHRoaXMuaFsxXSA9IHN1bTMyXzModGhpcy5oWzJdLCBELCBFaCk7XG4gIHRoaXMuaFsyXSA9IHN1bTMyXzModGhpcy5oWzNdLCBFLCBBaCk7XG4gIHRoaXMuaFszXSA9IHN1bTMyXzModGhpcy5oWzRdLCBBLCBCaCk7XG4gIHRoaXMuaFs0XSA9IHN1bTMyXzModGhpcy5oWzBdLCBCLCBDaCk7XG4gIHRoaXMuaFswXSA9IFQ7XG59O1xuXG5SSVBFTUQxNjAucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2xpdHRsZScpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnbGl0dGxlJyk7XG59O1xuXG5mdW5jdGlvbiBmKGosIHgsIHksIHopIHtcbiAgaWYgKGogPD0gMTUpXG4gICAgcmV0dXJuIHggXiB5IF4gejtcbiAgZWxzZSBpZiAoaiA8PSAzMSlcbiAgICByZXR1cm4gKHggJiB5KSB8ICgofngpICYgeik7XG4gIGVsc2UgaWYgKGogPD0gNDcpXG4gICAgcmV0dXJuICh4IHwgKH55KSkgXiB6O1xuICBlbHNlIGlmIChqIDw9IDYzKVxuICAgIHJldHVybiAoeCAmIHopIHwgKHkgJiAofnopKTtcbiAgZWxzZVxuICAgIHJldHVybiB4IF4gKHkgfCAofnopKTtcbn1cblxuZnVuY3Rpb24gSyhqKSB7XG4gIGlmIChqIDw9IDE1KVxuICAgIHJldHVybiAweDAwMDAwMDAwO1xuICBlbHNlIGlmIChqIDw9IDMxKVxuICAgIHJldHVybiAweDVhODI3OTk5O1xuICBlbHNlIGlmIChqIDw9IDQ3KVxuICAgIHJldHVybiAweDZlZDllYmExO1xuICBlbHNlIGlmIChqIDw9IDYzKVxuICAgIHJldHVybiAweDhmMWJiY2RjO1xuICBlbHNlXG4gICAgcmV0dXJuIDB4YTk1M2ZkNGU7XG59XG5cbmZ1bmN0aW9uIEtoKGopIHtcbiAgaWYgKGogPD0gMTUpXG4gICAgcmV0dXJuIDB4NTBhMjhiZTY7XG4gIGVsc2UgaWYgKGogPD0gMzEpXG4gICAgcmV0dXJuIDB4NWM0ZGQxMjQ7XG4gIGVsc2UgaWYgKGogPD0gNDcpXG4gICAgcmV0dXJuIDB4NmQ3MDNlZjM7XG4gIGVsc2UgaWYgKGogPD0gNjMpXG4gICAgcmV0dXJuIDB4N2E2ZDc2ZTk7XG4gIGVsc2VcbiAgICByZXR1cm4gMHgwMDAwMDAwMDtcbn1cblxudmFyIHIgPSBbXG4gIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsXG4gIDcsIDQsIDEzLCAxLCAxMCwgNiwgMTUsIDMsIDEyLCAwLCA5LCA1LCAyLCAxNCwgMTEsIDgsXG4gIDMsIDEwLCAxNCwgNCwgOSwgMTUsIDgsIDEsIDIsIDcsIDAsIDYsIDEzLCAxMSwgNSwgMTIsXG4gIDEsIDksIDExLCAxMCwgMCwgOCwgMTIsIDQsIDEzLCAzLCA3LCAxNSwgMTQsIDUsIDYsIDIsXG4gIDQsIDAsIDUsIDksIDcsIDEyLCAyLCAxMCwgMTQsIDEsIDMsIDgsIDExLCA2LCAxNSwgMTNcbl07XG5cbnZhciByaCA9IFtcbiAgNSwgMTQsIDcsIDAsIDksIDIsIDExLCA0LCAxMywgNiwgMTUsIDgsIDEsIDEwLCAzLCAxMixcbiAgNiwgMTEsIDMsIDcsIDAsIDEzLCA1LCAxMCwgMTQsIDE1LCA4LCAxMiwgNCwgOSwgMSwgMixcbiAgMTUsIDUsIDEsIDMsIDcsIDE0LCA2LCA5LCAxMSwgOCwgMTIsIDIsIDEwLCAwLCA0LCAxMyxcbiAgOCwgNiwgNCwgMSwgMywgMTEsIDE1LCAwLCA1LCAxMiwgMiwgMTMsIDksIDcsIDEwLCAxNCxcbiAgMTIsIDE1LCAxMCwgNCwgMSwgNSwgOCwgNywgNiwgMiwgMTMsIDE0LCAwLCAzLCA5LCAxMVxuXTtcblxudmFyIHMgPSBbXG4gIDExLCAxNCwgMTUsIDEyLCA1LCA4LCA3LCA5LCAxMSwgMTMsIDE0LCAxNSwgNiwgNywgOSwgOCxcbiAgNywgNiwgOCwgMTMsIDExLCA5LCA3LCAxNSwgNywgMTIsIDE1LCA5LCAxMSwgNywgMTMsIDEyLFxuICAxMSwgMTMsIDYsIDcsIDE0LCA5LCAxMywgMTUsIDE0LCA4LCAxMywgNiwgNSwgMTIsIDcsIDUsXG4gIDExLCAxMiwgMTQsIDE1LCAxNCwgMTUsIDksIDgsIDksIDE0LCA1LCA2LCA4LCA2LCA1LCAxMixcbiAgOSwgMTUsIDUsIDExLCA2LCA4LCAxMywgMTIsIDUsIDEyLCAxMywgMTQsIDExLCA4LCA1LCA2XG5dO1xuXG52YXIgc2ggPSBbXG4gIDgsIDksIDksIDExLCAxMywgMTUsIDE1LCA1LCA3LCA3LCA4LCAxMSwgMTQsIDE0LCAxMiwgNixcbiAgOSwgMTMsIDE1LCA3LCAxMiwgOCwgOSwgMTEsIDcsIDcsIDEyLCA3LCA2LCAxNSwgMTMsIDExLFxuICA5LCA3LCAxNSwgMTEsIDgsIDYsIDYsIDE0LCAxMiwgMTMsIDUsIDE0LCAxMywgMTMsIDcsIDUsXG4gIDE1LCA1LCA4LCAxMSwgMTQsIDE0LCA2LCAxNCwgNiwgOSwgMTIsIDksIDEyLCA1LCAxNSwgOCxcbiAgOCwgNSwgMTIsIDksIDEyLCA1LCAxNCwgNiwgOCwgMTMsIDYsIDUsIDE1LCAxMywgMTEsIDExXG5dO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnNoYTEgPSByZXF1aXJlKCcuL3NoYS8xJyk7XG5leHBvcnRzLnNoYTIyNCA9IHJlcXVpcmUoJy4vc2hhLzIyNCcpO1xuZXhwb3J0cy5zaGEyNTYgPSByZXF1aXJlKCcuL3NoYS8yNTYnKTtcbmV4cG9ydHMuc2hhMzg0ID0gcmVxdWlyZSgnLi9zaGEvMzg0Jyk7XG5leHBvcnRzLnNoYTUxMiA9IHJlcXVpcmUoJy4vc2hhLzUxMicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGNvbW1vbiA9IHJlcXVpcmUoJy4uL2NvbW1vbicpO1xudmFyIHNoYUNvbW1vbiA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG5cbnZhciByb3RsMzIgPSB1dGlscy5yb3RsMzI7XG52YXIgc3VtMzIgPSB1dGlscy5zdW0zMjtcbnZhciBzdW0zMl81ID0gdXRpbHMuc3VtMzJfNTtcbnZhciBmdF8xID0gc2hhQ29tbW9uLmZ0XzE7XG52YXIgQmxvY2tIYXNoID0gY29tbW9uLkJsb2NrSGFzaDtcblxudmFyIHNoYTFfSyA9IFtcbiAgMHg1QTgyNzk5OSwgMHg2RUQ5RUJBMSxcbiAgMHg4RjFCQkNEQywgMHhDQTYyQzFENlxuXTtcblxuZnVuY3Rpb24gU0hBMSgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTEpKVxuICAgIHJldHVybiBuZXcgU0hBMSgpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbXG4gICAgMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSxcbiAgICAweDEwMzI1NDc2LCAweGMzZDJlMWYwIF07XG4gIHRoaXMuVyA9IG5ldyBBcnJheSg4MCk7XG59XG5cbnV0aWxzLmluaGVyaXRzKFNIQTEsIEJsb2NrSGFzaCk7XG5tb2R1bGUuZXhwb3J0cyA9IFNIQTE7XG5cblNIQTEuYmxvY2tTaXplID0gNTEyO1xuU0hBMS5vdXRTaXplID0gMTYwO1xuU0hBMS5obWFjU3RyZW5ndGggPSA4MDtcblNIQTEucGFkTGVuZ3RoID0gNjQ7XG5cblNIQTEucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiBfdXBkYXRlKG1zZywgc3RhcnQpIHtcbiAgdmFyIFcgPSB0aGlzLlc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKVxuICAgIFdbaV0gPSBtc2dbc3RhcnQgKyBpXTtcblxuICBmb3IoOyBpIDwgVy5sZW5ndGg7IGkrKylcbiAgICBXW2ldID0gcm90bDMyKFdbaSAtIDNdIF4gV1tpIC0gOF0gXiBXW2kgLSAxNF0gXiBXW2kgLSAxNl0sIDEpO1xuXG4gIHZhciBhID0gdGhpcy5oWzBdO1xuICB2YXIgYiA9IHRoaXMuaFsxXTtcbiAgdmFyIGMgPSB0aGlzLmhbMl07XG4gIHZhciBkID0gdGhpcy5oWzNdO1xuICB2YXIgZSA9IHRoaXMuaFs0XTtcblxuICBmb3IgKGkgPSAwOyBpIDwgVy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzID0gfn4oaSAvIDIwKTtcbiAgICB2YXIgdCA9IHN1bTMyXzUocm90bDMyKGEsIDUpLCBmdF8xKHMsIGIsIGMsIGQpLCBlLCBXW2ldLCBzaGExX0tbc10pO1xuICAgIGUgPSBkO1xuICAgIGQgPSBjO1xuICAgIGMgPSByb3RsMzIoYiwgMzApO1xuICAgIGIgPSBhO1xuICAgIGEgPSB0O1xuICB9XG5cbiAgdGhpcy5oWzBdID0gc3VtMzIodGhpcy5oWzBdLCBhKTtcbiAgdGhpcy5oWzFdID0gc3VtMzIodGhpcy5oWzFdLCBiKTtcbiAgdGhpcy5oWzJdID0gc3VtMzIodGhpcy5oWzJdLCBjKTtcbiAgdGhpcy5oWzNdID0gc3VtMzIodGhpcy5oWzNdLCBkKTtcbiAgdGhpcy5oWzRdID0gc3VtMzIodGhpcy5oWzRdLCBlKTtcbn07XG5cblNIQTEucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnYmlnJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIFNIQTI1NiA9IHJlcXVpcmUoJy4vMjU2Jyk7XG5cbmZ1bmN0aW9uIFNIQTIyNCgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTIyNCkpXG4gICAgcmV0dXJuIG5ldyBTSEEyMjQoKTtcblxuICBTSEEyNTYuY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gW1xuICAgIDB4YzEwNTllZDgsIDB4MzY3Y2Q1MDcsIDB4MzA3MGRkMTcsIDB4ZjcwZTU5MzksXG4gICAgMHhmZmMwMGIzMSwgMHg2ODU4MTUxMSwgMHg2NGY5OGZhNywgMHhiZWZhNGZhNCBdO1xufVxudXRpbHMuaW5oZXJpdHMoU0hBMjI0LCBTSEEyNTYpO1xubW9kdWxlLmV4cG9ydHMgPSBTSEEyMjQ7XG5cblNIQTIyNC5ibG9ja1NpemUgPSA1MTI7XG5TSEEyMjQub3V0U2l6ZSA9IDIyNDtcblNIQTIyNC5obWFjU3RyZW5ndGggPSAxOTI7XG5TSEEyMjQucGFkTGVuZ3RoID0gNjQ7XG5cblNIQTIyNC5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgLy8gSnVzdCB0cnVuY2F0ZSBvdXRwdXRcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLnNsaWNlKDAsIDcpLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmguc2xpY2UoMCwgNyksICdiaWcnKTtcbn07XG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBzaGFDb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxudmFyIHN1bTMyID0gdXRpbHMuc3VtMzI7XG52YXIgc3VtMzJfNCA9IHV0aWxzLnN1bTMyXzQ7XG52YXIgc3VtMzJfNSA9IHV0aWxzLnN1bTMyXzU7XG52YXIgY2gzMiA9IHNoYUNvbW1vbi5jaDMyO1xudmFyIG1hajMyID0gc2hhQ29tbW9uLm1hajMyO1xudmFyIHMwXzI1NiA9IHNoYUNvbW1vbi5zMF8yNTY7XG52YXIgczFfMjU2ID0gc2hhQ29tbW9uLnMxXzI1NjtcbnZhciBnMF8yNTYgPSBzaGFDb21tb24uZzBfMjU2O1xudmFyIGcxXzI1NiA9IHNoYUNvbW1vbi5nMV8yNTY7XG5cbnZhciBCbG9ja0hhc2ggPSBjb21tb24uQmxvY2tIYXNoO1xuXG52YXIgc2hhMjU2X0sgPSBbXG4gIDB4NDI4YTJmOTgsIDB4NzEzNzQ0OTEsIDB4YjVjMGZiY2YsIDB4ZTliNWRiYTUsXG4gIDB4Mzk1NmMyNWIsIDB4NTlmMTExZjEsIDB4OTIzZjgyYTQsIDB4YWIxYzVlZDUsXG4gIDB4ZDgwN2FhOTgsIDB4MTI4MzViMDEsIDB4MjQzMTg1YmUsIDB4NTUwYzdkYzMsXG4gIDB4NzJiZTVkNzQsIDB4ODBkZWIxZmUsIDB4OWJkYzA2YTcsIDB4YzE5YmYxNzQsXG4gIDB4ZTQ5YjY5YzEsIDB4ZWZiZTQ3ODYsIDB4MGZjMTlkYzYsIDB4MjQwY2ExY2MsXG4gIDB4MmRlOTJjNmYsIDB4NGE3NDg0YWEsIDB4NWNiMGE5ZGMsIDB4NzZmOTg4ZGEsXG4gIDB4OTgzZTUxNTIsIDB4YTgzMWM2NmQsIDB4YjAwMzI3YzgsIDB4YmY1OTdmYzcsXG4gIDB4YzZlMDBiZjMsIDB4ZDVhNzkxNDcsIDB4MDZjYTYzNTEsIDB4MTQyOTI5NjcsXG4gIDB4MjdiNzBhODUsIDB4MmUxYjIxMzgsIDB4NGQyYzZkZmMsIDB4NTMzODBkMTMsXG4gIDB4NjUwYTczNTQsIDB4NzY2YTBhYmIsIDB4ODFjMmM5MmUsIDB4OTI3MjJjODUsXG4gIDB4YTJiZmU4YTEsIDB4YTgxYTY2NGIsIDB4YzI0YjhiNzAsIDB4Yzc2YzUxYTMsXG4gIDB4ZDE5MmU4MTksIDB4ZDY5OTA2MjQsIDB4ZjQwZTM1ODUsIDB4MTA2YWEwNzAsXG4gIDB4MTlhNGMxMTYsIDB4MWUzNzZjMDgsIDB4Mjc0ODc3NGMsIDB4MzRiMGJjYjUsXG4gIDB4MzkxYzBjYjMsIDB4NGVkOGFhNGEsIDB4NWI5Y2NhNGYsIDB4NjgyZTZmZjMsXG4gIDB4NzQ4ZjgyZWUsIDB4NzhhNTYzNmYsIDB4ODRjODc4MTQsIDB4OGNjNzAyMDgsXG4gIDB4OTBiZWZmZmEsIDB4YTQ1MDZjZWIsIDB4YmVmOWEzZjcsIDB4YzY3MTc4ZjJcbl07XG5cbmZ1bmN0aW9uIFNIQTI1NigpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTI1NikpXG4gICAgcmV0dXJuIG5ldyBTSEEyNTYoKTtcblxuICBCbG9ja0hhc2guY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gW1xuICAgIDB4NmEwOWU2NjcsIDB4YmI2N2FlODUsIDB4M2M2ZWYzNzIsIDB4YTU0ZmY1M2EsXG4gICAgMHg1MTBlNTI3ZiwgMHg5YjA1Njg4YywgMHgxZjgzZDlhYiwgMHg1YmUwY2QxOVxuICBdO1xuICB0aGlzLmsgPSBzaGEyNTZfSztcbiAgdGhpcy5XID0gbmV3IEFycmF5KDY0KTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTI1NiwgQmxvY2tIYXNoKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMjU2O1xuXG5TSEEyNTYuYmxvY2tTaXplID0gNTEyO1xuU0hBMjU2Lm91dFNpemUgPSAyNTY7XG5TSEEyNTYuaG1hY1N0cmVuZ3RoID0gMTkyO1xuU0hBMjU2LnBhZExlbmd0aCA9IDY0O1xuXG5TSEEyNTYucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiBfdXBkYXRlKG1zZywgc3RhcnQpIHtcbiAgdmFyIFcgPSB0aGlzLlc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKVxuICAgIFdbaV0gPSBtc2dbc3RhcnQgKyBpXTtcbiAgZm9yICg7IGkgPCBXLmxlbmd0aDsgaSsrKVxuICAgIFdbaV0gPSBzdW0zMl80KGcxXzI1NihXW2kgLSAyXSksIFdbaSAtIDddLCBnMF8yNTYoV1tpIC0gMTVdKSwgV1tpIC0gMTZdKTtcblxuICB2YXIgYSA9IHRoaXMuaFswXTtcbiAgdmFyIGIgPSB0aGlzLmhbMV07XG4gIHZhciBjID0gdGhpcy5oWzJdO1xuICB2YXIgZCA9IHRoaXMuaFszXTtcbiAgdmFyIGUgPSB0aGlzLmhbNF07XG4gIHZhciBmID0gdGhpcy5oWzVdO1xuICB2YXIgZyA9IHRoaXMuaFs2XTtcbiAgdmFyIGggPSB0aGlzLmhbN107XG5cbiAgYXNzZXJ0KHRoaXMuay5sZW5ndGggPT09IFcubGVuZ3RoKTtcbiAgZm9yIChpID0gMDsgaSA8IFcubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgVDEgPSBzdW0zMl81KGgsIHMxXzI1NihlKSwgY2gzMihlLCBmLCBnKSwgdGhpcy5rW2ldLCBXW2ldKTtcbiAgICB2YXIgVDIgPSBzdW0zMihzMF8yNTYoYSksIG1hajMyKGEsIGIsIGMpKTtcbiAgICBoID0gZztcbiAgICBnID0gZjtcbiAgICBmID0gZTtcbiAgICBlID0gc3VtMzIoZCwgVDEpO1xuICAgIGQgPSBjO1xuICAgIGMgPSBiO1xuICAgIGIgPSBhO1xuICAgIGEgPSBzdW0zMihUMSwgVDIpO1xuICB9XG5cbiAgdGhpcy5oWzBdID0gc3VtMzIodGhpcy5oWzBdLCBhKTtcbiAgdGhpcy5oWzFdID0gc3VtMzIodGhpcy5oWzFdLCBiKTtcbiAgdGhpcy5oWzJdID0gc3VtMzIodGhpcy5oWzJdLCBjKTtcbiAgdGhpcy5oWzNdID0gc3VtMzIodGhpcy5oWzNdLCBkKTtcbiAgdGhpcy5oWzRdID0gc3VtMzIodGhpcy5oWzRdLCBlKTtcbiAgdGhpcy5oWzVdID0gc3VtMzIodGhpcy5oWzVdLCBmKTtcbiAgdGhpcy5oWzZdID0gc3VtMzIodGhpcy5oWzZdLCBnKTtcbiAgdGhpcy5oWzddID0gc3VtMzIodGhpcy5oWzddLCBoKTtcbn07XG5cblNIQTI1Ni5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmgsICdiaWcnKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbnZhciBTSEE1MTIgPSByZXF1aXJlKCcuLzUxMicpO1xuXG5mdW5jdGlvbiBTSEEzODQoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEEzODQpKVxuICAgIHJldHVybiBuZXcgU0hBMzg0KCk7XG5cbiAgU0hBNTEyLmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFtcbiAgICAweGNiYmI5ZDVkLCAweGMxMDU5ZWQ4LFxuICAgIDB4NjI5YTI5MmEsIDB4MzY3Y2Q1MDcsXG4gICAgMHg5MTU5MDE1YSwgMHgzMDcwZGQxNyxcbiAgICAweDE1MmZlY2Q4LCAweGY3MGU1OTM5LFxuICAgIDB4NjczMzI2NjcsIDB4ZmZjMDBiMzEsXG4gICAgMHg4ZWI0NGE4NywgMHg2ODU4MTUxMSxcbiAgICAweGRiMGMyZTBkLCAweDY0Zjk4ZmE3LFxuICAgIDB4NDdiNTQ4MWQsIDB4YmVmYTRmYTQgXTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTM4NCwgU0hBNTEyKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMzg0O1xuXG5TSEEzODQuYmxvY2tTaXplID0gMTAyNDtcblNIQTM4NC5vdXRTaXplID0gMzg0O1xuU0hBMzg0LmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTM4NC5wYWRMZW5ndGggPSAxMjg7XG5cblNIQTM4NC5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLnNsaWNlKDAsIDEyKSwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLnNsaWNlKDAsIDEyKSwgJ2JpZycpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG5cbnZhciByb3RyNjRfaGkgPSB1dGlscy5yb3RyNjRfaGk7XG52YXIgcm90cjY0X2xvID0gdXRpbHMucm90cjY0X2xvO1xudmFyIHNocjY0X2hpID0gdXRpbHMuc2hyNjRfaGk7XG52YXIgc2hyNjRfbG8gPSB1dGlscy5zaHI2NF9sbztcbnZhciBzdW02NCA9IHV0aWxzLnN1bTY0O1xudmFyIHN1bTY0X2hpID0gdXRpbHMuc3VtNjRfaGk7XG52YXIgc3VtNjRfbG8gPSB1dGlscy5zdW02NF9sbztcbnZhciBzdW02NF80X2hpID0gdXRpbHMuc3VtNjRfNF9oaTtcbnZhciBzdW02NF80X2xvID0gdXRpbHMuc3VtNjRfNF9sbztcbnZhciBzdW02NF81X2hpID0gdXRpbHMuc3VtNjRfNV9oaTtcbnZhciBzdW02NF81X2xvID0gdXRpbHMuc3VtNjRfNV9sbztcblxudmFyIEJsb2NrSGFzaCA9IGNvbW1vbi5CbG9ja0hhc2g7XG5cbnZhciBzaGE1MTJfSyA9IFtcbiAgMHg0MjhhMmY5OCwgMHhkNzI4YWUyMiwgMHg3MTM3NDQ5MSwgMHgyM2VmNjVjZCxcbiAgMHhiNWMwZmJjZiwgMHhlYzRkM2IyZiwgMHhlOWI1ZGJhNSwgMHg4MTg5ZGJiYyxcbiAgMHgzOTU2YzI1YiwgMHhmMzQ4YjUzOCwgMHg1OWYxMTFmMSwgMHhiNjA1ZDAxOSxcbiAgMHg5MjNmODJhNCwgMHhhZjE5NGY5YiwgMHhhYjFjNWVkNSwgMHhkYTZkODExOCxcbiAgMHhkODA3YWE5OCwgMHhhMzAzMDI0MiwgMHgxMjgzNWIwMSwgMHg0NTcwNmZiZSxcbiAgMHgyNDMxODViZSwgMHg0ZWU0YjI4YywgMHg1NTBjN2RjMywgMHhkNWZmYjRlMixcbiAgMHg3MmJlNWQ3NCwgMHhmMjdiODk2ZiwgMHg4MGRlYjFmZSwgMHgzYjE2OTZiMSxcbiAgMHg5YmRjMDZhNywgMHgyNWM3MTIzNSwgMHhjMTliZjE3NCwgMHhjZjY5MjY5NCxcbiAgMHhlNDliNjljMSwgMHg5ZWYxNGFkMiwgMHhlZmJlNDc4NiwgMHgzODRmMjVlMyxcbiAgMHgwZmMxOWRjNiwgMHg4YjhjZDViNSwgMHgyNDBjYTFjYywgMHg3N2FjOWM2NSxcbiAgMHgyZGU5MmM2ZiwgMHg1OTJiMDI3NSwgMHg0YTc0ODRhYSwgMHg2ZWE2ZTQ4MyxcbiAgMHg1Y2IwYTlkYywgMHhiZDQxZmJkNCwgMHg3NmY5ODhkYSwgMHg4MzExNTNiNSxcbiAgMHg5ODNlNTE1MiwgMHhlZTY2ZGZhYiwgMHhhODMxYzY2ZCwgMHgyZGI0MzIxMCxcbiAgMHhiMDAzMjdjOCwgMHg5OGZiMjEzZiwgMHhiZjU5N2ZjNywgMHhiZWVmMGVlNCxcbiAgMHhjNmUwMGJmMywgMHgzZGE4OGZjMiwgMHhkNWE3OTE0NywgMHg5MzBhYTcyNSxcbiAgMHgwNmNhNjM1MSwgMHhlMDAzODI2ZiwgMHgxNDI5Mjk2NywgMHgwYTBlNmU3MCxcbiAgMHgyN2I3MGE4NSwgMHg0NmQyMmZmYywgMHgyZTFiMjEzOCwgMHg1YzI2YzkyNixcbiAgMHg0ZDJjNmRmYywgMHg1YWM0MmFlZCwgMHg1MzM4MGQxMywgMHg5ZDk1YjNkZixcbiAgMHg2NTBhNzM1NCwgMHg4YmFmNjNkZSwgMHg3NjZhMGFiYiwgMHgzYzc3YjJhOCxcbiAgMHg4MWMyYzkyZSwgMHg0N2VkYWVlNiwgMHg5MjcyMmM4NSwgMHgxNDgyMzUzYixcbiAgMHhhMmJmZThhMSwgMHg0Y2YxMDM2NCwgMHhhODFhNjY0YiwgMHhiYzQyMzAwMSxcbiAgMHhjMjRiOGI3MCwgMHhkMGY4OTc5MSwgMHhjNzZjNTFhMywgMHgwNjU0YmUzMCxcbiAgMHhkMTkyZTgxOSwgMHhkNmVmNTIxOCwgMHhkNjk5MDYyNCwgMHg1NTY1YTkxMCxcbiAgMHhmNDBlMzU4NSwgMHg1NzcxMjAyYSwgMHgxMDZhYTA3MCwgMHgzMmJiZDFiOCxcbiAgMHgxOWE0YzExNiwgMHhiOGQyZDBjOCwgMHgxZTM3NmMwOCwgMHg1MTQxYWI1MyxcbiAgMHgyNzQ4Nzc0YywgMHhkZjhlZWI5OSwgMHgzNGIwYmNiNSwgMHhlMTliNDhhOCxcbiAgMHgzOTFjMGNiMywgMHhjNWM5NWE2MywgMHg0ZWQ4YWE0YSwgMHhlMzQxOGFjYixcbiAgMHg1YjljY2E0ZiwgMHg3NzYzZTM3MywgMHg2ODJlNmZmMywgMHhkNmIyYjhhMyxcbiAgMHg3NDhmODJlZSwgMHg1ZGVmYjJmYywgMHg3OGE1NjM2ZiwgMHg0MzE3MmY2MCxcbiAgMHg4NGM4NzgxNCwgMHhhMWYwYWI3MiwgMHg4Y2M3MDIwOCwgMHgxYTY0MzllYyxcbiAgMHg5MGJlZmZmYSwgMHgyMzYzMWUyOCwgMHhhNDUwNmNlYiwgMHhkZTgyYmRlOSxcbiAgMHhiZWY5YTNmNywgMHhiMmM2NzkxNSwgMHhjNjcxNzhmMiwgMHhlMzcyNTMyYixcbiAgMHhjYTI3M2VjZSwgMHhlYTI2NjE5YywgMHhkMTg2YjhjNywgMHgyMWMwYzIwNyxcbiAgMHhlYWRhN2RkNiwgMHhjZGUwZWIxZSwgMHhmNTdkNGY3ZiwgMHhlZTZlZDE3OCxcbiAgMHgwNmYwNjdhYSwgMHg3MjE3NmZiYSwgMHgwYTYzN2RjNSwgMHhhMmM4OThhNixcbiAgMHgxMTNmOTgwNCwgMHhiZWY5MGRhZSwgMHgxYjcxMGIzNSwgMHgxMzFjNDcxYixcbiAgMHgyOGRiNzdmNSwgMHgyMzA0N2Q4NCwgMHgzMmNhYWI3YiwgMHg0MGM3MjQ5MyxcbiAgMHgzYzllYmUwYSwgMHgxNWM5YmViYywgMHg0MzFkNjdjNCwgMHg5YzEwMGQ0YyxcbiAgMHg0Y2M1ZDRiZSwgMHhjYjNlNDJiNiwgMHg1OTdmMjk5YywgMHhmYzY1N2UyYSxcbiAgMHg1ZmNiNmZhYiwgMHgzYWQ2ZmFlYywgMHg2YzQ0MTk4YywgMHg0YTQ3NTgxN1xuXTtcblxuZnVuY3Rpb24gU0hBNTEyKCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU0hBNTEyKSlcbiAgICByZXR1cm4gbmV3IFNIQTUxMigpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbXG4gICAgMHg2YTA5ZTY2NywgMHhmM2JjYzkwOCxcbiAgICAweGJiNjdhZTg1LCAweDg0Y2FhNzNiLFxuICAgIDB4M2M2ZWYzNzIsIDB4ZmU5NGY4MmIsXG4gICAgMHhhNTRmZjUzYSwgMHg1ZjFkMzZmMSxcbiAgICAweDUxMGU1MjdmLCAweGFkZTY4MmQxLFxuICAgIDB4OWIwNTY4OGMsIDB4MmIzZTZjMWYsXG4gICAgMHgxZjgzZDlhYiwgMHhmYjQxYmQ2YixcbiAgICAweDViZTBjZDE5LCAweDEzN2UyMTc5IF07XG4gIHRoaXMuayA9IHNoYTUxMl9LO1xuICB0aGlzLlcgPSBuZXcgQXJyYXkoMTYwKTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTUxMiwgQmxvY2tIYXNoKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBNTEyO1xuXG5TSEE1MTIuYmxvY2tTaXplID0gMTAyNDtcblNIQTUxMi5vdXRTaXplID0gNTEyO1xuU0hBNTEyLmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTUxMi5wYWRMZW5ndGggPSAxMjg7XG5cblNIQTUxMi5wcm90b3R5cGUuX3ByZXBhcmVCbG9jayA9IGZ1bmN0aW9uIF9wcmVwYXJlQmxvY2sobXNnLCBzdGFydCkge1xuICB2YXIgVyA9IHRoaXMuVztcblxuICAvLyAzMiB4IDMyYml0IHdvcmRzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMzI7IGkrKylcbiAgICBXW2ldID0gbXNnW3N0YXJ0ICsgaV07XG4gIGZvciAoOyBpIDwgVy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciBjMF9oaSA9IGcxXzUxMl9oaShXW2kgLSA0XSwgV1tpIC0gM10pOyAgLy8gaSAtIDJcbiAgICB2YXIgYzBfbG8gPSBnMV81MTJfbG8oV1tpIC0gNF0sIFdbaSAtIDNdKTtcbiAgICB2YXIgYzFfaGkgPSBXW2kgLSAxNF07ICAvLyBpIC0gN1xuICAgIHZhciBjMV9sbyA9IFdbaSAtIDEzXTtcbiAgICB2YXIgYzJfaGkgPSBnMF81MTJfaGkoV1tpIC0gMzBdLCBXW2kgLSAyOV0pOyAgLy8gaSAtIDE1XG4gICAgdmFyIGMyX2xvID0gZzBfNTEyX2xvKFdbaSAtIDMwXSwgV1tpIC0gMjldKTtcbiAgICB2YXIgYzNfaGkgPSBXW2kgLSAzMl07ICAvLyBpIC0gMTZcbiAgICB2YXIgYzNfbG8gPSBXW2kgLSAzMV07XG5cbiAgICBXW2ldID0gc3VtNjRfNF9oaShcbiAgICAgIGMwX2hpLCBjMF9sbyxcbiAgICAgIGMxX2hpLCBjMV9sbyxcbiAgICAgIGMyX2hpLCBjMl9sbyxcbiAgICAgIGMzX2hpLCBjM19sbyk7XG4gICAgV1tpICsgMV0gPSBzdW02NF80X2xvKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvKTtcbiAgfVxufTtcblxuU0hBNTEyLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gX3VwZGF0ZShtc2csIHN0YXJ0KSB7XG4gIHRoaXMuX3ByZXBhcmVCbG9jayhtc2csIHN0YXJ0KTtcblxuICB2YXIgVyA9IHRoaXMuVztcblxuICB2YXIgYWggPSB0aGlzLmhbMF07XG4gIHZhciBhbCA9IHRoaXMuaFsxXTtcbiAgdmFyIGJoID0gdGhpcy5oWzJdO1xuICB2YXIgYmwgPSB0aGlzLmhbM107XG4gIHZhciBjaCA9IHRoaXMuaFs0XTtcbiAgdmFyIGNsID0gdGhpcy5oWzVdO1xuICB2YXIgZGggPSB0aGlzLmhbNl07XG4gIHZhciBkbCA9IHRoaXMuaFs3XTtcbiAgdmFyIGVoID0gdGhpcy5oWzhdO1xuICB2YXIgZWwgPSB0aGlzLmhbOV07XG4gIHZhciBmaCA9IHRoaXMuaFsxMF07XG4gIHZhciBmbCA9IHRoaXMuaFsxMV07XG4gIHZhciBnaCA9IHRoaXMuaFsxMl07XG4gIHZhciBnbCA9IHRoaXMuaFsxM107XG4gIHZhciBoaCA9IHRoaXMuaFsxNF07XG4gIHZhciBobCA9IHRoaXMuaFsxNV07XG5cbiAgYXNzZXJ0KHRoaXMuay5sZW5ndGggPT09IFcubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBXLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIGMwX2hpID0gaGg7XG4gICAgdmFyIGMwX2xvID0gaGw7XG4gICAgdmFyIGMxX2hpID0gczFfNTEyX2hpKGVoLCBlbCk7XG4gICAgdmFyIGMxX2xvID0gczFfNTEyX2xvKGVoLCBlbCk7XG4gICAgdmFyIGMyX2hpID0gY2g2NF9oaShlaCwgZWwsIGZoLCBmbCwgZ2gsIGdsKTtcbiAgICB2YXIgYzJfbG8gPSBjaDY0X2xvKGVoLCBlbCwgZmgsIGZsLCBnaCwgZ2wpO1xuICAgIHZhciBjM19oaSA9IHRoaXMua1tpXTtcbiAgICB2YXIgYzNfbG8gPSB0aGlzLmtbaSArIDFdO1xuICAgIHZhciBjNF9oaSA9IFdbaV07XG4gICAgdmFyIGM0X2xvID0gV1tpICsgMV07XG5cbiAgICB2YXIgVDFfaGkgPSBzdW02NF81X2hpKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvLFxuICAgICAgYzRfaGksIGM0X2xvKTtcbiAgICB2YXIgVDFfbG8gPSBzdW02NF81X2xvKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvLFxuICAgICAgYzRfaGksIGM0X2xvKTtcblxuICAgIGMwX2hpID0gczBfNTEyX2hpKGFoLCBhbCk7XG4gICAgYzBfbG8gPSBzMF81MTJfbG8oYWgsIGFsKTtcbiAgICBjMV9oaSA9IG1hajY0X2hpKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wpO1xuICAgIGMxX2xvID0gbWFqNjRfbG8oYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCk7XG5cbiAgICB2YXIgVDJfaGkgPSBzdW02NF9oaShjMF9oaSwgYzBfbG8sIGMxX2hpLCBjMV9sbyk7XG4gICAgdmFyIFQyX2xvID0gc3VtNjRfbG8oYzBfaGksIGMwX2xvLCBjMV9oaSwgYzFfbG8pO1xuXG4gICAgaGggPSBnaDtcbiAgICBobCA9IGdsO1xuXG4gICAgZ2ggPSBmaDtcbiAgICBnbCA9IGZsO1xuXG4gICAgZmggPSBlaDtcbiAgICBmbCA9IGVsO1xuXG4gICAgZWggPSBzdW02NF9oaShkaCwgZGwsIFQxX2hpLCBUMV9sbyk7XG4gICAgZWwgPSBzdW02NF9sbyhkbCwgZGwsIFQxX2hpLCBUMV9sbyk7XG5cbiAgICBkaCA9IGNoO1xuICAgIGRsID0gY2w7XG5cbiAgICBjaCA9IGJoO1xuICAgIGNsID0gYmw7XG5cbiAgICBiaCA9IGFoO1xuICAgIGJsID0gYWw7XG5cbiAgICBhaCA9IHN1bTY0X2hpKFQxX2hpLCBUMV9sbywgVDJfaGksIFQyX2xvKTtcbiAgICBhbCA9IHN1bTY0X2xvKFQxX2hpLCBUMV9sbywgVDJfaGksIFQyX2xvKTtcbiAgfVxuXG4gIHN1bTY0KHRoaXMuaCwgMCwgYWgsIGFsKTtcbiAgc3VtNjQodGhpcy5oLCAyLCBiaCwgYmwpO1xuICBzdW02NCh0aGlzLmgsIDQsIGNoLCBjbCk7XG4gIHN1bTY0KHRoaXMuaCwgNiwgZGgsIGRsKTtcbiAgc3VtNjQodGhpcy5oLCA4LCBlaCwgZWwpO1xuICBzdW02NCh0aGlzLmgsIDEwLCBmaCwgZmwpO1xuICBzdW02NCh0aGlzLmgsIDEyLCBnaCwgZ2wpO1xuICBzdW02NCh0aGlzLmgsIDE0LCBoaCwgaGwpO1xufTtcblxuU0hBNTEyLnByb3RvdHlwZS5fZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdXRpbHMudG9IZXgzMih0aGlzLmgsICdiaWcnKTtcbiAgZWxzZVxuICAgIHJldHVybiB1dGlscy5zcGxpdDMyKHRoaXMuaCwgJ2JpZycpO1xufTtcblxuZnVuY3Rpb24gY2g2NF9oaSh4aCwgeGwsIHloLCB5bCwgemgpIHtcbiAgdmFyIHIgPSAoeGggJiB5aCkgXiAoKH54aCkgJiB6aCk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gY2g2NF9sbyh4aCwgeGwsIHloLCB5bCwgemgsIHpsKSB7XG4gIHZhciByID0gKHhsICYgeWwpIF4gKCh+eGwpICYgemwpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIG1hajY0X2hpKHhoLCB4bCwgeWgsIHlsLCB6aCkge1xuICB2YXIgciA9ICh4aCAmIHloKSBeICh4aCAmIHpoKSBeICh5aCAmIHpoKTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBtYWo2NF9sbyh4aCwgeGwsIHloLCB5bCwgemgsIHpsKSB7XG4gIHZhciByID0gKHhsICYgeWwpIF4gKHhsICYgemwpIF4gKHlsICYgemwpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIHMwXzUxMl9oaSh4aCwgeGwpIHtcbiAgdmFyIGMwX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgMjgpO1xuICB2YXIgYzFfaGkgPSByb3RyNjRfaGkoeGwsIHhoLCAyKTsgIC8vIDM0XG4gIHZhciBjMl9oaSA9IHJvdHI2NF9oaSh4bCwgeGgsIDcpOyAgLy8gMzlcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBzMF81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDI4KTtcbiAgdmFyIGMxX2xvID0gcm90cjY0X2xvKHhsLCB4aCwgMik7ICAvLyAzNFxuICB2YXIgYzJfbG8gPSByb3RyNjRfbG8oeGwsIHhoLCA3KTsgIC8vIDM5XG5cbiAgdmFyIHIgPSBjMF9sbyBeIGMxX2xvIF4gYzJfbG87XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gczFfNTEyX2hpKHhoLCB4bCkge1xuICB2YXIgYzBfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCAxNCk7XG4gIHZhciBjMV9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDE4KTtcbiAgdmFyIGMyX2hpID0gcm90cjY0X2hpKHhsLCB4aCwgOSk7ICAvLyA0MVxuXG4gIHZhciByID0gYzBfaGkgXiBjMV9oaSBeIGMyX2hpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIHMxXzUxMl9sbyh4aCwgeGwpIHtcbiAgdmFyIGMwX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgMTQpO1xuICB2YXIgYzFfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCAxOCk7XG4gIHZhciBjMl9sbyA9IHJvdHI2NF9sbyh4bCwgeGgsIDkpOyAgLy8gNDFcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMF81MTJfaGkoeGgsIHhsKSB7XG4gIHZhciBjMF9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDEpO1xuICB2YXIgYzFfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCA4KTtcbiAgdmFyIGMyX2hpID0gc2hyNjRfaGkoeGgsIHhsLCA3KTtcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMF81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDEpO1xuICB2YXIgYzFfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCA4KTtcbiAgdmFyIGMyX2xvID0gc2hyNjRfbG8oeGgsIHhsLCA3KTtcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMV81MTJfaGkoeGgsIHhsKSB7XG4gIHZhciBjMF9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDE5KTtcbiAgdmFyIGMxX2hpID0gcm90cjY0X2hpKHhsLCB4aCwgMjkpOyAgLy8gNjFcbiAgdmFyIGMyX2hpID0gc2hyNjRfaGkoeGgsIHhsLCA2KTtcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMV81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDE5KTtcbiAgdmFyIGMxX2xvID0gcm90cjY0X2xvKHhsLCB4aCwgMjkpOyAgLy8gNjFcbiAgdmFyIGMyX2xvID0gc2hyNjRfbG8oeGgsIHhsLCA2KTtcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIHJvdHIzMiA9IHV0aWxzLnJvdHIzMjtcblxuZnVuY3Rpb24gZnRfMShzLCB4LCB5LCB6KSB7XG4gIGlmIChzID09PSAwKVxuICAgIHJldHVybiBjaDMyKHgsIHksIHopO1xuICBpZiAocyA9PT0gMSB8fCBzID09PSAzKVxuICAgIHJldHVybiBwMzIoeCwgeSwgeik7XG4gIGlmIChzID09PSAyKVxuICAgIHJldHVybiBtYWozMih4LCB5LCB6KTtcbn1cbmV4cG9ydHMuZnRfMSA9IGZ0XzE7XG5cbmZ1bmN0aW9uIGNoMzIoeCwgeSwgeikge1xuICByZXR1cm4gKHggJiB5KSBeICgofngpICYgeik7XG59XG5leHBvcnRzLmNoMzIgPSBjaDMyO1xuXG5mdW5jdGlvbiBtYWozMih4LCB5LCB6KSB7XG4gIHJldHVybiAoeCAmIHkpIF4gKHggJiB6KSBeICh5ICYgeik7XG59XG5leHBvcnRzLm1hajMyID0gbWFqMzI7XG5cbmZ1bmN0aW9uIHAzMih4LCB5LCB6KSB7XG4gIHJldHVybiB4IF4geSBeIHo7XG59XG5leHBvcnRzLnAzMiA9IHAzMjtcblxuZnVuY3Rpb24gczBfMjU2KHgpIHtcbiAgcmV0dXJuIHJvdHIzMih4LCAyKSBeIHJvdHIzMih4LCAxMykgXiByb3RyMzIoeCwgMjIpO1xufVxuZXhwb3J0cy5zMF8yNTYgPSBzMF8yNTY7XG5cbmZ1bmN0aW9uIHMxXzI1Nih4KSB7XG4gIHJldHVybiByb3RyMzIoeCwgNikgXiByb3RyMzIoeCwgMTEpIF4gcm90cjMyKHgsIDI1KTtcbn1cbmV4cG9ydHMuczFfMjU2ID0gczFfMjU2O1xuXG5mdW5jdGlvbiBnMF8yNTYoeCkge1xuICByZXR1cm4gcm90cjMyKHgsIDcpIF4gcm90cjMyKHgsIDE4KSBeICh4ID4+PiAzKTtcbn1cbmV4cG9ydHMuZzBfMjU2ID0gZzBfMjU2O1xuXG5mdW5jdGlvbiBnMV8yNTYoeCkge1xuICByZXR1cm4gcm90cjMyKHgsIDE3KSBeIHJvdHIzMih4LCAxOSkgXiAoeCA+Pj4gMTApO1xufVxuZXhwb3J0cy5nMV8yNTYgPSBnMV8yNTY7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLmluaGVyaXRzID0gaW5oZXJpdHM7XG5cbmZ1bmN0aW9uIHRvQXJyYXkobXNnLCBlbmMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkobXNnKSlcbiAgICByZXR1cm4gbXNnLnNsaWNlKCk7XG4gIGlmICghbXNnKVxuICAgIHJldHVybiBbXTtcbiAgdmFyIHJlcyA9IFtdO1xuICBpZiAodHlwZW9mIG1zZyA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIWVuYykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGMgPSBtc2cuY2hhckNvZGVBdChpKTtcbiAgICAgICAgdmFyIGhpID0gYyA+PiA4O1xuICAgICAgICB2YXIgbG8gPSBjICYgMHhmZjtcbiAgICAgICAgaWYgKGhpKVxuICAgICAgICAgIHJlcy5wdXNoKGhpLCBsbyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICByZXMucHVzaChsbyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlbmMgPT09ICdoZXgnKSB7XG4gICAgICBtc2cgPSBtc2cucmVwbGFjZSgvW15hLXowLTldKy9pZywgJycpO1xuICAgICAgaWYgKG1zZy5sZW5ndGggJSAyICE9PSAwKVxuICAgICAgICBtc2cgPSAnMCcgKyBtc2c7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSArPSAyKVxuICAgICAgICByZXMucHVzaChwYXJzZUludChtc2dbaV0gKyBtc2dbaSArIDFdLCAxNikpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKVxuICAgICAgcmVzW2ldID0gbXNnW2ldIHwgMDtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy50b0FycmF5ID0gdG9BcnJheTtcblxuZnVuY3Rpb24gdG9IZXgobXNnKSB7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspXG4gICAgcmVzICs9IHplcm8yKG1zZ1tpXS50b1N0cmluZygxNikpO1xuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy50b0hleCA9IHRvSGV4O1xuXG5mdW5jdGlvbiBodG9ubCh3KSB7XG4gIHZhciByZXMgPSAodyA+Pj4gMjQpIHxcbiAgICAgICAgICAgICgodyA+Pj4gOCkgJiAweGZmMDApIHxcbiAgICAgICAgICAgICgodyA8PCA4KSAmIDB4ZmYwMDAwKSB8XG4gICAgICAgICAgICAoKHcgJiAweGZmKSA8PCAyNCk7XG4gIHJldHVybiByZXMgPj4+IDA7XG59XG5leHBvcnRzLmh0b25sID0gaHRvbmw7XG5cbmZ1bmN0aW9uIHRvSGV4MzIobXNnLCBlbmRpYW4pIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB3ID0gbXNnW2ldO1xuICAgIGlmIChlbmRpYW4gPT09ICdsaXR0bGUnKVxuICAgICAgdyA9IGh0b25sKHcpO1xuICAgIHJlcyArPSB6ZXJvOCh3LnRvU3RyaW5nKDE2KSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMudG9IZXgzMiA9IHRvSGV4MzI7XG5cbmZ1bmN0aW9uIHplcm8yKHdvcmQpIHtcbiAgaWYgKHdvcmQubGVuZ3RoID09PSAxKVxuICAgIHJldHVybiAnMCcgKyB3b3JkO1xuICBlbHNlXG4gICAgcmV0dXJuIHdvcmQ7XG59XG5leHBvcnRzLnplcm8yID0gemVybzI7XG5cbmZ1bmN0aW9uIHplcm84KHdvcmQpIHtcbiAgaWYgKHdvcmQubGVuZ3RoID09PSA3KVxuICAgIHJldHVybiAnMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gNilcbiAgICByZXR1cm4gJzAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSA1KVxuICAgIHJldHVybiAnMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSA0KVxuICAgIHJldHVybiAnMDAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gMylcbiAgICByZXR1cm4gJzAwMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSAyKVxuICAgIHJldHVybiAnMDAwMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSAxKVxuICAgIHJldHVybiAnMDAwMDAwMCcgKyB3b3JkO1xuICBlbHNlXG4gICAgcmV0dXJuIHdvcmQ7XG59XG5leHBvcnRzLnplcm84ID0gemVybzg7XG5cbmZ1bmN0aW9uIGpvaW4zMihtc2csIHN0YXJ0LCBlbmQsIGVuZGlhbikge1xuICB2YXIgbGVuID0gZW5kIC0gc3RhcnQ7XG4gIGFzc2VydChsZW4gJSA0ID09PSAwKTtcbiAgdmFyIHJlcyA9IG5ldyBBcnJheShsZW4gLyA0KTtcbiAgZm9yICh2YXIgaSA9IDAsIGsgPSBzdGFydDsgaSA8IHJlcy5sZW5ndGg7IGkrKywgayArPSA0KSB7XG4gICAgdmFyIHc7XG4gICAgaWYgKGVuZGlhbiA9PT0gJ2JpZycpXG4gICAgICB3ID0gKG1zZ1trXSA8PCAyNCkgfCAobXNnW2sgKyAxXSA8PCAxNikgfCAobXNnW2sgKyAyXSA8PCA4KSB8IG1zZ1trICsgM107XG4gICAgZWxzZVxuICAgICAgdyA9IChtc2dbayArIDNdIDw8IDI0KSB8IChtc2dbayArIDJdIDw8IDE2KSB8IChtc2dbayArIDFdIDw8IDgpIHwgbXNnW2tdO1xuICAgIHJlc1tpXSA9IHcgPj4+IDA7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMuam9pbjMyID0gam9pbjMyO1xuXG5mdW5jdGlvbiBzcGxpdDMyKG1zZywgZW5kaWFuKSB7XG4gIHZhciByZXMgPSBuZXcgQXJyYXkobXNnLmxlbmd0aCAqIDQpO1xuICBmb3IgKHZhciBpID0gMCwgayA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyssIGsgKz0gNCkge1xuICAgIHZhciBtID0gbXNnW2ldO1xuICAgIGlmIChlbmRpYW4gPT09ICdiaWcnKSB7XG4gICAgICByZXNba10gPSBtID4+PiAyNDtcbiAgICAgIHJlc1trICsgMV0gPSAobSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgIHJlc1trICsgMl0gPSAobSA+Pj4gOCkgJiAweGZmO1xuICAgICAgcmVzW2sgKyAzXSA9IG0gJiAweGZmO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNbayArIDNdID0gbSA+Pj4gMjQ7XG4gICAgICByZXNbayArIDJdID0gKG0gPj4+IDE2KSAmIDB4ZmY7XG4gICAgICByZXNbayArIDFdID0gKG0gPj4+IDgpICYgMHhmZjtcbiAgICAgIHJlc1trXSA9IG0gJiAweGZmO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy5zcGxpdDMyID0gc3BsaXQzMjtcblxuZnVuY3Rpb24gcm90cjMyKHcsIGIpIHtcbiAgcmV0dXJuICh3ID4+PiBiKSB8ICh3IDw8ICgzMiAtIGIpKTtcbn1cbmV4cG9ydHMucm90cjMyID0gcm90cjMyO1xuXG5mdW5jdGlvbiByb3RsMzIodywgYikge1xuICByZXR1cm4gKHcgPDwgYikgfCAodyA+Pj4gKDMyIC0gYikpO1xufVxuZXhwb3J0cy5yb3RsMzIgPSByb3RsMzI7XG5cbmZ1bmN0aW9uIHN1bTMyKGEsIGIpIHtcbiAgcmV0dXJuIChhICsgYikgPj4+IDA7XG59XG5leHBvcnRzLnN1bTMyID0gc3VtMzI7XG5cbmZ1bmN0aW9uIHN1bTMyXzMoYSwgYiwgYykge1xuICByZXR1cm4gKGEgKyBiICsgYykgPj4+IDA7XG59XG5leHBvcnRzLnN1bTMyXzMgPSBzdW0zMl8zO1xuXG5mdW5jdGlvbiBzdW0zMl80KGEsIGIsIGMsIGQpIHtcbiAgcmV0dXJuIChhICsgYiArIGMgKyBkKSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtMzJfNCA9IHN1bTMyXzQ7XG5cbmZ1bmN0aW9uIHN1bTMyXzUoYSwgYiwgYywgZCwgZSkge1xuICByZXR1cm4gKGEgKyBiICsgYyArIGQgKyBlKSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtMzJfNSA9IHN1bTMyXzU7XG5cbmZ1bmN0aW9uIHN1bTY0KGJ1ZiwgcG9zLCBhaCwgYWwpIHtcbiAgdmFyIGJoID0gYnVmW3Bvc107XG4gIHZhciBibCA9IGJ1Zltwb3MgKyAxXTtcblxuICB2YXIgbG8gPSAoYWwgKyBibCkgPj4+IDA7XG4gIHZhciBoaSA9IChsbyA8IGFsID8gMSA6IDApICsgYWggKyBiaDtcbiAgYnVmW3Bvc10gPSBoaSA+Pj4gMDtcbiAgYnVmW3BvcyArIDFdID0gbG87XG59XG5leHBvcnRzLnN1bTY0ID0gc3VtNjQ7XG5cbmZ1bmN0aW9uIHN1bTY0X2hpKGFoLCBhbCwgYmgsIGJsKSB7XG4gIHZhciBsbyA9IChhbCArIGJsKSA+Pj4gMDtcbiAgdmFyIGhpID0gKGxvIDwgYWwgPyAxIDogMCkgKyBhaCArIGJoO1xuICByZXR1cm4gaGkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0X2hpID0gc3VtNjRfaGk7XG5cbmZ1bmN0aW9uIHN1bTY0X2xvKGFoLCBhbCwgYmgsIGJsKSB7XG4gIHZhciBsbyA9IGFsICsgYmw7XG4gIHJldHVybiBsbyA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfbG8gPSBzdW02NF9sbztcblxuZnVuY3Rpb24gc3VtNjRfNF9oaShhaCwgYWwsIGJoLCBibCwgY2gsIGNsLCBkaCwgZGwpIHtcbiAgdmFyIGNhcnJ5ID0gMDtcbiAgdmFyIGxvID0gYWw7XG4gIGxvID0gKGxvICsgYmwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGFsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgY2wpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGNsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZGwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGRsID8gMSA6IDA7XG5cbiAgdmFyIGhpID0gYWggKyBiaCArIGNoICsgZGggKyBjYXJyeTtcbiAgcmV0dXJuIGhpID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF80X2hpID0gc3VtNjRfNF9oaTtcblxuZnVuY3Rpb24gc3VtNjRfNF9sbyhhaCwgYWwsIGJoLCBibCwgY2gsIGNsLCBkaCwgZGwpIHtcbiAgdmFyIGxvID0gYWwgKyBibCArIGNsICsgZGw7XG4gIHJldHVybiBsbyA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfNF9sbyA9IHN1bTY0XzRfbG87XG5cbmZ1bmN0aW9uIHN1bTY0XzVfaGkoYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCwgZGgsIGRsLCBlaCwgZWwpIHtcbiAgdmFyIGNhcnJ5ID0gMDtcbiAgdmFyIGxvID0gYWw7XG4gIGxvID0gKGxvICsgYmwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGFsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgY2wpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGNsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZGwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGRsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZWwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGVsID8gMSA6IDA7XG5cbiAgdmFyIGhpID0gYWggKyBiaCArIGNoICsgZGggKyBlaCArIGNhcnJ5O1xuICByZXR1cm4gaGkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0XzVfaGkgPSBzdW02NF81X2hpO1xuXG5mdW5jdGlvbiBzdW02NF81X2xvKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wsIGRoLCBkbCwgZWgsIGVsKSB7XG4gIHZhciBsbyA9IGFsICsgYmwgKyBjbCArIGRsICsgZWw7XG5cbiAgcmV0dXJuIGxvID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF81X2xvID0gc3VtNjRfNV9sbztcblxuZnVuY3Rpb24gcm90cjY0X2hpKGFoLCBhbCwgbnVtKSB7XG4gIHZhciByID0gKGFsIDw8ICgzMiAtIG51bSkpIHwgKGFoID4+PiBudW0pO1xuICByZXR1cm4gciA+Pj4gMDtcbn1cbmV4cG9ydHMucm90cjY0X2hpID0gcm90cjY0X2hpO1xuXG5mdW5jdGlvbiByb3RyNjRfbG8oYWgsIGFsLCBudW0pIHtcbiAgdmFyIHIgPSAoYWggPDwgKDMyIC0gbnVtKSkgfCAoYWwgPj4+IG51bSk7XG4gIHJldHVybiByID4+PiAwO1xufVxuZXhwb3J0cy5yb3RyNjRfbG8gPSByb3RyNjRfbG87XG5cbmZ1bmN0aW9uIHNocjY0X2hpKGFoLCBhbCwgbnVtKSB7XG4gIHJldHVybiBhaCA+Pj4gbnVtO1xufVxuZXhwb3J0cy5zaHI2NF9oaSA9IHNocjY0X2hpO1xuXG5mdW5jdGlvbiBzaHI2NF9sbyhhaCwgYWwsIG51bSkge1xuICB2YXIgciA9IChhaCA8PCAoMzIgLSBudW0pKSB8IChhbCA+Pj4gbnVtKTtcbiAgcmV0dXJuIHIgPj4+IDA7XG59XG5leHBvcnRzLnNocjY0X2xvID0gc2hyNjRfbG87XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNoID0gcmVxdWlyZSgnaGFzaC5qcycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWNyeXB0by11dGlscycpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxuZnVuY3Rpb24gSG1hY0RSQkcob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSG1hY0RSQkcpKVxuICAgIHJldHVybiBuZXcgSG1hY0RSQkcob3B0aW9ucyk7XG4gIHRoaXMuaGFzaCA9IG9wdGlvbnMuaGFzaDtcbiAgdGhpcy5wcmVkUmVzaXN0ID0gISFvcHRpb25zLnByZWRSZXNpc3Q7XG5cbiAgdGhpcy5vdXRMZW4gPSB0aGlzLmhhc2gub3V0U2l6ZTtcbiAgdGhpcy5taW5FbnRyb3B5ID0gb3B0aW9ucy5taW5FbnRyb3B5IHx8IHRoaXMuaGFzaC5obWFjU3RyZW5ndGg7XG5cbiAgdGhpcy5fcmVzZWVkID0gbnVsbDtcbiAgdGhpcy5yZXNlZWRJbnRlcnZhbCA9IG51bGw7XG4gIHRoaXMuSyA9IG51bGw7XG4gIHRoaXMuViA9IG51bGw7XG5cbiAgdmFyIGVudHJvcHkgPSB1dGlscy50b0FycmF5KG9wdGlvbnMuZW50cm9weSwgb3B0aW9ucy5lbnRyb3B5RW5jIHx8ICdoZXgnKTtcbiAgdmFyIG5vbmNlID0gdXRpbHMudG9BcnJheShvcHRpb25zLm5vbmNlLCBvcHRpb25zLm5vbmNlRW5jIHx8ICdoZXgnKTtcbiAgdmFyIHBlcnMgPSB1dGlscy50b0FycmF5KG9wdGlvbnMucGVycywgb3B0aW9ucy5wZXJzRW5jIHx8ICdoZXgnKTtcbiAgYXNzZXJ0KGVudHJvcHkubGVuZ3RoID49ICh0aGlzLm1pbkVudHJvcHkgLyA4KSxcbiAgICAgICAgICdOb3QgZW5vdWdoIGVudHJvcHkuIE1pbmltdW0gaXM6ICcgKyB0aGlzLm1pbkVudHJvcHkgKyAnIGJpdHMnKTtcbiAgdGhpcy5faW5pdChlbnRyb3B5LCBub25jZSwgcGVycyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEhtYWNEUkJHO1xuXG5IbWFjRFJCRy5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiBpbml0KGVudHJvcHksIG5vbmNlLCBwZXJzKSB7XG4gIHZhciBzZWVkID0gZW50cm9weS5jb25jYXQobm9uY2UpLmNvbmNhdChwZXJzKTtcblxuICB0aGlzLksgPSBuZXcgQXJyYXkodGhpcy5vdXRMZW4gLyA4KTtcbiAgdGhpcy5WID0gbmV3IEFycmF5KHRoaXMub3V0TGVuIC8gOCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5WLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5LW2ldID0gMHgwMDtcbiAgICB0aGlzLlZbaV0gPSAweDAxO1xuICB9XG5cbiAgdGhpcy5fdXBkYXRlKHNlZWQpO1xuICB0aGlzLl9yZXNlZWQgPSAxO1xuICB0aGlzLnJlc2VlZEludGVydmFsID0gMHgxMDAwMDAwMDAwMDAwOyAgLy8gMl40OFxufTtcblxuSG1hY0RSQkcucHJvdG90eXBlLl9obWFjID0gZnVuY3Rpb24gaG1hYygpIHtcbiAgcmV0dXJuIG5ldyBoYXNoLmhtYWModGhpcy5oYXNoLCB0aGlzLkspO1xufTtcblxuSG1hY0RSQkcucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoc2VlZCkge1xuICB2YXIga21hYyA9IHRoaXMuX2htYWMoKVxuICAgICAgICAgICAgICAgICAudXBkYXRlKHRoaXMuVilcbiAgICAgICAgICAgICAgICAgLnVwZGF0ZShbIDB4MDAgXSk7XG4gIGlmIChzZWVkKVxuICAgIGttYWMgPSBrbWFjLnVwZGF0ZShzZWVkKTtcbiAgdGhpcy5LID0ga21hYy5kaWdlc3QoKTtcbiAgdGhpcy5WID0gdGhpcy5faG1hYygpLnVwZGF0ZSh0aGlzLlYpLmRpZ2VzdCgpO1xuICBpZiAoIXNlZWQpXG4gICAgcmV0dXJuO1xuXG4gIHRoaXMuSyA9IHRoaXMuX2htYWMoKVxuICAgICAgICAgICAgICAgLnVwZGF0ZSh0aGlzLlYpXG4gICAgICAgICAgICAgICAudXBkYXRlKFsgMHgwMSBdKVxuICAgICAgICAgICAgICAgLnVwZGF0ZShzZWVkKVxuICAgICAgICAgICAgICAgLmRpZ2VzdCgpO1xuICB0aGlzLlYgPSB0aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikuZGlnZXN0KCk7XG59O1xuXG5IbWFjRFJCRy5wcm90b3R5cGUucmVzZWVkID0gZnVuY3Rpb24gcmVzZWVkKGVudHJvcHksIGVudHJvcHlFbmMsIGFkZCwgYWRkRW5jKSB7XG4gIC8vIE9wdGlvbmFsIGVudHJvcHkgZW5jXG4gIGlmICh0eXBlb2YgZW50cm9weUVuYyAhPT0gJ3N0cmluZycpIHtcbiAgICBhZGRFbmMgPSBhZGQ7XG4gICAgYWRkID0gZW50cm9weUVuYztcbiAgICBlbnRyb3B5RW5jID0gbnVsbDtcbiAgfVxuXG4gIGVudHJvcHkgPSB1dGlscy50b0FycmF5KGVudHJvcHksIGVudHJvcHlFbmMpO1xuICBhZGQgPSB1dGlscy50b0FycmF5KGFkZCwgYWRkRW5jKTtcblxuICBhc3NlcnQoZW50cm9weS5sZW5ndGggPj0gKHRoaXMubWluRW50cm9weSAvIDgpLFxuICAgICAgICAgJ05vdCBlbm91Z2ggZW50cm9weS4gTWluaW11bSBpczogJyArIHRoaXMubWluRW50cm9weSArICcgYml0cycpO1xuXG4gIHRoaXMuX3VwZGF0ZShlbnRyb3B5LmNvbmNhdChhZGQgfHwgW10pKTtcbiAgdGhpcy5fcmVzZWVkID0gMTtcbn07XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5nZW5lcmF0ZSA9IGZ1bmN0aW9uIGdlbmVyYXRlKGxlbiwgZW5jLCBhZGQsIGFkZEVuYykge1xuICBpZiAodGhpcy5fcmVzZWVkID4gdGhpcy5yZXNlZWRJbnRlcnZhbClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jlc2VlZCBpcyByZXF1aXJlZCcpO1xuXG4gIC8vIE9wdGlvbmFsIGVuY29kaW5nXG4gIGlmICh0eXBlb2YgZW5jICE9PSAnc3RyaW5nJykge1xuICAgIGFkZEVuYyA9IGFkZDtcbiAgICBhZGQgPSBlbmM7XG4gICAgZW5jID0gbnVsbDtcbiAgfVxuXG4gIC8vIE9wdGlvbmFsIGFkZGl0aW9uYWwgZGF0YVxuICBpZiAoYWRkKSB7XG4gICAgYWRkID0gdXRpbHMudG9BcnJheShhZGQsIGFkZEVuYyB8fCAnaGV4Jyk7XG4gICAgdGhpcy5fdXBkYXRlKGFkZCk7XG4gIH1cblxuICB2YXIgdGVtcCA9IFtdO1xuICB3aGlsZSAodGVtcC5sZW5ndGggPCBsZW4pIHtcbiAgICB0aGlzLlYgPSB0aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikuZGlnZXN0KCk7XG4gICAgdGVtcCA9IHRlbXAuY29uY2F0KHRoaXMuVik7XG4gIH1cblxuICB2YXIgcmVzID0gdGVtcC5zbGljZSgwLCBsZW4pO1xuICB0aGlzLl91cGRhdGUoYWRkKTtcbiAgdGhpcy5fcmVzZWVkKys7XG4gIHJldHVybiB1dGlscy5lbmNvZGUocmVzLCBlbmMpO1xufTtcbiIsImV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gKGUgKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gKG0gKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAoKHZhbHVlICogYykgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsIlxudmFyIGluZGV4T2YgPSBbXS5pbmRleE9mO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGFyciwgb2JqKXtcbiAgaWYgKGluZGV4T2YpIHJldHVybiBhcnIuaW5kZXhPZihvYmopO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgIGlmIChhcnJbaV0gPT09IG9iaikgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufTsiLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbiIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdFxuICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0XG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0XG4gKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHRcbiAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdFxuICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHRcbiAqIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvXG4gKiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0XG4gKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHRcbiAqL1xuaW1wb3J0IHsgQXR0cmlidXRlUGFydCwgZGVmYXVsdFBhcnRDYWxsYmFjaywgbm9DaGFuZ2UsIGdldFZhbHVlLCBTVkdUZW1wbGF0ZVJlc3VsdCwgVGVtcGxhdGVSZXN1bHQgfSBmcm9tICcuLi9saXQtaHRtbC5qcyc7XG5leHBvcnQgeyByZW5kZXIgfSBmcm9tICcuLi9saXQtaHRtbC5qcyc7XG4vKipcbiAqIEludGVycHJldHMgYSB0ZW1wbGF0ZSBsaXRlcmFsIGFzIGEgbGl0LWV4dGVuZGVkIEhUTUwgdGVtcGxhdGUuXG4gKi9cbmV4cG9ydCBjb25zdCBodG1sID0gKHN0cmluZ3MsIC4uLnZhbHVlcykgPT4gbmV3IFRlbXBsYXRlUmVzdWx0KHN0cmluZ3MsIHZhbHVlcywgJ2h0bWwnLCBleHRlbmRlZFBhcnRDYWxsYmFjayk7XG4vKipcbiAqIEludGVycHJldHMgYSB0ZW1wbGF0ZSBsaXRlcmFsIGFzIGEgbGl0LWV4dGVuZGVkIFNWRyB0ZW1wbGF0ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHN2ZyA9IChzdHJpbmdzLCAuLi52YWx1ZXMpID0+IG5ldyBTVkdUZW1wbGF0ZVJlc3VsdChzdHJpbmdzLCB2YWx1ZXMsICdzdmcnLCBleHRlbmRlZFBhcnRDYWxsYmFjayk7XG4vKipcbiAqIEEgUGFydENhbGxiYWNrIHdoaWNoIGFsbG93cyB0ZW1wbGF0ZXMgdG8gc2V0IHByb3BlcnRpZXMgYW5kIGRlY2xhcmF0aXZlXG4gKiBldmVudCBoYW5kbGVycy5cbiAqXG4gKiBQcm9wZXJ0aWVzIGFyZSBzZXQgYnkgZGVmYXVsdCwgaW5zdGVhZCBvZiBhdHRyaWJ1dGVzLiBBdHRyaWJ1dGUgbmFtZXMgaW5cbiAqIGxpdC1odG1sIHRlbXBsYXRlcyBwcmVzZXJ2ZSBjYXNlLCBzbyBwcm9wZXJ0aWVzIGFyZSBjYXNlIHNlbnNpdGl2ZS4gSWYgYW5cbiAqIGV4cHJlc3Npb24gdGFrZXMgdXAgYW4gZW50aXJlIGF0dHJpYnV0ZSB2YWx1ZSwgdGhlbiB0aGUgcHJvcGVydHkgaXMgc2V0IHRvXG4gKiB0aGF0IHZhbHVlLiBJZiBhbiBleHByZXNzaW9uIGlzIGludGVycG9sYXRlZCB3aXRoIGEgc3RyaW5nIG9yIG90aGVyXG4gKiBleHByZXNzaW9ucyB0aGVuIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdG8gdGhlIHN0cmluZyByZXN1bHQgb2YgdGhlXG4gKiBpbnRlcnBvbGF0aW9uLlxuICpcbiAqIFRvIHNldCBhbiBhdHRyaWJ1dGUgaW5zdGVhZCBvZiBhIHByb3BlcnR5LCBhcHBlbmQgYSBgJGAgc3VmZml4IHRvIHRoZVxuICogYXR0cmlidXRlIG5hbWUuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiAgICAgaHRtbGA8YnV0dG9uIGNsYXNzJD1cInByaW1hcnlcIj5CdXkgTm93PC9idXR0b24+YFxuICpcbiAqIFRvIHNldCBhbiBldmVudCBoYW5kbGVyLCBwcmVmaXggdGhlIGF0dHJpYnV0ZSBuYW1lIHdpdGggYG9uLWA6XG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiAgICAgaHRtbGA8YnV0dG9uIG9uLWNsaWNrPSR7KGUpPT4gdGhpcy5vbkNsaWNrSGFuZGxlcihlKX0+QnV5IE5vdzwvYnV0dG9uPmBcbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBleHRlbmRlZFBhcnRDYWxsYmFjayA9IChpbnN0YW5jZSwgdGVtcGxhdGVQYXJ0LCBub2RlKSA9PiB7XG4gICAgaWYgKHRlbXBsYXRlUGFydC50eXBlID09PSAnYXR0cmlidXRlJykge1xuICAgICAgICBpZiAodGVtcGxhdGVQYXJ0LnJhd05hbWUuc3Vic3RyKDAsIDMpID09PSAnb24tJykge1xuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0gdGVtcGxhdGVQYXJ0LnJhd05hbWUuc2xpY2UoMyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV2ZW50UGFydChpbnN0YW5jZSwgbm9kZSwgZXZlbnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYXN0Q2hhciA9IHRlbXBsYXRlUGFydC5uYW1lLnN1YnN0cih0ZW1wbGF0ZVBhcnQubmFtZS5sZW5ndGggLSAxKTtcbiAgICAgICAgaWYgKGxhc3RDaGFyID09PSAnJCcpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB0ZW1wbGF0ZVBhcnQubmFtZS5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZVBhcnQoaW5zdGFuY2UsIG5vZGUsIG5hbWUsIHRlbXBsYXRlUGFydC5zdHJpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGFzdENoYXIgPT09ICc/Jykge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRlbXBsYXRlUGFydC5uYW1lLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQm9vbGVhbkF0dHJpYnV0ZVBhcnQoaW5zdGFuY2UsIG5vZGUsIG5hbWUsIHRlbXBsYXRlUGFydC5zdHJpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5UGFydChpbnN0YW5jZSwgbm9kZSwgdGVtcGxhdGVQYXJ0LnJhd05hbWUsIHRlbXBsYXRlUGFydC5zdHJpbmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRQYXJ0Q2FsbGJhY2soaW5zdGFuY2UsIHRlbXBsYXRlUGFydCwgbm9kZSk7XG59O1xuLyoqXG4gKiBJbXBsZW1lbnRzIGEgYm9vbGVhbiBhdHRyaWJ1dGUsIHJvdWdobHkgYXMgZGVmaW5lZCBpbiB0aGUgSFRNTFxuICogc3BlY2lmaWNhdGlvbi5cbiAqXG4gKiBJZiB0aGUgdmFsdWUgaXMgdHJ1dGh5LCB0aGVuIHRoZSBhdHRyaWJ1dGUgaXMgcHJlc2VudCB3aXRoIGEgdmFsdWUgb2ZcbiAqICcnLiBJZiB0aGUgdmFsdWUgaXMgZmFsc2V5LCB0aGUgYXR0cmlidXRlIGlzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBCb29sZWFuQXR0cmlidXRlUGFydCBleHRlbmRzIEF0dHJpYnV0ZVBhcnQge1xuICAgIHNldFZhbHVlKHZhbHVlcywgc3RhcnRJbmRleCkge1xuICAgICAgICBjb25zdCBzID0gdGhpcy5zdHJpbmdzO1xuICAgICAgICBpZiAocy5sZW5ndGggPT09IDIgJiYgc1swXSA9PT0gJycgJiYgc1sxXSA9PT0gJycpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0VmFsdWUodGhpcywgdmFsdWVzW3N0YXJ0SW5kZXhdKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbm9DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKHRoaXMubmFtZSwgJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSh0aGlzLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdib29sZWFuIGF0dHJpYnV0ZXMgY2FuIG9ubHkgY29udGFpbiBhIHNpbmdsZSBleHByZXNzaW9uJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgY2xhc3MgUHJvcGVydHlQYXJ0IGV4dGVuZHMgQXR0cmlidXRlUGFydCB7XG4gICAgc2V0VmFsdWUodmFsdWVzLCBzdGFydEluZGV4KSB7XG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLnN0cmluZ3M7XG4gICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuX2VxdWFsVG9QcmV2aW91c1ZhbHVlcyh2YWx1ZXMsIHN0YXJ0SW5kZXgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMubGVuZ3RoID09PSAyICYmIHNbMF0gPT09ICcnICYmIHNbMV0gPT09ICcnKSB7XG4gICAgICAgICAgICAvLyBBbiBleHByZXNzaW9uIHRoYXQgb2NjdXBpZXMgdGhlIHdob2xlIGF0dHJpYnV0ZSB2YWx1ZSB3aWxsIGxlYXZlXG4gICAgICAgICAgICAvLyBsZWFkaW5nIGFuZCB0cmFpbGluZyBlbXB0eSBzdHJpbmdzLlxuICAgICAgICAgICAgdmFsdWUgPSBnZXRWYWx1ZSh0aGlzLCB2YWx1ZXNbc3RhcnRJbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gSW50ZXJwb2xhdGlvbiwgc28gaW50ZXJwb2xhdGVcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5faW50ZXJwb2xhdGUodmFsdWVzLCBzdGFydEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgIT09IG5vQ2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRbdGhpcy5uYW1lXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzVmFsdWVzID0gdmFsdWVzO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBFdmVudFBhcnQge1xuICAgIGNvbnN0cnVjdG9yKGluc3RhbmNlLCBlbGVtZW50LCBldmVudE5hbWUpIHtcbiAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLmV2ZW50TmFtZSA9IGV2ZW50TmFtZTtcbiAgICB9XG4gICAgc2V0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSBnZXRWYWx1ZSh0aGlzLCB2YWx1ZSk7XG4gICAgICAgIGlmIChsaXN0ZW5lciA9PT0gdGhpcy5fbGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5ldmVudE5hbWUsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX2xpc3RlbmVyID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRoaXMuZXZlbnROYW1lLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9saXN0ZW5lciA9IGxpc3RlbmVyO1xuICAgIH1cbiAgICBoYW5kbGVFdmVudChldmVudCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2xpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lci5jYWxsKHRoaXMuZWxlbWVudCwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLl9saXN0ZW5lci5oYW5kbGVFdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXIuaGFuZGxlRXZlbnQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGl0LWV4dGVuZGVkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXRcbiAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdFxuICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0XG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXRcbiAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0XG4gKiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzb1xuICogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdFxuICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4gKi9cbmltcG9ydCB7IGlzVGVtcGxhdGVQYXJ0QWN0aXZlIH0gZnJvbSAnLi4vbGl0LWh0bWwuanMnO1xuY29uc3Qgd2Fsa2VyTm9kZUZpbHRlciA9IE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UIHwgTm9kZUZpbHRlci5TSE9XX0NPTU1FTlQgfFxuICAgIE5vZGVGaWx0ZXIuU0hPV19URVhUO1xuLyoqXG4gKiBSZW1vdmVzIHRoZSBsaXN0IG9mIG5vZGVzIGZyb20gYSBUZW1wbGF0ZSBzYWZlbHkuIEluIGFkZGl0aW9uIHRvIHJlbW92aW5nXG4gKiBub2RlcyBmcm9tIHRoZSBUZW1wbGF0ZSwgdGhlIFRlbXBsYXRlIHBhcnQgaW5kaWNlcyBhcmUgdXBkYXRlZCB0byBtYXRjaFxuICogdGhlIG11dGF0ZWQgVGVtcGxhdGUgRE9NLlxuICpcbiAqIEFzIHRoZSB0ZW1wbGF0ZSBpcyB3YWxrZWQgdGhlIHJlbW92YWwgc3RhdGUgaXMgdHJhY2tlZCBhbmRcbiAqIHBhcnQgaW5kaWNlcyBhcmUgYWRqdXN0ZWQgYXMgbmVlZGVkLlxuICpcbiAqIGRpdlxuICogICBkaXYjMSAocmVtb3ZlKSA8LS0gc3RhcnQgcmVtb3ZpbmcgKHJlbW92aW5nIG5vZGUgaXMgZGl2IzEpXG4gKiAgICAgZGl2XG4gKiAgICAgICBkaXYjMiAocmVtb3ZlKSAgPC0tIGNvbnRpbnVlIHJlbW92aW5nIChyZW1vdmluZyBub2RlIGlzIHN0aWxsIGRpdiMxKVxuICogICAgICAgICBkaXZcbiAqIGRpdiA8LS0gc3RvcCByZW1vdmluZyBzaW5jZSBwcmV2aW91cyBzaWJsaW5nIGlzIHRoZSByZW1vdmluZyBub2RlIChkaXYjMSwgcmVtb3ZlZCA0IG5vZGVzKVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTm9kZXNGcm9tVGVtcGxhdGUodGVtcGxhdGUsIG5vZGVzVG9SZW1vdmUpIHtcbiAgICBjb25zdCB7IGVsZW1lbnQ6IHsgY29udGVudCB9LCBwYXJ0cyB9ID0gdGVtcGxhdGU7XG4gICAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihjb250ZW50LCB3YWxrZXJOb2RlRmlsdGVyLCBudWxsLCBmYWxzZSk7XG4gICAgbGV0IHBhcnRJbmRleCA9IDA7XG4gICAgbGV0IHBhcnQgPSBwYXJ0c1swXTtcbiAgICBsZXQgbm9kZUluZGV4ID0gLTE7XG4gICAgbGV0IHJlbW92ZUNvdW50ID0gMDtcbiAgICBjb25zdCBub2Rlc1RvUmVtb3ZlSW5UZW1wbGF0ZSA9IFtdO1xuICAgIGxldCBjdXJyZW50UmVtb3ZpbmdOb2RlID0gbnVsbDtcbiAgICB3aGlsZSAod2Fsa2VyLm5leHROb2RlKCkpIHtcbiAgICAgICAgbm9kZUluZGV4Kys7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB3YWxrZXIuY3VycmVudE5vZGU7XG4gICAgICAgIC8vIEVuZCByZW1vdmFsIGlmIHN0ZXBwZWQgcGFzdCB0aGUgcmVtb3Zpbmcgbm9kZVxuICAgICAgICBpZiAobm9kZS5wcmV2aW91c1NpYmxpbmcgPT09IGN1cnJlbnRSZW1vdmluZ05vZGUpIHtcbiAgICAgICAgICAgIGN1cnJlbnRSZW1vdmluZ05vZGUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEEgbm9kZSB0byByZW1vdmUgd2FzIGZvdW5kIGluIHRoZSB0ZW1wbGF0ZVxuICAgICAgICBpZiAobm9kZXNUb1JlbW92ZS5oYXMobm9kZSkpIHtcbiAgICAgICAgICAgIG5vZGVzVG9SZW1vdmVJblRlbXBsYXRlLnB1c2gobm9kZSk7XG4gICAgICAgICAgICAvLyBUcmFjayBub2RlIHdlJ3JlIHJlbW92aW5nXG4gICAgICAgICAgICBpZiAoY3VycmVudFJlbW92aW5nTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRSZW1vdmluZ05vZGUgPSBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFdoZW4gcmVtb3ZpbmcsIGluY3JlbWVudCBjb3VudCBieSB3aGljaCB0byBhZGp1c3Qgc3Vic2VxdWVudCBwYXJ0IGluZGljZXNcbiAgICAgICAgaWYgKGN1cnJlbnRSZW1vdmluZ05vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlbW92ZUNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHBhcnQgIT09IHVuZGVmaW5lZCAmJiBwYXJ0LmluZGV4ID09PSBub2RlSW5kZXgpIHtcbiAgICAgICAgICAgIC8vIElmIHBhcnQgaXMgaW4gYSByZW1vdmVkIG5vZGUgZGVhY3RpdmF0ZSBpdCBieSBzZXR0aW5nIGluZGV4IHRvIC0xIG9yXG4gICAgICAgICAgICAvLyBhZGp1c3QgdGhlIGluZGV4IGFzIG5lZWRlZC5cbiAgICAgICAgICAgIHBhcnQuaW5kZXggPSBjdXJyZW50UmVtb3ZpbmdOb2RlICE9PSBudWxsID8gLTEgOiBwYXJ0LmluZGV4IC0gcmVtb3ZlQ291bnQ7XG4gICAgICAgICAgICBwYXJ0ID0gcGFydHNbKytwYXJ0SW5kZXhdO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5vZGVzVG9SZW1vdmVJblRlbXBsYXRlLmZvckVhY2goKG4pID0+IG4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKSk7XG59XG5jb25zdCBjb3VudE5vZGVzID0gKG5vZGUpID0+IHtcbiAgICBsZXQgY291bnQgPSAxO1xuICAgIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIobm9kZSwgd2Fsa2VyTm9kZUZpbHRlciwgbnVsbCwgZmFsc2UpO1xuICAgIHdoaWxlICh3YWxrZXIubmV4dE5vZGUoKSkge1xuICAgICAgICBjb3VudCsrO1xuICAgIH1cbiAgICByZXR1cm4gY291bnQ7XG59O1xuY29uc3QgbmV4dEFjdGl2ZUluZGV4SW5UZW1wbGF0ZVBhcnRzID0gKHBhcnRzLCBzdGFydEluZGV4ID0gLTEpID0+IHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleCArIDE7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XG4gICAgICAgIGlmIChpc1RlbXBsYXRlUGFydEFjdGl2ZShwYXJ0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufTtcbi8qKlxuICogSW5zZXJ0cyB0aGUgZ2l2ZW4gbm9kZSBpbnRvIHRoZSBUZW1wbGF0ZSwgb3B0aW9uYWxseSBiZWZvcmUgdGhlIGdpdmVuXG4gKiByZWZOb2RlLiBJbiBhZGRpdGlvbiB0byBpbnNlcnRpbmcgdGhlIG5vZGUgaW50byB0aGUgVGVtcGxhdGUsIHRoZSBUZW1wbGF0ZVxuICogcGFydCBpbmRpY2VzIGFyZSB1cGRhdGVkIHRvIG1hdGNoIHRoZSBtdXRhdGVkIFRlbXBsYXRlIERPTS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc2VydE5vZGVJbnRvVGVtcGxhdGUodGVtcGxhdGUsIG5vZGUsIHJlZk5vZGUgPSBudWxsKSB7XG4gICAgY29uc3QgeyBlbGVtZW50OiB7IGNvbnRlbnQgfSwgcGFydHMgfSA9IHRlbXBsYXRlO1xuICAgIC8vIElmIHRoZXJlJ3Mgbm8gcmVmTm9kZSwgdGhlbiBwdXQgbm9kZSBhdCBlbmQgb2YgdGVtcGxhdGUuXG4gICAgLy8gTm8gcGFydCBpbmRpY2VzIG5lZWQgdG8gYmUgc2hpZnRlZCBpbiB0aGlzIGNhc2UuXG4gICAgaWYgKHJlZk5vZGUgPT09IG51bGwgfHwgcmVmTm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQobm9kZSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihjb250ZW50LCB3YWxrZXJOb2RlRmlsdGVyLCBudWxsLCBmYWxzZSk7XG4gICAgbGV0IHBhcnRJbmRleCA9IG5leHRBY3RpdmVJbmRleEluVGVtcGxhdGVQYXJ0cyhwYXJ0cyk7XG4gICAgbGV0IGluc2VydENvdW50ID0gMDtcbiAgICBsZXQgd2Fsa2VySW5kZXggPSAtMTtcbiAgICB3aGlsZSAod2Fsa2VyLm5leHROb2RlKCkpIHtcbiAgICAgICAgd2Fsa2VySW5kZXgrKztcbiAgICAgICAgY29uc3Qgd2Fsa2VyTm9kZSA9IHdhbGtlci5jdXJyZW50Tm9kZTtcbiAgICAgICAgaWYgKHdhbGtlck5vZGUgPT09IHJlZk5vZGUpIHtcbiAgICAgICAgICAgIHJlZk5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgcmVmTm9kZSk7XG4gICAgICAgICAgICBpbnNlcnRDb3VudCA9IGNvdW50Tm9kZXMobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHBhcnRJbmRleCAhPT0gLTEgJiYgcGFydHNbcGFydEluZGV4XS5pbmRleCA9PT0gd2Fsa2VySW5kZXgpIHtcbiAgICAgICAgICAgIC8vIElmIHdlJ3ZlIGluc2VydGVkIHRoZSBub2RlLCBzaW1wbHkgYWRqdXN0IGFsbCBzdWJzZXF1ZW50IHBhcnRzXG4gICAgICAgICAgICBpZiAoaW5zZXJ0Q291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhcnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFydHNbcGFydEluZGV4XS5pbmRleCArPSBpbnNlcnRDb3VudDtcbiAgICAgICAgICAgICAgICAgICAgcGFydEluZGV4ID0gbmV4dEFjdGl2ZUluZGV4SW5UZW1wbGF0ZVBhcnRzKHBhcnRzLCBwYXJ0SW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJ0SW5kZXggPSBuZXh0QWN0aXZlSW5kZXhJblRlbXBsYXRlUGFydHMocGFydHMsIHBhcnRJbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb2RpZnktdGVtcGxhdGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdFxuICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0XG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0XG4gKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHRcbiAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdFxuICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHRcbiAqIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvXG4gKiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0XG4gKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHRcbiAqL1xuaW1wb3J0IHsgcmVtb3ZlTm9kZXMsIFRlbXBsYXRlLCB0ZW1wbGF0ZUNhY2hlcywgVGVtcGxhdGVJbnN0YW5jZSB9IGZyb20gJy4uL2xpdC1odG1sLmpzJztcbmltcG9ydCB7IGluc2VydE5vZGVJbnRvVGVtcGxhdGUsIHJlbW92ZU5vZGVzRnJvbVRlbXBsYXRlIH0gZnJvbSAnLi9tb2RpZnktdGVtcGxhdGUuanMnO1xuZXhwb3J0IHsgaHRtbCwgc3ZnLCBUZW1wbGF0ZVJlc3VsdCB9IGZyb20gJy4uL2xpdC1odG1sLmpzJztcbi8vIEdldCBhIGtleSB0byBsb29rdXAgaW4gYHRlbXBsYXRlQ2FjaGVzYC5cbmNvbnN0IGdldFRlbXBsYXRlQ2FjaGVLZXkgPSAodHlwZSwgc2NvcGVOYW1lKSA9PiBgJHt0eXBlfS0tJHtzY29wZU5hbWV9YDtcbi8qKlxuICogVGVtcGxhdGUgZmFjdG9yeSB3aGljaCBzY29wZXMgdGVtcGxhdGUgRE9NIHVzaW5nIFNoYWR5Q1NTLlxuICogQHBhcmFtIHNjb3BlTmFtZSB7c3RyaW5nfVxuICovXG5jb25zdCBzaGFkeVRlbXBsYXRlRmFjdG9yeSA9IChzY29wZU5hbWUpID0+IChyZXN1bHQpID0+IHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGdldFRlbXBsYXRlQ2FjaGVLZXkocmVzdWx0LnR5cGUsIHNjb3BlTmFtZSk7XG4gICAgbGV0IHRlbXBsYXRlQ2FjaGUgPSB0ZW1wbGF0ZUNhY2hlcy5nZXQoY2FjaGVLZXkpO1xuICAgIGlmICh0ZW1wbGF0ZUNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGVtcGxhdGVDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGVtcGxhdGVDYWNoZXMuc2V0KGNhY2hlS2V5LCB0ZW1wbGF0ZUNhY2hlKTtcbiAgICB9XG4gICAgbGV0IHRlbXBsYXRlID0gdGVtcGxhdGVDYWNoZS5nZXQocmVzdWx0LnN0cmluZ3MpO1xuICAgIGlmICh0ZW1wbGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZXN1bHQuZ2V0VGVtcGxhdGVFbGVtZW50KCk7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93LlNoYWR5Q1NTID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgd2luZG93LlNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZURvbShlbGVtZW50LCBzY29wZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHJlc3VsdCwgZWxlbWVudCk7XG4gICAgICAgIHRlbXBsYXRlQ2FjaGUuc2V0KHJlc3VsdC5zdHJpbmdzLCB0ZW1wbGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiB0ZW1wbGF0ZTtcbn07XG5jb25zdCBURU1QTEFURV9UWVBFUyA9IFsnaHRtbCcsICdzdmcnXTtcbi8qKlxuICogUmVtb3ZlcyBhbGwgc3R5bGUgZWxlbWVudHMgZnJvbSBUZW1wbGF0ZXMgZm9yIHRoZSBnaXZlbiBzY29wZU5hbWUuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZVN0eWxlc0Zyb21MaXRUZW1wbGF0ZXMoc2NvcGVOYW1lKSB7XG4gICAgVEVNUExBVEVfVFlQRVMuZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZXMgPSB0ZW1wbGF0ZUNhY2hlcy5nZXQoZ2V0VGVtcGxhdGVDYWNoZUtleSh0eXBlLCBzY29wZU5hbWUpKTtcbiAgICAgICAgaWYgKHRlbXBsYXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZXMuZm9yRWFjaCgodGVtcGxhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGVsZW1lbnQ6IHsgY29udGVudCB9IH0gPSB0ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZXMgPSBjb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTm9kZXNGcm9tVGVtcGxhdGUodGVtcGxhdGUsIG5ldyBTZXQoQXJyYXkuZnJvbShzdHlsZXMpKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuY29uc3Qgc2hhZHlSZW5kZXJTZXQgPSBuZXcgU2V0KCk7XG4vKipcbiAqIEZvciB0aGUgZ2l2ZW4gc2NvcGUgbmFtZSwgZW5zdXJlcyB0aGF0IFNoYWR5Q1NTIHN0eWxlIHNjb3BpbmcgaXMgcGVyZm9ybWVkLlxuICogVGhpcyBpcyBkb25lIGp1c3Qgb25jZSBwZXIgc2NvcGUgbmFtZSBzbyB0aGUgZnJhZ21lbnQgYW5kIHRlbXBsYXRlIGNhbm5vdFxuICogYmUgbW9kaWZpZWQuXG4gKiAoMSkgZXh0cmFjdHMgc3R5bGVzIGZyb20gdGhlIHJlbmRlcmVkIGZyYWdtZW50IGFuZCBoYW5kcyB0aGVtIHRvIFNoYWR5Q1NTXG4gKiB0byBiZSBzY29wZWQgYW5kIGFwcGVuZGVkIHRvIHRoZSBkb2N1bWVudFxuICogKDIpIHJlbW92ZXMgc3R5bGUgZWxlbWVudHMgZnJvbSBhbGwgbGl0LWh0bWwgVGVtcGxhdGVzIGZvciB0aGlzIHNjb3BlIG5hbWUuXG4gKlxuICogTm90ZSwgPHN0eWxlPiBlbGVtZW50cyBjYW4gb25seSBiZSBwbGFjZWQgaW50byB0ZW1wbGF0ZXMgZm9yIHRoZVxuICogaW5pdGlhbCByZW5kZXJpbmcgb2YgdGhlIHNjb3BlLiBJZiA8c3R5bGU+IGVsZW1lbnRzIGFyZSBpbmNsdWRlZCBpbiB0ZW1wbGF0ZXNcbiAqIGR5bmFtaWNhbGx5IHJlbmRlcmVkIHRvIHRoZSBzY29wZSAoYWZ0ZXIgdGhlIGZpcnN0IHNjb3BlIHJlbmRlciksIHRoZXkgd2lsbFxuICogbm90IGJlIHNjb3BlZCBhbmQgdGhlIDxzdHlsZT4gd2lsbCBiZSBsZWZ0IGluIHRoZSB0ZW1wbGF0ZSBhbmQgcmVuZGVyZWQgb3V0cHV0LlxuICovXG5jb25zdCBlbnN1cmVTdHlsZXNTY29wZWQgPSAoZnJhZ21lbnQsIHRlbXBsYXRlLCBzY29wZU5hbWUpID0+IHtcbiAgICAvLyBvbmx5IHNjb3BlIGVsZW1lbnQgdGVtcGxhdGUgb25jZSBwZXIgc2NvcGUgbmFtZVxuICAgIGlmICghc2hhZHlSZW5kZXJTZXQuaGFzKHNjb3BlTmFtZSkpIHtcbiAgICAgICAgc2hhZHlSZW5kZXJTZXQuYWRkKHNjb3BlTmFtZSk7XG4gICAgICAgIGNvbnN0IHN0eWxlVGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgICAgICBBcnJheS5mcm9tKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N0eWxlJykpLmZvckVhY2goKHMpID0+IHtcbiAgICAgICAgICAgIHN0eWxlVGVtcGxhdGUuY29udGVudC5hcHBlbmRDaGlsZChzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHdpbmRvdy5TaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGVTdHlsZXMoc3R5bGVUZW1wbGF0ZSwgc2NvcGVOYW1lKTtcbiAgICAgICAgLy8gRml4IHRlbXBsYXRlczogbm90ZSB0aGUgZXhwZWN0YXRpb24gaGVyZSBpcyB0aGF0IHRoZSBnaXZlbiBgZnJhZ21lbnRgXG4gICAgICAgIC8vIGhhcyBiZWVuIGdlbmVyYXRlZCBmcm9tIHRoZSBnaXZlbiBgdGVtcGxhdGVgIHdoaWNoIGNvbnRhaW5zXG4gICAgICAgIC8vIHRoZSBzZXQgb2YgdGVtcGxhdGVzIHJlbmRlcmVkIGludG8gdGhpcyBzY29wZS5cbiAgICAgICAgLy8gSXQgaXMgb25seSBmcm9tIHRoaXMgc2V0IG9mIGluaXRpYWwgdGVtcGxhdGVzIGZyb20gd2hpY2ggc3R5bGVzXG4gICAgICAgIC8vIHdpbGwgYmUgc2NvcGVkIGFuZCByZW1vdmVkLlxuICAgICAgICByZW1vdmVTdHlsZXNGcm9tTGl0VGVtcGxhdGVzKHNjb3BlTmFtZSk7XG4gICAgICAgIC8vIEFwcGx5U2hpbSBjYXNlXG4gICAgICAgIGlmICh3aW5kb3cuU2hhZHlDU1MubmF0aXZlU2hhZG93KSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZSA9IHN0eWxlVGVtcGxhdGUuY29udGVudC5xdWVyeVNlbGVjdG9yKCdzdHlsZScpO1xuICAgICAgICAgICAgaWYgKHN0eWxlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gSW5zZXJ0IHN0eWxlIGludG8gcmVuZGVyZWQgZnJhZ21lbnRcbiAgICAgICAgICAgICAgICBmcmFnbWVudC5pbnNlcnRCZWZvcmUoc3R5bGUsIGZyYWdtZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgIC8vIEluc2VydCBpbnRvIGxpdC10ZW1wbGF0ZSAoZm9yIHN1YnNlcXVlbnQgcmVuZGVycylcbiAgICAgICAgICAgICAgICBpbnNlcnROb2RlSW50b1RlbXBsYXRlKHRlbXBsYXRlLCBzdHlsZS5jbG9uZU5vZGUodHJ1ZSksIHRlbXBsYXRlLmVsZW1lbnQuY29udGVudC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG4vLyBOT1RFOiBXZSdyZSBjb3B5aW5nIGNvZGUgZnJvbSBsaXQtaHRtbCdzIGByZW5kZXJgIG1ldGhvZCBoZXJlLlxuLy8gV2UncmUgZG9pbmcgdGhpcyBleHBsaWNpdGx5IGJlY2F1c2UgdGhlIEFQSSBmb3IgcmVuZGVyaW5nIHRlbXBsYXRlcyBpcyBsaWtlbHlcbi8vIHRvIGNoYW5nZSBpbiB0aGUgbmVhciB0ZXJtLlxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlcihyZXN1bHQsIGNvbnRhaW5lciwgc2NvcGVOYW1lKSB7XG4gICAgY29uc3QgdGVtcGxhdGVGYWN0b3J5ID0gc2hhZHlUZW1wbGF0ZUZhY3Rvcnkoc2NvcGVOYW1lKTtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHRlbXBsYXRlRmFjdG9yeShyZXN1bHQpO1xuICAgIGxldCBpbnN0YW5jZSA9IGNvbnRhaW5lci5fX3RlbXBsYXRlSW5zdGFuY2U7XG4gICAgLy8gUmVwZWF0IHJlbmRlciwganVzdCBjYWxsIHVwZGF0ZSgpXG4gICAgaWYgKGluc3RhbmNlICE9PSB1bmRlZmluZWQgJiYgaW5zdGFuY2UudGVtcGxhdGUgPT09IHRlbXBsYXRlICYmXG4gICAgICAgIGluc3RhbmNlLl9wYXJ0Q2FsbGJhY2sgPT09IHJlc3VsdC5wYXJ0Q2FsbGJhY2spIHtcbiAgICAgICAgaW5zdGFuY2UudXBkYXRlKHJlc3VsdC52YWx1ZXMpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZpcnN0IHJlbmRlciwgY3JlYXRlIGEgbmV3IFRlbXBsYXRlSW5zdGFuY2UgYW5kIGFwcGVuZCBpdFxuICAgIGluc3RhbmNlID1cbiAgICAgICAgbmV3IFRlbXBsYXRlSW5zdGFuY2UodGVtcGxhdGUsIHJlc3VsdC5wYXJ0Q2FsbGJhY2ssIHRlbXBsYXRlRmFjdG9yeSk7XG4gICAgY29udGFpbmVyLl9fdGVtcGxhdGVJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgIGNvbnN0IGZyYWdtZW50ID0gaW5zdGFuY2UuX2Nsb25lKCk7XG4gICAgaW5zdGFuY2UudXBkYXRlKHJlc3VsdC52YWx1ZXMpO1xuICAgIGNvbnN0IGhvc3QgPSBjb250YWluZXIgaW5zdGFuY2VvZiBTaGFkb3dSb290ID9cbiAgICAgICAgY29udGFpbmVyLmhvc3QgOlxuICAgICAgICB1bmRlZmluZWQ7XG4gICAgLy8gSWYgdGhlcmUncyBhIHNoYWRvdyBob3N0LCBkbyBTaGFkeUNTUyBzY29waW5nLi4uXG4gICAgaWYgKGhvc3QgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygd2luZG93LlNoYWR5Q1NTID09PSAnb2JqZWN0Jykge1xuICAgICAgICBlbnN1cmVTdHlsZXNTY29wZWQoZnJhZ21lbnQsIHRlbXBsYXRlLCBzY29wZU5hbWUpO1xuICAgICAgICB3aW5kb3cuU2hhZHlDU1Muc3R5bGVFbGVtZW50KGhvc3QpO1xuICAgIH1cbiAgICByZW1vdmVOb2Rlcyhjb250YWluZXIsIGNvbnRhaW5lci5maXJzdENoaWxkKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2hhZHktcmVuZGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXRcbiAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdFxuICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0XG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXRcbiAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0XG4gKiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzb1xuICogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdFxuICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4gKi9cbi8vIFRoZSBmaXJzdCBhcmd1bWVudCB0byBKUyB0ZW1wbGF0ZSB0YWdzIHJldGFpbiBpZGVudGl0eSBhY3Jvc3MgbXVsdGlwbGVcbi8vIGNhbGxzIHRvIGEgdGFnIGZvciB0aGUgc2FtZSBsaXRlcmFsLCBzbyB3ZSBjYW4gY2FjaGUgd29yayBkb25lIHBlciBsaXRlcmFsXG4vLyBpbiBhIE1hcC5cbmV4cG9ydCBjb25zdCB0ZW1wbGF0ZUNhY2hlcyA9IG5ldyBNYXAoKTtcbi8qKlxuICogSW50ZXJwcmV0cyBhIHRlbXBsYXRlIGxpdGVyYWwgYXMgYW4gSFRNTCB0ZW1wbGF0ZSB0aGF0IGNhbiBlZmZpY2llbnRseVxuICogcmVuZGVyIHRvIGFuZCB1cGRhdGUgYSBjb250YWluZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBodG1sID0gKHN0cmluZ3MsIC4uLnZhbHVlcykgPT4gbmV3IFRlbXBsYXRlUmVzdWx0KHN0cmluZ3MsIHZhbHVlcywgJ2h0bWwnKTtcbi8qKlxuICogSW50ZXJwcmV0cyBhIHRlbXBsYXRlIGxpdGVyYWwgYXMgYW4gU1ZHIHRlbXBsYXRlIHRoYXQgY2FuIGVmZmljaWVudGx5XG4gKiByZW5kZXIgdG8gYW5kIHVwZGF0ZSBhIGNvbnRhaW5lci5cbiAqL1xuZXhwb3J0IGNvbnN0IHN2ZyA9IChzdHJpbmdzLCAuLi52YWx1ZXMpID0+IG5ldyBTVkdUZW1wbGF0ZVJlc3VsdChzdHJpbmdzLCB2YWx1ZXMsICdzdmcnKTtcbi8qKlxuICogVGhlIHJldHVybiB0eXBlIG9mIGBodG1sYCwgd2hpY2ggaG9sZHMgYSBUZW1wbGF0ZSBhbmQgdGhlIHZhbHVlcyBmcm9tXG4gKiBpbnRlcnBvbGF0ZWQgZXhwcmVzc2lvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgY29uc3RydWN0b3Ioc3RyaW5ncywgdmFsdWVzLCB0eXBlLCBwYXJ0Q2FsbGJhY2sgPSBkZWZhdWx0UGFydENhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuc3RyaW5ncyA9IHN0cmluZ3M7XG4gICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnBhcnRDYWxsYmFjayA9IHBhcnRDYWxsYmFjaztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHN0cmluZyBvZiBIVE1MIHVzZWQgdG8gY3JlYXRlIGEgPHRlbXBsYXRlPiBlbGVtZW50LlxuICAgICAqL1xuICAgIGdldEhUTUwoKSB7XG4gICAgICAgIGNvbnN0IGwgPSB0aGlzLnN0cmluZ3MubGVuZ3RoIC0gMTtcbiAgICAgICAgbGV0IGh0bWwgPSAnJztcbiAgICAgICAgbGV0IGlzVGV4dEJpbmRpbmcgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcyA9IHRoaXMuc3RyaW5nc1tpXTtcbiAgICAgICAgICAgIGh0bWwgKz0gcztcbiAgICAgICAgICAgIC8vIFdlJ3JlIGluIGEgdGV4dCBwb3NpdGlvbiBpZiB0aGUgcHJldmlvdXMgc3RyaW5nIGNsb3NlZCBpdHMgdGFncy5cbiAgICAgICAgICAgIC8vIElmIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgdGFncywgdGhlbiB3ZSB1c2UgdGhlIHByZXZpb3VzIHRleHQgcG9zaXRpb25cbiAgICAgICAgICAgIC8vIHN0YXRlLlxuICAgICAgICAgICAgY29uc3QgY2xvc2luZyA9IGZpbmRUYWdDbG9zZShzKTtcbiAgICAgICAgICAgIGlzVGV4dEJpbmRpbmcgPSBjbG9zaW5nID4gLTEgPyBjbG9zaW5nIDwgcy5sZW5ndGggOiBpc1RleHRCaW5kaW5nO1xuICAgICAgICAgICAgaHRtbCArPSBpc1RleHRCaW5kaW5nID8gbm9kZU1hcmtlciA6IG1hcmtlcjtcbiAgICAgICAgfVxuICAgICAgICBodG1sICs9IHRoaXMuc3RyaW5nc1tsXTtcbiAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuICAgIGdldFRlbXBsYXRlRWxlbWVudCgpIHtcbiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSB0aGlzLmdldEhUTUwoKTtcbiAgICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgIH1cbn1cbi8qKlxuICogQSBUZW1wbGF0ZVJlc3VsdCBmb3IgU1ZHIGZyYWdtZW50cy5cbiAqXG4gKiBUaGlzIGNsYXNzIHdyYXBzIEhUTWwgaW4gYW4gPHN2Zz4gdGFnIGluIG9yZGVyIHRvIHBhcnNlIGl0cyBjb250ZW50cyBpbiB0aGVcbiAqIFNWRyBuYW1lc3BhY2UsIHRoZW4gbW9kaWZpZXMgdGhlIHRlbXBsYXRlIHRvIHJlbW92ZSB0aGUgPHN2Zz4gdGFnIHNvIHRoYXRcbiAqIGNsb25lcyBvbmx5IGNvbnRhaW5lciB0aGUgb3JpZ2luYWwgZnJhZ21lbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTVkdUZW1wbGF0ZVJlc3VsdCBleHRlbmRzIFRlbXBsYXRlUmVzdWx0IHtcbiAgICBnZXRIVE1MKCkge1xuICAgICAgICByZXR1cm4gYDxzdmc+JHtzdXBlci5nZXRIVE1MKCl9PC9zdmc+YDtcbiAgICB9XG4gICAgZ2V0VGVtcGxhdGVFbGVtZW50KCkge1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHN1cGVyLmdldFRlbXBsYXRlRWxlbWVudCgpO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gdGVtcGxhdGUuY29udGVudDtcbiAgICAgICAgY29uc3Qgc3ZnRWxlbWVudCA9IGNvbnRlbnQuZmlyc3RDaGlsZDtcbiAgICAgICAgY29udGVudC5yZW1vdmVDaGlsZChzdmdFbGVtZW50KTtcbiAgICAgICAgcmVwYXJlbnROb2Rlcyhjb250ZW50LCBzdmdFbGVtZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgfVxufVxuLyoqXG4gKiBUaGUgZGVmYXVsdCBUZW1wbGF0ZUZhY3Rvcnkgd2hpY2ggY2FjaGVzIFRlbXBsYXRlcyBrZXllZCBvblxuICogcmVzdWx0LnR5cGUgYW5kIHJlc3VsdC5zdHJpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdFRlbXBsYXRlRmFjdG9yeShyZXN1bHQpIHtcbiAgICBsZXQgdGVtcGxhdGVDYWNoZSA9IHRlbXBsYXRlQ2FjaGVzLmdldChyZXN1bHQudHlwZSk7XG4gICAgaWYgKHRlbXBsYXRlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0ZW1wbGF0ZUNhY2hlID0gbmV3IE1hcCgpO1xuICAgICAgICB0ZW1wbGF0ZUNhY2hlcy5zZXQocmVzdWx0LnR5cGUsIHRlbXBsYXRlQ2FjaGUpO1xuICAgIH1cbiAgICBsZXQgdGVtcGxhdGUgPSB0ZW1wbGF0ZUNhY2hlLmdldChyZXN1bHQuc3RyaW5ncyk7XG4gICAgaWYgKHRlbXBsYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUocmVzdWx0LCByZXN1bHQuZ2V0VGVtcGxhdGVFbGVtZW50KCkpO1xuICAgICAgICB0ZW1wbGF0ZUNhY2hlLnNldChyZXN1bHQuc3RyaW5ncywgdGVtcGxhdGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGVtcGxhdGU7XG59XG4vKipcbiAqIFJlbmRlcnMgYSB0ZW1wbGF0ZSB0byBhIGNvbnRhaW5lci5cbiAqXG4gKiBUbyB1cGRhdGUgYSBjb250YWluZXIgd2l0aCBuZXcgdmFsdWVzLCByZWV2YWx1YXRlIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsIGFuZFxuICogY2FsbCBgcmVuZGVyYCB3aXRoIHRoZSBuZXcgcmVzdWx0LlxuICpcbiAqIEBwYXJhbSByZXN1bHQgYSBUZW1wbGF0ZVJlc3VsdCBjcmVhdGVkIGJ5IGV2YWx1YXRpbmcgYSB0ZW1wbGF0ZSB0YWcgbGlrZVxuICogICAgIGBodG1sYCBvciBgc3ZnYC5cbiAqIEBwYXJhbSBjb250YWluZXIgQSBET00gcGFyZW50IHRvIHJlbmRlciB0by4gVGhlIGVudGlyZSBjb250ZW50cyBhcmUgZWl0aGVyXG4gKiAgICAgcmVwbGFjZWQsIG9yIGVmZmljaWVudGx5IHVwZGF0ZWQgaWYgdGhlIHNhbWUgcmVzdWx0IHR5cGUgd2FzIHByZXZpb3VzXG4gKiAgICAgcmVuZGVyZWQgdGhlcmUuXG4gKiBAcGFyYW0gdGVtcGxhdGVGYWN0b3J5IGEgZnVuY3Rpb24gdG8gY3JlYXRlIGEgVGVtcGxhdGUgb3IgcmV0cmVpdmUgb25lIGZyb21cbiAqICAgICBjYWNoZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlcihyZXN1bHQsIGNvbnRhaW5lciwgdGVtcGxhdGVGYWN0b3J5ID0gZGVmYXVsdFRlbXBsYXRlRmFjdG9yeSkge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gdGVtcGxhdGVGYWN0b3J5KHJlc3VsdCk7XG4gICAgbGV0IGluc3RhbmNlID0gY29udGFpbmVyLl9fdGVtcGxhdGVJbnN0YW5jZTtcbiAgICAvLyBSZXBlYXQgcmVuZGVyLCBqdXN0IGNhbGwgdXBkYXRlKClcbiAgICBpZiAoaW5zdGFuY2UgIT09IHVuZGVmaW5lZCAmJiBpbnN0YW5jZS50ZW1wbGF0ZSA9PT0gdGVtcGxhdGUgJiZcbiAgICAgICAgaW5zdGFuY2UuX3BhcnRDYWxsYmFjayA9PT0gcmVzdWx0LnBhcnRDYWxsYmFjaykge1xuICAgICAgICBpbnN0YW5jZS51cGRhdGUocmVzdWx0LnZhbHVlcyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRmlyc3QgcmVuZGVyLCBjcmVhdGUgYSBuZXcgVGVtcGxhdGVJbnN0YW5jZSBhbmQgYXBwZW5kIGl0XG4gICAgaW5zdGFuY2UgPVxuICAgICAgICBuZXcgVGVtcGxhdGVJbnN0YW5jZSh0ZW1wbGF0ZSwgcmVzdWx0LnBhcnRDYWxsYmFjaywgdGVtcGxhdGVGYWN0b3J5KTtcbiAgICBjb250YWluZXIuX190ZW1wbGF0ZUluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBpbnN0YW5jZS5fY2xvbmUoKTtcbiAgICBpbnN0YW5jZS51cGRhdGUocmVzdWx0LnZhbHVlcyk7XG4gICAgcmVtb3ZlTm9kZXMoY29udGFpbmVyLCBjb250YWluZXIuZmlyc3RDaGlsZCk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbn1cbi8qKlxuICogQW4gZXhwcmVzc2lvbiBtYXJrZXIgd2l0aCBlbWJlZGRlZCB1bmlxdWUga2V5IHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoXG4gKiBwb3NzaWJsZSB0ZXh0IGluIHRlbXBsYXRlcy5cbiAqL1xuY29uc3QgbWFya2VyID0gYHt7bGl0LSR7U3RyaW5nKE1hdGgucmFuZG9tKCkpLnNsaWNlKDIpfX19YDtcbi8qKlxuICogQW4gZXhwcmVzc2lvbiBtYXJrZXIgdXNlZCB0ZXh0LXBvc2l0aW9ucywgbm90IGF0dHJpYnV0ZSBwb3NpdGlvbnMsXG4gKiBpbiB0ZW1wbGF0ZS5cbiAqL1xuY29uc3Qgbm9kZU1hcmtlciA9IGA8IS0tJHttYXJrZXJ9LS0+YDtcbmNvbnN0IG1hcmtlclJlZ2V4ID0gbmV3IFJlZ0V4cChgJHttYXJrZXJ9fCR7bm9kZU1hcmtlcn1gKTtcbi8qKlxuICogVGhpcyByZWdleCBleHRyYWN0cyB0aGUgYXR0cmlidXRlIG5hbWUgcHJlY2VkaW5nIGFuIGF0dHJpYnV0ZS1wb3NpdGlvblxuICogZXhwcmVzc2lvbi4gSXQgZG9lcyB0aGlzIGJ5IG1hdGNoaW5nIHRoZSBzeW50YXggYWxsb3dlZCBmb3IgYXR0cmlidXRlc1xuICogYWdhaW5zdCB0aGUgc3RyaW5nIGxpdGVyYWwgZGlyZWN0bHkgcHJlY2VkaW5nIHRoZSBleHByZXNzaW9uLCBhc3N1bWluZyB0aGF0XG4gKiB0aGUgZXhwcmVzc2lvbiBpcyBpbiBhbiBhdHRyaWJ1dGUtdmFsdWUgcG9zaXRpb24uXG4gKlxuICogU2VlIGF0dHJpYnV0ZXMgaW4gdGhlIEhUTUwgc3BlYzpcbiAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zeW50YXguaHRtbCNhdHRyaWJ1dGVzLTBcbiAqXG4gKiBcIlxcMC1cXHgxRlxceDdGLVxceDlGXCIgYXJlIFVuaWNvZGUgY29udHJvbCBjaGFyYWN0ZXJzXG4gKlxuICogXCIgXFx4MDlcXHgwYVxceDBjXFx4MGRcIiBhcmUgSFRNTCBzcGFjZSBjaGFyYWN0ZXJzOlxuICogaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2luZnJhc3RydWN0dXJlLmh0bWwjc3BhY2UtY2hhcmFjdGVyXG4gKlxuICogU28gYW4gYXR0cmlidXRlIGlzOlxuICogICogVGhlIG5hbWU6IGFueSBjaGFyYWN0ZXIgZXhjZXB0IGEgY29udHJvbCBjaGFyYWN0ZXIsIHNwYWNlIGNoYXJhY3RlciwgKCcpLFxuICogICAgKFwiKSwgXCI+XCIsIFwiPVwiLCBvciBcIi9cIlxuICogICogRm9sbG93ZWQgYnkgemVybyBvciBtb3JlIHNwYWNlIGNoYXJhY3RlcnNcbiAqICAqIEZvbGxvd2VkIGJ5IFwiPVwiXG4gKiAgKiBGb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgc3BhY2UgY2hhcmFjdGVyc1xuICogICogRm9sbG93ZWQgYnk6XG4gKiAgICAqIEFueSBjaGFyYWN0ZXIgZXhjZXB0IHNwYWNlLCAoJyksIChcIiksIFwiPFwiLCBcIj5cIiwgXCI9XCIsIChgKSwgb3JcbiAqICAgICogKFwiKSB0aGVuIGFueSBub24tKFwiKSwgb3JcbiAqICAgICogKCcpIHRoZW4gYW55IG5vbi0oJylcbiAqL1xuY29uc3QgbGFzdEF0dHJpYnV0ZU5hbWVSZWdleCA9IC9bIFxceDA5XFx4MGFcXHgwY1xceDBkXShbXlxcMC1cXHgxRlxceDdGLVxceDlGIFxceDA5XFx4MGFcXHgwY1xceDBkXCInPj0vXSspWyBcXHgwOVxceDBhXFx4MGNcXHgwZF0qPVsgXFx4MDlcXHgwYVxceDBjXFx4MGRdKig/OlteIFxceDA5XFx4MGFcXHgwY1xceDBkXCInYDw+PV0qfFwiW15cIl0qfCdbXiddKikkLztcbi8qKlxuICogRmluZHMgdGhlIGNsb3NpbmcgaW5kZXggb2YgdGhlIGxhc3QgY2xvc2VkIEhUTUwgdGFnLlxuICogVGhpcyBoYXMgMyBwb3NzaWJsZSByZXR1cm4gdmFsdWVzOlxuICogICAtIGAtMWAsIG1lYW5pbmcgdGhlcmUgaXMgbm8gdGFnIGluIHN0ci5cbiAqICAgLSBgc3RyaW5nLmxlbmd0aGAsIG1lYW5pbmcgdGhlIGxhc3Qgb3BlbmVkIHRhZyBpcyB1bmNsb3NlZC5cbiAqICAgLSBTb21lIHBvc2l0aXZlIG51bWJlciA8IHN0ci5sZW5ndGgsIG1lYW5pbmcgdGhlIGluZGV4IG9mIHRoZSBjbG9zaW5nICc+Jy5cbiAqL1xuZnVuY3Rpb24gZmluZFRhZ0Nsb3NlKHN0cikge1xuICAgIGNvbnN0IGNsb3NlID0gc3RyLmxhc3RJbmRleE9mKCc+Jyk7XG4gICAgY29uc3Qgb3BlbiA9IHN0ci5pbmRleE9mKCc8JywgY2xvc2UgKyAxKTtcbiAgICByZXR1cm4gb3BlbiA+IC0xID8gc3RyLmxlbmd0aCA6IGNsb3NlO1xufVxuLyoqXG4gKiBBIHBsYWNlaG9sZGVyIGZvciBhIGR5bmFtaWMgZXhwcmVzc2lvbiBpbiBhbiBIVE1MIHRlbXBsYXRlLlxuICpcbiAqIFRoZXJlIGFyZSB0d28gYnVpbHQtaW4gcGFydCB0eXBlczogQXR0cmlidXRlUGFydCBhbmQgTm9kZVBhcnQuIE5vZGVQYXJ0c1xuICogYWx3YXlzIHJlcHJlc2VudCBhIHNpbmdsZSBkeW5hbWljIGV4cHJlc3Npb24sIHdoaWxlIEF0dHJpYnV0ZVBhcnRzIG1heVxuICogcmVwcmVzZW50IGFzIG1hbnkgZXhwcmVzc2lvbnMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgYXR0cmlidXRlLlxuICpcbiAqIEEgVGVtcGxhdGUncyBwYXJ0cyBhcmUgbXV0YWJsZSwgc28gcGFydHMgY2FuIGJlIHJlcGxhY2VkIG9yIG1vZGlmaWVkXG4gKiAocG9zc2libHkgdG8gaW1wbGVtZW50IGRpZmZlcmVudCB0ZW1wbGF0ZSBzZW1hbnRpY3MpLiBUaGUgY29udHJhY3QgaXMgdGhhdFxuICogcGFydHMgY2FuIG9ubHkgYmUgcmVwbGFjZWQsIG5vdCByZW1vdmVkLCBhZGRlZCBvciByZW9yZGVyZWQsIGFuZCBwYXJ0cyBtdXN0XG4gKiBhbHdheXMgY29uc3VtZSB0aGUgY29ycmVjdCBudW1iZXIgb2YgdmFsdWVzIGluIHRoZWlyIGB1cGRhdGUoKWAgbWV0aG9kLlxuICpcbiAqIFRPRE8oanVzdGluZmFnbmFuaSk6IFRoYXQgcmVxdWlyZW1lbnQgaXMgYSBsaXR0bGUgZnJhZ2lsZS4gQVxuICogVGVtcGxhdGVJbnN0YW5jZSBjb3VsZCBpbnN0ZWFkIGJlIG1vcmUgY2FyZWZ1bCBhYm91dCB3aGljaCB2YWx1ZXMgaXQgZ2l2ZXNcbiAqIHRvIFBhcnQudXBkYXRlKCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZVBhcnQge1xuICAgIGNvbnN0cnVjdG9yKHR5cGUsIGluZGV4LCBuYW1lLCByYXdOYW1lLCBzdHJpbmdzKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5yYXdOYW1lID0gcmF3TmFtZTtcbiAgICAgICAgdGhpcy5zdHJpbmdzID0gc3RyaW5ncztcbiAgICB9XG59XG5leHBvcnQgY29uc3QgaXNUZW1wbGF0ZVBhcnRBY3RpdmUgPSAocGFydCkgPT4gcGFydC5pbmRleCAhPT0gLTE7XG4vKipcbiAqIEFuIHVwZGF0ZWFibGUgVGVtcGxhdGUgdGhhdCB0cmFja3MgdGhlIGxvY2F0aW9uIG9mIGR5bmFtaWMgcGFydHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZSB7XG4gICAgY29uc3RydWN0b3IocmVzdWx0LCBlbGVtZW50KSB7XG4gICAgICAgIHRoaXMucGFydHMgPSBbXTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuZWxlbWVudC5jb250ZW50O1xuICAgICAgICAvLyBFZGdlIG5lZWRzIGFsbCA0IHBhcmFtZXRlcnMgcHJlc2VudDsgSUUxMSBuZWVkcyAzcmQgcGFyYW1ldGVyIHRvIGJlIG51bGxcbiAgICAgICAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihjb250ZW50LCAxMzMgLyogTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQgfCBOb2RlRmlsdGVyLlNIT1dfQ09NTUVOVCB8XG4gICAgICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfVEVYVCAqLywgbnVsbCwgZmFsc2UpO1xuICAgICAgICBsZXQgaW5kZXggPSAtMTtcbiAgICAgICAgbGV0IHBhcnRJbmRleCA9IDA7XG4gICAgICAgIGNvbnN0IG5vZGVzVG9SZW1vdmUgPSBbXTtcbiAgICAgICAgLy8gVGhlIGFjdHVhbCBwcmV2aW91cyBub2RlLCBhY2NvdW50aW5nIGZvciByZW1vdmFsczogaWYgYSBub2RlIGlzIHJlbW92ZWRcbiAgICAgICAgLy8gaXQgd2lsbCBuZXZlciBiZSB0aGUgcHJldmlvdXNOb2RlLlxuICAgICAgICBsZXQgcHJldmlvdXNOb2RlO1xuICAgICAgICAvLyBVc2VkIHRvIHNldCBwcmV2aW91c05vZGUgYXQgdGhlIHRvcCBvZiB0aGUgbG9vcC5cbiAgICAgICAgbGV0IGN1cnJlbnROb2RlO1xuICAgICAgICB3aGlsZSAod2Fsa2VyLm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICBwcmV2aW91c05vZGUgPSBjdXJyZW50Tm9kZTtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjdXJyZW50Tm9kZSA9IHdhbGtlci5jdXJyZW50Tm9kZTtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFub2RlLmhhc0F0dHJpYnV0ZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IG5vZGUuYXR0cmlidXRlcztcbiAgICAgICAgICAgICAgICAvLyBQZXIgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05hbWVkTm9kZU1hcCxcbiAgICAgICAgICAgICAgICAvLyBhdHRyaWJ1dGVzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSByZXR1cm5lZCBpbiBkb2N1bWVudCBvcmRlci4gSW5cbiAgICAgICAgICAgICAgICAvLyBwYXJ0aWN1bGFyLCBFZGdlL0lFIGNhbiByZXR1cm4gdGhlbSBvdXQgb2Ygb3JkZXIsIHNvIHdlIGNhbm5vdCBhc3N1bWVcbiAgICAgICAgICAgICAgICAvLyBhIGNvcnJlc3BvbmRhbmNlIGJldHdlZW4gcGFydCBpbmRleCBhbmQgYXR0cmlidXRlIGluZGV4LlxuICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzW2ldLnZhbHVlLmluZGV4T2YobWFya2VyKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdoaWxlIChjb3VudC0tID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHRlbXBsYXRlIGxpdGVyYWwgc2VjdGlvbiBsZWFkaW5nIHVwIHRvIHRoZSBmaXJzdFxuICAgICAgICAgICAgICAgICAgICAvLyBleHByZXNzaW9uIGluIHRoaXMgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZ0ZvclBhcnQgPSByZXN1bHQuc3RyaW5nc1twYXJ0SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBhdHRyaWJ1dGUgbmFtZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lSW5QYXJ0ID0gbGFzdEF0dHJpYnV0ZU5hbWVSZWdleC5leGVjKHN0cmluZ0ZvclBhcnQpWzFdO1xuICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGp1c3RpbmZhZ25hbmkpOiByZW1vdmUgbm9uLW51bGwgYXNzZXJ0aW9uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWVJblBhcnQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdzRm9yQXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGUudmFsdWUuc3BsaXQobWFya2VyUmVnZXgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnRzLnB1c2gobmV3IFRlbXBsYXRlUGFydCgnYXR0cmlidXRlJywgaW5kZXgsIGF0dHJpYnV0ZS5uYW1lLCBhdHRyaWJ1dGVOYW1lSW5QYXJ0LCBzdHJpbmdzRm9yQXR0cmlidXRlVmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBwYXJ0SW5kZXggKz0gc3RyaW5nc0ZvckF0dHJpYnV0ZVZhbHVlLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMyAvKiBOb2RlLlRFWFRfTk9ERSAqLykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVWYWx1ZSA9IG5vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWUuaW5kZXhPZihtYXJrZXIpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZ3MgPSBub2RlVmFsdWUuc3BsaXQobWFya2VyUmVnZXgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IHN0cmluZ3MubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgcGFydCBmb3IgZWFjaCBtYXRjaCBmb3VuZFxuICAgICAgICAgICAgICAgIHBhcnRJbmRleCArPSBsYXN0SW5kZXg7XG4gICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgYSBuZXcgdGV4dCBub2RlIGZvciBlYWNoIGxpdGVyYWwgc2VjdGlvblxuICAgICAgICAgICAgICAgIC8vIFRoZXNlIG5vZGVzIGFyZSBhbHNvIHVzZWQgYXMgdGhlIG1hcmtlcnMgZm9yIG5vZGUgcGFydHNcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxhc3RJbmRleDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoKHN0cmluZ3NbaV0gPT09ICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBkb2N1bWVudC5jcmVhdGVDb21tZW50KCcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzdHJpbmdzW2ldKSwgbm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFydHMucHVzaChuZXcgVGVtcGxhdGVQYXJ0KCdub2RlJywgaW5kZXgrKykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHN0cmluZ3NbbGFzdEluZGV4XSA9PT0gJycgP1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVDb21tZW50KCcnKSA6XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHN0cmluZ3NbbGFzdEluZGV4XSksIG5vZGUpO1xuICAgICAgICAgICAgICAgIG5vZGVzVG9SZW1vdmUucHVzaChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT09IDggLyogTm9kZS5DT01NRU5UX05PREUgKi8gJiZcbiAgICAgICAgICAgICAgICBub2RlLm5vZGVWYWx1ZSA9PT0gbWFya2VyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIC8vIEFkZCBhIG5ldyBtYXJrZXIgbm9kZSB0byBiZSB0aGUgc3RhcnROb2RlIG9mIHRoZSBQYXJ0IGlmIGFueSBvZiB0aGVcbiAgICAgICAgICAgICAgICAvLyBmb2xsb3dpbmcgYXJlIHRydWU6XG4gICAgICAgICAgICAgICAgLy8gICogV2UgZG9uJ3QgaGF2ZSBhIHByZXZpb3VzU2libGluZ1xuICAgICAgICAgICAgICAgIC8vICAqIHByZXZpb3VzU2libGluZyBpcyBiZWluZyByZW1vdmVkICh0aHVzIGl0J3Mgbm90IHRoZVxuICAgICAgICAgICAgICAgIC8vICAgIGBwcmV2aW91c05vZGVgKVxuICAgICAgICAgICAgICAgIC8vICAqIHByZXZpb3VzU2libGluZyBpcyBub3QgYSBUZXh0IG5vZGVcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIFRPRE8oanVzdGluZmFnbmFuaSk6IFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGUgcHJldmlvdXNOb2RlIGhlcmVcbiAgICAgICAgICAgICAgICAvLyBhcyB0aGUgbWFya2VyIG5vZGUgYW5kIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGV4dHJhIG5vZGVzIHdlIGFkZCB0byBhXG4gICAgICAgICAgICAgICAgLy8gdGVtcGxhdGUuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vUG9seW1lckxhYnMvbGl0LWh0bWwvaXNzdWVzLzE0N1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzU2libGluZyA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c1NpYmxpbmcgPT09IG51bGwgfHwgcHJldmlvdXNTaWJsaW5nICE9PSBwcmV2aW91c05vZGUgfHxcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNTaWJsaW5nLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJycpLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4LS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucGFydHMucHVzaChuZXcgVGVtcGxhdGVQYXJ0KCdub2RlJywgaW5kZXgrKykpO1xuICAgICAgICAgICAgICAgIG5vZGVzVG9SZW1vdmUucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgbmV4dFNpYmxpbmcgYWRkIGEgbWFya2VyIG5vZGUuXG4gICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSB0byBjaGVjayBpZiB0aGUgbmV4dCBub2RlIGlzIGdvaW5nIHRvIGJlIHJlbW92ZWQsXG4gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IG5vZGUgd2lsbCBpbmR1Y2UgYSBuZXcgbWFya2VyIGlmIHNvLlxuICAgICAgICAgICAgICAgIGlmIChub2RlLm5leHRTaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgnJyksIG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXgtLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBwcmV2aW91c05vZGU7XG4gICAgICAgICAgICAgICAgcGFydEluZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVtb3ZlIHRleHQgYmluZGluZyBub2RlcyBhZnRlciB0aGUgd2FsayB0byBub3QgZGlzdHVyYiB0aGUgVHJlZVdhbGtlclxuICAgICAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXNUb1JlbW92ZSkge1xuICAgICAgICAgICAgbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBSZXR1cm5zIGEgdmFsdWUgcmVhZHkgdG8gYmUgaW5zZXJ0ZWQgaW50byBhIFBhcnQgZnJvbSBhIHVzZXItcHJvdmlkZWQgdmFsdWUuXG4gKlxuICogSWYgdGhlIHVzZXIgdmFsdWUgaXMgYSBkaXJlY3RpdmUsIHRoaXMgaW52b2tlcyB0aGUgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuXG4gKiBwYXJ0LiBJZiB0aGUgdmFsdWUgaXMgbnVsbCwgaXQncyBjb252ZXJ0ZWQgdG8gdW5kZWZpbmVkIHRvIHdvcmsgYmV0dGVyXG4gKiB3aXRoIGNlcnRhaW4gRE9NIEFQSXMsIGxpa2UgdGV4dENvbnRlbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRWYWx1ZSA9IChwYXJ0LCB2YWx1ZSkgPT4ge1xuICAgIC8vIGBudWxsYCBhcyB0aGUgdmFsdWUgb2YgYSBUZXh0IG5vZGUgd2lsbCByZW5kZXIgdGhlIHN0cmluZyAnbnVsbCdcbiAgICAvLyBzbyB3ZSBjb252ZXJ0IGl0IHRvIHVuZGVmaW5lZFxuICAgIGlmIChpc0RpcmVjdGl2ZSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZShwYXJ0KTtcbiAgICAgICAgcmV0dXJuIG5vQ2hhbmdlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgPyB1bmRlZmluZWQgOiB2YWx1ZTtcbn07XG5leHBvcnQgY29uc3QgZGlyZWN0aXZlID0gKGYpID0+IHtcbiAgICBmLl9fbGl0RGlyZWN0aXZlID0gdHJ1ZTtcbiAgICByZXR1cm4gZjtcbn07XG5jb25zdCBpc0RpcmVjdGl2ZSA9IChvKSA9PiB0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJyAmJiBvLl9fbGl0RGlyZWN0aXZlID09PSB0cnVlO1xuLyoqXG4gKiBBIHNlbnRpbmVsIHZhbHVlIHRoYXQgc2lnbmFscyB0aGF0IGEgdmFsdWUgd2FzIGhhbmRsZWQgYnkgYSBkaXJlY3RpdmUgYW5kXG4gKiBzaG91bGQgbm90IGJlIHdyaXR0ZW4gdG8gdGhlIERPTS5cbiAqL1xuZXhwb3J0IGNvbnN0IG5vQ2hhbmdlID0ge307XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgbm9DaGFuZ2VgIGluc3RlYWQuXG4gKi9cbmV4cG9ydCB7IG5vQ2hhbmdlIGFzIGRpcmVjdGl2ZVZhbHVlIH07XG5jb25zdCBpc1ByaW1pdGl2ZVZhbHVlID0gKHZhbHVlKSA9PiB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgICEodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpO1xuZXhwb3J0IGNsYXNzIEF0dHJpYnV0ZVBhcnQge1xuICAgIGNvbnN0cnVjdG9yKGluc3RhbmNlLCBlbGVtZW50LCBuYW1lLCBzdHJpbmdzKSB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5zdHJpbmdzID0gc3RyaW5ncztcbiAgICAgICAgdGhpcy5zaXplID0gc3RyaW5ncy5sZW5ndGggLSAxO1xuICAgICAgICB0aGlzLl9wcmV2aW91c1ZhbHVlcyA9IFtdO1xuICAgIH1cbiAgICBfaW50ZXJwb2xhdGUodmFsdWVzLCBzdGFydEluZGV4KSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ3MgPSB0aGlzLnN0cmluZ3M7XG4gICAgICAgIGNvbnN0IGwgPSBzdHJpbmdzLmxlbmd0aCAtIDE7XG4gICAgICAgIGxldCB0ZXh0ID0gJyc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICB0ZXh0ICs9IHN0cmluZ3NbaV07XG4gICAgICAgICAgICBjb25zdCB2ID0gZ2V0VmFsdWUodGhpcywgdmFsdWVzW3N0YXJ0SW5kZXggKyBpXSk7XG4gICAgICAgICAgICBpZiAodiAmJiB2ICE9PSBub0NoYW5nZSAmJlxuICAgICAgICAgICAgICAgIChBcnJheS5pc0FycmF5KHYpIHx8IHR5cGVvZiB2ICE9PSAnc3RyaW5nJyAmJiB2W1N5bWJvbC5pdGVyYXRvcl0pKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIHYpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogd2UgbmVlZCB0byByZWN1cnNpdmVseSBjYWxsIGdldFZhbHVlIGludG8gaXRlcmFibGVzLi4uXG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0ZXh0ICs9IHY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQgKyBzdHJpbmdzW2xdO1xuICAgIH1cbiAgICBfZXF1YWxUb1ByZXZpb3VzVmFsdWVzKHZhbHVlcywgc3RhcnRJbmRleCkge1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8IHN0YXJ0SW5kZXggKyB0aGlzLnNpemU7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3ByZXZpb3VzVmFsdWVzW2ldICE9PSB2YWx1ZXNbaV0gfHxcbiAgICAgICAgICAgICAgICAhaXNQcmltaXRpdmVWYWx1ZSh2YWx1ZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzZXRWYWx1ZSh2YWx1ZXMsIHN0YXJ0SW5kZXgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2VxdWFsVG9QcmV2aW91c1ZhbHVlcyh2YWx1ZXMsIHN0YXJ0SW5kZXgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcyA9IHRoaXMuc3RyaW5ncztcbiAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICBpZiAocy5sZW5ndGggPT09IDIgJiYgc1swXSA9PT0gJycgJiYgc1sxXSA9PT0gJycpIHtcbiAgICAgICAgICAgIC8vIEFuIGV4cHJlc3Npb24gdGhhdCBvY2N1cGllcyB0aGUgd2hvbGUgYXR0cmlidXRlIHZhbHVlIHdpbGwgbGVhdmVcbiAgICAgICAgICAgIC8vIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGVtcHR5IHN0cmluZ3MuXG4gICAgICAgICAgICB2YWx1ZSA9IGdldFZhbHVlKHRoaXMsIHZhbHVlc1tzdGFydEluZGV4XSk7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmpvaW4oJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl9pbnRlcnBvbGF0ZSh2YWx1ZXMsIHN0YXJ0SW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gbm9DaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUodGhpcy5uYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcHJldmlvdXNWYWx1ZXMgPSB2YWx1ZXM7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIE5vZGVQYXJ0IHtcbiAgICBjb25zdHJ1Y3RvcihpbnN0YW5jZSwgc3RhcnROb2RlLCBlbmROb2RlKSB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgdGhpcy5zdGFydE5vZGUgPSBzdGFydE5vZGU7XG4gICAgICAgIHRoaXMuZW5kTm9kZSA9IGVuZE5vZGU7XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHNldFZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHZhbHVlID0gZ2V0VmFsdWUodGhpcywgdmFsdWUpO1xuICAgICAgICBpZiAodmFsdWUgPT09IG5vQ2hhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUHJpbWl0aXZlVmFsdWUodmFsdWUpKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgcHJpbWl0aXZlIHZhbHVlc1xuICAgICAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGRpZG4ndCBjaGFuZ2UsIGRvIG5vdGhpbmdcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5fcHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3NldFRleHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldFRlbXBsYXRlUmVzdWx0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZVtTeW1ib2wuaXRlcmF0b3JdKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRJdGVyYWJsZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOb2RlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXROb2RlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWx1ZS50aGVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldFByb21pc2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2ssIHdpbGwgcmVuZGVyIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAgICAgICAgICAgIHRoaXMuX3NldFRleHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9pbnNlcnQobm9kZSkge1xuICAgICAgICB0aGlzLmVuZE5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgdGhpcy5lbmROb2RlKTtcbiAgICB9XG4gICAgX3NldE5vZGUodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX3ByZXZpb3VzVmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICB0aGlzLl9pbnNlcnQodmFsdWUpO1xuICAgICAgICB0aGlzLl9wcmV2aW91c1ZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIF9zZXRUZXh0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZS5uZXh0U2libGluZztcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gJycgOiB2YWx1ZTtcbiAgICAgICAgaWYgKG5vZGUgPT09IHRoaXMuZW5kTm9kZS5wcmV2aW91c1NpYmxpbmcgJiZcbiAgICAgICAgICAgIG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBvbmx5IGhhdmUgYSBzaW5nbGUgdGV4dCBub2RlIGJldHdlZW4gdGhlIG1hcmtlcnMsIHdlIGNhbiBqdXN0XG4gICAgICAgICAgICAvLyBzZXQgaXRzIHZhbHVlLCByYXRoZXIgdGhhbiByZXBsYWNpbmcgaXQuXG4gICAgICAgICAgICAvLyBUT0RPKGp1c3RpbmZhZ25hbmkpOiBDYW4gd2UganVzdCBjaGVjayBpZiBfcHJldmlvdXNWYWx1ZSBpc1xuICAgICAgICAgICAgLy8gcHJpbWl0aXZlP1xuICAgICAgICAgICAgbm9kZS50ZXh0Q29udGVudCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc2V0Tm9kZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgX3NldFRlbXBsYXRlUmVzdWx0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy5pbnN0YW5jZS5fZ2V0VGVtcGxhdGUodmFsdWUpO1xuICAgICAgICBsZXQgaW5zdGFuY2U7XG4gICAgICAgIGlmICh0aGlzLl9wcmV2aW91c1ZhbHVlICYmIHRoaXMuX3ByZXZpb3VzVmFsdWUudGVtcGxhdGUgPT09IHRlbXBsYXRlKSB7XG4gICAgICAgICAgICBpbnN0YW5jZSA9IHRoaXMuX3ByZXZpb3VzVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBUZW1wbGF0ZUluc3RhbmNlKHRlbXBsYXRlLCB0aGlzLmluc3RhbmNlLl9wYXJ0Q2FsbGJhY2ssIHRoaXMuaW5zdGFuY2UuX2dldFRlbXBsYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX3NldE5vZGUoaW5zdGFuY2UuX2Nsb25lKCkpO1xuICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNWYWx1ZSA9IGluc3RhbmNlO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlLnVwZGF0ZSh2YWx1ZS52YWx1ZXMpO1xuICAgIH1cbiAgICBfc2V0SXRlcmFibGUodmFsdWUpIHtcbiAgICAgICAgLy8gRm9yIGFuIEl0ZXJhYmxlLCB3ZSBjcmVhdGUgYSBuZXcgSW5zdGFuY2VQYXJ0IHBlciBpdGVtLCB0aGVuIHNldCBpdHNcbiAgICAgICAgLy8gdmFsdWUgdG8gdGhlIGl0ZW0uIFRoaXMgaXMgYSBsaXR0bGUgYml0IG9mIG92ZXJoZWFkIGZvciBldmVyeSBpdGVtIGluXG4gICAgICAgIC8vIGFuIEl0ZXJhYmxlLCBidXQgaXQgbGV0cyB1cyByZWN1cnNlIGVhc2lseSBhbmQgZWZmaWNpZW50bHkgdXBkYXRlIEFycmF5c1xuICAgICAgICAvLyBvZiBUZW1wbGF0ZVJlc3VsdHMgdGhhdCB3aWxsIGJlIGNvbW1vbmx5IHJldHVybmVkIGZyb20gZXhwcmVzc2lvbnMgbGlrZTpcbiAgICAgICAgLy8gYXJyYXkubWFwKChpKSA9PiBodG1sYCR7aX1gKSwgYnkgcmV1c2luZyBleGlzdGluZyBUZW1wbGF0ZUluc3RhbmNlcy5cbiAgICAgICAgLy8gSWYgX3ByZXZpb3VzVmFsdWUgaXMgYW4gYXJyYXksIHRoZW4gdGhlIHByZXZpb3VzIHJlbmRlciB3YXMgb2YgYW5cbiAgICAgICAgLy8gaXRlcmFibGUgYW5kIF9wcmV2aW91c1ZhbHVlIHdpbGwgY29udGFpbiB0aGUgTm9kZVBhcnRzIGZyb20gdGhlIHByZXZpb3VzXG4gICAgICAgIC8vIHJlbmRlci4gSWYgX3ByZXZpb3VzVmFsdWUgaXMgbm90IGFuIGFycmF5LCBjbGVhciB0aGlzIHBhcnQgYW5kIG1ha2UgYSBuZXdcbiAgICAgICAgLy8gYXJyYXkgZm9yIE5vZGVQYXJ0cy5cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMuX3ByZXZpb3VzVmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICB0aGlzLl9wcmV2aW91c1ZhbHVlID0gW107XG4gICAgICAgIH1cbiAgICAgICAgLy8gTGV0cyB1cyBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IGl0ZW1zIHdlIHN0YW1wZWQgc28gd2UgY2FuIGNsZWFyIGxlZnRvdmVyXG4gICAgICAgIC8vIGl0ZW1zIGZyb20gYSBwcmV2aW91cyByZW5kZXJcbiAgICAgICAgY29uc3QgaXRlbVBhcnRzID0gdGhpcy5fcHJldmlvdXNWYWx1ZTtcbiAgICAgICAgbGV0IHBhcnRJbmRleCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgLy8gVHJ5IHRvIHJldXNlIGFuIGV4aXN0aW5nIHBhcnRcbiAgICAgICAgICAgIGxldCBpdGVtUGFydCA9IGl0ZW1QYXJ0c1twYXJ0SW5kZXhdO1xuICAgICAgICAgICAgLy8gSWYgbm8gZXhpc3RpbmcgcGFydCwgY3JlYXRlIGEgbmV3IG9uZVxuICAgICAgICAgICAgaWYgKGl0ZW1QYXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBjcmVhdGluZyB0aGUgZmlyc3QgaXRlbSBwYXJ0LCBpdCdzIHN0YXJ0Tm9kZSBzaG91bGQgYmUgdGhlXG4gICAgICAgICAgICAgICAgLy8gY29udGFpbmVyJ3Mgc3RhcnROb2RlXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW1TdGFydCA9IHRoaXMuc3RhcnROb2RlO1xuICAgICAgICAgICAgICAgIC8vIElmIHdlJ3JlIG5vdCBjcmVhdGluZyB0aGUgZmlyc3QgcGFydCwgY3JlYXRlIGEgbmV3IHNlcGFyYXRvciBtYXJrZXJcbiAgICAgICAgICAgICAgICAvLyBub2RlLCBhbmQgZml4IHVwIHRoZSBwcmV2aW91cyBwYXJ0J3MgZW5kTm9kZSB0byBwb2ludCB0byBpdFxuICAgICAgICAgICAgICAgIGlmIChwYXJ0SW5kZXggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUGFydCA9IGl0ZW1QYXJ0c1twYXJ0SW5kZXggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgaXRlbVN0YXJ0ID0gcHJldmlvdXNQYXJ0LmVuZE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2luc2VydChpdGVtU3RhcnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpdGVtUGFydCA9IG5ldyBOb2RlUGFydCh0aGlzLmluc3RhbmNlLCBpdGVtU3RhcnQsIHRoaXMuZW5kTm9kZSk7XG4gICAgICAgICAgICAgICAgaXRlbVBhcnRzLnB1c2goaXRlbVBhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbVBhcnQuc2V0VmFsdWUoaXRlbSk7XG4gICAgICAgICAgICBwYXJ0SW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydEluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICB0aGlzLl9wcmV2aW91c1ZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhcnRJbmRleCA8IGl0ZW1QYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RQYXJ0ID0gaXRlbVBhcnRzW3BhcnRJbmRleCAtIDFdO1xuICAgICAgICAgICAgLy8gVHJ1bmNhdGUgdGhlIHBhcnRzIGFycmF5IHNvIF9wcmV2aW91c1ZhbHVlIHJlZmxlY3RzIHRoZSBjdXJyZW50IHN0YXRlXG4gICAgICAgICAgICBpdGVtUGFydHMubGVuZ3RoID0gcGFydEluZGV4O1xuICAgICAgICAgICAgdGhpcy5jbGVhcihsYXN0UGFydC5lbmROb2RlLnByZXZpb3VzU2libGluZyk7XG4gICAgICAgICAgICBsYXN0UGFydC5lbmROb2RlID0gdGhpcy5lbmROb2RlO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9zZXRQcm9taXNlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdmFsdWUudGhlbigodikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3ByZXZpb3VzVmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSh2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyKHN0YXJ0Tm9kZSA9IHRoaXMuc3RhcnROb2RlKSB7XG4gICAgICAgIHJlbW92ZU5vZGVzKHRoaXMuc3RhcnROb2RlLnBhcmVudE5vZGUsIHN0YXJ0Tm9kZS5uZXh0U2libGluZywgdGhpcy5lbmROb2RlKTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgZGVmYXVsdFBhcnRDYWxsYmFjayA9IChpbnN0YW5jZSwgdGVtcGxhdGVQYXJ0LCBub2RlKSA9PiB7XG4gICAgaWYgKHRlbXBsYXRlUGFydC50eXBlID09PSAnYXR0cmlidXRlJykge1xuICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZVBhcnQoaW5zdGFuY2UsIG5vZGUsIHRlbXBsYXRlUGFydC5uYW1lLCB0ZW1wbGF0ZVBhcnQuc3RyaW5ncyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRlbXBsYXRlUGFydC50eXBlID09PSAnbm9kZScpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlUGFydChpbnN0YW5jZSwgbm9kZSwgbm9kZS5uZXh0U2libGluZyk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXJ0IHR5cGUgJHt0ZW1wbGF0ZVBhcnQudHlwZX1gKTtcbn07XG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIGEgYFRlbXBsYXRlYCB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgRE9NIGFuZCB1cGRhdGVkXG4gKiB3aXRoIG5ldyB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZUluc3RhbmNlIHtcbiAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZSwgcGFydENhbGxiYWNrLCBnZXRUZW1wbGF0ZSkge1xuICAgICAgICB0aGlzLl9wYXJ0cyA9IFtdO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgIHRoaXMuX3BhcnRDYWxsYmFjayA9IHBhcnRDYWxsYmFjaztcbiAgICAgICAgdGhpcy5fZ2V0VGVtcGxhdGUgPSBnZXRUZW1wbGF0ZTtcbiAgICB9XG4gICAgdXBkYXRlKHZhbHVlcykge1xuICAgICAgICBsZXQgdmFsdWVJbmRleCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiB0aGlzLl9wYXJ0cykge1xuICAgICAgICAgICAgaWYgKCFwYXJ0KSB7XG4gICAgICAgICAgICAgICAgdmFsdWVJbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGFydC5zaXplID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwYXJ0LnNldFZhbHVlKHZhbHVlc1t2YWx1ZUluZGV4XSk7XG4gICAgICAgICAgICAgICAgdmFsdWVJbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFydC5zZXRWYWx1ZSh2YWx1ZXMsIHZhbHVlSW5kZXgpO1xuICAgICAgICAgICAgICAgIHZhbHVlSW5kZXggKz0gcGFydC5zaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIF9jbG9uZSgpIHtcbiAgICAgICAgLy8gQ2xvbmUgdGhlIG5vZGUsIHJhdGhlciB0aGFuIGltcG9ydGluZyBpdCwgdG8ga2VlcCB0aGUgZnJhZ21lbnQgaW4gdGhlXG4gICAgICAgIC8vIHRlbXBsYXRlJ3MgZG9jdW1lbnQuIFRoaXMgbGVhdmVzIHRoZSBmcmFnbWVudCBpbmVydCBzbyBjdXN0b20gZWxlbWVudHNcbiAgICAgICAgLy8gd29uJ3QgdXBncmFkZSB1bnRpbCBhZnRlciB0aGUgbWFpbiBkb2N1bWVudCBhZG9wdHMgdGhlIG5vZGUuXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gdGhpcy50ZW1wbGF0ZS5lbGVtZW50LmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHRoaXMudGVtcGxhdGUucGFydHM7XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBFZGdlIG5lZWRzIGFsbCA0IHBhcmFtZXRlcnMgcHJlc2VudDsgSUUxMSBuZWVkcyAzcmQgcGFyYW1ldGVyIHRvIGJlXG4gICAgICAgICAgICAvLyBudWxsXG4gICAgICAgICAgICBjb25zdCB3YWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGZyYWdtZW50LCAxMzMgLyogTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQgfCBOb2RlRmlsdGVyLlNIT1dfQ09NTUVOVCB8XG4gICAgICAgICAgICAgICAgICAgTm9kZUZpbHRlci5TSE9XX1RFWFQgKi8sIG51bGwsIGZhbHNlKTtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IC0xO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0QWN0aXZlID0gaXNUZW1wbGF0ZVBhcnRBY3RpdmUocGFydCk7XG4gICAgICAgICAgICAgICAgLy8gQW4gaW5hY3RpdmUgcGFydCBoYXMgbm8gY29yZXNwb25kaW5nIFRlbXBsYXRlIG5vZGUuXG4gICAgICAgICAgICAgICAgaWYgKHBhcnRBY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgcGFydC5pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtlci5uZXh0Tm9kZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3BhcnRzLnB1c2gocGFydEFjdGl2ZSA/IHRoaXMuX3BhcnRDYWxsYmFjayh0aGlzLCBwYXJ0LCB3YWxrZXIuY3VycmVudE5vZGUpIDogdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnJhZ21lbnQ7XG4gICAgfVxufVxuLyoqXG4gKiBSZXBhcmVudHMgbm9kZXMsIHN0YXJ0aW5nIGZyb20gYHN0YXJ0Tm9kZWAgKGluY2x1c2l2ZSkgdG8gYGVuZE5vZGVgXG4gKiAoZXhjbHVzaXZlKSwgaW50byBhbm90aGVyIGNvbnRhaW5lciAoY291bGQgYmUgdGhlIHNhbWUgY29udGFpbmVyKSwgYmVmb3JlXG4gKiBgYmVmb3JlTm9kZWAuIElmIGBiZWZvcmVOb2RlYCBpcyBudWxsLCBpdCBhcHBlbmRzIHRoZSBub2RlcyB0byB0aGVcbiAqIGNvbnRhaW5lci5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlcGFyZW50Tm9kZXMgPSAoY29udGFpbmVyLCBzdGFydCwgZW5kID0gbnVsbCwgYmVmb3JlID0gbnVsbCkgPT4ge1xuICAgIGxldCBub2RlID0gc3RhcnQ7XG4gICAgd2hpbGUgKG5vZGUgIT09IGVuZCkge1xuICAgICAgICBjb25zdCBuID0gbm9kZS5uZXh0U2libGluZztcbiAgICAgICAgY29udGFpbmVyLmluc2VydEJlZm9yZShub2RlLCBiZWZvcmUpO1xuICAgICAgICBub2RlID0gbjtcbiAgICB9XG59O1xuLyoqXG4gKiBSZW1vdmVzIG5vZGVzLCBzdGFydGluZyBmcm9tIGBzdGFydE5vZGVgIChpbmNsdXNpdmUpIHRvIGBlbmROb2RlYFxuICogKGV4Y2x1c2l2ZSksIGZyb20gYGNvbnRhaW5lcmAuXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVOb2RlcyA9IChjb250YWluZXIsIHN0YXJ0Tm9kZSwgZW5kTm9kZSA9IG51bGwpID0+IHtcbiAgICBsZXQgbm9kZSA9IHN0YXJ0Tm9kZTtcbiAgICB3aGlsZSAobm9kZSAhPT0gZW5kTm9kZSkge1xuICAgICAgICBjb25zdCBuID0gbm9kZS5uZXh0U2libGluZztcbiAgICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgICBub2RlID0gbjtcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGl0LWh0bWwuanMubWFwIiwiJ3VzZSBzdHJpY3QnXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG52YXIgSGFzaEJhc2UgPSByZXF1aXJlKCdoYXNoLWJhc2UnKVxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyXG5cbnZhciBBUlJBWTE2ID0gbmV3IEFycmF5KDE2KVxuXG5mdW5jdGlvbiBNRDUgKCkge1xuICBIYXNoQmFzZS5jYWxsKHRoaXMsIDY0KVxuXG4gIC8vIHN0YXRlXG4gIHRoaXMuX2EgPSAweDY3NDUyMzAxXG4gIHRoaXMuX2IgPSAweGVmY2RhYjg5XG4gIHRoaXMuX2MgPSAweDk4YmFkY2ZlXG4gIHRoaXMuX2QgPSAweDEwMzI1NDc2XG59XG5cbmluaGVyaXRzKE1ENSwgSGFzaEJhc2UpXG5cbk1ENS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIE0gPSBBUlJBWTE2XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkgTVtpXSA9IHRoaXMuX2Jsb2NrLnJlYWRJbnQzMkxFKGkgKiA0KVxuXG4gIHZhciBhID0gdGhpcy5fYVxuICB2YXIgYiA9IHRoaXMuX2JcbiAgdmFyIGMgPSB0aGlzLl9jXG4gIHZhciBkID0gdGhpcy5fZFxuXG4gIGEgPSBmbkYoYSwgYiwgYywgZCwgTVswXSwgMHhkNzZhYTQ3OCwgNylcbiAgZCA9IGZuRihkLCBhLCBiLCBjLCBNWzFdLCAweGU4YzdiNzU2LCAxMilcbiAgYyA9IGZuRihjLCBkLCBhLCBiLCBNWzJdLCAweDI0MjA3MGRiLCAxNylcbiAgYiA9IGZuRihiLCBjLCBkLCBhLCBNWzNdLCAweGMxYmRjZWVlLCAyMilcbiAgYSA9IGZuRihhLCBiLCBjLCBkLCBNWzRdLCAweGY1N2MwZmFmLCA3KVxuICBkID0gZm5GKGQsIGEsIGIsIGMsIE1bNV0sIDB4NDc4N2M2MmEsIDEyKVxuICBjID0gZm5GKGMsIGQsIGEsIGIsIE1bNl0sIDB4YTgzMDQ2MTMsIDE3KVxuICBiID0gZm5GKGIsIGMsIGQsIGEsIE1bN10sIDB4ZmQ0Njk1MDEsIDIyKVxuICBhID0gZm5GKGEsIGIsIGMsIGQsIE1bOF0sIDB4Njk4MDk4ZDgsIDcpXG4gIGQgPSBmbkYoZCwgYSwgYiwgYywgTVs5XSwgMHg4YjQ0ZjdhZiwgMTIpXG4gIGMgPSBmbkYoYywgZCwgYSwgYiwgTVsxMF0sIDB4ZmZmZjViYjEsIDE3KVxuICBiID0gZm5GKGIsIGMsIGQsIGEsIE1bMTFdLCAweDg5NWNkN2JlLCAyMilcbiAgYSA9IGZuRihhLCBiLCBjLCBkLCBNWzEyXSwgMHg2YjkwMTEyMiwgNylcbiAgZCA9IGZuRihkLCBhLCBiLCBjLCBNWzEzXSwgMHhmZDk4NzE5MywgMTIpXG4gIGMgPSBmbkYoYywgZCwgYSwgYiwgTVsxNF0sIDB4YTY3OTQzOGUsIDE3KVxuICBiID0gZm5GKGIsIGMsIGQsIGEsIE1bMTVdLCAweDQ5YjQwODIxLCAyMilcblxuICBhID0gZm5HKGEsIGIsIGMsIGQsIE1bMV0sIDB4ZjYxZTI1NjIsIDUpXG4gIGQgPSBmbkcoZCwgYSwgYiwgYywgTVs2XSwgMHhjMDQwYjM0MCwgOSlcbiAgYyA9IGZuRyhjLCBkLCBhLCBiLCBNWzExXSwgMHgyNjVlNWE1MSwgMTQpXG4gIGIgPSBmbkcoYiwgYywgZCwgYSwgTVswXSwgMHhlOWI2YzdhYSwgMjApXG4gIGEgPSBmbkcoYSwgYiwgYywgZCwgTVs1XSwgMHhkNjJmMTA1ZCwgNSlcbiAgZCA9IGZuRyhkLCBhLCBiLCBjLCBNWzEwXSwgMHgwMjQ0MTQ1MywgOSlcbiAgYyA9IGZuRyhjLCBkLCBhLCBiLCBNWzE1XSwgMHhkOGExZTY4MSwgMTQpXG4gIGIgPSBmbkcoYiwgYywgZCwgYSwgTVs0XSwgMHhlN2QzZmJjOCwgMjApXG4gIGEgPSBmbkcoYSwgYiwgYywgZCwgTVs5XSwgMHgyMWUxY2RlNiwgNSlcbiAgZCA9IGZuRyhkLCBhLCBiLCBjLCBNWzE0XSwgMHhjMzM3MDdkNiwgOSlcbiAgYyA9IGZuRyhjLCBkLCBhLCBiLCBNWzNdLCAweGY0ZDUwZDg3LCAxNClcbiAgYiA9IGZuRyhiLCBjLCBkLCBhLCBNWzhdLCAweDQ1NWExNGVkLCAyMClcbiAgYSA9IGZuRyhhLCBiLCBjLCBkLCBNWzEzXSwgMHhhOWUzZTkwNSwgNSlcbiAgZCA9IGZuRyhkLCBhLCBiLCBjLCBNWzJdLCAweGZjZWZhM2Y4LCA5KVxuICBjID0gZm5HKGMsIGQsIGEsIGIsIE1bN10sIDB4Njc2ZjAyZDksIDE0KVxuICBiID0gZm5HKGIsIGMsIGQsIGEsIE1bMTJdLCAweDhkMmE0YzhhLCAyMClcblxuICBhID0gZm5IKGEsIGIsIGMsIGQsIE1bNV0sIDB4ZmZmYTM5NDIsIDQpXG4gIGQgPSBmbkgoZCwgYSwgYiwgYywgTVs4XSwgMHg4NzcxZjY4MSwgMTEpXG4gIGMgPSBmbkgoYywgZCwgYSwgYiwgTVsxMV0sIDB4NmQ5ZDYxMjIsIDE2KVxuICBiID0gZm5IKGIsIGMsIGQsIGEsIE1bMTRdLCAweGZkZTUzODBjLCAyMylcbiAgYSA9IGZuSChhLCBiLCBjLCBkLCBNWzFdLCAweGE0YmVlYTQ0LCA0KVxuICBkID0gZm5IKGQsIGEsIGIsIGMsIE1bNF0sIDB4NGJkZWNmYTksIDExKVxuICBjID0gZm5IKGMsIGQsIGEsIGIsIE1bN10sIDB4ZjZiYjRiNjAsIDE2KVxuICBiID0gZm5IKGIsIGMsIGQsIGEsIE1bMTBdLCAweGJlYmZiYzcwLCAyMylcbiAgYSA9IGZuSChhLCBiLCBjLCBkLCBNWzEzXSwgMHgyODliN2VjNiwgNClcbiAgZCA9IGZuSChkLCBhLCBiLCBjLCBNWzBdLCAweGVhYTEyN2ZhLCAxMSlcbiAgYyA9IGZuSChjLCBkLCBhLCBiLCBNWzNdLCAweGQ0ZWYzMDg1LCAxNilcbiAgYiA9IGZuSChiLCBjLCBkLCBhLCBNWzZdLCAweDA0ODgxZDA1LCAyMylcbiAgYSA9IGZuSChhLCBiLCBjLCBkLCBNWzldLCAweGQ5ZDRkMDM5LCA0KVxuICBkID0gZm5IKGQsIGEsIGIsIGMsIE1bMTJdLCAweGU2ZGI5OWU1LCAxMSlcbiAgYyA9IGZuSChjLCBkLCBhLCBiLCBNWzE1XSwgMHgxZmEyN2NmOCwgMTYpXG4gIGIgPSBmbkgoYiwgYywgZCwgYSwgTVsyXSwgMHhjNGFjNTY2NSwgMjMpXG5cbiAgYSA9IGZuSShhLCBiLCBjLCBkLCBNWzBdLCAweGY0MjkyMjQ0LCA2KVxuICBkID0gZm5JKGQsIGEsIGIsIGMsIE1bN10sIDB4NDMyYWZmOTcsIDEwKVxuICBjID0gZm5JKGMsIGQsIGEsIGIsIE1bMTRdLCAweGFiOTQyM2E3LCAxNSlcbiAgYiA9IGZuSShiLCBjLCBkLCBhLCBNWzVdLCAweGZjOTNhMDM5LCAyMSlcbiAgYSA9IGZuSShhLCBiLCBjLCBkLCBNWzEyXSwgMHg2NTViNTljMywgNilcbiAgZCA9IGZuSShkLCBhLCBiLCBjLCBNWzNdLCAweDhmMGNjYzkyLCAxMClcbiAgYyA9IGZuSShjLCBkLCBhLCBiLCBNWzEwXSwgMHhmZmVmZjQ3ZCwgMTUpXG4gIGIgPSBmbkkoYiwgYywgZCwgYSwgTVsxXSwgMHg4NTg0NWRkMSwgMjEpXG4gIGEgPSBmbkkoYSwgYiwgYywgZCwgTVs4XSwgMHg2ZmE4N2U0ZiwgNilcbiAgZCA9IGZuSShkLCBhLCBiLCBjLCBNWzE1XSwgMHhmZTJjZTZlMCwgMTApXG4gIGMgPSBmbkkoYywgZCwgYSwgYiwgTVs2XSwgMHhhMzAxNDMxNCwgMTUpXG4gIGIgPSBmbkkoYiwgYywgZCwgYSwgTVsxM10sIDB4NGUwODExYTEsIDIxKVxuICBhID0gZm5JKGEsIGIsIGMsIGQsIE1bNF0sIDB4Zjc1MzdlODIsIDYpXG4gIGQgPSBmbkkoZCwgYSwgYiwgYywgTVsxMV0sIDB4YmQzYWYyMzUsIDEwKVxuICBjID0gZm5JKGMsIGQsIGEsIGIsIE1bMl0sIDB4MmFkN2QyYmIsIDE1KVxuICBiID0gZm5JKGIsIGMsIGQsIGEsIE1bOV0sIDB4ZWI4NmQzOTEsIDIxKVxuXG4gIHRoaXMuX2EgPSAodGhpcy5fYSArIGEpIHwgMFxuICB0aGlzLl9iID0gKHRoaXMuX2IgKyBiKSB8IDBcbiAgdGhpcy5fYyA9ICh0aGlzLl9jICsgYykgfCAwXG4gIHRoaXMuX2QgPSAodGhpcy5fZCArIGQpIHwgMFxufVxuXG5NRDUucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIGNyZWF0ZSBwYWRkaW5nIGFuZCBoYW5kbGUgYmxvY2tzXG4gIHRoaXMuX2Jsb2NrW3RoaXMuX2Jsb2NrT2Zmc2V0KytdID0gMHg4MFxuICBpZiAodGhpcy5fYmxvY2tPZmZzZXQgPiA1Nikge1xuICAgIHRoaXMuX2Jsb2NrLmZpbGwoMCwgdGhpcy5fYmxvY2tPZmZzZXQsIDY0KVxuICAgIHRoaXMuX3VwZGF0ZSgpXG4gICAgdGhpcy5fYmxvY2tPZmZzZXQgPSAwXG4gIH1cblxuICB0aGlzLl9ibG9jay5maWxsKDAsIHRoaXMuX2Jsb2NrT2Zmc2V0LCA1NilcbiAgdGhpcy5fYmxvY2sud3JpdGVVSW50MzJMRSh0aGlzLl9sZW5ndGhbMF0sIDU2KVxuICB0aGlzLl9ibG9jay53cml0ZVVJbnQzMkxFKHRoaXMuX2xlbmd0aFsxXSwgNjApXG4gIHRoaXMuX3VwZGF0ZSgpXG5cbiAgLy8gcHJvZHVjZSByZXN1bHRcbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgxNilcbiAgYnVmZmVyLndyaXRlSW50MzJMRSh0aGlzLl9hLCAwKVxuICBidWZmZXIud3JpdGVJbnQzMkxFKHRoaXMuX2IsIDQpXG4gIGJ1ZmZlci53cml0ZUludDMyTEUodGhpcy5fYywgOClcbiAgYnVmZmVyLndyaXRlSW50MzJMRSh0aGlzLl9kLCAxMilcbiAgcmV0dXJuIGJ1ZmZlclxufVxuXG5mdW5jdGlvbiByb3RsICh4LCBuKSB7XG4gIHJldHVybiAoeCA8PCBuKSB8ICh4ID4+PiAoMzIgLSBuKSlcbn1cblxuZnVuY3Rpb24gZm5GIChhLCBiLCBjLCBkLCBtLCBrLCBzKSB7XG4gIHJldHVybiAocm90bCgoYSArICgoYiAmIGMpIHwgKCh+YikgJiBkKSkgKyBtICsgaykgfCAwLCBzKSArIGIpIHwgMFxufVxuXG5mdW5jdGlvbiBmbkcgKGEsIGIsIGMsIGQsIG0sIGssIHMpIHtcbiAgcmV0dXJuIChyb3RsKChhICsgKChiICYgZCkgfCAoYyAmICh+ZCkpKSArIG0gKyBrKSB8IDAsIHMpICsgYikgfCAwXG59XG5cbmZ1bmN0aW9uIGZuSCAoYSwgYiwgYywgZCwgbSwgaywgcykge1xuICByZXR1cm4gKHJvdGwoKGEgKyAoYiBeIGMgXiBkKSArIG0gKyBrKSB8IDAsIHMpICsgYikgfCAwXG59XG5cbmZ1bmN0aW9uIGZuSSAoYSwgYiwgYywgZCwgbSwgaywgcykge1xuICByZXR1cm4gKHJvdGwoKGEgKyAoKGMgXiAoYiB8ICh+ZCkpKSkgKyBtICsgaykgfCAwLCBzKSArIGIpIHwgMFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE1ENVxuIiwidmFyIGJuID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciBicm9yYW5kID0gcmVxdWlyZSgnYnJvcmFuZCcpO1xuXG5mdW5jdGlvbiBNaWxsZXJSYWJpbihyYW5kKSB7XG4gIHRoaXMucmFuZCA9IHJhbmQgfHwgbmV3IGJyb3JhbmQuUmFuZCgpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBNaWxsZXJSYWJpbjtcblxuTWlsbGVyUmFiaW4uY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKHJhbmQpIHtcbiAgcmV0dXJuIG5ldyBNaWxsZXJSYWJpbihyYW5kKTtcbn07XG5cbk1pbGxlclJhYmluLnByb3RvdHlwZS5fcmFuZGJlbG93ID0gZnVuY3Rpb24gX3JhbmRiZWxvdyhuKSB7XG4gIHZhciBsZW4gPSBuLmJpdExlbmd0aCgpO1xuICB2YXIgbWluX2J5dGVzID0gTWF0aC5jZWlsKGxlbiAvIDgpO1xuXG4gIC8vIEdlbmVyYWdlIHJhbmRvbSBieXRlcyB1bnRpbCBhIG51bWJlciBsZXNzIHRoYW4gbiBpcyBmb3VuZC5cbiAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgMC4ubi0xIGhhdmUgYW4gZXF1YWwgcHJvYmFiaWxpdHkgb2YgYmVpbmcgc2VsZWN0ZWQuXG4gIGRvXG4gICAgdmFyIGEgPSBuZXcgYm4odGhpcy5yYW5kLmdlbmVyYXRlKG1pbl9ieXRlcykpO1xuICB3aGlsZSAoYS5jbXAobikgPj0gMCk7XG5cbiAgcmV0dXJuIGE7XG59O1xuXG5NaWxsZXJSYWJpbi5wcm90b3R5cGUuX3JhbmRyYW5nZSA9IGZ1bmN0aW9uIF9yYW5kcmFuZ2Uoc3RhcnQsIHN0b3ApIHtcbiAgLy8gR2VuZXJhdGUgYSByYW5kb20gbnVtYmVyIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBzdGFydCBhbmQgbGVzcyB0aGFuIHN0b3AuXG4gIHZhciBzaXplID0gc3RvcC5zdWIoc3RhcnQpO1xuICByZXR1cm4gc3RhcnQuYWRkKHRoaXMuX3JhbmRiZWxvdyhzaXplKSk7XG59O1xuXG5NaWxsZXJSYWJpbi5wcm90b3R5cGUudGVzdCA9IGZ1bmN0aW9uIHRlc3QobiwgaywgY2IpIHtcbiAgdmFyIGxlbiA9IG4uYml0TGVuZ3RoKCk7XG4gIHZhciByZWQgPSBibi5tb250KG4pO1xuICB2YXIgcm9uZSA9IG5ldyBibigxKS50b1JlZChyZWQpO1xuXG4gIGlmICghaylcbiAgICBrID0gTWF0aC5tYXgoMSwgKGxlbiAvIDQ4KSB8IDApO1xuXG4gIC8vIEZpbmQgZCBhbmQgcywgKG4gLSAxKSA9ICgyIF4gcykgKiBkO1xuICB2YXIgbjEgPSBuLnN1Ym4oMSk7XG4gIGZvciAodmFyIHMgPSAwOyAhbjEudGVzdG4ocyk7IHMrKykge31cbiAgdmFyIGQgPSBuLnNocm4ocyk7XG5cbiAgdmFyIHJuMSA9IG4xLnRvUmVkKHJlZCk7XG5cbiAgdmFyIHByaW1lID0gdHJ1ZTtcbiAgZm9yICg7IGsgPiAwOyBrLS0pIHtcbiAgICB2YXIgYSA9IHRoaXMuX3JhbmRyYW5nZShuZXcgYm4oMiksIG4xKTtcbiAgICBpZiAoY2IpXG4gICAgICBjYihhKTtcblxuICAgIHZhciB4ID0gYS50b1JlZChyZWQpLnJlZFBvdyhkKTtcbiAgICBpZiAoeC5jbXAocm9uZSkgPT09IDAgfHwgeC5jbXAocm4xKSA9PT0gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBzOyBpKyspIHtcbiAgICAgIHggPSB4LnJlZFNxcigpO1xuXG4gICAgICBpZiAoeC5jbXAocm9uZSkgPT09IDApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICh4LmNtcChybjEpID09PSAwKVxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoaSA9PT0gcylcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBwcmltZTtcbn07XG5cbk1pbGxlclJhYmluLnByb3RvdHlwZS5nZXREaXZpc29yID0gZnVuY3Rpb24gZ2V0RGl2aXNvcihuLCBrKSB7XG4gIHZhciBsZW4gPSBuLmJpdExlbmd0aCgpO1xuICB2YXIgcmVkID0gYm4ubW9udChuKTtcbiAgdmFyIHJvbmUgPSBuZXcgYm4oMSkudG9SZWQocmVkKTtcblxuICBpZiAoIWspXG4gICAgayA9IE1hdGgubWF4KDEsIChsZW4gLyA0OCkgfCAwKTtcblxuICAvLyBGaW5kIGQgYW5kIHMsIChuIC0gMSkgPSAoMiBeIHMpICogZDtcbiAgdmFyIG4xID0gbi5zdWJuKDEpO1xuICBmb3IgKHZhciBzID0gMDsgIW4xLnRlc3RuKHMpOyBzKyspIHt9XG4gIHZhciBkID0gbi5zaHJuKHMpO1xuXG4gIHZhciBybjEgPSBuMS50b1JlZChyZWQpO1xuXG4gIGZvciAoOyBrID4gMDsgay0tKSB7XG4gICAgdmFyIGEgPSB0aGlzLl9yYW5kcmFuZ2UobmV3IGJuKDIpLCBuMSk7XG5cbiAgICB2YXIgZyA9IG4uZ2NkKGEpO1xuICAgIGlmIChnLmNtcG4oMSkgIT09IDApXG4gICAgICByZXR1cm4gZztcblxuICAgIHZhciB4ID0gYS50b1JlZChyZWQpLnJlZFBvdyhkKTtcbiAgICBpZiAoeC5jbXAocm9uZSkgPT09IDAgfHwgeC5jbXAocm4xKSA9PT0gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBzOyBpKyspIHtcbiAgICAgIHggPSB4LnJlZFNxcigpO1xuXG4gICAgICBpZiAoeC5jbXAocm9uZSkgPT09IDApXG4gICAgICAgIHJldHVybiB4LmZyb21SZWQoKS5zdWJuKDEpLmdjZChuKTtcbiAgICAgIGlmICh4LmNtcChybjEpID09PSAwKVxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoaSA9PT0gcykge1xuICAgICAgeCA9IHgucmVkU3FyKCk7XG4gICAgICByZXR1cm4geC5mcm9tUmVkKCkuc3VibigxKS5nY2Qobik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gYXNzZXJ0O1xuXG5mdW5jdGlvbiBhc3NlcnQodmFsLCBtc2cpIHtcbiAgaWYgKCF2YWwpXG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyB8fCAnQXNzZXJ0aW9uIGZhaWxlZCcpO1xufVxuXG5hc3NlcnQuZXF1YWwgPSBmdW5jdGlvbiBhc3NlcnRFcXVhbChsLCByLCBtc2cpIHtcbiAgaWYgKGwgIT0gcilcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnIHx8ICgnQXNzZXJ0aW9uIGZhaWxlZDogJyArIGwgKyAnICE9ICcgKyByKSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSBleHBvcnRzO1xuXG5mdW5jdGlvbiB0b0FycmF5KG1zZywgZW5jKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KG1zZykpXG4gICAgcmV0dXJuIG1zZy5zbGljZSgpO1xuICBpZiAoIW1zZylcbiAgICByZXR1cm4gW107XG4gIHZhciByZXMgPSBbXTtcbiAgaWYgKHR5cGVvZiBtc2cgIT09ICdzdHJpbmcnKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspXG4gICAgICByZXNbaV0gPSBtc2dbaV0gfCAwO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgaWYgKGVuYyA9PT0gJ2hleCcpIHtcbiAgICBtc2cgPSBtc2cucmVwbGFjZSgvW15hLXowLTldKy9pZywgJycpO1xuICAgIGlmIChtc2cubGVuZ3RoICUgMiAhPT0gMClcbiAgICAgIG1zZyA9ICcwJyArIG1zZztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkgKz0gMilcbiAgICAgIHJlcy5wdXNoKHBhcnNlSW50KG1zZ1tpXSArIG1zZ1tpICsgMV0sIDE2KSk7XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjID0gbXNnLmNoYXJDb2RlQXQoaSk7XG4gICAgICB2YXIgaGkgPSBjID4+IDg7XG4gICAgICB2YXIgbG8gPSBjICYgMHhmZjtcbiAgICAgIGlmIChoaSlcbiAgICAgICAgcmVzLnB1c2goaGksIGxvKTtcbiAgICAgIGVsc2VcbiAgICAgICAgcmVzLnB1c2gobG8pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxudXRpbHMudG9BcnJheSA9IHRvQXJyYXk7XG5cbmZ1bmN0aW9uIHplcm8yKHdvcmQpIHtcbiAgaWYgKHdvcmQubGVuZ3RoID09PSAxKVxuICAgIHJldHVybiAnMCcgKyB3b3JkO1xuICBlbHNlXG4gICAgcmV0dXJuIHdvcmQ7XG59XG51dGlscy56ZXJvMiA9IHplcm8yO1xuXG5mdW5jdGlvbiB0b0hleChtc2cpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKylcbiAgICByZXMgKz0gemVybzIobXNnW2ldLnRvU3RyaW5nKDE2KSk7XG4gIHJldHVybiByZXM7XG59XG51dGlscy50b0hleCA9IHRvSGV4O1xuXG51dGlscy5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoYXJyLCBlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHRvSGV4KGFycik7XG4gIGVsc2VcbiAgICByZXR1cm4gYXJyO1xufTtcbiIsIi8vIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2luZHV0bnkvc2VsZi1zaWduZWQvYmxvYi9naC1wYWdlcy9saWIvYXNuMS5qc1xuLy8gRmVkb3IsIHlvdSBhcmUgYW1hemluZy5cbid1c2Ugc3RyaWN0J1xuXG52YXIgYXNuMSA9IHJlcXVpcmUoJ2FzbjEuanMnKVxuXG5leHBvcnRzLmNlcnRpZmljYXRlID0gcmVxdWlyZSgnLi9jZXJ0aWZpY2F0ZScpXG5cbnZhciBSU0FQcml2YXRlS2V5ID0gYXNuMS5kZWZpbmUoJ1JTQVByaXZhdGVLZXknLCBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc2VxKCkub2JqKFxuICAgIHRoaXMua2V5KCd2ZXJzaW9uJykuaW50KCksXG4gICAgdGhpcy5rZXkoJ21vZHVsdXMnKS5pbnQoKSxcbiAgICB0aGlzLmtleSgncHVibGljRXhwb25lbnQnKS5pbnQoKSxcbiAgICB0aGlzLmtleSgncHJpdmF0ZUV4cG9uZW50JykuaW50KCksXG4gICAgdGhpcy5rZXkoJ3ByaW1lMScpLmludCgpLFxuICAgIHRoaXMua2V5KCdwcmltZTInKS5pbnQoKSxcbiAgICB0aGlzLmtleSgnZXhwb25lbnQxJykuaW50KCksXG4gICAgdGhpcy5rZXkoJ2V4cG9uZW50MicpLmludCgpLFxuICAgIHRoaXMua2V5KCdjb2VmZmljaWVudCcpLmludCgpXG4gIClcbn0pXG5leHBvcnRzLlJTQVByaXZhdGVLZXkgPSBSU0FQcml2YXRlS2V5XG5cbnZhciBSU0FQdWJsaWNLZXkgPSBhc24xLmRlZmluZSgnUlNBUHVibGljS2V5JywgZnVuY3Rpb24gKCkge1xuICB0aGlzLnNlcSgpLm9iaihcbiAgICB0aGlzLmtleSgnbW9kdWx1cycpLmludCgpLFxuICAgIHRoaXMua2V5KCdwdWJsaWNFeHBvbmVudCcpLmludCgpXG4gIClcbn0pXG5leHBvcnRzLlJTQVB1YmxpY0tleSA9IFJTQVB1YmxpY0tleVxuXG52YXIgUHVibGljS2V5ID0gYXNuMS5kZWZpbmUoJ1N1YmplY3RQdWJsaWNLZXlJbmZvJywgZnVuY3Rpb24gKCkge1xuICB0aGlzLnNlcSgpLm9iaihcbiAgICB0aGlzLmtleSgnYWxnb3JpdGhtJykudXNlKEFsZ29yaXRobUlkZW50aWZpZXIpLFxuICAgIHRoaXMua2V5KCdzdWJqZWN0UHVibGljS2V5JykuYml0c3RyKClcbiAgKVxufSlcbmV4cG9ydHMuUHVibGljS2V5ID0gUHVibGljS2V5XG5cbnZhciBBbGdvcml0aG1JZGVudGlmaWVyID0gYXNuMS5kZWZpbmUoJ0FsZ29yaXRobUlkZW50aWZpZXInLCBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc2VxKCkub2JqKFxuICAgIHRoaXMua2V5KCdhbGdvcml0aG0nKS5vYmppZCgpLFxuICAgIHRoaXMua2V5KCdub25lJykubnVsbF8oKS5vcHRpb25hbCgpLFxuICAgIHRoaXMua2V5KCdjdXJ2ZScpLm9iamlkKCkub3B0aW9uYWwoKSxcbiAgICB0aGlzLmtleSgncGFyYW1zJykuc2VxKCkub2JqKFxuICAgICAgdGhpcy5rZXkoJ3AnKS5pbnQoKSxcbiAgICAgIHRoaXMua2V5KCdxJykuaW50KCksXG4gICAgICB0aGlzLmtleSgnZycpLmludCgpXG4gICAgKS5vcHRpb25hbCgpXG4gIClcbn0pXG5cbnZhciBQcml2YXRlS2V5SW5mbyA9IGFzbjEuZGVmaW5lKCdQcml2YXRlS2V5SW5mbycsIGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5zZXEoKS5vYmooXG4gICAgdGhpcy5rZXkoJ3ZlcnNpb24nKS5pbnQoKSxcbiAgICB0aGlzLmtleSgnYWxnb3JpdGhtJykudXNlKEFsZ29yaXRobUlkZW50aWZpZXIpLFxuICAgIHRoaXMua2V5KCdzdWJqZWN0UHJpdmF0ZUtleScpLm9jdHN0cigpXG4gIClcbn0pXG5leHBvcnRzLlByaXZhdGVLZXkgPSBQcml2YXRlS2V5SW5mb1xudmFyIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvID0gYXNuMS5kZWZpbmUoJ0VuY3J5cHRlZFByaXZhdGVLZXlJbmZvJywgZnVuY3Rpb24gKCkge1xuICB0aGlzLnNlcSgpLm9iaihcbiAgICB0aGlzLmtleSgnYWxnb3JpdGhtJykuc2VxKCkub2JqKFxuICAgICAgdGhpcy5rZXkoJ2lkJykub2JqaWQoKSxcbiAgICAgIHRoaXMua2V5KCdkZWNyeXB0Jykuc2VxKCkub2JqKFxuICAgICAgICB0aGlzLmtleSgna2RlJykuc2VxKCkub2JqKFxuICAgICAgICAgIHRoaXMua2V5KCdpZCcpLm9iamlkKCksXG4gICAgICAgICAgdGhpcy5rZXkoJ2tkZXBhcmFtcycpLnNlcSgpLm9iaihcbiAgICAgICAgICAgIHRoaXMua2V5KCdzYWx0Jykub2N0c3RyKCksXG4gICAgICAgICAgICB0aGlzLmtleSgnaXRlcnMnKS5pbnQoKVxuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgdGhpcy5rZXkoJ2NpcGhlcicpLnNlcSgpLm9iaihcbiAgICAgICAgICB0aGlzLmtleSgnYWxnbycpLm9iamlkKCksXG4gICAgICAgICAgdGhpcy5rZXkoJ2l2Jykub2N0c3RyKClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICksXG4gICAgdGhpcy5rZXkoJ3N1YmplY3RQcml2YXRlS2V5Jykub2N0c3RyKClcbiAgKVxufSlcblxuZXhwb3J0cy5FbmNyeXB0ZWRQcml2YXRlS2V5ID0gRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9cblxudmFyIERTQVByaXZhdGVLZXkgPSBhc24xLmRlZmluZSgnRFNBUHJpdmF0ZUtleScsIGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5zZXEoKS5vYmooXG4gICAgdGhpcy5rZXkoJ3ZlcnNpb24nKS5pbnQoKSxcbiAgICB0aGlzLmtleSgncCcpLmludCgpLFxuICAgIHRoaXMua2V5KCdxJykuaW50KCksXG4gICAgdGhpcy5rZXkoJ2cnKS5pbnQoKSxcbiAgICB0aGlzLmtleSgncHViX2tleScpLmludCgpLFxuICAgIHRoaXMua2V5KCdwcml2X2tleScpLmludCgpXG4gIClcbn0pXG5leHBvcnRzLkRTQVByaXZhdGVLZXkgPSBEU0FQcml2YXRlS2V5XG5cbmV4cG9ydHMuRFNBcGFyYW0gPSBhc24xLmRlZmluZSgnRFNBcGFyYW0nLCBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuaW50KClcbn0pXG5cbnZhciBFQ1ByaXZhdGVLZXkgPSBhc24xLmRlZmluZSgnRUNQcml2YXRlS2V5JywgZnVuY3Rpb24gKCkge1xuICB0aGlzLnNlcSgpLm9iaihcbiAgICB0aGlzLmtleSgndmVyc2lvbicpLmludCgpLFxuICAgIHRoaXMua2V5KCdwcml2YXRlS2V5Jykub2N0c3RyKCksXG4gICAgdGhpcy5rZXkoJ3BhcmFtZXRlcnMnKS5vcHRpb25hbCgpLmV4cGxpY2l0KDApLnVzZShFQ1BhcmFtZXRlcnMpLFxuICAgIHRoaXMua2V5KCdwdWJsaWNLZXknKS5vcHRpb25hbCgpLmV4cGxpY2l0KDEpLmJpdHN0cigpXG4gIClcbn0pXG5leHBvcnRzLkVDUHJpdmF0ZUtleSA9IEVDUHJpdmF0ZUtleVxuXG52YXIgRUNQYXJhbWV0ZXJzID0gYXNuMS5kZWZpbmUoJ0VDUGFyYW1ldGVycycsIGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5jaG9pY2Uoe1xuICAgIG5hbWVkQ3VydmU6IHRoaXMub2JqaWQoKVxuICB9KVxufSlcblxuZXhwb3J0cy5zaWduYXR1cmUgPSBhc24xLmRlZmluZSgnc2lnbmF0dXJlJywgZnVuY3Rpb24gKCkge1xuICB0aGlzLnNlcSgpLm9iaihcbiAgICB0aGlzLmtleSgncicpLmludCgpLFxuICAgIHRoaXMua2V5KCdzJykuaW50KClcbiAgKVxufSlcbiIsIi8vIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL1JhbnRhbmVuL25vZGUtZHRscy9ibG9iLzI1YTdkYzg2MWJkYTM4Y2ZlYWM5M2E3MjM1MDBlZWE0ZjBhYzJlODYvQ2VydGlmaWNhdGUuanNcbi8vIHRoYW5rcyB0byBAUmFudGFuZW5cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBhc24gPSByZXF1aXJlKCdhc24xLmpzJylcblxudmFyIFRpbWUgPSBhc24uZGVmaW5lKCdUaW1lJywgZnVuY3Rpb24gKCkge1xuICB0aGlzLmNob2ljZSh7XG4gICAgdXRjVGltZTogdGhpcy51dGN0aW1lKCksXG4gICAgZ2VuZXJhbFRpbWU6IHRoaXMuZ2VudGltZSgpXG4gIH0pXG59KVxuXG52YXIgQXR0cmlidXRlVHlwZVZhbHVlID0gYXNuLmRlZmluZSgnQXR0cmlidXRlVHlwZVZhbHVlJywgZnVuY3Rpb24gKCkge1xuICB0aGlzLnNlcSgpLm9iaihcbiAgICB0aGlzLmtleSgndHlwZScpLm9iamlkKCksXG4gICAgdGhpcy5rZXkoJ3ZhbHVlJykuYW55KClcbiAgKVxufSlcblxudmFyIEFsZ29yaXRobUlkZW50aWZpZXIgPSBhc24uZGVmaW5lKCdBbGdvcml0aG1JZGVudGlmaWVyJywgZnVuY3Rpb24gKCkge1xuICB0aGlzLnNlcSgpLm9iaihcbiAgICB0aGlzLmtleSgnYWxnb3JpdGhtJykub2JqaWQoKSxcbiAgICB0aGlzLmtleSgncGFyYW1ldGVycycpLm9wdGlvbmFsKClcbiAgKVxufSlcblxudmFyIFN1YmplY3RQdWJsaWNLZXlJbmZvID0gYXNuLmRlZmluZSgnU3ViamVjdFB1YmxpY0tleUluZm8nLCBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc2VxKCkub2JqKFxuICAgIHRoaXMua2V5KCdhbGdvcml0aG0nKS51c2UoQWxnb3JpdGhtSWRlbnRpZmllciksXG4gICAgdGhpcy5rZXkoJ3N1YmplY3RQdWJsaWNLZXknKS5iaXRzdHIoKVxuICApXG59KVxuXG52YXIgUmVsYXRpdmVEaXN0aW5ndWlzaGVkTmFtZSA9IGFzbi5kZWZpbmUoJ1JlbGF0aXZlRGlzdGluZ3Vpc2hlZE5hbWUnLCBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc2V0b2YoQXR0cmlidXRlVHlwZVZhbHVlKVxufSlcblxudmFyIFJETlNlcXVlbmNlID0gYXNuLmRlZmluZSgnUkROU2VxdWVuY2UnLCBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc2Vxb2YoUmVsYXRpdmVEaXN0aW5ndWlzaGVkTmFtZSlcbn0pXG5cbnZhciBOYW1lID0gYXNuLmRlZmluZSgnTmFtZScsIGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5jaG9pY2Uoe1xuICAgIHJkblNlcXVlbmNlOiB0aGlzLnVzZShSRE5TZXF1ZW5jZSlcbiAgfSlcbn0pXG5cbnZhciBWYWxpZGl0eSA9IGFzbi5kZWZpbmUoJ1ZhbGlkaXR5JywgZnVuY3Rpb24gKCkge1xuICB0aGlzLnNlcSgpLm9iaihcbiAgICB0aGlzLmtleSgnbm90QmVmb3JlJykudXNlKFRpbWUpLFxuICAgIHRoaXMua2V5KCdub3RBZnRlcicpLnVzZShUaW1lKVxuICApXG59KVxuXG52YXIgRXh0ZW5zaW9uID0gYXNuLmRlZmluZSgnRXh0ZW5zaW9uJywgZnVuY3Rpb24gKCkge1xuICB0aGlzLnNlcSgpLm9iaihcbiAgICB0aGlzLmtleSgnZXh0bklEJykub2JqaWQoKSxcbiAgICB0aGlzLmtleSgnY3JpdGljYWwnKS5ib29sKCkuZGVmKGZhbHNlKSxcbiAgICB0aGlzLmtleSgnZXh0blZhbHVlJykub2N0c3RyKClcbiAgKVxufSlcblxudmFyIFRCU0NlcnRpZmljYXRlID0gYXNuLmRlZmluZSgnVEJTQ2VydGlmaWNhdGUnLCBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc2VxKCkub2JqKFxuICAgIHRoaXMua2V5KCd2ZXJzaW9uJykuZXhwbGljaXQoMCkuaW50KCksXG4gICAgdGhpcy5rZXkoJ3NlcmlhbE51bWJlcicpLmludCgpLFxuICAgIHRoaXMua2V5KCdzaWduYXR1cmUnKS51c2UoQWxnb3JpdGhtSWRlbnRpZmllciksXG4gICAgdGhpcy5rZXkoJ2lzc3VlcicpLnVzZShOYW1lKSxcbiAgICB0aGlzLmtleSgndmFsaWRpdHknKS51c2UoVmFsaWRpdHkpLFxuICAgIHRoaXMua2V5KCdzdWJqZWN0JykudXNlKE5hbWUpLFxuICAgIHRoaXMua2V5KCdzdWJqZWN0UHVibGljS2V5SW5mbycpLnVzZShTdWJqZWN0UHVibGljS2V5SW5mbyksXG4gICAgdGhpcy5rZXkoJ2lzc3VlclVuaXF1ZUlEJykuaW1wbGljaXQoMSkuYml0c3RyKCkub3B0aW9uYWwoKSxcbiAgICB0aGlzLmtleSgnc3ViamVjdFVuaXF1ZUlEJykuaW1wbGljaXQoMikuYml0c3RyKCkub3B0aW9uYWwoKSxcbiAgICB0aGlzLmtleSgnZXh0ZW5zaW9ucycpLmV4cGxpY2l0KDMpLnNlcW9mKEV4dGVuc2lvbikub3B0aW9uYWwoKVxuICApXG59KVxuXG52YXIgWDUwOUNlcnRpZmljYXRlID0gYXNuLmRlZmluZSgnWDUwOUNlcnRpZmljYXRlJywgZnVuY3Rpb24gKCkge1xuICB0aGlzLnNlcSgpLm9iaihcbiAgICB0aGlzLmtleSgndGJzQ2VydGlmaWNhdGUnKS51c2UoVEJTQ2VydGlmaWNhdGUpLFxuICAgIHRoaXMua2V5KCdzaWduYXR1cmVBbGdvcml0aG0nKS51c2UoQWxnb3JpdGhtSWRlbnRpZmllciksXG4gICAgdGhpcy5rZXkoJ3NpZ25hdHVyZVZhbHVlJykuYml0c3RyKClcbiAgKVxufSlcblxubW9kdWxlLmV4cG9ydHMgPSBYNTA5Q2VydGlmaWNhdGVcbiIsIi8vIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYXBhdGlsL3BlbXN0cmlwXG52YXIgZmluZFByb2MgPSAvUHJvYy1UeXBlOiA0LEVOQ1JZUFRFRFtcXG5cXHJdK0RFSy1JbmZvOiBBRVMtKCg/OjEyOCl8KD86MTkyKXwoPzoyNTYpKS1DQkMsKFswLTlBLUhdKylbXFxuXFxyXSsoWzAtOUEtelxcblxcclxcK1xcL1xcPV0rKVtcXG5cXHJdKy9tXG52YXIgc3RhcnRSZWdleCA9IC9eLS0tLS1CRUdJTiAoKD86LiogS0VZKXxDRVJUSUZJQ0FURSktLS0tLS9tXG52YXIgZnVsbFJlZ2V4ID0gL14tLS0tLUJFR0lOICgoPzouKiBLRVkpfENFUlRJRklDQVRFKS0tLS0tKFswLTlBLXpcXG5cXHJcXCtcXC9cXD1dKyktLS0tLUVORCBcXDEtLS0tLSQvbVxudmFyIGV2cCA9IHJlcXVpcmUoJ2V2cF9ieXRlc3Rva2V5JylcbnZhciBjaXBoZXJzID0gcmVxdWlyZSgnYnJvd3NlcmlmeS1hZXMnKVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2tleSwgcGFzc3dvcmQpIHtcbiAgdmFyIGtleSA9IG9rZXkudG9TdHJpbmcoKVxuICB2YXIgbWF0Y2ggPSBrZXkubWF0Y2goZmluZFByb2MpXG4gIHZhciBkZWNyeXB0ZWRcbiAgaWYgKCFtYXRjaCkge1xuICAgIHZhciBtYXRjaDIgPSBrZXkubWF0Y2goZnVsbFJlZ2V4KVxuICAgIGRlY3J5cHRlZCA9IG5ldyBCdWZmZXIobWF0Y2gyWzJdLnJlcGxhY2UoL1tcXHJcXG5dL2csICcnKSwgJ2Jhc2U2NCcpXG4gIH0gZWxzZSB7XG4gICAgdmFyIHN1aXRlID0gJ2FlcycgKyBtYXRjaFsxXVxuICAgIHZhciBpdiA9IG5ldyBCdWZmZXIobWF0Y2hbMl0sICdoZXgnKVxuICAgIHZhciBjaXBoZXJUZXh0ID0gbmV3IEJ1ZmZlcihtYXRjaFszXS5yZXBsYWNlKC9bXFxyXFxuXS9nLCAnJyksICdiYXNlNjQnKVxuICAgIHZhciBjaXBoZXJLZXkgPSBldnAocGFzc3dvcmQsIGl2LnNsaWNlKDAsIDgpLCBwYXJzZUludChtYXRjaFsxXSwgMTApKS5rZXlcbiAgICB2YXIgb3V0ID0gW11cbiAgICB2YXIgY2lwaGVyID0gY2lwaGVycy5jcmVhdGVEZWNpcGhlcml2KHN1aXRlLCBjaXBoZXJLZXksIGl2KVxuICAgIG91dC5wdXNoKGNpcGhlci51cGRhdGUoY2lwaGVyVGV4dCkpXG4gICAgb3V0LnB1c2goY2lwaGVyLmZpbmFsKCkpXG4gICAgZGVjcnlwdGVkID0gQnVmZmVyLmNvbmNhdChvdXQpXG4gIH1cbiAgdmFyIHRhZyA9IGtleS5tYXRjaChzdGFydFJlZ2V4KVsxXVxuICByZXR1cm4ge1xuICAgIHRhZzogdGFnLFxuICAgIGRhdGE6IGRlY3J5cHRlZFxuICB9XG59XG4iLCJ2YXIgYXNuMSA9IHJlcXVpcmUoJy4vYXNuMScpXG52YXIgYWVzaWQgPSByZXF1aXJlKCcuL2Flc2lkLmpzb24nKVxudmFyIGZpeFByb2MgPSByZXF1aXJlKCcuL2ZpeFByb2MnKVxudmFyIGNpcGhlcnMgPSByZXF1aXJlKCdicm93c2VyaWZ5LWFlcycpXG52YXIgY29tcGF0ID0gcmVxdWlyZSgncGJrZGYyJylcbm1vZHVsZS5leHBvcnRzID0gcGFyc2VLZXlzXG5cbmZ1bmN0aW9uIHBhcnNlS2V5cyAoYnVmZmVyKSB7XG4gIHZhciBwYXNzd29yZFxuICBpZiAodHlwZW9mIGJ1ZmZlciA9PT0gJ29iamVjdCcgJiYgIUJ1ZmZlci5pc0J1ZmZlcihidWZmZXIpKSB7XG4gICAgcGFzc3dvcmQgPSBidWZmZXIucGFzc3BocmFzZVxuICAgIGJ1ZmZlciA9IGJ1ZmZlci5rZXlcbiAgfVxuICBpZiAodHlwZW9mIGJ1ZmZlciA9PT0gJ3N0cmluZycpIHtcbiAgICBidWZmZXIgPSBuZXcgQnVmZmVyKGJ1ZmZlcilcbiAgfVxuXG4gIHZhciBzdHJpcHBlZCA9IGZpeFByb2MoYnVmZmVyLCBwYXNzd29yZClcblxuICB2YXIgdHlwZSA9IHN0cmlwcGVkLnRhZ1xuICB2YXIgZGF0YSA9IHN0cmlwcGVkLmRhdGFcbiAgdmFyIHN1YnR5cGUsIG5kYXRhXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ0NFUlRJRklDQVRFJzpcbiAgICAgIG5kYXRhID0gYXNuMS5jZXJ0aWZpY2F0ZS5kZWNvZGUoZGF0YSwgJ2RlcicpLnRic0NlcnRpZmljYXRlLnN1YmplY3RQdWJsaWNLZXlJbmZvXG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgY2FzZSAnUFVCTElDIEtFWSc6XG4gICAgICBpZiAoIW5kYXRhKSB7XG4gICAgICAgIG5kYXRhID0gYXNuMS5QdWJsaWNLZXkuZGVjb2RlKGRhdGEsICdkZXInKVxuICAgICAgfVxuICAgICAgc3VidHlwZSA9IG5kYXRhLmFsZ29yaXRobS5hbGdvcml0aG0uam9pbignLicpXG4gICAgICBzd2l0Y2ggKHN1YnR5cGUpIHtcbiAgICAgICAgY2FzZSAnMS4yLjg0MC4xMTM1NDkuMS4xLjEnOlxuICAgICAgICAgIHJldHVybiBhc24xLlJTQVB1YmxpY0tleS5kZWNvZGUobmRhdGEuc3ViamVjdFB1YmxpY0tleS5kYXRhLCAnZGVyJylcbiAgICAgICAgY2FzZSAnMS4yLjg0MC4xMDA0NS4yLjEnOlxuICAgICAgICAgIG5kYXRhLnN1YmplY3RQcml2YXRlS2V5ID0gbmRhdGEuc3ViamVjdFB1YmxpY0tleVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnZWMnLFxuICAgICAgICAgICAgZGF0YTogbmRhdGFcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJzEuMi44NDAuMTAwNDAuNC4xJzpcbiAgICAgICAgICBuZGF0YS5hbGdvcml0aG0ucGFyYW1zLnB1Yl9rZXkgPSBhc24xLkRTQXBhcmFtLmRlY29kZShuZGF0YS5zdWJqZWN0UHVibGljS2V5LmRhdGEsICdkZXInKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnZHNhJyxcbiAgICAgICAgICAgIGRhdGE6IG5kYXRhLmFsZ29yaXRobS5wYXJhbXNcbiAgICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcigndW5rbm93biBrZXkgaWQgJyArIHN1YnR5cGUpXG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24ga2V5IHR5cGUgJyArIHR5cGUpXG4gICAgY2FzZSAnRU5DUllQVEVEIFBSSVZBVEUgS0VZJzpcbiAgICAgIGRhdGEgPSBhc24xLkVuY3J5cHRlZFByaXZhdGVLZXkuZGVjb2RlKGRhdGEsICdkZXInKVxuICAgICAgZGF0YSA9IGRlY3J5cHQoZGF0YSwgcGFzc3dvcmQpXG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgY2FzZSAnUFJJVkFURSBLRVknOlxuICAgICAgbmRhdGEgPSBhc24xLlByaXZhdGVLZXkuZGVjb2RlKGRhdGEsICdkZXInKVxuICAgICAgc3VidHlwZSA9IG5kYXRhLmFsZ29yaXRobS5hbGdvcml0aG0uam9pbignLicpXG4gICAgICBzd2l0Y2ggKHN1YnR5cGUpIHtcbiAgICAgICAgY2FzZSAnMS4yLjg0MC4xMTM1NDkuMS4xLjEnOlxuICAgICAgICAgIHJldHVybiBhc24xLlJTQVByaXZhdGVLZXkuZGVjb2RlKG5kYXRhLnN1YmplY3RQcml2YXRlS2V5LCAnZGVyJylcbiAgICAgICAgY2FzZSAnMS4yLjg0MC4xMDA0NS4yLjEnOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjdXJ2ZTogbmRhdGEuYWxnb3JpdGhtLmN1cnZlLFxuICAgICAgICAgICAgcHJpdmF0ZUtleTogYXNuMS5FQ1ByaXZhdGVLZXkuZGVjb2RlKG5kYXRhLnN1YmplY3RQcml2YXRlS2V5LCAnZGVyJykucHJpdmF0ZUtleVxuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnMS4yLjg0MC4xMDA0MC40LjEnOlxuICAgICAgICAgIG5kYXRhLmFsZ29yaXRobS5wYXJhbXMucHJpdl9rZXkgPSBhc24xLkRTQXBhcmFtLmRlY29kZShuZGF0YS5zdWJqZWN0UHJpdmF0ZUtleSwgJ2RlcicpXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdkc2EnLFxuICAgICAgICAgICAgcGFyYW1zOiBuZGF0YS5hbGdvcml0aG0ucGFyYW1zXG4gICAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24ga2V5IGlkICcgKyBzdWJ0eXBlKVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGtleSB0eXBlICcgKyB0eXBlKVxuICAgIGNhc2UgJ1JTQSBQVUJMSUMgS0VZJzpcbiAgICAgIHJldHVybiBhc24xLlJTQVB1YmxpY0tleS5kZWNvZGUoZGF0YSwgJ2RlcicpXG4gICAgY2FzZSAnUlNBIFBSSVZBVEUgS0VZJzpcbiAgICAgIHJldHVybiBhc24xLlJTQVByaXZhdGVLZXkuZGVjb2RlKGRhdGEsICdkZXInKVxuICAgIGNhc2UgJ0RTQSBQUklWQVRFIEtFWSc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnZHNhJyxcbiAgICAgICAgcGFyYW1zOiBhc24xLkRTQVByaXZhdGVLZXkuZGVjb2RlKGRhdGEsICdkZXInKVxuICAgICAgfVxuICAgIGNhc2UgJ0VDIFBSSVZBVEUgS0VZJzpcbiAgICAgIGRhdGEgPSBhc24xLkVDUHJpdmF0ZUtleS5kZWNvZGUoZGF0YSwgJ2RlcicpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjdXJ2ZTogZGF0YS5wYXJhbWV0ZXJzLnZhbHVlLFxuICAgICAgICBwcml2YXRlS2V5OiBkYXRhLnByaXZhdGVLZXlcbiAgICAgIH1cbiAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24ga2V5IHR5cGUgJyArIHR5cGUpXG4gIH1cbn1cbnBhcnNlS2V5cy5zaWduYXR1cmUgPSBhc24xLnNpZ25hdHVyZVxuZnVuY3Rpb24gZGVjcnlwdCAoZGF0YSwgcGFzc3dvcmQpIHtcbiAgdmFyIHNhbHQgPSBkYXRhLmFsZ29yaXRobS5kZWNyeXB0LmtkZS5rZGVwYXJhbXMuc2FsdFxuICB2YXIgaXRlcnMgPSBwYXJzZUludChkYXRhLmFsZ29yaXRobS5kZWNyeXB0LmtkZS5rZGVwYXJhbXMuaXRlcnMudG9TdHJpbmcoKSwgMTApXG4gIHZhciBhbGdvID0gYWVzaWRbZGF0YS5hbGdvcml0aG0uZGVjcnlwdC5jaXBoZXIuYWxnby5qb2luKCcuJyldXG4gIHZhciBpdiA9IGRhdGEuYWxnb3JpdGhtLmRlY3J5cHQuY2lwaGVyLml2XG4gIHZhciBjaXBoZXJUZXh0ID0gZGF0YS5zdWJqZWN0UHJpdmF0ZUtleVxuICB2YXIga2V5bGVuID0gcGFyc2VJbnQoYWxnby5zcGxpdCgnLScpWzFdLCAxMCkgLyA4XG4gIHZhciBrZXkgPSBjb21wYXQucGJrZGYyU3luYyhwYXNzd29yZCwgc2FsdCwgaXRlcnMsIGtleWxlbilcbiAgdmFyIGNpcGhlciA9IGNpcGhlcnMuY3JlYXRlRGVjaXBoZXJpdihhbGdvLCBrZXksIGl2KVxuICB2YXIgb3V0ID0gW11cbiAgb3V0LnB1c2goY2lwaGVyLnVwZGF0ZShjaXBoZXJUZXh0KSlcbiAgb3V0LnB1c2goY2lwaGVyLmZpbmFsKCkpXG4gIHJldHVybiBCdWZmZXIuY29uY2F0KG91dClcbn1cbiIsImV4cG9ydHMucGJrZGYyID0gcmVxdWlyZSgnLi9saWIvYXN5bmMnKVxuZXhwb3J0cy5wYmtkZjJTeW5jID0gcmVxdWlyZSgnLi9saWIvc3luYycpXG4iLCJ2YXIgY2hlY2tQYXJhbWV0ZXJzID0gcmVxdWlyZSgnLi9wcmVjb25kaXRpb24nKVxudmFyIGRlZmF1bHRFbmNvZGluZyA9IHJlcXVpcmUoJy4vZGVmYXVsdC1lbmNvZGluZycpXG52YXIgc3luYyA9IHJlcXVpcmUoJy4vc3luYycpXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcblxudmFyIFpFUk9fQlVGXG52YXIgc3VidGxlID0gZ2xvYmFsLmNyeXB0byAmJiBnbG9iYWwuY3J5cHRvLnN1YnRsZVxudmFyIHRvQnJvd3NlciA9IHtcbiAgJ3NoYSc6ICdTSEEtMScsXG4gICdzaGEtMSc6ICdTSEEtMScsXG4gICdzaGExJzogJ1NIQS0xJyxcbiAgJ3NoYTI1Nic6ICdTSEEtMjU2JyxcbiAgJ3NoYS0yNTYnOiAnU0hBLTI1NicsXG4gICdzaGEzODQnOiAnU0hBLTM4NCcsXG4gICdzaGEtMzg0JzogJ1NIQS0zODQnLFxuICAnc2hhLTUxMic6ICdTSEEtNTEyJyxcbiAgJ3NoYTUxMic6ICdTSEEtNTEyJ1xufVxudmFyIGNoZWNrcyA9IFtdXG5mdW5jdGlvbiBjaGVja05hdGl2ZSAoYWxnbykge1xuICBpZiAoZ2xvYmFsLnByb2Nlc3MgJiYgIWdsb2JhbC5wcm9jZXNzLmJyb3dzZXIpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKVxuICB9XG4gIGlmICghc3VidGxlIHx8ICFzdWJ0bGUuaW1wb3J0S2V5IHx8ICFzdWJ0bGUuZGVyaXZlQml0cykge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpXG4gIH1cbiAgaWYgKGNoZWNrc1thbGdvXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNoZWNrc1thbGdvXVxuICB9XG4gIFpFUk9fQlVGID0gWkVST19CVUYgfHwgQnVmZmVyLmFsbG9jKDgpXG4gIHZhciBwcm9tID0gYnJvd3NlclBia2RmMihaRVJPX0JVRiwgWkVST19CVUYsIDEwLCAxMjgsIGFsZ28pXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9KVxuICBjaGVja3NbYWxnb10gPSBwcm9tXG4gIHJldHVybiBwcm9tXG59XG5cbmZ1bmN0aW9uIGJyb3dzZXJQYmtkZjIgKHBhc3N3b3JkLCBzYWx0LCBpdGVyYXRpb25zLCBsZW5ndGgsIGFsZ28pIHtcbiAgcmV0dXJuIHN1YnRsZS5pbXBvcnRLZXkoXG4gICAgJ3JhdycsIHBhc3N3b3JkLCB7bmFtZTogJ1BCS0RGMid9LCBmYWxzZSwgWydkZXJpdmVCaXRzJ11cbiAgKS50aGVuKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gc3VidGxlLmRlcml2ZUJpdHMoe1xuICAgICAgbmFtZTogJ1BCS0RGMicsXG4gICAgICBzYWx0OiBzYWx0LFxuICAgICAgaXRlcmF0aW9uczogaXRlcmF0aW9ucyxcbiAgICAgIGhhc2g6IHtcbiAgICAgICAgbmFtZTogYWxnb1xuICAgICAgfVxuICAgIH0sIGtleSwgbGVuZ3RoIDw8IDMpXG4gIH0pLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShyZXMpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVQcm9taXNlIChwcm9taXNlLCBjYWxsYmFjaykge1xuICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKG91dCkge1xuICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2sobnVsbCwgb3V0KVxuICAgIH0pXG4gIH0sIGZ1bmN0aW9uIChlKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsYmFjayhlKVxuICAgIH0pXG4gIH0pXG59XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChwYXNzd29yZCwgc2FsdCwgaXRlcmF0aW9ucywga2V5bGVuLCBkaWdlc3QsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2YgZGlnZXN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBkaWdlc3RcbiAgICBkaWdlc3QgPSB1bmRlZmluZWRcbiAgfVxuXG4gIGRpZ2VzdCA9IGRpZ2VzdCB8fCAnc2hhMSdcbiAgdmFyIGFsZ28gPSB0b0Jyb3dzZXJbZGlnZXN0LnRvTG93ZXJDYXNlKCldXG5cbiAgaWYgKCFhbGdvIHx8IHR5cGVvZiBnbG9iYWwuUHJvbWlzZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBvdXRcbiAgICAgIHRyeSB7XG4gICAgICAgIG91dCA9IHN5bmMocGFzc3dvcmQsIHNhbHQsIGl0ZXJhdGlvbnMsIGtleWxlbiwgZGlnZXN0KVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZSlcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrKG51bGwsIG91dClcbiAgICB9KVxuICB9XG5cbiAgY2hlY2tQYXJhbWV0ZXJzKHBhc3N3b3JkLCBzYWx0LCBpdGVyYXRpb25zLCBrZXlsZW4pXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBFcnJvcignTm8gY2FsbGJhY2sgcHJvdmlkZWQgdG8gcGJrZGYyJylcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIocGFzc3dvcmQpKSBwYXNzd29yZCA9IEJ1ZmZlci5mcm9tKHBhc3N3b3JkLCBkZWZhdWx0RW5jb2RpbmcpXG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHNhbHQpKSBzYWx0ID0gQnVmZmVyLmZyb20oc2FsdCwgZGVmYXVsdEVuY29kaW5nKVxuXG4gIHJlc29sdmVQcm9taXNlKGNoZWNrTmF0aXZlKGFsZ28pLnRoZW4oZnVuY3Rpb24gKHJlc3ApIHtcbiAgICBpZiAocmVzcCkgcmV0dXJuIGJyb3dzZXJQYmtkZjIocGFzc3dvcmQsIHNhbHQsIGl0ZXJhdGlvbnMsIGtleWxlbiwgYWxnbylcblxuICAgIHJldHVybiBzeW5jKHBhc3N3b3JkLCBzYWx0LCBpdGVyYXRpb25zLCBrZXlsZW4sIGRpZ2VzdClcbiAgfSksIGNhbGxiYWNrKVxufVxuIiwidmFyIGRlZmF1bHRFbmNvZGluZ1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlmIChwcm9jZXNzLmJyb3dzZXIpIHtcbiAgZGVmYXVsdEVuY29kaW5nID0gJ3V0Zi04J1xufSBlbHNlIHtcbiAgdmFyIHBWZXJzaW9uTWFqb3IgPSBwYXJzZUludChwcm9jZXNzLnZlcnNpb24uc3BsaXQoJy4nKVswXS5zbGljZSgxKSwgMTApXG5cbiAgZGVmYXVsdEVuY29kaW5nID0gcFZlcnNpb25NYWpvciA+PSA2ID8gJ3V0Zi04JyA6ICdiaW5hcnknXG59XG5tb2R1bGUuZXhwb3J0cyA9IGRlZmF1bHRFbmNvZGluZ1xuIiwidmFyIE1BWF9BTExPQyA9IE1hdGgucG93KDIsIDMwKSAtIDEgLy8gZGVmYXVsdCBpbiBpb2pzXG5cbmZ1bmN0aW9uIGNoZWNrQnVmZmVyIChidWYsIG5hbWUpIHtcbiAgaWYgKHR5cGVvZiBidWYgIT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNCdWZmZXIoYnVmKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IobmFtZSArICcgbXVzdCBiZSBhIGJ1ZmZlciBvciBzdHJpbmcnKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHBhc3N3b3JkLCBzYWx0LCBpdGVyYXRpb25zLCBrZXlsZW4pIHtcbiAgY2hlY2tCdWZmZXIocGFzc3dvcmQsICdQYXNzd29yZCcpXG4gIGNoZWNrQnVmZmVyKHNhbHQsICdTYWx0JylcblxuICBpZiAodHlwZW9mIGl0ZXJhdGlvbnMgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSXRlcmF0aW9ucyBub3QgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKGl0ZXJhdGlvbnMgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQmFkIGl0ZXJhdGlvbnMnKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXlsZW4gIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignS2V5IGxlbmd0aCBub3QgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKGtleWxlbiA8IDAgfHwga2V5bGVuID4gTUFYX0FMTE9DIHx8IGtleWxlbiAhPT0ga2V5bGVuKSB7IC8qIGVzbGludCBuby1zZWxmLWNvbXBhcmU6IDAgKi9cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCYWQga2V5IGxlbmd0aCcpXG4gIH1cbn1cbiIsInZhciBtZDUgPSByZXF1aXJlKCdjcmVhdGUtaGFzaC9tZDUnKVxudmFyIFJJUEVNRDE2MCA9IHJlcXVpcmUoJ3JpcGVtZDE2MCcpXG52YXIgc2hhID0gcmVxdWlyZSgnc2hhLmpzJylcblxudmFyIGNoZWNrUGFyYW1ldGVycyA9IHJlcXVpcmUoJy4vcHJlY29uZGl0aW9uJylcbnZhciBkZWZhdWx0RW5jb2RpbmcgPSByZXF1aXJlKCcuL2RlZmF1bHQtZW5jb2RpbmcnKVxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyXG52YXIgWkVST1MgPSBCdWZmZXIuYWxsb2MoMTI4KVxudmFyIHNpemVzID0ge1xuICBtZDU6IDE2LFxuICBzaGExOiAyMCxcbiAgc2hhMjI0OiAyOCxcbiAgc2hhMjU2OiAzMixcbiAgc2hhMzg0OiA0OCxcbiAgc2hhNTEyOiA2NCxcbiAgcm1kMTYwOiAyMCxcbiAgcmlwZW1kMTYwOiAyMFxufVxuXG5mdW5jdGlvbiBIbWFjIChhbGcsIGtleSwgc2FsdExlbikge1xuICB2YXIgaGFzaCA9IGdldERpZ2VzdChhbGcpXG4gIHZhciBibG9ja3NpemUgPSAoYWxnID09PSAnc2hhNTEyJyB8fCBhbGcgPT09ICdzaGEzODQnKSA/IDEyOCA6IDY0XG5cbiAgaWYgKGtleS5sZW5ndGggPiBibG9ja3NpemUpIHtcbiAgICBrZXkgPSBoYXNoKGtleSlcbiAgfSBlbHNlIGlmIChrZXkubGVuZ3RoIDwgYmxvY2tzaXplKSB7XG4gICAga2V5ID0gQnVmZmVyLmNvbmNhdChba2V5LCBaRVJPU10sIGJsb2Nrc2l6ZSlcbiAgfVxuXG4gIHZhciBpcGFkID0gQnVmZmVyLmFsbG9jVW5zYWZlKGJsb2Nrc2l6ZSArIHNpemVzW2FsZ10pXG4gIHZhciBvcGFkID0gQnVmZmVyLmFsbG9jVW5zYWZlKGJsb2Nrc2l6ZSArIHNpemVzW2FsZ10pXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tzaXplOyBpKyspIHtcbiAgICBpcGFkW2ldID0ga2V5W2ldIF4gMHgzNlxuICAgIG9wYWRbaV0gPSBrZXlbaV0gXiAweDVDXG4gIH1cblxuICB2YXIgaXBhZDEgPSBCdWZmZXIuYWxsb2NVbnNhZmUoYmxvY2tzaXplICsgc2FsdExlbiArIDQpXG4gIGlwYWQuY29weShpcGFkMSwgMCwgMCwgYmxvY2tzaXplKVxuICB0aGlzLmlwYWQxID0gaXBhZDFcbiAgdGhpcy5pcGFkMiA9IGlwYWRcbiAgdGhpcy5vcGFkID0gb3BhZFxuICB0aGlzLmFsZyA9IGFsZ1xuICB0aGlzLmJsb2Nrc2l6ZSA9IGJsb2Nrc2l6ZVxuICB0aGlzLmhhc2ggPSBoYXNoXG4gIHRoaXMuc2l6ZSA9IHNpemVzW2FsZ11cbn1cblxuSG1hYy5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKGRhdGEsIGlwYWQpIHtcbiAgZGF0YS5jb3B5KGlwYWQsIHRoaXMuYmxvY2tzaXplKVxuICB2YXIgaCA9IHRoaXMuaGFzaChpcGFkKVxuICBoLmNvcHkodGhpcy5vcGFkLCB0aGlzLmJsb2Nrc2l6ZSlcbiAgcmV0dXJuIHRoaXMuaGFzaCh0aGlzLm9wYWQpXG59XG5cbmZ1bmN0aW9uIGdldERpZ2VzdCAoYWxnKSB7XG4gIGZ1bmN0aW9uIHNoYUZ1bmMgKGRhdGEpIHtcbiAgICByZXR1cm4gc2hhKGFsZykudXBkYXRlKGRhdGEpLmRpZ2VzdCgpXG4gIH1cbiAgZnVuY3Rpb24gcm1kMTYwRnVuYyAoZGF0YSkge1xuICAgIHJldHVybiBuZXcgUklQRU1EMTYwKCkudXBkYXRlKGRhdGEpLmRpZ2VzdCgpXG4gIH1cblxuICBpZiAoYWxnID09PSAncm1kMTYwJyB8fCBhbGcgPT09ICdyaXBlbWQxNjAnKSByZXR1cm4gcm1kMTYwRnVuY1xuICBpZiAoYWxnID09PSAnbWQ1JykgcmV0dXJuIG1kNVxuICByZXR1cm4gc2hhRnVuY1xufVxuXG5mdW5jdGlvbiBwYmtkZjIgKHBhc3N3b3JkLCBzYWx0LCBpdGVyYXRpb25zLCBrZXlsZW4sIGRpZ2VzdCkge1xuICBjaGVja1BhcmFtZXRlcnMocGFzc3dvcmQsIHNhbHQsIGl0ZXJhdGlvbnMsIGtleWxlbilcblxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihwYXNzd29yZCkpIHBhc3N3b3JkID0gQnVmZmVyLmZyb20ocGFzc3dvcmQsIGRlZmF1bHRFbmNvZGluZylcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoc2FsdCkpIHNhbHQgPSBCdWZmZXIuZnJvbShzYWx0LCBkZWZhdWx0RW5jb2RpbmcpXG5cbiAgZGlnZXN0ID0gZGlnZXN0IHx8ICdzaGExJ1xuXG4gIHZhciBobWFjID0gbmV3IEhtYWMoZGlnZXN0LCBwYXNzd29yZCwgc2FsdC5sZW5ndGgpXG5cbiAgdmFyIERLID0gQnVmZmVyLmFsbG9jVW5zYWZlKGtleWxlbilcbiAgdmFyIGJsb2NrMSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShzYWx0Lmxlbmd0aCArIDQpXG4gIHNhbHQuY29weShibG9jazEsIDAsIDAsIHNhbHQubGVuZ3RoKVxuXG4gIHZhciBkZXN0UG9zID0gMFxuICB2YXIgaExlbiA9IHNpemVzW2RpZ2VzdF1cbiAgdmFyIGwgPSBNYXRoLmNlaWwoa2V5bGVuIC8gaExlbilcblxuICBmb3IgKHZhciBpID0gMTsgaSA8PSBsOyBpKyspIHtcbiAgICBibG9jazEud3JpdGVVSW50MzJCRShpLCBzYWx0Lmxlbmd0aClcblxuICAgIHZhciBUID0gaG1hYy5ydW4oYmxvY2sxLCBobWFjLmlwYWQxKVxuICAgIHZhciBVID0gVFxuXG4gICAgZm9yICh2YXIgaiA9IDE7IGogPCBpdGVyYXRpb25zOyBqKyspIHtcbiAgICAgIFUgPSBobWFjLnJ1bihVLCBobWFjLmlwYWQyKVxuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBoTGVuOyBrKyspIFRba10gXj0gVVtrXVxuICAgIH1cblxuICAgIFQuY29weShESywgZGVzdFBvcylcbiAgICBkZXN0UG9zICs9IGhMZW5cbiAgfVxuXG4gIHJldHVybiBES1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBia2RmMlxuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjJcbihmdW5jdGlvbigpIHtcbiAgdmFyIGdldE5hbm9TZWNvbmRzLCBocnRpbWUsIGxvYWRUaW1lLCBtb2R1bGVMb2FkVGltZSwgbm9kZUxvYWRUaW1lLCB1cFRpbWU7XG5cbiAgaWYgKCh0eXBlb2YgcGVyZm9ybWFuY2UgIT09IFwidW5kZWZpbmVkXCIgJiYgcGVyZm9ybWFuY2UgIT09IG51bGwpICYmIHBlcmZvcm1hbmNlLm5vdykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgfTtcbiAgfSBlbHNlIGlmICgodHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2VzcyAhPT0gbnVsbCkgJiYgcHJvY2Vzcy5ocnRpbWUpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIChnZXROYW5vU2Vjb25kcygpIC0gbm9kZUxvYWRUaW1lKSAvIDFlNjtcbiAgICB9O1xuICAgIGhydGltZSA9IHByb2Nlc3MuaHJ0aW1lO1xuICAgIGdldE5hbm9TZWNvbmRzID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaHI7XG4gICAgICBociA9IGhydGltZSgpO1xuICAgICAgcmV0dXJuIGhyWzBdICogMWU5ICsgaHJbMV07XG4gICAgfTtcbiAgICBtb2R1bGVMb2FkVGltZSA9IGdldE5hbm9TZWNvbmRzKCk7XG4gICAgdXBUaW1lID0gcHJvY2Vzcy51cHRpbWUoKSAqIDFlOTtcbiAgICBub2RlTG9hZFRpbWUgPSBtb2R1bGVMb2FkVGltZSAtIHVwVGltZTtcbiAgfSBlbHNlIGlmIChEYXRlLm5vdykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gRGF0ZS5ub3coKSAtIGxvYWRUaW1lO1xuICAgIH07XG4gICAgbG9hZFRpbWUgPSBEYXRlLm5vdygpO1xuICB9IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBsb2FkVGltZTtcbiAgICB9O1xuICAgIGxvYWRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIH1cblxufSkuY2FsbCh0aGlzKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGVyZm9ybWFuY2Utbm93LmpzLm1hcFxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAoIXByb2Nlc3MudmVyc2lvbiB8fFxuICAgIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MC4nKSA9PT0gMCB8fFxuICAgIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MS4nKSA9PT0gMCAmJiBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjEuOC4nKSAhPT0gMCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHsgbmV4dFRpY2s6IG5leHRUaWNrIH07XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHByb2Nlc3Ncbn1cblxuZnVuY3Rpb24gbmV4dFRpY2soZm4sIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiY2FsbGJhY2tcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGFyZ3MsIGk7XG4gIHN3aXRjaCAobGVuKSB7XG4gIGNhc2UgMDpcbiAgY2FzZSAxOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZuKTtcbiAgY2FzZSAyOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja09uZSgpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSk7XG4gICAgfSk7XG4gIGNhc2UgMzpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUd28oKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEsIGFyZzIpO1xuICAgIH0pO1xuICBjYXNlIDQ6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrVGhyZWUoKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgIH0pO1xuICBkZWZhdWx0OlxuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBhcmdzLmxlbmd0aCkge1xuICAgICAgYXJnc1tpKytdID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2soKSB7XG4gICAgICBmbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9KTtcbiAgfVxufVxuXG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiZXhwb3J0cy5wdWJsaWNFbmNyeXB0ID0gcmVxdWlyZSgnLi9wdWJsaWNFbmNyeXB0JylcbmV4cG9ydHMucHJpdmF0ZURlY3J5cHQgPSByZXF1aXJlKCcuL3ByaXZhdGVEZWNyeXB0JylcblxuZXhwb3J0cy5wcml2YXRlRW5jcnlwdCA9IGZ1bmN0aW9uIHByaXZhdGVFbmNyeXB0IChrZXksIGJ1Zikge1xuICByZXR1cm4gZXhwb3J0cy5wdWJsaWNFbmNyeXB0KGtleSwgYnVmLCB0cnVlKVxufVxuXG5leHBvcnRzLnB1YmxpY0RlY3J5cHQgPSBmdW5jdGlvbiBwdWJsaWNEZWNyeXB0IChrZXksIGJ1Zikge1xuICByZXR1cm4gZXhwb3J0cy5wcml2YXRlRGVjcnlwdChrZXksIGJ1ZiwgdHJ1ZSlcbn1cbiIsInZhciBjcmVhdGVIYXNoID0gcmVxdWlyZSgnY3JlYXRlLWhhc2gnKVxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNlZWQsIGxlbikge1xuICB2YXIgdCA9IEJ1ZmZlci5hbGxvYygwKVxuICB2YXIgaSA9IDBcbiAgdmFyIGNcbiAgd2hpbGUgKHQubGVuZ3RoIDwgbGVuKSB7XG4gICAgYyA9IGkyb3BzKGkrKylcbiAgICB0ID0gQnVmZmVyLmNvbmNhdChbdCwgY3JlYXRlSGFzaCgnc2hhMScpLnVwZGF0ZShzZWVkKS51cGRhdGUoYykuZGlnZXN0KCldKVxuICB9XG4gIHJldHVybiB0LnNsaWNlKDAsIGxlbilcbn1cblxuZnVuY3Rpb24gaTJvcHMgKGMpIHtcbiAgdmFyIG91dCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSg0KVxuICBvdXQud3JpdGVVSW50MzJCRShjLCAwKVxuICByZXR1cm4gb3V0XG59XG4iLCJ2YXIgcGFyc2VLZXlzID0gcmVxdWlyZSgncGFyc2UtYXNuMScpXG52YXIgbWdmID0gcmVxdWlyZSgnLi9tZ2YnKVxudmFyIHhvciA9IHJlcXVpcmUoJy4veG9yJylcbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJylcbnZhciBjcnQgPSByZXF1aXJlKCdicm93c2VyaWZ5LXJzYScpXG52YXIgY3JlYXRlSGFzaCA9IHJlcXVpcmUoJ2NyZWF0ZS1oYXNoJylcbnZhciB3aXRoUHVibGljID0gcmVxdWlyZSgnLi93aXRoUHVibGljJylcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlclxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHByaXZhdGVEZWNyeXB0IChwcml2YXRlS2V5LCBlbmMsIHJldmVyc2UpIHtcbiAgdmFyIHBhZGRpbmdcbiAgaWYgKHByaXZhdGVLZXkucGFkZGluZykge1xuICAgIHBhZGRpbmcgPSBwcml2YXRlS2V5LnBhZGRpbmdcbiAgfSBlbHNlIGlmIChyZXZlcnNlKSB7XG4gICAgcGFkZGluZyA9IDFcbiAgfSBlbHNlIHtcbiAgICBwYWRkaW5nID0gNFxuICB9XG5cbiAgdmFyIGtleSA9IHBhcnNlS2V5cyhwcml2YXRlS2V5KVxuICB2YXIgayA9IGtleS5tb2R1bHVzLmJ5dGVMZW5ndGgoKVxuICBpZiAoZW5jLmxlbmd0aCA+IGsgfHwgbmV3IEJOKGVuYykuY21wKGtleS5tb2R1bHVzKSA+PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdkZWNyeXB0aW9uIGVycm9yJylcbiAgfVxuICB2YXIgbXNnXG4gIGlmIChyZXZlcnNlKSB7XG4gICAgbXNnID0gd2l0aFB1YmxpYyhuZXcgQk4oZW5jKSwga2V5KVxuICB9IGVsc2Uge1xuICAgIG1zZyA9IGNydChlbmMsIGtleSlcbiAgfVxuICB2YXIgekJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhrIC0gbXNnLmxlbmd0aClcbiAgbXNnID0gQnVmZmVyLmNvbmNhdChbekJ1ZmZlciwgbXNnXSwgaylcbiAgaWYgKHBhZGRpbmcgPT09IDQpIHtcbiAgICByZXR1cm4gb2FlcChrZXksIG1zZylcbiAgfSBlbHNlIGlmIChwYWRkaW5nID09PSAxKSB7XG4gICAgcmV0dXJuIHBrY3MxKGtleSwgbXNnLCByZXZlcnNlKVxuICB9IGVsc2UgaWYgKHBhZGRpbmcgPT09IDMpIHtcbiAgICByZXR1cm4gbXNnXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHBhZGRpbmcnKVxuICB9XG59XG5cbmZ1bmN0aW9uIG9hZXAgKGtleSwgbXNnKSB7XG4gIHZhciBrID0ga2V5Lm1vZHVsdXMuYnl0ZUxlbmd0aCgpXG4gIHZhciBpSGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTEnKS51cGRhdGUoQnVmZmVyLmFsbG9jKDApKS5kaWdlc3QoKVxuICB2YXIgaExlbiA9IGlIYXNoLmxlbmd0aFxuICBpZiAobXNnWzBdICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdkZWNyeXB0aW9uIGVycm9yJylcbiAgfVxuICB2YXIgbWFza2VkU2VlZCA9IG1zZy5zbGljZSgxLCBoTGVuICsgMSlcbiAgdmFyIG1hc2tlZERiID0gbXNnLnNsaWNlKGhMZW4gKyAxKVxuICB2YXIgc2VlZCA9IHhvcihtYXNrZWRTZWVkLCBtZ2YobWFza2VkRGIsIGhMZW4pKVxuICB2YXIgZGIgPSB4b3IobWFza2VkRGIsIG1nZihzZWVkLCBrIC0gaExlbiAtIDEpKVxuICBpZiAoY29tcGFyZShpSGFzaCwgZGIuc2xpY2UoMCwgaExlbikpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdkZWNyeXB0aW9uIGVycm9yJylcbiAgfVxuICB2YXIgaSA9IGhMZW5cbiAgd2hpbGUgKGRiW2ldID09PSAwKSB7XG4gICAgaSsrXG4gIH1cbiAgaWYgKGRiW2krK10gIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2RlY3J5cHRpb24gZXJyb3InKVxuICB9XG4gIHJldHVybiBkYi5zbGljZShpKVxufVxuXG5mdW5jdGlvbiBwa2NzMSAoa2V5LCBtc2csIHJldmVyc2UpIHtcbiAgdmFyIHAxID0gbXNnLnNsaWNlKDAsIDIpXG4gIHZhciBpID0gMlxuICB2YXIgc3RhdHVzID0gMFxuICB3aGlsZSAobXNnW2krK10gIT09IDApIHtcbiAgICBpZiAoaSA+PSBtc2cubGVuZ3RoKSB7XG4gICAgICBzdGF0dXMrK1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbiAgdmFyIHBzID0gbXNnLnNsaWNlKDIsIGkgLSAxKVxuXG4gIGlmICgocDEudG9TdHJpbmcoJ2hleCcpICE9PSAnMDAwMicgJiYgIXJldmVyc2UpIHx8IChwMS50b1N0cmluZygnaGV4JykgIT09ICcwMDAxJyAmJiByZXZlcnNlKSkge1xuICAgIHN0YXR1cysrXG4gIH1cbiAgaWYgKHBzLmxlbmd0aCA8IDgpIHtcbiAgICBzdGF0dXMrK1xuICB9XG4gIGlmIChzdGF0dXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2RlY3J5cHRpb24gZXJyb3InKVxuICB9XG4gIHJldHVybiBtc2cuc2xpY2UoaSlcbn1cbmZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgYSA9IEJ1ZmZlci5mcm9tKGEpXG4gIGIgPSBCdWZmZXIuZnJvbShiKVxuICB2YXIgZGlmID0gMFxuICB2YXIgbGVuID0gYS5sZW5ndGhcbiAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgIGRpZisrXG4gICAgbGVuID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKVxuICB9XG4gIHZhciBpID0gLTFcbiAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgIGRpZiArPSAoYVtpXSBeIGJbaV0pXG4gIH1cbiAgcmV0dXJuIGRpZlxufVxuIiwidmFyIHBhcnNlS2V5cyA9IHJlcXVpcmUoJ3BhcnNlLWFzbjEnKVxudmFyIHJhbmRvbUJ5dGVzID0gcmVxdWlyZSgncmFuZG9tYnl0ZXMnKVxudmFyIGNyZWF0ZUhhc2ggPSByZXF1aXJlKCdjcmVhdGUtaGFzaCcpXG52YXIgbWdmID0gcmVxdWlyZSgnLi9tZ2YnKVxudmFyIHhvciA9IHJlcXVpcmUoJy4veG9yJylcbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJylcbnZhciB3aXRoUHVibGljID0gcmVxdWlyZSgnLi93aXRoUHVibGljJylcbnZhciBjcnQgPSByZXF1aXJlKCdicm93c2VyaWZ5LXJzYScpXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwdWJsaWNFbmNyeXB0IChwdWJsaWNLZXksIG1zZywgcmV2ZXJzZSkge1xuICB2YXIgcGFkZGluZ1xuICBpZiAocHVibGljS2V5LnBhZGRpbmcpIHtcbiAgICBwYWRkaW5nID0gcHVibGljS2V5LnBhZGRpbmdcbiAgfSBlbHNlIGlmIChyZXZlcnNlKSB7XG4gICAgcGFkZGluZyA9IDFcbiAgfSBlbHNlIHtcbiAgICBwYWRkaW5nID0gNFxuICB9XG4gIHZhciBrZXkgPSBwYXJzZUtleXMocHVibGljS2V5KVxuICB2YXIgcGFkZGVkTXNnXG4gIGlmIChwYWRkaW5nID09PSA0KSB7XG4gICAgcGFkZGVkTXNnID0gb2FlcChrZXksIG1zZylcbiAgfSBlbHNlIGlmIChwYWRkaW5nID09PSAxKSB7XG4gICAgcGFkZGVkTXNnID0gcGtjczEoa2V5LCBtc2csIHJldmVyc2UpXG4gIH0gZWxzZSBpZiAocGFkZGluZyA9PT0gMykge1xuICAgIHBhZGRlZE1zZyA9IG5ldyBCTihtc2cpXG4gICAgaWYgKHBhZGRlZE1zZy5jbXAoa2V5Lm1vZHVsdXMpID49IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZGF0YSB0b28gbG9uZyBmb3IgbW9kdWx1cycpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBwYWRkaW5nJylcbiAgfVxuICBpZiAocmV2ZXJzZSkge1xuICAgIHJldHVybiBjcnQocGFkZGVkTXNnLCBrZXkpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHdpdGhQdWJsaWMocGFkZGVkTXNnLCBrZXkpXG4gIH1cbn1cblxuZnVuY3Rpb24gb2FlcCAoa2V5LCBtc2cpIHtcbiAgdmFyIGsgPSBrZXkubW9kdWx1cy5ieXRlTGVuZ3RoKClcbiAgdmFyIG1MZW4gPSBtc2cubGVuZ3RoXG4gIHZhciBpSGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTEnKS51cGRhdGUoQnVmZmVyLmFsbG9jKDApKS5kaWdlc3QoKVxuICB2YXIgaExlbiA9IGlIYXNoLmxlbmd0aFxuICB2YXIgaExlbjIgPSAyICogaExlblxuICBpZiAobUxlbiA+IGsgLSBoTGVuMiAtIDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UgdG9vIGxvbmcnKVxuICB9XG4gIHZhciBwcyA9IEJ1ZmZlci5hbGxvYyhrIC0gbUxlbiAtIGhMZW4yIC0gMilcbiAgdmFyIGRibGVuID0gayAtIGhMZW4gLSAxXG4gIHZhciBzZWVkID0gcmFuZG9tQnl0ZXMoaExlbilcbiAgdmFyIG1hc2tlZERiID0geG9yKEJ1ZmZlci5jb25jYXQoW2lIYXNoLCBwcywgQnVmZmVyLmFsbG9jKDEsIDEpLCBtc2ddLCBkYmxlbiksIG1nZihzZWVkLCBkYmxlbikpXG4gIHZhciBtYXNrZWRTZWVkID0geG9yKHNlZWQsIG1nZihtYXNrZWREYiwgaExlbikpXG4gIHJldHVybiBuZXcgQk4oQnVmZmVyLmNvbmNhdChbQnVmZmVyLmFsbG9jKDEpLCBtYXNrZWRTZWVkLCBtYXNrZWREYl0sIGspKVxufVxuZnVuY3Rpb24gcGtjczEgKGtleSwgbXNnLCByZXZlcnNlKSB7XG4gIHZhciBtTGVuID0gbXNnLmxlbmd0aFxuICB2YXIgayA9IGtleS5tb2R1bHVzLmJ5dGVMZW5ndGgoKVxuICBpZiAobUxlbiA+IGsgLSAxMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWVzc2FnZSB0b28gbG9uZycpXG4gIH1cbiAgdmFyIHBzXG4gIGlmIChyZXZlcnNlKSB7XG4gICAgcHMgPSBCdWZmZXIuYWxsb2MoayAtIG1MZW4gLSAzLCAweGZmKVxuICB9IGVsc2Uge1xuICAgIHBzID0gbm9uWmVybyhrIC0gbUxlbiAtIDMpXG4gIH1cbiAgcmV0dXJuIG5ldyBCTihCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbShbMCwgcmV2ZXJzZSA/IDEgOiAyXSksIHBzLCBCdWZmZXIuYWxsb2MoMSksIG1zZ10sIGspKVxufVxuZnVuY3Rpb24gbm9uWmVybyAobGVuKSB7XG4gIHZhciBvdXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuKVxuICB2YXIgaSA9IDBcbiAgdmFyIGNhY2hlID0gcmFuZG9tQnl0ZXMobGVuICogMilcbiAgdmFyIGN1ciA9IDBcbiAgdmFyIG51bVxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIGlmIChjdXIgPT09IGNhY2hlLmxlbmd0aCkge1xuICAgICAgY2FjaGUgPSByYW5kb21CeXRlcyhsZW4gKiAyKVxuICAgICAgY3VyID0gMFxuICAgIH1cbiAgICBudW0gPSBjYWNoZVtjdXIrK11cbiAgICBpZiAobnVtKSB7XG4gICAgICBvdXRbaSsrXSA9IG51bVxuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0XG59XG4iLCJ2YXIgQk4gPSByZXF1aXJlKCdibi5qcycpXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcblxuZnVuY3Rpb24gd2l0aFB1YmxpYyAocGFkZGVkTXNnLCBrZXkpIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHBhZGRlZE1zZ1xuICAgIC50b1JlZChCTi5tb250KGtleS5tb2R1bHVzKSlcbiAgICAucmVkUG93KG5ldyBCTihrZXkucHVibGljRXhwb25lbnQpKVxuICAgIC5mcm9tUmVkKClcbiAgICAudG9BcnJheSgpKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHdpdGhQdWJsaWNcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24geG9yIChhLCBiKSB7XG4gIHZhciBsZW4gPSBhLmxlbmd0aFxuICB2YXIgaSA9IC0xXG4gIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICBhW2ldIF49IGJbaV1cbiAgfVxuICByZXR1cm4gYVxufVxuIiwidmFyIG5vdyA9IHJlcXVpcmUoJ3BlcmZvcm1hbmNlLW5vdycpXG4gICwgcm9vdCA9IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogd2luZG93XG4gICwgdmVuZG9ycyA9IFsnbW96JywgJ3dlYmtpdCddXG4gICwgc3VmZml4ID0gJ0FuaW1hdGlvbkZyYW1lJ1xuICAsIHJhZiA9IHJvb3RbJ3JlcXVlc3QnICsgc3VmZml4XVxuICAsIGNhZiA9IHJvb3RbJ2NhbmNlbCcgKyBzdWZmaXhdIHx8IHJvb3RbJ2NhbmNlbFJlcXVlc3QnICsgc3VmZml4XVxuXG5mb3IodmFyIGkgPSAwOyAhcmFmICYmIGkgPCB2ZW5kb3JzLmxlbmd0aDsgaSsrKSB7XG4gIHJhZiA9IHJvb3RbdmVuZG9yc1tpXSArICdSZXF1ZXN0JyArIHN1ZmZpeF1cbiAgY2FmID0gcm9vdFt2ZW5kb3JzW2ldICsgJ0NhbmNlbCcgKyBzdWZmaXhdXG4gICAgICB8fCByb290W3ZlbmRvcnNbaV0gKyAnQ2FuY2VsUmVxdWVzdCcgKyBzdWZmaXhdXG59XG5cbi8vIFNvbWUgdmVyc2lvbnMgb2YgRkYgaGF2ZSByQUYgYnV0IG5vdCBjQUZcbmlmKCFyYWYgfHwgIWNhZikge1xuICB2YXIgbGFzdCA9IDBcbiAgICAsIGlkID0gMFxuICAgICwgcXVldWUgPSBbXVxuICAgICwgZnJhbWVEdXJhdGlvbiA9IDEwMDAgLyA2MFxuXG4gIHJhZiA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgaWYocXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB2YXIgX25vdyA9IG5vdygpXG4gICAgICAgICwgbmV4dCA9IE1hdGgubWF4KDAsIGZyYW1lRHVyYXRpb24gLSAoX25vdyAtIGxhc3QpKVxuICAgICAgbGFzdCA9IG5leHQgKyBfbm93XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgY3AgPSBxdWV1ZS5zbGljZSgwKVxuICAgICAgICAvLyBDbGVhciBxdWV1ZSBoZXJlIHRvIHByZXZlbnRcbiAgICAgICAgLy8gY2FsbGJhY2tzIGZyb20gYXBwZW5kaW5nIGxpc3RlbmVyc1xuICAgICAgICAvLyB0byB0aGUgY3VycmVudCBmcmFtZSdzIHF1ZXVlXG4gICAgICAgIHF1ZXVlLmxlbmd0aCA9IDBcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGNwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYoIWNwW2ldLmNhbmNlbGxlZCkge1xuICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICBjcFtpXS5jYWxsYmFjayhsYXN0KVxuICAgICAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRocm93IGUgfSwgMClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIE1hdGgucm91bmQobmV4dCkpXG4gICAgfVxuICAgIHF1ZXVlLnB1c2goe1xuICAgICAgaGFuZGxlOiArK2lkLFxuICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLFxuICAgICAgY2FuY2VsbGVkOiBmYWxzZVxuICAgIH0pXG4gICAgcmV0dXJuIGlkXG4gIH1cblxuICBjYWYgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmKHF1ZXVlW2ldLmhhbmRsZSA9PT0gaGFuZGxlKSB7XG4gICAgICAgIHF1ZXVlW2ldLmNhbmNlbGxlZCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihmbikge1xuICAvLyBXcmFwIGluIGEgbmV3IGZ1bmN0aW9uIHRvIHByZXZlbnRcbiAgLy8gYGNhbmNlbGAgcG90ZW50aWFsbHkgYmVpbmcgYXNzaWduZWRcbiAgLy8gdG8gdGhlIG5hdGl2ZSByQUYgZnVuY3Rpb25cbiAgcmV0dXJuIHJhZi5jYWxsKHJvb3QsIGZuKVxufVxubW9kdWxlLmV4cG9ydHMuY2FuY2VsID0gZnVuY3Rpb24oKSB7XG4gIGNhZi5hcHBseShyb290LCBhcmd1bWVudHMpXG59XG5tb2R1bGUuZXhwb3J0cy5wb2x5ZmlsbCA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICBpZiAoIW9iamVjdCkge1xuICAgIG9iamVjdCA9IHJvb3Q7XG4gIH1cbiAgb2JqZWN0LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHJhZlxuICBvYmplY3QuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBjYWZcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5mdW5jdGlvbiBvbGRCcm93c2VyICgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdTZWN1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBicm93c2VyLlxcblVzZSBDaHJvbWUsIEZpcmVmb3ggb3IgSW50ZXJuZXQgRXhwbG9yZXIgMTEnKVxufVxuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcbnZhciBjcnlwdG8gPSBnbG9iYWwuY3J5cHRvIHx8IGdsb2JhbC5tc0NyeXB0b1xuXG5pZiAoY3J5cHRvICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByYW5kb21CeXRlc1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBvbGRCcm93c2VyXG59XG5cbmZ1bmN0aW9uIHJhbmRvbUJ5dGVzIChzaXplLCBjYikge1xuICAvLyBwaGFudG9tanMgbmVlZHMgdG8gdGhyb3dcbiAgaWYgKHNpemUgPiA2NTUzNikgdGhyb3cgbmV3IEVycm9yKCdyZXF1ZXN0ZWQgdG9vIG1hbnkgcmFuZG9tIGJ5dGVzJylcbiAgLy8gaW4gY2FzZSBicm93c2VyaWZ5ICBpc24ndCB1c2luZyB0aGUgVWludDhBcnJheSB2ZXJzaW9uXG4gIHZhciByYXdCeXRlcyA9IG5ldyBnbG9iYWwuVWludDhBcnJheShzaXplKVxuXG4gIC8vIFRoaXMgd2lsbCBub3Qgd29yayBpbiBvbGRlciBicm93c2Vycy5cbiAgLy8gU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS93aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlc1xuICBpZiAoc2l6ZSA+IDApIHsgIC8vIGdldFJhbmRvbVZhbHVlcyBmYWlscyBvbiBJRSBpZiBzaXplID09IDBcbiAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHJhd0J5dGVzKVxuICB9XG5cbiAgLy8gWFhYOiBwaGFudG9tanMgZG9lc24ndCBsaWtlIGEgYnVmZmVyIGJlaW5nIHBhc3NlZCBoZXJlXG4gIHZhciBieXRlcyA9IEJ1ZmZlci5mcm9tKHJhd0J5dGVzLmJ1ZmZlcilcblxuICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgY2IobnVsbCwgYnl0ZXMpXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmZ1bmN0aW9uIG9sZEJyb3dzZXIgKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ3NlY3VyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gbm90IHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXJcXG51c2UgY2hyb21lLCBGaXJlRm94IG9yIEludGVybmV0IEV4cGxvcmVyIDExJylcbn1cbnZhciBzYWZlQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKVxudmFyIHJhbmRvbWJ5dGVzID0gcmVxdWlyZSgncmFuZG9tYnl0ZXMnKVxudmFyIEJ1ZmZlciA9IHNhZmVCdWZmZXIuQnVmZmVyXG52YXIga0J1ZmZlck1heExlbmd0aCA9IHNhZmVCdWZmZXIua01heExlbmd0aFxudmFyIGNyeXB0byA9IGdsb2JhbC5jcnlwdG8gfHwgZ2xvYmFsLm1zQ3J5cHRvXG52YXIga01heFVpbnQzMiA9IE1hdGgucG93KDIsIDMyKSAtIDFcbmZ1bmN0aW9uIGFzc2VydE9mZnNldCAob2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiBvZmZzZXQgIT09ICdudW1iZXInIHx8IG9mZnNldCAhPT0gb2Zmc2V0KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb2Zmc2V0IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKG9mZnNldCA+IGtNYXhVaW50MzIgfHwgb2Zmc2V0IDwgMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29mZnNldCBtdXN0IGJlIGEgdWludDMyJylcbiAgfVxuXG4gIGlmIChvZmZzZXQgPiBrQnVmZmVyTWF4TGVuZ3RoIHx8IG9mZnNldCA+IGxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgb3V0IG9mIHJhbmdlJylcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplLCBvZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInIHx8IHNpemUgIT09IHNpemUpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzaXplIG11c3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKHNpemUgPiBrTWF4VWludDMyIHx8IHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2l6ZSBtdXN0IGJlIGEgdWludDMyJylcbiAgfVxuXG4gIGlmIChzaXplICsgb2Zmc2V0ID4gbGVuZ3RoIHx8IHNpemUgPiBrQnVmZmVyTWF4TGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2J1ZmZlciB0b28gc21hbGwnKVxuICB9XG59XG5pZiAoKGNyeXB0byAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKSB8fCAhcHJvY2Vzcy5icm93c2VyKSB7XG4gIGV4cG9ydHMucmFuZG9tRmlsbCA9IHJhbmRvbUZpbGxcbiAgZXhwb3J0cy5yYW5kb21GaWxsU3luYyA9IHJhbmRvbUZpbGxTeW5jXG59IGVsc2Uge1xuICBleHBvcnRzLnJhbmRvbUZpbGwgPSBvbGRCcm93c2VyXG4gIGV4cG9ydHMucmFuZG9tRmlsbFN5bmMgPSBvbGRCcm93c2VyXG59XG5mdW5jdGlvbiByYW5kb21GaWxsIChidWYsIG9mZnNldCwgc2l6ZSwgY2IpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSAmJiAhKGJ1ZiBpbnN0YW5jZW9mIGdsb2JhbC5VaW50OEFycmF5KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBvciBVaW50OEFycmF5JylcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBvZmZzZXRcbiAgICBvZmZzZXQgPSAwXG4gICAgc2l6ZSA9IGJ1Zi5sZW5ndGhcbiAgfSBlbHNlIGlmICh0eXBlb2Ygc2l6ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gc2l6ZVxuICAgIHNpemUgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJjYlwiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpXG4gIH1cbiAgYXNzZXJ0T2Zmc2V0KG9mZnNldCwgYnVmLmxlbmd0aClcbiAgYXNzZXJ0U2l6ZShzaXplLCBvZmZzZXQsIGJ1Zi5sZW5ndGgpXG4gIHJldHVybiBhY3R1YWxGaWxsKGJ1Ziwgb2Zmc2V0LCBzaXplLCBjYilcbn1cblxuZnVuY3Rpb24gYWN0dWFsRmlsbCAoYnVmLCBvZmZzZXQsIHNpemUsIGNiKSB7XG4gIGlmIChwcm9jZXNzLmJyb3dzZXIpIHtcbiAgICB2YXIgb3VyQnVmID0gYnVmLmJ1ZmZlclxuICAgIHZhciB1aW50ID0gbmV3IFVpbnQ4QXJyYXkob3VyQnVmLCBvZmZzZXQsIHNpemUpXG4gICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyh1aW50KVxuICAgIGlmIChjYikge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNiKG51bGwsIGJ1ZilcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcmV0dXJuIGJ1ZlxuICB9XG4gIGlmIChjYikge1xuICAgIHJhbmRvbWJ5dGVzKHNpemUsIGZ1bmN0aW9uIChlcnIsIGJ5dGVzKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBjYihlcnIpXG4gICAgICB9XG4gICAgICBieXRlcy5jb3B5KGJ1Ziwgb2Zmc2V0KVxuICAgICAgY2IobnVsbCwgYnVmKVxuICAgIH0pXG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIGJ5dGVzID0gcmFuZG9tYnl0ZXMoc2l6ZSlcbiAgYnl0ZXMuY29weShidWYsIG9mZnNldClcbiAgcmV0dXJuIGJ1ZlxufVxuZnVuY3Rpb24gcmFuZG9tRmlsbFN5bmMgKGJ1Ziwgb2Zmc2V0LCBzaXplKSB7XG4gIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAndW5kZWZpbmVkJykge1xuICAgIG9mZnNldCA9IDBcbiAgfVxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpICYmICEoYnVmIGluc3RhbmNlb2YgZ2xvYmFsLlVpbnQ4QXJyYXkpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIG9yIFVpbnQ4QXJyYXknKVxuICB9XG5cbiAgYXNzZXJ0T2Zmc2V0KG9mZnNldCwgYnVmLmxlbmd0aClcblxuICBpZiAoc2l6ZSA9PT0gdW5kZWZpbmVkKSBzaXplID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuXG4gIGFzc2VydFNpemUoc2l6ZSwgb2Zmc2V0LCBidWYubGVuZ3RoKVxuXG4gIHJldHVybiBhY3R1YWxGaWxsKGJ1Ziwgb2Zmc2V0LCBzaXplKVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX2R1cGxleC5qcycpO1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgZHVwbGV4IHN0cmVhbSBpcyBqdXN0IGEgc3RyZWFtIHRoYXQgaXMgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUuXG4vLyBTaW5jZSBKUyBkb2Vzbid0IGhhdmUgbXVsdGlwbGUgcHJvdG90eXBhbCBpbmhlcml0YW5jZSwgdGhpcyBjbGFzc1xuLy8gcHJvdG90eXBhbGx5IGluaGVyaXRzIGZyb20gUmVhZGFibGUsIGFuZCB0aGVuIHBhcmFzaXRpY2FsbHkgZnJvbVxuLy8gV3JpdGFibGUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHBuYSA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAga2V5cy5wdXNoKGtleSk7XG4gIH1yZXR1cm4ga2V5cztcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxubW9kdWxlLmV4cG9ydHMgPSBEdXBsZXg7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFJlYWRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3JlYWRhYmxlJyk7XG52YXIgV3JpdGFibGUgPSByZXF1aXJlKCcuL19zdHJlYW1fd3JpdGFibGUnKTtcblxudXRpbC5pbmhlcml0cyhEdXBsZXgsIFJlYWRhYmxlKTtcblxue1xuICAvLyBhdm9pZCBzY29wZSBjcmVlcCwgdGhlIGtleXMgYXJyYXkgY2FuIHRoZW4gYmUgY29sbGVjdGVkXG4gIHZhciBrZXlzID0gb2JqZWN0S2V5cyhXcml0YWJsZS5wcm90b3R5cGUpO1xuICBmb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgICB2YXIgbWV0aG9kID0ga2V5c1t2XTtcbiAgICBpZiAoIUR1cGxleC5wcm90b3R5cGVbbWV0aG9kXSkgRHVwbGV4LnByb3RvdHlwZVttZXRob2RdID0gV3JpdGFibGUucHJvdG90eXBlW21ldGhvZF07XG4gIH1cbn1cblxuZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgRHVwbGV4KG9wdGlvbnMpO1xuXG4gIFJlYWRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIFdyaXRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZWFkYWJsZSA9PT0gZmFsc2UpIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLndyaXRhYmxlID09PSBmYWxzZSkgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuXG4gIHRoaXMuYWxsb3dIYWxmT3BlbiA9IHRydWU7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UpIHRoaXMuYWxsb3dIYWxmT3BlbiA9IGZhbHNlO1xuXG4gIHRoaXMub25jZSgnZW5kJywgb25lbmQpO1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRHVwbGV4LnByb3RvdHlwZSwgJ3dyaXRhYmxlSGlnaFdhdGVyTWFyaycsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgfVxufSk7XG5cbi8vIHRoZSBuby1oYWxmLW9wZW4gZW5mb3JjZXJcbmZ1bmN0aW9uIG9uZW5kKCkge1xuICAvLyBpZiB3ZSBhbGxvdyBoYWxmLW9wZW4gc3RhdGUsIG9yIGlmIHRoZSB3cml0YWJsZSBzaWRlIGVuZGVkLFxuICAvLyB0aGVuIHdlJ3JlIG9rLlxuICBpZiAodGhpcy5hbGxvd0hhbGZPcGVuIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQpIHJldHVybjtcblxuICAvLyBubyBtb3JlIGRhdGEgY2FuIGJlIHdyaXR0ZW4uXG4gIC8vIEJ1dCBhbGxvdyBtb3JlIHdyaXRlcyB0byBoYXBwZW4gaW4gdGhpcyB0aWNrLlxuICBwbmEubmV4dFRpY2sob25FbmROVCwgdGhpcyk7XG59XG5cbmZ1bmN0aW9uIG9uRW5kTlQoc2VsZikge1xuICBzZWxmLmVuZCgpO1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRHVwbGV4LnByb3RvdHlwZSwgJ2Rlc3Ryb3llZCcsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHlcbiAgICAvLyBtYW5hZ2luZyBkZXN0cm95ZWRcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gIH1cbn0pO1xuXG5EdXBsZXgucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdGhpcy5wdXNoKG51bGwpO1xuICB0aGlzLmVuZCgpO1xuXG4gIHBuYS5uZXh0VGljayhjYiwgZXJyKTtcbn07IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgcGFzc3Rocm91Z2ggc3RyZWFtLlxuLy8gYmFzaWNhbGx5IGp1c3QgdGhlIG1vc3QgbWluaW1hbCBzb3J0IG9mIFRyYW5zZm9ybSBzdHJlYW0uXG4vLyBFdmVyeSB3cml0dGVuIGNodW5rIGdldHMgb3V0cHV0IGFzLWlzLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUGFzc1Rocm91Z2g7XG5cbnZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCcuL19zdHJlYW1fdHJhbnNmb3JtJyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudXRpbC5pbmhlcml0cyhQYXNzVGhyb3VnaCwgVHJhbnNmb3JtKTtcblxuZnVuY3Rpb24gUGFzc1Rocm91Z2gob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUGFzc1Rocm91Z2gpKSByZXR1cm4gbmV3IFBhc3NUaHJvdWdoKG9wdGlvbnMpO1xuXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xufVxuXG5QYXNzVGhyb3VnaC5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG51bGwsIGNodW5rKTtcbn07IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHBuYSA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFkYWJsZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRHVwbGV4O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblJlYWRhYmxlLlJlYWRhYmxlU3RhdGUgPSBSZWFkYWJsZVN0YXRlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuXG52YXIgRUVsaXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aDtcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIE91clVpbnQ4QXJyYXkgPSBnbG9iYWwuVWludDhBcnJheSB8fCBmdW5jdGlvbiAoKSB7fTtcbmZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNodW5rKTtcbn1cbmZ1bmN0aW9uIF9pc1VpbnQ4QXJyYXkob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5O1xufVxuXG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGRlYnVnVXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBkZWJ1ZyA9IHZvaWQgMDtcbmlmIChkZWJ1Z1V0aWwgJiYgZGVidWdVdGlsLmRlYnVnbG9nKSB7XG4gIGRlYnVnID0gZGVidWdVdGlsLmRlYnVnbG9nKCdzdHJlYW0nKTtcbn0gZWxzZSB7XG4gIGRlYnVnID0gZnVuY3Rpb24gKCkge307XG59XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlckxpc3QgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvQnVmZmVyTGlzdCcpO1xudmFyIGRlc3Ryb3lJbXBsID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3knKTtcbnZhciBTdHJpbmdEZWNvZGVyO1xuXG51dGlsLmluaGVyaXRzKFJlYWRhYmxlLCBTdHJlYW0pO1xuXG52YXIga1Byb3h5RXZlbnRzID0gWydlcnJvcicsICdjbG9zZScsICdkZXN0cm95JywgJ3BhdXNlJywgJ3Jlc3VtZSddO1xuXG5mdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuKSB7XG4gIC8vIFNhZGx5IHRoaXMgaXMgbm90IGNhY2hlYWJsZSBhcyBzb21lIGxpYnJhcmllcyBidW5kbGUgdGhlaXIgb3duXG4gIC8vIGV2ZW50IGVtaXR0ZXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGVtLlxuICBpZiAodHlwZW9mIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIoZXZlbnQsIGZuKTtcblxuICAvLyBUaGlzIGlzIGEgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgYW55XG4gIC8vIHVzZXJsYW5kIG9uZXMuICBORVZFUiBETyBUSElTLiBUaGlzIGlzIGhlcmUgb25seSBiZWNhdXNlIHRoaXMgY29kZSBuZWVkc1xuICAvLyB0byBjb250aW51ZSB0byB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgTm9kZS5qcyB0aGF0IGRvIG5vdCBpbmNsdWRlXG4gIC8vIHRoZSBwcmVwZW5kTGlzdGVuZXIoKSBtZXRob2QuIFRoZSBnb2FsIGlzIHRvIGV2ZW50dWFsbHkgcmVtb3ZlIHRoaXMgaGFjay5cbiAgaWYgKCFlbWl0dGVyLl9ldmVudHMgfHwgIWVtaXR0ZXIuX2V2ZW50c1tldmVudF0pIGVtaXR0ZXIub24oZXZlbnQsIGZuKTtlbHNlIGlmIChpc0FycmF5KGVtaXR0ZXIuX2V2ZW50c1tldmVudF0pKSBlbWl0dGVyLl9ldmVudHNbZXZlbnRdLnVuc2hpZnQoZm4pO2Vsc2UgZW1pdHRlci5fZXZlbnRzW2V2ZW50XSA9IFtmbiwgZW1pdHRlci5fZXZlbnRzW2V2ZW50XV07XG59XG5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gRHVwbGV4IHN0cmVhbXMgYXJlIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLCBidXQgc2hhcmVcbiAgLy8gdGhlIHNhbWUgb3B0aW9ucyBvYmplY3QuXG4gIC8vIEhvd2V2ZXIsIHNvbWUgY2FzZXMgcmVxdWlyZSBzZXR0aW5nIG9wdGlvbnMgdG8gZGlmZmVyZW50XG4gIC8vIHZhbHVlcyBmb3IgdGhlIHJlYWRhYmxlIGFuZCB0aGUgd3JpdGFibGUgc2lkZXMgb2YgdGhlIGR1cGxleCBzdHJlYW0uXG4gIC8vIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkgYXMgcmVhZGFibGVYWFggYW5kIHdyaXRhYmxlWFhYLlxuICB2YXIgaXNEdXBsZXggPSBzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXg7XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnLiBVc2VkIHRvIG1ha2UgcmVhZChuKSBpZ25vcmUgbiBhbmQgdG9cbiAgLy8gbWFrZSBhbGwgdGhlIGJ1ZmZlciBtZXJnaW5nIGFuZCBsZW5ndGggY2hlY2tzIGdvIGF3YXlcbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKGlzRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciByZWFkYWJsZUh3bSA9IG9wdGlvbnMucmVhZGFibGVIaWdoV2F0ZXJNYXJrO1xuICB2YXIgZGVmYXVsdEh3bSA9IHRoaXMub2JqZWN0TW9kZSA/IDE2IDogMTYgKiAxMDI0O1xuXG4gIGlmIChod20gfHwgaHdtID09PSAwKSB0aGlzLmhpZ2hXYXRlck1hcmsgPSBod207ZWxzZSBpZiAoaXNEdXBsZXggJiYgKHJlYWRhYmxlSHdtIHx8IHJlYWRhYmxlSHdtID09PSAwKSkgdGhpcy5oaWdoV2F0ZXJNYXJrID0gcmVhZGFibGVId207ZWxzZSB0aGlzLmhpZ2hXYXRlck1hcmsgPSBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gTWF0aC5mbG9vcih0aGlzLmhpZ2hXYXRlck1hcmspO1xuXG4gIC8vIEEgbGlua2VkIGxpc3QgaXMgdXNlZCB0byBzdG9yZSBkYXRhIGNodW5rcyBpbnN0ZWFkIG9mIGFuIGFycmF5IGJlY2F1c2UgdGhlXG4gIC8vIGxpbmtlZCBsaXN0IGNhbiByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgYmVnaW5uaW5nIGZhc3RlciB0aGFuXG4gIC8vIGFycmF5LnNoaWZ0KClcbiAgdGhpcy5idWZmZXIgPSBuZXcgQnVmZmVyTGlzdCgpO1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucGlwZXMgPSBudWxsO1xuICB0aGlzLnBpcGVzQ291bnQgPSAwO1xuICB0aGlzLmZsb3dpbmcgPSBudWxsO1xuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIHRoaXMuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYWRpbmcgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBldmVudCAncmVhZGFibGUnLydkYXRhJyBpcyBlbWl0dGVkXG4gIC8vIGltbWVkaWF0ZWx5LCBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlXG4gIC8vIGFueSBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCByZWFkIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gd2hlbmV2ZXIgd2UgcmV0dXJuIG51bGwsIHRoZW4gd2Ugc2V0IGEgZmxhZyB0byBzYXlcbiAgLy8gdGhhdCB3ZSdyZSBhd2FpdGluZyBhICdyZWFkYWJsZScgZXZlbnQgZW1pc3Npb24uXG4gIHRoaXMubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZTtcbiAgdGhpcy5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAvLyBoYXMgaXQgYmVlbiBkZXN0cm95ZWRcbiAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcblxuICAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JztcblxuICAvLyB0aGUgbnVtYmVyIG9mIHdyaXRlcnMgdGhhdCBhcmUgYXdhaXRpbmcgYSBkcmFpbiBldmVudCBpbiAucGlwZSgpc1xuICB0aGlzLmF3YWl0RHJhaW4gPSAwO1xuXG4gIC8vIGlmIHRydWUsIGEgbWF5YmVSZWFkTW9yZSBoYXMgYmVlbiBzY2hlZHVsZWRcbiAgdGhpcy5yZWFkaW5nTW9yZSA9IGZhbHNlO1xuXG4gIHRoaXMuZGVjb2RlciA9IG51bGw7XG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsO1xuICBpZiAob3B0aW9ucy5lbmNvZGluZykge1xuICAgIGlmICghU3RyaW5nRGVjb2RlcikgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyLycpLlN0cmluZ0RlY29kZXI7XG4gICAgdGhpcy5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIob3B0aW9ucy5lbmNvZGluZyk7XG4gICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuZW5jb2Rpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gUmVhZGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5yZWFkID09PSAnZnVuY3Rpb24nKSB0aGlzLl9yZWFkID0gb3B0aW9ucy5yZWFkO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHRoaXMuX2Rlc3Ryb3kgPSBvcHRpb25zLmRlc3Ryb3k7XG4gIH1cblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgJ2Rlc3Ryb3llZCcsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgLy8gd2UgaWdub3JlIHRoZSB2YWx1ZSBpZiB0aGUgc3RyZWFtXG4gICAgLy8gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldFxuICAgIGlmICghdGhpcy5fcmVhZGFibGVTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHlcbiAgICAvLyBtYW5hZ2luZyBkZXN0cm95ZWRcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICB9XG59KTtcblxuUmVhZGFibGUucHJvdG90eXBlLmRlc3Ryb3kgPSBkZXN0cm95SW1wbC5kZXN0cm95O1xuUmVhZGFibGUucHJvdG90eXBlLl91bmRlc3Ryb3kgPSBkZXN0cm95SW1wbC51bmRlc3Ryb3k7XG5SZWFkYWJsZS5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICB0aGlzLnB1c2gobnVsbCk7XG4gIGNiKGVycik7XG59O1xuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHNraXBDaHVua0NoZWNrO1xuXG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuY29kaW5nIHx8IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcbiAgICAgIGlmIChlbmNvZGluZyAhPT0gc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgICBlbmNvZGluZyA9ICcnO1xuICAgICAgfVxuICAgICAgc2tpcENodW5rQ2hlY2sgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBza2lwQ2h1bmtDaGVjayA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBjaHVuaywgZW5jb2RpbmcsIGZhbHNlLCBza2lwQ2h1bmtDaGVjayk7XG59O1xuXG4vLyBVbnNoaWZ0IHNob3VsZCAqYWx3YXlzKiBiZSBzb21ldGhpbmcgZGlyZWN0bHkgb3V0IG9mIHJlYWQoKVxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgY2h1bmssIG51bGwsIHRydWUsIGZhbHNlKTtcbn07XG5cbmZ1bmN0aW9uIHJlYWRhYmxlQWRkQ2h1bmsoc3RyZWFtLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQsIHNraXBDaHVua0NoZWNrKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGVyO1xuICAgIGlmICghc2tpcENodW5rQ2hlY2spIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gICAgaWYgKGVyKSB7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rICYmIGNodW5rLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmICFzdGF0ZS5vYmplY3RNb2RlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihjaHVuaykgIT09IEJ1ZmZlci5wcm90b3R5cGUpIHtcbiAgICAgICAgY2h1bmsgPSBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFkZFRvRnJvbnQpIHtcbiAgICAgICAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignc3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQnKSk7ZWxzZSBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgdHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZGVkKSB7XG4gICAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFlbmNvZGluZykge1xuICAgICAgICAgIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG4gICAgICAgICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsubGVuZ3RoICE9PSAwKSBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZmFsc2UpO2Vsc2UgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghYWRkVG9Gcm9udCkge1xuICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkTW9yZURhdGEoc3RhdGUpO1xufVxuXG5mdW5jdGlvbiBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgYWRkVG9Gcm9udCkge1xuICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLnN5bmMpIHtcbiAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB1cGRhdGUgdGhlIGJ1ZmZlciBpbmZvLlxuICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICBpZiAoYWRkVG9Gcm9udCkgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspO2Vsc2Ugc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuXG4gICAgaWYgKHN0YXRlLm5lZWRSZWFkYWJsZSkgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG4gIH1cbiAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXI7XG4gIGlmICghX2lzVWludDhBcnJheShjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgcmV0dXJuIGVyO1xufVxuXG4vLyBpZiBpdCdzIHBhc3QgdGhlIGhpZ2ggd2F0ZXIgbWFyaywgd2UgY2FuIHB1c2ggaW4gc29tZSBtb3JlLlxuLy8gQWxzbywgaWYgd2UgaGF2ZSBubyBkYXRhIHlldCwgd2UgY2FuIHN0YW5kIHNvbWVcbi8vIG1vcmUgYnl0ZXMuICBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGNhc2VzIHdoZXJlIGh3bT0wLFxuLy8gc3VjaCBhcyB0aGUgcmVwbC4gIEFsc28sIGlmIHRoZSBwdXNoKCkgdHJpZ2dlcmVkIGFcbi8vIHJlYWRhYmxlIGV2ZW50LCBhbmQgdGhlIHVzZXIgY2FsbGVkIHJlYWQobGFyZ2VOdW1iZXIpIHN1Y2ggdGhhdFxuLy8gbmVlZFJlYWRhYmxlIHdhcyBzZXQsIHRoZW4gd2Ugb3VnaHQgdG8gcHVzaCBtb3JlLCBzbyB0aGF0IGFub3RoZXJcbi8vICdyZWFkYWJsZScgZXZlbnQgd2lsbCBiZSB0cmlnZ2VyZWQuXG5mdW5jdGlvbiBuZWVkTW9yZURhdGEoc3RhdGUpIHtcbiAgcmV0dXJuICFzdGF0ZS5lbmRlZCAmJiAoc3RhdGUubmVlZFJlYWRhYmxlIHx8IHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgc3RhdGUubGVuZ3RoID09PSAwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLmlzUGF1c2VkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID09PSBmYWxzZTtcbn07XG5cbi8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24gKGVuYykge1xuICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihlbmMpO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gZW5jO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIERvbid0IHJhaXNlIHRoZSBod20gPiA4TUJcbnZhciBNQVhfSFdNID0gMHg4MDAwMDA7XG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyIHRvIHByZXZlbnQgaW5jcmVhc2luZyBod20gZXhjZXNzaXZlbHkgaW5cbiAgICAvLyB0aW55IGFtb3VudHNcbiAgICBuLS07XG4gICAgbiB8PSBuID4+PiAxO1xuICAgIG4gfD0gbiA+Pj4gMjtcbiAgICBuIHw9IG4gPj4+IDQ7XG4gICAgbiB8PSBuID4+PiA4O1xuICAgIG4gfD0gbiA+Pj4gMTY7XG4gICAgbisrO1xuICB9XG4gIHJldHVybiBuO1xufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKG4gPD0gMCB8fCBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIHJldHVybiAwO1xuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0dXJuIDE7XG4gIGlmIChuICE9PSBuKSB7XG4gICAgLy8gT25seSBmbG93IG9uZSBidWZmZXIgYXQgYSB0aW1lXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg7ZWxzZSByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICB9XG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSBjdXJyZW50IGh3bSwgdGhlbiByYWlzZSB0aGUgaHdtLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcbiAgaWYgKG4gPD0gc3RhdGUubGVuZ3RoKSByZXR1cm4gbjtcbiAgLy8gRG9uJ3QgaGF2ZSBlbm91Z2hcbiAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbn1cblxuLy8geW91IGNhbiBvdmVycmlkZSBlaXRoZXIgdGhpcyBtZXRob2QsIG9yIHRoZSBhc3luYyBfcmVhZChuKSBiZWxvdy5cblJlYWRhYmxlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgZGVidWcoJ3JlYWQnLCBuKTtcbiAgbiA9IHBhcnNlSW50KG4sIDEwKTtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIG5PcmlnID0gbjtcblxuICBpZiAobiAhPT0gMCkgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG5cbiAgLy8gaWYgd2UncmUgZG9pbmcgcmVhZCgwKSB0byB0cmlnZ2VyIGEgcmVhZGFibGUgZXZlbnQsIGJ1dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYSBidW5jaCBvZiBkYXRhIGluIHRoZSBidWZmZXIsIHRoZW4ganVzdCB0cmlnZ2VyXG4gIC8vIHRoZSAncmVhZGFibGUnIGV2ZW50IGFuZCBtb3ZlIG9uLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5uZWVkUmVhZGFibGUgJiYgKHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIGRlYnVnKCdyZWFkOiBlbWl0UmVhZGFibGUnLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLmVuZGVkKTtcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSBlbmRSZWFkYWJsZSh0aGlzKTtlbHNlIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBbGwgdGhlIGFjdHVhbCBjaHVuayBnZW5lcmF0aW9uIGxvZ2ljIG5lZWRzIHRvIGJlXG4gIC8vICpiZWxvdyogdGhlIGNhbGwgdG8gX3JlYWQuICBUaGUgcmVhc29uIGlzIHRoYXQgaW4gY2VydGFpblxuICAvLyBzeW50aGV0aWMgc3RyZWFtIGNhc2VzLCBzdWNoIGFzIHBhc3N0aHJvdWdoIHN0cmVhbXMsIF9yZWFkXG4gIC8vIG1heSBiZSBhIGNvbXBsZXRlbHkgc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2VcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSByZWFkIGJ1ZmZlciwgcHJvdmlkaW5nIGVub3VnaCBkYXRhIHdoZW5cbiAgLy8gYmVmb3JlIHRoZXJlIHdhcyAqbm90KiBlbm91Z2guXG4gIC8vXG4gIC8vIFNvLCB0aGUgc3RlcHMgYXJlOlxuICAvLyAxLiBGaWd1cmUgb3V0IHdoYXQgdGhlIHN0YXRlIG9mIHRoaW5ncyB3aWxsIGJlIGFmdGVyIHdlIGRvXG4gIC8vIGEgcmVhZCBmcm9tIHRoZSBidWZmZXIuXG4gIC8vXG4gIC8vIDIuIElmIHRoYXQgcmVzdWx0aW5nIHN0YXRlIHdpbGwgdHJpZ2dlciBhIF9yZWFkLCB0aGVuIGNhbGwgX3JlYWQuXG4gIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBhc3luY2hyb25vdXMsIG9yIHN5bmNocm9ub3VzLiAgWWVzLCBpdCBpc1xuICAvLyBkZWVwbHkgdWdseSB0byB3cml0ZSBBUElzIHRoaXMgd2F5LCBidXQgdGhhdCBzdGlsbCBkb2Vzbid0IG1lYW5cbiAgLy8gdGhhdCB0aGUgUmVhZGFibGUgY2xhc3Mgc2hvdWxkIGJlaGF2ZSBpbXByb3Blcmx5LCBhcyBzdHJlYW1zIGFyZVxuICAvLyBkZXNpZ25lZCB0byBiZSBzeW5jL2FzeW5jIGFnbm9zdGljLlxuICAvLyBUYWtlIG5vdGUgaWYgdGhlIF9yZWFkIGNhbGwgaXMgc3luYyBvciBhc3luYyAoaWUsIGlmIHRoZSByZWFkIGNhbGxcbiAgLy8gaGFzIHJldHVybmVkIHlldCksIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIG9yIG5vdCBpdCdzIHNhZmUgdG8gZW1pdFxuICAvLyAncmVhZGFibGUnIGV0Yy5cbiAgLy9cbiAgLy8gMy4gQWN0dWFsbHkgcHVsbCB0aGUgcmVxdWVzdGVkIGNodW5rcyBvdXQgb2YgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuLlxuXG4gIC8vIGlmIHdlIG5lZWQgYSByZWFkYWJsZSBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWUgcmVhZGluZy5cbiAgdmFyIGRvUmVhZCA9IHN0YXRlLm5lZWRSZWFkYWJsZTtcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZTtcbiAgICBkZWJ1ZygnbGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsnLCBkb1JlYWQpO1xuICB9XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZykge1xuICAgIGRvUmVhZCA9IGZhbHNlO1xuICAgIGRlYnVnKCdyZWFkaW5nIG9yIGVuZGVkJywgZG9SZWFkKTtcbiAgfSBlbHNlIGlmIChkb1JlYWQpIHtcbiAgICBkZWJ1ZygnZG8gcmVhZCcpO1xuICAgIHN0YXRlLnJlYWRpbmcgPSB0cnVlO1xuICAgIHN0YXRlLnN5bmMgPSB0cnVlO1xuICAgIC8vIGlmIHRoZSBsZW5ndGggaXMgY3VycmVudGx5IHplcm8sIHRoZW4gd2UgKm5lZWQqIGEgcmVhZGFibGUgZXZlbnQuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gICAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuICB9XG5cbiAgdmFyIHJldDtcbiAgaWYgKG4gPiAwKSByZXQgPSBmcm9tTGlzdChuLCBzdGF0ZSk7ZWxzZSByZXQgPSBudWxsO1xuXG4gIGlmIChyZXQgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIG4gPSAwO1xuICB9IGVsc2Uge1xuICAgIHN0YXRlLmxlbmd0aCAtPSBuO1xuICB9XG5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIElmIHdlIGhhdmUgbm90aGluZyBpbiB0aGUgYnVmZmVyLCB0aGVuIHdlIHdhbnQgdG8ga25vd1xuICAgIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgICBpZiAoIXN0YXRlLmVuZGVkKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gICAgLy8gSWYgd2UgdHJpZWQgdG8gcmVhZCgpIHBhc3QgdGhlIEVPRiwgdGhlbiBlbWl0IGVuZCBvbiB0aGUgbmV4dCB0aWNrLlxuICAgIGlmIChuT3JpZyAhPT0gbiAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7XG4gIH1cblxuICBpZiAocmV0ICE9PSBudWxsKSB0aGlzLmVtaXQoJ2RhdGEnLCByZXQpO1xuXG4gIHJldHVybiByZXQ7XG59O1xuXG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmVuZGVkKSByZXR1cm47XG4gIGlmIChzdGF0ZS5kZWNvZGVyKSB7XG4gICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcblxuICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG59XG5cbi8vIERvbid0IGVtaXQgcmVhZGFibGUgcmlnaHQgYXdheSBpbiBzeW5jIG1vZGUsIGJlY2F1c2UgdGhpcyBjYW4gdHJpZ2dlclxuLy8gYW5vdGhlciByZWFkKCkgY2FsbCA9PiBzdGFjayBvdmVyZmxvdy4gIFRoaXMgd2F5LCBpdCBtaWdodCB0cmlnZ2VyXG4vLyBhIG5leHRUaWNrIHJlY3Vyc2lvbiB3YXJuaW5nLCBidXQgdGhhdCdzIG5vdCBzbyBiYWQuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ2VtaXRSZWFkYWJsZScsIHN0YXRlLmZsb3dpbmcpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgaWYgKHN0YXRlLnN5bmMpIHBuYS5uZXh0VGljayhlbWl0UmVhZGFibGVfLCBzdHJlYW0pO2Vsc2UgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIGRlYnVnKCdlbWl0IHJlYWRhYmxlJyk7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICBmbG93KHN0cmVhbSk7XG59XG5cbi8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgcG5hLm5leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIHdoaWxlICghc3RhdGUucmVhZGluZyAmJiAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRlYnVnKCdtYXliZVJlYWRNb3JlIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztlbHNlIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ19yZWFkKCkgaXMgbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoZGVzdCwgcGlwZU9wdHMpIHtcbiAgdmFyIHNyYyA9IHRoaXM7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgc3dpdGNoIChzdGF0ZS5waXBlc0NvdW50KSB7XG4gICAgY2FzZSAwOlxuICAgICAgc3RhdGUucGlwZXMgPSBkZXN0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgc3RhdGUucGlwZXMgPSBbc3RhdGUucGlwZXMsIGRlc3RdO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHN0YXRlLnBpcGVzLnB1c2goZGVzdCk7XG4gICAgICBicmVhaztcbiAgfVxuICBzdGF0ZS5waXBlc0NvdW50ICs9IDE7XG4gIGRlYnVnKCdwaXBlIGNvdW50PSVkIG9wdHM9JWonLCBzdGF0ZS5waXBlc0NvdW50LCBwaXBlT3B0cyk7XG5cbiAgdmFyIGRvRW5kID0gKCFwaXBlT3B0cyB8fCBwaXBlT3B0cy5lbmQgIT09IGZhbHNlKSAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZG91dCAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZGVycjtcblxuICB2YXIgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogdW5waXBlO1xuICBpZiAoc3RhdGUuZW5kRW1pdHRlZCkgcG5hLm5leHRUaWNrKGVuZEZuKTtlbHNlIHNyYy5vbmNlKCdlbmQnLCBlbmRGbik7XG5cbiAgZGVzdC5vbigndW5waXBlJywgb251bnBpcGUpO1xuICBmdW5jdGlvbiBvbnVucGlwZShyZWFkYWJsZSwgdW5waXBlSW5mbykge1xuICAgIGRlYnVnKCdvbnVucGlwZScpO1xuICAgIGlmIChyZWFkYWJsZSA9PT0gc3JjKSB7XG4gICAgICBpZiAodW5waXBlSW5mbyAmJiB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHVucGlwZUluZm8uaGFzVW5waXBlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKTtcbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cbiAgLy8gd2hlbiB0aGUgZGVzdCBkcmFpbnMsIGl0IHJlZHVjZXMgdGhlIGF3YWl0RHJhaW4gY291bnRlclxuICAvLyBvbiB0aGUgc291cmNlLiAgVGhpcyB3b3VsZCBiZSBtb3JlIGVsZWdhbnQgd2l0aCBhIC5vbmNlKClcbiAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgLy8gdG9vIHNsb3cuXG4gIHZhciBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjKTtcbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICB2YXIgY2xlYW5lZFVwID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgZGVidWcoJ2NsZWFudXAnKTtcbiAgICAvLyBjbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIHVucGlwZSk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcblxuICAgIGNsZWFuZWRVcCA9IHRydWU7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluICYmICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbikpIG9uZHJhaW4oKTtcbiAgfVxuXG4gIC8vIElmIHRoZSB1c2VyIHB1c2hlcyBtb3JlIGRhdGEgd2hpbGUgd2UncmUgd3JpdGluZyB0byBkZXN0IHRoZW4gd2UnbGwgZW5kIHVwXG4gIC8vIGluIG9uZGF0YSBhZ2Fpbi4gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIGluY3JlYXNlIGF3YWl0RHJhaW4gb25jZSBiZWNhdXNlXG4gIC8vIGRlc3Qgd2lsbCBvbmx5IGVtaXQgb25lICdkcmFpbicgZXZlbnQgZm9yIHRoZSBtdWx0aXBsZSB3cml0ZXMuXG4gIC8vID0+IEludHJvZHVjZSBhIGd1YXJkIG9uIGluY3JlYXNpbmcgYXdhaXREcmFpbi5cbiAgdmFyIGluY3JlYXNlZEF3YWl0RHJhaW4gPSBmYWxzZTtcbiAgc3JjLm9uKCdkYXRhJywgb25kYXRhKTtcbiAgZnVuY3Rpb24gb25kYXRhKGNodW5rKSB7XG4gICAgZGVidWcoJ29uZGF0YScpO1xuICAgIGluY3JlYXNlZEF3YWl0RHJhaW4gPSBmYWxzZTtcbiAgICB2YXIgcmV0ID0gZGVzdC53cml0ZShjaHVuayk7XG4gICAgaWYgKGZhbHNlID09PSByZXQgJiYgIWluY3JlYXNlZEF3YWl0RHJhaW4pIHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIHVucGlwZWQgZHVyaW5nIGBkZXN0LndyaXRlKClgLCBpdCBpcyBwb3NzaWJsZVxuICAgICAgLy8gdG8gZ2V0IHN0dWNrIGluIGEgcGVybWFuZW50bHkgcGF1c2VkIHN0YXRlIGlmIHRoYXQgd3JpdGVcbiAgICAgIC8vIGFsc28gcmV0dXJuZWQgZmFsc2UuXG4gICAgICAvLyA9PiBDaGVjayB3aGV0aGVyIGBkZXN0YCBpcyBzdGlsbCBhIHBpcGluZyBkZXN0aW5hdGlvbi5cbiAgICAgIGlmICgoc3RhdGUucGlwZXNDb3VudCA9PT0gMSAmJiBzdGF0ZS5waXBlcyA9PT0gZGVzdCB8fCBzdGF0ZS5waXBlc0NvdW50ID4gMSAmJiBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KSAhPT0gLTEpICYmICFjbGVhbmVkVXApIHtcbiAgICAgICAgZGVidWcoJ2ZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZScsIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKTtcbiAgICAgICAgc3JjLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICAgICAgaW5jcmVhc2VkQXdhaXREcmFpbiA9IHRydWU7XG4gICAgICB9XG4gICAgICBzcmMucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgZGVidWcoJ29uZXJyb3InLCBlcik7XG4gICAgdW5waXBlKCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBpZiAoRUVsaXN0ZW5lckNvdW50KGRlc3QsICdlcnJvcicpID09PSAwKSBkZXN0LmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9XG5cbiAgLy8gTWFrZSBzdXJlIG91ciBlcnJvciBoYW5kbGVyIGlzIGF0dGFjaGVkIGJlZm9yZSB1c2VybGFuZCBvbmVzLlxuICBwcmVwZW5kTGlzdGVuZXIoZGVzdCwgJ2Vycm9yJywgb25lcnJvcik7XG5cbiAgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdjbG9zZScsIG9uY2xvc2UpO1xuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZWJ1Zygnb25maW5pc2gnKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpO1xuXG4gIGZ1bmN0aW9uIHVucGlwZSgpIHtcbiAgICBkZWJ1ZygndW5waXBlJyk7XG4gICAgc3JjLnVucGlwZShkZXN0KTtcbiAgfVxuXG4gIC8vIHRlbGwgdGhlIGRlc3QgdGhhdCBpdCdzIGJlaW5nIHBpcGVkIHRvXG4gIGRlc3QuZW1pdCgncGlwZScsIHNyYyk7XG5cbiAgLy8gc3RhcnQgdGhlIGZsb3cgaWYgaXQgaGFzbid0IGJlZW4gc3RhcnRlZCBhbHJlYWR5LlxuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGlwZSByZXN1bWUnKTtcbiAgICBzcmMucmVzdW1lKCk7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn07XG5cbmZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluKTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbikgc3RhdGUuYXdhaXREcmFpbi0tO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluID09PSAwICYmIEVFbGlzdGVuZXJDb3VudChzcmMsICdkYXRhJykpIHtcbiAgICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgICAgZmxvdyhzcmMpO1xuICAgIH1cbiAgfTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciB1bnBpcGVJbmZvID0geyBoYXNVbnBpcGVkOiBmYWxzZSB9O1xuXG4gIC8vIGlmIHdlJ3JlIG5vdCBwaXBpbmcgYW55d2hlcmUsIHRoZW4gZG8gbm90aGluZy5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDApIHJldHVybiB0aGlzO1xuXG4gIC8vIGp1c3Qgb25lIGRlc3RpbmF0aW9uLiAgbW9zdCBjb21tb24gY2FzZS5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHtcbiAgICAvLyBwYXNzZWQgaW4gb25lLCBidXQgaXQncyBub3QgdGhlIHJpZ2h0IG9uZS5cbiAgICBpZiAoZGVzdCAmJiBkZXN0ICE9PSBzdGF0ZS5waXBlcykgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAoIWRlc3QpIGRlc3QgPSBzdGF0ZS5waXBlcztcblxuICAgIC8vIGdvdCBhIG1hdGNoLlxuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgaWYgKGRlc3QpIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcywgdW5waXBlSW5mbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBzbG93IGNhc2UuIG11bHRpcGxlIHBpcGUgZGVzdGluYXRpb25zLlxuXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgdmFyIGRlc3RzID0gc3RhdGUucGlwZXM7XG4gICAgdmFyIGxlbiA9IHN0YXRlLnBpcGVzQ291bnQ7XG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RzW2ldLmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pO1xuICAgIH1yZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpbmRleCA9IGluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gdGhpcztcblxuICBzdGF0ZS5waXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuXG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcywgdW5waXBlSW5mbyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBzZXQgdXAgZGF0YSBldmVudHMgaWYgdGhleSBhcmUgYXNrZWQgZm9yXG4vLyBFbnN1cmUgcmVhZGFibGUgbGlzdGVuZXJzIGV2ZW50dWFsbHkgZ2V0IHNvbWV0aGluZ1xuUmVhZGFibGUucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgaWYgKGV2ID09PSAnZGF0YScpIHtcbiAgICAvLyBTdGFydCBmbG93aW5nIG9uIG5leHQgdGljayBpZiBzdHJlYW0gaXNuJ3QgZXhwbGljaXRseSBwYXVzZWRcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nICE9PSBmYWxzZSkgdGhpcy5yZXN1bWUoKTtcbiAgfSBlbHNlIGlmIChldiA9PT0gJ3JlYWRhYmxlJykge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmICFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgcG5hLm5leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gUmVhZGFibGUucHJvdG90eXBlLm9uO1xuXG5mdW5jdGlvbiBuUmVhZGluZ05leHRUaWNrKHNlbGYpIHtcbiAgZGVidWcoJ3JlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCcpO1xuICBzZWxmLnJlYWQoMCk7XG59XG5cbi8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdyZXN1bWUnKTtcbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICByZXN1bWUodGhpcywgc3RhdGUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gcmVzdW1lKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZXN1bWVTY2hlZHVsZWQpIHtcbiAgICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSB0cnVlO1xuICAgIHBuYS5uZXh0VGljayhyZXN1bWVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfVxuXG4gIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlO1xuICBzdGF0ZS5hd2FpdERyYWluID0gMDtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKSBzdHJlYW0ucmVhZCgwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICBkZWJ1ZygnY2FsbCBwYXVzZSBmbG93aW5nPSVqJywgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKTtcbiAgaWYgKGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGF1c2UnKTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ3BhdXNlJyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmbG93KHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZyk7XG4gIHdoaWxlIChzdGF0ZS5mbG93aW5nICYmIHN0cmVhbS5yZWFkKCkgIT09IG51bGwpIHt9XG59XG5cbi8vIHdyYXAgYW4gb2xkLXN0eWxlIHN0cmVhbSBhcyB0aGUgYXN5bmMgZGF0YSBzb3VyY2UuXG4vLyBUaGlzIGlzICpub3QqIHBhcnQgb2YgdGhlIHJlYWRhYmxlIHN0cmVhbSBpbnRlcmZhY2UuXG4vLyBJdCBpcyBhbiB1Z2x5IHVuZm9ydHVuYXRlIG1lc3Mgb2YgaGlzdG9yeS5cblJlYWRhYmxlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBwYXVzZWQgPSBmYWxzZTtcblxuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBlbmQnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhc3RhdGUuZW5kZWQpIHtcbiAgICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSBfdGhpcy5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBfdGhpcy5wdXNoKG51bGwpO1xuICB9KTtcblxuICBzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBkYXRhJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG5cbiAgICAvLyBkb24ndCBza2lwIG92ZXIgZmFsc3kgdmFsdWVzIGluIG9iamVjdE1vZGVcbiAgICBpZiAoc3RhdGUub2JqZWN0TW9kZSAmJiAoY2h1bmsgPT09IG51bGwgfHwgY2h1bmsgPT09IHVuZGVmaW5lZCkpIHJldHVybjtlbHNlIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiAoIWNodW5rIHx8ICFjaHVuay5sZW5ndGgpKSByZXR1cm47XG5cbiAgICB2YXIgcmV0ID0gX3RoaXMucHVzaChjaHVuayk7XG4gICAgaWYgKCFyZXQpIHtcbiAgICAgIHBhdXNlZCA9IHRydWU7XG4gICAgICBzdHJlYW0ucGF1c2UoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIHByb3h5IGFsbCB0aGUgb3RoZXIgbWV0aG9kcy5cbiAgLy8gaW1wb3J0YW50IHdoZW4gd3JhcHBpbmcgZmlsdGVycyBhbmQgZHVwbGV4ZXMuXG4gIGZvciAodmFyIGkgaW4gc3RyZWFtKSB7XG4gICAgaWYgKHRoaXNbaV0gPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygc3RyZWFtW2ldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2ldID0gZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KGkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByb3h5IGNlcnRhaW4gaW1wb3J0YW50IGV2ZW50cy5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCBrUHJveHlFdmVudHMubGVuZ3RoOyBuKyspIHtcbiAgICBzdHJlYW0ub24oa1Byb3h5RXZlbnRzW25dLCB0aGlzLmVtaXQuYmluZCh0aGlzLCBrUHJveHlFdmVudHNbbl0pKTtcbiAgfVxuXG4gIC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG4gIHRoaXMuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgJ3JlYWRhYmxlSGlnaFdhdGVyTWFyaycsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgfVxufSk7XG5cbi8vIGV4cG9zZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cblJlYWRhYmxlLl9mcm9tTGlzdCA9IGZyb21MaXN0O1xuXG4vLyBQbHVjayBvZmYgbiBieXRlcyBmcm9tIGFuIGFycmF5IG9mIGJ1ZmZlcnMuXG4vLyBMZW5ndGggaXMgdGhlIGNvbWJpbmVkIGxlbmd0aHMgb2YgYWxsIHRoZSBidWZmZXJzIGluIHRoZSBsaXN0LlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICAvLyBub3RoaW5nIGJ1ZmZlcmVkXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gIHZhciByZXQ7XG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKSByZXQgPSBzdGF0ZS5idWZmZXIuc2hpZnQoKTtlbHNlIGlmICghbiB8fCBuID49IHN0YXRlLmxlbmd0aCkge1xuICAgIC8vIHJlYWQgaXQgYWxsLCB0cnVuY2F0ZSB0aGUgbGlzdFxuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSByZXQgPSBzdGF0ZS5idWZmZXIuam9pbignJyk7ZWxzZSBpZiAoc3RhdGUuYnVmZmVyLmxlbmd0aCA9PT0gMSkgcmV0ID0gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YTtlbHNlIHJldCA9IHN0YXRlLmJ1ZmZlci5jb25jYXQoc3RhdGUubGVuZ3RoKTtcbiAgICBzdGF0ZS5idWZmZXIuY2xlYXIoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIHBhcnQgb2YgbGlzdFxuICAgIHJldCA9IGZyb21MaXN0UGFydGlhbChuLCBzdGF0ZS5idWZmZXIsIHN0YXRlLmRlY29kZXIpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gRXh0cmFjdHMgb25seSBlbm91Z2ggYnVmZmVyZWQgZGF0YSB0byBzYXRpc2Z5IHRoZSBhbW91bnQgcmVxdWVzdGVkLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBmcm9tTGlzdFBhcnRpYWwobiwgbGlzdCwgaGFzU3RyaW5ncykge1xuICB2YXIgcmV0O1xuICBpZiAobiA8IGxpc3QuaGVhZC5kYXRhLmxlbmd0aCkge1xuICAgIC8vIHNsaWNlIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzXG4gICAgcmV0ID0gbGlzdC5oZWFkLmRhdGEuc2xpY2UoMCwgbik7XG4gICAgbGlzdC5oZWFkLmRhdGEgPSBsaXN0LmhlYWQuZGF0YS5zbGljZShuKTtcbiAgfSBlbHNlIGlmIChuID09PSBsaXN0LmhlYWQuZGF0YS5sZW5ndGgpIHtcbiAgICAvLyBmaXJzdCBjaHVuayBpcyBhIHBlcmZlY3QgbWF0Y2hcbiAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVzdWx0IHNwYW5zIG1vcmUgdGhhbiBvbmUgYnVmZmVyXG4gICAgcmV0ID0gaGFzU3RyaW5ncyA/IGNvcHlGcm9tQnVmZmVyU3RyaW5nKG4sIGxpc3QpIDogY29weUZyb21CdWZmZXIobiwgbGlzdCk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gQ29waWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxpc3Qgb2YgYnVmZmVyZWQgZGF0YVxuLy8gY2h1bmtzLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlclN0cmluZyhuLCBsaXN0KSB7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHZhciByZXQgPSBwLmRhdGE7XG4gIG4gLT0gcmV0Lmxlbmd0aDtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgc3RyID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBzdHIubGVuZ3RoID8gc3RyLmxlbmd0aCA6IG47XG4gICAgaWYgKG5iID09PSBzdHIubGVuZ3RoKSByZXQgKz0gc3RyO2Vsc2UgcmV0ICs9IHN0ci5zbGljZSgwLCBuKTtcbiAgICBuIC09IG5iO1xuICAgIGlmIChuID09PSAwKSB7XG4gICAgICBpZiAobmIgPT09IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgKytjO1xuICAgICAgICBpZiAocC5uZXh0KSBsaXN0LmhlYWQgPSBwLm5leHQ7ZWxzZSBsaXN0LmhlYWQgPSBsaXN0LnRhaWwgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdC5oZWFkID0gcDtcbiAgICAgICAgcC5kYXRhID0gc3RyLnNsaWNlKG5iKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICArK2M7XG4gIH1cbiAgbGlzdC5sZW5ndGggLT0gYztcbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gQ29waWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBieXRlcyBmcm9tIHRoZSBsaXN0IG9mIGJ1ZmZlcmVkIGRhdGEgY2h1bmtzLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlcihuLCBsaXN0KSB7XG4gIHZhciByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobik7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHAuZGF0YS5jb3B5KHJldCk7XG4gIG4gLT0gcC5kYXRhLmxlbmd0aDtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgYnVmID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBidWYubGVuZ3RoID8gYnVmLmxlbmd0aCA6IG47XG4gICAgYnVmLmNvcHkocmV0LCByZXQubGVuZ3RoIC0gbiwgMCwgbmIpO1xuICAgIG4gLT0gbmI7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGlmIChuYiA9PT0gYnVmLmxlbmd0aCkge1xuICAgICAgICArK2M7XG4gICAgICAgIGlmIChwLm5leHQpIGxpc3QuaGVhZCA9IHAubmV4dDtlbHNlIGxpc3QuaGVhZCA9IGxpc3QudGFpbCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0LmhlYWQgPSBwO1xuICAgICAgICBwLmRhdGEgPSBidWYuc2xpY2UobmIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgICsrYztcbiAgfVxuICBsaXN0Lmxlbmd0aCAtPSBjO1xuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuXG4gIC8vIElmIHdlIGdldCBoZXJlIGJlZm9yZSBjb25zdW1pbmcgYWxsIHRoZSBieXRlcywgdGhlbiB0aGF0IGlzIGFcbiAgLy8gYnVnIGluIG5vZGUuICBTaG91bGQgbmV2ZXIgaGFwcGVuLlxuICBpZiAoc3RhdGUubGVuZ3RoID4gMCkgdGhyb3cgbmV3IEVycm9yKCdcImVuZFJlYWRhYmxlKClcIiBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO1xuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCkge1xuICAgIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgICBwbmEubmV4dFRpY2soZW5kUmVhZGFibGVOVCwgc3RhdGUsIHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGVOVChzdGF0ZSwgc3RyZWFtKSB7XG4gIC8vIENoZWNrIHRoYXQgd2UgZGlkbid0IGdldCBvbmUgbGFzdCB1bnNoaWZ0LlxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2VuZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn0iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSB0cmFuc2Zvcm0gc3RyZWFtIGlzIGEgcmVhZGFibGUvd3JpdGFibGUgc3RyZWFtIHdoZXJlIHlvdSBkb1xuLy8gc29tZXRoaW5nIHdpdGggdGhlIGRhdGEuICBTb21ldGltZXMgaXQncyBjYWxsZWQgYSBcImZpbHRlclwiLFxuLy8gYnV0IHRoYXQncyBub3QgYSBncmVhdCBuYW1lIGZvciBpdCwgc2luY2UgdGhhdCBpbXBsaWVzIGEgdGhpbmcgd2hlcmVcbi8vIHNvbWUgYml0cyBwYXNzIHRocm91Z2gsIGFuZCBvdGhlcnMgYXJlIHNpbXBseSBpZ25vcmVkLiAgKFRoYXQgd291bGRcbi8vIGJlIGEgdmFsaWQgZXhhbXBsZSBvZiBhIHRyYW5zZm9ybSwgb2YgY291cnNlLilcbi8vXG4vLyBXaGlsZSB0aGUgb3V0cHV0IGlzIGNhdXNhbGx5IHJlbGF0ZWQgdG8gdGhlIGlucHV0LCBpdCdzIG5vdCBhXG4vLyBuZWNlc3NhcmlseSBzeW1tZXRyaWMgb3Igc3luY2hyb25vdXMgdHJhbnNmb3JtYXRpb24uICBGb3IgZXhhbXBsZSxcbi8vIGEgemxpYiBzdHJlYW0gbWlnaHQgdGFrZSBtdWx0aXBsZSBwbGFpbi10ZXh0IHdyaXRlcygpLCBhbmQgdGhlblxuLy8gZW1pdCBhIHNpbmdsZSBjb21wcmVzc2VkIGNodW5rIHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlLlxuLy9cbi8vIEhlcmUncyBob3cgdGhpcyB3b3Jrczpcbi8vXG4vLyBUaGUgVHJhbnNmb3JtIHN0cmVhbSBoYXMgYWxsIHRoZSBhc3BlY3RzIG9mIHRoZSByZWFkYWJsZSBhbmQgd3JpdGFibGVcbi8vIHN0cmVhbSBjbGFzc2VzLiAgV2hlbiB5b3Ugd3JpdGUoY2h1bmspLCB0aGF0IGNhbGxzIF93cml0ZShjaHVuayxjYilcbi8vIGludGVybmFsbHksIGFuZCByZXR1cm5zIGZhbHNlIGlmIHRoZXJlJ3MgYSBsb3Qgb2YgcGVuZGluZyB3cml0ZXNcbi8vIGJ1ZmZlcmVkIHVwLiAgV2hlbiB5b3UgY2FsbCByZWFkKCksIHRoYXQgY2FsbHMgX3JlYWQobikgdW50aWxcbi8vIHRoZXJlJ3MgZW5vdWdoIHBlbmRpbmcgcmVhZGFibGUgZGF0YSBidWZmZXJlZCB1cC5cbi8vXG4vLyBJbiBhIHRyYW5zZm9ybSBzdHJlYW0sIHRoZSB3cml0dGVuIGRhdGEgaXMgcGxhY2VkIGluIGEgYnVmZmVyLiAgV2hlblxuLy8gX3JlYWQobikgaXMgY2FsbGVkLCBpdCB0cmFuc2Zvcm1zIHRoZSBxdWV1ZWQgdXAgZGF0YSwgY2FsbGluZyB0aGVcbi8vIGJ1ZmZlcmVkIF93cml0ZSBjYidzIGFzIGl0IGNvbnN1bWVzIGNodW5rcy4gIElmIGNvbnN1bWluZyBhIHNpbmdsZVxuLy8gd3JpdHRlbiBjaHVuayB3b3VsZCByZXN1bHQgaW4gbXVsdGlwbGUgb3V0cHV0IGNodW5rcywgdGhlbiB0aGUgZmlyc3Rcbi8vIG91dHB1dHRlZCBiaXQgY2FsbHMgdGhlIHJlYWRjYiwgYW5kIHN1YnNlcXVlbnQgY2h1bmtzIGp1c3QgZ28gaW50b1xuLy8gdGhlIHJlYWQgYnVmZmVyLCBhbmQgd2lsbCBjYXVzZSBpdCB0byBlbWl0ICdyZWFkYWJsZScgaWYgbmVjZXNzYXJ5LlxuLy9cbi8vIFRoaXMgd2F5LCBiYWNrLXByZXNzdXJlIGlzIGFjdHVhbGx5IGRldGVybWluZWQgYnkgdGhlIHJlYWRpbmcgc2lkZSxcbi8vIHNpbmNlIF9yZWFkIGhhcyB0byBiZSBjYWxsZWQgdG8gc3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBjaHVuay4gIEhvd2V2ZXIsXG4vLyBhIHBhdGhvbG9naWNhbCBpbmZsYXRlIHR5cGUgb2YgdHJhbnNmb3JtIGNhbiBjYXVzZSBleGNlc3NpdmUgYnVmZmVyaW5nXG4vLyBoZXJlLiAgRm9yIGV4YW1wbGUsIGltYWdpbmUgYSBzdHJlYW0gd2hlcmUgZXZlcnkgYnl0ZSBvZiBpbnB1dCBpc1xuLy8gaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlciBmcm9tIDAtMjU1LCBhbmQgdGhlbiByZXN1bHRzIGluIHRoYXQgbWFueVxuLy8gYnl0ZXMgb2Ygb3V0cHV0LiAgV3JpdGluZyB0aGUgNCBieXRlcyB7ZmYsZmYsZmYsZmZ9IHdvdWxkIHJlc3VsdCBpblxuLy8gMWtiIG9mIGRhdGEgYmVpbmcgb3V0cHV0LiAgSW4gdGhpcyBjYXNlLCB5b3UgY291bGQgd3JpdGUgYSB2ZXJ5IHNtYWxsXG4vLyBhbW91bnQgb2YgaW5wdXQsIGFuZCBlbmQgdXAgd2l0aCBhIHZlcnkgbGFyZ2UgYW1vdW50IG9mIG91dHB1dC4gIEluXG4vLyBzdWNoIGEgcGF0aG9sb2dpY2FsIGluZmxhdGluZyBtZWNoYW5pc20sIHRoZXJlJ2QgYmUgbm8gd2F5IHRvIHRlbGxcbi8vIHRoZSBzeXN0ZW0gdG8gc3RvcCBkb2luZyB0aGUgdHJhbnNmb3JtLiAgQSBzaW5nbGUgNE1CIHdyaXRlIGNvdWxkXG4vLyBjYXVzZSB0aGUgc3lzdGVtIHRvIHJ1biBvdXQgb2YgbWVtb3J5LlxuLy9cbi8vIEhvd2V2ZXIsIGV2ZW4gaW4gc3VjaCBhIHBhdGhvbG9naWNhbCBjYXNlLCBvbmx5IGEgc2luZ2xlIHdyaXR0ZW4gY2h1bmtcbi8vIHdvdWxkIGJlIGNvbnN1bWVkLCBhbmQgdGhlbiB0aGUgcmVzdCB3b3VsZCB3YWl0ICh1bi10cmFuc2Zvcm1lZCkgdW50aWxcbi8vIHRoZSByZXN1bHRzIG9mIHRoZSBwcmV2aW91cyB0cmFuc2Zvcm1lZCBjaHVuayB3ZXJlIGNvbnN1bWVkLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gVHJhbnNmb3JtO1xuXG52YXIgRHVwbGV4ID0gcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnV0aWwuaW5oZXJpdHMoVHJhbnNmb3JtLCBEdXBsZXgpO1xuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybShlciwgZGF0YSkge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG5cbiAgdmFyIGNiID0gdHMud3JpdGVjYjtcblxuICBpZiAoIWNiKSB7XG4gICAgcmV0dXJuIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ3dyaXRlIGNhbGxiYWNrIGNhbGxlZCBtdWx0aXBsZSB0aW1lcycpKTtcbiAgfVxuXG4gIHRzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0cy53cml0ZWNiID0gbnVsbDtcblxuICBpZiAoZGF0YSAhPSBudWxsKSAvLyBzaW5nbGUgZXF1YWxzIGNoZWNrIGZvciBib3RoIGBudWxsYCBhbmQgYHVuZGVmaW5lZGBcbiAgICB0aGlzLnB1c2goZGF0YSk7XG5cbiAgY2IoZXIpO1xuXG4gIHZhciBycyA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHJzLnJlYWRpbmcgPSBmYWxzZTtcbiAgaWYgKHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgdGhpcy5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBUcmFuc2Zvcm0ob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVHJhbnNmb3JtKSkgcmV0dXJuIG5ldyBUcmFuc2Zvcm0ob3B0aW9ucyk7XG5cbiAgRHVwbGV4LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUgPSB7XG4gICAgYWZ0ZXJUcmFuc2Zvcm06IGFmdGVyVHJhbnNmb3JtLmJpbmQodGhpcyksXG4gICAgbmVlZFRyYW5zZm9ybTogZmFsc2UsXG4gICAgdHJhbnNmb3JtaW5nOiBmYWxzZSxcbiAgICB3cml0ZWNiOiBudWxsLFxuICAgIHdyaXRlY2h1bms6IG51bGwsXG4gICAgd3JpdGVlbmNvZGluZzogbnVsbFxuICB9O1xuXG4gIC8vIHN0YXJ0IG91dCBhc2tpbmcgZm9yIGEgcmVhZGFibGUgZXZlbnQgb25jZSBkYXRhIGlzIHRyYW5zZm9ybWVkLlxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG5cbiAgLy8gd2UgaGF2ZSBpbXBsZW1lbnRlZCB0aGUgX3JlYWQgbWV0aG9kLCBhbmQgZG9uZSB0aGUgb3RoZXIgdGhpbmdzXG4gIC8vIHRoYXQgUmVhZGFibGUgd2FudHMgYmVmb3JlIHRoZSBmaXJzdCBfcmVhZCBjYWxsLCBzbyB1bnNldCB0aGVcbiAgLy8gc3luYyBndWFyZCBmbGFnLlxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmMgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHRoaXMuX3RyYW5zZm9ybSA9IG9wdGlvbnMudHJhbnNmb3JtO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZsdXNoID09PSAnZnVuY3Rpb24nKSB0aGlzLl9mbHVzaCA9IG9wdGlvbnMuZmx1c2g7XG4gIH1cblxuICAvLyBXaGVuIHRoZSB3cml0YWJsZSBzaWRlIGZpbmlzaGVzLCB0aGVuIGZsdXNoIG91dCBhbnl0aGluZyByZW1haW5pbmcuXG4gIHRoaXMub24oJ3ByZWZpbmlzaCcsIHByZWZpbmlzaCk7XG59XG5cbmZ1bmN0aW9uIHByZWZpbmlzaCgpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICBpZiAodHlwZW9mIHRoaXMuX2ZsdXNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5fZmx1c2goZnVuY3Rpb24gKGVyLCBkYXRhKSB7XG4gICAgICBkb25lKF90aGlzLCBlciwgZGF0YSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgZG9uZSh0aGlzLCBudWxsLCBudWxsKTtcbiAgfVxufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm0gPSBmYWxzZTtcbiAgcmV0dXJuIER1cGxleC5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsIGNodW5rLCBlbmNvZGluZyk7XG59O1xuXG4vLyBUaGlzIGlzIHRoZSBwYXJ0IHdoZXJlIHlvdSBkbyBzdHVmZiFcbi8vIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gaW4gaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vICdjaHVuaycgaXMgYW4gaW5wdXQgY2h1bmsuXG4vL1xuLy8gQ2FsbCBgcHVzaChuZXdDaHVuaylgIHRvIHBhc3MgYWxvbmcgdHJhbnNmb3JtZWQgb3V0cHV0XG4vLyB0byB0aGUgcmVhZGFibGUgc2lkZS4gIFlvdSBtYXkgY2FsbCAncHVzaCcgemVybyBvciBtb3JlIHRpbWVzLlxuLy9cbi8vIENhbGwgYGNiKGVycilgIHdoZW4geW91IGFyZSBkb25lIHdpdGggdGhpcyBjaHVuay4gIElmIHlvdSBwYXNzXG4vLyBhbiBlcnJvciwgdGhlbiB0aGF0J2xsIHB1dCB0aGUgaHVydCBvbiB0aGUgd2hvbGUgb3BlcmF0aW9uLiAgSWYgeW91XG4vLyBuZXZlciBjYWxsIGNiKCksIHRoZW4geW91J2xsIG5ldmVyIGdldCBhbm90aGVyIGNodW5rLlxuVHJhbnNmb3JtLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdfdHJhbnNmb3JtKCkgaXMgbm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuICB0cy53cml0ZWNiID0gY2I7XG4gIHRzLndyaXRlY2h1bmsgPSBjaHVuaztcbiAgdHMud3JpdGVlbmNvZGluZyA9IGVuY29kaW5nO1xuICBpZiAoIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHZhciBycyA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKHRzLm5lZWRUcmFuc2Zvcm0gfHwgcnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn07XG5cbi8vIERvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGFyZ3MgYXJlIGhlcmUuXG4vLyBfdHJhbnNmb3JtIGRvZXMgYWxsIHRoZSB3b3JrLlxuLy8gVGhhdCB3ZSBnb3QgaGVyZSBtZWFucyB0aGF0IHRoZSByZWFkYWJsZSBzaWRlIHdhbnRzIG1vcmUgZGF0YS5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcblxuICBpZiAodHMud3JpdGVjaHVuayAhPT0gbnVsbCAmJiB0cy53cml0ZWNiICYmICF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB0cy50cmFuc2Zvcm1pbmcgPSB0cnVlO1xuICAgIHRoaXMuX3RyYW5zZm9ybSh0cy53cml0ZWNodW5rLCB0cy53cml0ZWVuY29kaW5nLCB0cy5hZnRlclRyYW5zZm9ybSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gbWFyayB0aGF0IHdlIG5lZWQgYSB0cmFuc2Zvcm0sIHNvIHRoYXQgYW55IGRhdGEgdGhhdCBjb21lcyBpblxuICAgIC8vIHdpbGwgZ2V0IHByb2Nlc3NlZCwgbm93IHRoYXQgd2UndmUgYXNrZWQgZm9yIGl0LlxuICAgIHRzLm5lZWRUcmFuc2Zvcm0gPSB0cnVlO1xuICB9XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgRHVwbGV4LnByb3RvdHlwZS5fZGVzdHJveS5jYWxsKHRoaXMsIGVyciwgZnVuY3Rpb24gKGVycjIpIHtcbiAgICBjYihlcnIyKTtcbiAgICBfdGhpczIuZW1pdCgnY2xvc2UnKTtcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBkb25lKHN0cmVhbSwgZXIsIGRhdGEpIHtcbiAgaWYgKGVyKSByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuXG4gIGlmIChkYXRhICE9IG51bGwpIC8vIHNpbmdsZSBlcXVhbHMgY2hlY2sgZm9yIGJvdGggYG51bGxgIGFuZCBgdW5kZWZpbmVkYFxuICAgIHN0cmVhbS5wdXNoKGRhdGEpO1xuXG4gIC8vIGlmIHRoZXJlJ3Mgbm90aGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyLCB0aGVuIHRoYXQgbWVhbnNcbiAgLy8gdGhhdCBub3RoaW5nIG1vcmUgd2lsbCBldmVyIGJlIHByb3ZpZGVkXG4gIGlmIChzdHJlYW0uX3dyaXRhYmxlU3RhdGUubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ0NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMCcpO1xuXG4gIGlmIChzdHJlYW0uX3RyYW5zZm9ybVN0YXRlLnRyYW5zZm9ybWluZykgdGhyb3cgbmV3IEVycm9yKCdDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gc3RpbGwgdHJhbnNmb3JtaW5nJyk7XG5cbiAgcmV0dXJuIHN0cmVhbS5wdXNoKG51bGwpO1xufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBBIGJpdCBzaW1wbGVyIHRoYW4gcmVhZGFibGUgc3RyZWFtcy5cbi8vIEltcGxlbWVudCBhbiBhc3luYyAuX3dyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpLCBhbmQgaXQnbGwgaGFuZGxlIGFsbFxuLy8gdGhlIGRyYWluIGV2ZW50IGVtaXNzaW9uIGFuZCBidWZmZXJpbmcuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHBuYSA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxubW9kdWxlLmV4cG9ydHMgPSBXcml0YWJsZTtcblxuLyogPHJlcGxhY2VtZW50PiAqL1xuZnVuY3Rpb24gV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aGlzLmNodW5rID0gY2h1bms7XG4gIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgdGhpcy5jYWxsYmFjayA9IGNiO1xuICB0aGlzLm5leHQgPSBudWxsO1xufVxuXG4vLyBJdCBzZWVtcyBhIGxpbmtlZCBsaXN0IGJ1dCBpdCBpcyBub3Rcbi8vIHRoZXJlIHdpbGwgYmUgb25seSAyIG9mIHRoZXNlIGZvciBlYWNoIHN0cmVhbVxuZnVuY3Rpb24gQ29ya2VkUmVxdWVzdChzdGF0ZSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHRoaXMubmV4dCA9IG51bGw7XG4gIHRoaXMuZW50cnkgPSBudWxsO1xuICB0aGlzLmZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBvbkNvcmtlZEZpbmlzaChfdGhpcywgc3RhdGUpO1xuICB9O1xufVxuLyogPC9yZXBsYWNlbWVudD4gKi9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBhc3luY1dyaXRlID0gIXByb2Nlc3MuYnJvd3NlciAmJiBbJ3YwLjEwJywgJ3YwLjkuJ10uaW5kZXhPZihwcm9jZXNzLnZlcnNpb24uc2xpY2UoMCwgNSkpID4gLTEgPyBzZXRJbW1lZGlhdGUgOiBwbmEubmV4dFRpY2s7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBEdXBsZXg7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuV3JpdGFibGUuV3JpdGFibGVTdGF0ZSA9IFdyaXRhYmxlU3RhdGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBpbnRlcm5hbFV0aWwgPSB7XG4gIGRlcHJlY2F0ZTogcmVxdWlyZSgndXRpbC1kZXByZWNhdGUnKVxufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9zdHJlYW0nKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG52YXIgT3VyVWludDhBcnJheSA9IGdsb2JhbC5VaW50OEFycmF5IHx8IGZ1bmN0aW9uICgpIHt9O1xuZnVuY3Rpb24gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuaykge1xuICByZXR1cm4gQnVmZmVyLmZyb20oY2h1bmspO1xufVxuZnVuY3Rpb24gX2lzVWludDhBcnJheShvYmopIHtcbiAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihvYmopIHx8IG9iaiBpbnN0YW5jZW9mIE91clVpbnQ4QXJyYXk7XG59XG5cbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgZGVzdHJveUltcGwgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveScpO1xuXG51dGlsLmluaGVyaXRzKFdyaXRhYmxlLCBTdHJlYW0pO1xuXG5mdW5jdGlvbiBub3AoKSB7fVxuXG5mdW5jdGlvbiBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIER1cGxleCBzdHJlYW1zIGFyZSBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZSwgYnV0IHNoYXJlXG4gIC8vIHRoZSBzYW1lIG9wdGlvbnMgb2JqZWN0LlxuICAvLyBIb3dldmVyLCBzb21lIGNhc2VzIHJlcXVpcmUgc2V0dGluZyBvcHRpb25zIHRvIGRpZmZlcmVudFxuICAvLyB2YWx1ZXMgZm9yIHRoZSByZWFkYWJsZSBhbmQgdGhlIHdyaXRhYmxlIHNpZGVzIG9mIHRoZSBkdXBsZXggc3RyZWFtLlxuICAvLyBUaGVzZSBvcHRpb25zIGNhbiBiZSBwcm92aWRlZCBzZXBhcmF0ZWx5IGFzIHJlYWRhYmxlWFhYIGFuZCB3cml0YWJsZVhYWC5cbiAgdmFyIGlzRHVwbGV4ID0gc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGlzIHN0cmVhbVxuICAvLyBjb250YWlucyBidWZmZXJzIG9yIG9iamVjdHMuXG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuXG4gIGlmIChpc0R1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIHdyaXRlKCkgc3RhcnRzIHJldHVybmluZyBmYWxzZVxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIHRoYXQgd2UgYWx3YXlzIHJldHVybiBmYWxzZSBpZlxuICAvLyB0aGUgZW50aXJlIGJ1ZmZlciBpcyBub3QgZmx1c2hlZCBpbW1lZGlhdGVseSBvbiB3cml0ZSgpXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciB3cml0YWJsZUh3bSA9IG9wdGlvbnMud3JpdGFibGVIaWdoV2F0ZXJNYXJrO1xuICB2YXIgZGVmYXVsdEh3bSA9IHRoaXMub2JqZWN0TW9kZSA/IDE2IDogMTYgKiAxMDI0O1xuXG4gIGlmIChod20gfHwgaHdtID09PSAwKSB0aGlzLmhpZ2hXYXRlck1hcmsgPSBod207ZWxzZSBpZiAoaXNEdXBsZXggJiYgKHdyaXRhYmxlSHdtIHx8IHdyaXRhYmxlSHdtID09PSAwKSkgdGhpcy5oaWdoV2F0ZXJNYXJrID0gd3JpdGFibGVId207ZWxzZSB0aGlzLmhpZ2hXYXRlck1hcmsgPSBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gTWF0aC5mbG9vcih0aGlzLmhpZ2hXYXRlck1hcmspO1xuXG4gIC8vIGlmIF9maW5hbCBoYXMgYmVlbiBjYWxsZWRcbiAgdGhpcy5maW5hbENhbGxlZCA9IGZhbHNlO1xuXG4gIC8vIGRyYWluIGV2ZW50IGZsYWcuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2U7XG4gIC8vIGF0IHRoZSBzdGFydCBvZiBjYWxsaW5nIGVuZCgpXG4gIHRoaXMuZW5kaW5nID0gZmFsc2U7XG4gIC8vIHdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWRcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICAvLyB3aGVuICdmaW5pc2gnIGlzIGVtaXR0ZWRcbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIGhhcyBpdCBiZWVuIGRlc3Ryb3llZFxuICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuXG4gIC8vIHNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgdmFyIG5vRGVjb2RlID0gb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIG5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMDtcblxuICAvLyBhIGZsYWcgdG8gc2VlIHdoZW4gd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHdyaXRlLlxuICB0aGlzLndyaXRpbmcgPSBmYWxzZTtcblxuICAvLyB3aGVuIHRydWUgYWxsIHdyaXRlcyB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsIC51bmNvcmsoKSBjYWxsXG4gIHRoaXMuY29ya2VkID0gMDtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyBhIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCdzIHBhc3NlZCB0byBfd3JpdGUoY2h1bmssY2IpXG4gIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uIChlcikge1xuICAgIG9ud3JpdGUoc3RyZWFtLCBlcik7XG4gIH07XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQgdGhlIHVzZXIgc3VwcGxpZXMgdG8gd3JpdGUoY2h1bmssZW5jb2RpbmcsY2IpXG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG5cbiAgLy8gdGhlIGFtb3VudCB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4gd2hlbiBfd3JpdGUgaXMgY2FsbGVkLlxuICB0aGlzLndyaXRlbGVuID0gMDtcblxuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG5cbiAgLy8gbnVtYmVyIG9mIHBlbmRpbmcgdXNlci1zdXBwbGllZCB3cml0ZSBjYWxsYmFja3NcbiAgLy8gdGhpcyBtdXN0IGJlIDAgYmVmb3JlICdmaW5pc2gnIGNhbiBiZSBlbWl0dGVkXG4gIHRoaXMucGVuZGluZ2NiID0gMDtcblxuICAvLyBlbWl0IHByZWZpbmlzaCBpZiB0aGUgb25seSB0aGluZyB3ZSdyZSB3YWl0aW5nIGZvciBpcyBfd3JpdGUgY2JzXG4gIC8vIFRoaXMgaXMgcmVsZXZhbnQgZm9yIHN5bmNocm9ub3VzIFRyYW5zZm9ybSBzdHJlYW1zXG4gIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2FpblxuICB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8vIGNvdW50IGJ1ZmZlcmVkIHJlcXVlc3RzXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuXG4gIC8vIGFsbG9jYXRlIHRoZSBmaXJzdCBDb3JrZWRSZXF1ZXN0LCB0aGVyZSBpcyBhbHdheXNcbiAgLy8gb25lIGFsbG9jYXRlZCBhbmQgZnJlZSB0byB1c2UsIGFuZCB3ZSBtYWludGFpbiBhdCBtb3N0IHR3b1xuICB0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO1xufVxuXG5Xcml0YWJsZVN0YXRlLnByb3RvdHlwZS5nZXRCdWZmZXIgPSBmdW5jdGlvbiBnZXRCdWZmZXIoKSB7XG4gIHZhciBjdXJyZW50ID0gdGhpcy5idWZmZXJlZFJlcXVlc3Q7XG4gIHZhciBvdXQgPSBbXTtcbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBvdXQucHVzaChjdXJyZW50KTtcbiAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICB9XG4gIHJldHVybiBvdXQ7XG59O1xuXG4oZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0YXRlLnByb3RvdHlwZSwgJ2J1ZmZlcicsIHtcbiAgICAgIGdldDogaW50ZXJuYWxVdGlsLmRlcHJlY2F0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ1ZmZlcigpO1xuICAgICAgfSwgJ193cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyICcgKyAnaW5zdGVhZC4nLCAnREVQMDAwMycpXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHt9XG59KSgpO1xuXG4vLyBUZXN0IF93cml0YWJsZVN0YXRlIGZvciBpbmhlcml0YW5jZSB0byBhY2NvdW50IGZvciBEdXBsZXggc3RyZWFtcyxcbi8vIHdob3NlIHByb3RvdHlwZSBjaGFpbiBvbmx5IHBvaW50cyB0byBSZWFkYWJsZS5cbnZhciByZWFsSGFzSW5zdGFuY2U7XG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaGFzSW5zdGFuY2UgJiYgdHlwZW9mIEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdID09PSAnZnVuY3Rpb24nKSB7XG4gIHJlYWxIYXNJbnN0YW5jZSA9IEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUsIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgIHZhbHVlOiBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICBpZiAocmVhbEhhc0luc3RhbmNlLmNhbGwodGhpcywgb2JqZWN0KSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAodGhpcyAhPT0gV3JpdGFibGUpIHJldHVybiBmYWxzZTtcblxuICAgICAgcmV0dXJuIG9iamVjdCAmJiBvYmplY3QuX3dyaXRhYmxlU3RhdGUgaW5zdGFuY2VvZiBXcml0YWJsZVN0YXRlO1xuICAgIH1cbiAgfSk7XG59IGVsc2Uge1xuICByZWFsSGFzSW5zdGFuY2UgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIHRoaXM7XG4gIH07XG59XG5cbmZ1bmN0aW9uIFdyaXRhYmxlKG9wdGlvbnMpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICAvLyBXcml0YWJsZSBjdG9yIGlzIGFwcGxpZWQgdG8gRHVwbGV4ZXMsIHRvby5cbiAgLy8gYHJlYWxIYXNJbnN0YW5jZWAgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdXNpbmcgcGxhaW4gYGluc3RhbmNlb2ZgXG4gIC8vIHdvdWxkIHJldHVybiBmYWxzZSwgYXMgbm8gYF93cml0YWJsZVN0YXRlYCBwcm9wZXJ0eSBpcyBhdHRhY2hlZC5cblxuICAvLyBUcnlpbmcgdG8gdXNlIHRoZSBjdXN0b20gYGluc3RhbmNlb2ZgIGZvciBXcml0YWJsZSBoZXJlIHdpbGwgYWxzbyBicmVhayB0aGVcbiAgLy8gTm9kZS5qcyBMYXp5VHJhbnNmb3JtIGltcGxlbWVudGF0aW9uLCB3aGljaCBoYXMgYSBub24tdHJpdmlhbCBnZXR0ZXIgZm9yXG4gIC8vIGBfd3JpdGFibGVTdGF0ZWAgdGhhdCB3b3VsZCBsZWFkIHRvIGluZmluaXRlIHJlY3Vyc2lvbi5cbiAgaWYgKCFyZWFsSGFzSW5zdGFuY2UuY2FsbChXcml0YWJsZSwgdGhpcykgJiYgISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkge1xuICAgIHJldHVybiBuZXcgV3JpdGFibGUob3B0aW9ucyk7XG4gIH1cblxuICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gbGVnYWN5LlxuICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGUgPSBvcHRpb25zLndyaXRlO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRldiA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGV2ID0gb3B0aW9ucy53cml0ZXY7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZGVzdHJveSA9IG9wdGlvbnMuZGVzdHJveTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5maW5hbCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmluYWwgPSBvcHRpb25zLmZpbmFsO1xuICB9XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE90aGVyd2lzZSBwZW9wbGUgY2FuIHBpcGUgV3JpdGFibGUgc3RyZWFtcywgd2hpY2ggaXMganVzdCB3cm9uZy5cbldyaXRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlJykpO1xufTtcblxuZnVuY3Rpb24gd3JpdGVBZnRlckVuZChzdHJlYW0sIGNiKSB7XG4gIHZhciBlciA9IG5ldyBFcnJvcignd3JpdGUgYWZ0ZXIgZW5kJyk7XG4gIC8vIFRPRE86IGRlZmVyIGVycm9yIGV2ZW50cyBjb25zaXN0ZW50bHkgZXZlcnl3aGVyZSwgbm90IGp1c3QgdGhlIGNiXG4gIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgcG5hLm5leHRUaWNrKGNiLCBlcik7XG59XG5cbi8vIENoZWNrcyB0aGF0IGEgdXNlci1zdXBwbGllZCBjaHVuayBpcyB2YWxpZCwgZXNwZWNpYWxseSBmb3IgdGhlIHBhcnRpY3VsYXJcbi8vIG1vZGUgdGhlIHN0cmVhbSBpcyBpbi4gQ3VycmVudGx5IHRoaXMgbWVhbnMgdGhhdCBgbnVsbGAgaXMgbmV2ZXIgYWNjZXB0ZWRcbi8vIGFuZCB1bmRlZmluZWQvbm9uLXN0cmluZyB2YWx1ZXMgYXJlIG9ubHkgYWxsb3dlZCBpbiBvYmplY3QgbW9kZS5cbmZ1bmN0aW9uIHZhbGlkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGNiKSB7XG4gIHZhciB2YWxpZCA9IHRydWU7XG4gIHZhciBlciA9IGZhbHNlO1xuXG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0nKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmIGNodW5rICE9PSB1bmRlZmluZWQgJiYgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgfVxuICBpZiAoZXIpIHtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgcG5hLm5leHRUaWNrKGNiLCBlcik7XG4gICAgdmFsaWQgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gdmFsaWQ7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciByZXQgPSBmYWxzZTtcbiAgdmFyIGlzQnVmID0gIXN0YXRlLm9iamVjdE1vZGUgJiYgX2lzVWludDhBcnJheShjaHVuayk7XG5cbiAgaWYgKGlzQnVmICYmICFCdWZmZXIuaXNCdWZmZXIoY2h1bmspKSB7XG4gICAgY2h1bmsgPSBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChpc0J1ZikgZW5jb2RpbmcgPSAnYnVmZmVyJztlbHNlIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuXG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIGNiID0gbm9wO1xuXG4gIGlmIChzdGF0ZS5lbmRlZCkgd3JpdGVBZnRlckVuZCh0aGlzLCBjYik7ZWxzZSBpZiAoaXNCdWYgfHwgdmFsaWRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGNiKSkge1xuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHJldCA9IHdyaXRlT3JCdWZmZXIodGhpcywgc3RhdGUsIGlzQnVmLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBzdGF0ZS5jb3JrZWQrKztcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS51bmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZC0tO1xuXG4gICAgaWYgKCFzdGF0ZS53cml0aW5nICYmICFzdGF0ZS5jb3JrZWQgJiYgIXN0YXRlLmZpbmlzaGVkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkgY2xlYXJCdWZmZXIodGhpcywgc3RhdGUpO1xuICB9XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nID0gZnVuY3Rpb24gc2V0RGVmYXVsdEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIC8vIG5vZGU6OlBhcnNlRW5jb2RpbmcoKSByZXF1aXJlcyBsb3dlciBjYXNlLlxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykgZW5jb2RpbmcgPSBlbmNvZGluZy50b0xvd2VyQ2FzZSgpO1xuICBpZiAoIShbJ2hleCcsICd1dGY4JywgJ3V0Zi04JywgJ2FzY2lpJywgJ2JpbmFyeScsICdiYXNlNjQnLCAndWNzMicsICd1Y3MtMicsICd1dGYxNmxlJywgJ3V0Zi0xNmxlJywgJ3JhdyddLmluZGV4T2YoKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKCkpID4gLTEpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpO1xuICB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZyA9IGVuY29kaW5nO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpIHtcbiAgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmIHN0YXRlLmRlY29kZVN0cmluZ3MgIT09IGZhbHNlICYmIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rLCBlbmNvZGluZyk7XG4gIH1cbiAgcmV0dXJuIGNodW5rO1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCAnd3JpdGFibGVIaWdoV2F0ZXJNYXJrJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICB9XG59KTtcblxuLy8gaWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIHNvbWV0aGluZywgdGhlbiBqdXN0IHB1dCB0aGlzXG4vLyBpbiB0aGUgcXVldWUsIGFuZCB3YWl0IG91ciB0dXJuLiAgT3RoZXJ3aXNlLCBjYWxsIF93cml0ZVxuLy8gSWYgd2UgcmV0dXJuIGZhbHNlLCB0aGVuIHdlIG5lZWQgYSBkcmFpbiBldmVudCwgc28gc2V0IHRoYXQgZmxhZy5cbmZ1bmN0aW9uIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgaXNCdWYsIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgaWYgKCFpc0J1Zikge1xuICAgIHZhciBuZXdDaHVuayA9IGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpO1xuICAgIGlmIChjaHVuayAhPT0gbmV3Q2h1bmspIHtcbiAgICAgIGlzQnVmID0gdHJ1ZTtcbiAgICAgIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gICAgICBjaHVuayA9IG5ld0NodW5rO1xuICAgIH1cbiAgfVxuICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgc3RhdGUubGVuZ3RoICs9IGxlbjtcblxuICB2YXIgcmV0ID0gc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgLy8gd2UgbXVzdCBlbnN1cmUgdGhhdCBwcmV2aW91cyBuZWVkRHJhaW4gd2lsbCBub3QgYmUgcmVzZXQgdG8gZmFsc2UuXG4gIGlmICghcmV0KSBzdGF0ZS5uZWVkRHJhaW4gPSB0cnVlO1xuXG4gIGlmIChzdGF0ZS53cml0aW5nIHx8IHN0YXRlLmNvcmtlZCkge1xuICAgIHZhciBsYXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0ge1xuICAgICAgY2h1bms6IGNodW5rLFxuICAgICAgZW5jb2Rpbmc6IGVuY29kaW5nLFxuICAgICAgaXNCdWY6IGlzQnVmLFxuICAgICAgY2FsbGJhY2s6IGNiLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIGxhc3QubmV4dCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgd3JpdGV2LCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgc3RhdGUud3JpdGVsZW4gPSBsZW47XG4gIHN0YXRlLndyaXRlY2IgPSBjYjtcbiAgc3RhdGUud3JpdGluZyA9IHRydWU7XG4gIHN0YXRlLnN5bmMgPSB0cnVlO1xuICBpZiAod3JpdGV2KSBzdHJlYW0uX3dyaXRldihjaHVuaywgc3RhdGUub253cml0ZSk7ZWxzZSBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSk7XG4gIHN0YXRlLnN5bmMgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYjtcblxuICBpZiAoc3luYykge1xuICAgIC8vIGRlZmVyIHRoZSBjYWxsYmFjayBpZiB3ZSBhcmUgYmVpbmcgY2FsbGVkIHN5bmNocm9ub3VzbHlcbiAgICAvLyB0byBhdm9pZCBwaWxpbmcgdXAgdGhpbmdzIG9uIHRoZSBzdGFja1xuICAgIHBuYS5uZXh0VGljayhjYiwgZXIpO1xuICAgIC8vIHRoaXMgY2FuIGVtaXQgZmluaXNoLCBhbmQgaXQgd2lsbCBhbHdheXMgaGFwcGVuXG4gICAgLy8gYWZ0ZXIgZXJyb3JcbiAgICBwbmEubmV4dFRpY2soZmluaXNoTWF5YmUsIHN0cmVhbSwgc3RhdGUpO1xuICAgIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB0aGUgY2FsbGVyIGV4cGVjdCB0aGlzIHRvIGhhcHBlbiBiZWZvcmUgaWZcbiAgICAvLyBpdCBpcyBhc3luY1xuICAgIGNiKGVyKTtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgLy8gdGhpcyBjYW4gZW1pdCBmaW5pc2gsIGJ1dCBmaW5pc2ggbXVzdFxuICAgIC8vIGFsd2F5cyBmb2xsb3cgZXJyb3JcbiAgICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpIHtcbiAgc3RhdGUud3JpdGluZyA9IGZhbHNlO1xuICBzdGF0ZS53cml0ZWNiID0gbnVsbDtcbiAgc3RhdGUubGVuZ3RoIC09IHN0YXRlLndyaXRlbGVuO1xuICBzdGF0ZS53cml0ZWxlbiA9IDA7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGUoc3RyZWFtLCBlcikge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciBzeW5jID0gc3RhdGUuc3luYztcbiAgdmFyIGNiID0gc3RhdGUud3JpdGVjYjtcblxuICBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpO1xuXG4gIGlmIChlcikgb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYik7ZWxzZSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgYWN0dWFsbHkgcmVhZHkgdG8gZmluaXNoLCBidXQgZG9uJ3QgZW1pdCB5ZXRcbiAgICB2YXIgZmluaXNoZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcblxuICAgIGlmICghZmluaXNoZWQgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIHtcbiAgICAgIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChzeW5jKSB7XG4gICAgICAvKjxyZXBsYWNlbWVudD4qL1xuICAgICAgYXN5bmNXcml0ZShhZnRlcldyaXRlLCBzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgICAgLyo8L3JlcGxhY2VtZW50PiovXG4gICAgfSBlbHNlIHtcbiAgICAgIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZCkgb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpO1xuICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgY2IoKTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbi8vIE11c3QgZm9yY2UgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIG5leHRUaWNrLCBzbyB0aGF0IHdlIGRvbid0XG4vLyBlbWl0ICdkcmFpbicgYmVmb3JlIHRoZSB3cml0ZSgpIGNvbnN1bWVyIGdldHMgdGhlICdmYWxzZScgcmV0dXJuXG4vLyB2YWx1ZSwgYW5kIGhhcyBhIGNoYW5jZSB0byBhdHRhY2ggYSAnZHJhaW4nIGxpc3RlbmVyLlxuZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW4pIHtcbiAgICBzdGF0ZS5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKTtcbiAgfVxufVxuXG4vLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0O1xuXG4gIGlmIChzdHJlYW0uX3dyaXRldiAmJiBlbnRyeSAmJiBlbnRyeS5uZXh0KSB7XG4gICAgLy8gRmFzdCBjYXNlLCB3cml0ZSBldmVyeXRoaW5nIHVzaW5nIF93cml0ZXYoKVxuICAgIHZhciBsID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsKTtcbiAgICB2YXIgaG9sZGVyID0gc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlO1xuICAgIGhvbGRlci5lbnRyeSA9IGVudHJ5O1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB2YXIgYWxsQnVmZmVycyA9IHRydWU7XG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICBidWZmZXJbY291bnRdID0gZW50cnk7XG4gICAgICBpZiAoIWVudHJ5LmlzQnVmKSBhbGxCdWZmZXJzID0gZmFsc2U7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICBjb3VudCArPSAxO1xuICAgIH1cbiAgICBidWZmZXIuYWxsQnVmZmVycyA9IGFsbEJ1ZmZlcnM7XG5cbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHRydWUsIHN0YXRlLmxlbmd0aCwgYnVmZmVyLCAnJywgaG9sZGVyLmZpbmlzaCk7XG5cbiAgICAvLyBkb1dyaXRlIGlzIGFsbW9zdCBhbHdheXMgYXN5bmMsIGRlZmVyIHRoZXNlIHRvIHNhdmUgYSBiaXQgb2YgdGltZVxuICAgIC8vIGFzIHRoZSBob3QgcGF0aCBlbmRzIHdpdGggZG9Xcml0ZVxuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICAgIGlmIChob2xkZXIubmV4dCkge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gaG9sZGVyLm5leHQ7XG4gICAgICBob2xkZXIubmV4dCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHN0YXRlKTtcbiAgICB9XG4gICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFNsb3cgY2FzZSwgd3JpdGUgY2h1bmtzIG9uZS1ieS1vbmVcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIHZhciBjaHVuayA9IGVudHJ5LmNodW5rO1xuICAgICAgdmFyIGVuY29kaW5nID0gZW50cnkuZW5jb2Rpbmc7XG4gICAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICAgIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICAgICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50LS07XG4gICAgICAvLyBpZiB3ZSBkaWRuJ3QgY2FsbCB0aGUgb253cml0ZSBpbW1lZGlhdGVseSwgdGhlblxuICAgICAgLy8gaXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXQgZG9lcy5cbiAgICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAgIC8vIGJlaW5nIHByb2Nlc3NlZCwgc28gbW92ZSB0aGUgYnVmZmVyIGNvdW50ZXIgcGFzdCB0aGVtLlxuICAgICAgaWYgKHN0YXRlLndyaXRpbmcpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5ID09PSBudWxsKSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IGVudHJ5O1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihuZXcgRXJyb3IoJ193cml0ZSgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGV2ID0gbnVsbDtcblxuV3JpdGFibGUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gY2h1bms7XG4gICAgY2h1bmsgPSBudWxsO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkKSB0aGlzLndyaXRlKGNodW5rLCBlbmNvZGluZyk7XG5cbiAgLy8gLmVuZCgpIGZ1bGx5IHVuY29ya3NcbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZCA9IDE7XG4gICAgdGhpcy51bmNvcmsoKTtcbiAgfVxuXG4gIC8vIGlnbm9yZSB1bm5lY2Vzc2FyeSBlbmQoKSBjYWxscy5cbiAgaWYgKCFzdGF0ZS5lbmRpbmcgJiYgIXN0YXRlLmZpbmlzaGVkKSBlbmRXcml0YWJsZSh0aGlzLCBzdGF0ZSwgY2IpO1xufTtcblxuZnVuY3Rpb24gbmVlZEZpbmlzaChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUuZW5kaW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPT09IG51bGwgJiYgIXN0YXRlLmZpbmlzaGVkICYmICFzdGF0ZS53cml0aW5nO1xufVxuZnVuY3Rpb24gY2FsbEZpbmFsKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RyZWFtLl9maW5hbChmdW5jdGlvbiAoZXJyKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgaWYgKGVycikge1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICB9XG4gICAgc3RhdGUucHJlZmluaXNoZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdwcmVmaW5pc2gnKTtcbiAgICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnByZWZpbmlzaGVkICYmICFzdGF0ZS5maW5hbENhbGxlZCkge1xuICAgIGlmICh0eXBlb2Ygc3RyZWFtLl9maW5hbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgICBzdGF0ZS5maW5hbENhbGxlZCA9IHRydWU7XG4gICAgICBwbmEubmV4dFRpY2soY2FsbEZpbmFsLCBzdHJlYW0sIHN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUucHJlZmluaXNoZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBuZWVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG4gIGlmIChuZWVkKSB7XG4gICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICAgIGlmIChzdGF0ZS5wZW5kaW5nY2IgPT09IDApIHtcbiAgICAgIHN0YXRlLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lZWQ7XG59XG5cbmZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHN0YXRlLmVuZGluZyA9IHRydWU7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpIHBuYS5uZXh0VGljayhjYik7ZWxzZSBzdHJlYW0ub25jZSgnZmluaXNoJywgY2IpO1xuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9uQ29ya2VkRmluaXNoKGNvcmtSZXEsIHN0YXRlLCBlcnIpIHtcbiAgdmFyIGVudHJ5ID0gY29ya1JlcS5lbnRyeTtcbiAgY29ya1JlcS5lbnRyeSA9IG51bGw7XG4gIHdoaWxlIChlbnRyeSkge1xuICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgIHN0YXRlLnBlbmRpbmdjYi0tO1xuICAgIGNiKGVycik7XG4gICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICB9XG4gIGlmIChzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUpIHtcbiAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IGNvcmtSZXE7XG4gIH0gZWxzZSB7XG4gICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gY29ya1JlcTtcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCAnZGVzdHJveWVkJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAvLyB3ZSBpZ25vcmUgdGhlIHZhbHVlIGlmIHRoZSBzdHJlYW1cbiAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XG4gICAgaWYgKCF0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIHVzZXIgaXMgZXhwbGljaXRseVxuICAgIC8vIG1hbmFnaW5nIGRlc3Ryb3llZFxuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gIH1cbn0pO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLmRlc3Ryb3k7XG5Xcml0YWJsZS5wcm90b3R5cGUuX3VuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLnVuZGVzdHJveTtcbldyaXRhYmxlLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIHRoaXMuZW5kKCk7XG4gIGNiKGVycik7XG59OyIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbmZ1bmN0aW9uIGNvcHlCdWZmZXIoc3JjLCB0YXJnZXQsIG9mZnNldCkge1xuICBzcmMuY29weSh0YXJnZXQsIG9mZnNldCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBCdWZmZXJMaXN0KCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBCdWZmZXJMaXN0KTtcblxuICAgIHRoaXMuaGVhZCA9IG51bGw7XG4gICAgdGhpcy50YWlsID0gbnVsbDtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gIH1cblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gcHVzaCh2KSB7XG4gICAgdmFyIGVudHJ5ID0geyBkYXRhOiB2LCBuZXh0OiBudWxsIH07XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMCkgdGhpcy50YWlsLm5leHQgPSBlbnRyeTtlbHNlIHRoaXMuaGVhZCA9IGVudHJ5O1xuICAgIHRoaXMudGFpbCA9IGVudHJ5O1xuICAgICsrdGhpcy5sZW5ndGg7XG4gIH07XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uIHVuc2hpZnQodikge1xuICAgIHZhciBlbnRyeSA9IHsgZGF0YTogdiwgbmV4dDogdGhpcy5oZWFkIH07XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgICB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgICArK3RoaXMubGVuZ3RoO1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLnNoaWZ0ID0gZnVuY3Rpb24gc2hpZnQoKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgdmFyIHJldCA9IHRoaXMuaGVhZC5kYXRhO1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtlbHNlIHRoaXMuaGVhZCA9IHRoaXMuaGVhZC5uZXh0O1xuICAgIC0tdGhpcy5sZW5ndGg7XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiBqb2luKHMpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgICB2YXIgcmV0ID0gJycgKyBwLmRhdGE7XG4gICAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICAgIHJldCArPSBzICsgcC5kYXRhO1xuICAgIH1yZXR1cm4gcmV0O1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdChuKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHRoaXMuaGVhZC5kYXRhO1xuICAgIHZhciByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobiA+Pj4gMCk7XG4gICAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChwKSB7XG4gICAgICBjb3B5QnVmZmVyKHAuZGF0YSwgcmV0LCBpKTtcbiAgICAgIGkgKz0gcC5kYXRhLmxlbmd0aDtcbiAgICAgIHAgPSBwLm5leHQ7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH07XG5cbiAgcmV0dXJuIEJ1ZmZlckxpc3Q7XG59KCk7XG5cbmlmICh1dGlsICYmIHV0aWwuaW5zcGVjdCAmJiB1dGlsLmluc3BlY3QuY3VzdG9tKSB7XG4gIG1vZHVsZS5leHBvcnRzLnByb3RvdHlwZVt1dGlsLmluc3BlY3QuY3VzdG9tXSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb2JqID0gdXRpbC5pbnNwZWN0KHsgbGVuZ3RoOiB0aGlzLmxlbmd0aCB9KTtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgJyAnICsgb2JqO1xuICB9O1xufSIsIid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHBuYSA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLy8gdW5kb2N1bWVudGVkIGNiKCkgQVBJLCBuZWVkZWQgZm9yIGNvcmUsIG5vdCBmb3IgcHVibGljIEFQSVxuZnVuY3Rpb24gZGVzdHJveShlcnIsIGNiKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdmFyIHJlYWRhYmxlRGVzdHJveWVkID0gdGhpcy5fcmVhZGFibGVTdGF0ZSAmJiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgdmFyIHdyaXRhYmxlRGVzdHJveWVkID0gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcblxuICBpZiAocmVhZGFibGVEZXN0cm95ZWQgfHwgd3JpdGFibGVEZXN0cm95ZWQpIHtcbiAgICBpZiAoY2IpIHtcbiAgICAgIGNiKGVycik7XG4gICAgfSBlbHNlIGlmIChlcnIgJiYgKCF0aGlzLl93cml0YWJsZVN0YXRlIHx8ICF0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCkpIHtcbiAgICAgIHBuYS5uZXh0VGljayhlbWl0RXJyb3JOVCwgdGhpcywgZXJyKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB3ZSBzZXQgZGVzdHJveWVkIHRvIHRydWUgYmVmb3JlIGZpcmluZyBlcnJvciBjYWxsYmFja3MgaW4gb3JkZXJcbiAgLy8gdG8gbWFrZSBpdCByZS1lbnRyYW5jZSBzYWZlIGluIGNhc2UgZGVzdHJveSgpIGlzIGNhbGxlZCB3aXRoaW4gY2FsbGJhY2tzXG5cbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHRydWU7XG4gIH1cblxuICAvLyBpZiB0aGlzIGlzIGEgZHVwbGV4IHN0cmVhbSBtYXJrIHRoZSB3cml0YWJsZSBwYXJ0IGFzIGRlc3Ryb3llZCBhcyB3ZWxsXG4gIGlmICh0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB0cnVlO1xuICB9XG5cbiAgdGhpcy5fZGVzdHJveShlcnIgfHwgbnVsbCwgZnVuY3Rpb24gKGVycikge1xuICAgIGlmICghY2IgJiYgZXJyKSB7XG4gICAgICBwbmEubmV4dFRpY2soZW1pdEVycm9yTlQsIF90aGlzLCBlcnIpO1xuICAgICAgaWYgKF90aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICAgIF90aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjYikge1xuICAgICAgY2IoZXJyKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB0aGlzO1xufVxuXG5mdW5jdGlvbiB1bmRlc3Ryb3koKSB7XG4gIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZGVkID0gZmFsc2U7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIH1cblxuICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdEVycm9yTlQoc2VsZiwgZXJyKSB7XG4gIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZGVzdHJveTogZGVzdHJveSxcbiAgdW5kZXN0cm95OiB1bmRlc3Ryb3lcbn07IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vcmVhZGFibGUnKS5QYXNzVGhyb3VnaFxuIiwiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcycpO1xuZXhwb3J0cy5TdHJlYW0gPSBleHBvcnRzO1xuZXhwb3J0cy5SZWFkYWJsZSA9IGV4cG9ydHM7XG5leHBvcnRzLldyaXRhYmxlID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV93cml0YWJsZS5qcycpO1xuZXhwb3J0cy5EdXBsZXggPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX2R1cGxleC5qcycpO1xuZXhwb3J0cy5UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcycpO1xuZXhwb3J0cy5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMnKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9yZWFkYWJsZScpLlRyYW5zZm9ybVxuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzJyk7XG4iLCIndXNlIHN0cmljdCdcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXJcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBIYXNoQmFzZSA9IHJlcXVpcmUoJ2hhc2gtYmFzZScpXG5cbnZhciBBUlJBWTE2ID0gbmV3IEFycmF5KDE2KVxuXG52YXIgemwgPSBbXG4gIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsXG4gIDcsIDQsIDEzLCAxLCAxMCwgNiwgMTUsIDMsIDEyLCAwLCA5LCA1LCAyLCAxNCwgMTEsIDgsXG4gIDMsIDEwLCAxNCwgNCwgOSwgMTUsIDgsIDEsIDIsIDcsIDAsIDYsIDEzLCAxMSwgNSwgMTIsXG4gIDEsIDksIDExLCAxMCwgMCwgOCwgMTIsIDQsIDEzLCAzLCA3LCAxNSwgMTQsIDUsIDYsIDIsXG4gIDQsIDAsIDUsIDksIDcsIDEyLCAyLCAxMCwgMTQsIDEsIDMsIDgsIDExLCA2LCAxNSwgMTNcbl1cblxudmFyIHpyID0gW1xuICA1LCAxNCwgNywgMCwgOSwgMiwgMTEsIDQsIDEzLCA2LCAxNSwgOCwgMSwgMTAsIDMsIDEyLFxuICA2LCAxMSwgMywgNywgMCwgMTMsIDUsIDEwLCAxNCwgMTUsIDgsIDEyLCA0LCA5LCAxLCAyLFxuICAxNSwgNSwgMSwgMywgNywgMTQsIDYsIDksIDExLCA4LCAxMiwgMiwgMTAsIDAsIDQsIDEzLFxuICA4LCA2LCA0LCAxLCAzLCAxMSwgMTUsIDAsIDUsIDEyLCAyLCAxMywgOSwgNywgMTAsIDE0LFxuICAxMiwgMTUsIDEwLCA0LCAxLCA1LCA4LCA3LCA2LCAyLCAxMywgMTQsIDAsIDMsIDksIDExXG5dXG5cbnZhciBzbCA9IFtcbiAgMTEsIDE0LCAxNSwgMTIsIDUsIDgsIDcsIDksIDExLCAxMywgMTQsIDE1LCA2LCA3LCA5LCA4LFxuICA3LCA2LCA4LCAxMywgMTEsIDksIDcsIDE1LCA3LCAxMiwgMTUsIDksIDExLCA3LCAxMywgMTIsXG4gIDExLCAxMywgNiwgNywgMTQsIDksIDEzLCAxNSwgMTQsIDgsIDEzLCA2LCA1LCAxMiwgNywgNSxcbiAgMTEsIDEyLCAxNCwgMTUsIDE0LCAxNSwgOSwgOCwgOSwgMTQsIDUsIDYsIDgsIDYsIDUsIDEyLFxuICA5LCAxNSwgNSwgMTEsIDYsIDgsIDEzLCAxMiwgNSwgMTIsIDEzLCAxNCwgMTEsIDgsIDUsIDZcbl1cblxudmFyIHNyID0gW1xuICA4LCA5LCA5LCAxMSwgMTMsIDE1LCAxNSwgNSwgNywgNywgOCwgMTEsIDE0LCAxNCwgMTIsIDYsXG4gIDksIDEzLCAxNSwgNywgMTIsIDgsIDksIDExLCA3LCA3LCAxMiwgNywgNiwgMTUsIDEzLCAxMSxcbiAgOSwgNywgMTUsIDExLCA4LCA2LCA2LCAxNCwgMTIsIDEzLCA1LCAxNCwgMTMsIDEzLCA3LCA1LFxuICAxNSwgNSwgOCwgMTEsIDE0LCAxNCwgNiwgMTQsIDYsIDksIDEyLCA5LCAxMiwgNSwgMTUsIDgsXG4gIDgsIDUsIDEyLCA5LCAxMiwgNSwgMTQsIDYsIDgsIDEzLCA2LCA1LCAxNSwgMTMsIDExLCAxMVxuXVxuXG52YXIgaGwgPSBbMHgwMDAwMDAwMCwgMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwgMHg4ZjFiYmNkYywgMHhhOTUzZmQ0ZV1cbnZhciBociA9IFsweDUwYTI4YmU2LCAweDVjNGRkMTI0LCAweDZkNzAzZWYzLCAweDdhNmQ3NmU5LCAweDAwMDAwMDAwXVxuXG5mdW5jdGlvbiBSSVBFTUQxNjAgKCkge1xuICBIYXNoQmFzZS5jYWxsKHRoaXMsIDY0KVxuXG4gIC8vIHN0YXRlXG4gIHRoaXMuX2EgPSAweDY3NDUyMzAxXG4gIHRoaXMuX2IgPSAweGVmY2RhYjg5XG4gIHRoaXMuX2MgPSAweDk4YmFkY2ZlXG4gIHRoaXMuX2QgPSAweDEwMzI1NDc2XG4gIHRoaXMuX2UgPSAweGMzZDJlMWYwXG59XG5cbmluaGVyaXRzKFJJUEVNRDE2MCwgSGFzaEJhc2UpXG5cblJJUEVNRDE2MC5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHdvcmRzID0gQVJSQVkxNlxuICBmb3IgKHZhciBqID0gMDsgaiA8IDE2OyArK2opIHdvcmRzW2pdID0gdGhpcy5fYmxvY2sucmVhZEludDMyTEUoaiAqIDQpXG5cbiAgdmFyIGFsID0gdGhpcy5fYSB8IDBcbiAgdmFyIGJsID0gdGhpcy5fYiB8IDBcbiAgdmFyIGNsID0gdGhpcy5fYyB8IDBcbiAgdmFyIGRsID0gdGhpcy5fZCB8IDBcbiAgdmFyIGVsID0gdGhpcy5fZSB8IDBcblxuICB2YXIgYXIgPSB0aGlzLl9hIHwgMFxuICB2YXIgYnIgPSB0aGlzLl9iIHwgMFxuICB2YXIgY3IgPSB0aGlzLl9jIHwgMFxuICB2YXIgZHIgPSB0aGlzLl9kIHwgMFxuICB2YXIgZXIgPSB0aGlzLl9lIHwgMFxuXG4gIC8vIGNvbXB1dGF0aW9uXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgODA7IGkgKz0gMSkge1xuICAgIHZhciB0bFxuICAgIHZhciB0clxuICAgIGlmIChpIDwgMTYpIHtcbiAgICAgIHRsID0gZm4xKGFsLCBibCwgY2wsIGRsLCBlbCwgd29yZHNbemxbaV1dLCBobFswXSwgc2xbaV0pXG4gICAgICB0ciA9IGZuNShhciwgYnIsIGNyLCBkciwgZXIsIHdvcmRzW3pyW2ldXSwgaHJbMF0sIHNyW2ldKVxuICAgIH0gZWxzZSBpZiAoaSA8IDMyKSB7XG4gICAgICB0bCA9IGZuMihhbCwgYmwsIGNsLCBkbCwgZWwsIHdvcmRzW3psW2ldXSwgaGxbMV0sIHNsW2ldKVxuICAgICAgdHIgPSBmbjQoYXIsIGJyLCBjciwgZHIsIGVyLCB3b3Jkc1t6cltpXV0sIGhyWzFdLCBzcltpXSlcbiAgICB9IGVsc2UgaWYgKGkgPCA0OCkge1xuICAgICAgdGwgPSBmbjMoYWwsIGJsLCBjbCwgZGwsIGVsLCB3b3Jkc1t6bFtpXV0sIGhsWzJdLCBzbFtpXSlcbiAgICAgIHRyID0gZm4zKGFyLCBiciwgY3IsIGRyLCBlciwgd29yZHNbenJbaV1dLCBoclsyXSwgc3JbaV0pXG4gICAgfSBlbHNlIGlmIChpIDwgNjQpIHtcbiAgICAgIHRsID0gZm40KGFsLCBibCwgY2wsIGRsLCBlbCwgd29yZHNbemxbaV1dLCBobFszXSwgc2xbaV0pXG4gICAgICB0ciA9IGZuMihhciwgYnIsIGNyLCBkciwgZXIsIHdvcmRzW3pyW2ldXSwgaHJbM10sIHNyW2ldKVxuICAgIH0gZWxzZSB7IC8vIGlmIChpPDgwKSB7XG4gICAgICB0bCA9IGZuNShhbCwgYmwsIGNsLCBkbCwgZWwsIHdvcmRzW3psW2ldXSwgaGxbNF0sIHNsW2ldKVxuICAgICAgdHIgPSBmbjEoYXIsIGJyLCBjciwgZHIsIGVyLCB3b3Jkc1t6cltpXV0sIGhyWzRdLCBzcltpXSlcbiAgICB9XG5cbiAgICBhbCA9IGVsXG4gICAgZWwgPSBkbFxuICAgIGRsID0gcm90bChjbCwgMTApXG4gICAgY2wgPSBibFxuICAgIGJsID0gdGxcblxuICAgIGFyID0gZXJcbiAgICBlciA9IGRyXG4gICAgZHIgPSByb3RsKGNyLCAxMClcbiAgICBjciA9IGJyXG4gICAgYnIgPSB0clxuICB9XG5cbiAgLy8gdXBkYXRlIHN0YXRlXG4gIHZhciB0ID0gKHRoaXMuX2IgKyBjbCArIGRyKSB8IDBcbiAgdGhpcy5fYiA9ICh0aGlzLl9jICsgZGwgKyBlcikgfCAwXG4gIHRoaXMuX2MgPSAodGhpcy5fZCArIGVsICsgYXIpIHwgMFxuICB0aGlzLl9kID0gKHRoaXMuX2UgKyBhbCArIGJyKSB8IDBcbiAgdGhpcy5fZSA9ICh0aGlzLl9hICsgYmwgKyBjcikgfCAwXG4gIHRoaXMuX2EgPSB0XG59XG5cblJJUEVNRDE2MC5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gY3JlYXRlIHBhZGRpbmcgYW5kIGhhbmRsZSBibG9ja3NcbiAgdGhpcy5fYmxvY2tbdGhpcy5fYmxvY2tPZmZzZXQrK10gPSAweDgwXG4gIGlmICh0aGlzLl9ibG9ja09mZnNldCA+IDU2KSB7XG4gICAgdGhpcy5fYmxvY2suZmlsbCgwLCB0aGlzLl9ibG9ja09mZnNldCwgNjQpXG4gICAgdGhpcy5fdXBkYXRlKClcbiAgICB0aGlzLl9ibG9ja09mZnNldCA9IDBcbiAgfVxuXG4gIHRoaXMuX2Jsb2NrLmZpbGwoMCwgdGhpcy5fYmxvY2tPZmZzZXQsIDU2KVxuICB0aGlzLl9ibG9jay53cml0ZVVJbnQzMkxFKHRoaXMuX2xlbmd0aFswXSwgNTYpXG4gIHRoaXMuX2Jsb2NrLndyaXRlVUludDMyTEUodGhpcy5fbGVuZ3RoWzFdLCA2MClcbiAgdGhpcy5fdXBkYXRlKClcblxuICAvLyBwcm9kdWNlIHJlc3VsdFxuICB2YXIgYnVmZmVyID0gQnVmZmVyLmFsbG9jID8gQnVmZmVyLmFsbG9jKDIwKSA6IG5ldyBCdWZmZXIoMjApXG4gIGJ1ZmZlci53cml0ZUludDMyTEUodGhpcy5fYSwgMClcbiAgYnVmZmVyLndyaXRlSW50MzJMRSh0aGlzLl9iLCA0KVxuICBidWZmZXIud3JpdGVJbnQzMkxFKHRoaXMuX2MsIDgpXG4gIGJ1ZmZlci53cml0ZUludDMyTEUodGhpcy5fZCwgMTIpXG4gIGJ1ZmZlci53cml0ZUludDMyTEUodGhpcy5fZSwgMTYpXG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gcm90bCAoeCwgbikge1xuICByZXR1cm4gKHggPDwgbikgfCAoeCA+Pj4gKDMyIC0gbikpXG59XG5cbmZ1bmN0aW9uIGZuMSAoYSwgYiwgYywgZCwgZSwgbSwgaywgcykge1xuICByZXR1cm4gKHJvdGwoKGEgKyAoYiBeIGMgXiBkKSArIG0gKyBrKSB8IDAsIHMpICsgZSkgfCAwXG59XG5cbmZ1bmN0aW9uIGZuMiAoYSwgYiwgYywgZCwgZSwgbSwgaywgcykge1xuICByZXR1cm4gKHJvdGwoKGEgKyAoKGIgJiBjKSB8ICgofmIpICYgZCkpICsgbSArIGspIHwgMCwgcykgKyBlKSB8IDBcbn1cblxuZnVuY3Rpb24gZm4zIChhLCBiLCBjLCBkLCBlLCBtLCBrLCBzKSB7XG4gIHJldHVybiAocm90bCgoYSArICgoYiB8ICh+YykpIF4gZCkgKyBtICsgaykgfCAwLCBzKSArIGUpIHwgMFxufVxuXG5mdW5jdGlvbiBmbjQgKGEsIGIsIGMsIGQsIGUsIG0sIGssIHMpIHtcbiAgcmV0dXJuIChyb3RsKChhICsgKChiICYgZCkgfCAoYyAmICh+ZCkpKSArIG0gKyBrKSB8IDAsIHMpICsgZSkgfCAwXG59XG5cbmZ1bmN0aW9uIGZuNSAoYSwgYiwgYywgZCwgZSwgbSwgaywgcykge1xuICByZXR1cm4gKHJvdGwoKGEgKyAoYiBeIChjIHwgKH5kKSkpICsgbSArIGspIHwgMCwgcykgKyBlKSB8IDBcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSSVBFTUQxNjBcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cbnZhciBidWZmZXIgPSByZXF1aXJlKCdidWZmZXInKVxudmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXJcblxuLy8gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgT2JqZWN0LmtleXMgZm9yIG9sZCBicm93c2Vyc1xuZnVuY3Rpb24gY29weVByb3BzIChzcmMsIGRzdCkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgZHN0W2tleV0gPSBzcmNba2V5XVxuICB9XG59XG5pZiAoQnVmZmVyLmZyb20gJiYgQnVmZmVyLmFsbG9jICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZSAmJiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KSB7XG4gIG1vZHVsZS5leHBvcnRzID0gYnVmZmVyXG59IGVsc2Uge1xuICAvLyBDb3B5IHByb3BlcnRpZXMgZnJvbSByZXF1aXJlKCdidWZmZXInKVxuICBjb3B5UHJvcHMoYnVmZmVyLCBleHBvcnRzKVxuICBleHBvcnRzLkJ1ZmZlciA9IFNhZmVCdWZmZXJcbn1cblxuZnVuY3Rpb24gU2FmZUJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gQ29weSBzdGF0aWMgbWV0aG9kcyBmcm9tIEJ1ZmZlclxuY29weVByb3BzKEJ1ZmZlciwgU2FmZUJ1ZmZlcilcblxuU2FmZUJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJ1Zi5maWxsKDApXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoc2l6ZSlcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5TbG93QnVmZmVyKHNpemUpXG59XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCwgdW5kZWZpbmVkKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBpZiAoZ2xvYmFsLnNldEltbWVkaWF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5leHRIYW5kbGUgPSAxOyAvLyBTcGVjIHNheXMgZ3JlYXRlciB0aGFuIHplcm9cbiAgICB2YXIgdGFza3NCeUhhbmRsZSA9IHt9O1xuICAgIHZhciBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICB2YXIgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xuICAgIHZhciByZWdpc3RlckltbWVkaWF0ZTtcblxuICAgIGZ1bmN0aW9uIHNldEltbWVkaWF0ZShjYWxsYmFjaykge1xuICAgICAgLy8gQ2FsbGJhY2sgY2FuIGVpdGhlciBiZSBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBuZXcgRnVuY3Rpb24oXCJcIiArIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIC8vIENvcHkgZnVuY3Rpb24gYXJndW1lbnRzXG4gICAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAxXTtcbiAgICAgIH1cbiAgICAgIC8vIFN0b3JlIGFuZCByZWdpc3RlciB0aGUgdGFza1xuICAgICAgdmFyIHRhc2sgPSB7IGNhbGxiYWNrOiBjYWxsYmFjaywgYXJnczogYXJncyB9O1xuICAgICAgdGFza3NCeUhhbmRsZVtuZXh0SGFuZGxlXSA9IHRhc2s7XG4gICAgICByZWdpc3RlckltbWVkaWF0ZShuZXh0SGFuZGxlKTtcbiAgICAgIHJldHVybiBuZXh0SGFuZGxlKys7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaGFuZGxlKSB7XG4gICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuKHRhc2spIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdGFzay5jYWxsYmFjaztcbiAgICAgICAgdmFyIGFyZ3MgPSB0YXNrLmFyZ3M7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuSWZQcmVzZW50KGhhbmRsZSkge1xuICAgICAgICAvLyBGcm9tIHRoZSBzcGVjOiBcIldhaXQgdW50aWwgYW55IGludm9jYXRpb25zIG9mIHRoaXMgYWxnb3JpdGhtIHN0YXJ0ZWQgYmVmb3JlIHRoaXMgb25lIGhhdmUgY29tcGxldGVkLlwiXG4gICAgICAgIC8vIFNvIGlmIHdlJ3JlIGN1cnJlbnRseSBydW5uaW5nIGEgdGFzaywgd2UnbGwgbmVlZCB0byBkZWxheSB0aGlzIGludm9jYXRpb24uXG4gICAgICAgIGlmIChjdXJyZW50bHlSdW5uaW5nQVRhc2spIHtcbiAgICAgICAgICAgIC8vIERlbGF5IGJ5IGRvaW5nIGEgc2V0VGltZW91dC4gc2V0SW1tZWRpYXRlIHdhcyB0cmllZCBpbnN0ZWFkLCBidXQgaW4gRmlyZWZveCA3IGl0IGdlbmVyYXRlZCBhXG4gICAgICAgICAgICAvLyBcInRvbyBtdWNoIHJlY3Vyc2lvblwiIGVycm9yLlxuICAgICAgICAgICAgc2V0VGltZW91dChydW5JZlByZXNlbnQsIDAsIGhhbmRsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdGFzayA9IHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICAgICAgICAgIGlmICh0YXNrKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBydW4odGFzayk7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbW1lZGlhdGUoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHsgcnVuSWZQcmVzZW50KGhhbmRsZSk7IH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhblVzZVBvc3RNZXNzYWdlKCkge1xuICAgICAgICAvLyBUaGUgdGVzdCBhZ2FpbnN0IGBpbXBvcnRTY3JpcHRzYCBwcmV2ZW50cyB0aGlzIGltcGxlbWVudGF0aW9uIGZyb20gYmVpbmcgaW5zdGFsbGVkIGluc2lkZSBhIHdlYiB3b3JrZXIsXG4gICAgICAgIC8vIHdoZXJlIGBnbG9iYWwucG9zdE1lc3NhZ2VgIG1lYW5zIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCBhbmQgY2FuJ3QgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLlxuICAgICAgICBpZiAoZ2xvYmFsLnBvc3RNZXNzYWdlICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIG9sZE9uTWVzc2FnZSA9IGdsb2JhbC5vbm1lc3NhZ2U7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IGZhbHNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShcIlwiLCBcIipcIik7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gb2xkT25NZXNzYWdlO1xuICAgICAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgLy8gSW5zdGFsbHMgYW4gZXZlbnQgaGFuZGxlciBvbiBgZ2xvYmFsYCBmb3IgdGhlIGBtZXNzYWdlYCBldmVudDogc2VlXG4gICAgICAgIC8vICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vRE9NL3dpbmRvdy5wb3N0TWVzc2FnZVxuICAgICAgICAvLyAqIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL2NvbW1zLmh0bWwjY3Jvc3NEb2N1bWVudE1lc3NhZ2VzXG5cbiAgICAgICAgdmFyIG1lc3NhZ2VQcmVmaXggPSBcInNldEltbWVkaWF0ZSRcIiArIE1hdGgucmFuZG9tKCkgKyBcIiRcIjtcbiAgICAgICAgdmFyIG9uR2xvYmFsTWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBnbG9iYWwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuaW5kZXhPZihtZXNzYWdlUHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudCgrZXZlbnQuZGF0YS5zbGljZShtZXNzYWdlUHJlZml4Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSwgZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFsLmF0dGFjaEV2ZW50KFwib25tZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKG1lc3NhZ2VQcmVmaXggKyBoYW5kbGUsIFwiKlwiKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGV2ZW50LmRhdGE7XG4gICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZShoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBodG1sID0gZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIDxzY3JpcHQ+IGVsZW1lbnQ7IGl0cyByZWFkeXN0YXRlY2hhbmdlIGV2ZW50IHdpbGwgYmUgZmlyZWQgYXN5bmNocm9ub3VzbHkgb25jZSBpdCBpcyBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaHRtbC5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIHNjcmlwdCA9IG51bGw7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaHRtbC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJZiBzdXBwb3J0ZWQsIHdlIHNob3VsZCBhdHRhY2ggdG8gdGhlIHByb3RvdHlwZSBvZiBnbG9iYWwsIHNpbmNlIHRoYXQgaXMgd2hlcmUgc2V0VGltZW91dCBldCBhbC4gbGl2ZS5cbiAgICB2YXIgYXR0YWNoVG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbCk7XG4gICAgYXR0YWNoVG8gPSBhdHRhY2hUbyAmJiBhdHRhY2hUby5zZXRUaW1lb3V0ID8gYXR0YWNoVG8gOiBnbG9iYWw7XG5cbiAgICAvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IGUuZy4gYnJvd3NlcmlmeSBlbnZpcm9ubWVudHMuXG4gICAgaWYgKHt9LnRvU3RyaW5nLmNhbGwoZ2xvYmFsLnByb2Nlc3MpID09PSBcIltvYmplY3QgcHJvY2Vzc11cIikge1xuICAgICAgICAvLyBGb3IgTm9kZS5qcyBiZWZvcmUgMC45XG4gICAgICAgIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGNhblVzZVBvc3RNZXNzYWdlKCkpIHtcbiAgICAgICAgLy8gRm9yIG5vbi1JRTEwIG1vZGVybiBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChnbG9iYWwuTWVzc2FnZUNoYW5uZWwpIHtcbiAgICAgICAgLy8gRm9yIHdlYiB3b3JrZXJzLCB3aGVyZSBzdXBwb3J0ZWRcbiAgICAgICAgaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZG9jICYmIFwib25yZWFkeXN0YXRlY2hhbmdlXCIgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIikpIHtcbiAgICAgICAgLy8gRm9yIElFIDbigJM4XG4gICAgICAgIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBvbGRlciBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCk7XG4gICAgfVxuXG4gICAgYXR0YWNoVG8uc2V0SW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlO1xuICAgIGF0dGFjaFRvLmNsZWFySW1tZWRpYXRlID0gY2xlYXJJbW1lZGlhdGU7XG59KHR5cGVvZiBzZWxmID09PSBcInVuZGVmaW5lZFwiID8gdHlwZW9mIGdsb2JhbCA9PT0gXCJ1bmRlZmluZWRcIiA/IHRoaXMgOiBnbG9iYWwgOiBzZWxmKSk7XG4iLCJ2YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcblxuLy8gcHJvdG90eXBlIGNsYXNzIGZvciBoYXNoIGZ1bmN0aW9uc1xuZnVuY3Rpb24gSGFzaCAoYmxvY2tTaXplLCBmaW5hbFNpemUpIHtcbiAgdGhpcy5fYmxvY2sgPSBCdWZmZXIuYWxsb2MoYmxvY2tTaXplKVxuICB0aGlzLl9maW5hbFNpemUgPSBmaW5hbFNpemVcbiAgdGhpcy5fYmxvY2tTaXplID0gYmxvY2tTaXplXG4gIHRoaXMuX2xlbiA9IDBcbn1cblxuSGFzaC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKGRhdGEsIGVuYykge1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jID0gZW5jIHx8ICd1dGY4J1xuICAgIGRhdGEgPSBCdWZmZXIuZnJvbShkYXRhLCBlbmMpXG4gIH1cblxuICB2YXIgYmxvY2sgPSB0aGlzLl9ibG9ja1xuICB2YXIgYmxvY2tTaXplID0gdGhpcy5fYmxvY2tTaXplXG4gIHZhciBsZW5ndGggPSBkYXRhLmxlbmd0aFxuICB2YXIgYWNjdW0gPSB0aGlzLl9sZW5cblxuICBmb3IgKHZhciBvZmZzZXQgPSAwOyBvZmZzZXQgPCBsZW5ndGg7KSB7XG4gICAgdmFyIGFzc2lnbmVkID0gYWNjdW0gJSBibG9ja1NpemVcbiAgICB2YXIgcmVtYWluZGVyID0gTWF0aC5taW4obGVuZ3RoIC0gb2Zmc2V0LCBibG9ja1NpemUgLSBhc3NpZ25lZClcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVtYWluZGVyOyBpKyspIHtcbiAgICAgIGJsb2NrW2Fzc2lnbmVkICsgaV0gPSBkYXRhW29mZnNldCArIGldXG4gICAgfVxuXG4gICAgYWNjdW0gKz0gcmVtYWluZGVyXG4gICAgb2Zmc2V0ICs9IHJlbWFpbmRlclxuXG4gICAgaWYgKChhY2N1bSAlIGJsb2NrU2l6ZSkgPT09IDApIHtcbiAgICAgIHRoaXMuX3VwZGF0ZShibG9jaylcbiAgICB9XG4gIH1cblxuICB0aGlzLl9sZW4gKz0gbGVuZ3RoXG4gIHJldHVybiB0aGlzXG59XG5cbkhhc2gucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgdmFyIHJlbSA9IHRoaXMuX2xlbiAlIHRoaXMuX2Jsb2NrU2l6ZVxuXG4gIHRoaXMuX2Jsb2NrW3JlbV0gPSAweDgwXG5cbiAgLy8gemVybyAocmVtICsgMSkgdHJhaWxpbmcgYml0cywgd2hlcmUgKHJlbSArIDEpIGlzIHRoZSBzbWFsbGVzdFxuICAvLyBub24tbmVnYXRpdmUgc29sdXRpb24gdG8gdGhlIGVxdWF0aW9uIChsZW5ndGggKyAxICsgKHJlbSArIDEpKSA9PT0gZmluYWxTaXplIG1vZCBibG9ja1NpemVcbiAgdGhpcy5fYmxvY2suZmlsbCgwLCByZW0gKyAxKVxuXG4gIGlmIChyZW0gPj0gdGhpcy5fZmluYWxTaXplKSB7XG4gICAgdGhpcy5fdXBkYXRlKHRoaXMuX2Jsb2NrKVxuICAgIHRoaXMuX2Jsb2NrLmZpbGwoMClcbiAgfVxuXG4gIHZhciBiaXRzID0gdGhpcy5fbGVuICogOFxuXG4gIC8vIHVpbnQzMlxuICBpZiAoYml0cyA8PSAweGZmZmZmZmZmKSB7XG4gICAgdGhpcy5fYmxvY2sud3JpdGVVSW50MzJCRShiaXRzLCB0aGlzLl9ibG9ja1NpemUgLSA0KVxuXG4gIC8vIHVpbnQ2NFxuICB9IGVsc2Uge1xuICAgIHZhciBsb3dCaXRzID0gKGJpdHMgJiAweGZmZmZmZmZmKSA+Pj4gMFxuICAgIHZhciBoaWdoQml0cyA9IChiaXRzIC0gbG93Qml0cykgLyAweDEwMDAwMDAwMFxuXG4gICAgdGhpcy5fYmxvY2sud3JpdGVVSW50MzJCRShoaWdoQml0cywgdGhpcy5fYmxvY2tTaXplIC0gOClcbiAgICB0aGlzLl9ibG9jay53cml0ZVVJbnQzMkJFKGxvd0JpdHMsIHRoaXMuX2Jsb2NrU2l6ZSAtIDQpXG4gIH1cblxuICB0aGlzLl91cGRhdGUodGhpcy5fYmxvY2spXG4gIHZhciBoYXNoID0gdGhpcy5faGFzaCgpXG5cbiAgcmV0dXJuIGVuYyA/IGhhc2gudG9TdHJpbmcoZW5jKSA6IGhhc2hcbn1cblxuSGFzaC5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdfdXBkYXRlIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MnKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEhhc2hcbiIsInZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBTSEEgKGFsZ29yaXRobSkge1xuICBhbGdvcml0aG0gPSBhbGdvcml0aG0udG9Mb3dlckNhc2UoKVxuXG4gIHZhciBBbGdvcml0aG0gPSBleHBvcnRzW2FsZ29yaXRobV1cbiAgaWYgKCFBbGdvcml0aG0pIHRocm93IG5ldyBFcnJvcihhbGdvcml0aG0gKyAnIGlzIG5vdCBzdXBwb3J0ZWQgKHdlIGFjY2VwdCBwdWxsIHJlcXVlc3RzKScpXG5cbiAgcmV0dXJuIG5ldyBBbGdvcml0aG0oKVxufVxuXG5leHBvcnRzLnNoYSA9IHJlcXVpcmUoJy4vc2hhJylcbmV4cG9ydHMuc2hhMSA9IHJlcXVpcmUoJy4vc2hhMScpXG5leHBvcnRzLnNoYTIyNCA9IHJlcXVpcmUoJy4vc2hhMjI0JylcbmV4cG9ydHMuc2hhMjU2ID0gcmVxdWlyZSgnLi9zaGEyNTYnKVxuZXhwb3J0cy5zaGEzODQgPSByZXF1aXJlKCcuL3NoYTM4NCcpXG5leHBvcnRzLnNoYTUxMiA9IHJlcXVpcmUoJy4vc2hhNTEyJylcbiIsIi8qXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNlY3VyZSBIYXNoIEFsZ29yaXRobSwgU0hBLTAsIGFzIGRlZmluZWRcbiAqIGluIEZJUFMgUFVCIDE4MC0xXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzaGExLmpzIG9mIHRoZSBzYW1lIHJlcG9zaXRvcnkuXG4gKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFNIQS0wIGFuZCBTSEEtMSBpcyBqdXN0IGEgYml0d2lzZSByb3RhdGUgbGVmdFxuICogb3BlcmF0aW9uIHdhcyBhZGRlZC5cbiAqL1xuXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG52YXIgSGFzaCA9IHJlcXVpcmUoJy4vaGFzaCcpXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcblxudmFyIEsgPSBbXG4gIDB4NWE4Mjc5OTksIDB4NmVkOWViYTEsIDB4OGYxYmJjZGMgfCAwLCAweGNhNjJjMWQ2IHwgMFxuXVxuXG52YXIgVyA9IG5ldyBBcnJheSg4MClcblxuZnVuY3Rpb24gU2hhICgpIHtcbiAgdGhpcy5pbml0KClcbiAgdGhpcy5fdyA9IFdcblxuICBIYXNoLmNhbGwodGhpcywgNjQsIDU2KVxufVxuXG5pbmhlcml0cyhTaGEsIEhhc2gpXG5cblNoYS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fYSA9IDB4Njc0NTIzMDFcbiAgdGhpcy5fYiA9IDB4ZWZjZGFiODlcbiAgdGhpcy5fYyA9IDB4OThiYWRjZmVcbiAgdGhpcy5fZCA9IDB4MTAzMjU0NzZcbiAgdGhpcy5fZSA9IDB4YzNkMmUxZjBcblxuICByZXR1cm4gdGhpc1xufVxuXG5mdW5jdGlvbiByb3RsNSAobnVtKSB7XG4gIHJldHVybiAobnVtIDw8IDUpIHwgKG51bSA+Pj4gMjcpXG59XG5cbmZ1bmN0aW9uIHJvdGwzMCAobnVtKSB7XG4gIHJldHVybiAobnVtIDw8IDMwKSB8IChudW0gPj4+IDIpXG59XG5cbmZ1bmN0aW9uIGZ0IChzLCBiLCBjLCBkKSB7XG4gIGlmIChzID09PSAwKSByZXR1cm4gKGIgJiBjKSB8ICgofmIpICYgZClcbiAgaWYgKHMgPT09IDIpIHJldHVybiAoYiAmIGMpIHwgKGIgJiBkKSB8IChjICYgZClcbiAgcmV0dXJuIGIgXiBjIF4gZFxufVxuXG5TaGEucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAoTSkge1xuICB2YXIgVyA9IHRoaXMuX3dcblxuICB2YXIgYSA9IHRoaXMuX2EgfCAwXG4gIHZhciBiID0gdGhpcy5fYiB8IDBcbiAgdmFyIGMgPSB0aGlzLl9jIHwgMFxuICB2YXIgZCA9IHRoaXMuX2QgfCAwXG4gIHZhciBlID0gdGhpcy5fZSB8IDBcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIFdbaV0gPSBNLnJlYWRJbnQzMkJFKGkgKiA0KVxuICBmb3IgKDsgaSA8IDgwOyArK2kpIFdbaV0gPSBXW2kgLSAzXSBeIFdbaSAtIDhdIF4gV1tpIC0gMTRdIF4gV1tpIC0gMTZdXG5cbiAgZm9yICh2YXIgaiA9IDA7IGogPCA4MDsgKytqKSB7XG4gICAgdmFyIHMgPSB+fihqIC8gMjApXG4gICAgdmFyIHQgPSAocm90bDUoYSkgKyBmdChzLCBiLCBjLCBkKSArIGUgKyBXW2pdICsgS1tzXSkgfCAwXG5cbiAgICBlID0gZFxuICAgIGQgPSBjXG4gICAgYyA9IHJvdGwzMChiKVxuICAgIGIgPSBhXG4gICAgYSA9IHRcbiAgfVxuXG4gIHRoaXMuX2EgPSAoYSArIHRoaXMuX2EpIHwgMFxuICB0aGlzLl9iID0gKGIgKyB0aGlzLl9iKSB8IDBcbiAgdGhpcy5fYyA9IChjICsgdGhpcy5fYykgfCAwXG4gIHRoaXMuX2QgPSAoZCArIHRoaXMuX2QpIHwgMFxuICB0aGlzLl9lID0gKGUgKyB0aGlzLl9lKSB8IDBcbn1cblxuU2hhLnByb3RvdHlwZS5faGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIEggPSBCdWZmZXIuYWxsb2NVbnNhZmUoMjApXG5cbiAgSC53cml0ZUludDMyQkUodGhpcy5fYSB8IDAsIDApXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2IgfCAwLCA0KVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9jIHwgMCwgOClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZCB8IDAsIDEyKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9lIHwgMCwgMTYpXG5cbiAgcmV0dXJuIEhcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTaGFcbiIsIi8qXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNlY3VyZSBIYXNoIEFsZ29yaXRobSwgU0hBLTEsIGFzIGRlZmluZWRcbiAqIGluIEZJUFMgUFVCIDE4MC0xXG4gKiBWZXJzaW9uIDIuMWEgQ29weXJpZ2h0IFBhdWwgSm9obnN0b24gMjAwMCAtIDIwMDIuXG4gKiBPdGhlciBjb250cmlidXRvcnM6IEdyZWcgSG9sdCwgQW5kcmV3IEtlcGVydCwgWWRuYXIsIExvc3RpbmV0XG4gKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2VcbiAqIFNlZSBodHRwOi8vcGFqaG9tZS5vcmcudWsvY3J5cHQvbWQ1IGZvciBkZXRhaWxzLlxuICovXG5cbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBIYXNoID0gcmVxdWlyZSgnLi9oYXNoJylcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlclxuXG52YXIgSyA9IFtcbiAgMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwgMHg4ZjFiYmNkYyB8IDAsIDB4Y2E2MmMxZDYgfCAwXG5dXG5cbnZhciBXID0gbmV3IEFycmF5KDgwKVxuXG5mdW5jdGlvbiBTaGExICgpIHtcbiAgdGhpcy5pbml0KClcbiAgdGhpcy5fdyA9IFdcblxuICBIYXNoLmNhbGwodGhpcywgNjQsIDU2KVxufVxuXG5pbmhlcml0cyhTaGExLCBIYXNoKVxuXG5TaGExLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9hID0gMHg2NzQ1MjMwMVxuICB0aGlzLl9iID0gMHhlZmNkYWI4OVxuICB0aGlzLl9jID0gMHg5OGJhZGNmZVxuICB0aGlzLl9kID0gMHgxMDMyNTQ3NlxuICB0aGlzLl9lID0gMHhjM2QyZTFmMFxuXG4gIHJldHVybiB0aGlzXG59XG5cbmZ1bmN0aW9uIHJvdGwxIChudW0pIHtcbiAgcmV0dXJuIChudW0gPDwgMSkgfCAobnVtID4+PiAzMSlcbn1cblxuZnVuY3Rpb24gcm90bDUgKG51bSkge1xuICByZXR1cm4gKG51bSA8PCA1KSB8IChudW0gPj4+IDI3KVxufVxuXG5mdW5jdGlvbiByb3RsMzAgKG51bSkge1xuICByZXR1cm4gKG51bSA8PCAzMCkgfCAobnVtID4+PiAyKVxufVxuXG5mdW5jdGlvbiBmdCAocywgYiwgYywgZCkge1xuICBpZiAocyA9PT0gMCkgcmV0dXJuIChiICYgYykgfCAoKH5iKSAmIGQpXG4gIGlmIChzID09PSAyKSByZXR1cm4gKGIgJiBjKSB8IChiICYgZCkgfCAoYyAmIGQpXG4gIHJldHVybiBiIF4gYyBeIGRcbn1cblxuU2hhMS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIChNKSB7XG4gIHZhciBXID0gdGhpcy5fd1xuXG4gIHZhciBhID0gdGhpcy5fYSB8IDBcbiAgdmFyIGIgPSB0aGlzLl9iIHwgMFxuICB2YXIgYyA9IHRoaXMuX2MgfCAwXG4gIHZhciBkID0gdGhpcy5fZCB8IDBcbiAgdmFyIGUgPSB0aGlzLl9lIHwgMFxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkgV1tpXSA9IE0ucmVhZEludDMyQkUoaSAqIDQpXG4gIGZvciAoOyBpIDwgODA7ICsraSkgV1tpXSA9IHJvdGwxKFdbaSAtIDNdIF4gV1tpIC0gOF0gXiBXW2kgLSAxNF0gXiBXW2kgLSAxNl0pXG5cbiAgZm9yICh2YXIgaiA9IDA7IGogPCA4MDsgKytqKSB7XG4gICAgdmFyIHMgPSB+fihqIC8gMjApXG4gICAgdmFyIHQgPSAocm90bDUoYSkgKyBmdChzLCBiLCBjLCBkKSArIGUgKyBXW2pdICsgS1tzXSkgfCAwXG5cbiAgICBlID0gZFxuICAgIGQgPSBjXG4gICAgYyA9IHJvdGwzMChiKVxuICAgIGIgPSBhXG4gICAgYSA9IHRcbiAgfVxuXG4gIHRoaXMuX2EgPSAoYSArIHRoaXMuX2EpIHwgMFxuICB0aGlzLl9iID0gKGIgKyB0aGlzLl9iKSB8IDBcbiAgdGhpcy5fYyA9IChjICsgdGhpcy5fYykgfCAwXG4gIHRoaXMuX2QgPSAoZCArIHRoaXMuX2QpIHwgMFxuICB0aGlzLl9lID0gKGUgKyB0aGlzLl9lKSB8IDBcbn1cblxuU2hhMS5wcm90b3R5cGUuX2hhc2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBIID0gQnVmZmVyLmFsbG9jVW5zYWZlKDIwKVxuXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2EgfCAwLCAwKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9iIHwgMCwgNClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fYyB8IDAsIDgpXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2QgfCAwLCAxMilcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZSB8IDAsIDE2KVxuXG4gIHJldHVybiBIXG59XG5cbm1vZHVsZS5leHBvcnRzID0gU2hhMVxuIiwiLyoqXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNlY3VyZSBIYXNoIEFsZ29yaXRobSwgU0hBLTI1NiwgYXMgZGVmaW5lZFxuICogaW4gRklQUyAxODAtMlxuICogVmVyc2lvbiAyLjItYmV0YSBDb3B5cmlnaHQgQW5nZWwgTWFyaW4sIFBhdWwgSm9obnN0b24gMjAwMCAtIDIwMDkuXG4gKiBPdGhlciBjb250cmlidXRvcnM6IEdyZWcgSG9sdCwgQW5kcmV3IEtlcGVydCwgWWRuYXIsIExvc3RpbmV0XG4gKlxuICovXG5cbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBTaGEyNTYgPSByZXF1aXJlKCcuL3NoYTI1NicpXG52YXIgSGFzaCA9IHJlcXVpcmUoJy4vaGFzaCcpXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcblxudmFyIFcgPSBuZXcgQXJyYXkoNjQpXG5cbmZ1bmN0aW9uIFNoYTIyNCAoKSB7XG4gIHRoaXMuaW5pdCgpXG5cbiAgdGhpcy5fdyA9IFcgLy8gbmV3IEFycmF5KDY0KVxuXG4gIEhhc2guY2FsbCh0aGlzLCA2NCwgNTYpXG59XG5cbmluaGVyaXRzKFNoYTIyNCwgU2hhMjU2KVxuXG5TaGEyMjQucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2EgPSAweGMxMDU5ZWQ4XG4gIHRoaXMuX2IgPSAweDM2N2NkNTA3XG4gIHRoaXMuX2MgPSAweDMwNzBkZDE3XG4gIHRoaXMuX2QgPSAweGY3MGU1OTM5XG4gIHRoaXMuX2UgPSAweGZmYzAwYjMxXG4gIHRoaXMuX2YgPSAweDY4NTgxNTExXG4gIHRoaXMuX2cgPSAweDY0Zjk4ZmE3XG4gIHRoaXMuX2ggPSAweGJlZmE0ZmE0XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuU2hhMjI0LnByb3RvdHlwZS5faGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIEggPSBCdWZmZXIuYWxsb2NVbnNhZmUoMjgpXG5cbiAgSC53cml0ZUludDMyQkUodGhpcy5fYSwgMClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fYiwgNClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fYywgOClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZCwgMTIpXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2UsIDE2KVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9mLCAyMClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZywgMjQpXG5cbiAgcmV0dXJuIEhcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTaGEyMjRcbiIsIi8qKlxuICogQSBKYXZhU2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBTZWN1cmUgSGFzaCBBbGdvcml0aG0sIFNIQS0yNTYsIGFzIGRlZmluZWRcbiAqIGluIEZJUFMgMTgwLTJcbiAqIFZlcnNpb24gMi4yLWJldGEgQ29weXJpZ2h0IEFuZ2VsIE1hcmluLCBQYXVsIEpvaG5zdG9uIDIwMDAgLSAyMDA5LlxuICogT3RoZXIgY29udHJpYnV0b3JzOiBHcmVnIEhvbHQsIEFuZHJldyBLZXBlcnQsIFlkbmFyLCBMb3N0aW5ldFxuICpcbiAqL1xuXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG52YXIgSGFzaCA9IHJlcXVpcmUoJy4vaGFzaCcpXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcblxudmFyIEsgPSBbXG4gIDB4NDI4QTJGOTgsIDB4NzEzNzQ0OTEsIDB4QjVDMEZCQ0YsIDB4RTlCNURCQTUsXG4gIDB4Mzk1NkMyNUIsIDB4NTlGMTExRjEsIDB4OTIzRjgyQTQsIDB4QUIxQzVFRDUsXG4gIDB4RDgwN0FBOTgsIDB4MTI4MzVCMDEsIDB4MjQzMTg1QkUsIDB4NTUwQzdEQzMsXG4gIDB4NzJCRTVENzQsIDB4ODBERUIxRkUsIDB4OUJEQzA2QTcsIDB4QzE5QkYxNzQsXG4gIDB4RTQ5QjY5QzEsIDB4RUZCRTQ3ODYsIDB4MEZDMTlEQzYsIDB4MjQwQ0ExQ0MsXG4gIDB4MkRFOTJDNkYsIDB4NEE3NDg0QUEsIDB4NUNCMEE5REMsIDB4NzZGOTg4REEsXG4gIDB4OTgzRTUxNTIsIDB4QTgzMUM2NkQsIDB4QjAwMzI3QzgsIDB4QkY1OTdGQzcsXG4gIDB4QzZFMDBCRjMsIDB4RDVBNzkxNDcsIDB4MDZDQTYzNTEsIDB4MTQyOTI5NjcsXG4gIDB4MjdCNzBBODUsIDB4MkUxQjIxMzgsIDB4NEQyQzZERkMsIDB4NTMzODBEMTMsXG4gIDB4NjUwQTczNTQsIDB4NzY2QTBBQkIsIDB4ODFDMkM5MkUsIDB4OTI3MjJDODUsXG4gIDB4QTJCRkU4QTEsIDB4QTgxQTY2NEIsIDB4QzI0QjhCNzAsIDB4Qzc2QzUxQTMsXG4gIDB4RDE5MkU4MTksIDB4RDY5OTA2MjQsIDB4RjQwRTM1ODUsIDB4MTA2QUEwNzAsXG4gIDB4MTlBNEMxMTYsIDB4MUUzNzZDMDgsIDB4Mjc0ODc3NEMsIDB4MzRCMEJDQjUsXG4gIDB4MzkxQzBDQjMsIDB4NEVEOEFBNEEsIDB4NUI5Q0NBNEYsIDB4NjgyRTZGRjMsXG4gIDB4NzQ4RjgyRUUsIDB4NzhBNTYzNkYsIDB4ODRDODc4MTQsIDB4OENDNzAyMDgsXG4gIDB4OTBCRUZGRkEsIDB4QTQ1MDZDRUIsIDB4QkVGOUEzRjcsIDB4QzY3MTc4RjJcbl1cblxudmFyIFcgPSBuZXcgQXJyYXkoNjQpXG5cbmZ1bmN0aW9uIFNoYTI1NiAoKSB7XG4gIHRoaXMuaW5pdCgpXG5cbiAgdGhpcy5fdyA9IFcgLy8gbmV3IEFycmF5KDY0KVxuXG4gIEhhc2guY2FsbCh0aGlzLCA2NCwgNTYpXG59XG5cbmluaGVyaXRzKFNoYTI1NiwgSGFzaClcblxuU2hhMjU2LnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9hID0gMHg2YTA5ZTY2N1xuICB0aGlzLl9iID0gMHhiYjY3YWU4NVxuICB0aGlzLl9jID0gMHgzYzZlZjM3MlxuICB0aGlzLl9kID0gMHhhNTRmZjUzYVxuICB0aGlzLl9lID0gMHg1MTBlNTI3ZlxuICB0aGlzLl9mID0gMHg5YjA1Njg4Y1xuICB0aGlzLl9nID0gMHgxZjgzZDlhYlxuICB0aGlzLl9oID0gMHg1YmUwY2QxOVxuXG4gIHJldHVybiB0aGlzXG59XG5cbmZ1bmN0aW9uIGNoICh4LCB5LCB6KSB7XG4gIHJldHVybiB6IF4gKHggJiAoeSBeIHopKVxufVxuXG5mdW5jdGlvbiBtYWogKHgsIHksIHopIHtcbiAgcmV0dXJuICh4ICYgeSkgfCAoeiAmICh4IHwgeSkpXG59XG5cbmZ1bmN0aW9uIHNpZ21hMCAoeCkge1xuICByZXR1cm4gKHggPj4+IDIgfCB4IDw8IDMwKSBeICh4ID4+PiAxMyB8IHggPDwgMTkpIF4gKHggPj4+IDIyIHwgeCA8PCAxMClcbn1cblxuZnVuY3Rpb24gc2lnbWExICh4KSB7XG4gIHJldHVybiAoeCA+Pj4gNiB8IHggPDwgMjYpIF4gKHggPj4+IDExIHwgeCA8PCAyMSkgXiAoeCA+Pj4gMjUgfCB4IDw8IDcpXG59XG5cbmZ1bmN0aW9uIGdhbW1hMCAoeCkge1xuICByZXR1cm4gKHggPj4+IDcgfCB4IDw8IDI1KSBeICh4ID4+PiAxOCB8IHggPDwgMTQpIF4gKHggPj4+IDMpXG59XG5cbmZ1bmN0aW9uIGdhbW1hMSAoeCkge1xuICByZXR1cm4gKHggPj4+IDE3IHwgeCA8PCAxNSkgXiAoeCA+Pj4gMTkgfCB4IDw8IDEzKSBeICh4ID4+PiAxMClcbn1cblxuU2hhMjU2LnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKE0pIHtcbiAgdmFyIFcgPSB0aGlzLl93XG5cbiAgdmFyIGEgPSB0aGlzLl9hIHwgMFxuICB2YXIgYiA9IHRoaXMuX2IgfCAwXG4gIHZhciBjID0gdGhpcy5fYyB8IDBcbiAgdmFyIGQgPSB0aGlzLl9kIHwgMFxuICB2YXIgZSA9IHRoaXMuX2UgfCAwXG4gIHZhciBmID0gdGhpcy5fZiB8IDBcbiAgdmFyIGcgPSB0aGlzLl9nIHwgMFxuICB2YXIgaCA9IHRoaXMuX2ggfCAwXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSBXW2ldID0gTS5yZWFkSW50MzJCRShpICogNClcbiAgZm9yICg7IGkgPCA2NDsgKytpKSBXW2ldID0gKGdhbW1hMShXW2kgLSAyXSkgKyBXW2kgLSA3XSArIGdhbW1hMChXW2kgLSAxNV0pICsgV1tpIC0gMTZdKSB8IDBcblxuICBmb3IgKHZhciBqID0gMDsgaiA8IDY0OyArK2opIHtcbiAgICB2YXIgVDEgPSAoaCArIHNpZ21hMShlKSArIGNoKGUsIGYsIGcpICsgS1tqXSArIFdbal0pIHwgMFxuICAgIHZhciBUMiA9IChzaWdtYTAoYSkgKyBtYWooYSwgYiwgYykpIHwgMFxuXG4gICAgaCA9IGdcbiAgICBnID0gZlxuICAgIGYgPSBlXG4gICAgZSA9IChkICsgVDEpIHwgMFxuICAgIGQgPSBjXG4gICAgYyA9IGJcbiAgICBiID0gYVxuICAgIGEgPSAoVDEgKyBUMikgfCAwXG4gIH1cblxuICB0aGlzLl9hID0gKGEgKyB0aGlzLl9hKSB8IDBcbiAgdGhpcy5fYiA9IChiICsgdGhpcy5fYikgfCAwXG4gIHRoaXMuX2MgPSAoYyArIHRoaXMuX2MpIHwgMFxuICB0aGlzLl9kID0gKGQgKyB0aGlzLl9kKSB8IDBcbiAgdGhpcy5fZSA9IChlICsgdGhpcy5fZSkgfCAwXG4gIHRoaXMuX2YgPSAoZiArIHRoaXMuX2YpIHwgMFxuICB0aGlzLl9nID0gKGcgKyB0aGlzLl9nKSB8IDBcbiAgdGhpcy5faCA9IChoICsgdGhpcy5faCkgfCAwXG59XG5cblNoYTI1Ni5wcm90b3R5cGUuX2hhc2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBIID0gQnVmZmVyLmFsbG9jVW5zYWZlKDMyKVxuXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2EsIDApXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2IsIDQpXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2MsIDgpXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2QsIDEyKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9lLCAxNilcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZiwgMjApXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2csIDI0KVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9oLCAyOClcblxuICByZXR1cm4gSFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNoYTI1NlxuIiwidmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxudmFyIFNIQTUxMiA9IHJlcXVpcmUoJy4vc2hhNTEyJylcbnZhciBIYXNoID0gcmVxdWlyZSgnLi9oYXNoJylcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlclxuXG52YXIgVyA9IG5ldyBBcnJheSgxNjApXG5cbmZ1bmN0aW9uIFNoYTM4NCAoKSB7XG4gIHRoaXMuaW5pdCgpXG4gIHRoaXMuX3cgPSBXXG5cbiAgSGFzaC5jYWxsKHRoaXMsIDEyOCwgMTEyKVxufVxuXG5pbmhlcml0cyhTaGEzODQsIFNIQTUxMilcblxuU2hhMzg0LnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9haCA9IDB4Y2JiYjlkNWRcbiAgdGhpcy5fYmggPSAweDYyOWEyOTJhXG4gIHRoaXMuX2NoID0gMHg5MTU5MDE1YVxuICB0aGlzLl9kaCA9IDB4MTUyZmVjZDhcbiAgdGhpcy5fZWggPSAweDY3MzMyNjY3XG4gIHRoaXMuX2ZoID0gMHg4ZWI0NGE4N1xuICB0aGlzLl9naCA9IDB4ZGIwYzJlMGRcbiAgdGhpcy5faGggPSAweDQ3YjU0ODFkXG5cbiAgdGhpcy5fYWwgPSAweGMxMDU5ZWQ4XG4gIHRoaXMuX2JsID0gMHgzNjdjZDUwN1xuICB0aGlzLl9jbCA9IDB4MzA3MGRkMTdcbiAgdGhpcy5fZGwgPSAweGY3MGU1OTM5XG4gIHRoaXMuX2VsID0gMHhmZmMwMGIzMVxuICB0aGlzLl9mbCA9IDB4Njg1ODE1MTFcbiAgdGhpcy5fZ2wgPSAweDY0Zjk4ZmE3XG4gIHRoaXMuX2hsID0gMHhiZWZhNGZhNFxuXG4gIHJldHVybiB0aGlzXG59XG5cblNoYTM4NC5wcm90b3R5cGUuX2hhc2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBIID0gQnVmZmVyLmFsbG9jVW5zYWZlKDQ4KVxuXG4gIGZ1bmN0aW9uIHdyaXRlSW50NjRCRSAoaCwgbCwgb2Zmc2V0KSB7XG4gICAgSC53cml0ZUludDMyQkUoaCwgb2Zmc2V0KVxuICAgIEgud3JpdGVJbnQzMkJFKGwsIG9mZnNldCArIDQpXG4gIH1cblxuICB3cml0ZUludDY0QkUodGhpcy5fYWgsIHRoaXMuX2FsLCAwKVxuICB3cml0ZUludDY0QkUodGhpcy5fYmgsIHRoaXMuX2JsLCA4KVxuICB3cml0ZUludDY0QkUodGhpcy5fY2gsIHRoaXMuX2NsLCAxNilcbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2RoLCB0aGlzLl9kbCwgMjQpXG4gIHdyaXRlSW50NjRCRSh0aGlzLl9laCwgdGhpcy5fZWwsIDMyKVxuICB3cml0ZUludDY0QkUodGhpcy5fZmgsIHRoaXMuX2ZsLCA0MClcblxuICByZXR1cm4gSFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNoYTM4NFxuIiwidmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxudmFyIEhhc2ggPSByZXF1aXJlKCcuL2hhc2gnKVxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyXG5cbnZhciBLID0gW1xuICAweDQyOGEyZjk4LCAweGQ3MjhhZTIyLCAweDcxMzc0NDkxLCAweDIzZWY2NWNkLFxuICAweGI1YzBmYmNmLCAweGVjNGQzYjJmLCAweGU5YjVkYmE1LCAweDgxODlkYmJjLFxuICAweDM5NTZjMjViLCAweGYzNDhiNTM4LCAweDU5ZjExMWYxLCAweGI2MDVkMDE5LFxuICAweDkyM2Y4MmE0LCAweGFmMTk0ZjliLCAweGFiMWM1ZWQ1LCAweGRhNmQ4MTE4LFxuICAweGQ4MDdhYTk4LCAweGEzMDMwMjQyLCAweDEyODM1YjAxLCAweDQ1NzA2ZmJlLFxuICAweDI0MzE4NWJlLCAweDRlZTRiMjhjLCAweDU1MGM3ZGMzLCAweGQ1ZmZiNGUyLFxuICAweDcyYmU1ZDc0LCAweGYyN2I4OTZmLCAweDgwZGViMWZlLCAweDNiMTY5NmIxLFxuICAweDliZGMwNmE3LCAweDI1YzcxMjM1LCAweGMxOWJmMTc0LCAweGNmNjkyNjk0LFxuICAweGU0OWI2OWMxLCAweDllZjE0YWQyLCAweGVmYmU0Nzg2LCAweDM4NGYyNWUzLFxuICAweDBmYzE5ZGM2LCAweDhiOGNkNWI1LCAweDI0MGNhMWNjLCAweDc3YWM5YzY1LFxuICAweDJkZTkyYzZmLCAweDU5MmIwMjc1LCAweDRhNzQ4NGFhLCAweDZlYTZlNDgzLFxuICAweDVjYjBhOWRjLCAweGJkNDFmYmQ0LCAweDc2Zjk4OGRhLCAweDgzMTE1M2I1LFxuICAweDk4M2U1MTUyLCAweGVlNjZkZmFiLCAweGE4MzFjNjZkLCAweDJkYjQzMjEwLFxuICAweGIwMDMyN2M4LCAweDk4ZmIyMTNmLCAweGJmNTk3ZmM3LCAweGJlZWYwZWU0LFxuICAweGM2ZTAwYmYzLCAweDNkYTg4ZmMyLCAweGQ1YTc5MTQ3LCAweDkzMGFhNzI1LFxuICAweDA2Y2E2MzUxLCAweGUwMDM4MjZmLCAweDE0MjkyOTY3LCAweDBhMGU2ZTcwLFxuICAweDI3YjcwYTg1LCAweDQ2ZDIyZmZjLCAweDJlMWIyMTM4LCAweDVjMjZjOTI2LFxuICAweDRkMmM2ZGZjLCAweDVhYzQyYWVkLCAweDUzMzgwZDEzLCAweDlkOTViM2RmLFxuICAweDY1MGE3MzU0LCAweDhiYWY2M2RlLCAweDc2NmEwYWJiLCAweDNjNzdiMmE4LFxuICAweDgxYzJjOTJlLCAweDQ3ZWRhZWU2LCAweDkyNzIyYzg1LCAweDE0ODIzNTNiLFxuICAweGEyYmZlOGExLCAweDRjZjEwMzY0LCAweGE4MWE2NjRiLCAweGJjNDIzMDAxLFxuICAweGMyNGI4YjcwLCAweGQwZjg5NzkxLCAweGM3NmM1MWEzLCAweDA2NTRiZTMwLFxuICAweGQxOTJlODE5LCAweGQ2ZWY1MjE4LCAweGQ2OTkwNjI0LCAweDU1NjVhOTEwLFxuICAweGY0MGUzNTg1LCAweDU3NzEyMDJhLCAweDEwNmFhMDcwLCAweDMyYmJkMWI4LFxuICAweDE5YTRjMTE2LCAweGI4ZDJkMGM4LCAweDFlMzc2YzA4LCAweDUxNDFhYjUzLFxuICAweDI3NDg3NzRjLCAweGRmOGVlYjk5LCAweDM0YjBiY2I1LCAweGUxOWI0OGE4LFxuICAweDM5MWMwY2IzLCAweGM1Yzk1YTYzLCAweDRlZDhhYTRhLCAweGUzNDE4YWNiLFxuICAweDViOWNjYTRmLCAweDc3NjNlMzczLCAweDY4MmU2ZmYzLCAweGQ2YjJiOGEzLFxuICAweDc0OGY4MmVlLCAweDVkZWZiMmZjLCAweDc4YTU2MzZmLCAweDQzMTcyZjYwLFxuICAweDg0Yzg3ODE0LCAweGExZjBhYjcyLCAweDhjYzcwMjA4LCAweDFhNjQzOWVjLFxuICAweDkwYmVmZmZhLCAweDIzNjMxZTI4LCAweGE0NTA2Y2ViLCAweGRlODJiZGU5LFxuICAweGJlZjlhM2Y3LCAweGIyYzY3OTE1LCAweGM2NzE3OGYyLCAweGUzNzI1MzJiLFxuICAweGNhMjczZWNlLCAweGVhMjY2MTljLCAweGQxODZiOGM3LCAweDIxYzBjMjA3LFxuICAweGVhZGE3ZGQ2LCAweGNkZTBlYjFlLCAweGY1N2Q0ZjdmLCAweGVlNmVkMTc4LFxuICAweDA2ZjA2N2FhLCAweDcyMTc2ZmJhLCAweDBhNjM3ZGM1LCAweGEyYzg5OGE2LFxuICAweDExM2Y5ODA0LCAweGJlZjkwZGFlLCAweDFiNzEwYjM1LCAweDEzMWM0NzFiLFxuICAweDI4ZGI3N2Y1LCAweDIzMDQ3ZDg0LCAweDMyY2FhYjdiLCAweDQwYzcyNDkzLFxuICAweDNjOWViZTBhLCAweDE1YzliZWJjLCAweDQzMWQ2N2M0LCAweDljMTAwZDRjLFxuICAweDRjYzVkNGJlLCAweGNiM2U0MmI2LCAweDU5N2YyOTljLCAweGZjNjU3ZTJhLFxuICAweDVmY2I2ZmFiLCAweDNhZDZmYWVjLCAweDZjNDQxOThjLCAweDRhNDc1ODE3XG5dXG5cbnZhciBXID0gbmV3IEFycmF5KDE2MClcblxuZnVuY3Rpb24gU2hhNTEyICgpIHtcbiAgdGhpcy5pbml0KClcbiAgdGhpcy5fdyA9IFdcblxuICBIYXNoLmNhbGwodGhpcywgMTI4LCAxMTIpXG59XG5cbmluaGVyaXRzKFNoYTUxMiwgSGFzaClcblxuU2hhNTEyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9haCA9IDB4NmEwOWU2NjdcbiAgdGhpcy5fYmggPSAweGJiNjdhZTg1XG4gIHRoaXMuX2NoID0gMHgzYzZlZjM3MlxuICB0aGlzLl9kaCA9IDB4YTU0ZmY1M2FcbiAgdGhpcy5fZWggPSAweDUxMGU1MjdmXG4gIHRoaXMuX2ZoID0gMHg5YjA1Njg4Y1xuICB0aGlzLl9naCA9IDB4MWY4M2Q5YWJcbiAgdGhpcy5faGggPSAweDViZTBjZDE5XG5cbiAgdGhpcy5fYWwgPSAweGYzYmNjOTA4XG4gIHRoaXMuX2JsID0gMHg4NGNhYTczYlxuICB0aGlzLl9jbCA9IDB4ZmU5NGY4MmJcbiAgdGhpcy5fZGwgPSAweDVmMWQzNmYxXG4gIHRoaXMuX2VsID0gMHhhZGU2ODJkMVxuICB0aGlzLl9mbCA9IDB4MmIzZTZjMWZcbiAgdGhpcy5fZ2wgPSAweGZiNDFiZDZiXG4gIHRoaXMuX2hsID0gMHgxMzdlMjE3OVxuXG4gIHJldHVybiB0aGlzXG59XG5cbmZ1bmN0aW9uIENoICh4LCB5LCB6KSB7XG4gIHJldHVybiB6IF4gKHggJiAoeSBeIHopKVxufVxuXG5mdW5jdGlvbiBtYWogKHgsIHksIHopIHtcbiAgcmV0dXJuICh4ICYgeSkgfCAoeiAmICh4IHwgeSkpXG59XG5cbmZ1bmN0aW9uIHNpZ21hMCAoeCwgeGwpIHtcbiAgcmV0dXJuICh4ID4+PiAyOCB8IHhsIDw8IDQpIF4gKHhsID4+PiAyIHwgeCA8PCAzMCkgXiAoeGwgPj4+IDcgfCB4IDw8IDI1KVxufVxuXG5mdW5jdGlvbiBzaWdtYTEgKHgsIHhsKSB7XG4gIHJldHVybiAoeCA+Pj4gMTQgfCB4bCA8PCAxOCkgXiAoeCA+Pj4gMTggfCB4bCA8PCAxNCkgXiAoeGwgPj4+IDkgfCB4IDw8IDIzKVxufVxuXG5mdW5jdGlvbiBHYW1tYTAgKHgsIHhsKSB7XG4gIHJldHVybiAoeCA+Pj4gMSB8IHhsIDw8IDMxKSBeICh4ID4+PiA4IHwgeGwgPDwgMjQpIF4gKHggPj4+IDcpXG59XG5cbmZ1bmN0aW9uIEdhbW1hMGwgKHgsIHhsKSB7XG4gIHJldHVybiAoeCA+Pj4gMSB8IHhsIDw8IDMxKSBeICh4ID4+PiA4IHwgeGwgPDwgMjQpIF4gKHggPj4+IDcgfCB4bCA8PCAyNSlcbn1cblxuZnVuY3Rpb24gR2FtbWExICh4LCB4bCkge1xuICByZXR1cm4gKHggPj4+IDE5IHwgeGwgPDwgMTMpIF4gKHhsID4+PiAyOSB8IHggPDwgMykgXiAoeCA+Pj4gNilcbn1cblxuZnVuY3Rpb24gR2FtbWExbCAoeCwgeGwpIHtcbiAgcmV0dXJuICh4ID4+PiAxOSB8IHhsIDw8IDEzKSBeICh4bCA+Pj4gMjkgfCB4IDw8IDMpIF4gKHggPj4+IDYgfCB4bCA8PCAyNilcbn1cblxuZnVuY3Rpb24gZ2V0Q2FycnkgKGEsIGIpIHtcbiAgcmV0dXJuIChhID4+PiAwKSA8IChiID4+PiAwKSA/IDEgOiAwXG59XG5cblNoYTUxMi5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIChNKSB7XG4gIHZhciBXID0gdGhpcy5fd1xuXG4gIHZhciBhaCA9IHRoaXMuX2FoIHwgMFxuICB2YXIgYmggPSB0aGlzLl9iaCB8IDBcbiAgdmFyIGNoID0gdGhpcy5fY2ggfCAwXG4gIHZhciBkaCA9IHRoaXMuX2RoIHwgMFxuICB2YXIgZWggPSB0aGlzLl9laCB8IDBcbiAgdmFyIGZoID0gdGhpcy5fZmggfCAwXG4gIHZhciBnaCA9IHRoaXMuX2doIHwgMFxuICB2YXIgaGggPSB0aGlzLl9oaCB8IDBcblxuICB2YXIgYWwgPSB0aGlzLl9hbCB8IDBcbiAgdmFyIGJsID0gdGhpcy5fYmwgfCAwXG4gIHZhciBjbCA9IHRoaXMuX2NsIHwgMFxuICB2YXIgZGwgPSB0aGlzLl9kbCB8IDBcbiAgdmFyIGVsID0gdGhpcy5fZWwgfCAwXG4gIHZhciBmbCA9IHRoaXMuX2ZsIHwgMFxuICB2YXIgZ2wgPSB0aGlzLl9nbCB8IDBcbiAgdmFyIGhsID0gdGhpcy5faGwgfCAwXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAzMjsgaSArPSAyKSB7XG4gICAgV1tpXSA9IE0ucmVhZEludDMyQkUoaSAqIDQpXG4gICAgV1tpICsgMV0gPSBNLnJlYWRJbnQzMkJFKGkgKiA0ICsgNClcbiAgfVxuICBmb3IgKDsgaSA8IDE2MDsgaSArPSAyKSB7XG4gICAgdmFyIHhoID0gV1tpIC0gMTUgKiAyXVxuICAgIHZhciB4bCA9IFdbaSAtIDE1ICogMiArIDFdXG4gICAgdmFyIGdhbW1hMCA9IEdhbW1hMCh4aCwgeGwpXG4gICAgdmFyIGdhbW1hMGwgPSBHYW1tYTBsKHhsLCB4aClcblxuICAgIHhoID0gV1tpIC0gMiAqIDJdXG4gICAgeGwgPSBXW2kgLSAyICogMiArIDFdXG4gICAgdmFyIGdhbW1hMSA9IEdhbW1hMSh4aCwgeGwpXG4gICAgdmFyIGdhbW1hMWwgPSBHYW1tYTFsKHhsLCB4aClcblxuICAgIC8vIFdbaV0gPSBnYW1tYTAgKyBXW2kgLSA3XSArIGdhbW1hMSArIFdbaSAtIDE2XVxuICAgIHZhciBXaTdoID0gV1tpIC0gNyAqIDJdXG4gICAgdmFyIFdpN2wgPSBXW2kgLSA3ICogMiArIDFdXG5cbiAgICB2YXIgV2kxNmggPSBXW2kgLSAxNiAqIDJdXG4gICAgdmFyIFdpMTZsID0gV1tpIC0gMTYgKiAyICsgMV1cblxuICAgIHZhciBXaWwgPSAoZ2FtbWEwbCArIFdpN2wpIHwgMFxuICAgIHZhciBXaWggPSAoZ2FtbWEwICsgV2k3aCArIGdldENhcnJ5KFdpbCwgZ2FtbWEwbCkpIHwgMFxuICAgIFdpbCA9IChXaWwgKyBnYW1tYTFsKSB8IDBcbiAgICBXaWggPSAoV2loICsgZ2FtbWExICsgZ2V0Q2FycnkoV2lsLCBnYW1tYTFsKSkgfCAwXG4gICAgV2lsID0gKFdpbCArIFdpMTZsKSB8IDBcbiAgICBXaWggPSAoV2loICsgV2kxNmggKyBnZXRDYXJyeShXaWwsIFdpMTZsKSkgfCAwXG5cbiAgICBXW2ldID0gV2loXG4gICAgV1tpICsgMV0gPSBXaWxcbiAgfVxuXG4gIGZvciAodmFyIGogPSAwOyBqIDwgMTYwOyBqICs9IDIpIHtcbiAgICBXaWggPSBXW2pdXG4gICAgV2lsID0gV1tqICsgMV1cblxuICAgIHZhciBtYWpoID0gbWFqKGFoLCBiaCwgY2gpXG4gICAgdmFyIG1hamwgPSBtYWooYWwsIGJsLCBjbClcblxuICAgIHZhciBzaWdtYTBoID0gc2lnbWEwKGFoLCBhbClcbiAgICB2YXIgc2lnbWEwbCA9IHNpZ21hMChhbCwgYWgpXG4gICAgdmFyIHNpZ21hMWggPSBzaWdtYTEoZWgsIGVsKVxuICAgIHZhciBzaWdtYTFsID0gc2lnbWExKGVsLCBlaClcblxuICAgIC8vIHQxID0gaCArIHNpZ21hMSArIGNoICsgS1tqXSArIFdbal1cbiAgICB2YXIgS2loID0gS1tqXVxuICAgIHZhciBLaWwgPSBLW2ogKyAxXVxuXG4gICAgdmFyIGNoaCA9IENoKGVoLCBmaCwgZ2gpXG4gICAgdmFyIGNobCA9IENoKGVsLCBmbCwgZ2wpXG5cbiAgICB2YXIgdDFsID0gKGhsICsgc2lnbWExbCkgfCAwXG4gICAgdmFyIHQxaCA9IChoaCArIHNpZ21hMWggKyBnZXRDYXJyeSh0MWwsIGhsKSkgfCAwXG4gICAgdDFsID0gKHQxbCArIGNobCkgfCAwXG4gICAgdDFoID0gKHQxaCArIGNoaCArIGdldENhcnJ5KHQxbCwgY2hsKSkgfCAwXG4gICAgdDFsID0gKHQxbCArIEtpbCkgfCAwXG4gICAgdDFoID0gKHQxaCArIEtpaCArIGdldENhcnJ5KHQxbCwgS2lsKSkgfCAwXG4gICAgdDFsID0gKHQxbCArIFdpbCkgfCAwXG4gICAgdDFoID0gKHQxaCArIFdpaCArIGdldENhcnJ5KHQxbCwgV2lsKSkgfCAwXG5cbiAgICAvLyB0MiA9IHNpZ21hMCArIG1halxuICAgIHZhciB0MmwgPSAoc2lnbWEwbCArIG1hamwpIHwgMFxuICAgIHZhciB0MmggPSAoc2lnbWEwaCArIG1hamggKyBnZXRDYXJyeSh0MmwsIHNpZ21hMGwpKSB8IDBcblxuICAgIGhoID0gZ2hcbiAgICBobCA9IGdsXG4gICAgZ2ggPSBmaFxuICAgIGdsID0gZmxcbiAgICBmaCA9IGVoXG4gICAgZmwgPSBlbFxuICAgIGVsID0gKGRsICsgdDFsKSB8IDBcbiAgICBlaCA9IChkaCArIHQxaCArIGdldENhcnJ5KGVsLCBkbCkpIHwgMFxuICAgIGRoID0gY2hcbiAgICBkbCA9IGNsXG4gICAgY2ggPSBiaFxuICAgIGNsID0gYmxcbiAgICBiaCA9IGFoXG4gICAgYmwgPSBhbFxuICAgIGFsID0gKHQxbCArIHQybCkgfCAwXG4gICAgYWggPSAodDFoICsgdDJoICsgZ2V0Q2FycnkoYWwsIHQxbCkpIHwgMFxuICB9XG5cbiAgdGhpcy5fYWwgPSAodGhpcy5fYWwgKyBhbCkgfCAwXG4gIHRoaXMuX2JsID0gKHRoaXMuX2JsICsgYmwpIHwgMFxuICB0aGlzLl9jbCA9ICh0aGlzLl9jbCArIGNsKSB8IDBcbiAgdGhpcy5fZGwgPSAodGhpcy5fZGwgKyBkbCkgfCAwXG4gIHRoaXMuX2VsID0gKHRoaXMuX2VsICsgZWwpIHwgMFxuICB0aGlzLl9mbCA9ICh0aGlzLl9mbCArIGZsKSB8IDBcbiAgdGhpcy5fZ2wgPSAodGhpcy5fZ2wgKyBnbCkgfCAwXG4gIHRoaXMuX2hsID0gKHRoaXMuX2hsICsgaGwpIHwgMFxuXG4gIHRoaXMuX2FoID0gKHRoaXMuX2FoICsgYWggKyBnZXRDYXJyeSh0aGlzLl9hbCwgYWwpKSB8IDBcbiAgdGhpcy5fYmggPSAodGhpcy5fYmggKyBiaCArIGdldENhcnJ5KHRoaXMuX2JsLCBibCkpIHwgMFxuICB0aGlzLl9jaCA9ICh0aGlzLl9jaCArIGNoICsgZ2V0Q2FycnkodGhpcy5fY2wsIGNsKSkgfCAwXG4gIHRoaXMuX2RoID0gKHRoaXMuX2RoICsgZGggKyBnZXRDYXJyeSh0aGlzLl9kbCwgZGwpKSB8IDBcbiAgdGhpcy5fZWggPSAodGhpcy5fZWggKyBlaCArIGdldENhcnJ5KHRoaXMuX2VsLCBlbCkpIHwgMFxuICB0aGlzLl9maCA9ICh0aGlzLl9maCArIGZoICsgZ2V0Q2FycnkodGhpcy5fZmwsIGZsKSkgfCAwXG4gIHRoaXMuX2doID0gKHRoaXMuX2doICsgZ2ggKyBnZXRDYXJyeSh0aGlzLl9nbCwgZ2wpKSB8IDBcbiAgdGhpcy5faGggPSAodGhpcy5faGggKyBoaCArIGdldENhcnJ5KHRoaXMuX2hsLCBobCkpIHwgMFxufVxuXG5TaGE1MTIucHJvdG90eXBlLl9oYXNoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgSCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSg2NClcblxuICBmdW5jdGlvbiB3cml0ZUludDY0QkUgKGgsIGwsIG9mZnNldCkge1xuICAgIEgud3JpdGVJbnQzMkJFKGgsIG9mZnNldClcbiAgICBILndyaXRlSW50MzJCRShsLCBvZmZzZXQgKyA0KVxuICB9XG5cbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2FoLCB0aGlzLl9hbCwgMClcbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2JoLCB0aGlzLl9ibCwgOClcbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2NoLCB0aGlzLl9jbCwgMTYpXG4gIHdyaXRlSW50NjRCRSh0aGlzLl9kaCwgdGhpcy5fZGwsIDI0KVxuICB3cml0ZUludDY0QkUodGhpcy5fZWgsIHRoaXMuX2VsLCAzMilcbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2ZoLCB0aGlzLl9mbCwgNDApXG4gIHdyaXRlSW50NjRCRSh0aGlzLl9naCwgdGhpcy5fZ2wsIDQ4KVxuICB3cml0ZUludDY0QkUodGhpcy5faGgsIHRoaXMuX2hsLCA1NilcblxuICByZXR1cm4gSFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNoYTUxMlxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbm1vZHVsZS5leHBvcnRzID0gU3RyZWFtO1xuXG52YXIgRUUgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5pbmhlcml0cyhTdHJlYW0sIEVFKTtcblN0cmVhbS5SZWFkYWJsZSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS9yZWFkYWJsZS5qcycpO1xuU3RyZWFtLldyaXRhYmxlID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL3dyaXRhYmxlLmpzJyk7XG5TdHJlYW0uRHVwbGV4ID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL2R1cGxleC5qcycpO1xuU3RyZWFtLlRyYW5zZm9ybSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS90cmFuc2Zvcm0uanMnKTtcblN0cmVhbS5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS9wYXNzdGhyb3VnaC5qcycpO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjQueFxuU3RyZWFtLlN0cmVhbSA9IFN0cmVhbTtcblxuXG5cbi8vIG9sZC1zdHlsZSBzdHJlYW1zLiAgTm90ZSB0aGF0IHRoZSBwaXBlIG1ldGhvZCAodGhlIG9ubHkgcmVsZXZhbnRcbi8vIHBhcnQgb2YgdGhpcyBjbGFzcykgaXMgb3ZlcnJpZGRlbiBpbiB0aGUgUmVhZGFibGUgY2xhc3MuXG5cbmZ1bmN0aW9uIFN0cmVhbSgpIHtcbiAgRUUuY2FsbCh0aGlzKTtcbn1cblxuU3RyZWFtLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24oZGVzdCwgb3B0aW9ucykge1xuICB2YXIgc291cmNlID0gdGhpcztcblxuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBpZiAoZGVzdC53cml0YWJsZSkge1xuICAgICAgaWYgKGZhbHNlID09PSBkZXN0LndyaXRlKGNodW5rKSAmJiBzb3VyY2UucGF1c2UpIHtcbiAgICAgICAgc291cmNlLnBhdXNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc291cmNlLm9uKCdkYXRhJywgb25kYXRhKTtcblxuICBmdW5jdGlvbiBvbmRyYWluKCkge1xuICAgIGlmIChzb3VyY2UucmVhZGFibGUgJiYgc291cmNlLnJlc3VtZSkge1xuICAgICAgc291cmNlLnJlc3VtZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgLy8gSWYgdGhlICdlbmQnIG9wdGlvbiBpcyBub3Qgc3VwcGxpZWQsIGRlc3QuZW5kKCkgd2lsbCBiZSBjYWxsZWQgd2hlblxuICAvLyBzb3VyY2UgZ2V0cyB0aGUgJ2VuZCcgb3IgJ2Nsb3NlJyBldmVudHMuICBPbmx5IGRlc3QuZW5kKCkgb25jZS5cbiAgaWYgKCFkZXN0Ll9pc1N0ZGlvICYmICghb3B0aW9ucyB8fCBvcHRpb25zLmVuZCAhPT0gZmFsc2UpKSB7XG4gICAgc291cmNlLm9uKCdlbmQnLCBvbmVuZCk7XG4gICAgc291cmNlLm9uKCdjbG9zZScsIG9uY2xvc2UpO1xuICB9XG5cbiAgdmFyIGRpZE9uRW5kID0gZmFsc2U7XG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGlmIChkaWRPbkVuZCkgcmV0dXJuO1xuICAgIGRpZE9uRW5kID0gdHJ1ZTtcblxuICAgIGRlc3QuZW5kKCk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm47XG4gICAgZGlkT25FbmQgPSB0cnVlO1xuXG4gICAgaWYgKHR5cGVvZiBkZXN0LmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIGRlc3QuZGVzdHJveSgpO1xuICB9XG5cbiAgLy8gZG9uJ3QgbGVhdmUgZGFuZ2xpbmcgcGlwZXMgd2hlbiB0aGVyZSBhcmUgZXJyb3JzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgY2xlYW51cCgpO1xuICAgIGlmIChFRS5saXN0ZW5lckNvdW50KHRoaXMsICdlcnJvcicpID09PSAwKSB7XG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkIHN0cmVhbSBlcnJvciBpbiBwaXBlLlxuICAgIH1cbiAgfVxuXG4gIHNvdXJjZS5vbignZXJyb3InLCBvbmVycm9yKTtcbiAgZGVzdC5vbignZXJyb3InLCBvbmVycm9yKTtcblxuICAvLyByZW1vdmUgYWxsIHRoZSBldmVudCBsaXN0ZW5lcnMgdGhhdCB3ZXJlIGFkZGVkLlxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcblxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcblxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBjbGVhbnVwKTtcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIGNsZWFudXApO1xuICB9XG5cbiAgc291cmNlLm9uKCdlbmQnLCBjbGVhbnVwKTtcbiAgc291cmNlLm9uKCdjbG9zZScsIGNsZWFudXApO1xuXG4gIGRlc3Qub24oJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgZGVzdC5lbWl0KCdwaXBlJywgc291cmNlKTtcblxuICAvLyBBbGxvdyBmb3IgdW5peC1saWtlIHVzYWdlOiBBLnBpcGUoQikucGlwZShDKVxuICByZXR1cm4gZGVzdDtcbn07XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIGlzRW5jb2RpbmcgPSBCdWZmZXIuaXNFbmNvZGluZyB8fCBmdW5jdGlvbiAoZW5jb2RpbmcpIHtcbiAgZW5jb2RpbmcgPSAnJyArIGVuY29kaW5nO1xuICBzd2l0Y2ggKGVuY29kaW5nICYmIGVuY29kaW5nLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOmNhc2UgJ3V0ZjgnOmNhc2UgJ3V0Zi04JzpjYXNlICdhc2NpaSc6Y2FzZSAnYmluYXJ5JzpjYXNlICdiYXNlNjQnOmNhc2UgJ3VjczInOmNhc2UgJ3Vjcy0yJzpjYXNlICd1dGYxNmxlJzpjYXNlICd1dGYtMTZsZSc6Y2FzZSAncmF3JzpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVFbmNvZGluZyhlbmMpIHtcbiAgaWYgKCFlbmMpIHJldHVybiAndXRmOCc7XG4gIHZhciByZXRyaWVkO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jKSB7XG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuICd1dGY4JztcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiAndXRmMTZsZSc7XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuICdsYXRpbjEnO1xuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBlbmM7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAocmV0cmllZCkgcmV0dXJuOyAvLyB1bmRlZmluZWRcbiAgICAgICAgZW5jID0gKCcnICsgZW5jKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXRyaWVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIERvIG5vdCBjYWNoZSBgQnVmZmVyLmlzRW5jb2RpbmdgIHdoZW4gY2hlY2tpbmcgZW5jb2RpbmcgbmFtZXMgYXMgc29tZVxuLy8gbW9kdWxlcyBtb25rZXktcGF0Y2ggaXQgdG8gc3VwcG9ydCBhZGRpdGlvbmFsIGVuY29kaW5nc1xuZnVuY3Rpb24gbm9ybWFsaXplRW5jb2RpbmcoZW5jKSB7XG4gIHZhciBuZW5jID0gX25vcm1hbGl6ZUVuY29kaW5nKGVuYyk7XG4gIGlmICh0eXBlb2YgbmVuYyAhPT0gJ3N0cmluZycgJiYgKEJ1ZmZlci5pc0VuY29kaW5nID09PSBpc0VuY29kaW5nIHx8ICFpc0VuY29kaW5nKGVuYykpKSB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmMpO1xuICByZXR1cm4gbmVuYyB8fCBlbmM7XG59XG5cbi8vIFN0cmluZ0RlY29kZXIgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBlZmZpY2llbnRseSBzcGxpdHRpbmcgYSBzZXJpZXMgb2Zcbi8vIGJ1ZmZlcnMgaW50byBhIHNlcmllcyBvZiBKUyBzdHJpbmdzIHdpdGhvdXQgYnJlYWtpbmcgYXBhcnQgbXVsdGktYnl0ZVxuLy8gY2hhcmFjdGVycy5cbmV4cG9ydHMuU3RyaW5nRGVjb2RlciA9IFN0cmluZ0RlY29kZXI7XG5mdW5jdGlvbiBTdHJpbmdEZWNvZGVyKGVuY29kaW5nKSB7XG4gIHRoaXMuZW5jb2RpbmcgPSBub3JtYWxpemVFbmNvZGluZyhlbmNvZGluZyk7XG4gIHZhciBuYjtcbiAgc3dpdGNoICh0aGlzLmVuY29kaW5nKSB7XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICB0aGlzLnRleHQgPSB1dGYxNlRleHQ7XG4gICAgICB0aGlzLmVuZCA9IHV0ZjE2RW5kO1xuICAgICAgbmIgPSA0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndXRmOCc6XG4gICAgICB0aGlzLmZpbGxMYXN0ID0gdXRmOEZpbGxMYXN0O1xuICAgICAgbmIgPSA0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgIHRoaXMudGV4dCA9IGJhc2U2NFRleHQ7XG4gICAgICB0aGlzLmVuZCA9IGJhc2U2NEVuZDtcbiAgICAgIG5iID0gMztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aGlzLndyaXRlID0gc2ltcGxlV3JpdGU7XG4gICAgICB0aGlzLmVuZCA9IHNpbXBsZUVuZDtcbiAgICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmxhc3ROZWVkID0gMDtcbiAgdGhpcy5sYXN0VG90YWwgPSAwO1xuICB0aGlzLmxhc3RDaGFyID0gQnVmZmVyLmFsbG9jVW5zYWZlKG5iKTtcbn1cblxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gIHZhciByO1xuICB2YXIgaTtcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHtcbiAgICByID0gdGhpcy5maWxsTGFzdChidWYpO1xuICAgIGlmIChyID09PSB1bmRlZmluZWQpIHJldHVybiAnJztcbiAgICBpID0gdGhpcy5sYXN0TmVlZDtcbiAgICB0aGlzLmxhc3ROZWVkID0gMDtcbiAgfSBlbHNlIHtcbiAgICBpID0gMDtcbiAgfVxuICBpZiAoaSA8IGJ1Zi5sZW5ndGgpIHJldHVybiByID8gciArIHRoaXMudGV4dChidWYsIGkpIDogdGhpcy50ZXh0KGJ1ZiwgaSk7XG4gIHJldHVybiByIHx8ICcnO1xufTtcblxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gdXRmOEVuZDtcblxuLy8gUmV0dXJucyBvbmx5IGNvbXBsZXRlIGNoYXJhY3RlcnMgaW4gYSBCdWZmZXJcblN0cmluZ0RlY29kZXIucHJvdG90eXBlLnRleHQgPSB1dGY4VGV4dDtcblxuLy8gQXR0ZW1wdHMgdG8gY29tcGxldGUgYSBwYXJ0aWFsIG5vbi1VVEYtOCBjaGFyYWN0ZXIgdXNpbmcgYnl0ZXMgZnJvbSBhIEJ1ZmZlclxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZmlsbExhc3QgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIGlmICh0aGlzLmxhc3ROZWVkIDw9IGJ1Zi5sZW5ndGgpIHtcbiAgICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQsIDAsIHRoaXMubGFzdE5lZWQpO1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIHRoaXMubGFzdFRvdGFsKTtcbiAgfVxuICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQsIDAsIGJ1Zi5sZW5ndGgpO1xuICB0aGlzLmxhc3ROZWVkIC09IGJ1Zi5sZW5ndGg7XG59O1xuXG4vLyBDaGVja3MgdGhlIHR5cGUgb2YgYSBVVEYtOCBieXRlLCB3aGV0aGVyIGl0J3MgQVNDSUksIGEgbGVhZGluZyBieXRlLCBvciBhXG4vLyBjb250aW51YXRpb24gYnl0ZS4gSWYgYW4gaW52YWxpZCBieXRlIGlzIGRldGVjdGVkLCAtMiBpcyByZXR1cm5lZC5cbmZ1bmN0aW9uIHV0ZjhDaGVja0J5dGUoYnl0ZSkge1xuICBpZiAoYnl0ZSA8PSAweDdGKSByZXR1cm4gMDtlbHNlIGlmIChieXRlID4+IDUgPT09IDB4MDYpIHJldHVybiAyO2Vsc2UgaWYgKGJ5dGUgPj4gNCA9PT0gMHgwRSkgcmV0dXJuIDM7ZWxzZSBpZiAoYnl0ZSA+PiAzID09PSAweDFFKSByZXR1cm4gNDtcbiAgcmV0dXJuIGJ5dGUgPj4gNiA9PT0gMHgwMiA/IC0xIDogLTI7XG59XG5cbi8vIENoZWNrcyBhdCBtb3N0IDMgYnl0ZXMgYXQgdGhlIGVuZCBvZiBhIEJ1ZmZlciBpbiBvcmRlciB0byBkZXRlY3QgYW5cbi8vIGluY29tcGxldGUgbXVsdGktYnl0ZSBVVEYtOCBjaGFyYWN0ZXIuIFRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgKDIsIDMsIG9yIDQpXG4vLyBuZWVkZWQgdG8gY29tcGxldGUgdGhlIFVURi04IGNoYXJhY3RlciAoaWYgYXBwbGljYWJsZSkgYXJlIHJldHVybmVkLlxuZnVuY3Rpb24gdXRmOENoZWNrSW5jb21wbGV0ZShzZWxmLCBidWYsIGkpIHtcbiAgdmFyIGogPSBidWYubGVuZ3RoIC0gMTtcbiAgaWYgKGogPCBpKSByZXR1cm4gMDtcbiAgdmFyIG5iID0gdXRmOENoZWNrQnl0ZShidWZbal0pO1xuICBpZiAobmIgPj0gMCkge1xuICAgIGlmIChuYiA+IDApIHNlbGYubGFzdE5lZWQgPSBuYiAtIDE7XG4gICAgcmV0dXJuIG5iO1xuICB9XG4gIGlmICgtLWogPCBpIHx8IG5iID09PSAtMikgcmV0dXJuIDA7XG4gIG5iID0gdXRmOENoZWNrQnl0ZShidWZbal0pO1xuICBpZiAobmIgPj0gMCkge1xuICAgIGlmIChuYiA+IDApIHNlbGYubGFzdE5lZWQgPSBuYiAtIDI7XG4gICAgcmV0dXJuIG5iO1xuICB9XG4gIGlmICgtLWogPCBpIHx8IG5iID09PSAtMikgcmV0dXJuIDA7XG4gIG5iID0gdXRmOENoZWNrQnl0ZShidWZbal0pO1xuICBpZiAobmIgPj0gMCkge1xuICAgIGlmIChuYiA+IDApIHtcbiAgICAgIGlmIChuYiA9PT0gMikgbmIgPSAwO2Vsc2Ugc2VsZi5sYXN0TmVlZCA9IG5iIC0gMztcbiAgICB9XG4gICAgcmV0dXJuIG5iO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vLyBWYWxpZGF0ZXMgYXMgbWFueSBjb250aW51YXRpb24gYnl0ZXMgZm9yIGEgbXVsdGktYnl0ZSBVVEYtOCBjaGFyYWN0ZXIgYXNcbi8vIG5lZWRlZCBvciBhcmUgYXZhaWxhYmxlLiBJZiB3ZSBzZWUgYSBub24tY29udGludWF0aW9uIGJ5dGUgd2hlcmUgd2UgZXhwZWN0XG4vLyBvbmUsIHdlIFwicmVwbGFjZVwiIHRoZSB2YWxpZGF0ZWQgY29udGludWF0aW9uIGJ5dGVzIHdlJ3ZlIHNlZW4gc28gZmFyIHdpdGhcbi8vIGEgc2luZ2xlIFVURi04IHJlcGxhY2VtZW50IGNoYXJhY3RlciAoJ1xcdWZmZmQnKSwgdG8gbWF0Y2ggdjgncyBVVEYtOCBkZWNvZGluZ1xuLy8gYmVoYXZpb3IuIFRoZSBjb250aW51YXRpb24gYnl0ZSBjaGVjayBpcyBpbmNsdWRlZCB0aHJlZSB0aW1lcyBpbiB0aGUgY2FzZVxuLy8gd2hlcmUgYWxsIG9mIHRoZSBjb250aW51YXRpb24gYnl0ZXMgZm9yIGEgY2hhcmFjdGVyIGV4aXN0IGluIHRoZSBzYW1lIGJ1ZmZlci5cbi8vIEl0IGlzIGFsc28gZG9uZSB0aGlzIHdheSBhcyBhIHNsaWdodCBwZXJmb3JtYW5jZSBpbmNyZWFzZSBpbnN0ZWFkIG9mIHVzaW5nIGFcbi8vIGxvb3AuXG5mdW5jdGlvbiB1dGY4Q2hlY2tFeHRyYUJ5dGVzKHNlbGYsIGJ1ZiwgcCkge1xuICBpZiAoKGJ1ZlswXSAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgc2VsZi5sYXN0TmVlZCA9IDA7XG4gICAgcmV0dXJuICdcXHVmZmZkJztcbiAgfVxuICBpZiAoc2VsZi5sYXN0TmVlZCA+IDEgJiYgYnVmLmxlbmd0aCA+IDEpIHtcbiAgICBpZiAoKGJ1ZlsxXSAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICBzZWxmLmxhc3ROZWVkID0gMTtcbiAgICAgIHJldHVybiAnXFx1ZmZmZCc7XG4gICAgfVxuICAgIGlmIChzZWxmLmxhc3ROZWVkID4gMiAmJiBidWYubGVuZ3RoID4gMikge1xuICAgICAgaWYgKChidWZbMl0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICBzZWxmLmxhc3ROZWVkID0gMjtcbiAgICAgICAgcmV0dXJuICdcXHVmZmZkJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gQXR0ZW1wdHMgdG8gY29tcGxldGUgYSBtdWx0aS1ieXRlIFVURi04IGNoYXJhY3RlciB1c2luZyBieXRlcyBmcm9tIGEgQnVmZmVyLlxuZnVuY3Rpb24gdXRmOEZpbGxMYXN0KGJ1Zikge1xuICB2YXIgcCA9IHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZDtcbiAgdmFyIHIgPSB1dGY4Q2hlY2tFeHRyYUJ5dGVzKHRoaXMsIGJ1ZiwgcCk7XG4gIGlmIChyICE9PSB1bmRlZmluZWQpIHJldHVybiByO1xuICBpZiAodGhpcy5sYXN0TmVlZCA8PSBidWYubGVuZ3RoKSB7XG4gICAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgcCwgMCwgdGhpcy5sYXN0TmVlZCk7XG4gICAgcmV0dXJuIHRoaXMubGFzdENoYXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywgMCwgdGhpcy5sYXN0VG90YWwpO1xuICB9XG4gIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIHAsIDAsIGJ1Zi5sZW5ndGgpO1xuICB0aGlzLmxhc3ROZWVkIC09IGJ1Zi5sZW5ndGg7XG59XG5cbi8vIFJldHVybnMgYWxsIGNvbXBsZXRlIFVURi04IGNoYXJhY3RlcnMgaW4gYSBCdWZmZXIuIElmIHRoZSBCdWZmZXIgZW5kZWQgb24gYVxuLy8gcGFydGlhbCBjaGFyYWN0ZXIsIHRoZSBjaGFyYWN0ZXIncyBieXRlcyBhcmUgYnVmZmVyZWQgdW50aWwgdGhlIHJlcXVpcmVkXG4vLyBudW1iZXIgb2YgYnl0ZXMgYXJlIGF2YWlsYWJsZS5cbmZ1bmN0aW9uIHV0ZjhUZXh0KGJ1ZiwgaSkge1xuICB2YXIgdG90YWwgPSB1dGY4Q2hlY2tJbmNvbXBsZXRlKHRoaXMsIGJ1ZiwgaSk7XG4gIGlmICghdGhpcy5sYXN0TmVlZCkgcmV0dXJuIGJ1Zi50b1N0cmluZygndXRmOCcsIGkpO1xuICB0aGlzLmxhc3RUb3RhbCA9IHRvdGFsO1xuICB2YXIgZW5kID0gYnVmLmxlbmd0aCAtICh0b3RhbCAtIHRoaXMubGFzdE5lZWQpO1xuICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCAwLCBlbmQpO1xuICByZXR1cm4gYnVmLnRvU3RyaW5nKCd1dGY4JywgaSwgZW5kKTtcbn1cblxuLy8gRm9yIFVURi04LCBhIHJlcGxhY2VtZW50IGNoYXJhY3RlciBpcyBhZGRlZCB3aGVuIGVuZGluZyBvbiBhIHBhcnRpYWxcbi8vIGNoYXJhY3Rlci5cbmZ1bmN0aW9uIHV0ZjhFbmQoYnVmKSB7XG4gIHZhciByID0gYnVmICYmIGJ1Zi5sZW5ndGggPyB0aGlzLndyaXRlKGJ1ZikgOiAnJztcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHJldHVybiByICsgJ1xcdWZmZmQnO1xuICByZXR1cm4gcjtcbn1cblxuLy8gVVRGLTE2TEUgdHlwaWNhbGx5IG5lZWRzIHR3byBieXRlcyBwZXIgY2hhcmFjdGVyLCBidXQgZXZlbiBpZiB3ZSBoYXZlIGFuIGV2ZW5cbi8vIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUsIHdlIG5lZWQgdG8gY2hlY2sgaWYgd2UgZW5kIG9uIGEgbGVhZGluZy9oaWdoXG4vLyBzdXJyb2dhdGUuIEluIHRoYXQgY2FzZSwgd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgbmV4dCB0d28gYnl0ZXMgaW4gb3JkZXIgdG9cbi8vIGRlY29kZSB0aGUgbGFzdCBjaGFyYWN0ZXIgcHJvcGVybHkuXG5mdW5jdGlvbiB1dGYxNlRleHQoYnVmLCBpKSB7XG4gIGlmICgoYnVmLmxlbmd0aCAtIGkpICUgMiA9PT0gMCkge1xuICAgIHZhciByID0gYnVmLnRvU3RyaW5nKCd1dGYxNmxlJywgaSk7XG4gICAgaWYgKHIpIHtcbiAgICAgIHZhciBjID0gci5jaGFyQ29kZUF0KHIubGVuZ3RoIC0gMSk7XG4gICAgICBpZiAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERCRkYpIHtcbiAgICAgICAgdGhpcy5sYXN0TmVlZCA9IDI7XG4gICAgICAgIHRoaXMubGFzdFRvdGFsID0gNDtcbiAgICAgICAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMl07XG4gICAgICAgIHRoaXMubGFzdENoYXJbMV0gPSBidWZbYnVmLmxlbmd0aCAtIDFdO1xuICAgICAgICByZXR1cm4gci5zbGljZSgwLCAtMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG4gIHRoaXMubGFzdE5lZWQgPSAxO1xuICB0aGlzLmxhc3RUb3RhbCA9IDI7XG4gIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDFdO1xuICByZXR1cm4gYnVmLnRvU3RyaW5nKCd1dGYxNmxlJywgaSwgYnVmLmxlbmd0aCAtIDEpO1xufVxuXG4vLyBGb3IgVVRGLTE2TEUgd2UgZG8gbm90IGV4cGxpY2l0bHkgYXBwZW5kIHNwZWNpYWwgcmVwbGFjZW1lbnQgY2hhcmFjdGVycyBpZiB3ZVxuLy8gZW5kIG9uIGEgcGFydGlhbCBjaGFyYWN0ZXIsIHdlIHNpbXBseSBsZXQgdjggaGFuZGxlIHRoYXQuXG5mdW5jdGlvbiB1dGYxNkVuZChidWYpIHtcbiAgdmFyIHIgPSBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICcnO1xuICBpZiAodGhpcy5sYXN0TmVlZCkge1xuICAgIHZhciBlbmQgPSB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQ7XG4gICAgcmV0dXJuIHIgKyB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKCd1dGYxNmxlJywgMCwgZW5kKTtcbiAgfVxuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gYmFzZTY0VGV4dChidWYsIGkpIHtcbiAgdmFyIG4gPSAoYnVmLmxlbmd0aCAtIGkpICUgMztcbiAgaWYgKG4gPT09IDApIHJldHVybiBidWYudG9TdHJpbmcoJ2Jhc2U2NCcsIGkpO1xuICB0aGlzLmxhc3ROZWVkID0gMyAtIG47XG4gIHRoaXMubGFzdFRvdGFsID0gMztcbiAgaWYgKG4gPT09IDEpIHtcbiAgICB0aGlzLmxhc3RDaGFyWzBdID0gYnVmW2J1Zi5sZW5ndGggLSAxXTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmxhc3RDaGFyWzBdID0gYnVmW2J1Zi5sZW5ndGggLSAyXTtcbiAgICB0aGlzLmxhc3RDaGFyWzFdID0gYnVmW2J1Zi5sZW5ndGggLSAxXTtcbiAgfVxuICByZXR1cm4gYnVmLnRvU3RyaW5nKCdiYXNlNjQnLCBpLCBidWYubGVuZ3RoIC0gbik7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NEVuZChidWYpIHtcbiAgdmFyIHIgPSBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICcnO1xuICBpZiAodGhpcy5sYXN0TmVlZCkgcmV0dXJuIHIgKyB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKCdiYXNlNjQnLCAwLCAzIC0gdGhpcy5sYXN0TmVlZCk7XG4gIHJldHVybiByO1xufVxuXG4vLyBQYXNzIGJ5dGVzIG9uIHRocm91Z2ggZm9yIHNpbmdsZS1ieXRlIGVuY29kaW5ncyAoZS5nLiBhc2NpaSwgbGF0aW4xLCBoZXgpXG5mdW5jdGlvbiBzaW1wbGVXcml0ZShidWYpIHtcbiAgcmV0dXJuIGJ1Zi50b1N0cmluZyh0aGlzLmVuY29kaW5nKTtcbn1cblxuZnVuY3Rpb24gc2ltcGxlRW5kKGJ1Zikge1xuICByZXR1cm4gYnVmICYmIGJ1Zi5sZW5ndGggPyB0aGlzLndyaXRlKGJ1ZikgOiAnJztcbn0iLCJ2YXIgc2NvcGUgPSAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwpIHx8XG4gICAgICAgICAgICAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZikgfHxcbiAgICAgICAgICAgIHdpbmRvdztcbnZhciBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcblxuLy8gRE9NIEFQSXMsIGZvciBjb21wbGV0ZW5lc3NcblxuZXhwb3J0cy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldFRpbWVvdXQsIHNjb3BlLCBhcmd1bWVudHMpLCBjbGVhclRpbWVvdXQpO1xufTtcbmV4cG9ydHMuc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0SW50ZXJ2YWwsIHNjb3BlLCBhcmd1bWVudHMpLCBjbGVhckludGVydmFsKTtcbn07XG5leHBvcnRzLmNsZWFyVGltZW91dCA9XG5leHBvcnRzLmNsZWFySW50ZXJ2YWwgPSBmdW5jdGlvbih0aW1lb3V0KSB7XG4gIGlmICh0aW1lb3V0KSB7XG4gICAgdGltZW91dC5jbG9zZSgpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBUaW1lb3V0KGlkLCBjbGVhckZuKSB7XG4gIHRoaXMuX2lkID0gaWQ7XG4gIHRoaXMuX2NsZWFyRm4gPSBjbGVhckZuO1xufVxuVGltZW91dC5wcm90b3R5cGUudW5yZWYgPSBUaW1lb3V0LnByb3RvdHlwZS5yZWYgPSBmdW5jdGlvbigpIHt9O1xuVGltZW91dC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fY2xlYXJGbi5jYWxsKHNjb3BlLCB0aGlzLl9pZCk7XG59O1xuXG4vLyBEb2VzIG5vdCBzdGFydCB0aGUgdGltZSwganVzdCBzZXRzIHVwIHRoZSBtZW1iZXJzIG5lZWRlZC5cbmV4cG9ydHMuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSwgbXNlY3MpIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IG1zZWNzO1xufTtcblxuZXhwb3J0cy51bmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IC0xO1xufTtcblxuZXhwb3J0cy5fdW5yZWZBY3RpdmUgPSBleHBvcnRzLmFjdGl2ZSA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuXG4gIHZhciBtc2VjcyA9IGl0ZW0uX2lkbGVUaW1lb3V0O1xuICBpZiAobXNlY3MgPj0gMCkge1xuICAgIGl0ZW0uX2lkbGVUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgIGlmIChpdGVtLl9vblRpbWVvdXQpXG4gICAgICAgIGl0ZW0uX29uVGltZW91dCgpO1xuICAgIH0sIG1zZWNzKTtcbiAgfVxufTtcblxuLy8gc2V0aW1tZWRpYXRlIGF0dGFjaGVzIGl0c2VsZiB0byB0aGUgZ2xvYmFsIG9iamVjdFxucmVxdWlyZShcInNldGltbWVkaWF0ZVwiKTtcbi8vIE9uIHNvbWUgZXhvdGljIGVudmlyb25tZW50cywgaXQncyBub3QgY2xlYXIgd2hpY2ggb2JqZWN0IGBzZXRpbW1lZGlhdGVgIHdhc1xuLy8gYWJsZSB0byBpbnN0YWxsIG9udG8uICBTZWFyY2ggZWFjaCBwb3NzaWJpbGl0eSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGVcbi8vIGBzZXRpbW1lZGlhdGVgIGxpYnJhcnkuXG5leHBvcnRzLnNldEltbWVkaWF0ZSA9ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmLnNldEltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsLnNldEltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgJiYgdGhpcy5zZXRJbW1lZGlhdGUpO1xuZXhwb3J0cy5jbGVhckltbWVkaWF0ZSA9ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmLmNsZWFySW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5jbGVhckltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcyAmJiB0aGlzLmNsZWFySW1tZWRpYXRlKTtcbiIsIlxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlcHJlY2F0ZTtcblxuLyoqXG4gKiBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuICogUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLm5vRGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLnRocm93RGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gZGVwcmVjYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgdGhyb3cgYW4gRXJyb3Igd2hlbiBpbnZva2VkLlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2UudHJhY2VEZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBkZXByZWNhdGVkIGZ1bmN0aW9uc1xuICogd2lsbCBpbnZva2UgYGNvbnNvbGUudHJhY2UoKWAgaW5zdGVhZCBvZiBgY29uc29sZS5lcnJvcigpYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIHRoZSBmdW5jdGlvbiB0byBkZXByZWNhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgLSB0aGUgc3RyaW5nIHRvIHByaW50IHRvIHRoZSBjb25zb2xlIHdoZW4gYGZuYCBpcyBpbnZva2VkXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGEgbmV3IFwiZGVwcmVjYXRlZFwiIHZlcnNpb24gb2YgYGZuYFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkZXByZWNhdGUgKGZuLCBtc2cpIHtcbiAgaWYgKGNvbmZpZygnbm9EZXByZWNhdGlvbicpKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAoY29uZmlnKCd0aHJvd0RlcHJlY2F0aW9uJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKGNvbmZpZygndHJhY2VEZXByZWNhdGlvbicpKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2Fybihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn1cblxuLyoqXG4gKiBDaGVja3MgYGxvY2FsU3RvcmFnZWAgZm9yIGJvb2xlYW4gdmFsdWVzIGZvciB0aGUgZ2l2ZW4gYG5hbWVgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvbmZpZyAobmFtZSkge1xuICAvLyBhY2Nlc3NpbmcgZ2xvYmFsLmxvY2FsU3RvcmFnZSBjYW4gdHJpZ2dlciBhIERPTUV4Y2VwdGlvbiBpbiBzYW5kYm94ZWQgaWZyYW1lc1xuICB0cnkge1xuICAgIGlmICghZ2xvYmFsLmxvY2FsU3RvcmFnZSkgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB2YWwgPSBnbG9iYWwubG9jYWxTdG9yYWdlW25hbWVdO1xuICBpZiAobnVsbCA9PSB2YWwpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIFN0cmluZyh2YWwpLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcbn1cbiIsInZhciBpbmRleE9mID0gcmVxdWlyZSgnaW5kZXhvZicpO1xuXG52YXIgT2JqZWN0X2tleXMgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgaWYgKE9iamVjdC5rZXlzKSByZXR1cm4gT2JqZWN0LmtleXMob2JqKVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgcmVzID0gW107XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBvYmopIHJlcy5wdXNoKGtleSlcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG59O1xuXG52YXIgZm9yRWFjaCA9IGZ1bmN0aW9uICh4cywgZm4pIHtcbiAgICBpZiAoeHMuZm9yRWFjaCkgcmV0dXJuIHhzLmZvckVhY2goZm4pXG4gICAgZWxzZSBmb3IgKHZhciBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZuKHhzW2ldLCBpLCB4cyk7XG4gICAgfVxufTtcblxudmFyIGRlZmluZVByb3AgPSAoZnVuY3Rpb24oKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnXycsIHt9KTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iaiwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG5hbWUsIHtcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24ob2JqLCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgb2JqW25hbWVdID0gdmFsdWU7XG4gICAgICAgIH07XG4gICAgfVxufSgpKTtcblxudmFyIGdsb2JhbHMgPSBbJ0FycmF5JywgJ0Jvb2xlYW4nLCAnRGF0ZScsICdFcnJvcicsICdFdmFsRXJyb3InLCAnRnVuY3Rpb24nLFxuJ0luZmluaXR5JywgJ0pTT04nLCAnTWF0aCcsICdOYU4nLCAnTnVtYmVyJywgJ09iamVjdCcsICdSYW5nZUVycm9yJyxcbidSZWZlcmVuY2VFcnJvcicsICdSZWdFeHAnLCAnU3RyaW5nJywgJ1N5bnRheEVycm9yJywgJ1R5cGVFcnJvcicsICdVUklFcnJvcicsXG4nZGVjb2RlVVJJJywgJ2RlY29kZVVSSUNvbXBvbmVudCcsICdlbmNvZGVVUkknLCAnZW5jb2RlVVJJQ29tcG9uZW50JywgJ2VzY2FwZScsXG4nZXZhbCcsICdpc0Zpbml0ZScsICdpc05hTicsICdwYXJzZUZsb2F0JywgJ3BhcnNlSW50JywgJ3VuZGVmaW5lZCcsICd1bmVzY2FwZSddO1xuXG5mdW5jdGlvbiBDb250ZXh0KCkge31cbkNvbnRleHQucHJvdG90eXBlID0ge307XG5cbnZhciBTY3JpcHQgPSBleHBvcnRzLlNjcmlwdCA9IGZ1bmN0aW9uIE5vZGVTY3JpcHQgKGNvZGUpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU2NyaXB0KSkgcmV0dXJuIG5ldyBTY3JpcHQoY29kZSk7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbn07XG5cblNjcmlwdC5wcm90b3R5cGUucnVuSW5Db250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICBpZiAoIShjb250ZXh0IGluc3RhbmNlb2YgQ29udGV4dCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIm5lZWRzIGEgJ2NvbnRleHQnIGFyZ3VtZW50LlwiKTtcbiAgICB9XG4gICAgXG4gICAgdmFyIGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgIGlmICghaWZyYW1lLnN0eWxlKSBpZnJhbWUuc3R5bGUgPSB7fTtcbiAgICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gICAgXG4gICAgdmFyIHdpbiA9IGlmcmFtZS5jb250ZW50V2luZG93O1xuICAgIHZhciB3RXZhbCA9IHdpbi5ldmFsLCB3RXhlY1NjcmlwdCA9IHdpbi5leGVjU2NyaXB0O1xuXG4gICAgaWYgKCF3RXZhbCAmJiB3RXhlY1NjcmlwdCkge1xuICAgICAgICAvLyB3aW4uZXZhbCgpIG1hZ2ljYWxseSBhcHBlYXJzIHdoZW4gdGhpcyBpcyBjYWxsZWQgaW4gSUU6XG4gICAgICAgIHdFeGVjU2NyaXB0LmNhbGwod2luLCAnbnVsbCcpO1xuICAgICAgICB3RXZhbCA9IHdpbi5ldmFsO1xuICAgIH1cbiAgICBcbiAgICBmb3JFYWNoKE9iamVjdF9rZXlzKGNvbnRleHQpLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHdpbltrZXldID0gY29udGV4dFtrZXldO1xuICAgIH0pO1xuICAgIGZvckVhY2goZ2xvYmFscywgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoY29udGV4dFtrZXldKSB7XG4gICAgICAgICAgICB3aW5ba2V5XSA9IGNvbnRleHRba2V5XTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIHZhciB3aW5LZXlzID0gT2JqZWN0X2tleXMod2luKTtcblxuICAgIHZhciByZXMgPSB3RXZhbC5jYWxsKHdpbiwgdGhpcy5jb2RlKTtcbiAgICBcbiAgICBmb3JFYWNoKE9iamVjdF9rZXlzKHdpbiksIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgLy8gQXZvaWQgY29weWluZyBjaXJjdWxhciBvYmplY3RzIGxpa2UgYHRvcGAgYW5kIGB3aW5kb3dgIGJ5IG9ubHlcbiAgICAgICAgLy8gdXBkYXRpbmcgZXhpc3RpbmcgY29udGV4dCBwcm9wZXJ0aWVzIG9yIG5ldyBwcm9wZXJ0aWVzIGluIHRoZSBgd2luYFxuICAgICAgICAvLyB0aGF0IHdhcyBvbmx5IGludHJvZHVjZWQgYWZ0ZXIgdGhlIGV2YWwuXG4gICAgICAgIGlmIChrZXkgaW4gY29udGV4dCB8fCBpbmRleE9mKHdpbktleXMsIGtleSkgPT09IC0xKSB7XG4gICAgICAgICAgICBjb250ZXh0W2tleV0gPSB3aW5ba2V5XTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZm9yRWFjaChnbG9iYWxzLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmICghKGtleSBpbiBjb250ZXh0KSkge1xuICAgICAgICAgICAgZGVmaW5lUHJvcChjb250ZXh0LCBrZXksIHdpbltrZXldKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgICBcbiAgICByZXR1cm4gcmVzO1xufTtcblxuU2NyaXB0LnByb3RvdHlwZS5ydW5JblRoaXNDb250ZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBldmFsKHRoaXMuY29kZSk7IC8vIG1heWJlLi4uXG59O1xuXG5TY3JpcHQucHJvdG90eXBlLnJ1bkluTmV3Q29udGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgdmFyIGN0eCA9IFNjcmlwdC5jcmVhdGVDb250ZXh0KGNvbnRleHQpO1xuICAgIHZhciByZXMgPSB0aGlzLnJ1bkluQ29udGV4dChjdHgpO1xuXG4gICAgZm9yRWFjaChPYmplY3Rfa2V5cyhjdHgpLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGNvbnRleHRba2V5XSA9IGN0eFtrZXldO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlcztcbn07XG5cbmZvckVhY2goT2JqZWN0X2tleXMoU2NyaXB0LnByb3RvdHlwZSksIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgZXhwb3J0c1tuYW1lXSA9IFNjcmlwdFtuYW1lXSA9IGZ1bmN0aW9uIChjb2RlKSB7XG4gICAgICAgIHZhciBzID0gU2NyaXB0KGNvZGUpO1xuICAgICAgICByZXR1cm4gc1tuYW1lXS5hcHBseShzLCBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpO1xuICAgIH07XG59KTtcblxuZXhwb3J0cy5jcmVhdGVTY3JpcHQgPSBmdW5jdGlvbiAoY29kZSkge1xuICAgIHJldHVybiBleHBvcnRzLlNjcmlwdChjb2RlKTtcbn07XG5cbmV4cG9ydHMuY3JlYXRlQ29udGV4dCA9IFNjcmlwdC5jcmVhdGVDb250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICB2YXIgY29weSA9IG5ldyBDb250ZXh0KCk7XG4gICAgaWYodHlwZW9mIGNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvckVhY2goT2JqZWN0X2tleXMoY29udGV4dCksIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGNvcHlba2V5XSA9IGNvbnRleHRba2V5XTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBjb3B5O1xufTtcbiIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpIHx8ICgxLCBldmFsKShcInRoaXNcIik7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuXHRpZiAoIW1vZHVsZS53ZWJwYWNrUG9seWZpbGwpIHtcblx0XHRtb2R1bGUuZGVwcmVjYXRlID0gZnVuY3Rpb24oKSB7fTtcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcblx0XHQvLyBtb2R1bGUucGFyZW50ID0gdW5kZWZpbmVkIGJ5IGRlZmF1bHRcblx0XHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJsb2FkZWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUubDtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0bW9kdWxlLndlYnBhY2tQb2x5ZmlsbCA9IDE7XG5cdH1cblx0cmV0dXJuIG1vZHVsZTtcbn07XG4iLCIvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuaW1wb3J0IGF1dG9iaW5kIGZyb20gJ2F1dG9iaW5kLWRlY29yYXRvcic7XG5pbXBvcnQgeyBBQ0NJbnB1dEV2ZW50LCBBQ0NJbnB1dEV2ZW50SW5pdCB9IGZyb20gJy4uL2V2ZW50cy9pbnB1dC1ldmVudCc7XG5pbXBvcnQgeyBBQ0NFcnJvckV2ZW50IH0gZnJvbSAnLi4vZXZlbnRzL2Vycm9yLWV2ZW50JztcbmltcG9ydCB7IGFkZCwgY29weSwgc2NhbGUsIHN1YiwgZGlzdGFuY2UsIGVxdWFsIH0gZnJvbSAnLi8uLi92ZWMyJztcbmltcG9ydCB7IHNjYWxlbWFwIH0gZnJvbSAnLi8uLi91dGlscyc7XG5pbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnQHBvbHltZXIvbGl0LWVsZW1lbnQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICcuL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgSW5wdXRUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5cblxuZXhwb3J0IGludGVyZmFjZSBJbnB1dFByb3BlcnRpZXMge1xuICAgIHNlbGVjdGVkOmJvb2xlYW47XG4gICAgaW5pdGlhbGl6ZWQ6Ym9vbGVhbjtcbiAgICBjb250cm9sczpib29sZWFuO1xuICAgIGNvbnRlbnRTZWxlY3Rvcjogc3RyaW5nO1xufVxuXG5cbmV4cG9ydCBjb25zdCBpc0Fic3RyYWN0SW5wdXRFbGVtZW50ID0gKGVsOmFueSk6IGVsIGlzIEFic3RyYWN0SW5wdXRFbGVtZW50ID0+XG4gICAgWydzZWxlY3RlZCcsICdpbml0aWFsaXplZCcsICdjb250cm9scyddLmV2ZXJ5KHByb3A9PiB0eXBlb2YgZWxbcHJvcF0gIT09ICd1bmRlZmluZWQnKTtcblxuLyoqXG4gKiBBYnN0cmFjdElucHV0RWxlbWVudCBpcyB0aGUgYmFzZSBhYnN0cmFjdCBjbGFzcyBmb3IgYWxsIGlucHV0c1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJbnB1dEVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcblxuICAgIC8qKlxuICAgICAqIHNldHRpbmcgdGhpcyBwcm9wZXJ0eSBvciBhdHRyaWJ1dGUgd2lsbCBkaXNwbGF5IHRoZSBpbnB1dCdzIGNhbGlicmF0aW9uXG4gICAgICovXG4gICAgQHByb3BlcnR5KHsgdHlwZTpCb29sZWFuIH0pXG4gICAgcHVibGljIGNvbnRyb2xzOmJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIGEgaGlnaGVyIHNtb290aGluZyB2YWx1ZSAoMC0xKSByZXN1bHRzIGluIGEgc2xvd2VyIGFuZCBzbW9vdGhlclxuICAgICAqIGludGVycG9sYXRpb24gdG93YXJkcyB0aGUgY3VycmVudCBwb3NpdGlvbi4gVGhpcyBjcmVhdGVzIGxlc3Mgaml0dGVyXG4gICAgICogZnJvbSBhbiBpbnB1dCBidXQgYSBoaWdoIHZhbHVlIGNhbiBtYWtlIHRoZSBpbnB1dCBmZWVsIHNsb3cuXG4gICAgICovXG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pXG4gICAgcHVibGljIHNtb290aGluZzpudW1iZXIgPSAwO1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBvbiB0aGUgSFRNTCBub2RlIHRvIGRlbm90ZSBpdCBpcyB0aGUgc2VsZWN0ZWQgaW5wdXRcbiAgICAgKiBhbmQgdG8gYmVnaW4gaW5pdGlhbGl6aW5nXG4gICAgICovXG4gICAgQHByb3BlcnR5KHsgdHlwZTpCb29sZWFuIH0pXG4gICAgcHVibGljIHNlbGVjdGVkOmJvb2xlYW4gPSBmYWxzZTtcblxuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gICAgcHVibGljIGNvbnRlbnRTZWxlY3RvcjpzdHJpbmcgPSAnJztcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSlcbiAgICBwdWJsaWMgZGlzYWJsZUNsYW1wOiBib29sZWFuID0gZmFsc2U7XG5cblxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAvKipcbiAgICAgKiB0aGUgY3VycmVudCBYIHBvc2l0aW9uIGFzIG1hcHBlZCB0byB0aGUgY29udGVudEVsZW1lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbnRlbnRYKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YXJnZXRQb3NpdGlvblswXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGUgY3VycmVudCBZIHBvc2l0aW9uIGFzIG1hcHBlZCB0byB0aGUgY29udGVudEVsZW1lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbnRlbnRZKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YXJnZXRQb3NpdGlvblsxXTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIGRvZXMgdGhlIGN1cnJlbnQgaW5wdXQgaGF2ZSBhIGNvbnRyb2wgbW9kYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc0NvbnRyb2xzKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiB0aGUgdHlwZSBvZiBpbnB1dCB0aGlzIGluc3RhbmNlIGlzLCBpLmUuICdtb3VzZScsICdwb3NlJ1xuICAgICAqL1xuICAgIHB1YmxpYyBpbnB1dFR5cGU6SW5wdXRUeXBlO1xuXG4gICAgcHVibGljIHRhcmdldFBvc2l0aW9uOltudW1iZXIsIG51bWJlcl0gPSBbMCwgMF07XG5cbiAgICAvKipcbiAgICAgKiB0aGUgaW5wdXQncyB2ZWN0b3IgdGhhdCBpcyB1cGRhdGVkIHdoZW5ldmVyIHRoZXJlIGlzIG5ldyBpbnB1dCBkYXRhXG4gICAgICovXG4gICAgcHVibGljIHBvc2l0aW9uOltudW1iZXIsIG51bWJlcl0gPSBbLTEsIC0xXTtcblxuICAgIC8qKlxuICAgICAqIGlzIHRoZSBpbnB1dCBjdXJyZW50bHkgaW4gdGhlIHBoYXNlIG9mIGluaXRpYWxpemluZyBpdHNlbGY/XG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0luaXRpYWxpemluZygpe1xuICAgICAgICByZXR1cm4gdGhpcy5fX2lzSW5pdGlhbGl6aW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGhhcyB0aGUgaW5wdXQgY29tcGxldGVkIGluaXRpYWxpemF0aW9uIGFuZCBpcyBjdXJyZW50bHkgaW4gb3BlcmF0aW9uP1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNSZWFkeSgpe1xuICAgICAgICByZXR1cm4gdGhpcy5fX2lzUmVhZHk7XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgc2V0IGNvbnRlbnRFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCkge1xuICAgICAgICBjb25zdCBjaGFuZ2VkID0gdGhpcy5fX2NvbnRlbnRFbCAhPT0gZWxlbWVudDtcbiAgICAgICAgY29uc3QgcHJldiA9IHRoaXMuX19jb250ZW50RWw7XG4gICAgICAgIHRoaXMuX19jb250ZW50RWwgPSBlbGVtZW50O1xuXG4gICAgICAgIC8vcHJvdmlkZSBhIGhvb2tcbiAgICAgICAgaWYoY2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlQ29udGVudEVsZW1lbnRDaGFuZ2VkKGVsZW1lbnQsIHByZXYpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb250ZW50RWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMuX19jb250ZW50RWwgJiYgdGhpcy5jb250ZW50U2VsZWN0b3IpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuY29udGVudFNlbGVjdG9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fX2NvbnRlbnRFbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGUgaW5wdXQncyBjdXJyZW50IHRhcmdldCB2ZWN0b3IsIHRoaXMgY291bGQgYmUgZGlmZmVyZW50IGlmIHNtb290aGluZ1xuICAgICAqIGlzIG1vcmUgdGhhbiAwXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9sYXN0Rm91bmRQb3NpdGlvbjpbbnVtYmVyLCBudW1iZXJdID0gWy0xLCAtMV07XG4gICAgcHJvdGVjdGVkIF9sYXN0Rm91bmRUYXJnZXRQb3NpdGlvbjpbbnVtYmVyLCBudW1iZXJdID0gWzAsIDBdO1xuXG4gICAgLyoqXG4gICAgICogdGhlIG1haW4gZWxlbWVudCBvZiBjb250ZW50LCBzZXQgdGhyb3VnaCAndGFyZ2V0JyBvciAndGFyZ2V0U2VsZWN0b3InXG4gICAgICovXG4gICAgcHJpdmF0ZSBfX2NvbnRlbnRFbDogSFRNTEVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBfX2lzSW5pdGlhbGl6aW5nOmJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIF9faXNSZWFkeTpib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfX2hhc1RpY2tlZFNpbmNlUmVhZHk6Ym9vbGVhbiA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfd2FzQWJvcnRlZDpib29sZWFuID0gZmFsc2U7XG5cblxuICAgIC8qKlxuICAgICAqIE11c3QgYmUgY2FsbGVkIHRvIGJlZ2luIHVzaW5nIGlucHV0IG1vZGUsIGxpc3RlbiB0byAncmVhZHknIHRvIGtub3cgd2hlbiBjb21wbGV0ZWRcbiAgICAgKi9cbiAgICBhYnN0cmFjdCBpbml0aWFsaXplKCk6dm9pZDtcblxuICAgIGFic3RyYWN0IHN0b3AoKTp2b2lkXG5cbiAgICAvKipcbiAgICAgKiBhcHBseSBzbW9vdGhpbmcgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24sXG4gICAgICogbW92aW5nIHRvd2FyZHMgdGhlIF90YXJnZXRQb3NpdGlvbiBhY2NvcmRpbmcgdG8gc21vb3RoaW5nXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgcG9zaXRpb24gdmFsdWUgY2hhbmdlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfc3RlcFRvd2FyZHNUYXJnZXQoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHBvcyA9IHRoaXMucG9zaXRpb247XG4gICAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLl9sYXN0Rm91bmRQb3NpdGlvbjtcbiAgICAgICAgY29uc3QgdGFyZ1BvcyA9IHRoaXMudGFyZ2V0UG9zaXRpb247XG4gICAgICAgIGNvbnN0IGxhc3RUYXJnID0gdGhpcy5fbGFzdEZvdW5kVGFyZ2V0UG9zaXRpb247XG4gICAgICAgIGNvbnN0IHsgc21vb3RoaW5nIH0gPSB0aGlzO1xuXG4gICAgICAgIGlmICggZXF1YWwocG9zLCBsYXN0KSApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vaWYgdGhlcmVzIG5vIHNtb290aGluZ1xuICAgICAgICAvL29yIHRoaXMgaXMgdGhlIGZpcnN0IHRpY2sgc2luY2UgcmVhZHlcbiAgICAgICAgLy9vciBpdHMgcmVhbGx5IHJlYWxseSBjbG9zZSwgc2V0IHRvIHRhcmdldFxuICAgICAgICBpZihzbW9vdGhpbmcgPT09IDAgfHwgIXRoaXMuX19oYXNUaWNrZWRTaW5jZVJlYWR5IHx8IGRpc3RhbmNlKHBvcywgbGFzdCkgPCAwLjAwMDAxKXtcbiAgICAgICAgICAgIGNvcHkobGFzdCwgcG9zKTtcbiAgICAgICAgICAgIGNvcHkobGFzdFRhcmcsIHRhcmdQb3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZWFzZSA9IHNjYWxlbWFwKHNtb290aGluZywgMCwgMSwgMC45NSwgMCk7XG5cbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBhZGQocG9zLCBzY2FsZShzdWIobGFzdCwgcG9zKSwgZWFzZSkpO1xuICAgICAgICAgICAgdGhpcy50YXJnZXRQb3NpdGlvbiA9IGFkZCh0YXJnUG9zLCBzY2FsZShzdWIobGFzdFRhcmcsIHRhcmdQb3MpLCBlYXNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogc2hvdWxkIGFuICdpbnB1dCcgZXZlbnQgYmUgZGlzcGF0Y2hlZCBhcyB3ZWxsIG9uIHRoaXMgdGlja1xuICAgICAqIHRoaXMgbWV0aG9kIGV4aXN0cyBzbyB5b3UgY2FuIG92ZXJyaWRlIGluIG90aGVyIGlucHV0cyB0byBjb25zaWRlciBvdGhlciB2YXJpYWJsZXNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3Nob3VsZERpc3BhdGNoSW5wdXQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGVwVG93YXJkc1RhcmdldCgpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogaXMgaXQgb2sgdG8gaW5pdGlhbGl6ZSB0aGlzIGlucHV0P1xuICAgICAqIG5vIGlmIGl0IGlzIGFscmVhZHkgaW5pdGlhbGl6aW5nIG9yIGl0IHdhcyBhYm9ydGVkIG1pZC1pbml0aWFsaXphdGlvblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY2FuSW5pdGlhbGl6ZSgpOiBib29sZWFuIHtcbiAgICAgICAgLy9UT0RPIHNob3VsZCBhbHNvIGlmIGZhaWwgaWYgaW5wdXQgY2FudCBiZSBzdXBwb3J0ZWQsIGxpa2UgaWYgd2FzbSBpc250IHN1cHBvcnRlZFxuICAgICAgICByZXR1cm4gIXRoaXMuX3dhc0Fib3J0ZWQgJiYgIXRoaXMuX19pc0luaXRpYWxpemluZztcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIHRoZSBFdmVudCB0aGF0IHdpbGwgYmUgcHJvdmlkZWQgaW4gZXZlcnkgZGlzcGF0Y2hlZCBldmVudCBmcm9tIGFuIGlucHV0XG4gICAgICogTW9zdCBpbnB1dCdzIHdpbGwgb3ZlcnJpZGUgdGhpcyB0byBwcm92aWRlIGV2ZW4gbW9yZSBkYXRhIHVuaXF1ZSB0byB0aGVpciBpbnB1dFxuICAgICAqIElucHV0IGltcGxlbWVudGF0aW9ucyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBwcm92aWRlIGV4dHJhIGRldGFpbHNcbiAgICAgKiBAcGFyYW0gdHlwZVxuICAgICAqIEBwYXJhbSBidWJibGVzXG4gICAgICogQHBhcmFtIGNvbXBvc2VkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9jcmVhdGVFdmVudCh0eXBlOiBzdHJpbmcsIGJ1YmJsZXM6IGJvb2xlYW49IHRydWUsIGNvbXBvc2VkOiBib29sZWFuPSB0cnVlKTogQUNDSW5wdXRFdmVudCB7XG5cbiAgICAgICAgY29uc3QgZXZlbnRJbml0OkFDQ0lucHV0RXZlbnRJbml0ID0ge1xuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgaW5wdXRUeXBlOiB0aGlzLmlucHV0VHlwZSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogdGhpcy5wb3NpdGlvblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJ1YmJsZXMsXG4gICAgICAgICAgICAvL3NlbmQgb3V0c2lkZSBvZiBzaGFkb3cgdG8gcGFyZW50IGVsZW1lbnRcbiAgICAgICAgICAgIGNvbXBvc2VkXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5ldyBBQ0NJbnB1dEV2ZW50KHR5cGUsIGV2ZW50SW5pdCk7XG4gICAgfVxuXG5cbiAgICAvL292ZXJyaWRpbmcgdG8gZW5zdXJlIGNvbnNpc3RlbnQgZXZlbnQgdHlwZXNcbiAgICBkaXNwYXRjaEV2ZW50KGV2dDpBQ0NJbnB1dEV2ZW50IHwgQUNDRXJyb3JFdmVudCl7XG4gICAgICAgIHJldHVybiBzdXBlci5kaXNwYXRjaEV2ZW50KGV2dCk7XG4gICAgfVxuXG5cbiAgICBAYXV0b2JpbmRcbiAgICBwcm90ZWN0ZWQgX2Rpc3BhdGNoQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQodGhpcy5fY3JlYXRlRXZlbnQoQUNDSW5wdXRFdmVudC5DSEFOR0UpKTtcbiAgICB9XG5cblxuICAgIEBhdXRvYmluZFxuICAgIHByb3RlY3RlZCBfZGlzcGF0Y2hFcnJvcihlcnJvcjogRXJyb3IpOnZvaWQge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEFDQ0Vycm9yRXZlbnQoZXJyb3IpKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIHdoZW4gdGhlIGlucHV0IEJFR0lOUyB0byBsb2FkIGFueSByZXF1aXJlZCByZXNvdXJjZXMsIGFzayBmb3IgYW55IHBlcm1pc3Npb25zIGV0Y1xuICAgICAqIEBldmVudFxuICAgICAqL1xuICAgIEBhdXRvYmluZFxuICAgIHByb3RlY3RlZCBfZGlzcGF0Y2hJbml0aWFsaXppbmcoKTp2b2lkIHtcbiAgICAgICAgdGhpcy5fX2lzSW5pdGlhbGl6aW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHRoaXMuX2NyZWF0ZUV2ZW50KEFDQ0lucHV0RXZlbnQuSU5JVElBTElaSU5HKSk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiB3aGVuIHRoZSBpbnB1dCBoYXMgc3VjY2Vzc2Z1bGx5IGJlZ2FuXG4gICAgICogQGV2ZW50XG4gICAgICovXG4gICAgQGF1dG9iaW5kXG4gICAgcHJvdGVjdGVkIF9kaXNwYXRjaFJlYWR5KCk6dm9pZCB7XG4gICAgICAgIHRoaXMuX19pc0luaXRpYWxpemluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9faXNSZWFkeSA9IHRydWU7XG4gICAgICAgIHRoaXMuX19oYXNUaWNrZWRTaW5jZVJlYWR5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh0aGlzLl9jcmVhdGVFdmVudChBQ0NJbnB1dEV2ZW50LlJFQURZKSk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiB3aGVuIHRoZSBpbnB1dCBoYXMgc3RvcHBlZCBvcGVyYXRpb25cbiAgICAgKi9cbiAgICBAYXV0b2JpbmRcbiAgICBwcm90ZWN0ZWQgX2Rpc3BhdGNoU3RvcCgpOnZvaWQge1xuICAgICAgICBpZih0aGlzLl9faXNJbml0aWFsaXppbmcpe1xuICAgICAgICAgICAgdGhpcy5fd2FzQWJvcnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy9UT0RPIHNob3VsZCB0aGlzIGJlIHNldCBmYWxzZSBoZXJlIG9yIGluc2lkZSBlYWNoIGlucHV0cyBpbml0aWFsaXppbmcgd2hlcmUgaXQgY29tcGxldGVzIG9yIGZhaWxzP1xuICAgICAgICB0aGlzLl9faXNJbml0aWFsaXppbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fX2lzUmVhZHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHRoaXMuX2NyZWF0ZUV2ZW50KEFDQ0lucHV0RXZlbnQuU1RPUCkpXG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiB3aGVuIHRoZSBpbnB1dCBoYXMgcGVyZm9ybWVkIGFueSBuZXcgZWZmb3J0LFxuICAgICAqIGV2ZW4gaWYgdGhlcmUgaXMgbm8gbmV3IGlucHV0IGZvdW5kLlxuICAgICAqIGkuZS4gd2ViY2FtIHVwZGF0ZWQgYnV0IG5vIGZhY2Ugd2FzIGZvdW5kLCB0aGlzIHN0aWxsIHRyaWdnZXJzXG4gICAgICogQGV2ZW50IEFic3RyYWN0SW5wdXRFbGVtZW50I3RpY2sgZGlzcGF0Y2hlZCBldmVyeSB0aW1lIHRoZSBpbnB1dCB1cGRhdGVzLCBldmVuIGlmIG5vIGNoYW5nZXNcbiAgICAgKi9cbiAgICBAYXV0b2JpbmRcbiAgICBwcm90ZWN0ZWQgX2Rpc3BhdGNoVGljaygpOnZvaWQge1xuICAgICAgICBpZiAodGhpcy5fc2hvdWxkRGlzcGF0Y2hJbnB1dCgpKSB7XG4gICAgICAgICAgICAvLyB0aGUgcG9zaXRpb24gdmFsdWUgY2hhbmdlZFxuICAgICAgICAgICAgdGhpcy5fX2Rpc3BhdGNoSW5wdXQoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGljayBldmVudCwgb2NjdXJzIG9uIGV2ZXJ5IHVwZGF0ZVxuICAgICAgICAgKiBAZXZlbnQgQWJzdHJhY3RJbnB1dCN0aWNrXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQodGhpcy5fY3JlYXRlRXZlbnQoQUNDSW5wdXRFdmVudC5USUNLKSk7XG4gICAgICAgIHRoaXMuX19oYXNUaWNrZWRTaW5jZVJlYWR5ID0gdHJ1ZTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIHdoZW4gdGhlIGlucHV0IGhhcyBuZXcgdHJhY2tpbmcgZGF0YSB0byBhbm5vdW5jZVxuICAgICAqL1xuICAgIEBhdXRvYmluZFxuICAgIHByaXZhdGUgX19kaXNwYXRjaElucHV0KCk6dm9pZCB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh0aGlzLl9jcmVhdGVFdmVudChBQ0NJbnB1dEV2ZW50LklOUFVUKSk7XG4gICAgfVxuXG4gICAgcHVibGljIF9wcm9wZXJ0aWVzQ2hhbmdlZChwcm9wczogSW5wdXRQcm9wZXJ0aWVzLCBjaGFuZ2VkUHJvcHM6IElucHV0UHJvcGVydGllcywgcHJldlByb3BzOiBJbnB1dFByb3BlcnRpZXMpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIuX3Byb3BlcnRpZXNDaGFuZ2VkKHByb3BzLCBjaGFuZ2VkUHJvcHMsIHByZXZQcm9wcyk7XG5cbiAgICAgICAgaWYoIWNoYW5nZWRQcm9wcyB8fCAhcHJldlByb3BzKXtcbiAgICAgICAgICAgIC8vdGhpcyBjYW4gaGFwcGVuIGFzIGEgcmVzdWx0IGZyb20gY2hhbmdpbmcgYW4gYXR0cmlidXRlIGRpcmVjdGx5XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZWRQcm9wcy5jb250ZW50U2VsZWN0b3IpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudEVsZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgLy8gcXVlcnkgdGhlIG5ldyBzZWxlY3RvciB0byBnZXQgdGhlIGVsZW1lbnRcbiAgICAgICAgICAgIHRoaXMuY29udGVudEVsZW1lbnQ7XG4gICAgICAgICAgICAvL2lmIHRoZSBkb2N1bWVudCBpc24ndCByZWFkeSB5ZXQgdGhlIHNlbGVjdG9yIGVsZW1lbnQgbWlnaHQgbm90IHlldCBiZSBpbiBkb21cbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlICE9PSAnY29tcGxldGUnKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2FpdFVudGlsUmVhZHkgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudEVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5jb250ZW50RWxlbWVudCB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWFkeXN0YXRlY2hhbmdlJywgd2FpdFVudGlsUmVhZHkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdyZWFkeXN0YXRlY2hhbmdlJywgd2FpdFVudGlsUmVhZHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vdXBkYXRlIGNvbnRyb2xzIGFzIGF0dHJpYnV0ZSBiZWNhdXNlIENTU1xuICAgICAgICBpZihjaGFuZ2VkUHJvcHMuY29udHJvbHMgJiYgIXByZXZQcm9wcy5jb250cm9scyl7XG4gICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnY29udHJvbHMnLCAndHJ1ZScpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHRoaXMuX2NyZWF0ZUV2ZW50KEFDQ0lucHV0RXZlbnQuQ09OVFJPTFNfT1BFTikpO1xuICAgICAgICB9IGVsc2UgaWYoIWNoYW5nZWRQcm9wcy5jb250cm9scyAmJiBwcmV2UHJvcHMuY29udHJvbHMpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdjb250cm9scycpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHRoaXMuX2NyZWF0ZUV2ZW50KEFDQ0lucHV0RXZlbnQuQ09OVFJPTFNfQ0xPU0UpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFjaGFuZ2VkUHJvcHMuc2VsZWN0ZWQgJiYgcHJldlByb3BzLnNlbGVjdGVkKXtcbiAgICAgICAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgICB9IGVsc2UgaWYoY2hhbmdlZFByb3BzLnNlbGVjdGVkICYmICFwcmV2UHJvcHMuc2VsZWN0ZWQpe1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhvb2sgdG8gaGFuZGxlIGFueSBjaGFuZ2VzIHdoZW5ldmVyIHRoZSBjb250ZW50RWxlbWVudCBoYXMgY2hhbmdlZFxuICAgICAqIEBwYXJhbSBjb250ZW50RWxlbWVudFxuICAgICAqIEBwYXJhbSBwcmV2aW91c1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBfaGFuZGxlQ29udGVudEVsZW1lbnRDaGFuZ2VkKGNvbnRlbnRFbGVtZW50OiBIVE1MRWxlbWVudCwgcHJldmlvdXM6IEhUTUxFbGVtZW50KSB7XG5cbiAgICB9XG5cbiAgICBfcmVuZGVyKF9wcm9wczphbnkpe1xuICAgICAgICByZXR1cm4gaHRtbGBgO1xuICAgIH1cblxuICAgIHNldFRhcmdldFBvc2l0aW9uKFt4LCB5XTogW251bWJlciwgbnVtYmVyXSkge1xuICAgICAgICB0aGlzLl9sYXN0Rm91bmRUYXJnZXRQb3NpdGlvblswXSA9IHg7XG4gICAgICAgIHRoaXMuX2xhc3RGb3VuZFRhcmdldFBvc2l0aW9uWzFdID0geTtcblxuICAgICAgICBjb25zdCBiY3IgPSB0aGlzLmNvbnRlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBueCA9IHNjYWxlbWFwKHgsIDAsIGJjci53aWR0aCwgLTEsIDEpO1xuICAgICAgICBjb25zdCBueSA9IHNjYWxlbWFwKHksIDAsIGJjci5oZWlnaHQsIC0xLCAxKTtcbiAgICAgICAgdGhpcy5fbGFzdEZvdW5kUG9zaXRpb25bMF0gPSBueDtcbiAgICAgICAgdGhpcy5fbGFzdEZvdW5kUG9zaXRpb25bMV0gPSBueTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2hUaWNrKCk7XG4gICAgfVxuXG4gICAgc2V0UG9zaXRpb24oW3gsIHldOiBbbnVtYmVyLCBudW1iZXJdKSB7XG4gICAgICAgIHRoaXMuX2xhc3RGb3VuZFBvc2l0aW9uWzBdID0geDtcbiAgICAgICAgdGhpcy5fbGFzdEZvdW5kUG9zaXRpb25bMV0gPSB5O1xuXG4gICAgICAgIGNvbnN0IGJjciA9IHRoaXMuY29udGVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgY29uc3Qgc3ggPSBzY2FsZW1hcCh4LCAtMSwgMSwgMCwgYmNyLndpZHRoKTtcbiAgICAgICAgY29uc3Qgc3kgPSBzY2FsZW1hcCh5LCAtMSwgMSwgMCwgYmNyLmhlaWdodCk7XG4gICAgICAgIHRoaXMuX2xhc3RGb3VuZFRhcmdldFBvc2l0aW9uWzBdID0gc3g7XG4gICAgICAgIHRoaXMuX2xhc3RGb3VuZFRhcmdldFBvc2l0aW9uWzFdID0gc3k7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoVGljaygpO1xuICAgIH1cblxuICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eTpzdHJpbmcsIHZhbHVlOmFueSwgb2xkOmFueSkge1xuICAgICAgICBpZihwcm9wZXJ0eSA9PT0gJ3Ntb290aGluZycpe1xuICAgICAgICAgICAgLy9jb25zdHJhaW4gc21vb3RoaW5nIHRvIDA+PSB2YWx1ZSA8PSAxXG4gICAgICAgICAgICBjb25zdCB2ID0gdmFsdWUgYXMgbnVtYmVyO1xuICAgICAgICAgICAgaWYoIHYgPCAwIHx8IHYgPiAxKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLl9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCk7XG4gICAgfVxufSIsIi8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG5pbXBvcnQgeyBiYWNrZ3JvdW5kQ29sb3IsIGxhYmVsQ29sb3IgfSBmcm9tICcuL3N0eWxlcyc7XG5pbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnQHBvbHltZXIvbGl0LWVsZW1lbnQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICcuL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgU25hY2tCYXJFbGVtZW50IH0gZnJvbSAnLi9zbmFja2Jhcic7XG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWJzdHJhY3RNb2RhbENoYW5nZWRQcm9wZXJ0aWVzIHtcbiAgICBhcmlhSGlkZGVuOnN0cmluZztcbiAgICB0YWJJbmRleDogc3RyaW5nO1xuICAgIGRpc3BsYXk6IHN0cmluZztcbn1cblxuXG5jb25zdCB3YWxrUGFyZW50cyA9IChlbGVtZW50OiBOb2RlLCB0YXJnZXQ6Tm9kZVtdPSBbXSk6IE5vZGVbXSA9PntcbiAgICBpZihlbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgY29uc3QgaG9zdCA9IChlbGVtZW50LnBhcmVudE5vZGUgYXMgYW55KS5ob3N0O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBob3N0ID8gaG9zdCA6IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgICAgdGFyZ2V0LnB1c2gocmVzdWx0KTtcbiAgICAgICAgd2Fsa1BhcmVudHMocmVzdWx0LCB0YXJnZXQpO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKipcbiAqIEZpbmQgTm9kZXMgdGhhdCBjb3VsZCBiZSBoaWRkZW4gd2l0aG91dCBicmVha2luZyB0aGUgbW9kYWxcbiAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGluc3BlY3QgdGhlIGNoaWxkcmVuIG9mXG4gKiBAcGFyYW0gZXhjbHVzaW9ucyBlbGVtZW50cyB0aGF0IGNhbiBub3QgYmUgaGlkZGVuLCBzdWNoIGFzIHRoZSBwYXJlbnRzIG9mIHRoZSBtb2RhbFxuICogQHBhcmFtIHRhcmdldCB0aGUgYXJyYXkgdG8gcHVzaCB0aGUgbm9kZXMgaW50b1xuICovXG5jb25zdCBmaW5kSGlkZWFibGVOb2RlcyA9IChlbGVtZW50OiBFbGVtZW50LCBleGNsdXNpb25zOk5vZGVbXSwgdGFyZ2V0OiBOb2RlW10gPSBbXSk6IE5vZGVbXSA9PiB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oZWxlbWVudC5jaGlsZHJlbikucmVkdWNlKChtZW0sIGNoaWxkKSA9PiB7XG4gICAgICAgIGlmKGV4Y2x1c2lvbnMuaW5kZXhPZihjaGlsZCkgPiAtMSkge1xuICAgICAgICAgICAgZmluZEhpZGVhYmxlTm9kZXMoY2hpbGQsIGV4Y2x1c2lvbnMsIG1lbSk7XG4gICAgICAgIH0gZWxzZSBpZiggaXNFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICAgICAgbWVtLnB1c2goY2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZW07XG4gICAgfSwgdGFyZ2V0KTtcbn1cblxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNb2RhbEVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcblxuICAgIHByaXZhdGUgX3JldHVybkZvY3VzVG86SFRNTEVsZW1lbnRcblxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBfcmVuZGVyTW9kYWxCb2R5KHByb3BzOmFueSk6IGFueTtcblxuICAgIHByb3RlY3RlZCBzdGF0aWMgX29wZW5Nb2RhbHM6QWJzdHJhY3RNb2RhbEVsZW1lbnRbXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2hpZGRlbkVsZW1lbnRzOk1hcDxFbGVtZW50LEFic3RyYWN0TW9kYWxDaGFuZ2VkUHJvcGVydGllcz4gPSBuZXcgTWFwKCk7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pXG4gICAgcHVibGljIG9wZW46Ym9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KVxuICAgIHB1YmxpYyBjbG9zYWJsZTpib29sZWFuID0gZmFsc2U7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pXG4gICAgcHVibGljIGV4Y2x1c2l2ZTpib29sZWFuID0gZmFsc2U7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIgfSlcbiAgICBwdWJsaWMgcHJpb3JpdHk6IG51bWJlciA9IDA7XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9zaG93T25Ub3AoKXtcblxuICAgICAgICAvL2dvIHRocm91Z2ggYW5kIGhpZGUgdGhlIG90aGVyIGFic3RyYWN0IG1vZGFsc1xuICAgICAgICBBYnN0cmFjdE1vZGFsRWxlbWVudC5fb3Blbk1vZGFscy5zb3J0KChhLCBiKSA9PiBiLnByaW9yaXR5IC0gYS5wcmlvcml0eSlcbiAgICAgICAgLy9zaG93IHRoZSBmaXJzdCwgaGlkZSB0aGUgcmVzdFxuICAgICAgICBBYnN0cmFjdE1vZGFsRWxlbWVudC5fb3Blbk1vZGFscy5mb3JFYWNoKChtb2RhbCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCl7XG4gICAgICAgICAgICAgICAgbW9kYWwuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICdmYWxzZScpXG4gICAgICAgICAgICAgICAgbW9kYWwuc3R5bGUuZGlzcGxheSA9ICdpbmhlcml0J1xuICAgICAgICAgICAgICAgIG1vZGFsLnN0eWxlLnpJbmRleCA9ICcxMDAwMDAnXG4gICAgICAgICAgICAgICAgbW9kYWwuZm9jdXMoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKVxuICAgICAgICAgICAgICAgIG1vZGFsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcbiAgICAgICAgICAgICAgICBtb2RhbC5zdHlsZS56SW5kZXggPSBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfZmluZEhpZGVhYmxlRWxlbWVudHMoaW5zdGFuY2U6IEFic3RyYWN0TW9kYWxFbGVtZW50KTogRWxlbWVudFtdIHtcbiAgICAgICAgY29uc3QgcGFyZW50cyA9IHdhbGtQYXJlbnRzKGluc3RhbmNlKTtcbiAgICAgICAgcmV0dXJuIGZpbmRIaWRlYWJsZU5vZGVzKGRvY3VtZW50LmJvZHksIHBhcmVudHMpXG4gICAgICAgICAgICAvL2lzIGFuIGVsZW1lbnQsIG5vdCBqdXN0IGEgbm9kZVxuICAgICAgICAgICAgLmZpbHRlcihpc0VsZW1lbnQpXG4gICAgICAgICAgICAvL2lzIG5vdCBhbHJlYWR5IGluIHRoZSBNYXBcbiAgICAgICAgICAgIC8vIC5maWx0ZXIoZWwgPT4gIUFic3RyYWN0TW9kYWxFbGVtZW50Ll9oaWRkZW5FbGVtZW50cy5oYXMoZWwpKVxuICAgICAgICAgICAgLy9pcyBub3QgYSBNb2RhbFxuICAgICAgICAgICAgLmZpbHRlcihlbCA9PiAhKGVsIGluc3RhbmNlb2YgQWJzdHJhY3RNb2RhbEVsZW1lbnQpKVxuICAgICAgICAgICAgLy9pcyBub3QgYSBTbmFja2JhclxuICAgICAgICAgICAgLmZpbHRlcihlbCA9PiAhKGVsIGluc3RhbmNlb2YgU25hY2tCYXJFbGVtZW50KSk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBjbG9zZSB0aGUgbW9kYWwsIGNhbGxlZCBpbnRlcm5hbGx5IHZpYSBfcHJvcGVydGllc0NoYW5nZWRcbiAgICAgKiBhcyB0aGUgcmVzdWx0IG9mIHRoZSBvcGVuIHByb3BlcnR5IGNoYW5naW5nXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9vcGVuKCl7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzTGVuZ3RoID0gQWJzdHJhY3RNb2RhbEVsZW1lbnQuX29wZW5Nb2RhbHMubGVuZ3RoO1xuXG4gICAgICAgIC8vY2FwdHVyZSB0aGUgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudFxuICAgICAgICBjb25zdCBjdXJyZW50Rm9jdXMgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50XG4gICAgICAgIGlmIChjdXJyZW50Rm9jdXMgIT09IHRoaXMgJiYgY3VycmVudEZvY3VzICE9PSBkb2N1bWVudC5ib2R5ICYmXG4gICAgICAgICAgICAgICAgY3VycmVudEZvY3VzICYmICEoY3VycmVudEZvY3VzIGluc3RhbmNlb2YgQWJzdHJhY3RNb2RhbEVsZW1lbnQpKXtcbiAgICAgICAgICAgIHRoaXMuX3JldHVybkZvY3VzVG8gPSBjdXJyZW50Rm9jdXNcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBYnN0cmFjdE1vZGFsRWxlbWVudC5fb3Blbk1vZGFscy5pbmRleE9mKHRoaXMpID09PSAtMSl7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdvcGVuJykpXG4gICAgICAgICAgICBBYnN0cmFjdE1vZGFsRWxlbWVudC5fb3Blbk1vZGFscy5wdXNoKHRoaXMpXG4gICAgICAgIH1cblxuXG4gICAgICAgIEFic3RyYWN0TW9kYWxFbGVtZW50Ll9maW5kSGlkZWFibGVFbGVtZW50cyh0aGlzKS5mb3JFYWNoKChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFBYnN0cmFjdE1vZGFsRWxlbWVudC5faGlkZGVuRWxlbWVudHMuaGFzKGl0ZW0pKXtcbiAgICAgICAgICAgICAgICBBYnN0cmFjdE1vZGFsRWxlbWVudC5faGlkZGVuRWxlbWVudHMuc2V0KGl0ZW0sIHtcbiAgICAgICAgICAgICAgICAgICAgdGFiSW5kZXggOiBpdGVtLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSxcbiAgICAgICAgICAgICAgICAgICAgYXJpYUhpZGRlbiA6IGl0ZW0uZ2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicpLFxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IDogaXRlbS5zdHlsZS5kaXNwbGF5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTtcbiAgICAgICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG4gICAgICAgICAgICBpZiAodGhpcy5leGNsdXNpdmUpe1xuICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoQWJzdHJhY3RNb2RhbEVsZW1lbnQuX29wZW5Nb2RhbHMubGVuZ3RoICYmICFwcmV2aW91c0xlbmd0aCl7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdtb2RhbC1vcGVuJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY2xvc2UgdGhlIG1vZGFsLCBjYWxsZWQgaW50ZXJuYWxseSB2aWEgX3Byb3BlcnRpZXNDaGFuZ2VkXG4gICAgICogYXMgdGhlIHJlc3VsdCBvZiB0aGUgb3BlbiBwcm9wZXJ0eSBjaGFuZ2luZ1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBfY2xvc2UoKXtcblxuICAgICAgICBjb25zdCBwcmV2aW91c0xlbmd0aCA9IEFic3RyYWN0TW9kYWxFbGVtZW50Ll9vcGVuTW9kYWxzLmxlbmd0aFxuXG4gICAgICAgIC8vcmVtb3ZlIGl0c2VsZiBmcm9tIHRoZSBsaXN0XG4gICAgICAgIGNvbnN0IGluZGV4ID0gQWJzdHJhY3RNb2RhbEVsZW1lbnQuX29wZW5Nb2RhbHMuaW5kZXhPZih0aGlzKVxuICAgICAgICBpZiAoaW5kZXggIT09IC0xKXtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2Nsb3NlJykpXG4gICAgICAgICAgICBBYnN0cmFjdE1vZGFsRWxlbWVudC5fb3Blbk1vZGFscy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9oaWRlIHRoaXMgZWxlbWVudFxuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpXG4gICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuXG4gICAgICAgIGlmIChBYnN0cmFjdE1vZGFsRWxlbWVudC5fb3Blbk1vZGFscy5sZW5ndGggPT09IDApe1xuXG4gICAgICAgICAgICAvL3VuaGlkZSBhbGwgdGhlIGVsZW1lbnRzXG4gICAgICAgICAgICBBYnN0cmFjdE1vZGFsRWxlbWVudC5faGlkZGVuRWxlbWVudHMuZm9yRWFjaCgoe3RhYkluZGV4LCBhcmlhSGlkZGVuLCBkaXNwbGF5fSwgaXRlbTpIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGl0ZW0uc3R5bGUuZGlzcGxheSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHRhYkluZGV4ICE9PSBudWxsKXtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgdGFiSW5kZXgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYXJpYUhpZGRlbiAhPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsIGFyaWFIaWRkZW4pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGlzcGxheSAhPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUuZGlzcGxheSA9IGRpc3BsYXlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlLmRpc3BsYXkgPSBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvL2NsZWFyIHRoZSBhcnJheVxuICAgICAgICAgICAgQWJzdHJhY3RNb2RhbEVsZW1lbnQuX2hpZGRlbkVsZW1lbnRzLmNsZWFyKCk7XG5cbiAgICAgICAgICAgIC8vdHJpZ2dlciByZXNpemUgaW4gY2FzZSB0aGF0J3MgcmVsZXZhbnRcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3Jlc2l6ZScsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG5cbiAgICAgICAgICAgIC8vcmV0dXJuIGZvY3VzIHRvIHRoZSBzaWRlcGFuZWxcbiAgICAgICAgICAgIC8vZmlndXJlIG91dCB3aGVyZSB0byByZXR1cm4gZm9jdXMgdG9cbiAgICAgICAgICAgIGlmICh0aGlzLl9yZXR1cm5Gb2N1c1RvKXtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXR1cm5Gb2N1c1RvLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmV0dXJuRm9jdXNUbyA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vYXNzdW1lcyB0aGF0IGl0J3MgY29taW5nIGZyb20gdGhlIHNwbGFzaCBzY3JlZW5cbiAgICAgICAgICAgICAgICBjb25zdCBzaWRlcGFuZWwgPSAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYWNjLXNpZGUtcGFuZWwnKSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHNpZGVwYW5lbCl7XG4gICAgICAgICAgICAgICAgICAgIHNpZGVwYW5lbC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmV2aW91c0xlbmd0aCAmJiAhQWJzdHJhY3RNb2RhbEVsZW1lbnQuX29wZW5Nb2RhbHMubGVuZ3RoKXtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ21vZGFsLWNsb3NlJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvY3VzKCl7XG4gICAgICAgIHN1cGVyLmZvY3VzKCk7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcuY29udGFpbmVyJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChjb250YWluZXIpe1xuICAgICAgICAgICAgY29udGFpbmVyLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfcHJvcGVydGllc0NoYW5nZWQocHJvcHM6IGFueSwgY2hhbmdlZDogYW55LCBwcmV2OiBhbnkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGNoYW5nZWQgJiYgY2hhbmdlZC5oYXNPd25Qcm9wZXJ0eSgnb3BlbicpKSB8fFxuICAgICAgICAgICAgKGNoYW5nZWQgJiYgY2hhbmdlZC5oYXNPd25Qcm9wZXJ0eSgnZXhjbHVzaXZlJykpXG4gICAgICAgICl7XG4gICAgICAgICAgICBpZiAocHJvcHMub3Blbil7XG4gICAgICAgICAgICAgICAgdGhpcy5fb3BlbigpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIEFic3RyYWN0TW9kYWxFbGVtZW50Ll9zaG93T25Ub3AoKTtcbiAgICAgICAgc3VwZXIuX3Byb3BlcnRpZXNDaGFuZ2VkKHByb3BzLCBjaGFuZ2VkLCBwcmV2KTtcbiAgICB9XG5cbiAgICBfZGlkUmVuZGVyKHByb3BzOiBhbnksIGNoYW5nZWQ6IGFueSwgcHJldjogYW55KSB7XG4gICAgICAgIEFic3RyYWN0TW9kYWxFbGVtZW50Ll9zaG93T25Ub3AoKTtcbiAgICB9XG5cbiAgICBfcmVuZGVyKHByb3BzOmFueSl7XG4gICAgICAgIHJldHVybiBodG1sYDxzdHlsZT5cblxuICAgICAgICAgICAgOmhvc3Qge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgOmhvc3QgLmNvbnRhaW5lciB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICAgICAgICAgIGNvbG9yOiAke2xhYmVsQ29sb3J9O1xuICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICAgICAgICB0b3A6IDBweDtcbiAgICAgICAgICAgICAgICBsZWZ0OiAwcHg7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvc3R5bGU+XG4gICAgICAgICAgICAke3RoaXMub3BlbiA/IGh0bWxgXG4gICAgICAgICAgICAgICAgPGRpdiB0YWJpbmRleD1cIjBcIiBjbGFzcz1cImNvbnRhaW5lclwiIHN0eWxlPVwiZGlzcGxheTogJHtwcm9wcy5vcGVuID8gJ2Jsb2NrJyA6ICdub25lJ307IDogJyd9XCI+XG4gICAgICAgICAgICAgICAgICAgICR7dGhpcy5fcmVuZGVyTW9kYWxCb2R5KHByb3BzKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIGAgOiBodG1sYGB9XG4gICAgICAgIGA7XG5cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2hhbmRsZUNsb3NlQ2xpY2soKXtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKVxuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjbG9zZScpKTtcbiAgICB9XG5cbn1cbiIsImltcG9ydCB7IFVJUHJvcGVydGllcyB9IGZyb20gJy4vYWJzdHJhY3QtdWknO1xuLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbmltcG9ydCBhdXRvYmluZCBmcm9tJ2F1dG9iaW5kLWRlY29yYXRvcic7XG5pbXBvcnQgeyBBYnN0cmFjdFVJRWxlbWVudCB9IGZyb20gJy4vYWJzdHJhY3QtdWknO1xuaW1wb3J0IHsgTm9kZU9ic2VydmVyLCBOb2RlT2JzZXJ2YXRpb24gfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IE9wdGdyb3VwRWxlbWVudCB9IGZyb20gJy4vb3B0Z3JvdXAnO1xuaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5cbi8vQHRzLWlnbm9yZVxuY29uc3QgeyBGbGF0dGVuZWROb2Rlc09ic2VydmVyIH0gPSByZXF1aXJlKCdAcG9seW1lci9wb2x5bWVyL2xpYi91dGlscy9mbGF0dGVuZWQtbm9kZXMtb2JzZXJ2ZXIuanMnKTtcblxuXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdFByb3BlcnRpZXMgZXh0ZW5kcyBVSVByb3BlcnRpZXMge1xuICAgIGhpZGVMYWJlbDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RhYmxlRWxlbWVudCBleHRlbmRzIEVsZW1lbnQge1xuICAgIHNlbGVjdGVkOmJvb2xlYW47XG4gICAgdmFsdWU6c3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgaXNPcHRncm91cEVsZW1lbnQgPSAoZWw6YW55KTogZWwgaXMgT3B0Z3JvdXBFbGVtZW50ID0+XG4gICAgZWwgJiYgZWwudGFnTmFtZSA9PT0gJ0FDQy1PUFRHUk9VUCc7XG5cbmV4cG9ydCBjb25zdCBpc1NlbGVjdGFibGVFbGVtZW50ID0gKGVsOmFueSk6IGVsIGlzIFNlbGVjdGFibGVFbGVtZW50ID0+XG4gICAgdHlwZW9mIGVsLnNlbGVjdGVkID09PSAnYm9vbGVhbic7XG5cblxuLyoqXG4gKiBAYWJzdHJhY3RcbiAqIEFic3RyYWN0U2VsZWN0TGl0RWxlbWVudCBpcyBhbiBBYnN0cmFjdCBjbGFzcyBhbmQgdGhlcmVmb3JlIHNob3VsZCBhbHdheXMgYmUgZXh0ZW5kZWRcbiAqIFRoaXMgY2xhc3MgbWFuYWdlcyB0aGUgW3NlbGVjdGVkXSBhdHRyaWJ1dGUgc3RhdGUgb2YgYWxsIGNoaWxkcmVuIGFkZGVkIGludG8gaXRzIHNsb3RcbiAqL1xuZXhwb3J0IGNsYXNzIEFic3RyYWN0U2VsZWN0RWxlbWVudCBleHRlbmRzIEFic3RyYWN0VUlFbGVtZW50IHtcblxuICAgIC8qKlxuICAgICAqIGhpZGUgdGhlIGxhYmVsIHZpc3VhbGx5LCBvbmx5IHByb3ZpZGUgdG8gYXJpYVxuICAgICAqL1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSlcbiAgICBwdWJsaWMgaGlkZUxhYmVsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwcm90ZWN0ZWQgX25vZGVDaGlsZFNlbGVjdG9yID0gJ2FjYy1pdGVtJztcblxuICAgIC8qKlxuICAgICAqIGEgbWFwIG9mIGFsbCA8YWNjLW9wdGdyb3VwPiBub2Rlc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZ3JvdXBzOiBPcHRncm91cEVsZW1lbnRbXSA9IFtdO1xuICAgIC8qKlxuICAgICAqIGEgbWFwIG9mIG9ic2VydmVycyBmb3Igb3B0Z3JvdXAgY2hpbGQgbm9kZXNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2dyb3VwT2JzZXJ2ZXJzOiBOb2RlT2JzZXJ2ZXJbXSA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogYSBtYXAgb2YgYWxsIDxhY2MtaXRlbT4gbm9kZXMsXG4gICAgICogdGhpcyBtYXAgaXMgZmxhdHRlbmVkIHRvIGluY2x1ZGUgYWxsIGl0ZW1zIG5lc3RlZCBpbiBhIGdyb3VwXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9ub2RlczpTZWxlY3RhYmxlRWxlbWVudFtdID0gW107XG5cbiAgICBwcml2YXRlIF9fbm9kZXNPYnNlcnZlcjogTm9kZU9ic2VydmVyO1xuXG4gICAgY29ubmVjdGVkQ2FsbGJhY2soKXtcbiAgICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgICAgdGhpcy5fX25vZGVzT2JzZXJ2ZXIgPSBuZXcgRmxhdHRlbmVkTm9kZXNPYnNlcnZlcih0aGlzLCB0aGlzLl9oYW5kbGVOb2Rlc09ic2VydmVyVXBkYXRlKTtcbiAgICB9XG5cbiAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgdGhpcy5fX25vZGVzT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjdCBhbiBlbGVtZW50IHRvIGNoYW5nZSB0aGUgYWN0aXZlIGl0ZW0uXG4gICAgICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdGhhdCBpcyB0byBiZSB0aGUgc2VsZWN0ZWQgZWxlbWVudFxuICAgICAqL1xuICAgIHNlbGVjdChub2RlOlNlbGVjdGFibGVFbGVtZW50KXtcbiAgICAgICAgdGhpcy5fX2Rlc2VsZWN0QWxsTm9kZXMobm9kZSk7XG4gICAgICAgIGlmKCFub2RlLnNlbGVjdGVkKXtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0ge1xuICAgICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG5vZGVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgY29tcG9zZWQ6IHRydWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZihpc0VsZW1lbnQobm9kZSkpe1xuICAgICAgICAgICAgICAgIG5vZGUuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vbm9kZS5zZXRBdHRyaWJ1dGUoJ3NlbGVjdGVkJywgJ3RydWUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3NlbGVjdCcsIGN1c3RvbUV2ZW50KSk7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBzZWxlY3RlZCgpOlNlbGVjdGFibGVFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vZGVzW3RoaXMuc2VsZWN0ZWRJbmRleF07XG4gICAgfVxuXG4gICAgZ2V0IHNlbGVjdGVkSW5kZXgoKXtcbiAgICAgICAgZm9yKGxldCBpPTA7IGk8dGhpcy5fbm9kZXMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgY29uc3QgYXR0clZhbHVlID0gdGhpcy5fbm9kZXNbaV0uc2VsZWN0ZWQ7XG4gICAgICAgICAgICBpZihhdHRyVmFsdWUpe1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICBzZXQgc2VsZWN0ZWRJbmRleChpbmRleCl7XG4gICAgICAgIGlmICh0aGlzLl9ub2Rlc1tpbmRleF0pe1xuICAgICAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5fbm9kZXNbaW5kZXhdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VsZWN0IGFsbCBub2RlcywgYWxsb3dzIGZvciBhbiBleGVtcHRpb25cbiAgICAgKiBAcGFyYW0gZXhjZXB0IG9wdGlvbmFsbHkgcHJvdmlkZSBhIHNpbmdsZSBlbGVtZW50IG5vdCB0byBkZXNlbGVjdFxuICAgICAqL1xuICAgIHByaXZhdGUgX19kZXNlbGVjdEFsbE5vZGVzKGV4Y2VwdDpudW1iZXJ8U2VsZWN0YWJsZUVsZW1lbnR8bnVsbCl7XG4gICAgICAgIGNvbnN0IGV4Y2VwdEVsZW1lbnQgPSB0eXBlb2YgZXhjZXB0ID09PSAnbnVtYmVyJyA/IHRoaXMuX25vZGVzW2V4Y2VwdF0gOiBleGNlcHQ7XG4gICAgICAgIGZvcihsZXQgaT0wOyBpPHRoaXMuX25vZGVzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGlmKHRoaXMuX25vZGVzW2ldICE9PSBleGNlcHRFbGVtZW50KXtcbiAgICAgICAgICAgICAgICB0aGlzLl9ub2Rlc1tpXS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgQGF1dG9iaW5kXG4gICAgcHJpdmF0ZSBfaGFuZGxlU2xvdE5vZGVDaGFuZ2VkKGV2ZW50OkN1c3RvbUV2ZW50KXtcbiAgICAgICAgaWYoaXNTZWxlY3RhYmxlRWxlbWVudChldmVudC50YXJnZXQpKXtcbiAgICAgICAgICAgIGlmKGV2ZW50LnRhcmdldC5zZWxlY3RlZCl7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlcXVlc3RSZW5kZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaGFuZGxlciBmb3Igd2hlbiBub2RlcyBhcmUgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSA8c2xvdD5cbiAgICAgKiBAcGFyYW0gaW5mbyB0aGUgZGVzY3JpcHRpb24gb2YgYWRkZWQgYW5kIHJlbW92ZWQgbm9kZXMgaW4gdGhlIGxhc3QgY2hhbmdlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9oYW5kbGVOb2Rlc09ic2VydmVyVXBkYXRlKGluZm86IE5vZGVPYnNlcnZhdGlvbikge1xuICAgICAgICAvL3JlbW92ZSBzZWxlY3RhYmxlIGVsZW1lbnRzXG4gICAgICAgIGluZm8ucmVtb3ZlZE5vZGVzLmZvckVhY2gobm9kZT0+IGlzU2VsZWN0YWJsZUVsZW1lbnQobm9kZSkgJiYgdGhpcy5fcmVtb3ZlTm9kZShub2RlKSk7XG4gICAgICAgIC8vcmVtb3ZlIG9wdGdyb3Vwc1xuICAgICAgICBpbmZvLnJlbW92ZWROb2Rlcy5mb3JFYWNoKG5vZGUgPT4gaXNPcHRncm91cEVsZW1lbnQobm9kZSkgJiYgdGhpcy5fcmVtb3ZlR3JvdXAobm9kZSkpO1xuICAgICAgICAvL2FkZCBvcHRncm91cHNcbiAgICAgICAgaW5mby5hZGRlZE5vZGVzLmZvckVhY2gobm9kZSA9PiBpc09wdGdyb3VwRWxlbWVudChub2RlKSAmJiB0aGlzLl9hZGRHcm91cChub2RlKSk7XG4gICAgICAgIC8vYWRkIHNlbGVjdGFibGUgZWxlbWVudHNcbiAgICAgICAgaW5mby5hZGRlZE5vZGVzLmZvckVhY2gobm9kZT0+IGlzU2VsZWN0YWJsZUVsZW1lbnQobm9kZSkgJiYgdGhpcy5fYWRkTm9kZShub2RlKSk7XG4gICAgICAgIC8vd2FybiBpZiBpbnZhbGlkIGVsZW1lbnQgZm91bmRcbiAgICAgICAgaW5mby5hZGRlZE5vZGVzLmZpbHRlcihub2RlPT4gaXNFbGVtZW50KG5vZGUpICYmICghaXNPcHRncm91cEVsZW1lbnQobm9kZSkgJiYgIWlzU2VsZWN0YWJsZUVsZW1lbnQobm9kZSkpKS5mb3JFYWNoKG5vZGU9PntcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgaWdub3JpbmcgZWxlbWVudCAke25vZGUudGFnTmFtZX0sIGl0IGlzIG5vdCBhIHNlbGVjdGFibGUgZWxlbWVudGApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZih0aGlzLnNlbGVjdGVkSW5kZXggPT09IC0xICYmIHRoaXMuX25vZGVzLmxlbmd0aCl7XG4gICAgICAgICAgICAvL25vbmUgYXJlIHNlbGVjdGVkXG4gICAgICAgICAgICAvL3NlbGVjdCB0aGUgZmlyc3QgaXRlbSwgdGhhdCBpc250IGEgY2hpbGQgb2YgYSBkaXNhYmxlZCBvcHRncm91cFxuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdGhpcy5fbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5fbm9kZXNbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgaXNEaXNhYmxlZEdyb3VwID0gaXNPcHRncm91cEVsZW1lbnQobm9kZS5wYXJlbnRFbGVtZW50KSAmJiBub2RlLnBhcmVudEVsZW1lbnQuZGlzYWJsZWQ7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0Rpc2FibGVkR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Qobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlcXVlc3RSZW5kZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYW4gPGFjYy1vcHRncm91cD4gZWxlbWVudCB0byB0aGUgc2VsZWN0XG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2FkZEdyb3VwKG5vZGU6T3B0Z3JvdXBFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGFkZCA9IChpdGVtTm9kZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoIGlzU2VsZWN0YWJsZUVsZW1lbnQoaXRlbU5vZGUpICkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkZE5vZGUoaXRlbU5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlbW92ZSA9IChpdGVtTm9kZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNTZWxlY3RhYmxlRWxlbWVudChpdGVtTm9kZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVOb2RlKGl0ZW1Ob2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBjaGlsZE9ic2VydmVyOiBOb2RlT2JzZXJ2ZXIgPSBuZXcgRmxhdHRlbmVkTm9kZXNPYnNlcnZlcihub2RlLCAoaW5mbzogTm9kZU9ic2VydmF0aW9uKSA9PiB7XG4gICAgICAgICAgICBpbmZvLnJlbW92ZWROb2Rlcy5mb3JFYWNoKHJlbW92ZSk7XG4gICAgICAgICAgICBpbmZvLmFkZGVkTm9kZXMuZm9yRWFjaChhZGQpO1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9ncm91cHMucHVzaChub2RlKTtcbiAgICAgICAgdGhpcy5fZ3JvdXBPYnNlcnZlcnMucHVzaChjaGlsZE9ic2VydmVyKTtcblxuICAgICAgICAvL3dlIG11c3QgZ28gdGhyb3VnaCBhbGwgY2hpbGRyZW4gbm9kZXMgYW5kIGFkZCB0aGVtIHRvIHRoZSBmbGF0LW1hcFxuICAgICAgICAvL1RPRE86IHRoaXMgZG9lc24ndCBzdXBwb3J0IGFkZGluZy9yZW1vdmluZyBub2RlcyBmcm9tIGEgZ3JvdXAgOihcbiAgICAgICAgZm9yKGxldCBpdGVtTm9kZSBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBhZGQoaXRlbU5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9yZW1vdmVHcm91cChncm91cDogT3B0Z3JvdXBFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZ3JvdXBzLmluZGV4T2YoZ3JvdXApO1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdyb3VwT2JzZXJ2ZXIgPSB0aGlzLl9ncm91cE9ic2VydmVyc1tpbmRleF07XG4gICAgICAgIGlmKCFncm91cE9ic2VydmVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0hhcyBncm91cCBidXQgZG9lcyBub3QgaGF2ZSBvYnNlcnZlciEnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcihsZXQgaXRlbU5vZGUgb2YgZ3JvdXAuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmKCBpc1NlbGVjdGFibGVFbGVtZW50KGl0ZW1Ob2RlKSApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVOb2RlKGl0ZW1Ob2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBncm91cE9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgdGhpcy5fZ3JvdXBzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHRoaXMuX2dyb3VwT2JzZXJ2ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgc2VsZWN0YWJsZSBub2RlXG4gICAgICogQHBhcmFtIG5vZGUgYW4gSFRNTEVsZW1lbnQgdGhhdCBoYXMgYSAnc2VsZWN0ZWQnIHByb3BlcnR5XG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9hZGROb2RlKG5vZGU6U2VsZWN0YWJsZUVsZW1lbnQpe1xuICAgICAgICBpZiAodGhpcy5fbm9kZXMuaW5kZXhPZihub2RlKSA+IC0xKSB7XG4gICAgICAgICAgICAvL2FscmVhZHkgaW4gdGhlIG1hcFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5faGFuZGxlU2xvdE5vZGVDaGFuZ2VkKTtcbiAgICAgICAgLy90aGlzLl9ub2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgICB0aGlzLl9ub2RlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuX25vZGVDaGlsZFNlbGVjdG9yKSB8fCBbXSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9yZW1vdmVOb2RlKG5vZGU6U2VsZWN0YWJsZUVsZW1lbnQpe1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX25vZGVzLmluZGV4T2Yobm9kZSk7XG4gICAgICAgIGlmKGluZGV4IDwgMCl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbm9kZXNbaW5kZXhdLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuX2hhbmRsZVNsb3ROb2RlQ2hhbmdlZCk7XG4gICAgICAgIHRoaXMuX25vZGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG59IiwiaW1wb3J0IGF1dG9iaW5kIGZyb20gJ2F1dG9iaW5kLWRlY29yYXRvcic7XG5pbXBvcnQgeyBzZXRCb29sZWFuQXR0cmlidXRlIH0gZnJvbSAnLi8uLi91dGlscyc7XG5pbXBvcnQgeyBLZXlib2FyZFNob3J0Y3V0T2JzZXJ2ZXIgfSBmcm9tICcuLy4uL2tleWJvYXJkLXNob3J0Y3V0LW9ic2VydmVyJztcbmltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdAcG9seW1lci9saXQtZWxlbWVudCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJy4vZGVjb3JhdG9ycyc7XG5cblxuZXhwb3J0IGludGVyZmFjZSBVSVByb3BlcnRpZXMge1xuICAgIGxhYmVsOnN0cmluZztcbiAgICBkaXNhYmxlZDogYm9vbGVhbjtcbiAgICBzaG9ydGN1dDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgQWJzdHJhY3RVSUVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgICAvKipcbiAgICAgKiB0aGUgbGFiZWwgZm9yIHRoZSBlbGVtZW50LCB1c2VmdWwgZm9yIGRpc3BsYXkgYXMgd2VsbCBhcyBzY3JlZW4gcmVhZGVyc1xuICAgICAqL1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICAgIHB1YmxpYyBsYWJlbDogc3RyaW5nID0gJyc7XG5cbiAgICAvKipcbiAgICAgKiBkaXNhYmxlIHRoZSBlbGVtZW50LCBtYWtlIGl0IGluYWNjZXNzaWJsZVxuICAgICAqL1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSlcbiAgICBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIGEga2V5Ym9hcmQgc2hvcnRjdXQgdG8gYWNjZXNzIHRoZSBlbGVtZW50XG4gICAgICovXG4gICAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gICAgcHVibGljIHNob3J0Y3V0OiBzdHJpbmcgPSAnJztcblxuICAgIHByb3RlY3RlZCBfc2hvcnRjdXRPYnNlcnZlcjogS2V5Ym9hcmRTaG9ydGN1dE9ic2VydmVyO1xuXG5cbiAgICBwdWJsaWMgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICAgIHRoaXMuX3Nob3J0Y3V0T2JzZXJ2ZXIgPSBuZXcgS2V5Ym9hcmRTaG9ydGN1dE9ic2VydmVyKHRoaXMuc2hvcnRjdXQsIHRoaXMuX2hhbmRsZVNob3J0Y3V0KTtcbiAgICB9XG5cblxuICAgIHB1YmxpYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgdGhpcy5fc2hvcnRjdXRPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bmN0aW9uIGNhbGxlZCB3aGVuZXZlciB0aGUga2V5Ym9hcmQgc2hvcnRjdXQgaXMgcGVyZm9ybWVkXG4gICAgICovXG4gICAgQGF1dG9iaW5kXG4gICAgcHJvdGVjdGVkIF9oYW5kbGVTaG9ydGN1dCgpIHtcblxuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdzaG9ydGN1dCcsIHtidWJibGVzIDogdHJ1ZSwgY29tcG9zZWQgOiB0cnVlfSkpXG4gICAgfVxuXG5cbiAgICBwdWJsaWMgX3Byb3BlcnRpZXNDaGFuZ2VkKHByb3BzOiBhbnksIGNoYW5nZWQ6IGFueSwgcHJldjogYW55KSB7XG4gICAgICAgIGlmKCFjaGFuZ2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIuX3Byb3BlcnRpZXNDaGFuZ2VkKHByb3BzLCBjaGFuZ2VkLCBwcmV2KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vc2V0IG9yIHVwZGF0ZSB0aGUga2V5Ym9hcmQgc2hvcnRjdXQgcGF0dGVyblxuICAgICAgICBpZih0eXBlb2YgY2hhbmdlZC5zaG9ydGN1dCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5fc2hvcnRjdXRPYnNlcnZlcikge1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRjdXRPYnNlcnZlci5wYXR0ZXJuID0gcHJvcHMuc2hvcnRjdXQ7XG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSB3aGV0aGVyIHRoaXMgVUkgZWxlbWVudCBpcyBkaXNhYmxlZCBvciBub3RcbiAgICAgICAgaWYodHlwZW9mIGNoYW5nZWQuZGlzYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBzZXRCb29sZWFuQXR0cmlidXRlKHRoaXMsICdkaXNhYmxlZCcsIHByb3BzLmRpc2FibGVkKTtcbiAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsIHByb3BzLmRpc2FibGVkKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5fcHJvcGVydGllc0NoYW5nZWQocHJvcHMsIGNoYW5nZWQsIHByZXYpO1xuICAgIH1cblxufTsiLCIvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuaW1wb3J0IHsgQWJzdHJhY3RVSUVsZW1lbnQsIFVJUHJvcGVydGllcyB9IGZyb20gJy4vYWJzdHJhY3QtdWknO1xuaW1wb3J0IHsgYm9keUZvbnRGYW1pbHksIGJ1dHRvbkJhY2tncm91bmRDb2xvciwgYnV0dG9uTGFiZWxDb2xvciwgaWNvblNpemUsIGFjY2VudENvbG9yLCBidXR0b25Cb3JkZXJDb2xvciwgYnV0dG9uRm9udFNpemUsIGJ1dHRvbkZvbnRXZWlnaHQsIGJ1dHRvbkp1c3RpZnlDb250ZW50LCBidXR0b25Cb3JkZXJXaWR0aCB9IGZyb20gJy4vc3R5bGVzJztcbmltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdAcG9seW1lci9saXQtZWxlbWVudCc7XG5pbXBvcnQgYXV0b2JpbmQgZnJvbSAnYXV0b2JpbmQtZGVjb3JhdG9yJztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnLi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IHNldEJvb2xlYW5BdHRyaWJ1dGUgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgJy4vaWNvbidcblxuZXhwb3J0IGludGVyZmFjZSBCdXR0b25Qcm9wZXJ0aWVzIGV4dGVuZHMgVUlQcm9wZXJ0aWVzIHtcbiAgICBpY29uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBgPGFjYy1idXR0b24+YCBlbGVtZW50LlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqXG4gKiAgPGFjYy1idXR0b24gbGFiZWw9XCJNeSBCdXR0b25cIiBpY29uPVwibXktaWNvbi5wbmdcIj48L2FjYy1idXR0b24+XG4gKiAgPGFjYy1idXR0b24gbGFiZWw9XCJNeSBCdXR0b25cIiBkaXNhYmxlZD48L2FjYy1idXR0b24+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEJ1dHRvbkVsZW1lbnQgZXh0ZW5kcyBBYnN0cmFjdFVJRWxlbWVudCB7XG5cbiAgICAvKipcbiAgICAgKiBhIHNyYyBVUkwgZm9yIGFuIGljb24gdG8gYmUgc2hvd24gaW5zaWRlIHRoZSBidXR0b25cbiAgICAgKi9cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgICBwdWJsaWMgaWNvbjogc3RyaW5nID0gJyc7XG5cbiAgICBAYXV0b2JpbmRcbiAgICBwcm90ZWN0ZWQgX2hhbmRsZVNob3J0Y3V0KCkge1xuICAgICAgICB0aGlzLl9kaXNwYXRjaENsaWNrKClcbiAgICAgICAgc3VwZXIuX2hhbmRsZVNob3J0Y3V0KCk7XG4gICAgfVxuXG4gICAgX2Rpc3BhdGNoQ2xpY2soKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnY2xpY2snKSk7XG4gICAgfVxuXG5cbiAgICBmb2N1cygpe1xuICAgICAgICBzdXBlci5mb2N1cygpO1xuICAgICAgICBjb25zdCBidXR0b24gPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignYnV0dG9uJyk7XG4gICAgICAgIGlmKGJ1dHRvbikge1xuICAgICAgICAgICAgYnV0dG9uLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfcmVuZGVyKHtsYWJlbCwgaWNvbn06IEJ1dHRvblByb3BlcnRpZXMpe1xuXG4gICAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAgICAgPHN0eWxlPlxuICAgICAgICAgICAgICAgIDpob3N0IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDUwcHg7XG4gICAgICAgICAgICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbjogOHB4IDBweDtcbiAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuNTtcbiAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgIGJ1dHRvbiB7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAke2J1dHRvbkZvbnRTaXplfTtcbiAgICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6ICR7YnV0dG9uRm9udFdlaWdodH07XG4gICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAke2JvZHlGb250RmFtaWx5fTtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlcjogJHtidXR0b25Cb3JkZXJXaWR0aH0gc29saWQgJHtidXR0b25Cb3JkZXJDb2xvcn07XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogJHtidXR0b25KdXN0aWZ5Q29udGVudH07XG4gICAgICAgICAgICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1xuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAxMHB4IDBweDtcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHtidXR0b25CYWNrZ3JvdW5kQ29sb3J9O1xuICAgICAgICAgICAgICAgICAgICBjb2xvcjogJHtidXR0b25MYWJlbENvbG9yfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBidXR0b246aG92ZXIge1xuICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLmljb24ge1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTZweDtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxNnB4O1xuICAgICAgICAgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDhweDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAubGFiZWwge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8L3N0eWxlPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGRpc2FibGVkPz1cIiR7dGhpcy5kaXNhYmxlZH1cIlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiJHt0aGlzLmRpc2FibGVkID8gLTEgOiAwfVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIiR7bGFiZWx9XCI+XG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIiBzcmM9XCIke2ljb259XCIgc3R5bGU9XCJkaXNwbGF5OiAke2ljb24gPT09ICcnID8gJ25vbmUnIDogJ2Jsb2NrJ31cIlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj4ke2xhYmVsfTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG5cbiAgICAgICAgYDtcbiAgICB9XG59XG5cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdhY2MtYnV0dG9uJywgQnV0dG9uRWxlbWVudCk7IiwiLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbmltcG9ydCBhdXRvYmluZCBmcm9tICdhdXRvYmluZC1kZWNvcmF0b3InO1xuaW1wb3J0IHsgQWJzdHJhY3RVSUVsZW1lbnQsIFVJUHJvcGVydGllcyB9IGZyb20gJy4vYWJzdHJhY3QtdWknO1xuaW1wb3J0IHsgc2V0Qm9vbGVhbkF0dHJpYnV0ZSwgc2NhbGVUb0ZpbGwsIGlzRWxlbWVudCB9IGZyb20gJy4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgaHRtbCB9IGZyb20gJ0Bwb2x5bWVyL2xpdC1lbGVtZW50JztcbmltcG9ydCB7IEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIgfSBmcm9tICdAcG9seW1lci9wb2x5bWVyL2xpYi91dGlscy9mbGF0dGVuZWQtbm9kZXMtb2JzZXJ2ZXInO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICcuL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgSW5wdXRNb2RlU2VsZWN0RWxlbWVudCB9IGZyb20gJy4vaW5wdXQtbW9kZS1zZWxlY3QnO1xuaW1wb3J0IHsgQUNDSW5wdXRFdmVudCB9IGZyb20gJy4uL2V2ZW50cy9pbnB1dC1ldmVudCc7XG5pbXBvcnQgeyBBYnN0cmFjdElucHV0RWxlbWVudCB9IGZyb20gJy4vYWJzdHJhY3QtaW5wdXQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRQcm9wZXJ0aWVzIGV4dGVuZHMgVUlQcm9wZXJ0aWVzIHtcbiAgICBpbnB1dFNlbGVjdG9yOiBzdHJpbmc7XG4gICAgZ3JheXNjYWxlOiBib29sZWFuO1xuICAgIHdlYmNhbU9wYWNpdHk6IG51bWJlcjtcbiAgICBtb3VudGVkOiBib29sZWFuO1xufVxuXG5cbmNvbnN0IGlzRm9jdXNhYmxlID0gKGVsOiBhbnkpOiBlbCBpcyB7IGZvY3VzOiAoKT0+IHZvaWQgfSA9PlxuICAgIGVsICYmIHR5cGVvZiBlbC5mb2N1cyA9PT0gJ2Z1bmN0aW9uJztcblxuY29uc3QgaXNJbnB1dFdpdGhDYW52YXMgPSAoYzogYW55KTogYyBpcyB7IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfSA9PlxuICAgIHR5cGVvZiBjLmNhbnZhcyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGMuY2FudmFzLmdldENvbnRleHQgPT09ICdmdW5jdGlvbic7XG5cbi8qKlxuICogQW4gYDxhY2MtY29udGVudD5gIGVsZW1lbnQgaXMgaW50ZW5kZWQgYXMgYSBjb250YWluZXIgZm9yIHRoZSBtYWluIGNvbnRlbnQgYXJlYS5cbiAqIElmIHVzaW5nIGFuIEFic3RyYWN0SW5wdXQgc3VjaCBhcyBgPGFjYy1tb3VzZS1pbnB1dD5gIG9yIGA8YWNjLXBvc2UtaW5wdXQ+YFxuICogdGhlIGNvb3JkaW5hdGUgc3BhY2Ugd2lsbCBiZSBtYXBwZWQgdG8gdGhpcyBlbGVtZW50IGFuZCBjYW4gb3B0aW9uYWxseVxuICogc2ltcGxpZnkgZGlzcGxheSBvZiB0aGUgY2FtZXJhIGltYWdlLlxuICpcbiAqIEBleGFtcGxlIGBgYGh0bWxcbiAqXG4gKiA8YWNjLWNvbnRlbnQgd2ViY2FtT3BhY2l0eT1cIjAuMjVcIiBncmF5c2NhbGUgbW91bnRlZD48L2FjYy1jb250ZW50PlxuICogYGBgXG4gKlxuICovXG5leHBvcnQgY2xhc3MgQ29udGVudEVsZW1lbnQgZXh0ZW5kcyBBYnN0cmFjdFVJRWxlbWVudCB7XG5cblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICAgIHB1YmxpYyBpbnB1dFNlbGVjdG9yOiBzdHJpbmcgPSAnYWNjLWlucHV0LW1vZGUtc2VsZWN0JztcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSlcbiAgICBwdWJsaWMgZ3JheXNjYWxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIgfSlcbiAgICBwdWJsaWMgd2ViY2FtT3BhY2l0eTogbnVtYmVyID0gMTtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSlcbiAgICBwdWJsaWMgbW91bnRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG5cbiAgICBwcml2YXRlIF9fYmdDdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcbiAgICBwcml2YXRlIF9faW5wdXRFbGVtZW50OiBJbnB1dE1vZGVTZWxlY3RFbGVtZW50IHwgQWJzdHJhY3RJbnB1dEVsZW1lbnQgfCBudWxsO1xuICAgIHByaXZhdGUgX19ub2Rlc09ic2VydmVyOiBGbGF0dGVuZWROb2Rlc09ic2VydmVyO1xuXG4gICAgcHVibGljIHNldCBpbnB1dEVsZW1lbnQoZWxlbWVudDogSW5wdXRNb2RlU2VsZWN0RWxlbWVudCB8IEFic3RyYWN0SW5wdXRFbGVtZW50IHwgbnVsbCkge1xuICAgICAgICBpZih0aGlzLl9faW5wdXRFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9faW5wdXRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RpY2snLCB0aGlzLl9vblRpY2spO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX19pbnB1dEVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgdGhpcy5fX2lucHV0RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fX2lucHV0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0aWNrJywgdGhpcy5fb25UaWNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxhYmVsID0gdGhpcy5sYWJlbCB8fCAnY29udGVudCc7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpbnB1dEVsZW1lbnQoKTogSW5wdXRNb2RlU2VsZWN0RWxlbWVudCB8IEFic3RyYWN0SW5wdXRFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGlmKCF0aGlzLl9faW5wdXRFbGVtZW50KXtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmlucHV0U2VsZWN0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX19pbnB1dEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICAgIC8vdGhpcyBjYWxscyB0aGUgZ2V0dGVyIGF0dGVtcHRpbmcgdG8gZmluZCB0aGUgZWxlbWVudFxuICAgICAgICBjb25zdCBwb2xsID0gKCkgPT57XG4gICAgICAgICAgICBpZighdGhpcy5pbnB1dEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHBvbGwsIDEwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcG9sbCgpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fb25SZXNpemUpO1xuICAgICAgICB0aGlzLl9fbm9kZXNPYnNlcnZlciA9IG5ldyBGbGF0dGVuZWROb2Rlc09ic2VydmVyKHRoaXMsIChpdGVtczogYW55KSA9PiB7XG4gICAgICAgICAgICBpdGVtcy5hZGRlZE5vZGVzLmZvckVhY2goKG5vZGU6IE5vZGUpID0+IHRoaXMuX29uQWRkTm9kZShub2RlKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICB0aGlzLl9fbm9kZXNPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9vblJlc2l6ZSk7XG4gICAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgQGF1dG9iaW5kXG4gICAgX2hhbmRsZVNob3J0Y3V0KCkge1xuICAgICAgICBmb3IobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmKGlzRm9jdXNhYmxlKGNoaWxkKSkge1xuICAgICAgICAgICAgICAgIGNoaWxkLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgc3VwZXIuX2hhbmRsZVNob3J0Y3V0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vZm91bmQgbm9uZSwgc28gZm9jdXMgaXRzZWxmXG4gICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgc3VwZXIuX2hhbmRsZVNob3J0Y3V0KCk7XG4gICAgfVxuXG5cbiAgICBfcHJvcGVydGllc0NoYW5nZWQocHJvcHM6IGFueSwgY2hhbmdlZFByb3BzOiBhbnksIHByZXZQcm9wczogYW55KSB7XG4gICAgICAgIGlmICghY2hhbmdlZFByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzdXBlci5fcHJvcGVydGllc0NoYW5nZWQocHJvcHMsIGNoYW5nZWRQcm9wcywgcHJldlByb3BzKTtcblxuICAgICAgICBzZXRCb29sZWFuQXR0cmlidXRlKHRoaXMsICdncmF5c2NhbGUnLCBwcm9wcy5ncmF5c2NhbGUpO1xuICAgICAgICBzZXRCb29sZWFuQXR0cmlidXRlKHRoaXMsICd3ZWJjYW0nLCBwcm9wcy53ZWJjYW0pO1xuICAgICAgICBzZXRCb29sZWFuQXR0cmlidXRlKHRoaXMsICdtb3VudGVkJywgcHJvcHMubW91bnRlZCk7XG4gICAgICAgIGlmIChwcm9wcy5kaXNhYmxlZCAhPT0gcHJldlByb3BzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICBpZiAocHJvcHMuZGlzYWJsZWQgJiYgdGhpcy5fX2lucHV0RWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX19pbnB1dEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGljaycsIHRoaXMuX29uVGljayk7XG4gICAgICAgICAgICB9IGVsc2UgaWYodGhpcy5fX2lucHV0RWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX19pbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndGljaycsIHRoaXMuX29uVGljayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBAYXV0b2JpbmRcbiAgICBwcm90ZWN0ZWQgX29uUmVzaXplKCkge1xuICAgICAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yKCcud3JhcHBlcicpISBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgd3JhcHBlci5zdHlsZS5oZWlnaHQgPSBgJHt3aW5kb3cuaW5uZXJIZWlnaHR9cHhgO1xuICAgICAgICB3cmFwcGVyLnN0eWxlLndpZHRoID0gdGhpcy5fX2NhbGNXaWR0aCgpO1xuICAgICAgICB0aGlzLl91cGRhdGVXZWJjYW1DYW52YXMoKTtcbiAgICAgICAgLy9zZW5kIGEgbm9uLWJ1YmJsaW5nIChjb250YWluZWQpIGV2ZW50IHRoYXQgaXQgZGlkIHJlc2l6ZVxuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdyZXNpemUnLCB7IGJ1YmJsZXM6IGZhbHNlIH0pKTtcbiAgICB9XG5cbiAgICBAYXV0b2JpbmRcbiAgICBwcm90ZWN0ZWQgX29uVGljayhldmVudDogQUNDSW5wdXRFdmVudCkge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgY29uc3QgeyBfX2JnQ3R4IH0gPSB0aGlzO1xuXG5cbiAgICAgICAgaWYoaXNJbnB1dFdpdGhDYW52YXMoaW5wdXQpICYmIHRoaXMud2ViY2FtT3BhY2l0eSA+IDApIHtcbiAgICAgICAgICAgIGlmIChfX2JnQ3R4LmNhbnZhcy53aWR0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN3ID0gdGhpcy5jbGllbnRXaWR0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBjaCA9IHRoaXMuY2xpZW50SGVpZ2h0O1xuICAgICAgICAgICAgICAgIGlmKGN3ID09PSAwIHx8IGNoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX19iZ0N0eC5jYW52YXMud2lkdGggPSBjdztcbiAgICAgICAgICAgICAgICBfX2JnQ3R4LmNhbnZhcy5oZWlnaHQgPSBjaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vUkVOREVSIFRIRSBXRUJDQU0gVE8gQ0FOVkFTIElGIElUIEVYSVNUU1xuICAgICAgICAgICAgLy9jb25zdCBjYW1TY2FsZSA9IHNjYWxlVG9GaWxsKDEyNDAsIDkzMCwgX19iZ0N0eC5jYW52YXMud2lkdGgsIF9fYmdDdHguY2FudmFzLmhlaWdodCk7XG4gICAgICAgICAgICBjb25zdCBjYW1TY2FsZSA9IHNjYWxlVG9GaWxsKGlucHV0LmNhbnZhcy53aWR0aCwgaW5wdXQuY2FudmFzLmhlaWdodCwgX19iZ0N0eC5jYW52YXMud2lkdGgsIF9fYmdDdHguY2FudmFzLmhlaWdodCk7XG4gICAgICAgICAgICBfX2JnQ3R4LmRyYXdJbWFnZShpbnB1dC5jYW52YXMsIGNhbVNjYWxlLmxlZnQsIGNhbVNjYWxlLnRvcCwgY2FtU2NhbGUud2lkdGgsIGNhbVNjYWxlLmhlaWdodCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL2lmIHRoZXJlcyBubyB3ZWJjYW0gdGhlbiBjbGVhciBpdCwga2VlcCBpdCBlbXB0eVxuICAgICAgICAgICAgX19iZ0N0eC5jbGVhclJlY3QoMCwgMCwgX19iZ0N0eC5jYW52YXMud2lkdGgsIF9fYmdDdHguY2FudmFzLmhlaWdodCk7XG4gICAgICAgIH1cbiAgIH1cblxuXG4gICBwcm90ZWN0ZWQgX29uQWRkTm9kZShub2RlOiBOb2RlKSB7XG4gICAgICAgIGlmIChpc0VsZW1lbnQobm9kZSkgJiYgbm9kZS50YWdOYW1lID09PSAnQ0FOVkFTJykge1xuICAgICAgICAgICAgY29uc3QgY2FudmFzID0gbm9kZSBhcyBIVE1MQ2FudmFzRWxlbWVudDtcbiAgICAgICAgICAgIGNhbnZhcy5jb250ZW50RWRpdGFibGUgPSAndHJ1ZSc7XG4gICAgICAgICAgICBjYW52YXMudGFiSW5kZXggPSAwO1xuICAgICAgICB9XG4gICB9XG5cbiAgIHByaXZhdGUgX19jYWxjV2lkdGgoKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHdpZHRoID0gJyc7XG5cbiAgICAgICAgaWYgKHRoaXMubW91bnRlZCkge1xuICAgICAgICAgICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdhY2Mtc2lkZS1wYW5lbCcpO1xuICAgICAgICAgICAgaWYocGFuZWwpIHtcbiAgICAgICAgICAgICAgICB3aWR0aCA9IGAke3dpbmRvdy5pbm5lcldpZHRoIC0gcGFuZWwuY2xpZW50V2lkdGh9cHhgXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdpZHRoID0gJzEwMCUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2lkdGggPSAnaW5oZXJpdCdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2lkdGg7XG4gICB9XG5cbiAgICBwcm90ZWN0ZWQgX3VwZGF0ZVdlYmNhbUNhbnZhcygpIHtcbiAgICAgICAgY29uc3QgY2FudmFzID0gdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yKCcud2ViY2FtLWNhbnZhcycpISBhcyBIVE1MQ2FudmFzRWxlbWVudDtcbiAgICAgICAgY2FudmFzLndpZHRoID0gdGhpcy5jbGllbnRXaWR0aDtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IHRoaXMuY2xpZW50SGVpZ2h0O1xuICAgICAgICB0aGlzLl9fYmdDdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICB9XG5cblxuICAgIF9kaWRSZW5kZXIocHJvcHM6IGFueSwgY2hhbmdlZFByb3BzOiBhbnksIHByZXZQcm9wczogYW55KSB7XG4gICAgICAgIHRoaXMuY2hpbGROb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB0aGlzLl9vbkFkZE5vZGUobm9kZSkpO1xuICAgICAgICB0aGlzLl91cGRhdGVXZWJjYW1DYW52YXMoKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLl9kaWRSZW5kZXIocHJvcHMsIGNoYW5nZWRQcm9wcywgcHJldlByb3BzKTtcbiAgICB9XG5cbiAgICBfcmVuZGVyKHsgbGFiZWwsIHdlYmNhbU9wYWNpdHkgfSA6IENvbnRlbnRQcm9wZXJ0aWVzKSB7XG5cbiAgICAgICAgcmV0dXJuIGh0bWxgPHN0eWxlPlxuICAgICAgICAgICAgICAgIDpob3N0IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOnJlbGF0aXZlO1xuICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDpob3N0KFttb3VudGVkXSkge1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgICAgIHRvcDogMDtcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICAgICAgICAgICAgLyptaW4td2lkdGg6IGNhbGMoMTAwJSAtIDMwMHB4KTsqL1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDpob3N0KFtncmF5c2NhbGVdKSAud2ViY2FtLWNhbnZhcyB7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcjogZ3JheXNjYWxlKDEwMCUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC53ZWJjYW0tY2FudmFzIHtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAuc2xvdC1jb250YWluZXIge1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgICAgIHRvcDogMDtcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogMDtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDwvc3R5bGU+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiIHN0eWxlPVwid2lkdGg6ICR7dGhpcy5fX2NhbGNXaWR0aCgpfTsgaGVpZ2h0OiAke3dpbmRvdy5pbm5lckhlaWdodH1weDtcIiByb2xlJD1cInNlY3Rpb25cIiBhcmlhLWxhYmVsJD1cIiR7bGFiZWx9XCI+XG4gICAgICAgICAgICAgICAgPGNhbnZhcyBjbGFzcz1cIndlYmNhbS1jYW52YXNcIiBzdHlsZT1cIm9wYWNpdHk6ICR7d2ViY2FtT3BhY2l0eX07XCI+PC9jYW52YXM+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNsb3QtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgfVxuXG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnYWNjLWNvbnRlbnQnLCBDb250ZW50RWxlbWVudCk7IiwiLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbmltcG9ydCB7TGl0RWxlbWVudH0gZnJvbSAnQHBvbHltZXIvbGl0LWVsZW1lbnQvJztcblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50Q29uc3RydWN0b3IgZXh0ZW5kcyBGdW5jdGlvbiB7XG4gIGlzPzogc3RyaW5nO1xuICBwcm9wZXJ0aWVzPzoge1twcm9wOiBzdHJpbmddOiBQcm9wZXJ0eU9wdGlvbnN9O1xuICBvYnNlcnZlcnM/OiBzdHJpbmdbXTtcbiAgX2FkZERlY2xhcmF0aXZlRXZlbnRMaXN0ZW5lcj86XG4gICAgICAodGFyZ2V0OiBzdHJpbmd8RXZlbnRUYXJnZXQsXG4gICAgICAgZXZlbnROYW1lOiBzdHJpbmcsXG4gICAgICAgaGFuZGxlcjogKGV2OiBFdmVudCkgPT4gdm9pZCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50UHJvdG90eXBlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yOiBFbGVtZW50Q29uc3RydWN0b3I7XG59XG5cbi8qKlxuICogQSBUeXBlU2NyaXB0IGNsYXNzIGRlY29yYXRvciBmYWN0b3J5IHRoYXQgcmVnaXN0ZXJzIHRoZSBjbGFzcyBhcyBhIGN1c3RvbVxuICogZWxlbWVudC5cbiAqXG4gKiBJZiBgdGFnbmFtZWAgaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgY3VzdG9tIGVsZW1lbnQgbmFtZSwgYW5kXG4gKiB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBjbGFzcyBzdGF0aWMgYGlzYCBwcm9wZXJ0eS4gSWYgYHRhZ25hbWVgIGlzIG9taXR0ZWQsXG4gKiB0aGUgc3RhdGljIGBpc2AgcHJvcGVydHkgb2YgdGhlIGNsYXNzIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLiBJZiBuZWl0aGVyIGV4aXN0LFxuICogb3IgaWYgYm90aCBleGlzdCBidXQgaGF2ZSBkaWZmZXJlbnQgdmFsdWVzIChleGNlcHQgaW4gdGhlIGNhc2UgdGhhdCB0aGUgYGlzYFxuICogcHJvcGVydHkgaXMgbm90IGFuIG93bi1wcm9wZXJ0eSBvZiB0aGUgY2xhc3MpLCBhbiBleGNlcHRpb24gaXMgdGhyb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3VzdG9tRWxlbWVudCh0YWduYW1lPzogc3RyaW5nKSB7XG4gIHJldHVybiAoY2xhc3NfOiB7bmV3ICgpOiBMaXRFbGVtZW50fSZFbGVtZW50Q29uc3RydWN0b3IpID0+IHtcbiAgICBpZiAodGFnbmFtZSkge1xuICAgICAgLy8gT25seSBjaGVjayB0aGF0IHRhZyBuYW1lcyBtYXRjaCB3aGVuIGBpc2AgaXMgb3VyIG93biBwcm9wZXJ0eS4gSXQgbWlnaHRcbiAgICAgIC8vIGJlIGluaGVyaXRlZCBmcm9tIGEgc3VwZXJjbGFzcywgaW4gd2hpY2ggY2FzZSBpdCdzIG9rIGlmIHRoZXkncmVcbiAgICAgIC8vIGRpZmZlcmVudCwgYW5kIHdlJ2xsIG92ZXJyaWRlIGl0IHdpdGggb3VyIG93biBwcm9wZXJ0eSBiZWxvdy5cbiAgICAgIGlmIChjbGFzc18uaGFzT3duUHJvcGVydHkoJ2lzJykpIHtcbiAgICAgICAgaWYgKHRhZ25hbWUgIT09IGNsYXNzXy5pcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYGN1c3RvbSBlbGVtZW50IHRhZyBuYW1lcyBkbyBub3QgbWF0Y2g6IGAgK1xuICAgICAgICAgICAgICBgKCR7dGFnbmFtZX0gIT09ICR7Y2xhc3NfLmlzfSlgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsYXNzXywgJ2lzJywge3ZhbHVlOiB0YWduYW1lfSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFRocm93cyBpZiB0YWcgbmFtZSBpcyBtaXNzaW5nIG9yIGludmFsaWQuXG4gICAgd2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZShjbGFzc18uaXMhLCBjbGFzc18pO1xuICB9O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSBAcHJvcGVydHkgZGVjb3JhdG9yLlxuICogU2VlIGh0dHBzOi8vd3d3LnBvbHltZXItcHJvamVjdC5vcmcvMi4wL2RvY3MvZGV2Z3VpZGUvcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9wZXJ0eU9wdGlvbnMge1xuICAvKipcbiAgICogVGhpcyBmaWVsZCBjYW4gYmUgb21pdHRlZCBpZiB0aGUgTWV0YWRhdGEgUmVmbGVjdGlvbiBBUEkgaXMgY29uZmlndXJlZC5cbiAgICovXG4gIHR5cGU/OiBCb29sZWFuQ29uc3RydWN0b3J8RGF0ZUNvbnN0cnVjdG9yfE51bWJlckNvbnN0cnVjdG9yfFN0cmluZ0NvbnN0cnVjdG9yfFxuICAgICAgQXJyYXlDb25zdHJ1Y3RvcnxPYmplY3RDb25zdHJ1Y3RvcjtcbiAgbm90aWZ5PzogYm9vbGVhbjtcbiAgcmVmbGVjdFRvQXR0cmlidXRlPzogYm9vbGVhbjtcbiAgcmVhZE9ubHk/OiBib29sZWFuO1xuICBjb21wdXRlZD86IHN0cmluZztcbiAgb2JzZXJ2ZXI/OiBzdHJpbmd8KCh2YWw6IHt9LCBvbGQ6IHt9KSA9PiB2b2lkKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUHJvcGVydHkoXG4gICAgcHJvdG86IEVsZW1lbnRQcm90b3R5cGUsIG5hbWU6IHN0cmluZywgb3B0aW9ucz86IFByb3BlcnR5T3B0aW9ucyk6IHZvaWQge1xuICBpZiAoIXByb3RvLmNvbnN0cnVjdG9yLmhhc093blByb3BlcnR5KCdwcm9wZXJ0aWVzJykpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8uY29uc3RydWN0b3IsICdwcm9wZXJ0aWVzJywge3ZhbHVlOiB7fX0pO1xuICB9XG5cbiAgY29uc3QgZmluYWxPcHRzOiBQcm9wZXJ0eU9wdGlvbnMgPSB7XG4gICAgLi4ucHJvdG8uY29uc3RydWN0b3IucHJvcGVydGllcyFbbmFtZV0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfTtcblxuICBpZiAoIWZpbmFsT3B0cy50eXBlKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEEgdHlwZSBjb3VsZCBub3QgYmUgZm91bmQgZm9yICR7bmFtZX0uIGAgK1xuICAgICAgICAnU2V0IGEgdHlwZSBvciBjb25maWd1cmUgTWV0YWRhdGEgUmVmbGVjdGlvbiBBUEkgc3VwcG9ydC4nKTtcbiAgfVxuXG4gIHByb3RvLmNvbnN0cnVjdG9yLnByb3BlcnRpZXMhW25hbWVdID0gZmluYWxPcHRzO1xufVxuXG4vKipcbiAqIEEgVHlwZVNjcmlwdCBwcm9wZXJ0eSBkZWNvcmF0b3IgZmFjdG9yeSB0aGF0IGRlZmluZXMgdGhpcyBhcyBhIFBvbHltZXJcbiAqIHByb3BlcnR5LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBpbnZva2VkIHRvIHJldHVybiBhIGRlY29yYXRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BlcnR5KG9wdGlvbnM/OiBQcm9wZXJ0eU9wdGlvbnMpIHtcbiAgcmV0dXJuIChwcm90bzogRWxlbWVudFByb3RvdHlwZSwgcHJvcE5hbWU6IHN0cmluZykgPT4ge1xuICAgIGNyZWF0ZVByb3BlcnR5KHByb3RvLCBwcm9wTmFtZSwgb3B0aW9ucyk7XG4gIH07XG59XG5cbi8qKlxuICogQSBUeXBlU2NyaXB0IHByb3BlcnR5IGRlY29yYXRvciBmYWN0b3J5IHRoYXQgY29udmVydHMgYSBjbGFzcyBwcm9wZXJ0eSBpbnRvXG4gKiBhIGdldHRlciB0aGF0IGV4ZWN1dGVzIGEgcXVlcnlTZWxlY3RvciBvbiB0aGUgZWxlbWVudCdzIHNoYWRvdyByb290LlxuICpcbiAqIEJ5IGFubm90YXRpbmcgdGhlIHByb3BlcnR5IHdpdGggdGhlIGNvcnJlY3QgdHlwZSwgZWxlbWVudHMgY2FuIGhhdmVcbiAqIHR5cGUtY2hlY2tlZCBhY2Nlc3MgdG8gaW50ZXJuYWwgZWxlbWVudHMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGludm9rZWQgdG8gcmV0dXJuIGEgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgY29uc3QgcXVlcnkgPSBfcXVlcnkoXG4gICAgKHRhcmdldDogTm9kZVNlbGVjdG9yLCBzZWxlY3Rvcjogc3RyaW5nKSA9PiB0YXJnZXQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikpO1xuXG4vKipcbiAqIEEgVHlwZVNjcmlwdCBwcm9wZXJ0eSBkZWNvcmF0b3IgZmFjdG9yeSB0aGF0IGNvbnZlcnRzIGEgY2xhc3MgcHJvcGVydHkgaW50b1xuICogYSBnZXR0ZXIgdGhhdCBleGVjdXRlcyBhIHF1ZXJ5U2VsZWN0b3JBbGwgb24gdGhlIGVsZW1lbnQncyBzaGFkb3cgcm9vdC5cbiAqXG4gKiBCeSBhbm5vdGF0aW5nIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBjb3JyZWN0IHR5cGUsIGVsZW1lbnRzIGNhbiBoYXZlXG4gKiB0eXBlLWNoZWNrZWQgYWNjZXNzIHRvIGludGVybmFsIGVsZW1lbnRzLiBUaGUgdHlwZSBzaG91bGQgYmUgTm9kZUxpc3RcbiAqIHdpdGggdGhlIGNvcnJlY3QgdHlwZSBhcmd1bWVudC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgaW52b2tlZCB0byByZXR1cm4gYSBkZWNvcmF0b3IuXG4gKi9cbmV4cG9ydCBjb25zdCBxdWVyeUFsbCA9IF9xdWVyeShcbiAgICAodGFyZ2V0OiBOb2RlU2VsZWN0b3IsIHNlbGVjdG9yOiBzdHJpbmcpID0+XG4gICAgICAgIHRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBzZWxlY3RvciwgYW5kIHJlcGxhY2VzIGFcbiAqIHByb3BlcnR5IHdpdGggYSBnZXR0ZXIgdGhhbiBleGVjdXRlcyB0aGUgc2VsZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gcXVlcnlGblxuICpcbiAqIEBwYXJhbSBxdWVyeUZuIEEgZnVuY3Rpb24gdGhhdCBleGVjdXRlcyBhIHF1ZXJ5IHdpdGggYSBzZWxlY3RvclxuICovXG5mdW5jdGlvbiBfcXVlcnkoXG4gICAgcXVlcnlGbjogKHRhcmdldDogTm9kZVNlbGVjdG9yLCBzZWxlY3Rvcjogc3RyaW5nKSA9PlxuICAgICAgICBFbGVtZW50IHwgTm9kZUxpc3QgfCBudWxsKSB7XG4gIHJldHVybiAoc2VsZWN0b3I6IHN0cmluZykgPT4gKHByb3RvOiBFbGVtZW50UHJvdG90eXBlLCBwcm9wTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCBwcm9wTmFtZSwge1xuICAgICAgZ2V0KHRoaXM6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBxdWVyeUZuKHRoaXMuc2hhZG93Um9vdCEsIHNlbGVjdG9yKTtcbiAgICAgIH0sXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICB9O1xufSIsIi8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG5pbXBvcnQgeyBBYnN0cmFjdFVJRWxlbWVudCwgVUlQcm9wZXJ0aWVzIH0gZnJvbSAnLi9hYnN0cmFjdC11aSc7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSAnQHBvbHltZXIvbGl0LWVsZW1lbnQnO1xuaW1wb3J0IHsgYm9keUZvbnRGYW1pbHksIG91dGxpbmVCb3JkZXJDb2xvciB9IGZyb20gXCIuL3N0eWxlc1wiO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICcuL2RlY29yYXRvcnMnO1xuaW1wb3J0IGF1dG9iaW5kIGZyb20gJ2F1dG9iaW5kLWRlY29yYXRvcic7XG5cblxudHlwZSBxdWVyeVBhdHRlcm4gPSAodjpzdHJpbmcpPT4gc3RyaW5nO1xuXG5jb25zdCBxdWVyaWVzOiAgcXVlcnlQYXR0ZXJuW10gPSBbXG4gICAgKHYpPT4gdixcbiAgICAodik9PiBgYWNjLSR7dn1gLFxuICAgICh2KT0+IGBbbmFtZT1cIiR7dn1cIiBpXWAsXG4gICAgKHYpPT4gYFtsYWJlbD1cIiR7dn1cIiBpXWAsXG4gICAgKHYpPT4gYFt2YWx1ZT1cIiR7dn1cIiBpXWAsXG4gICAgKHYpPT4gYC4ke3Z9YCxcbiAgICAodik9PiBgIyR7dn1gXG5dO1xuXG5cbmNvbnN0IGV4dHJhY3RWYWx1ZSA9IChlbDphbnkpOmFueSA9PiB7XG4gICAgaWYoZWwudmFsdWUpIHtcbiAgICAgICAgaWYodHlwZW9mIGVsLnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYoZWwudmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYoZWwudmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZihpc0Zpbml0ZShwYXJzZUludChlbC52YWx1ZSwgMTApKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludChlbC52YWx1ZSwgMTApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbC52YWx1ZTtcbiAgICB9XG4gICAgaWYoZWwuc2VsZWN0ZWQpIHtcbiAgICAgICAgaWYoZWwuc2VsZWN0ZWQudmFsdWUpe1xuICAgICAgICAgICAgcmV0dXJuIGVsLnNlbGVjdGVkLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbC5zZWxlY3RlZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogQSBgPGFjYy1ncm91cD5gIGVsZW1lbnQuIE1ha2UgYSBncm91cCAodHlwaWNhbGx5IHdpdGhpbiBzaWRlLXBhbmVsKSBvZiByZWxhdGVkXG4gKiBjb250cm9scy4gUHJvdmlkZXMgcHJvcGVyIGhlYWRpbmdzIGFuZCBhcmlhLWxhYmVscyBhbmQgY29uc2lzdGVudCBmb2N1c2luZy5cbiAqXG4gKiBAZXhhbXBsZSBgYGBodG1sXG4gKlxuICogPGFjYy1ncm91cCBsYWJlbD1cIk15IEdyb3VwXCIgc2hvcnRjdXQ9XCJTaGlmdCBHXCI+PC9hY2MtZ3JvdXA+XG4gKiA8YWNjLWdyb3VwIGxhYmVsPVwiTXkgR3JvdXBcIiBkaXNhYmxlZD48L2FjYy1ncm91cD5cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgR3JvdXBFbGVtZW50IGV4dGVuZHMgQWJzdHJhY3RVSUVsZW1lbnQge1xuXG4gICAgLyoqXG4gICAgICogaGlkZSB0aGUgbGFiZWwgb2YgdGhlIGdyb3VwLCBvbmx5IHByb3ZpZGUgZm9yIGFyaWFcbiAgICAgKi9cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pXG4gICAgcHVibGljIGhpZGVMYWJlbDogYm9vbGVhbiA9IGZhbHNlO1xuXG5cbiAgICBAYXV0b2JpbmRcbiAgICBfaGFuZGxlU2hvcnRjdXQoKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgc3VwZXIuX2hhbmRsZVNob3J0Y3V0KCk7XG4gICAgfVxuXG4gICAgZm9jdXMoKSB7XG4gICAgICAgIHN1cGVyLmZvY3VzKCk7XG4gICAgICAgIGlmKHRoaXMuZGlzYWJsZWQpe1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGgyID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2gyJyk7XG4gICAgICAgIGlmKGgyKSB7XG4gICAgICAgICAgICBoMi5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0VmFsdWUobmFtZTpzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLnF1ZXJ5KG5hbWUpO1xuICAgICAgICBpZighZWwpe1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4dHJhY3RWYWx1ZShlbCk7XG4gICAgfVxuXG4gICAgcXVlcnkobmFtZTpzdHJpbmcsIGV2ZW50VHlwZT86IHN0cmluZywgZXZlbnRIYW5kbGVyPzogRXZlbnRIYW5kbGVyTm9uTnVsbCk6SFRNTEVsZW1lbnR8bnVsbCB7XG4gICAgICAgIGNvbnN0IF9xdWVyeSA9ICgpID0+IHtcbiAgICAgICAgICAgIGxldCBpOm51bWJlciA9IDA7XG4gICAgICAgICAgICB3aGlsZShpIDwgcXVlcmllcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMucXVlcnlTZWxlY3RvcihxdWVyaWVzW2ldKG5hbWUpKTtcbiAgICAgICAgICAgICAgICBpZihlbCAhPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmluZCA9IChiYXNlRWxlbWVudDogRWxlbWVudCwgcXVlcnk6IHN0cmluZyk6IEVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFzQW55ID0gKGJhc2VFbGVtZW50IGFzIGFueSk7XG4gICAgICAgICAgICAgICAgaWYoYXNBbnkudmFsdWUgJiYgYXNBbnkudmFsdWUudG9Mb3dlckNhc2UgJiYgYXNBbnkudmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gcXVlcnkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmKGFzQW55LmxhYmVsICYmIGFzQW55LmxhYmVsLnRvTG93ZXJDYXNlICYmIGFzQW55LmxhYmVsLnRvTG93ZXJDYXNlKCkgPT09IHF1ZXJ5LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VFbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGZvcihsZXQgY2hpbGQgb2YgYmFzZUVsZW1lbnQuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmaW5kKGNoaWxkLCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgICAgIGlmKGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmluZCh0aGlzLCBuYW1lKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBlbGVtZW50ID0gX3F1ZXJ5KCk7XG5cbiAgICAgICAgaWYoZWxlbWVudCAmJiB0eXBlb2YgZXZlbnRUeXBlID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgZXZlbnRIYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBldmVudEhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIF9yZW5kZXIoe2xhYmVsLCBkaXNhYmxlZH06IFVJUHJvcGVydGllcyl7XG5cbiAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgIDxzdHlsZT5cblxuICAgICAgICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgKiB7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMC41O1xuICAgICAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLmNvbnRhaW5lciB7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogMzBweCAyNHB4O1xuICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke291dGxpbmVCb3JkZXJDb2xvcn07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC50aXRsZSB7XG4gICAgICAgICAgICAgICAgZm9udC1mYW1pbHk6ICR7Ym9keUZvbnRGYW1pbHl9O1xuICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMThweDtcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICAgICAgICAgICAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICAgICAgbWFyZ2luOiAwIDAgMjBweCAwO1xuICAgICAgICAgICAgfVxuICAgICAgICA8L3N0eWxlPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCIgYXJpYS1sYWJlbD1cIiR7bGFiZWx9IEdyb3VwXCIgdGFiSW5kZXg9XCIke2Rpc2FibGVkID8gLTEgOiAwfVwiPlxuICAgICAgICAgICAgJHsoIXRoaXMuaGlkZUxhYmVsICYmIHRoaXMubGFiZWwgJiYgdGhpcy5sYWJlbCAhPSAnJylcbiAgICAgICAgICAgICAgICA/IGh0bWxgPGgyIHRhYmluZGV4PVwiLTFcIiBjbGFzcz1cInRpdGxlXCI+JHtsYWJlbH08L2gyPmAgOiAnJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHNsb3QgdGFiSW5kZXg9XCIke2Rpc2FibGVkID8gLTEgOiAwfVwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIGA7XG4gICAgfVxufVxuXG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnYWNjLWdyb3VwJywgR3JvdXBFbGVtZW50KTsiLCIvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuaW1wb3J0IHsgZmlsbENvbG9yIH0gZnJvbSAnLi9zdHlsZXMnO1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ0Bwb2x5bWVyL2xpdC1lbGVtZW50JztcblxuXG5jb25zdCBpY29uczphbnkgPSB7XG4gICAgLy8gSGFtYnVyZ2VyXG4gICAgbWVudTogYFxuICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiIGZpbGw9XCJub25lXCIvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0zIDE4aDE4di0ySDN2MnptMC01aDE4di0ySDN2MnptMC03djJoMThWNkgzelwiLz5cbiAgICAgICAgPC9zdmc+YCxcblxuICAgIC8vIFggaWNvblxuICAgIGNsb3NlOiBgXG4gICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyelwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICAgIDwvc3ZnPmAsXG5cbiAgICAvLyBEb3dud2FyZCBhcnJvdywgbGlrZSBmb3Igc2VsZWN0XG4gICAgZG93biA6IGBcbiAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0xNi41OSA4LjU5TDEyIDEzLjE3IDcuNDEgOC41OSA2IDEwbDYgNiA2LTZ6XCIvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiLz5cbiAgICAgICAgPC9zdmc+YCxcblxuICAgIC8vIEV4dGVybmFsIExpbmsgSWNvbiAtIHNxdWFyZSB3aXRoIGFuIGFycm93XG4gICAgbGluayA6IGBcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE0cHhcIiBoZWlnaHQ9XCIxNHB4XCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI+XG4gICAgICAgICAgICA8cG9seWdvbiBwb2ludHM9XCIwIDAgMCAyMCAyMCAyMCAyMCAxMiAxOCAxMiAxOCAxOCAyIDE4IDIgMiA4IDIgOCAwXCI+PC9wb2x5Z29uPlxuICAgICAgICAgICAgPHBvbHlnb24gcG9pbnRzPVwiMTEuNzA3IDAgMTEuNzA3IDIgMTcuMjkzIDIgOCAxMS4yOTMgOS40MTQgMTIuNzA3IDE4LjcwNyAzLjQxNCAxOC43MDcgOSAyMC43MDcgOSAyMC43MDcgMFwiPjwvcG9seWdvbj5cbiAgICAgICAgPC9zdmc+YCxcblxuICAgIC8vIE5leHQgQXJyb3csIGxpa2UgZm9yIGEgdHV0b3JpYWxcbiAgICBuZXh0IDogYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwiTTUuODggNC4xMkwxMy43NiAxMmwtNy44OCA3Ljg4TDggMjJsMTAtMTBMOCAyelwiLz48cGF0aCBmaWxsPVwibm9uZVwiIGQ9XCJNMCAwaDI0djI0SDB6XCIvPjwvc3ZnPmAsXG5cbiAgICAvLyBQcmV2aW91cyBBcnJvdywgbGlrZSBmb3IgYSB0dXRvcmlhbFxuICAgIHByZXZpb3VzIDogYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwiTTExLjY3IDMuODdMOS45IDIuMSAwIDEybDkuOSA5LjkgMS43Ny0xLjc3TDMuNTQgMTJ6XCIvPjxwYXRoIGZpbGw9XCJub25lXCIgZD1cIk0wIDBoMjR2MjRIMHpcIi8+PC9zdmc+YFxufTtcblxuY2xhc3MgSWNvbkVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcblxuICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpe1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWNvbjpTdHJpbmdcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaWNvbjpzdHJpbmcgPSAnJztcbiAgICBwcml2YXRlIF9pY29uRWxlbWVudDpIVE1MRWxlbWVudDtcblxuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgdGhpcy5faWNvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJylcbiAgICB9XG5cbiAgICAvLyBfcHJvcGVydGllc0NoYW5nZWQocHJvcHM6YW55KXtcblxuICAgICAgICAvKmNvbnNvbGUubG9nKHByb3BzLmljb24pXG4gICAgICAgIGlmIChpY29uc1twcm9wcy5pY29uXSl7XG4gICAgICAgICAgICB0aGlzLl9pY29uRWxlbWVudC5pbm5lckhUTUwgPSBpY29uc1twcm9wcy5pY29uXVxuICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBwcm9wcy5pY29uKVxuICAgICAgICAgICAgLy8gdGhpcy5yZXF1ZXN0UmVuZGVyKClcbiAgICAgICAgfSovXG4gICAgLy8gfVxuXG4gICAgX3JlbmRlcigpe1xuICAgICAgICBpZiAoaWNvbnNbdGhpcy5pY29uXSl7XG4gICAgICAgICAgICB0aGlzLl9pY29uRWxlbWVudC5pbm5lckhUTUwgPSBpY29uc1t0aGlzLmljb25dXG4gICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHRoaXMuaWNvbilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgICAgIDxzdHlsZT5cbiAgICAgICAgICAgICAgICBzdmcge1xuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IGF1dG87XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHN2ZyB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGw6ICR7ZmlsbENvbG9yfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3N0eWxlPlxuICAgICAgICAgICAgJHt0aGlzLl9pY29uRWxlbWVudH1cbiAgICAgICAgYFxuICAgIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdhY2MtaWNvbicsIEljb25FbGVtZW50KTsiLCIvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuaW1wb3J0IHsgYmFja2dyb3VuZENvbG9yLCBib2R5Rm9udEZhbWlseSwgbGFiZWxDb2xvciwgbGFiZWxTdHlsZUNodW5rIH0gZnJvbSAnLi9zdHlsZXMnO1xuaW1wb3J0IHsgaHRtbCB9IGZyb20gJ0Bwb2x5bWVyL2xpdC1lbGVtZW50JztcbmltcG9ydCB7IFNlbGVjdGFibGVFbGVtZW50LCBBYnN0cmFjdFNlbGVjdEVsZW1lbnQsIFNlbGVjdFByb3BlcnRpZXMgfSBmcm9tICcuL2Fic3RyYWN0LXNlbGVjdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJy4vZGVjb3JhdG9ycyc7XG5cblxuaW50ZXJmYWNlIElucHV0TW9kZUVsZW1lbnQgZXh0ZW5kcyBTZWxlY3RhYmxlRWxlbWVudCB7XG4gICAgY29udGVudFNlbGVjdG9yOiBzdHJpbmc7XG4gICAgY29udGVudEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBoYXNDb250cm9sczogYm9vbGVhbjtcbiAgICBpbnB1dFR5cGU6IHN0cmluZztcbiAgICBpbml0aWFsaXplOiBGdW5jdGlvbjtcbiAgICBjb250cm9sczogYm9vbGVhbjtcbiAgICBsYWJlbDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVUlFbGVtZW50cyB7XG4gICAgbGFiZWw6c3RyaW5nO1xufVxuXG4vKipcbiAqIEFuIGA8YWNjLWlucHV0LW1vZGUtc2VsZWN0PmAgZWxlbWVudCBjcmVhdGVzIGEgVUkgZWxlbWVudCBmb3Igc2VsZWN0aW5nIGFuIGlucHV0XG4gKiBtZXRob2QuIEl0IGJ1bmRsZXMgcHJvcGVyIGluaXRpYWxpemF0aW9uLCBldmVudCBidWJibGluZywgYWNjZXNzIHRvIGNhbGlicmF0aW9uXG4gKiBhbmQgbWVzc2FnaW5nLlxuICpcbiAqIEBleGFtcGxlIGBgYGh0bWxcbiAqXG4gKiA8YWNjLWlucHV0LW1vZGUtc2VsZWN0PlxuICogIDxhY2MtbW91c2UtaW5wdXQgYW1wbGlmaWNhdGlvbj1cIjVcIj48L2FjYy1tb3VzZS1pbnB1dD5cbiAqICA8YWNjLXBvc2UtaW5wdXQgYW1wbGlmaWNhdGlvbj1cIjJcIiBwYXJ0PVwibm9zZVwiIHNtb290aGluZz1cIjAuNVwiPjwvYWNjLXBvc2UtaW5wdXQ+XG4gKiA8L2FjYy1pbnB1dC1tb2RlLXNlbGVjdD5cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgSW5wdXRNb2RlU2VsZWN0RWxlbWVudCBleHRlbmRzIEFic3RyYWN0U2VsZWN0RWxlbWVudCB7XG5cbiAgICAvKipcbiAgICAgKiBwcm92aWRlIGEgc2VsZWN0b3IgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdGhlIGlucHV0IGlzIGFwcGxpZWQgdG9cbiAgICAgKi9cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgICBwdWJsaWMgY29udGVudFNlbGVjdG9yOnN0cmluZyA9ICdib2R5JzsgLy8nYWNjLWNvbnRlbnQnO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX25vZGVDaGlsZFNlbGVjdG9yID0gJyonO1xuICAgICAgICB0aGlzLmxhYmVsID0gdGhpcy5sYWJlbCB8fCAnVHJhY2tpbmcnO1xuICAgIH1cblxuXG4gICAgc2V0IGNvbnRlbnRFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCkge1xuICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNvbnRlbnRFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0IGNvbnRlbnRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkICYmIHRoaXMuc2VsZWN0ZWQuY29udGVudEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgZ2V0IGl0ZW1zKCk6IElucHV0TW9kZUVsZW1lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ub2RlcyBhcyBJbnB1dE1vZGVFbGVtZW50W107XG4gICAgfVxuXG4gICAgZ2V0IHNlbGVjdGVkKCk6IElucHV0TW9kZUVsZW1lbnQge1xuICAgICAgICByZXR1cm4gc3VwZXIuc2VsZWN0ZWQgYXMgSW5wdXRNb2RlRWxlbWVudDtcbiAgICB9XG5cbiAgICBnZXQgdmFsdWUoKTpzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZCA/ICg8YW55PnRoaXMuc2VsZWN0ZWQpLmlucHV0VHlwZSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBzZWxlY3Qobm9kZTpJbnB1dE1vZGVFbGVtZW50KXtcbiAgICAgICAgc3VwZXIuc2VsZWN0KG5vZGUpO1xuICAgIH1cblxuICAgIHNob3dDYW1lcmFTZXR0aW5ncygpIHtcbiAgICAgICAgdGhpcy5faGFuZGxlT3B0aW9uc0NsaWNrZWQodHJ1ZSk7XG4gICAgfVxuXG4gICAgX3Byb3BlcnRpZXNDaGFuZ2VkKHByb3BzOmFueSwgY2hhbmdlZFByb3BzOmFueSwgcHJldlByb3BzOmFueSkge1xuICAgICAgICBzdXBlci5fcHJvcGVydGllc0NoYW5nZWQocHJvcHMsIGNoYW5nZWRQcm9wcywgcHJldlByb3BzKTtcbiAgICAgICAgaWYoY2hhbmdlZFByb3BzICYmIGNoYW5nZWRQcm9wcy5jb250ZW50U2VsZWN0b3Ipe1xuICAgICAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtID0+e1xuICAgICAgICAgICAgICAgIGl0ZW0uY29udGVudFNlbGVjdG9yID0gcHJvcHMudGFyZ2V0O1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9oYW5kbGVPcHRpb25zQ2xpY2tlZChzaG93RXh0ZXJuYWxseTpib29sZWFuID0gZmFsc2Upe1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmNvbnRyb2xzID0gIXRoaXMuc2VsZWN0ZWQuY29udHJvbHM7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQuY29udHJvbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG9uQ29udHJvbHNDbG9zZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRyb2xzY2xvc2UnLCBvbkNvbnRyb2xzQ2xvc2UpO1xuICAgICAgICAgICAgICAgIC8vc2V0IGZvY3VzIGJhY2sgdG8gc2V0dGluZ3MgYnV0dG9uXG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3NCdXR0b24gPSB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoJy5zZXR0aW5ncycpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nc0J1dHRvbiAmJiAhc2hvd0V4dGVybmFsbHkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3NCdXR0b24uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuYWRkRXZlbnRMaXN0ZW5lcignY29udHJvbHNjbG9zZScsIG9uQ29udHJvbHNDbG9zZSk7XG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9hZGROb2RlKG5vZGU6SW5wdXRNb2RlRWxlbWVudCl7XG4gICAgICAgIGlmKHRoaXMuY29udGVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIG5vZGUuY29udGVudEVsZW1lbnQgPSB0aGlzLmNvbnRlbnRFbGVtZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbm9kZS5jb250ZW50U2VsZWN0b3IgPSB0aGlzLmNvbnRlbnRTZWxlY3RvcjtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5fYWRkTm9kZShub2RlKTtcbiAgICB9XG5cbiAgICBfcmVuZGVyKHtsYWJlbCwgaGlkZUxhYmVsfTogU2VsZWN0UHJvcGVydGllcyl7XG4gICAgICAgIGNvbnN0IHNJID0gdGhpcy5zZWxlY3RlZEluZGV4O1xuICAgICAgICBjb25zdCBoYXNDb250cm9scyA9IHRoaXMuc2VsZWN0ZWQgJiYgdGhpcy5zZWxlY3RlZC5oYXNDb250cm9scztcblxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgZnVuY3Rpb24gb25TZWxlY3RJbnB1dChlOkV2ZW50KXtcbiAgICAgICAgICAgIC8vJ3RoaXMnIHNjb3BlIGlzIHRoZSBzZWxlY3QgYm94XG4gICAgICAgICAgICBzZWxmLnNlbGVjdChzZWxmLml0ZW1zW3RoaXMuc2VsZWN0ZWRJbmRleF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgIDxzdHlsZT5cbiAgICAgICAgICAgICR7bGFiZWxTdHlsZUNodW5rKCl9XG5cbiAgICAgICAgICAgIDpob3N0IHNlbGVjdCwgYnV0dG9uIHtcbiAgICAgICAgICAgICAgICBmb250LXNpemU6IDE4cHg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlbGVjdCB7XG4gICAgICAgICAgICAgICAgd2lkdGg6MTAwJTtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDMwcHg7XG4gICAgICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAke2JvZHlGb250RmFtaWx5fTtcbiAgICAgICAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke2JhY2tncm91bmRDb2xvcn07XG4gICAgICAgICAgICAgICAgY29sb3I6ICR7bGFiZWxDb2xvcn07XG4gICAgICAgICAgICAgICAgLW1vei1hcHBlYXJhbmNlOm5vbmU7IC8qIEZpcmVmb3ggKi9cbiAgICAgICAgICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6bm9uZTsgLyogU2FmYXJpIGFuZCBDaHJvbWUgKi9cbiAgICAgICAgICAgICAgICBhcHBlYXJhbmNlOm5vbmU7XG4gICAgICAgICAgICAgICAgYm9yZGVyOiAwO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC5zZWxlY3Qtc3R5bGUge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwIDBweCAyMHB4IDBweDtcbiAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHtiYWNrZ3JvdW5kQ29sb3J9O1xuICAgICAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDQwcHg7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAuc2VsZWN0LXN0eWxlOmhvdmVyLFxuICAgICAgICAgICAgLnNlbGVjdC1zdHlsZTpmb2N1cyxcbiAgICAgICAgICAgIC5zZWxlY3Qtc3R5bGU6YWN0aXZlIHtcbiAgICAgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDo6c2xvdHRlZCguaWNvbi1mYWNlKSB7XG4gICAgICAgICAgICAgICAgcGFkZGluZy1yaWdodDogMTdweDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLnNlbGVjdDpmb2N1cyB7XG4gICAgICAgICAgICAgICAgb3V0bGluZS13aWR0aDogMXB4O1xuICAgICAgICAgICAgICAgIG91dGxpbmUtc3R5bGU6IGRhc2hlZDtcbiAgICAgICAgICAgICAgICBvdXRsaW5lLWNvbG9yOiByZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAuaWNvbi1hcnJvdyB7XG4gICAgICAgICAgICAgICAgei1pbmRleDogMTtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgcmlnaHQ6IDRweDtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAzcHg7XG4gICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC5pY29uIHtcbiAgICAgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDdweDtcbiAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICAgICAgICAgIHdpZHRoOiAyOHB4O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8L3N0eWxlPlxuICAgICAgICAgICAgJHtoaWRlTGFiZWwgPyAnJyA6IGh0bWxgPGxhYmVsIGZvcj1cInNlbGVjdFwiPiR7bGFiZWx9PC9sYWJlbD5gfVxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC1zdHlsZVwiPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJhY2Nlc3NpYmlsaXR5LXNlbGVjdG9yXCIgb24taW5wdXQ9XCIke29uU2VsZWN0SW5wdXR9XCIgaWQ9XCJzZWxlY3RcIiBhcmlhLWxhYmVsJD1cIiR7bGFiZWx9XCI+XG4gICAgICAgICAgICAgICAgICAgICR7dGhpcy5pdGVtcy5tYXAoKG5vZGUsaSk9PntcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBpID09PSBzSTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBodG1sYDxvcHRpb24gdmFsdWU9XCIke25vZGUuaW5wdXRUeXBlfVwiIHNlbGVjdGVkPVwiJHtpc1NlbGVjdGVkfVwiPiR7bm9kZS5sYWJlbH08L29wdGlvbj5gO1xuICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cblxuICAgICAgICAgICAgICAgIDxhY2MtaWNvbiBpY29uPVwiZG93blwiIGNsYXNzPVwiaWNvbi1hcnJvd1wiPjwvYWNjLWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgICAgICAgPGFjYy1idXR0b25cbiAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbiQ9XCIkeyFoYXNDb250cm9sc31cIlxuICAgICAgICAgICAgICAgIGRpc2FibGVkPz1cIiR7IWhhc0NvbnRyb2xzfVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzZXR0aW5nc1wiXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJCb2R5IFRyYWNraW5nIFNldHRpbmdzXCJcbiAgICAgICAgICAgICAgICBvbi1jbGljaz1cIiR7KCk9PnRoaXMuX2hhbmRsZU9wdGlvbnNDbGlja2VkKCl9XCI+PC9hY2MtYnV0dG9uPlxuICAgICAgICBgO1xuICAgIH1cbn1cblxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2FjYy1pbnB1dC1tb2RlLXNlbGVjdCcsIElucHV0TW9kZVNlbGVjdEVsZW1lbnQpOyIsIi8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG5pbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnQHBvbHltZXIvbGl0LWVsZW1lbnQnO1xuaW1wb3J0IHsgcHJvcGVydHksIGN1c3RvbUVsZW1lbnQgfSBmcm9tICcuL2RlY29yYXRvcnMnO1xuXG5cbi8qKlxuICogPGFjYy1pdGVtIGxhYmVsPVwiTGFiZWxcIiBbIGljb249XCJcIiBzZWxlY3RlZCBuYW1lPVwiXCJdPlxuICogQW4gSFRNTCB0YWcgdG8gcmVwcnNlbnQgYSBzZWxlY3RhYmxlIGl0ZW0sXG4gKiBUaGUgcGFyZW50IGVsZW1lbnQgcmVuZGVycyB0aGlzIGl0ZW0gaW50byBpdHMgc2hhZG93LWRvbVxuICovXG5leHBvcnQgY2xhc3MgSXRlbUVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICAgIHB1YmxpYyBpY29uOnN0cmluZyA9ICcnO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gICAgcHVibGljIG5hbWU6c3RyaW5nID0gJyc7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgICBwdWJsaWMgbGFiZWw6c3RyaW5nID0gJyc7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgICBwdWJsaWMgdmFsdWU6c3RyaW5nID0gJyc7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pXG4gICAgcHVibGljIHNlbGVjdGVkOmJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSlcbiAgICBwdWJsaWMgZGlzYWJsZWQ6Ym9vbGVhbiA9IGZhbHNlO1xuXG4gICAgX3Byb3BlcnRpZXNDaGFuZ2VkKHByb3BzOiBhbnksIGNoYW5nZWQ6IGFueSwgcHJldmlvdXM6IGFueSkge1xuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhbmdlJywge1xuICAgICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkLFxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIuX3Byb3BlcnRpZXNDaGFuZ2VkKHByb3BzLCBjaGFuZ2VkLCBwcmV2aW91cyk7XG4gICAgfVxuXG4gICAgX3JlbmRlcihfcHJvcHM6b2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBodG1sYGA7XG4gICAgfVxuXG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnYWNjLWl0ZW0nLCBJdGVtRWxlbWVudCk7IiwiLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbmltcG9ydCB7IGh0bWwgfSBmcm9tICdAcG9seW1lci9saXQtZWxlbWVudCc7XG5pbXBvcnQgeyBBYnN0cmFjdE1vZGFsRWxlbWVudCB9IGZyb20gJy4vYWJzdHJhY3QtbW9kYWwnO1xuXG5cbmNsYXNzIE1vdXNlSW5wdXRDYWxpYnJhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBYnN0cmFjdE1vZGFsRWxlbWVudCB7XG5cbiAgICBfcmVuZGVyTW9kYWxCb2R5KHByb3BzOmFueSl7XG4gICAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgICAgICAgPGgzPk1vdXNlIElucHV0PC9oMz5cbiAgICAgICAgICAgICAgICA8cD5wbGFjZWhvbGRlcjwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgO1xuICAgIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdhY2MtbW91c2UtaW5wdXQtY2FsaWJyYXRpb24nLCBNb3VzZUlucHV0Q2FsaWJyYXRpb25FbGVtZW50KTsiLCIvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuaW1wb3J0IGF1dG9iaW5kIGZyb20gJ2F1dG9iaW5kLWRlY29yYXRvcic7XG5pbXBvcnQgeyBjbGFtcCB9IGZyb20gJy4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgQW5pbWl0dGVyLCBJbnB1dFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGh0bWwgfSBmcm9tICdAcG9seW1lci9saXQtZWxlbWVudCc7XG5pbXBvcnQgeyBzY2FsZW1hcCB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnLi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IEFic3RyYWN0SW5wdXRFbGVtZW50IH0gZnJvbSAnLi9hYnN0cmFjdC1pbnB1dCc7XG5pbXBvcnQgeyBtb3VzZVBvc2l0aW9uRnJvbUV2ZW50IH0gZnJvbSAnLi4vbW91c2UtcG9zaXRpb24nO1xuXG5cbmNvbnN0IGFuaW1pdHRlciA9IHJlcXVpcmUoJ2FuaW1pdHRlcicpO1xuXG5cbmVudW0gTW91c2VLZXlib2FyZElucHV0TW9kZSB7XG4gICAgTU9VU0UsXG4gICAgS0VZQk9BUkQsXG4gICAgVE9VQ0hcbn1cblxuXG4vKipcbiAqIEEgTW91c2UgSW5wdXQgZWxlbWVudCBiaW5kcyBtb3VzZSwga2V5Ym9hcmQgYW5kIHRvdWNoIGFzIGEgc2luZ2xlIG1ldGhvZFxuICogb2YgdHJhbnNsYXRpbmcgYSBjdXJzb3IgcG9zaXRpb24uXG4gKlxuICogQHNlZSBJbnB1dE1vZGVTZWxlY3RFbGVtZW50XG4gKi9cbmNsYXNzIE1vdXNlSW5wdXRFbGVtZW50IGV4dGVuZHMgQWJzdHJhY3RJbnB1dEVsZW1lbnQge1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gICAgcHVibGljIGxhYmVsOnN0cmluZyA9ICdLZXlib2FyZCAvIE1vdXNlJztcblxuICAgIHB1YmxpYyBpbnB1dFR5cGU6SW5wdXRUeXBlID0gJ21vdXNlJztcbiAgICBwcml2YXRlIF9fbW9kZTogTW91c2VLZXlib2FyZElucHV0TW9kZTtcbiAgICBwdWJsaWMgcHJlc3NlZDpib29sZWFuID0gZmFsc2U7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIgfSlcbiAgICBwdWJsaWMgYW1wbGlmaWNhdGlvbjpudW1iZXIgPSAxO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KVxuICAgIHB1YmxpYyBlbmFibGVLZXlib2FyZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbn0pXG4gICAgcHVibGljIGRpc2FibGVUb3VjaFByZXZlbnRzRGVmYXVsdDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIGdldCBtb2RlKCk6IHN0cmluZyB7XG4gICAgICAgIHN3aXRjaCh0aGlzLl9fbW9kZSkge1xuICAgICAgICAgICAgY2FzZSBNb3VzZUtleWJvYXJkSW5wdXRNb2RlLktFWUJPQVJEOlxuICAgICAgICAgICAgICAgIHJldHVybiAna2V5Ym9hcmQnO1xuICAgICAgICAgICAgY2FzZSBNb3VzZUtleWJvYXJkSW5wdXRNb2RlLlRPVUNIOlxuICAgICAgICAgICAgICAgIHJldHVybiAndG91Y2gnO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21vdXNlJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBfbG9vcDpBbmltaXR0ZXIgPSBhbmltaXR0ZXIoKTtcbiAgICAvL3VzZWQgdG8gZGV0ZXJtaW5lIGlmIHByZXNzZWQgaXMgZGlydHkgYW5kIHNob3VsZCBiZSBhbm5vdW5jZWRcbiAgICBwcml2YXRlIF9fbGFzdERpc3BhdGNoZWRQcmVzc2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9sb29wLm9uKCd1cGRhdGUnLCB0aGlzLl9kaXNwYXRjaFRpY2spO1xuICAgICAgICB0aGlzLl9sb29wLm9uKCdzdGFydCcsICgpPT4gY29uc29sZS5sb2coJ2xvb3Agc3RhcnRlZCcpKTtcbiAgICB9XG5cblxuICAgIEBhdXRvYmluZFxuICAgIHByaXZhdGUgX19oYW5kbGVLZXlEb3duKGV2ZW50OktleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYoIXRoaXMuY29udGVudEVsZW1lbnQgfHwgIXRoaXMuZW5hYmxlS2V5Ym9hcmQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IGNvbnRXaWR0aCA9IHRoaXMuY29udGVudEVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgICAgIGxldCBjb250SGVpZ2h0ID0gdGhpcy5jb250ZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG5cbiAgICAgICAgaWYoIWNvbnRXaWR0aCB8fCAhY29udEhlaWdodCkge1xuICAgICAgICAgICAgY29uc3QgYmNyID0gdGhpcy5jb250ZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnRXaWR0aCA9IGJjci53aWR0aDtcbiAgICAgICAgICAgIGNvbnRIZWlnaHQgPSBiY3IuaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWNvbnRXaWR0aCB8fCAhY29udEhlaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy90aW1lcyAyIGJlY2F1c2UgaXRzIGZyb20gLTEgdG8gMVxuICAgICAgICBjb25zdCBtYWcgPSB0aGlzLmFtcGxpZmljYXRpb24gLyBNYXRoLm1pbihjb250V2lkdGgsIGNvbnRIZWlnaHQpICogMjtcbiAgICAgICAgdGhpcy5wcmVzc2VkID0gZmFsc2U7XG5cbiAgICAgICAgaWYoIWlzRmluaXRlKHRoaXMuX2xhc3RGb3VuZFBvc2l0aW9uWzBdICsgdGhpcy5fbGFzdEZvdW5kUG9zaXRpb25bMV0pKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0Rm91bmRQb3NpdGlvblswXSA9IDA7XG4gICAgICAgICAgICB0aGlzLl9sYXN0Rm91bmRQb3NpdGlvblsxXSA9IDA7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAgICAgc3dpdGNoKGV2ZW50LmtleUNvZGUpe1xuXG4gICAgICAgICAgICBjYXNlIDM3OiAvL2xlZnRcbiAgICAgICAgICAgIHRoaXMuX2xhc3RGb3VuZFRhcmdldFBvc2l0aW9uWzBdIC09IHRoaXMuYW1wbGlmaWNhdGlvbjtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RGb3VuZFBvc2l0aW9uWzBdIC09IG1hZztcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDM4OiAvL3VwXG4gICAgICAgICAgICB0aGlzLl9sYXN0Rm91bmRUYXJnZXRQb3NpdGlvblsxXSAtPSB0aGlzLmFtcGxpZmljYXRpb247XG4gICAgICAgICAgICB0aGlzLl9sYXN0Rm91bmRQb3NpdGlvblsxXSAtPSBtYWc7XG4gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOTogLy9yaWdodFxuICAgICAgICAgICAgdGhpcy5fbGFzdEZvdW5kVGFyZ2V0UG9zaXRpb25bMF0gKz0gdGhpcy5hbXBsaWZpY2F0aW9uO1xuICAgICAgICAgICAgdGhpcy5fbGFzdEZvdW5kUG9zaXRpb25bMF0gKz0gbWFnO1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNDA6IC8vZG93blxuICAgICAgICAgICAgdGhpcy5fbGFzdEZvdW5kVGFyZ2V0UG9zaXRpb25bMV0gKz0gdGhpcy5hbXBsaWZpY2F0aW9uO1xuICAgICAgICAgICAgdGhpcy5fbGFzdEZvdW5kUG9zaXRpb25bMV0gKz0gbWFnO1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZihjaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9fbW9kZSA9IE1vdXNlS2V5Ym9hcmRJbnB1dE1vZGUuS0VZQk9BUkQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZighdGhpcy5kaXNhYmxlQ2xhbXApIHtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RGb3VuZFRhcmdldFBvc2l0aW9uWzBdID0gY2xhbXAodGhpcy5fbGFzdEZvdW5kVGFyZ2V0UG9zaXRpb25bMF0sIDAsIGNvbnRXaWR0aCk7XG4gICAgICAgICAgICB0aGlzLl9sYXN0Rm91bmRUYXJnZXRQb3NpdGlvblsxXSA9IGNsYW1wKHRoaXMuX2xhc3RGb3VuZFRhcmdldFBvc2l0aW9uWzFdLCAwLCBjb250SGVpZ2h0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoaXMuX2xhc3RGb3VuZFBvc2l0aW9uWzBdID0gY2xhbXAodGhpcy5fbGFzdEZvdW5kUG9zaXRpb25bMF0sIC0xLCAxKTtcbiAgICAgICAgLy8gdGhpcy5fbGFzdEZvdW5kUG9zaXRpb25bMV0gPSBjbGFtcCh0aGlzLl9sYXN0Rm91bmRQb3NpdGlvblsxXSwgLTEsIDEpO1xuICAgIH1cblxuICAgIEBhdXRvYmluZFxuICAgIHByaXZhdGUgX2hhbmRsZU1vdXNlTW92ZShldmVudDpNb3VzZUV2ZW50KXtcblxuICAgICAgICBjb25zdCBwb2ludCA9IG1vdXNlUG9zaXRpb25Gcm9tRXZlbnQoZXZlbnQsIHRoaXMuY29udGVudEVsZW1lbnQpO1xuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZVRvdWNoUHJldmVudHNEZWZhdWx0ICYmIGV2ZW50LnR5cGUuaW5kZXhPZignbW91c2UnKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvL21vdXNlXG4gICAgICAgIHRoaXMucHJlc3NlZCA9IGV2ZW50LmJ1dHRvbnMgPiAwO1xuICAgICAgICB0aGlzLl9fbW9kZSA9IE1vdXNlS2V5Ym9hcmRJbnB1dE1vZGUuTU9VU0U7XG5cbiAgICAgICAgLy90b3VjaFxuICAgICAgICBpZihldmVudC50eXBlLmluZGV4T2YoJ3RvdWNoJykgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX19tb2RlID0gTW91c2VLZXlib2FyZElucHV0TW9kZS5UT1VDSDtcbiAgICAgICAgICAgIGlmIChldmVudC50eXBlID09PSAndG91Y2hlbmQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucHJlc3NlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNGaW5pdGUocG9pbnQueCkgJiYgaXNGaW5pdGUocG9pbnQueSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGJjciA9IHRoaXMuY29udGVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCB4ID0gc2NhbGVtYXAocG9pbnQueCwgMCwgYmNyLndpZHRoLCAtMSwgMSk7XG4gICAgICAgICAgICBjb25zdCB5ID0gc2NhbGVtYXAocG9pbnQueSwgMCwgYmNyLmhlaWdodCwgLTEsIDEpO1xuXG4gICAgICAgICAgICB0aGlzLl9sYXN0Rm91bmRUYXJnZXRQb3NpdGlvblswXSA9IHBvaW50Lng7XG4gICAgICAgICAgICB0aGlzLl9sYXN0Rm91bmRUYXJnZXRQb3NpdGlvblsxXSA9IHBvaW50Lnk7XG5cbiAgICAgICAgICAgIHRoaXMuX2xhc3RGb3VuZFBvc2l0aW9uWzBdID0geDtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RGb3VuZFBvc2l0aW9uWzFdID0geTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGluaXRpYWxpemUoKXtcbiAgICAgICAgaWYodGhpcy5pc1JlYWR5KXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kaXNwYXRjaEluaXRpYWxpemluZygpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgIC50aGVuKCgpPT57XG4gICAgICAgICAgICAgICAgdGhpcy5fX3N0YXJ0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfcmVuZGVyKHsgY29udHJvbHMgfTphbnkpOiBhbnkge1xuICAgICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgICAgIDxhY2MtbW91c2UtaW5wdXQtY2FsaWJyYXRpb25cbiAgICAgICAgICAgICAgICB0YWJJbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgIG9uLWNsb3NlLWNsaWNrPSR7KCk9PnRoaXMucmVtb3ZlQXR0cmlidXRlKCdjb250cm9scycpfVxuICAgICAgICAgICAgICAgIG9wZW4/PSR7Y29udHJvbHN9PlxuICAgICAgICAgICAgPC9hY2MtbW91c2UtaW5wdXQtY2FsaWJyYXRpb24+XG4gICAgICAgIGA7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9zaG91bGREaXNwYXRjaElucHV0KCkge1xuICAgICAgICBjb25zdCBzaG91bGQgPSB0aGlzLnByZXNzZWQgIT09IHRoaXMuX19sYXN0RGlzcGF0Y2hlZFByZXNzZWQgfHwgc3VwZXIuX3Nob3VsZERpc3BhdGNoSW5wdXQoKTtcbiAgICAgICAgdGhpcy5fX2xhc3REaXNwYXRjaGVkUHJlc3NlZCA9IHRoaXMucHJlc3NlZDtcbiAgICAgICAgcmV0dXJuIHNob3VsZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9fc3RhcnQoKXtcbiAgICAgICAgdGhpcy5fX2FkZEV2ZW50cygpO1xuICAgICAgICB0aGlzLl9kaXNwYXRjaFJlYWR5KCk7XG4gICAgICAgIHRoaXMuX2xvb3Auc3RhcnQoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2hhbmRsZUNvbnRlbnRFbGVtZW50Q2hhbmdlZChjb250ZW50RWxlbWVudDogSFRNTEVsZW1lbnQsIHByZXZpb3VzOiBIVE1MRWxlbWVudCkge1xuICAgICAgICB0aGlzLl9fcmVtb3ZlRXZlbnRzKHByZXZpb3VzKTtcbiAgICAgICAgdGhpcy5fX2FkZEV2ZW50cygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX19hZGRFdmVudHMoKSB7XG4gICAgICAgIGlmKHRoaXMuY29udGVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAnbW91c2Vkb3duJyxcbiAgICAgICAgICAgICAgICAnbW91c2Vtb3ZlJyxcbiAgICAgICAgICAgICAgICAnbW91c2V1cCcsXG4gICAgICAgICAgICAgICAgJ3RvdWNoc3RhcnQnLFxuICAgICAgICAgICAgICAgICd0b3VjaG1vdmUnLFxuICAgICAgICAgICAgICAgICd0b3VjaGVuZCdcbiAgICAgICAgICAgIF0uZm9yRWFjaCgoZXZlbnRUeXBlKSA9PiB0aGlzLmNvbnRlbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCB0aGlzLl9oYW5kbGVNb3VzZU1vdmUpKTtcbiAgICAgICAgICAgIHRoaXMuY29udGVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX19oYW5kbGVLZXlEb3duKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX19yZW1vdmVFdmVudHMoZWxlbWVudDogSFRNTEVsZW1lbnQ9dGhpcy5jb250ZW50RWxlbWVudCkge1xuICAgICAgICBpZihlbGVtZW50KSB7XG5cbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAnbW91c2Vkb3duJyxcbiAgICAgICAgICAgICAgICAnbW91c2Vtb3ZlJyxcbiAgICAgICAgICAgICAgICAnbW91c2V1cCcsXG4gICAgICAgICAgICAgICAgJ3RvdWNoc3RhcnQnLFxuICAgICAgICAgICAgICAgICd0b3VjaG1vdmUnLFxuICAgICAgICAgICAgICAgICd0b3VjaGVuZCdcbiAgICAgICAgICAgIF0uZm9yRWFjaCgoZXZlbnRUeXBlKSA9PiBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCB0aGlzLl9oYW5kbGVNb3VzZU1vdmUpKTtcblxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fX2hhbmRsZUtleURvd24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RvcCgpe1xuICAgICAgICB0aGlzLl9fcmVtb3ZlRXZlbnRzKCk7XG4gICAgICAgIHRoaXMuX2xvb3Auc3RvcCgpO1xuICAgICAgICB0aGlzLl9kaXNwYXRjaFN0b3AoKTtcbiAgICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnYWNjLW1vdXNlLWlucHV0JywgTW91c2VJbnB1dEVsZW1lbnQpO1xuIiwiLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbmltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdAcG9seW1lci9saXQtZWxlbWVudCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJy4vZGVjb3JhdG9ycyc7XG5cblxuLyoqXG4gKiBgPGFjYy1vcHRncm91cD5gIGlzIGFuIGVsZW1lbnQgdG8gZGVzaWduYXRlIGEgZ3JvdXAgd2l0aGluIGFuIDxhY2Mtc2VsZWN0PlxuICogQGV4YW1wbGUgYGBgaHRtbFxuICpcbiAqIDxhY2Mtc2VsZWN0IGxhYmVsPVwiSW5zdHJ1bWVudHNcIj5cbiAqICA8YWNjLW9wdGdyb3VwIGxhYmVsPVwiU3RyaW5nc1wiPlxuICogICAgICA8YWNjLWl0ZW0gbGFiZWw9XCJndWl0YXJcIj48L2FjYy1pdGVtPlxuICogICAgICA8YWNjLWl0ZW0gbGFiZWw9XCJjZWxsb1wiPjwvYWNjLWl0ZW0+XG4gKiAgPC9hY2Mtb3B0Z3JvdXA+XG4gKiAgPGFjYy1vcHRncm91cCBsYWJlbD1cInBlcmN1c3Npb25cIj5cbiAqICAgICAgPGFjYy1pdGVtIGxhYmVsPVwiZHJ1bXNcIj48L2FjYy1pdGVtPlxuICogICAgICA8YWNjLWl0ZW0gbGFiZWw9XCJ0YW1ib3JpbmVcIj48L2FjYy1pdGVtPlxuICogIDwvYWNjLW9wdGdyb3VwPlxuICogPC9hY2Mtc2VsZWN0PlxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBPcHRncm91cEVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICAgIHB1YmxpYyBsYWJlbDogc3RyaW5nID0gJyc7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pXG4gICAgcHVibGljIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBfcmVuZGVyKHsgbGFiZWwgfTogYW55KSB7XG4gICAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAgICAgPHN0eWxlPlxuICAgICAgICAgICAgICAgIDpob3N0IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3N0eWxlPlxuICAgICAgICAgICAgPHNwYW4gYXJpYS1sYWJlbD0ke2xhYmVsfT4ke2xhYmVsfTwvc3Bhbj5cbiAgICAgICAgYDtcbiAgICB9XG5cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdhY2Mtb3B0Z3JvdXAnLCBPcHRncm91cEVsZW1lbnQpOyIsIi8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG5pbXBvcnQgeyBhY2NlbnRDb2xvciwgYm9keUZvbnRGYW1pbHksIGxhYmVsQ29sb3IsIGJhY2tncm91bmRDb2xvciwgYnV0dG9uQmFja2dyb3VuZENvbG9yIH0gZnJvbSAnLi9zdHlsZXMnO1xuaW1wb3J0IHsgQ29udGVudEVsZW1lbnQgfSBmcm9tICcuL2NvbnRlbnQnO1xuaW1wb3J0IHsgQUNDSW5wdXRFdmVudCB9IGZyb20gJy4uL2V2ZW50cy9pbnB1dC1ldmVudCc7XG5pbXBvcnQgeyBBYnN0cmFjdElucHV0RWxlbWVudCB9IGZyb20gJy4vYWJzdHJhY3QtaW5wdXQnO1xuaW1wb3J0IHsgUG9zZUlucHV0RWxlbWVudCB9IGZyb20gJy4vcG9zZS1pbnB1dCc7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSAnQHBvbHltZXIvbGl0LWVsZW1lbnQnO1xuaW1wb3J0IHsgQWJzdHJhY3RNb2RhbEVsZW1lbnQgfSBmcm9tICcuL2Fic3RyYWN0LW1vZGFsJztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnLi9kZWNvcmF0b3JzJztcblxuaW1wb3J0ICcuL3JhbmdlJztcblxuaW50ZXJmYWNlIFN0eWxlTWFwIHtcbiAgICBbaW5kZXg6IHN0cmluZ106IHN0cmluZztcbn1cblxuY29uc3QgY29tcHV0ZVN0eWxlUmVzdWx0cyA9IChwYXJlbnQ6IEVsZW1lbnQgfCBTaGFkb3dSb290LCBtYXA6IFN0eWxlTWFwKTogU3R5bGVNYXAgPT4ge1xuICAgIGNvbnN0IHJlc3VsdDogU3R5bGVNYXAgPSB7fTtcbiAgICAvL2NvbXB1dGUgb3VyIGFjY2VudCBjb2xvciBieSBhcHBseWluZyBpdCB0byBhIHRlbXAgZWxlbWVudFxuICAgIGNvbnN0IF90bXBFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIF90bXBFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIE9iamVjdC5hc3NpZ24oX3RtcEVsLnN0eWxlLCBtYXApO1xuICAgIHBhcmVudC5hcHBlbmRDaGlsZChfdG1wRWwpO1xuICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShfdG1wRWwpO1xuICAgIGZvciAobGV0IGtleSBpbiBtYXApIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSAoY29tcHV0ZWRTdHlsZSBhcyBhbnkpW2tleV07XG4gICAgfVxuICAgIF90bXBFbC5wYXJlbnRFbGVtZW50ICYmIF90bXBFbC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKF90bXBFbCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuXG5jb25zdCBvcHRpb25zID0gKHBhcnRzOnN0cmluZ1tdLCBzZWxlY3RlZFBhcnQ6c3RyaW5nKT0+XG4gICAgcGFydHMubWFwKChwYXJ0LCBpKT0+XG4gICAgICAgIGh0bWxgPGFjYy1pdGVtIHZhbHVlPVwiJHtwYXJ0fVwiIHNlbGVjdGVkPz0ke3BhcnQgPT09IHNlbGVjdGVkUGFydH0gbGFiZWw9JHtwYXJ0fT48L29wdGlvbj5gXG4gICAgKVxuXG5jb25zdCBoYXNIb3N0ID0gKHY6IGFueSk6diBpcyB7IGhvc3Q6IEhUTUxFbGVtZW50IH0gPT5cbiAgICB2ICYmIHR5cGVvZiB2Lmhvc3QgIT09ICd1bmRlZmluZWQnO1xuXG5jbGFzcyBQb3NlSW5wdXRDYWxpYnJhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBYnN0cmFjdE1vZGFsRWxlbWVudCB7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIgfSlcbiAgICBwdWJsaWMgYW1wbGlmaWNhdGlvbjpudW1iZXIgPSAxO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pXG4gICAgcHVibGljIHNtb290aGluZzpudW1iZXIgPSAwO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gICAgcHVibGljIHBhcnQ6c3RyaW5nO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogQXJyYXkgfSlcbiAgICBwdWJsaWMgcGFydHM6c3RyaW5nW10gPSBbXTtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciB9KVxuICAgIHB1YmxpYyBpbWFnZVNjYWxlRmFjdG9yOm51bWJlciA9IDAuNTtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICAgIHB1YmxpYyBpbnB1dFNlbGVjdG9yOiBzdHJpbmcgPSAnYWNjLXBvc2UtaW5wdXQnO1xuXG4gICAgcHJpdmF0ZSBfX2NvbnRlbnQ6IENvbnRlbnRFbGVtZW50O1xuICAgIHByaXZhdGUgX19jdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcbiAgICAvL3dlIHdpbGwgcmV0cmlldmUgdGhpcyB1c2luZyB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVxuICAgIHByaXZhdGUgX19hY2NlbnRDb2xvcjogc3RyaW5nID0gJ3doaXRlJztcbiAgICBwcml2YXRlIF9fY2VudGVyQ29sb3I6IHN0cmluZyA9ICd3aGl0ZSc7XG5cbiAgICBwdWJsaWMgaW5wdXRFbGVtZW50OiBBYnN0cmFjdElucHV0RWxlbWVudDtcblxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29uVGljayA9IHRoaXMuX29uVGljay5iaW5kKHRoaXMpO1xuICAgIH1cblxuXG4gICAgZm9jdXNIZWFkZXIoKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcjaGVhZGVyJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChoZWFkZXIpIHtcbiAgICAgICAgICAgIGhlYWRlci5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uVGljayhldmVudDogQUNDSW5wdXRFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuX19jdHggfHwgIXRoaXMuX19jb250ZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBfX2N0eCB9ID0gdGhpcztcblxuICAgICAgICBjb25zdCBpbnB1dCA9IChldmVudC50YXJnZXQgYXMgUG9zZUlucHV0RWxlbWVudCk7XG4gICAgICAgIF9fY3R4LmNhbnZhcy53aWR0aCA9IHRoaXMuX19jb250ZW50LmNsaWVudFdpZHRoO1xuICAgICAgICBfX2N0eC5jYW52YXMuaGVpZ2h0ID0gdGhpcy5fX2NvbnRlbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgICAvL19fY3R4LmNsZWFyUmVjdCgwLCAwLCBfX2N0eC5jYW52YXMud2lkdGgsIF9fY3R4LmNhbnZhcy5oZWlnaHQpO1xuICAgICAgICBfX2N0eC5saW5lV2lkdGggPSAxO1xuICAgICAgICBpbnB1dC5yZW5kZXJJbnB1dERhdGEoX19jdHgpO1xuICAgICAgICBpbnB1dC5yZW5kZXJDZW50ZXIoX19jdHgsIHRoaXMuX19jZW50ZXJDb2xvcik7XG4gICAgICAgIGlucHV0LnJlbmRlckN1cnNvcihfX2N0eCwgdGhpcy5fX2FjY2VudENvbG9yKTtcbiAgICB9XG5cbiAgICBfcHJvcGVydGllc0NoYW5nZWQocHJvcHM6IGFueSwgY2hhbmdlZDogYW55LCBwcmV2OiBhbnkpIHtcbiAgICAgICAgaWYoY2hhbmdlZCAmJiB0eXBlb2YgY2hhbmdlZC5vcGVuID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIC8vIGxldCBpbnB1dEVsZW1lbnQ6IFBvc2VJbnB1dEVsZW1lbnQ7XG4gICAgICAgICAgICAvLyBpZiAoaGFzSG9zdCh0aGlzLnBhcmVudE5vZGUpKSB7XG4gICAgICAgICAgICAvLyAgICAgaW5wdXRFbGVtZW50ID0gdGhpcy5wYXJlbnROb2RlLmhvc3QgYXMgUG9zZUlucHV0RWxlbWVudDtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChjaGFuZ2VkLm9wZW4gJiYgdGhpcy5pbnB1dEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyB0aGUgcG9zZSBpbnB1dCBlbGVtZW50XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndGljaycsIHRoaXMuX29uVGljayk7XG4gICAgICAgICAgICB9IGVsc2UgaWYodGhpcy5pbnB1dEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0aWNrJywgdGhpcy5fb25UaWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdXBlci5fcHJvcGVydGllc0NoYW5nZWQocHJvcHMsIGNoYW5nZWQsIHByZXYpO1xuICAgIH1cblxuICAgIF9maXJzdFJlbmRlcmVkKCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIC8vY29tcHV0ZSBvdXIgYWNjZW50IGNvbG9yIGJ5IGFwcGx5aW5nIGl0IHRvIGEgdGVtcCBlbGVtZW50XG4gICAgICAgICAgICBjb25zdCB7IGJhY2tncm91bmRDb2xvciwgY29sb3IgfSA9IGNvbXB1dGVTdHlsZVJlc3VsdHModGhpcy5zaGFkb3dSb290LCB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBhY2NlbnRDb2xvcixcbiAgICAgICAgICAgICAgICBjb2xvcjogbGFiZWxDb2xvclxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuX19hY2NlbnRDb2xvciA9IGJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgICAgIHRoaXMuX19jZW50ZXJDb2xvciA9IGNvbG9yO1xuICAgICAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuaW5wdXRTZWxlY3Rvcik7XG4gICAgICAgICAgICBpZih0aGlzLmlucHV0RWxlbWVudCAmJiB0aGlzLm9wZW4pe1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RpY2snLCB0aGlzLl9vblRpY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAxNik7XG4gICAgICAgIHN1cGVyLl9maXJzdFJlbmRlcmVkKCk7XG4gICAgfVxuXG4gICAgX2RpZFJlbmRlcihwcm9wczogYW55LCBjaGFuZ2VkOiBhbnksIHByZXY6IGFueSkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yKCdhY2MtY29udGVudCcpIGFzIENvbnRlbnRFbGVtZW50O1xuICAgICAgICBpZiAoY29udGVudCAmJiBoYXNIb3N0KHRoaXMucGFyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX19jb250ZW50ID0gY29udGVudDtcbiAgICAgICAgICAgIGNvbnRlbnQuaW5wdXRFbGVtZW50ID0gdGhpcy5wYXJlbnROb2RlLmhvc3QgYXMgUG9zZUlucHV0RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYW52YXMgPSB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoJyNpbnB1dC12aXN1YWxpemF0aW9uJykhIGFzIEhUTUxDYW52YXNFbGVtZW50O1xuICAgICAgICBpZihjaGFuZ2VkICYmIGNoYW5nZWQuYW1wbGlmaWNhdGlvbikge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignYWNjLXJhbmdlJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBpZihyYW5nZSkge1xuICAgICAgICAgICAgICAgIHJhbmdlLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYoIWNhbnZhcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX19jdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLl9kaWRSZW5kZXIocHJvcHMsIGNoYW5nZWQsIHByZXYpO1xuICAgIH1cblxuICAgIF9yZW5kZXJNb2RhbEJvZHkocHJvcHM6YW55KXtcblxuICAgICAgICBjb25zdCBzZWxmOlBvc2VJbnB1dENhbGlicmF0aW9uRWxlbWVudCA9IHRoaXM7XG5cbiAgICAgICAgY29uc3QgZGlzcGF0Y2ggPSAoZXZlbnRUeXBlOiBzdHJpbmc9ICdjaGFuZ2UnLCBjb21wb3NlZDogYm9vbGVhbiA9IGZhbHNlKSA9PntcbiAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoZXZlbnRUeXBlLCB7XG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBzZWxmLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFydDogc2VsZi5wYXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgYW1wbGlmaWNhdGlvbjogc2VsZi5hbXBsaWZpY2F0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VTY2FsZUZhY3Rvcjogc2VsZi5pbWFnZVNjYWxlRmFjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgc21vb3RoaW5nOiBzZWxmLnNtb290aGluZ1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjb21wb3NlZCxcbiAgICAgICAgICAgICAgICAgICAgYnViYmxlczogY29tcG9zZWRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG9uU2VsZWN0SW5wdXQoZTpDdXN0b21FdmVudCl7XG4gICAgICAgICAgICAvL2NvbnN0IHNlbGVjdGVkUGFydCA9IHNlbGYucGFydHNbdGhpcy5zZWxlY3RlZEluZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkUGFydCA9IGUuZGV0YWlsLnZhbHVlO1xuICAgICAgICAgICAgLy8ndGhpcycgc2NvcGUgaXMgdGhlIHNlbGVjdCBib3hcbiAgICAgICAgICAgIGlmKHRoaXMuaWQgPT09ICdwYXJ0Jyl7XG4gICAgICAgICAgICAgICAgc2VsZi5wYXJ0ID0gc2VsZWN0ZWRQYXJ0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnc2VsZi5wYXJ0OiAnICsgc2VsZi5wYXJ0KTtcbiAgICAgICAgICAgIGRpc3BhdGNoKCk7XG4gICAgICAgICAgICAvL2Rpc3BhdGNoKCdjZW50ZXInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG9uU2NhbGVJbnB1dChlOkV2ZW50KXtcbiAgICAgICAgICAgIHNlbGYuaW1hZ2VTY2FsZUZhY3RvciA9IE51bWJlcih0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvblNtb290aGluZyhlOkV2ZW50KSB7XG4gICAgICAgICAgICBzZWxmLnNtb290aGluZyA9IE51bWJlcih0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvbkFtcGxpZmljYXRpb24oZTpFdmVudCkge1xuICAgICAgICAgICAgc2VsZi5hbXBsaWZpY2F0aW9uID0gcGFyc2VGbG9hdCh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGFtcEVsID0gc2VsZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJy5hbXAtdmFsdWUnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmKGFtcEVsKSB7XG4gICAgICAgICAgICAgICAgYW1wRWwuaW5uZXJIVE1MID0gYCR7c2VsZi5hbXBsaWZpY2F0aW9uLnRvRml4ZWQoMSl9eGA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgICAgIDxzdHlsZT5cblxuXG4gICAgICAgICAgICAgICAgQG1lZGlhICggbWF4LWhlaWdodDogNjQwcHggKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjYy1jb250ZW50IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAzMjBweDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMjQwcHg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBAbWVkaWEgKCBtaW4taGVpZ2h0OiA2NDFweCApIGFuZCAoIG1heC1oZWlnaHQ6IDc2MHB4ICkge1xuICAgICAgICAgICAgICAgICAgICBhY2MtY29udGVudCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogNDgwcHg7XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDM2MHB4O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgI21vZGFsLWJvZHkge1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgQG1lZGlhKCBtaW4taGVpZ2h0OiA3NjBweCApIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjLWNvbnRlbnQge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDY0MHB4O1xuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiA0ODBweDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAke2JvZHlGb250RmFtaWx5fTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAuY29udGFpbmVyIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHtiYWNrZ3JvdW5kQ29sb3J9O1xuICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICBhY2MtY29udGVudCB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDIwcHggYXV0bztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBoMiB7XG4gICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAke2JvZHlGb250RmFtaWx5fTtcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICR7bGFiZWxDb2xvcn07XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBoNCB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA6aG9zdCgpICoge1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDpob3N0KFtkZWJ1Z10pIC5jb250cm9scy1yb3csXG4gICAgICAgICAgICAgICAgOmhvc3QoW2RlYnVnXSkgLmNvbnRyb2xzLXJvdy1pdGVtLFxuICAgICAgICAgICAgICAgICpbZGVidWddIC5jb250cm9scy1yb3csXG4gICAgICAgICAgICAgICAgKltkZWJ1Z10gLmNvbnRyb2xzLXJvdy1pdGVtIHtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmVkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC5pbm5lci1jb250YWluZXIge1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgICAgICAgICAgIHRvcDogNTAlO1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogYXV0bztcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgLTUwJSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLmNvbnRyb2xzLXJvdyB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICAgICAgICAgICAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAgICAgICAgICAgICAgICAgbWF4LXdpZHRoOiA5NjBweDtcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiAwIGF1dG87XG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDhweDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAuYm94IHtcbiAgICAgICAgICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLmNvbnRyb2xzLXJvdy1pdGVtIHtcbiAgICAgICAgICAgICAgICAgICAgYWxpZ24tc2VsZjogYmFzZWxpbmU7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgICAgICAgICAgICAgICBvcmRlcjogMTtcbiAgICAgICAgICAgICAgICAgICAgZmxleC1iYXNpczogYXV0bztcbiAgICAgICAgICAgICAgICAgICAgZmxleC1ncm93OiAxO1xuICAgICAgICAgICAgICAgICAgICBmbGV4LXNocmluazogMTtcbiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgYS5yZXNldC1jZW50ZXJwb2ludCB7XG4gICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAke2JvZHlGb250RmFtaWx5fTtcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICR7YWNjZW50Q29sb3J9O1xuICAgICAgICAgICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLmFtcC12YWx1ZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiAke2xhYmVsQ29sb3J9O1xuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDhweDtcbiAgICAgICAgICAgICAgICAgICAgbWluLXdpZHRoOiAyNHB4O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC5kb25lIHtcbiAgICAgICAgICAgICAgICAgICAgLS1iYWNrZ3JvdW5kLWNvbG9yOiAke2FjY2VudENvbG9yfTpcbiAgICAgICAgICAgICAgICAgICAgLS1hY2NlbnQtY29sb3I6ICR7YmFja2dyb3VuZENvbG9yfTtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwMHB4O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICpbaW5saW5lXSAuY2VudGVycG9pbnQtYnV0dG9ucyB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICAgICAgICAgICAgICAgIGZsZXgtc2hyaW5rOiAxO1xuICAgICAgICAgICAgICAgICAgICBmbGV4LWJhc2lzOiBhdXRvO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC5jZW50ZXJwb2ludC1idXR0b24ge1xuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwIDhweDtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogYXV0bztcbiAgICAgICAgICAgICAgICAgICAgLS1idXR0b24tbGFiZWwtY29sb3I6ICR7YWNjZW50Q29sb3J9O1xuXG4gICAgICAgICAgICAgICAgICAgIC0tYnV0dG9uLWJvcmRlci13aWR0aDogMDtcbiAgICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGFiZWwge1xuICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAuaGVscC1jb250YWluZXIge1xuICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgICAgICAgICAgdG9wOiAxNnB4O1xuICAgICAgICAgICAgICAgICAgICByaWdodDogMTZweDtcbiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICAgICAgICAgICAgICBjb2xvcjogJHthY2NlbnRDb2xvcn07XG4gICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogODBweDtcbiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLmhlbHAtY29udGFpbmVyIHN2ZyB7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgICAgICAgICAgdG9wOiAwO1xuICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC5oZWxwLWNvbnRhaW5lciBzcGFuIHtcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgICAgICAgICAgICB0b3A6IDUwJTtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgLTUwJSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgI2hlbHAtcXVlc3Rpb24tbWFyayB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGw6ICR7YWNjZW50Q29sb3J9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC5jb250cm9sLXBhaXJpbmcge1xuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgICAgICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lO1xuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IGF1dG87XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLmNvbnRyb2wtcGFpcmluZyBsYWJlbCB7XG4gICAgICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICAgICAgICAgICAgICAgIGZsZXgtYmFzaXM6IGF1dG87XG4gICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICAuY2VudGVycG9pbnQtYnV0dG9ucyB7XG4gICAgICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICAgICAgICAgICAgICAgIGZsZXgtYmFzaXM6IGF1dG87XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLmNlbnRlcnBvaW50LWRpdmlkZXIge1xuICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgI3BhcnQge1xuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IGF1dG87XG4gICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICAuY2xvc2Uge1xuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDQwcHggYXV0bztcbiAgICAgICAgICAgICAgICAgICAgLS1idXR0b24tYmFja2dyb3VuZC1jb2xvcjogJHthY2NlbnRDb2xvcn07XG4gICAgICAgICAgICAgICAgICAgIC0tYnV0dG9uLWxhYmVsLWNvbG9yOiAke2JhY2tncm91bmRDb2xvcn07XG4gICAgICAgICAgICAgICAgICAgIC0tYnV0dG9uLWJvcmRlci1jb2xvcjogJHthY2NlbnRDb2xvcn07XG5cbiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxNTBweDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDwvc3R5bGU+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5uZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGgyIGlkPVwiaGVhZGVyXCIgdGFiaW5kZXg9XCIwXCI+Qm9keSBUcmFja2luZyBTZXR0aW5nczwvaDI+XG4gICAgICAgICAgICAgICAgPGFjYy1jb250ZW50IGlkPVwiY29udGVudC1jb250YWluZXJcIiBncmF5c2NhbGUgd2ViY2Ftb3BhY2l0eT1cIjAuNVwiIGRpc2FibGVkPz0keyFwcm9wcy5vcGVufT5cbiAgICAgICAgICAgICAgICAgICAgPGNhbnZhcyBpZD1cImlucHV0LXZpc3VhbGl6YXRpb25cIiB3aWR0aD1cIjY0MFwiIGhlaWdodD1cIjQ4MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgVmlzdWFsaXphdGlvbiBvZiBib2R5IHRyYWNraW5nIGRhdGEuXG4gICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPlxuICAgICAgICAgICAgICAgIDwvYWNjLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xzLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbHMtcm93LWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhY2Mtc2VsZWN0IGxhYmVsPVwiQm9keSBQYXJ0OlwiIGlkPVwicGFydFwiIG9uLWNoYW5nZT0ke29uU2VsZWN0SW5wdXR9IGlubGluZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke29wdGlvbnModGhpcy5wYXJ0cywgdGhpcy5wYXJ0KX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYWNjLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9scy1yb3ctaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2wtcGFpcmluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhY2MtcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heD1cIjZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwPVwiMC4xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJBbXBsaWZpY2F0aW9uOlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiJHt0aGlzLmFtcGxpZmljYXRpb259XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24taW5wdXQ9XCIke29uQW1wbGlmaWNhdGlvbn1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmU+PC9hY2MtcmFuZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhbXAtdmFsdWVcIj4ke3RoaXMuYW1wbGlmaWNhdGlvbi50b0ZpeGVkKDEpfXg8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9scy1yb3ctaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2wtcGFpcmluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMThweDtcIj5DZW50ZXJwb2ludDo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2VudGVycG9pbnQtYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWNjLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjZW50ZXJwb2ludC1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJVc2UgY3VycmVudCBwb3NpdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbi1jbGljaz0keygpPT4gZGlzcGF0Y2goJ2NlbnRlcicsIHRydWUpfT48L2FjYy1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNlbnRlcnBvaW50LWRpdmlkZXJcIj4gfCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhY2MtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNlbnRlcnBvaW50LWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIlJlc2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uLWNsaWNrPSR7KCk9PiBkaXNwYXRjaCgncmVzZXRjZW50ZXInLCB0cnVlKX0+PC9hY2MtYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8YWNjLWJ1dHRvbiBjbGFzcz1cImNsb3NlXCIgbGFiZWw9XCJEb25lXCIgb24tY2xpY2s9JHsoKT0+dGhpcy5faGFuZGxlQ2xvc2VDbGljaygpfT48L2FjYy1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJoZWxwLWNvbnRhaW5lclwiIHJvbGU9XCJidXR0b25cIiBvbi1jbGljaz0keygpPT4gZGlzcGF0Y2goJ2hlbHAnKX0+XG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0cHhcIiBoZWlnaHQ9XCIyNHB4XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGlkPVwiaGVscC1xdWVzdGlvbi1tYXJrXCIgZD1cIk0xMiwyIEM2LjQ4LDIgMiw2LjQ4IDIsMTIgQzIsMTcuNTIgNi40OCwyMiAxMiwyMiBDMTcuNTIsMjIgMjIsMTcuNTIgMjIsMTIgQzIyLDYuNDggMTcuNTIsMiAxMiwyIEwxMiwyIFogTTEzLDE5IEwxMSwxOSBMMTEsMTcgTDEzLDE3IEwxMywxOSBMMTMsMTkgWiBNMTUuMDcsMTEuMjUgTDE0LjE3LDEyLjE3IEMxMy40NSwxMi45IDEzLDEzLjUgMTMsMTUgTDExLDE1IEwxMSwxNC41IEMxMSwxMy40IDExLjQ1LDEyLjQgMTIuMTcsMTEuNjcgTDEzLjQxLDEwLjQxIEMxMy43OCwxMC4wNSAxNCw5LjU1IDE0LDkgQzE0LDcuOSAxMy4xLDcgMTIsNyBDMTAuOSw3IDEwLDcuOSAxMCw5IEw4LDkgQzgsNi43OSA5Ljc5LDUgMTIsNSBDMTQuMjEsNSAxNiw2Ljc5IDE2LDkgQzE2LDkuODggMTUuNjQsMTAuNjggMTUuMDcsMTEuMjUgTDE1LjA3LDExLjI1IFpcIiBpZD1cIlNoYXBlXCIgZmlsbD1cIiMwMDAwMDBcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgSGVscFxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIGA7XG4gICAgfVxuXG4gICAgX3Nob3VsZFJlbmRlcihwcm9wczogYW55LCBjaGFuZ2VkOiBhbnksIHByZXY6IGFueSkge1xuICAgICAgICBpZighY2hhbmdlZCl7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIuX3Nob3VsZFJlbmRlcihwcm9wcywgY2hhbmdlZCwgcHJldik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNoYW5nZWQpO1xuICAgICAgICBjb25zdCBqdXN0QW1wID0gKGtleXMubGVuZ3RoID09PSAxICYmIGNoYW5nZWQuYW1wbGlmaWNhdGlvbik7XG4gICAgICAgIGlmKGp1c3RBbXAgfHwgKGtleXMubGVuZ3RoIDwgMyAmJiBjaGFuZ2VkLnBhcnQgJiYgY2hhbmdlZC5hbXBsaWZpY2F0aW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLl9zaG91bGRSZW5kZXIocHJvcHMsIGNoYW5nZWQsIHByZXYpO1xuICAgIH1cblxufVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIDxhXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBjbGFzcz1cInNldC1jZW50ZXJwb2ludFwiXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBocmVmPVwiamF2YXNjcmlwdDo7XCJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIG9uLWNsaWNrPSR7KCk9PiB7IGRpc3BhdGNoKCdjZW50ZXInKTsgcmV0dXJuIGZhbHNlOyB9fT5Vc2UgY3VycmVudCBwb3NpdGlvbjwvYT4gfFxuICAgICAgICAgICAgICAgICAgICAvLyA8YVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgY2xhc3M9XCJyZXNldC1jZW50ZXJwb2ludFwiXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBocmVmPVwiamF2YXNjcmlwdDo7XCJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIG9uLWNsaWNrPSR7KCk9PnsgZGlzcGF0Y2goJ2NlbnRlcicpOyByZXR1cm4gZmFsc2U7fX0+UmVzZXQgY2VudGVycG9pbnQ8L2E+XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnYWNjLXBvc2UtaW5wdXQtY2FsaWJyYXRpb24nLCBQb3NlSW5wdXRDYWxpYnJhdGlvbkVsZW1lbnQpOyIsIi8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG5pbXBvcnQgYXV0b2JpbmQgZnJvbSAnYXV0b2JpbmQtZGVjb3JhdG9yJztcbmltcG9ydCAqIGFzIHBvc2VuZXQgZnJvbSAnQHRlbnNvcmZsb3ctbW9kZWxzL3Bvc2VuZXQnO1xuaW1wb3J0IHsgYmFja2dyb3VuZENvbG9yIH0gZnJvbSAnLi9zdHlsZXMnO1xuaW1wb3J0IHsgY29tcHV0ZVN0eWxlUmVzdWx0LCBjc3NDb2xvclRvQXJyYXkgfSBmcm9tICcuLy4uL3V0aWxzJztcbmltcG9ydCB7IHZlYzIsIGNvcHksIGFkZCwgc3ViLCBzY2FsZSB9IGZyb20gJy4vLi4vdmVjMic7XG5pbXBvcnQgeyBzY2FsZVRvRmlsbCwgY2xhbXAsIHNldEJvb2xlYW5BdHRyaWJ1dGUgfSBmcm9tICcuLy4uL3V0aWxzJztcbmltcG9ydCB7IElucHV0VHlwZSwgQW5pbWl0dGVyIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSAnQHBvbHltZXIvbGl0LWVsZW1lbnQnO1xuaW1wb3J0IHsgQUNDSW5wdXRFdmVudCwgSW5wdXRFdmVudERldGFpbHMgfSBmcm9tICcuLi9ldmVudHMvaW5wdXQtZXZlbnQnO1xuaW1wb3J0IHsgQWJzdHJhY3RJbnB1dEVsZW1lbnQgfSBmcm9tICcuL2Fic3RyYWN0LWlucHV0JztcbmltcG9ydCB7IFdlYmNhbUNhbnZhcyB9IGZyb20gJy4uL3dlYmNhbSc7XG5pbXBvcnQgeyBzY2FsZW1hcCB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnLi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IE1vYmlsZU5ldE11bHRpcGxpZXIgfSBmcm9tICdAdGVuc29yZmxvdy1tb2RlbHMvcG9zZW5ldC9kaXN0L21vYmlsZW5ldCc7XG5pbXBvcnQgJy4vdHV0b3JpYWwnO1xuXG5jb25zdCBhbmltaXR0ZXIgPSByZXF1aXJlKCdhbmltaXR0ZXInKTtcblxuXG5pbnRlcmZhY2UgS2V5cG9pbnRNYXAge1xuICAgIFtuYW1lOiBzdHJpbmddOiB2ZWMyO1xufVxuXG4vKipcbiAqIHVzZWQgaW4gb3JkZXIgdG8gZm9jdXMgb24gY2FsaWJyYXRpb24gcGFuZWwgaGVhZGVyIHdpdGhvdXQgc3RyaWN0IGNhc3RpbmdcbiAqIEBwYXJhbSBjXG4gKi9cbmNvbnN0IGNhbkZvY3VzSGVhZGVyID0gKGM6YW55KTogYyBpcyB7IGZvY3VzSGVhZGVyOiAoKT0+dm9pZCB9ID0+XG4gICAgdHlwZW9mIGMuZm9jdXNIZWFkZXIgPT09ICdmdW5jdGlvbic7XG5cbi8qKlxuICogaXMgYW4gZWxlbWVudCB0aGF0IGhhcyB3aWR0aCBhbmQgaGVpZ2h0IGF0dHJpYnV0ZXMgbGlrZSBjYW52YXMgb3IgaW1hZ2VcbiAqIEBwYXJhbSB2XG4gKi9cbmNvbnN0IGlzUGl4ZWxSZXNvbHV0aW9uRWxlbWVudCA9ICh2OiBhbnkpOiB2IGlzIHsgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIgfSA9PlxuICAgIHR5cGVvZiB2LndpZHRoID09PSAnbnVtYmVyJyAmJiB2LmhlaWdodCA9PT0gJ251bWJlcic7XG5cbi8qKlxuICogR2V0IHRoZSBkaW1lbnNpb25zIG9mIHRoZSBwcm92aWRlZCBlbGVtZW50XG4gKiBAcGFyYW0gZWxlbWVudCBhbiBFbGVtZW50IHRvIGdldCB0aGUgZGltZW5zaW9ucyBvZlxuICogQHBhcmFtIHJlc3VsdCBvcHRpb25hbGx5IHByb3ZpZGUgYW4gYXJyYXkgdG8gZmlsbCBhcyBhIHZlY3RvciB0byByZWR1Y2UgZ2FyYmFnZVxuICovXG5jb25zdCBnZXRFbGVtZW50RGltZW5zaW9ucyA9IChlbGVtZW50OiBFbGVtZW50LCByZXN1bHQ6IHZlYzIgPSBbMCwgMF0pOiB2ZWMyID0+IHtcbiAgICBpZiAoaXNQaXhlbFJlc29sdXRpb25FbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgIHJlc3VsdFswXSA9IGVsZW1lbnQud2lkdGg7XG4gICAgICAgIHJlc3VsdFsxXSA9IGVsZW1lbnQuaGVpZ2h0O1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBpZiAoTWF0aC5taW4oZWxlbWVudC5jbGllbnRXaWR0aCwgZWxlbWVudC5jbGllbnRIZWlnaHQpID4gMCkge1xuICAgICAgICByZXN1bHRbMF0gPSBlbGVtZW50LmNsaWVudFdpZHRoO1xuICAgICAgICByZXN1bHRbMV0gPSBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCBiY3IgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgaWYoTWF0aC5taW4oYmNyLndpZHRoLCBiY3IuaGVpZ2h0KSA+IDApIHtcbiAgICAgICAgcmVzdWx0WzBdID0gYmNyLndpZHRoO1xuICAgICAgICByZXN1bHRbMV0gPSBiY3IuaGVpZ2h0O1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IF90bXBWZWMyOiB2ZWMyID0gW05hTiwgTmFOXTtcbmNvbnN0IF90bXBTY2FsZUJvdW5kcyA9IHt9O1xuLyoqXG4gKiBtdXRhdGUgdGhlIHByb3ZpZGVkIHBvaW50cyB0byBiZSBzY2FsZWQgYW5kIG9mZnNldCB0byB0aGUgZGVzdGluYXRpb24gY2FudmFzXG4gKiBAcGFyYW0geyp9IGNhbnZhc1xuICogQHBhcmFtIHtBcnJheTxbbnVtYmVyLG51bWJlcl0+fSBuZXN0ZWRQb2ludHNcbiAqIEBwYXJhbSB7Kn0gcmVzdWx0XG4gKi9cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1DYW1lcmFQb2ludHMgPSAoXG4gICAgaW5XaWR0aDogbnVtYmVyLCBpbkhlaWdodDogbnVtYmVyLFxuICAgIG91dFdpZHRoOiBudW1iZXIsIG91dEhlaWdodDogbnVtYmVyLFxuICAgIG5lc3RlZFBvaW50czogdmVjMltdKSA9PiB7XG5cbiAgICBjb25zdCB7IHNjYWxlLCBsZWZ0LCB0b3AgfSA9IHNjYWxlVG9GaWxsKGluV2lkdGgsIGluSGVpZ2h0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCAwLCBfdG1wU2NhbGVCb3VuZHMpO1xuXG4gICAgZm9yKGxldCBpPTA7IGk8bmVzdGVkUG9pbnRzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgY29uc3QgcG9pbnQgPSBuZXN0ZWRQb2ludHNbaV07XG4gICAgICAgIGxldCBbeCwgeV0gPSBwb2ludDtcbiAgICAgICAgeCAqPSBzY2FsZTtcbiAgICAgICAgeSAqPSBzY2FsZTtcbiAgICAgICAgeCArPSBsZWZ0O1xuICAgICAgICB5ICs9IHRvcDtcbiAgICAgICAgcG9pbnRbMF0gPSB4O1xuICAgICAgICBwb2ludFsxXSA9IHk7XG4gICAgfVxuICAgIHJldHVybiBuZXN0ZWRQb2ludHM7XG59O1xuXG5cbmNvbnN0IGtleXBvaW50UGFydHNNYXA6IGFueSA9IHtcbiAgICAnbm9zZSc6ICdOb3NlJyxcbiAgICAnbGVmdEV5ZSc6ICdSaWdodCBFeWUnLFxuICAgICdyaWdodEV5ZSc6ICdMZWZ0IEV5ZScsXG4gICAgJ2xlZnRFYXInOiAnUmlnaHQgRWFyJyxcbiAgICAncmlnaHRFYXInOiAnTGVmdCBFYXInLFxuICAgICdsZWZ0U2hvdWxkZXInOiAnUmlnaHQgU2hvdWxkZXInLFxuICAgICdyaWdodFNob3VsZGVyJzogJ0xlZnQgU2hvdWxkZXInLFxuICAgICdsZWZ0RWxib3cnOiAnUmlnaHQgRWxib3cnLFxuICAgICdyaWdodEVsYm93JzogJ0xlZnQgRWxib3cnLFxuICAgICdsZWZ0V3Jpc3QnOiAnUmlnaHQgV3Jpc3QnLFxuICAgICdyaWdodFdyaXN0JzonTGVmdCBXcmlzdCcsXG4gICAgJ2xlZnRIaXAnOiAnUmlnaHQgSGlwJyxcbiAgICAncmlnaHRIaXAnOiAnTGVmdCBIaXAnLFxuICAgICdsZWZ0S25lZSc6ICdSaWdodCBLbmVlJyxcbiAgICAncmlnaHRLbmVlJzogJ0xlZnQgS25lZScsXG4gICAgJ2xlZnRBbmtsZSc6ICdSaWdodCBBbmtsZScsXG4gICAgJ3JpZ2h0QW5rbGUnOiAnTGVmdCBBbmtsZSdcbn07XG5cbi8vcHJlLWRlZmluZWQgcGFydHMgdGhhdCBjb21lIHdpdGggcG9zZW5ldFxuZXhwb3J0IGNvbnN0IGtleXBvaW50UGFydHMgPSBbXG4gICAgJ25vc2UnLFxuICAgICdsZWZ0RXllJyxcbiAgICAncmlnaHRFeWUnLFxuICAgICdsZWZ0RWFyJyxcbiAgICAncmlnaHRFYXInLFxuICAgICdsZWZ0U2hvdWxkZXInLFxuICAgICdyaWdodFNob3VsZGVyJyxcbiAgICAnbGVmdEVsYm93JyxcbiAgICAncmlnaHRFbGJvdycsXG4gICAgJ2xlZnRXcmlzdCcsXG4gICAgJ3JpZ2h0V3Jpc3QnLFxuICAgICdsZWZ0SGlwJyxcbiAgICAncmlnaHRIaXAnLFxuICAgICdsZWZ0S25lZScsXG4gICAgJ3JpZ2h0S25lZScsXG4gICAgJ2xlZnRBbmtsZScsXG4gICAgJ3JpZ2h0QW5rbGUnXG5dO1xuXG5cbmNvbnN0IHNlbGVjdGFibGVQYXJ0cyA9IFtcbiAgICAnbm9zZScsXG4gICAgJ2xlZnRXcmlzdCcsXG4gICAgJ3JpZ2h0V3Jpc3QnLFxuICAgICdsZWZ0RWxib3cnLFxuICAgICdyaWdodEVsYm93JyxcbiAgICAnbGVmdEtuZWUnLFxuICAgICdyaWdodEtuZWUnLFxuICAgICdsZWZ0QW5rbGUnLFxuICAgICdyaWdodEFua2xlJ1xuXTtcblxuY29uc3Qgc2VsZWN0YWJsZVBhcnRzRGlzcGxheSA9IHNlbGVjdGFibGVQYXJ0cy5tYXAoa2V5PT4ga2V5cG9pbnRQYXJ0c01hcFtrZXldKTtcblxuLy9hbGwgcGFydHNcbmV4cG9ydCBjb25zdCBwYXJ0cyA9IGtleXBvaW50UGFydHM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9zZUlucHV0RXZlbnREZXRhaWxzIGV4dGVuZHMgSW5wdXRFdmVudERldGFpbHMge1xuICAgIHBvc2U6cG9zZW5ldC5Qb3NlO1xuICAgIGJvZHlQYXJ0OnN0cmluZztcbn1cblxudHlwZSBQb3NlSW5wdXRFdmVudEluaXQgPSBDdXN0b21FdmVudEluaXQ8UG9zZUlucHV0RXZlbnREZXRhaWxzPjtcblxuZXhwb3J0IGNsYXNzIEFDQ1Bvc2VJbnB1dEV2ZW50IGV4dGVuZHMgQUNDSW5wdXRFdmVudCB7XG4gICAgY29uc3RydWN0b3IodHlwZTpzdHJpbmcsIGV2ZW50SW5pdDpQb3NlSW5wdXRFdmVudEluaXQpe1xuICAgICAgICBzdXBlcih0eXBlLCBldmVudEluaXQpO1xuICAgIH1cbn1cblxuLy8gbGV0IGNvbnN0cmFpbnRzID0ge1xuLy8gICAgIGF1ZGlvOiBmYWxzZSxcbi8vICAgICB2aWRlbzoge1xuLy8gICAgICAgICBhZHZhbmNlZDogW1xuLy8gICAgICAgICAgICAgeyB3aWR0aDogeyBleGFjdDogNDAwIH0gfSxcbi8vICAgICAgICAgICAgIHsgaGVpZ2h0OiB7IGV4YWN0OiA0MDAgfSB9LFxuLy8gICAgICAgICBdXG4vLyAgICAgfVxuLy8gIH1cblxuY29uc3QgX3RtcENvbnRlbnREaW1zOiBbbnVtYmVyLCBudW1iZXJdID0gW05hTiwgTmFOXTtcblxuLyoqXG4gKiBgPGFjYy1wb3NlLWlucHV0PmAgZWxlbWVudCBlYXNpbHkgYWRkcyBQb3NlTmV0IGJhc2VkIHRyYWNraW5nIGZvciBjb250cm9sbGluZ1xuICogdGhlIGN1cnNvciBwb3NpdGlvbiBvbiBhIHdlYnBhZ2Ugd2l0aCBhIGNob3NlbiBib2R5IHBhcnQgb2YgdGhlIHVzZXIuXG4gKiBGb3IgZXhhbXBsZSB3aXRoIGEgY291cGxlIGxpbmVzIG9mIGNvZGUsIGEgdXNlcidzIG5vc2UgY2FuIGJlIHVzZWQgdG8gY29udHJvbFxuICogYSB3ZWJwYWdlLlxuICpcbiAqIEBleGFtcGxlIGBgYGh0bWxcbiAqXG4gKiA8YWNjLXBvc2UtaW5wdXQgYW1wbGlmaWNhdGlvbj1cIjJcIiBzbW9vdGhpbmc9XCIwLjVcIiBib2R5UGFydD1cIm5vc2VcIj48L2FjYy1wb3NlLWlucHV0PlxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBQb3NlSW5wdXRFbGVtZW50IGV4dGVuZHMgQWJzdHJhY3RJbnB1dEVsZW1lbnQge1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gICAgcHVibGljIGxhYmVsOnN0cmluZyA9ICdCb2R5JztcblxuICAgIHB1YmxpYyBpbnB1dFR5cGU6SW5wdXRUeXBlID0gJ3Bvc2UnO1xuICAgIHB1YmxpYyBwb3NlOnBvc2VuZXQuUG9zZTtcblxuXG4gICAgcHVibGljIHByZWFtcGxpZmllZFRhcmdldFBvc2l0aW9uOiB2ZWMyID0gWzAsIDBdO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pXG4gICAgcHVibGljIGFtcGxpZmljYXRpb246bnVtYmVyID0gMTtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICAgIHB1YmxpYyBib2R5UGFydDpzdHJpbmcgPSAnbm9zZSc7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgICBwdWJsaWMgdGFyZ2V0OnN0cmluZyA9ICcnO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pXG4gICAgcHVibGljIG11bHRpcGxpZXI6TW9iaWxlTmV0TXVsdGlwbGllciA9IDEuMDE7Ly8wLjc1O1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pXG4gICAgcHVibGljIGltYWdlU2NhbGVGYWN0b3I6bnVtYmVyID0gMC4zMztcblxuICAgIC8qKlxuICAgICAqIHNob3cgdGhlIGhlbHAgbW9kYWwsIGhhcyBwcmlvcml0eSBvdmVyIGNvbnRyb2xzXG4gICAgICovXG4gICAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KVxuICAgIHB1YmxpYyBoZWxwOiBib29sZWFuID0gZmFsc2U7XG5cblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciB9KVxuICAgIHB1YmxpYyBrZXlwb2ludEVhc2U6IG51bWJlciA9IDAuNTtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgaW5wdXQgaGFzIGEgY29pbnRyb2xzIHBhbmVsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNDb250cm9scygpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9lc3RpbWF0aW5nOmJvb2xlYW47XG4gICAgcHJvdGVjdGVkIF93ZWJjYW1DYW52YXM6V2ViY2FtQ2FudmFzID0gbmV3IFdlYmNhbUNhbnZhcygpO1xuICAgIHByb3RlY3RlZCBfbG9vcDpBbmltaXR0ZXIgPSBhbmltaXR0ZXIoKTtcbiAgICBwcm90ZWN0ZWQgX2lucHV0OnBvc2VuZXQuUG9zZU5ldDtcblxuICAgIHB1YmxpYyBzb3VyY2VDZW50ZXI6IHZlYzI7XG5cbiAgICBwcml2YXRlIF9fZXN0aW1hdGluZzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIGhvbGRzIGEgZGljdGlvbmFyeSBvZiBhbGwgdHJhY2tlZCBrZXlwb2ludHMsIGluIHNvdXJjZSAod2ViY2FtKSBjb29yZGluYXRlc1xuICAgICAqIHBvaW50cyBhcmUgYWxsIGVhc2VkIGJ5IGtleXBvaW50RWFzZVxuICAgICAqL1xuICAgIHByaXZhdGUgX19lYXNlZEtleXBvaW50TWFwOiBLZXlwb2ludE1hcCA9IHt9O1xuXG4gICAgcHJpdmF0ZSBfX2xhc3RTb3VyY2VQb3NpdGlvbjogdmVjMiA9IFswLCAwXTtcblxuXG5cbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9sb29wLm9uKCd1cGRhdGUnLCB0aGlzLl9oYW5kbGVOZXdGcmFtZSk7XG4gICAgICAgIHRoaXMuX2xvb3Aub24oJ3N0YXJ0JywgdGhpcy5fZGlzcGF0Y2hSZWFkeSk7XG4gICAgICAgIHRoaXMuX2xvb3Aub24oJ3N0b3AnLCB0aGlzLl9oYW5kbGVTdG9wKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBvdmVycmlkaW5nIEFic3RyYWN0SW5wdXRFbGVtZW50I19jcmVhdGVFdmVudCB0byBwcm92aWRlIGV4dHJhIGRldGFpbHNcbiAgICAgKiBAcGFyYW0gdHlwZVxuICAgICAqIEBwYXJhbSBidWJibGVzXG4gICAgICogQHBhcmFtIGNvbXBvc2VkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9jcmVhdGVFdmVudCh0eXBlOnN0cmluZywgYnViYmxlczpib29sZWFuPXRydWUsIGNvbXBvc2VkOmJvb2xlYW49dHJ1ZSl7XG4gICAgICAgIGNvbnN0IGV2ZW50SW5pdDpQb3NlSW5wdXRFdmVudEluaXQgPSB7XG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICBpbnB1dFR5cGU6IHRoaXMuaW5wdXRUeXBlLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiB0aGlzLnBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIGJvZHlQYXJ0OiB0aGlzLmJvZHlQYXJ0LFxuICAgICAgICAgICAgICAgIHBvc2U6dGhpcy5wb3NlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJ1YmJsZXMsXG4gICAgICAgICAgICAvL3NlbmQgb3V0c2lkZSBvZiBzaGFkb3cgdG8gcGFyZW50IGVsZW1lbnRcbiAgICAgICAgICAgIGNvbXBvc2VkXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5ldyBBQ0NJbnB1dEV2ZW50KHR5cGUsIGV2ZW50SW5pdCk7XG4gICAgfVxuXG5cbiAgICBjb21wdXRlUGFydFBvc2l0aW9uKHBhcnQ6c3RyaW5nLCByZXN1bHQ6IHZlYzI9W05hTixOYU5dKTogdmVjMiB7XG4gICAgICAgIGlmKCF0aGlzLnBvc2UgfHwgIXRoaXMucG9zZS5rZXlwb2ludHMpe1xuICAgICAgICAgICAgcmVzdWx0WzBdID0gcmVzdWx0WzFdID0gTmFOO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHg6IG51bWJlcjtcbiAgICAgICAgbGV0IHk6IG51bWJlcjtcblxuICAgICAgICBpZihwYXJ0ID09PSAnc3Rlcm51bScpe1xuICAgICAgICAgICAgY29uc3QgbGVmdFNoID0gdGhpcy5wb3NlLmtleXBvaW50c1s1XS5wb3NpdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0U2ggPSB0aGlzLnBvc2Uua2V5cG9pbnRzWzZdLnBvc2l0aW9uO1xuICAgICAgICAgICAgeCA9IChsZWZ0U2gueCAtIHJpZ2h0U2gueCkgKiAwLjUgKyByaWdodFNoLng7XG4gICAgICAgICAgICB5ID0gKGxlZnRTaC55IC0gcmlnaHRTaC55KSAqIDAuNSArIHJpZ2h0U2gueTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSB0aGlzLnBvc2Uua2V5cG9pbnRzW2tleXBvaW50UGFydHMuaW5kZXhPZihwYXJ0KV0ucG9zaXRpb247XG4gICAgICAgICAgICB4ID0gcC54O1xuICAgICAgICAgICAgeSA9IHAueTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdFswXSA9IHg7XG4gICAgICAgIHJlc3VsdFsxXSA9IHk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZ2V0UGFydFBvc2l0aW9uKHBhcnQ6IHN0cmluZywgcmVzdWx0OiB2ZWMyPSBbTmFOLCBOYU5dKTogdmVjMiB7XG4gICAgICAgIC8vcmV0dXJuIHRoaXMuY29tcHV0ZVBhcnRQb3NpdGlvbihwYXJ0LCByZXN1bHQpO1xuICAgICAgICBjb25zdCBzcmMgPSB0aGlzLl9fZWFzZWRLZXlwb2ludE1hcFtwYXJ0XTtcbiAgICAgICAgaWYoc3JjKSB7XG4gICAgICAgICAgICByZXN1bHRbMF0gPSBzcmNbMF07XG4gICAgICAgICAgICByZXN1bHRbMV0gPSBzcmNbMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBnZXRQYXJ0UG9zaXRpb25Ob3JtYWxpemVkKHBhcnQ6c3RyaW5nLCByZXN1bHQ6IHZlYzI9W05hTiwgTmFOXSk6IHZlYzIge1xuICAgICAgICBjb25zdCBwb3MgPSB0aGlzLmdldFBhcnRQb3NpdGlvbihwYXJ0LCByZXN1bHQpO1xuXG4gICAgICAgIGNvbnN0IHggPSBzY2FsZW1hcChwb3NbMF0sIDAsIHRoaXMuY2FudmFzLndpZHRoLCAtMSwgMSk7Ly8gKiB0aGlzLmFtcGxpZmljYXRpb247XG4gICAgICAgIGNvbnN0IHkgPSBzY2FsZW1hcChwb3NbMV0sIDAsIHRoaXMuY2FudmFzLmhlaWdodCwgLTEsIDEpOy8vICogdGhpcy5hbXBsaWZpY2F0aW9uO1xuICAgICAgICByZXN1bHRbMF0gPSB4O1xuICAgICAgICByZXN1bHRbMV0gPSB5O1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIGJvZHkgcGFydCBwcm9qZWN0ZWQgaW50byB0aGUgY29vcmRpbmF0ZSBzcGFjZSBvZiB0aGUgdGFyZ2V0IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gcGFydCB0aGUgYm9keSBwYXJ0IGtleSB0byByZWNlaXZlIHRoZSBwb3NpdGlvbiBvZlxuICAgICAqIEBwYXJhbSB0YXJnZXRFbGVtZW50IG9wdGlvbmFsbHkgcHJvdmlkZSBhbiBFbGVtZW50IGlmIHlvdSB3aXNoIHRvIHVzZSBvbmUgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0XG4gICAgICovXG4gICAgZ2V0UGFydFBvc2l0aW9uUHJvamVjdGVkKHBhcnQ6IHN0cmluZywgdGFyZ2V0RWxlbWVudDpFbGVtZW50PSB0aGlzLmNvbnRlbnRFbGVtZW50KTogdmVjMiB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2plY3RQb3NpdGlvbih0aGlzLmdldFBhcnRQb3NpdGlvbihwYXJ0KSwgdGFyZ2V0RWxlbWVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvamVjdCAobXV0YXRlKSBhIHBvc2l0aW9uIGZyb20gc291cmNlICh3ZWJjYW0pIGNvb3JkaW5hdGVzIHRvIGFuIGVsZW1lbnRzIGNvb3JkaW5hdGVzXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIGEgdmVjdG9yIGluIHNvdXJjZSAod2ViY2FtKSBjb29yZGluYXRlc1xuICAgICAqIEBwYXJhbSB0YXJnZXRFbGVtZW50IG9wdGlvbmFsbHkgcHJvdmlkZSBhbiBFbGVtZW50IHRvIHByb2plY3QgdG8gb3RoZXIgdGhhbiB0YXJnZXQgZWxlbWVudFxuICAgICAqL1xuICAgIHByb2plY3RQb3NpdGlvbihwb3NpdGlvbjogdmVjMiwgdGFyZ2V0RWxlbWVudDogRWxlbWVudD0gdGhpcy5jb250ZW50RWxlbWVudCk6IHZlYzIge1xuICAgICAgICBjb25zdCBbIHdpZHRoLCBoZWlnaHQgXSA9IGdldEVsZW1lbnREaW1lbnNpb25zKHRhcmdldEVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtQ2FtZXJhUG9pbnRzKHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQsIHdpZHRoLCBoZWlnaHQsIFtwb3NpdGlvbl0pWzBdO1xuICAgIH1cblxuICAgIGdldCBjYW52YXMoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlYmNhbUNhbnZhcy5kb21FbGVtZW50O1xuICAgIH1cblxuICAgIGFzeW5jIGluaXRpYWxpemUoKXtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2hJbml0aWFsaXppbmcoKTtcbiAgICAgICAgaWYoLyhpUGFkfGlQaG9uZXxDcmlvcykvZy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoJ0JvZHkgdHJhY2tpbmcgaXMgbm90IHN1cHBvcnRlZCBvbiBpT1MuJyk7XG4gICAgICAgICAgICB0aGlzLl9kaXNwYXRjaEVycm9yKGVycik7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9pbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5faW5wdXQgPSBhd2FpdCBwb3NlbmV0LmxvYWQodGhpcy5tdWx0aXBsaWVyKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fd2ViY2FtQ2FudmFzLmluaXRpYWxpemUoKTtcbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNwYXRjaEVycm9yKG5ldyBFcnJvcihlKSk7IC8vJ0Vycm9yIGluaXRpYWxpemluZyBjYW1lcmEuIFBsZWFzZSBlbnN1cmUgeW91IGhhdmUgb25lIGFuZCBoYXZlblxcJ3QgZGVuaWVkIGFjY2Vzcy4nKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYoIXRoaXMuc291cmNlQ2VudGVyKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Q2VudGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbG9vcC5zZXRGUFModGhpcy5fd2ViY2FtQ2FudmFzLmdldEZyYW1lUmF0ZSgpKTtcbiAgICAgICAgdGhpcy5fbG9vcC5zdGFydCgpO1xuICAgIH1cblxuXG4gICAgQGF1dG9iaW5kXG4gICAgcHJvdGVjdGVkIF9oYW5kbGVTdG9wKCl7XG4gICAgICAgIC8vd2hlbiB0aGUgaW5wdXQgc3RvcHMsIHNodXQgZG93biB0aGUgY2FtZXJhIGFuZCB1bmRvIGFsbCBpbml0aWFsaXphdGlvblxuICAgICAgICB0aGlzLl9kaXNwYXRjaFN0b3AoKTtcbiAgICAgICAgdGhpcy5fd2ViY2FtQ2FudmFzLnN0b3AoKTtcbiAgICB9XG5cbiAgICBAYXV0b2JpbmRcbiAgICBwcm90ZWN0ZWQgX2hhbmRsZU5ld0ZyYW1lKCl7XG4gICAgICAgIC8vaWYgYSBuZXcgZnJhbWUgb2NjdXJzIHdoaWxlIHN0aWxsIGVzdGltYXRpbmcgdGhlIGxhc3QgcG9zZVxuICAgICAgICAvL3NraXAgdGhpcyBmcmFtZVxuICAgICAgICBpZih0aGlzLl9fZXN0aW1hdGluZyl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdXBkYXRlUG9zZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBfcHJvcGVydGllc0NoYW5nZWQocHJvcHM6IGFueSwgY2hhbmdlZDogYW55LCBwcmV2OiBhbnkpIHtcbiAgICAgICAgc3VwZXIuX3Byb3BlcnRpZXNDaGFuZ2VkKHByb3BzLCBjaGFuZ2VkLCBwcmV2KTtcbiAgICAgICAgaWYoY2hhbmdlZCAmJiBjaGFuZ2VkLmhhc093blByb3BlcnR5KCdoZWxwJykpIHtcbiAgICAgICAgICAgIHNldEJvb2xlYW5BdHRyaWJ1dGUodGhpcywgJ2hlbHAnLCBwcm9wcy5oZWxwKTtcbiAgICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHByb3RlY3RlZCBhc3luYyBfdXBkYXRlUG9zZSgpe1xuICAgICAgICBjb25zdCBvdXRwdXRTdHJpZGUgPSAxNjtcbiAgICAgICAgY29uc3QgZmxpcEhvcml6b250YWwgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgbWF4UG9zZURldGVjdGlvbnMgPSAxO1xuXG4gICAgICAgIHRoaXMuX2VzdGltYXRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLl93ZWJjYW1DYW52YXMudXBkYXRlKCk7XG4gICAgICAgIGNvbnN0IHBvc2VzID0gYXdhaXQgdGhpcy5faW5wdXQuZXN0aW1hdGVNdWx0aXBsZVBvc2VzKHRoaXMuX3dlYmNhbUNhbnZhcy5kb21FbGVtZW50LCB0aGlzLmltYWdlU2NhbGVGYWN0b3IsIGZsaXBIb3Jpem9udGFsLCBvdXRwdXRTdHJpZGUsIG1heFBvc2VEZXRlY3Rpb25zKTtcbiAgICAgICAgY29uc3QgcG9zZSA9IHBvc2VzWzBdO1xuICAgICAgICB0aGlzLl9lc3RpbWF0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucG9zZSA9IHBvc2U7XG5cbiAgICAgICAgaWYodGhpcy5wb3NlKXtcbiAgICAgICAgICAgIGNvbnN0IF90bXA6IHZlYzIgPSBbTmFOLCBOYU5dO1xuICAgICAgICAgICAgLy91cGRhdGUgYWxsIGtleXBvaW50cyBwb3NpdGlvbnMsIGFuZCBlYXNlIHRoZW0gYnkgcGFyYW1ldGVyXG4gICAgICAgICAgICBmb3IgKGxldCBpPSAwOyBpPGtleXBvaW50UGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXk6IHN0cmluZyA9IGtleXBvaW50UGFydHNbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmNvbXB1dGVQYXJ0UG9zaXRpb24oa2V5KTtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0UG9zaXRpb24gPSB0aGlzLl9fZWFzZWRLZXlwb2ludE1hcFtrZXldO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0UG9zaXRpb24gJiYgIWlzTmFOKGxhc3RQb3NpdGlvblswXSkgJiYgIWlzTmFOKGxhc3RQb3NpdGlvblsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWFzZWREaWZmZXJlbmNlID0gc2NhbGUoc3ViKHBvc2l0aW9uLCBsYXN0UG9zaXRpb24sIF90bXApLCB0aGlzLmtleXBvaW50RWFzZSwgX3RtcCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZChsYXN0UG9zaXRpb24sIGVhc2VkRGlmZmVyZW5jZSwgbGFzdFBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9fZWFzZWRLZXlwb2ludE1hcFtrZXldID0gcG9zaXRpb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodGhpcy5jb250ZW50RWxlbWVudCl7XG4gICAgICAgICAgICAgICAgLy90aGUgc291cmNlIGNvb3JkaW5hdGUgZnJvbSB3ZWJjYW0gKGxpa2VseSA2NDB4NDgwKVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRQb3NpdGlvbiA9IHRoaXMuZ2V0UGFydFBvc2l0aW9uKHRoaXMuYm9keVBhcnQpO1xuXG4gICAgICAgICAgICAgICAgLy9jYWxjdWxhdGUgdGhlIHBvc2l0aW9uIHByb2plY3RlZCB0byB0aGUgdGFyZ2V0LFxuICAgICAgICAgICAgICAgIC8vYnV0IGJlZm9yZSBhbnkgYW1wbGlmaWNhdGlvbiBoYXMgYmVlbiBjb21wdXRlZFxuICAgICAgICAgICAgICAgIGNvcHkocGFydFBvc2l0aW9uLCB0aGlzLnByZWFtcGxpZmllZFRhcmdldFBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2plY3RQb3NpdGlvbih0aGlzLnByZWFtcGxpZmllZFRhcmdldFBvc2l0aW9uKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUNlbnRlciA9IHN1YihwYXJ0UG9zaXRpb24sIHRoaXMuc291cmNlQ2VudGVyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhbXBsaWZpZWREaXN0YW5jZSA9IHNjYWxlKGRpc3RhbmNlRnJvbUNlbnRlciwgdGhpcy5hbXBsaWZpY2F0aW9uKTtcblxuICAgICAgICAgICAgICAgIC8vdXBkYXRlIHBhcnRQb3NpdGlvbiB0byBiZWluZyB0aGUgYW1wbGlmaWVkIHBvc2l0aW9uIHN0aWxsIGluIHNvdXJjZSBjb29yZGluYXRlc1xuICAgICAgICAgICAgICAgIGFkZCh0aGlzLnNvdXJjZUNlbnRlciwgYW1wbGlmaWVkRGlzdGFuY2UsIHRoaXMuX19sYXN0U291cmNlUG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIGFkZCh0aGlzLnNvdXJjZUNlbnRlciwgYW1wbGlmaWVkRGlzdGFuY2UsIHRoaXMuX2xhc3RGb3VuZFRhcmdldFBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICAvL3NldCB0aGUgcHJvamVjdGVkIHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0UG9zaXRpb24odGhpcy5fbGFzdEZvdW5kVGFyZ2V0UG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlQ2xhbXApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGltcyA9IGdldEVsZW1lbnREaW1lbnNpb25zKHRoaXMuY29udGVudEVsZW1lbnQsIF90bXBDb250ZW50RGltcylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFzdEZvdW5kVGFyZ2V0UG9zaXRpb25bMF0gPSBjbGFtcCh0aGlzLl9sYXN0Rm91bmRUYXJnZXRQb3NpdGlvblswXSwgMCwgZGltc1swXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RGb3VuZFRhcmdldFBvc2l0aW9uWzFdID0gY2xhbXAodGhpcy5fbGFzdEZvdW5kVGFyZ2V0UG9zaXRpb25bMV0sIDAsIGRpbXNbMV0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbGFzdEZvdW5kUG9zaXRpb24gPSB0aGlzLmdldFBhcnRQb3NpdGlvbk5vcm1hbGl6ZWQodGhpcy5ib2R5UGFydCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kaXNwYXRjaFRpY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCBvZiB0aGUgcHJvamVjdCBwb3NpdGlvbnMgZm9yIGV2ZXJ5IHBhcnRcbiAgICAgKiBAcGFyYW0ga2V5cG9pbnRzIG9wdGlvbmFsbHkgcHJvdmlkZSBhIGxpc3Qgb2YgYm9keVBhcnQga2V5cyB0byBwcm9qZWN0LCBkZWZhdWx0cyB0byBhbGxcbiAgICAgKiBAcGFyYW0gdGFyZ2V0RWxlbWVudCBvcHRpb25hbGx5IHByb2plY3QgYW4gRWxlbWVudCB0byBwcm9qZWN0IGNvb3JkaW5hdGVzIHRvbywgZGVmYXVsdHMgdG8gdGFyZ2V0XG4gICAgICovXG4gICAgcHVibGljIGdldEFsbFBvc2l0aW9uc1Byb2plY3RlZChrZXlwb2ludHM6IHN0cmluZ1tdPSBrZXlwb2ludFBhcnRzLCB0YXJnZXRFbGVtZW50OiBFbGVtZW50PSB0aGlzLmNvbnRlbnRFbGVtZW50KSB7XG5cblxuICAgICAgICBjb25zdCBbIHdpZHRoLCBoZWlnaHQgXSA9IGdldEVsZW1lbnREaW1lbnNpb25zKHRhcmdldEVsZW1lbnQpO1xuXG4gICAgICAgIHJldHVybiBrZXlwb2ludHMucmVkdWNlKChtZW06IGFueSwgcGFydDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZighbWVtW3BhcnRdKSB7XG4gICAgICAgICAgICAgICAgbWVtW3BhcnRdID0gdHJhbnNmb3JtQ2FtZXJhUG9pbnRzKDY0MCwgNDgwLCB3aWR0aCwgaGVpZ2h0LCBbdGhpcy5nZXRQYXJ0UG9zaXRpb24ocGFydCldKVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtZW07XG4gICAgICAgIH0sIHt9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZW5kZXIgYSBjcm9zc2hhaXIgb2YgdGhlIGlucHV0J3MgY2VudGVyIGNhbGlicmF0aW9uIHBvaW50XG4gICAgICogQHBhcmFtIGN0eFxuICAgICAqIEBwYXJhbSBzdHlsZVxuICAgICAqIEBwYXJhbSBsaW5lV2lkdGhcbiAgICAgKiBAcGFyYW0gcmFkaXVzXG4gICAgICogQHBhcmFtIGNyb3NzTGVuZ3RoXG4gICAgICovXG4gICAgcHVibGljIHJlbmRlckNlbnRlcihjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgc3R5bGU6IHN0cmluZz0gJ2JsYWNrJywgbGluZVdpZHRoOiBudW1iZXI9IDMsIHJhZGl1czogbnVtYmVyPSAxNiwgY3Jvc3NMZW5ndGg6IG51bWJlcj0gOCkge1xuICAgICAgICBpZighdGhpcy5pc1JlYWR5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb3B5KHRoaXMuc291cmNlQ2VudGVyLCBfdG1wVmVjMik7XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHRoaXMucHJvamVjdFBvc2l0aW9uKF90bXBWZWMyLCBjdHguY2FudmFzKTtcbiAgICAgICAgbGV0IHggPSAwO1xuICAgICAgICBsZXQgeSA9IDA7XG5cbiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gc3R5bGU7XG4gICAgICAgIGN0eC5saW5lV2lkdGggPSBsaW5lV2lkdGg7XG5cbiAgICAgICAgLy8gY3Jvc3MtaGFpciBzY29wZSBkZXNpZ25cbiAgICAgICAgLy8gY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAvLyBjdHguYXJjKGNlbnRlclswXSwgY2VudGVyWzFdLCByYWRpdXMsIDAsIE1hdGguUEkgKiAyKTtcbiAgICAgICAgLy8geCA9IGNlbnRlclswXSArIHJhZGl1cztcbiAgICAgICAgLy8geSA9IGNlbnRlclsxXTtcbiAgICAgICAgLy8gY3R4Lm1vdmVUbyh4LCB5KTtcbiAgICAgICAgLy8gY3R4LmxpbmVUbyh4ICsgY3Jvc3NMZW5ndGgsIHkpO1xuXG4gICAgICAgIC8vIHggPSBjZW50ZXJbMF0gLSByYWRpdXM7XG4gICAgICAgIC8vIGN0eC5tb3ZlVG8oeCAtIGNyb3NzTGVuZ3RoLCB5KTtcbiAgICAgICAgLy8gY3R4LmxpbmVUbyh4LCB5KTtcblxuICAgICAgICAvLyB4ID0gY2VudGVyWzBdO1xuICAgICAgICAvLyB5ID0gY2VudGVyWzFdIC0gcmFkaXVzO1xuICAgICAgICAvLyBjdHgubW92ZVRvKHgsIHkpO1xuICAgICAgICAvLyBjdHgubGluZVRvKHgsIHkgLSBjcm9zc0xlbmd0aCk7XG5cbiAgICAgICAgLy8geSA9IGNlbnRlclsxXSArIHJhZGl1cztcbiAgICAgICAgLy8gY3R4Lm1vdmVUbyh4LCB5KTtcbiAgICAgICAgLy8gY3R4LmxpbmVUbyh4LCB5ICsgY3Jvc3NMZW5ndGgpO1xuXG5cbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBjdHgubW92ZVRvKGNlbnRlclswXSAtIHJhZGl1cywgY2VudGVyWzFdKTtcbiAgICAgICAgY3R4LmxpbmVUbyhjZW50ZXJbMF0gKyByYWRpdXMsIGNlbnRlclsxXSk7XG4gICAgICAgIGN0eC5tb3ZlVG8oY2VudGVyWzBdLCBjZW50ZXJbMV0gLSByYWRpdXMpO1xuICAgICAgICBjdHgubGluZVRvKGNlbnRlclswXSwgY2VudGVyWzFdICsgcmFkaXVzKTtcblxuICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgcmVuZGVyQ3Vyc29yKGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBzdHlsZT0nYmx1ZScpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzUmVhZHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IF9fbGFzdFNvdXJjZVBvc2l0aW9uOnNvdXJjZSB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgW3gxLCB5MV0gPSB0aGlzLnByb2plY3RQb3NpdGlvbih0aGlzLmdldFBhcnRQb3NpdGlvbih0aGlzLmJvZHlQYXJ0KSwgY3R4LmNhbnZhcyk7XG4gICAgICAgIGNvbnN0IFt4MiwgeTJdID0gdGhpcy5wcm9qZWN0UG9zaXRpb24oc291cmNlLCBjdHguY2FudmFzKTtcbiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gY3R4LmZpbGxTdHlsZSA9IHN0eWxlO1xuICAgICAgICAvL2xpbmUgY29ubmVjdGluZyBzb3VyY2UgZG90IHRvIGFtcGxpZmllZCBkb3RcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBjdHgubW92ZVRvKHgxLCB5MSk7XG4gICAgICAgIGN0eC5saW5lVG8oeDIsIHkyKTtcbiAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgICAvL2NpcmNsZSByZXByZXNlbnRpbmcgY3Vyc29yXG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgY3R4LmFyYyh4MiwgeTIsIDE2LCAwLCBNYXRoLlBJICogMik7XG4gICAgICAgIGN0eC5maWxsKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmVuZGVyIHRoZSBwb3NlIGRhdGEgdG8gYSBjYW52YXMgdG8gc2hvdyBjdXJyZW50IHRyYWNrZWQgc2tlbGV0b25cbiAgICAgKiBAcGFyYW0gY3R4XG4gICAgICogQHBhcmFtIHN0eWxlXG4gICAgICogQHBhcmFtIHJhZGl1c1xuICAgICAqL1xuICAgIHB1YmxpYyByZW5kZXJJbnB1dERhdGEoY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHN0eWxlOiBzdHJpbmc9ICdyZ2JhKDk2LDk2LDk2LCAwLjg1KScsIHJhZGl1czogbnVtYmVyPSA0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1JlYWR5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWdtZW50czogc3RyaW5nW11bXSA9IFtcbiAgICAgICAgICAgIFsnbm9zZSddLFxuICAgICAgICAgICAgWydsZWZ0U2hvdWxkZXInLCAncmlnaHRTaG91bGRlcicsICdyaWdodEhpcCcsICdsZWZ0SGlwJywgJ2xlZnRTaG91bGRlciddLFxuICAgICAgICAgICAgWydsZWZ0U2hvdWxkZXInLCAnbGVmdEVsYm93JywgJ2xlZnRXcmlzdCddLFxuICAgICAgICAgICAgWydyaWdodFNob3VsZGVyJywgJ3JpZ2h0RWxib3cnLCAncmlnaHRXcmlzdCddXG4gICAgICAgIF07XG5cbiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gY3R4LmZpbGxTdHlsZSA9IHN0eWxlO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRQb3NpdGlvbjogdmVjMiA9IFtOYU4sIE5hTl07XG5cbiAgICAgICAgY29uc3QgcGFydHNSZW5kZXJlZDogc3RyaW5nW10gPSBbXTtcblxuXG4gICAgICAgIHNlZ21lbnRzLmZvckVhY2goKHNlZ21lbnQ6IHN0cmluZ1tdKSA9PiB7XG4gICAgICAgICAgICBpZihzZWdtZW50Lmxlbmd0aCA+IDEpe1xuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgICAgICBzZWdtZW50LmZvckVhY2goKGJvZHlQYXJ0OiBzdHJpbmcsIGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFBhcnRQb3NpdGlvbihib2R5UGFydCwgY3VycmVudFBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0UG9zaXRpb24oY3VycmVudFBvc2l0aW9uLCBjdHguY2FudmFzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oY3VycmVudFBvc2l0aW9uWzBdLCBjdXJyZW50UG9zaXRpb25bMV0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjdXJyZW50UG9zaXRpb25bMF0sIGN1cnJlbnRQb3NpdGlvblsxXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VnbWVudC5mb3JFYWNoKChib2R5UGFydDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYocGFydHNSZW5kZXJlZC5pbmRleE9mKGJvZHlQYXJ0KSAhPT0gLTEpe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UGFydFBvc2l0aW9uKGJvZHlQYXJ0LCBjdXJyZW50UG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdFBvc2l0aW9uKGN1cnJlbnRQb3NpdGlvbiwgY3R4LmNhbnZhcyk7XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgICAgIGN0eC5hcmMoY3VycmVudFBvc2l0aW9uWzBdLCBjdXJyZW50UG9zaXRpb25bMV0sIHJhZGl1cywgMCwgTWF0aC5QSSAqIDIpO1xuICAgICAgICAgICAgICAgIGN0eC5maWxsKCk7XG4gICAgICAgICAgICAgICAgcGFydHNSZW5kZXJlZC5wdXNoKGJvZHlQYXJ0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXNldENlbnRlcigpIHtcbiAgICAgICAgdGhpcy5zb3VyY2VDZW50ZXIgPSBbXG4gICAgICAgICAgICB0aGlzLmNhbnZhcy53aWR0aCAvIDIsXG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5oZWlnaHQgLyAyXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgc2V0Q2VudGVyVG9DdXJyZW50UG9zaXRpb24oKSB7XG4gICAgICAgIHRoaXMuc291cmNlQ2VudGVyID0gdGhpcy5nZXRQYXJ0UG9zaXRpb24odGhpcy5ib2R5UGFydCk7XG4gICAgfVxuXG4gICAgc3RvcCgpe1xuICAgICAgICB0aGlzLl9sb29wLnN0b3AoKTtcbiAgICB9XG5cbiAgICBfZGlkUmVuZGVyKHByb3BzOiBhbnksIGNoYW5nZWQ6IGFueSwgcHJldjogYW55KSB7XG4gICAgICAgIGlmKGNoYW5nZWQgJiYgY2hhbmdlZC5oYXNPd25Qcm9wZXJ0eSgnY29udHJvbHMnKSAmJiBjaGFuZ2VkLmNvbnRyb2xzKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xzID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2FjYy1wb3NlLWlucHV0LWNhbGlicmF0aW9uJyk7XG4gICAgICAgICAgICAgICAgaWYoY29udHJvbHMgJiYgY2FuRm9jdXNIZWFkZXIoY29udHJvbHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzLmZvY3VzSGVhZGVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgMTYpO1xuXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLl9kaWRSZW5kZXIocHJvcHMsIGNoYW5nZWQsIHByZXYpO1xuICAgIH1cblxuICAgIF9yZW5kZXIoeyBhbXBsaWZpY2F0aW9uLCBjb250cm9scywgaGVscCwgaW1hZ2VTY2FsZUZhY3RvciwgcGFydCwgc21vb3RoaW5nIH06YW55KXtcbiAgICAgICAgbGV0IGlzRGFyayA9IGZhbHNlO1xuICAgICAgICAvL2NhbGN1bGF0ZSBpZiBhIGRhcmsgYmFja2dyb3VuZCBpcyBzZXQgYnkgY29tcHV0aW5nIHRoZSBjb2xvciBhbmQgc2VlaW5nIGlmIGl0cyBhdmVyYWdlIGNvbG9yIGlzIG1vcmUgdGhhbiBoYWxmIHdheVxuICAgICAgICBjb25zdCBjb21wdXRlZCA9IGNvbXB1dGVTdHlsZVJlc3VsdCh0aGlzLnNoYWRvd1Jvb3QsICdjb2xvcicsIGJhY2tncm91bmRDb2xvcik7XG4gICAgICAgIGlmKGNvbXB1dGVkKSB7XG4gICAgICAgICAgICBjb25zdCBjb2xvciA9IGNzc0NvbG9yVG9BcnJheShjb21wdXRlZCk7XG4gICAgICAgICAgICBpZihjb2xvcikge1xuICAgICAgICAgICAgICAgIGlzRGFyayA9ICgoY29sb3JbMF0gKyBjb2xvclsxXSArIGNvbG9yWzJdKSAvIDMpIDwgMTI4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9zdEZpeCA9IGlzRGFyayA/ICctZGFyaycgOiAnJztcblxuICAgICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgICAgIDxzdHlsZT5cblxuICAgICAgICAgICAgPC9zdHlsZT5cbiAgICAgICAgICAgIDxhY2MtcG9zZS1pbnB1dC1jYWxpYnJhdGlvblxuICAgICAgICAgICAgICAgIGNsb3NhYmxlXG4gICAgICAgICAgICAgICAgdGFiSW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICBvbi1jZW50ZXI9JHsoKT0+IHRoaXMuc2V0Q2VudGVyVG9DdXJyZW50UG9zaXRpb24oKX1cbiAgICAgICAgICAgICAgICBvbi1yZXNldGNlbnRlcj0keygpPT4gdGhpcy5yZXNldENlbnRlcigpfVxuICAgICAgICAgICAgICAgIGFtcGxpZmljYXRpb249XCIke2FtcGxpZmljYXRpb259XCJcbiAgICAgICAgICAgICAgICBpbWFnZVNjYWxlRmFjdG9yPVwiJHtpbWFnZVNjYWxlRmFjdG9yfVwiXG4gICAgICAgICAgICAgICAgc21vb3RoaW5nPVwiJHtzbW9vdGhpbmd9XCJcbiAgICAgICAgICAgICAgICBwYXJ0cz1cIiR7c2VsZWN0YWJsZVBhcnRzRGlzcGxheX1cIlxuICAgICAgICAgICAgICAgIHBhcnQ9XCIke2tleXBvaW50UGFydHNNYXBbcGFydF19XCJcbiAgICAgICAgICAgICAgICBvcGVuPz0ke2NvbnRyb2xzfVxuICAgICAgICAgICAgICAgIGZ1bGxzY3JlZW5cbiAgICAgICAgICAgICAgICBvbi1jaGFuZ2U9JHsoZXZ0OmFueSk9PntcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmluZFBhcnRJZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgcHJvcCBpbiBrZXlwb2ludFBhcnRzTWFwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoa2V5cG9pbnRQYXJ0c01hcFtwcm9wXSA9PT0gZXZ0LmRldGFpbC5wYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFtcGxpZmljYXRpb24gPSBldnQuZGV0YWlsLmFtcGxpZmljYXRpb247XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYm9keVBhcnQgPSBmaW5kUGFydElkKCk7IC8vZXZ0LmRldGFpbC5wYXJ0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmltYWdlU2NhbGVGYWN0b3IgPSBldnQuZGV0YWlsLmltYWdlU2NhbGVGYWN0b3I7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21vb3RoaW5nID0gZXZ0LmRldGFpbC5zbW9vdGhpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2hDaGFuZ2UoKTtcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIG9uLWhlbHA9JHsoKT0+IHRoaXMuaGVscCA9IHRydWV9XG4gICAgICAgICAgICAgICAgb24tY2xvc2U9JHsoKT0+eyBjb25zb2xlLmxvZyhcIlBPU0UgSU5QVVQgQ09OVFJPTFMgT04gQ0xPU0VcIik7IHRoaXMuY29udHJvbHMgPSBmYWxzZTsgfX1cbiAgICAgICAgICAgICAgICBvbi1jbG9zZS1jbGljaz0keygpPT50aGlzLmNvbnRyb2xzID0gZmFsc2V9PlxuICAgICAgICAgICAgPC9hY2MtcG9zZS1pbnB1dC1jYWxpYnJhdGlvbj5cbiAgICAgICAgICAgIDxhY2MtdHV0b3JpYWxcbiAgICAgICAgICAgICAgICBkYXJrPz0ke2lzRGFya31cbiAgICAgICAgICAgICAgICBjbG9zZWJ1dHRvbj1cIkJhY2sgdG8gc2V0dGluZ3NcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgICAgICAgYXJpYS1hdG9taWM9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBvbi1jbG9zZT0keygpID0+IHRoaXMuaGVscCA9IGZhbHNlfVxuICAgICAgICAgICAgICAgIG9wZW4/PSR7aGVscH0+XG4gICAgICAgICAgICAgICAgPGFjYy1zbGlkZVxuICAgICAgICAgICAgICAgICAgICB2aWRlbz1cIi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hY2MtY29tcG9uZW50cy9jYW1lcmEtdHV0b3JpYWwtMDEke3Bvc3RGaXh9Lm1wNFwiXG4gICAgICAgICAgICAgICAgICAgIGFsdD1cIkFuaW1hdGlvbiBkZW1vbnN0cmF0aW5nIG1vdmluZyB5b3VyIG5vc2UgdG8gY29udHJvbCB0aGUgY3Vyc29yLlwiXG4gICAgICAgICAgICAgICAgICAgIGNhcHRpb249XCJIZXJlJ3MgaG93IHRvIHVzZSB5b3VyIGNhbWVyYS4gQSBibHVlIGRvdCB3aWxsIGZvbGxvdyB0aGUgcG9zaXRpb24gb2YgeW91ciBub3NlLlwiPjwvYWNjLXNsaWRlPlxuICAgICAgICAgICAgICAgIDxhY2Mtc2xpZGVcbiAgICAgICAgICAgICAgICAgICAgdmlkZW89XCIvL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYWNjLWNvbXBvbmVudHMvY2FtZXJhLXR1dG9yaWFsLTAyJHtwb3N0Rml4fS5tcDRcIlxuICAgICAgICAgICAgICAgICAgICBhbHQ9XCJBbmltYXRpb24gc2hvd2luZyBob3cgdG8gdXNlIHRoZSBzbGlkZXIgdG8gYW1wbGlmeSB5b3VyIGN1cnNvcnMgbW92ZW1lbnQuXCJcbiAgICAgICAgICAgICAgICAgICAgY2FwdGlvbj1cIlVzZSB0aGUgc2xpZGVyIHRvIGhlbHAgcmVhY2ggYWxsIHBhcnRzIG9mIHRoZSBzY3JlZW4uIFRoaXMgd29ya3MgYmVzdCBpZiB5b3UncmUgY2VudGVyZWQuXCI+PC9hY2Mtc2xpZGU+XG4gICAgICAgICAgICAgICAgPGFjYy1zbGlkZVxuICAgICAgICAgICAgICAgICAgICB2aWRlbz1cIi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hY2MtY29tcG9uZW50cy9jYW1lcmEtdHV0b3JpYWwtMDMke3Bvc3RGaXh9Lm1wNFwiXG4gICAgICAgICAgICAgICAgICAgIGFsdD1cIkFuaW1hdGlvbiBkZW1vbnN0cmF0aW5nIGhvdyB0aGUgY2VudGVycG9pbnQgd29ya3MgYW5kIGhvdyB0byBtb3ZlIGl0LlwiXG4gICAgICAgICAgICAgICAgICAgIGNhcHRpb249XCJPciwgeW91IGNhbiBtb3ZlIHRoZSBjZW50ZXJwb2ludCB0byB5b3UuXCI+PC9hY2Mtc2xpZGU+XG4gICAgICAgICAgICAgICAgPGFjYy1zbGlkZVxuICAgICAgICAgICAgICAgICAgICB2aWRlbz1cIi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hY2MtY29tcG9uZW50cy9jYW1lcmEtdHV0b3JpYWwtMDQke3Bvc3RGaXh9Lm1wNFwiXG4gICAgICAgICAgICAgICAgICAgIGFsdD1cIkFuaW1hdGlvbiBvZiB1c2luZyB0aGUgcG9wIHVwIGJ1dHRvbiB0byBzZWxlY3QgYSBkaWZmZXJlbnQgYm9keSBwYXJ0IHRvIHRyYWNrLlwiXG4gICAgICAgICAgICAgICAgICAgIGNhcHRpb249XCJZb3UgY2FuIGFsc28gdHJhY2sgZGlmZmVyZW50IHBhcnRzIG9mIHlvdXIgYm9keSwgbGlrZSB5b3VyIHdyaXN0IG9yIHNob3VsZGVyLlwiPjwvYWNjLXNsaWRlPlxuICAgICAgICAgICAgPC9hY2MtdHV0b3JpYWw+XG4gICAgICAgIGA7XG4gICAgfVxuXG4gICAgLy8gX3Nob3VsZFJlbmRlcihwcm9wczogYW55LCBjaGFuZ2VkOiBhbnksIHByZXY6IGFueSkge1xuICAgIC8vICAgICBpZihjaGFuZ2VkICYmIChjaGFuZ2VkLnBhcnQgfHwgY2hhbmdlZC5hbXBsaWZpY2F0aW9uKSkge1xuICAgIC8vICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIC8vICAgICB9XG4gICAgLy8gICAgIHJldHVybiBzdXBlci5fc2hvdWxkUmVuZGVyKHByb3BzLCBjaGFuZ2VkLCBwcmV2KTtcbiAgICAvLyB9XG59XG5cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdhY2MtcG9zZS1pbnB1dCcsIFBvc2VJbnB1dEVsZW1lbnQpO1xuIiwiaW1wb3J0IHsgbGFiZWxTdHlsZUNodW5rIH0gZnJvbSAnLi9zdHlsZXMnO1xuLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbmltcG9ydCBhdXRvYmluZCBmcm9tICdhdXRvYmluZC1kZWNvcmF0b3InO1xuaW1wb3J0IHsgVUlQcm9wZXJ0aWVzIH0gZnJvbSAnLi9hYnN0cmFjdC11aSc7XG5pbXBvcnQgeyBhY2NlbnRDb2xvciwgbGFiZWxDb2xvciB9IGZyb20gJy4vc3R5bGVzJztcbmltcG9ydCB7IEFic3RyYWN0VUlFbGVtZW50IH0gZnJvbSAnLi9hYnN0cmFjdC11aSc7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSAnQHBvbHltZXIvbGl0LWVsZW1lbnQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICcuL2RlY29yYXRvcnMnO1xuXG5jb25zdCBub3JtYWxpemVWYWx1ZSA9IChtaW46bnVtYmVyLCBtYXg6bnVtYmVyLCB2YWx1ZTpudW1iZXIpID0+IHtcbiAgICAvLyBjb25zb2xlLmxvZygnY2FsbGluZyBub3JtYWxpemUgdmFsdWVzIGZvcicsIG5hbWUpO1xuICAgIGxldCBuZXdNaW4gPSAwO1xuICAgIGxldCBuZXdNYXggPSBtYXggLSBtaW47XG4gICAgbGV0IG5ld1ZhbHVlID0gdmFsdWUgLSBtaW47XG5cbiAgICBuZXdWYWx1ZSA9IChuZXdWYWx1ZSoxLjAvbmV3TWF4KTtcbiAgICBuZXdNaW4gPSBuZXdNaW4vbmV3TWF4O1xuICAgIG5ld01heCA9IDE7XG5cbiAgICByZXR1cm4gbmV3VmFsdWU7XG59O1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmFuZ2VQcm9wZXJ0aWVzIGV4dGVuZHMgVUlQcm9wZXJ0aWVzIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgbWluOiBzdHJpbmc7XG4gICAgbWF4OiBzdHJpbmc7XG4gICAgc3RlcDogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogYDxhY2MtcmFuZ2U+YCBlbGVtZW50IGlzIGEgY3VzdG9tIHJhbmdlIC8gc2xpZGVyIGNvbXBvbmVudCB0aGF0IHNpbXBsaWZpZXNcbiAqIGxhYmVsbGluZy5cbiAqXG4gKiBAZXhhbXBsZSBgYGBodG1sXG4gKlxuICogPGFjYy1yYW5nZSBsYWJlbD1cImFtcGxpZmljYXRpb25cIiBtaW49XCIxXCIgbWF4PVwiMTBcIiBzdGVwPVwiMC4xXCIgdmFsdWU9XCIyXCI+PC9hY2MtcmFuZ2U+XG4gKiBgYGBcbiAqL1xuY2xhc3MgUmFuZ2VFbGVtZW50IGV4dGVuZHMgQWJzdHJhY3RVSUVsZW1lbnQge1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gICAgcHVibGljIG5hbWU6c3RyaW5nID0gJyc7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgICBwdWJsaWMgbWluOnN0cmluZyA9ICcwJztcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICAgIHB1YmxpYyBtYXg6c3RyaW5nID0gJzEwMCc7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgICBwdWJsaWMgc3RlcDpzdHJpbmcgPSAnMSc7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgICBwdWJsaWMgdmFsdWU6c3RyaW5nID0gJyc7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pXG4gICAgcHVibGljIGlubGluZUxhYmVsOmJvb2xlYW4gPSBmYWxzZTtcblxuXG4gICAgY2hhbmdlR3JhZGllbnQoZTphbnkpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGUuY3VycmVudFRhcmdldC52YWx1ZTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChlLnR5cGUsIHtcbiAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICBpbnB1dEV2ZW50OiBlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcblxuICAgICAgICAvLyBOb3JtYWxpemUgVmFsdWVzXG4gICAgICAgIGxldCBzbGlkZXJWYWx1ZSA9IHBhcnNlRmxvYXQoZS5jdXJyZW50VGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgbGV0IHZhbCA9IG5vcm1hbGl6ZVZhbHVlKHBhcnNlRmxvYXQodGhpcy5taW4pLCBwYXJzZUZsb2F0KHRoaXMubWF4KSwgc2xpZGVyVmFsdWUpO1xuXG4gICAgICAgIGNvbnN0IHJhbmdlRWwgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLnJhbmdlLXNsaWRlcl9fcmFuZ2UnKSEgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgcmFuZ2VFbC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAnLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgdG9wLCByaWdodCB0b3AsICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGBjb2xvci1zdG9wKCR7dmFsfSwgJHthY2NlbnRDb2xvcn0pLCBgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnY29sb3Itc3RvcCgnICsgdmFsICsgJywgI0Q4RDhEOCknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnKSc7XG4gICAgfVxuXG4gICAgQGF1dG9iaW5kXG4gICAgcHJvdGVjdGVkIF9oYW5kbGVTaG9ydGN1dCgpIHtcbiAgICAgICAgY29uc3QgaW5wdXRFbCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcucmFuZ2Utc2xpZGVyX19yYW5nZScpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZihpbnB1dEVsKSB7XG4gICAgICAgICAgICBpbnB1dEVsLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuX2hhbmRsZVNob3J0Y3V0KCk7XG4gICAgfVxuXG4gICAgX3JlbmRlcih7IGxhYmVsLCBuYW1lLCBtaW4sIG1heCwgc3RlcCwgdmFsdWUgfTogUmFuZ2VQcm9wZXJ0aWVzKXtcblxuICAgICAgICBjb25zdCBbbWluZiwgbWF4ZiwgdmFsdWVmXSA9IFttaW4sIG1heCwgdmFsdWVdLm1hcChwYXJzZUZsb2F0KTtcblxuICAgICAgICBjb25zdCBpbnB1dEh0bWwgPSBodG1sYFxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgaWQ9XCJyYW5nZS1zbGlkZXJcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicmFuZ2Utc2xpZGVyX19yYW5nZVwiXG4gICAgICAgICAgICAgICAgb24taW5wdXQ9JHsoZTphbnkpID0+IHRoaXMuY2hhbmdlR3JhZGllbnQoZSl9XG4gICAgICAgICAgICAgICAgbmFtZT1cIiR7bmFtZX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgICAgICAgICAgICAgbWluPVwiJHttaW59XCJcbiAgICAgICAgICAgICAgICBtYXg9XCIke21heH1cIlxuICAgICAgICAgICAgICAgIHN0ZXA9XCIke3N0ZXB9XCJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZD89XCIke3RoaXMuZGlzYWJsZWR9XCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiJHtuYW1lfVwiXG4gICAgICAgICAgICAgICAgdmFsdWU9XCIke3ZhbHVlfVwiPjwvaW5wdXQ+XG4gICAgICAgIGA7XG5cbiAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgICAgICA8c3R5bGU+XG5cbiAgICAgICAgICAgICR7bGFiZWxTdHlsZUNodW5rKCl9XG5cbiAgICAgICAgICAgIDpob3N0KFtpbmxpbmVdKSwgW2lubGluZV0ge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgOmhvc3QoW2lubGluZV0pIC5yYW5nZS1zbGlkZXIgbGFiZWwsXG4gICAgICAgICAgICA6aG9zdChbaW5saW5lXSkgaW5wdXRbdHlwZT1cInJhbmdlXCJdLFxuICAgICAgICAgICAgKltpbmxpbmVdIC5yYW5nZS1zbGlkZXIgbGFiZWwsXG4gICAgICAgICAgICAqW2lubGluZV0gaW5wdXRbdHlwZT1cInJhbmdlXCJdIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICAgICAgICAgICAgbWF4LXdpZHRoOiA1MCU7XG4gICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgOmhvc3QoW2lubGluZV0pIC5yYW5nZS1zbGlkZXIgbGFiZWwsXG4gICAgICAgICAgICAqW2lubGluZV0gLnJhbmdlLXNsaWRlciBsYWJlbCB7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiA0cHg7XG4gICAgICAgICAgICAgICAgZmxleC1zaHJpbms6IDE7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnB1dFt0eXBlPVwicmFuZ2VcIl17XG4gICAgICAgICAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAgICAgICAgIC1tb3otYXBwZXJhbmNlOiBub25lO1xuICAgICAgICAgICAgICAgIGhlaWdodDogMTlweDtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICBib3JkZXItdG9wOiA4cHggc29saWQgdmFyKC0tYmFja2dyb3VuZC1jb2xvciwgd2hpdGUpO1xuICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDhweCBzb2xpZCB2YXIoLS1iYWNrZ3JvdW5kLWNvbG9yLCB3aGl0ZSk7XG4gICAgICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KFxuICAgICAgICAgICAgICAgICAgICBsaW5lYXIsXG4gICAgICAgICAgICAgICAgICAgIGxlZnQgdG9wLFxuICAgICAgICAgICAgICAgICAgICByaWdodCB0b3AsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yLXN0b3AoJHt2YWx1ZSAhPT0gJycgPyBub3JtYWxpemVWYWx1ZShtaW5mLCBtYXhmLCB2YWx1ZWYpIDogMC41fSwgJHthY2NlbnRDb2xvcn0pLFxuICAgICAgICAgICAgICAgICAgICBjb2xvci1zdG9wKCR7dmFsdWUgIT09ICcnID8gbm9ybWFsaXplVmFsdWUobWluZiwgbWF4ZiwgdmFsdWVmKSA6IDAuNX0sICNEOEQ4RDgpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBtYXJnaW46IDBweDtcbiAgICAgICAgICAgIH1cblxuXG5cbiAgICAgICAgICAgIGlucHV0W3R5cGU9J3JhbmdlJ106Oi13ZWJraXQtc2xpZGVyLXRodW1iIHtcbiAgICAgICAgICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke2FjY2VudENvbG9yfTtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDE4cHg7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDE4cHg7XG4gICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnB1dFt0eXBlPSdyYW5nZSddOjotbW96LXJhbmdlLXRodW1iIHtcbiAgICAgICAgICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke2FjY2VudENvbG9yfTtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDE4cHg7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDE4cHg7XG4gICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5wdXRbdHlwZT0ncmFuZ2UnXTo6LW1vei1yYW5nZS10cmFjayAge1xuICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgIGhlaWdodDogMHB4O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAucmFuZ2Utc2xpZGVyIGxhYmVsIHtcbiAgICAgICAgICAgICAgICBmbG9hdDogbGVmdDtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiAke3RoaXMuaW5saW5lTGFiZWwgPyBcImlubGluZS1ibG9ja1wiIDogXCJibG9ja1wifTtcbiAgICAgICAgICAgICAgICBjb2xvcjogJHtsYWJlbENvbG9yfTtcbiAgICAgICAgICAgICAgICBmbGV4LXNocmluazogYXV0bztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgW2lubGluZV0gI2lucHV0LWNvbnRhaW5lciB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgICAgICAgICAgIGZsZXgtc2hyaW5rOiBhdXRvO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBbaW5saW5lXSBpbnB1dFt0eXBlPVwicmFuZ2VcIl0ge1xuICAgICAgICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDE2cHg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICNpbnB1dC1jb250YWluZXIge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDMwcHg7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiA1cHg7XG4gICAgICAgICAgICAgICAgcGFkZGluZy10b3A6IDFweDtcbiAgICAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDE0cHg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC5yYW5nZS1zbGlkZXJfX3JhbmdlW2Rpc2FibGVkXSB7XG4gICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMC41O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9zdHlsZT5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJhbmdlLXNsaWRlclwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJyYW5nZS1zbGlkZXJcIj4ke2xhYmVsfTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgJHt0aGlzLmlubGluZUxhYmVsID8gaHRtbGA8c3BhbiBpZD1cImlucHV0LWNvbnRhaW5lclwiPiR7aW5wdXRIdG1sfTwvc3Bhbj5gIDogaW5wdXRIdG1sfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIGA7XG5cbiAgICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnYWNjLXJhbmdlJywgUmFuZ2VFbGVtZW50KTsiLCIvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuaW1wb3J0IGF1dG9iaW5kIGZyb20gJ2F1dG9iaW5kLWRlY29yYXRvcic7XG5pbXBvcnQgeyBiYWNrZ3JvdW5kQ29sb3IsIGJvZHlGb250RmFtaWx5LCBsYWJlbENvbG9yIH0gZnJvbSAnLi9zdHlsZXMnO1xuaW1wb3J0IHsgU2VsZWN0YWJsZUVsZW1lbnQsIEFic3RyYWN0U2VsZWN0RWxlbWVudCwgaXNPcHRncm91cEVsZW1lbnQgfSBmcm9tICcuL2Fic3RyYWN0LXNlbGVjdCc7XG5pbXBvcnQgeyBPcHRncm91cEVsZW1lbnQgfSBmcm9tICcuL29wdGdyb3VwJztcblxuaW1wb3J0IHsgaHRtbCB9IGZyb20gJ0Bwb2x5bWVyL2xpdC1lbGVtZW50JztcblxuaW1wb3J0ICcuL29wdGdyb3VwJztcblxuaW50ZXJmYWNlIE9wdGlvbkl0ZW0gZXh0ZW5kcyBTZWxlY3RhYmxlRWxlbWVudCB7XG4gICAgaWNvbj86IHN0cmluZztcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG59XG5cbmNvbnN0IGlzSXRlbSA9IChuOiBhbnkpOiBuIGlzIE9wdGlvbkl0ZW0gPT5cbiAgICBuICYmIHR5cGVvZiBuLmxhYmVsID09PSAnc3RyaW5nJyAmJiB0eXBlb2Ygbi52YWx1ZSAhPT0gJ3VuZGVmaW5lZCc7XG5cbmNvbnN0IHRvT3B0Z3JvdXBUZW1wbGF0ZSA9IChncm91cDogT3B0Z3JvdXBFbGVtZW50KSA9PlxuICAgIGh0bWxgPG9wdGdyb3VwIGxhYmVsPSR7Z3JvdXAubGFiZWx9IGRpc2FibGVkPz0ke2dyb3VwLmRpc2FibGVkfT5cbiAgICAgICAgJHtBcnJheS5mcm9tKGdyb3VwLmNoaWxkcmVuKS5tYXAobm9kZSA9PlxuICAgICAgICAgICAgaXNJdGVtKG5vZGUpID8gdG9PcHRpb25UZW1wbGF0ZShub2RlKSA6ICcnKX1cbiAgICA8L29wdGdyb3VwPmA7XG5cbmNvbnN0IHRvT3B0aW9uVGVtcGxhdGUgPSAobm9kZTogT3B0aW9uSXRlbSkgPT5cbiAgICBodG1sYDxvcHRpb24gdmFsdWU9XCIke25vZGUudmFsdWV9XCIgbGFiZWw9XCIke25vZGUubGFiZWx9XCIgc2VsZWN0ZWQ9XCIke25vZGUuc2VsZWN0ZWR9XCI+JHtub2RlLmxhYmVsfTwvb3B0aW9uPmA7XG5cblxuXG5cbi8qKlxuICogYDxhY2Mtc2VsZWN0PmAgZWxlbWVudCBpcyBzaW1pbGFyIHRvIGEgYDxzZWxlY3Q+YCBlbGVtZW50IHdpdGggYnVpbHQtaW5cbiAqIGxhYmVsbGluZyBhbmQgYXJpYSBhdHRyaWJ1dGVzLlxuICpcbiAqIEBleGFtcGxlIGBgYGh0bWxcbiAqXG4gKiA8YWNjLXNlbGVjdCBsYWJlbD1cIkluc3RydW1lbnRzXCI+XG4gKiAgPGFjYy1vcHRncm91cCBsYWJlbD1cIlN0cmluZ3NcIj5cbiAqICAgICAgPGFjYy1pdGVtIGxhYmVsPVwiZ3VpdGFyXCI+PC9hY2MtaXRlbT5cbiAqICAgICAgPGFjYy1pdGVtIGxhYmVsPVwiY2VsbG9cIj48L2FjYy1pdGVtPlxuICogIDwvYWNjLW9wdGdyb3VwPlxuICogIDxhY2Mtb3B0Z3JvdXAgbGFiZWw9XCJwZXJjdXNzaW9uXCI+XG4gKiAgICAgIDxhY2MtaXRlbSBsYWJlbD1cImRydW1zXCI+PC9hY2MtaXRlbT5cbiAqICAgICAgPGFjYy1pdGVtIGxhYmVsPVwidGFtYm9yaW5lXCI+PC9hY2MtaXRlbT5cbiAqICA8L2FjYy1vcHRncm91cD5cbiAqIDwvYWNjLXNlbGVjdD5cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgU2VsZWN0RWxlbWVudCBleHRlbmRzIEFic3RyYWN0U2VsZWN0RWxlbWVudCAge1xuXG5cbiAgICBnZXQgaXRlbXMoKTogT3B0aW9uSXRlbVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vZGVzIGFzIE9wdGlvbkl0ZW1bXTtcbiAgICB9XG5cbiAgICBnZXQgc2VsZWN0ZWQoKTogT3B0aW9uSXRlbSB7XG4gICAgICAgIHJldHVybiBzdXBlci5zZWxlY3RlZCBhcyBPcHRpb25JdGVtO1xuICAgIH1cblxuICAgIGdldCB2YWx1ZSgpOnN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkID8gdGhpcy5zZWxlY3RlZC52YWx1ZSB8fCB0aGlzLnNlbGVjdGVkLmxhYmVsIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIEBhdXRvYmluZFxuICAgIHByb3RlY3RlZCBfaGFuZGxlU2hvcnRjdXQoKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgc3VwZXIuX2hhbmRsZVNob3J0Y3V0KCk7XG4gICAgfVxuXG5cbiAgICBmb2N1cygpe1xuICAgICAgICBzdXBlci5mb2N1cygpXG4gICAgICAgIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdzZWxlY3QnKS5mb2N1cygpXG4gICAgfVxuXG4gICAgX3JlbmRlcih7IGxhYmVsfTogYW55KSB7XG4gICAgICAgIGNvbnN0IHNJID0gdGhpcy5zZWxlY3RlZEluZGV4O1xuXG4gICAgICAgIC8vYXJlIGFueSBpY29ucyBwcmVzZW50P1xuICAgICAgICBjb25zdCBoYXNJY29ucyA9IHRoaXMuaXRlbXMuc29tZShpdGVtID0+ICEhaXRlbS5pY29uKTtcblxuICAgICAgICAvL2dldCB0aGUgbGFiZWwgb2YgdGhlIGdyb3VwIHRoaXMgbm9kZSBpcyBpblxuICAgICAgICBjb25zdCBnZXRJdGVtR3JvdXBMYWJlbCA9IChub2RlOiBPcHRpb25JdGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoIG5vZGUgJiYgaXNPcHRncm91cEVsZW1lbnQobm9kZS5wYXJlbnRFbGVtZW50KSApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5wYXJlbnRFbGVtZW50LmxhYmVsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGZ1bmN0aW9uIG9uU2VsZWN0SW5wdXQoZTpFdmVudCl7XG5cbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdDogSFRNTFNlbGVjdEVsZW1lbnQgPSB0aGlzO1xuXG4gICAgICAgICAgICBjb25zdCBwcmV2aW91czogc3RyaW5nID0gISFzZWxmLnNlbGVjdGVkICYmIChzZWxmLnNlbGVjdGVkLnZhbHVlIHx8IHNlbGYuc2VsZWN0ZWQubGFiZWwpO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNHcm91cCA9IGdldEl0ZW1Hcm91cExhYmVsKHNlbGYuc2VsZWN0ZWQpO1xuXG4gICAgICAgICAgICBjb25zdCBpc01hdGNoICA9IChpdGVtOiBhbnkpOiBib29sZWFuID0+XG4gICAgICAgICAgICAgICAgaXRlbSAmJiBpdGVtLnZhbHVlID09PSBzZWxlY3QudmFsdWUgJiYgaXRlbS5sYWJlbCA9PT0gc2VsZWN0LnNlbGVjdGVkT3B0aW9uc1swXS5sYWJlbDtcblxuICAgICAgICAgICAgbGV0IGl0ZW0gPSBzZWxmLml0ZW1zW3RoaXMuc2VsZWN0ZWRJbmRleF07XG4gICAgICAgICAgICBpZighaXNNYXRjaChpdGVtKSkge1xuICAgICAgICAgICAgICAgIGZvcihsZXQgaT0wOyBpPHNlbGYuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoaXNNYXRjaChzZWxmLml0ZW1zW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHNlbGYuaXRlbXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKCFpdGVtKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWxlY3RlZCBhbiBpdGVtIHRoYXQgZGlkbnQgZXhpc3QgaW4gbWFwJyk7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgbGV0IHZhbHVlID0gaXRlbS52YWx1ZSB8fCBpdGVtLmxhYmVsO1xuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBnZXRJdGVtR3JvdXBMYWJlbChpdGVtKTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJ3JpZ2h0JykgPT09IDApIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoJ3JpZ2h0JywgJ2xlZnQnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCdsZWZ0JywgJ3JpZ2h0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IHtcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBlLnRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwLFxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyxcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNHcm91cCxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyd0aGlzJyBzY29wZSBpcyB0aGUgc2VsZWN0IGJveFxuICAgICAgICAgICAgc2VsZi5zZWxlY3QoaXRlbSk7XG5cbiAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2NoYW5nZScsIGN1c3RvbUV2ZW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgIDxzdHlsZT5cblxuICAgICAgICAgICAgOmhvc3Qge1xuICAgICAgICAgICAgICAgIHBhZGRpbmc6IDVweDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgOmhvc3Qgc2VsZWN0LCBidXR0b24ge1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA6aG9zdChbaW5saW5lXSkgLnNlbGVjdC1zdHlsZSxcbiAgICAgICAgICAgIDpob3N0KFtpbmxpbmVdKSBsYWJlbCxcbiAgICAgICAgICAgICpbaW5saW5lXSAuc2VsZWN0LXN0eWxlLFxuICAgICAgICAgICAgKltpbmxpbmVdIGxhYmVsIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICAgICAgICAgICAgd2lkdGg6IGF1dG87XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDpob3N0KFtkaXNhYmxlZF0pLFxuICAgICAgICAgICAgYWNjLWljb25bZGlzYWJsZWRdLFxuICAgICAgICAgICAgc2VsZWN0W2Rpc2FibGVkXSB7XG4gICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMC4yNTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgOmhvc3QoW2lubGluZV0pIGxhYmVsLFxuICAgICAgICAgICAgKltpbmxpbmVdIGxhYmVsIHtcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwIDhweCAwIDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDpob3N0KFtpbmxpbmVdKSBzZWxlY3QsXG4gICAgICAgICAgICAqW2lubGluZV0gc2VsZWN0IHtcbiAgICAgICAgICAgICAgICB3aWR0aDogYXV0bztcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogMCAzMHB4IDAgMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgOmhvc3QoW2lubGluZV0pIC5jb250YWluZXIsXG4gICAgICAgICAgICAqW2lubGluZV0gLmNvbnRhaW5lciB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAuY29udGFpbmVyIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxhYmVsIHtcbiAgICAgICAgICAgICAgICBmb250LWZhbWlseTogJHtib2R5Rm9udEZhbWlseX07XG4gICAgICAgICAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICAgICAgICAgIHBhZGRpbmc6IDBweCAwcHggMjBweCAwcHg7XG4gICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgICAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgICAgICAgICAgY29sb3I6ICR7bGFiZWxDb2xvcn07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlbGVjdCB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICAgICAgcGFkZGluZy1yaWdodDogMHB4O1xuICAgICAgICAgICAgICAgIGhlaWdodDogMzBweDtcbiAgICAgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICAgICAgICBmb250LXNpemU6IDE4cHg7XG4gICAgICAgICAgICAgICAgZm9udC1mYW1pbHk6ICR7Ym9keUZvbnRGYW1pbHl9O1xuICAgICAgICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1xuICAgICAgICAgICAgICAgIGNvbG9yOiAke2xhYmVsQ29sb3J9O1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR7YmFja2dyb3VuZENvbG9yfTtcbiAgICAgICAgICAgICAgICAtbW96LWFwcGVhcmFuY2U6bm9uZTsgLyogRmlyZWZveCAqL1xuICAgICAgICAgICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTpub25lOyAvKiBTYWZhcmkgYW5kIENocm9tZSAqL1xuICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U6bm9uZTtcbiAgICAgICAgICAgICAgICBib3JkZXI6IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlbGVjdCBvcHRpb24sICBzZWxlY3Qgb3B0Z3JvdXB7XG4gICAgICAgICAgICAgICAgY29sb3I6IGJsYWNrO1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAuc2VsZWN0LXN0eWxlIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDM0cHg7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke2JhY2tncm91bmRDb2xvcn07XG4gICAgICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXG4gICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAuc2VsZWN0LXN0eWxlOmhvdmVyLFxuICAgICAgICAgICAgLnNlbGVjdC1zdHlsZTpmb2N1cyxcbiAgICAgICAgICAgIC5zZWxlY3Qtc3R5bGU6YWN0aXZlIHtcbiAgICAgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDo6c2xvdHRlZCguaWNvbi1mYWNlKSB7XG4gICAgICAgICAgICAgICAgcGFkZGluZy1yaWdodDogMTdweDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLmljb24tYXJyb3cge1xuICAgICAgICAgICAgICAgIHotaW5kZXg6IDE7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgIHJpZ2h0OiA0cHg7XG4gICAgICAgICAgICAgICAgdG9wOiAzcHg7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogM3B4O1xuICAgICAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAuaWNvbiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICAgICAgICB3aWR0aDogdmFyKC0taWNvbi1zaXplLCAyNXB4KTtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHZhcigtLWljb24tc2l6ZSwgMjVweCk7XG4gICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiAxN3B4O1xuICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZC1zaXplOiAxMDAlIGF1dG87XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICNTaGFwZSB7XG4gICAgICAgICAgICAgICAgZmlsbDogJHtsYWJlbENvbG9yfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9zdHlsZT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNlbGVjdC11aVwiPiR7bGFiZWx9PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Qtc3R5bGVcIj5cbiAgICAgICAgICAgICAgICAkeyBoYXNJY29ucyA/IGh0bWxgXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uXCIgc3R5bGUkPVwiYmFja2dyb3VuZC1pbWFnZTogdXJsKCR7dGhpcy5zZWxlY3RlZCAmJiB0aGlzLnNlbGVjdGVkLmljb259KTsgZGlzcGxheTogJHsgaGFzSWNvbnMgPyAnZmxleCcgOiAnbm9uZSd9XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICBgIDogJydcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBpZD1cInNlbGVjdC11aVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzaWJpbGl0eS1zZWxlY3RvclwiXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPz1cIiR7dGhpcy5kaXNhYmxlZH1cIlxuICAgICAgICAgICAgICAgICAgICBvbi1pbnB1dD1cIiR7b25TZWxlY3RJbnB1dH1cIiBpZD1cInNlbGVjdFwiPlxuICAgICAgICAgICAgICAgICAgICAke0FycmF5LmZyb20odGhpcy5jaGlsZHJlbikubWFwKG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzT3B0Z3JvdXBFbGVtZW50KG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvT3B0Z3JvdXBUZW1wbGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihpc0l0ZW0obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9PcHRpb25UZW1wbGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPGFjYy1pY29uIGRpc2FibGVkPz1cIiR7dGhpcy5kaXNhYmxlZH1cIiBhcmlhLWhpZGRlbj1cInRydWVcIiBpY29uPVwiZG93blwiIGNsYXNzPVwiaWNvbi1hcnJvd1wiPjwvYWNjLWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIGA7XG4gICAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2FjYy1zZWxlY3QnLCBTZWxlY3RFbGVtZW50KTsiLCIvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuaW1wb3J0IHtcbiAgICBhY2NlbnRDb2xvcixcbiAgICBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgYnV0dG9uTGFiZWxDb2xvcixcbiAgICBsYWJlbENvbG9yLFxuICAgIGJ1dHRvbkJhY2tncm91bmRDb2xvcixcbiAgICB0aXRsZUZvbnRGYW1pbHksXG4gICAgb3V0bGluZUJvcmRlckNvbG9yXG59IGZyb20gJy4vc3R5bGVzJztcbmltcG9ydCB7IFVJUHJvcGVydGllcyB9IGZyb20gJy4vYWJzdHJhY3QtdWknO1xuaW1wb3J0IHsgR3JvdXBFbGVtZW50IH0gZnJvbSAnLi9ncm91cCc7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSAnQHBvbHltZXIvbGl0LWVsZW1lbnQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICcuL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgc2V0Qm9vbGVhbkF0dHJpYnV0ZSB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCAnLi9pY29uJ1xuXG5cbmludGVyZmFjZSBQYW5lbFByb3BlcnRpZXMgZXh0ZW5kcyBVSVByb3BlcnRpZXMge1xuICAgIGRpc2FibGVTa2lwVG9Db250ZW50OiBib29sZWFuO1xuICAgIGNsb3NlZDogYm9vbGVhbjtcbn1cblxuXG4vKipcbiAqIGA8YWNjLXNpZGUtcGFuZWwgbGFiZWw9XCJBcHAgTmFtZVwiPmBcbiAqIFRoZSBzaWRlIHBhbmVsIGVsZW1lbnQgaXMgYSBjb2xsYXBzYWJsZSBtZW51IHRoYXQgaG91c2VzIFVJIGVsZW1lbnRzLiBJdFxuICogc2ltcGxpZmllcyB0YWIgbWFuYWdlbWVudCwgaGVhZGluZyBzdHJ1Y3R1cmUgYW5kIHByb3ZpZGVzIGEgXCJza2lwIHRvIGNvbnRlbnRcIlxuICogbGluayB3aGVuIG5hdmlnYXRlZCB3aXRoIGtleWJvYXJkLlxuICpcbiAqIEBleGFtcGxlIGBgYGh0bWxcbiAqXG4gKiA8YWNjLXNpZGUtcGFuZWwgbGFiZWw9XCJBcHAgTmFtZVwiPlxuICogIDxhY2MtZ3JvdXAgbGFiZWw9XCJHcm91cCAxXCI+XG4gKiAgICAgIDxhY2MtcmFuZ2UgbGFiZWw9XCJTbGlkZXJcIiB2YWx1ZT1cIjVcIiBtYXg9XCIxMFwiPjwvYWNjLXJhbmdlPlxuICogICAgICA8YWNjLWJ1dHRvbiBsYWJlbD1cIkJ1dHRvblwiPjwvYWNjLWJ1dHRvbj5cbiAqICA8L2FjYy1ncm91cD5cbiAqIDwvYWNjLXNpZGUtcGFuZWw+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFNpZGVQYW5lbCBleHRlbmRzIEdyb3VwRWxlbWVudCB7XG5cbiAgICAvKipcbiAgICAgKiBza2lwIHRvIGNvbnRlbnQgc2hvd3MgdXAgaW4gdGhlIHRhYiBvcmRlciBvZiB0aGUgc2lkZSBwYW5lbFxuICAgICAqIGFuZCBlbWl0cyB0aGUgJ3NraXB0b2NvbnRlbnQnIGV2ZW50LiBTZXR0aW5nIHRoaXMgdG8gdHJ1ZSwgaGlkZXMgaXRcbiAgICAgKi9cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pXG4gICAgcHVibGljIGRpc2FibGVTa2lwVG9Db250ZW50OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBpcyB0aGUgc2lkZSBwYW5lbCBpbiBpdHMgY29sbGFwc2VkIHN0YXRlXG4gICAgICovXG4gICAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KVxuICAgIHB1YmxpYyBjbG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuXG4gICAgZm9jdXMoKXtcbiAgICAgICAgLy93aGVuIGZvY3VzZWQsIG1vdmUgZm9jdXMgdG8gdGhlIG1haW4gaGVhZGVyXG4gICAgICAgIHN1cGVyLmZvY3VzKCk7XG4gICAgICAgIGNvbnN0IGgxID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2gxJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChoMSkge1xuICAgICAgICAgICAgaDEuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9kaWRSZW5kZXIocHJvcHM6IGFueSwgY2hhbmdlZDogYW55LCBwcmV2OiBhbnkpIHtcbiAgICAgICAgaWYoY2hhbmdlZCAmJiBjaGFuZ2VkLmhhc093blByb3BlcnR5KCdjbG9zZWQnKSkge1xuICAgICAgICAgICAgLy9pZiBpdCB3YXMganVzdCBjbG9zZWQgZm9jdXMgdGhlIG9wZW4gYnV0dG9uXG4gICAgICAgICAgICAvL2lmIGl0IHdhcyBqdXN0IG9wZW5lZCBmb2N1cyB0aGUgY2xvc2UgYnV0dG9uXG4gICAgICAgICAgICBjb25zdCBidXR0b24gPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvciggcHJvcHMuY2xvc2VkID8gJy5vcGVuLWJ1dHRvbicgOiAnLmNsb3NlLWJ1dHRvbicpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgaWYoYnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgYnV0dG9uLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLl9kaWRSZW5kZXIocHJvcHMsIGNoYW5nZWQsIHByZXYpO1xuICAgIH1cblxuICAgIF9wcm9wZXJ0aWVzQ2hhbmdlZChwcm9wczogUGFuZWxQcm9wZXJ0aWVzLCBjaGFuZ2VkOiBhbnksIHByZXY6IGFueSkge1xuICAgICAgICBpZighY2hhbmdlZCB8fCAhcHJldikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNldEJvb2xlYW5BdHRyaWJ1dGUodGhpcywgJ2Nsb3NlZCcsIHByb3BzLmNsb3NlZCk7XG4gICAgICAgIGlmKHByb3BzLmNsb3NlZCAhPT0gcHJldi5jbG9zZWQpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQocHJvcHMuY2xvc2VkID8gJ2Nsb3NlJyA6ICdvcGVuJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdyZXNpemUnLCB7IGJ1YmJsZXM6dHJ1ZSB9KSk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5fcHJvcGVydGllc0NoYW5nZWQocHJvcHMsIGNoYW5nZWQsIHByZXYpO1xuICAgIH1cblxuICAgIF9yZW5kZXIoeyBsYWJlbCwgZGlzYWJsZVNraXBUb0NvbnRlbnQgfTogUGFuZWxQcm9wZXJ0aWVzKXtcbiAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgICAgICA8c3R5bGU+XG4gICAgICAgICAgICAgICAgOmhvc3Qge1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgICAgIHRvcDogMDtcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogMDtcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICR7YnV0dG9uTGFiZWxDb2xvcn07XG4gICAgICAgICAgICAgICAgICAgIHotaW5kZXg6IDI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLmNvbnRhaW5lciB7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogY2FsYygxMDB2aCAtIDk1cHgpO1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMzAwcHg7XG4gICAgICAgICAgICAgICAgICAgIG1pbi1oZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR7YmFja2dyb3VuZENvbG9yfTtcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICR7b3V0bGluZUJvcmRlckNvbG9yfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA6aG9zdChbY2xvc2VkXSkgLmNvbnRhaW5lciB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgOmhvc3QoW2Nsb3NlZF0pIC5vcGVuLWJ1dHRvbiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA6aG9zdChbY2xvc2VkXSkgLmNvbnRhaW5lciB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgOmhvc3Q6OmJlZm9yZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOiAxMTBweDtcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogJyc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgI3NpZGUtcGFuZWwtbmF2IHtcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZy10b3A6IDI0cHg7XG4gICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICBoZWFkZXIge1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAke2JhY2tncm91bmRDb2xvcn07XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke291dGxpbmVCb3JkZXJDb2xvcn07XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICR7b3V0bGluZUJvcmRlckNvbG9yfTtcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICR7bGFiZWxDb2xvcn07XG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDQwcHggMjRweCA0MHB4O1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRvcDogMDtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDI1MnB4O1xuICAgICAgICAgICAgICAgICAgICB6LWluZGV4OiAyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGgxIHtcbiAgICAgICAgICAgICAgICAgICAgZm9udC1mYW1pbHk6ICR7dGl0bGVGb250RmFtaWx5fTtcbiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAyNnB4O1xuICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLmNsb3NlLWJ1dHRvbiB7XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAzMHB4O1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogNDhweDtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiA0OHB4O1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgICAgIHRvcDogNTAlO1xuICAgICAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICAgICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC5za2lwLXRvLWNvbnRlbnQge1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDFweDtcbiAgICAgICAgICAgICAgICAgICAgY2xpcDogcmVjdCgxcHgsIDFweCwgMXB4LCAxcHgpO1xuICAgICAgICAgICAgICAgICAgICBjb2xvcjogJHthY2NlbnRDb2xvcn07XG4gICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMXB4O1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgICAgIHRvcDogMDtcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogLTEwMHB4O1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iYWNrZ3JvdW5kLWNvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtvdXRsaW5lQm9yZGVyQ29sb3J9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC5za2lwLXRvLWNvbnRlbnQ6Zm9jdXMsIC5za2lwLXRvLWNvbnRlbnQuZGVidWcge1xuICAgICAgICAgICAgICAgICAgICBjbGlwOiBhdXRvO1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDM1cHg7XG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiA1MCU7XG4gICAgICAgICAgICAgICAgICAgIHotaW5kZXg6IDIwO1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgICAgIHRvcDogMTAwcHg7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IDI1JTtcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHtidXR0b25CYWNrZ3JvdW5kQ29sb3J9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC5vcGVuLWJ1dHRvbiB7XG4gICAgICAgICAgICAgICAgICAgIC0tbWFyZ2luOiAxNnB4O1xuICAgICAgICAgICAgICAgICAgICAtLWJ1dHRvbi13aWR0aDogNjBweDtcbiAgICAgICAgICAgICAgICAgICAgLS1idXR0b24taGVpZ2h0OiA0MHB4O1xuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgICAgIHRvcDogdmFyKC0tbWFyZ2luKTtcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogdmFyKC0tbWFyZ2luKTtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHZhcigtLWJ1dHRvbi13aWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogdmFyKC0tYnV0dG9uLWhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR7YnV0dG9uQmFja2dyb3VuZENvbG9yfTtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtvdXRsaW5lQm9yZGVyQ29sb3J9O1xuICAgICAgICAgICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC5vcGVuLWJ1dHRvbiBzdmcge1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgICAgICAgICAgIHRvcDogNHB4O1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMjhweDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhY2MtYnV0dG9uIHtcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPC9zdHlsZT5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cIm9wZW4tYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiT3BlbiBNZW51XCJcbiAgICAgICAgICAgICAgICBvbi1jbGljaz0keygpPT4gdGhpcy5jbG9zZWQgPSBmYWxzZX0+XG4gICAgICAgICAgICAgICAgPGFjYy1pY29uIGljb249XCJtZW51XCI+PC9hY2MtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY29udGFpbmVyXCIgcm9sZT1cIm1lbnViYXJcIiBhcmlhLWxhYmVsPVwibGVmdCBzaWRlIHBhbmVsXCI+XG4gICAgICAgICAgICAgICAgPGhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPGgxIHRhYmluZGV4PVwiLTFcIj4ke2xhYmVsfTwvaDE+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xvc2UtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uLWNsaWNrPSR7KCkgPT4gISh0aGlzLmNsb3NlZCA9IHRydWUpfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNvbGxhcHNlIG1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhY2MtaWNvbiBpY29uPVwiY2xvc2VcIj48L2FjYy1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTa2lwIHRvIGNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJza2lwLXRvLWNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNTAlO1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBvbi1jbGljaz0keygpPT4gIWRpc2FibGVTa2lwVG9Db250ZW50ICYmIHRoaXMuc2tpcFRvQ29udGVudCgpfT5Ta2lwIHRvIENvbnRlbnQ8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2hlYWRlcj5cbiAgICAgICAgICAgICAgICA8bmF2IGlkPVwic2lkZS1wYW5lbC1uYXZcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgICAgICAgICAgIDwvbmF2PlxuICAgICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICBgO1xuICAgIH1cblxuXG4gICAgcHVibGljIHNraXBUb0NvbnRlbnQoKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3NraXB0b2NvbnRlbnQnLCB7IGJ1YmJsZXM6IHRydWUgfSkpXG4gICAgfVxufVxuXG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnYWNjLXNpZGUtcGFuZWwnLCBTaWRlUGFuZWwpOyIsIi8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG5pbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnQHBvbHltZXIvbGl0LWVsZW1lbnQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICcuL2RlY29yYXRvcnMnO1xuXG5cbi8qKlxuICogQSBgPGFjYy1zbGlkZT5gIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZGF0YSBvZiBhIHNsaWRlIHdpdGhpbiBhIHNsaWRlc2hvdyxcbiAqIFRoZSBwYXJlbnQgZWxlbWVudCByZW5kZXJzIHRoaXMgaXRlbSBpbnRvIGl0cyBzaGFkb3ctZG9tLlxuICpcbiAqIEBleGFtcGxlIGBgYGh0bWxcbiAqXG4gKiA8YWNjLXNsaWRlIGNhcHRpb249XCJDYXB0aW9uXCIgWyBpbWFnZT1cIlwiIHZpZGVvPVwiXCJdPlxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBTbGlkZUVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICAgIHB1YmxpYyB2aWRlbzpzdHJpbmcgPSAnJztcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICAgIHB1YmxpYyBpbWFnZTpzdHJpbmcgPSAnJztcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICAgIHB1YmxpYyBjYXB0aW9uOnN0cmluZyA9ICcnO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gICAgcHVibGljIGFsdDpzdHJpbmcgPSAnJztcblxuICAgIF9wcm9wZXJ0aWVzQ2hhbmdlZChwcm9wczogYW55LCBjaGFuZ2VkOiBhbnksIHByZXY6IGFueSkge1xuICAgICAgICBpZiAocHJvcHMuYWx0ID09PSAnJyl7XG4gICAgICAgIFx0Y29uc29sZS53YXJuKCdzbGlkZSBpbWFnZSBuZWVkcyBhbHQgdGV4dCcpXG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuX3Byb3BlcnRpZXNDaGFuZ2VkKHByb3BzLCBjaGFuZ2VkLCBwcmV2KTtcbiAgICB9XG5cbiAgICBfcmVuZGVyKF9wcm9wczpvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gICAgfVxuXG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnYWNjLXNsaWRlJywgU2xpZGVFbGVtZW50KTsiLCIvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ0Bwb2x5bWVyL2xpdC1lbGVtZW50JztcbmltcG9ydCB7IGFjY2VudENvbG9yLCBsYWJlbENvbG9yLCBvdXRsaW5lQm9yZGVyQ29sb3IsIGJvZHlGb250RmFtaWx5IH0gZnJvbSBcIi4vc3R5bGVzXCI7XG5jb25zdCB7IEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIgfSA9IHJlcXVpcmUoJ0Bwb2x5bWVyL3BvbHltZXIvbGliL3V0aWxzL2ZsYXR0ZW5lZC1ub2Rlcy1vYnNlcnZlci5qcycpO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICcuL2RlY29yYXRvcnMnO1xuXG5pbnRlcmZhY2UgTm9kZU9ic2VydmF0aW9uIHtcbiAgICBhZGRlZE5vZGVzOkVsZW1lbnRbXTtcbiAgICByZW1vdmVkTm9kZXM6RWxlbWVudFtdO1xufVxuXG5pbnRlcmZhY2UgTm9kZU9ic2VydmVyIHtcbiAgICBjb25uZWN0OiAoKT0+IHZvaWQ7XG4gICAgZGlzY29ubmVjdDogKCk9PiB2b2lkO1xuICAgIGZsdXNoOiAoKT0+IHZvaWQ7XG59XG5cbmludGVyZmFjZSBTbGlkZSB7XG4gICAgdmlkZW86IHN0cmluZztcbiAgICBpbWFnZTogc3RyaW5nO1xuICAgIGNhcHRpb246IHN0cmluZztcbiAgICBhbHQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGA8YWNjLXNsaWRlc2hvdz5gIGVsZW1lbnQgcmVwcmVzZW50cyBhIHZpZXcgY29tcHJpc2VkIG9mIGA8YWNjLXNsaWRlPmBcbiAqIGVsZW1lbnRzIHdpdGggbGluZWFyIG5leHQgLyBwcmV2aW91cyBuYXZpZ2F0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgU2xpZGVzaG93RWxlbWVudCBleHRlbmRzIExpdEVsZW1lbnQge1xuXG4gICAgcHJpdmF0ZSBzbGlkZXM6U2xpZGVbXSA9IFtdO1xuICAgIHByaXZhdGUgY3VycmVudFNsaWRlOlNsaWRlO1xuICAgIHByaXZhdGUgX19ub2Rlc09ic2VydmVyOiBOb2RlT2JzZXJ2ZXI7XG4gICAgcHJpdmF0ZSBkb0ZhZGVJbjpib29sZWFuO1xuICAgIHByaXZhdGUgZG9GYWRlT3V0OmJvb2xlYW47XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgICBwdWJsaWMgY2xvc2VCdXR0b246IHN0cmluZyA9ICdTdGFydCBQbGF5aW5nJztcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICAgIHB1YmxpYyBjYXB0aW9uOiBzdHJpbmcgPSAnJztcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICAgIHB1YmxpYyB2aWRlbzogc3RyaW5nID0gJyc7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgICBwdWJsaWMgYWx0OiBzdHJpbmcgPSAnJztcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSlcbiAgICBwdWJsaWMgdHJhbnNpdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG5cbiAgICBnZXQgbmV4dFNsaWRlKCkge1xuICAgICAgICBsZXQgY3VycmVudEluZGV4ID0gdGhpcy5zbGlkZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRTbGlkZSk7XG4gICAgICAgIGN1cnJlbnRJbmRleCsrO1xuICAgICAgICByZXR1cm4gY3VycmVudEluZGV4O1xuICAgICAgICAvLyBjdXJyZW50SW5kZXggPSAoY3VycmVudEluZGV4ID4gdGhpcy5zbGlkZXMubGVuZ3RoIC0gMSkgPyAwIDogY3VycmVudEluZGV4O1xuICAgICAgICAvLyByZXR1cm4gY3VycmVudEluZGV4O1xuICAgIH1cblxuICAgIGdldCBwcmV2U2xpZGUoKSB7XG4gICAgICAgIGxldCBjdXJyZW50SW5kZXggPSB0aGlzLnNsaWRlcy5pbmRleE9mKHRoaXMuY3VycmVudFNsaWRlKTtcbiAgICAgICAgY3VycmVudEluZGV4LS07XG4gICAgICAgIHJldHVybiBjdXJyZW50SW5kZXg7XG4gICAgICAgIC8vIGN1cnJlbnRJbmRleCA9IChjdXJyZW50SW5kZXggPCAwKSA/IHRoaXMuc2xpZGVzLmxlbmd0aCAtIDEgOiBjdXJyZW50SW5kZXg7XG4gICAgICAgIC8vIHJldHVybiBjdXJyZW50SW5kZXg7XG4gICAgfVxuXG4gICAgc2V0IGN1cnJlbnRTbGlkZUlkKGlkOm51bWJlcikge1xuICAgICAgICBjb25zdCBzbGlkZSA9IHRoaXMuc2xpZGVzW2lkXTtcblxuICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSB0cnVlXG4gICAgICAgIHRoaXMuY3VycmVudFNsaWRlID0gc2xpZGVcbiAgICAgICAgdGhpcy5jYXB0aW9uID0gJydcbiAgICAgICAgdGhpcy5hbHQgPSAnJ1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZmFsc2VcbiAgICAgICAgICAgIHRoaXMuYWx0ID0gc2xpZGUuYWx0O1xuICAgICAgICAgICAgdGhpcy5jYXB0aW9uID0gc2xpZGUuY2FwdGlvbjtcbiAgICAgICAgICAgIHRoaXMudmlkZW8gPSBzbGlkZS52aWRlbztcbiAgICAgICAgfSwgMjUwKVxuICAgIH1cblxuICAgIGdldCBjdXJyZW50U2xpZGVJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xpZGVzLmluZGV4T2YodGhpcy5jdXJyZW50U2xpZGUpO1xuICAgIH1cblxuICAgIF9jbGlja0hhbmRsZXIoZXZlbnQ6TW91c2VFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG5cbiAgICBfbmF2aWdhdGUoZXZlbnQ6TW91c2VFdmVudCkge1xuICAgICAgICBjb25zdCBsaW5rOmFueSA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgdGhpcy5jdXJyZW50U2xpZGVJZCA9IGxpbmsuZ2V0QXR0cmlidXRlKCdkYXRhLXNsaWRlJyk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcblxuICAgIGNvbm5lY3RlZENhbGxiYWNrKCl7XG4gICAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICAgIHRoaXMuX19ub2Rlc09ic2VydmVyID0gbmV3IEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIodGhpcywgdGhpcy5faGFuZGxlTm9kZXNPYnNlcnZlclVwZGF0ZSk7XG4gICAgfVxuXG4gICAgLypmb2N1cygpe1xuICAgICAgICBzdXBlci5mb2N1cygpXG4gICAgICAgIGNvbnN0IHNsaWRlQ29udGFpbmVyID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJy5zbGlkZXNob3ctY29udGFpbmVyJykgYXMgSFRNTEVsZW1lbnRcbiAgICAgICAgaWYgKHNsaWRlQ29udGFpbmVyKXtcbiAgICAgICAgICAgIHNsaWRlQ29udGFpbmVyLmZvY3VzKClcbiAgICAgICAgfVxuICAgIH0qL1xuXG4gICAgX2hhbmRsZU5vZGVzT2JzZXJ2ZXJVcGRhdGUoaW5mbzogTm9kZU9ic2VydmF0aW9uKSB7XG4gICAgICAgIGluZm8uYWRkZWROb2Rlcy5mb3JFYWNoKChub2RlOmFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKG5vZGUudGFnTmFtZSA9PT0gJ0FDQy1TTElERScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNsaWRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IG5vZGUuaW1hZ2UsXG4gICAgICAgICAgICAgICAgICAgIHZpZGVvOiBub2RlLnZpZGVvLFxuICAgICAgICAgICAgICAgICAgICBjYXB0aW9uOiBub2RlLmNhcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIGFsdDogbm9kZS5hbHQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmN1cnJlbnRTbGlkZSA9IHRoaXMuc2xpZGVzWzBdXG4gICAgICAgIC8vbG9vayBhdCBpbml0aWFsIHNsaWRlOlxuICAgICAgICB0aGlzLmN1cnJlbnRTbGlkZUlkID0gMDtcbiAgICAgICAgdGhpcy5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgfVxuXG4gICAgX25leHRTbGlkZSgpe1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCduZXh0LXNsaWRlJywge2J1YmJsZXMgOiB0cnVlLCBjb21wb3NlZCA6IHRydWV9KSk7XG4gICAgICAgIHRoaXMuY3VycmVudFNsaWRlSWQgPSB0aGlzLm5leHRTbGlkZVxuICAgIH1cblxuICAgIF9wcmV2aW91c1NsaWRlKCl7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3ByZXZpb3VzLXNsaWRlJywge2J1YmJsZXMgOiB0cnVlLCBjb21wb3NlZCA6IHRydWV9KSk7XG4gICAgICAgIHRoaXMuY3VycmVudFNsaWRlSWQgPSB0aGlzLnByZXZTbGlkZVxuICAgIH1cblxuICAgIC8qX2RpZFJlbmRlcihwcm9wczphbnksIGNoYW5nZWQ6YW55LCBwcmV2OmFueSl7XG4gICAgICAgIGNvbnN0IGNhcHRpb24gPSB0aGlzLmN1cnJlbnRTbGlkZSA/IHRoaXMuY3VycmVudFNsaWRlLmNhcHRpb24gOiAnJ1xuICAgICAgICBjb25zdCBhbHQgPSB0aGlzLmN1cnJlbnRTbGlkZSA/IHRoaXMuY3VycmVudFNsaWRlLmFsdCA6ICcnXG4gICAgICAgIHN1cGVyLl9kaWRSZW5kZXIocHJvcHMsIGNoYW5nZWQsIHByZXYpO1xuICAgIH0qL1xuXG4gICAgX3JlbmRlcigpIHtcblxuICAgICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgICAgIDxzdHlsZT5cblxuICAgICAgICAgICAgICAgIC5zbGlkZXNob3ctY29udGFpbmVyIHtcbiAgICAgICAgICAgICAgICAgICAgZm9udC1mYW1pbHk6ICR7Ym9keUZvbnRGYW1pbHl9O1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iYWNrZ3JvdW5kLWNvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLnNsaWRlcyB7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiA0MDBweDtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjI1cyBlYXNlLW91dDtcbiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA6IDE7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJ1dHRvbltkaXNhYmxlZF17XG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuMjU7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGltZywgdmlkZW8ge1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAzMDBweDtcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogNDBweDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE4cHg7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiAke2xhYmVsQ29sb3J9O1xuICAgICAgICAgICAgICAgICAgICBtYXgtd2lkdGg6IDcwJTtcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiAwcHggYXV0bztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB1bCB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgICAgICBtYXJnaW4tdG9wOiAzMHB4O1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDMwcHg7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGkge1xuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDVweDtcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsaSBidXR0b24ge1xuICAgICAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMDtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAwO1xuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiA1cHg7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICR7b3V0bGluZUJvcmRlckNvbG9yfTtcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxpIGJ1dHRvbi5jdXJyZW50IHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJHthY2NlbnRDb2xvcn07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLm5hdi1hcnJvdyB7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgICAgICAgICAgdG9wOiAzNTBweDtcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiAwcHg7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgICAgIHotaW5kZXg6IDI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLm5hdi1hcnJvdy1wcmV2aW91cyB7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IDBweDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAubmF2LWFycm93LW5leHQge1xuICAgICAgICAgICAgICAgICAgICByaWdodDogMHB4O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICNzbGlkZXNob3ctc3RhcnQtYnV0dG9ue1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTUwcHg7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICR7YWNjZW50Q29sb3J9O1xuICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE4cHg7XG4gICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAke2JvZHlGb250RmFtaWx5fTtcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDQwcHggYXV0byAxMHB4O1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAjYWx0LXRleHQsICNsaXZlLWNhcHRpb257XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogMHB4O1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8L3N0eWxlPlxuICAgICAgICAgICAgPGRpdiBhcmlhLWxhYmVsJD1cIkNhcm91c2VsLiAke3RoaXMuc2xpZGVzLmxlbmd0aC50b1N0cmluZygpfSBTbGlkZXNcIiBjbGFzcz1cInNsaWRlc2hvdy1jb250YWluZXJcIj5cblxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJuYXYtYXJyb3cgbmF2LWFycm93LXByZXZpb3VzXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlByZXZpb3VzIHNsaWRlXCJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ/PSR7dGhpcy5wcmV2U2xpZGUgPCAwfVxuICAgICAgICAgICAgICAgICAgICBvbi1jbGljaz1cIiR7dGhpcy5fcHJldmlvdXNTbGlkZS5iaW5kKHRoaXMpfVwiPlxuICAgICAgICAgICAgICAgICAgICA8YWNjLWljb24gaWNvbj1cInByZXZpb3VzXCI+PC9hY2MtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbGlkZXNcIiBzdHlsZT1cIm9wYWNpdHk6JHt0aGlzLnRyYW5zaXRpb24/JzAnOicxJ31cIiBhcmlhLWxhYmVsPVwiU2xpZGUgQ29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nIGlkPVwiYWx0LXRleHRcIiBhbHQkPVwiJHt0aGlzLmFsdH1cIlwiIHNyYz1cIlwiPlxuICAgICAgICAgICAgICAgICAgICA8dmlkZW8gYXJpYS1oaWRkZW49XCJ0cnVlXCIgc3JjJD1cIiR7dGhpcy52aWRlb31cIiBwbGF5c2lubGluZSBtdXRlZCBhdXRvcGxheT48L3ZpZGVvPlxuICAgICAgICAgICAgICAgICAgICA8cCBpZD1cImNhcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtYXRvbWljPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLXJlbGV2YW50PVwidGV4dFwiPiR7dGhpcy5jYXB0aW9ufTwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJuYXYtYXJyb3cgbmF2LWFycm93LW5leHRcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiTmV4dCBzbGlkZVwiXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPz0ke3RoaXMubmV4dFNsaWRlID4gdGhpcy5zbGlkZXMubGVuZ3RoLTF9XG4gICAgICAgICAgICAgICAgICAgIG9uLWNsaWNrPVwiJHt0aGlzLl9uZXh0U2xpZGUuYmluZCh0aGlzKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGFjYy1pY29uIGljb249XCJuZXh0XCI+PC9hY2MtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgIDx1bD5cbiAgICAgICAgICAgICAgICAgICAgJHt0aGlzLnNsaWRlcyAmJiB0aGlzLnNsaWRlcy5tYXAoKHM6U2xpZGUsIGluZGV4KT0+e1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbCBgXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbi1jbGljaz1cIiR7KGU6TW91c2VFdmVudCkgPT4gdGhpcy5fbmF2aWdhdGUoZSl9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1zbGlkZSQ9XCIke2luZGV4fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzJD1cIiR7KHRoaXMuY3VycmVudFNsaWRlSWQgPT09IGluZGV4KSA/ICdjdXJyZW50JyA6ICcnfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWwkPVwiSnVtcCB0byBzbGlkZSAkeyhpbmRleCsxKS50b1N0cmluZygpfVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgPC91bD5cblxuXG4gICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJzbGlkZXNob3ctc3RhcnQtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgb24tY2xpY2s9XCIkeygpID0+IHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2Nsb3NlJywge2J1YmJsZXMgOiB0cnVlLCBjb21wb3NlZCA6IHRydWV9KSl9XCI+XG4gICAgICAgICAgICAgICAgICAgICR7dGhpcy5jbG9zZUJ1dHRvbn1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgYDtcbiAgICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnYWNjLXNsaWRlc2hvdycsIFNsaWRlc2hvd0VsZW1lbnQpOyIsIi8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG5pbXBvcnQgYXV0b2JpbmQgZnJvbSAnYXV0b2JpbmQtZGVjb3JhdG9yJztcbmltcG9ydCB7IGFjY2VudENvbG9yLCBsYWJlbENvbG9yLCBiYWNrZ3JvdW5kQ29sb3IgfSBmcm9tICcuL3N0eWxlcyc7XG5pbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnQHBvbHltZXIvbGl0LWVsZW1lbnQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICcuL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgQWJzdHJhY3RNb2RhbEVsZW1lbnQgfSBmcm9tICcuL2Fic3RyYWN0LW1vZGFsJztcbmltcG9ydCB7IHNldEJvb2xlYW5BdHRyaWJ1dGUgfSBmcm9tICcuLi91dGlscyc7XG5cblxuXG4vKipcbiAqIEFuIGA8YWNjLXNuYWNrYmFyPmAgZWxlbWVudCBpcyBmbG9hdGluZyBlbGVtZW50IGludGVuZGVkIGZvciB0ZW1wb3JhcnkgVUlcbiAqIG5vdGlmaWNhdGlvbnMuIEdlbmVyYWxseSB0aGVyZSBpcyBvbmUgaW5zdGFuY2UgcGVyIGFwcGxpY2F0aW9uLiBJZiB5b3UgYWRkXG4gKiBhcmlhLWxpdmU9XCJwb2xpdGVcIiB0byB0aGUgZWxlbWVudCBpbiB5b3VyIEhUTUwgaXQgd2lsbCB3b3JrIGFzIGFcbiAqIExpdmUgUmVnaW9uIGZvciBBY2Nlc3NpYmlsaXR5IHRvb2xzLlxuICpcbiAqIEBleGFtcGxlIGBgYGh0bWxcbiAqXG4gKiA8YWNjLXNuYWNrYmFyIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGR1cmF0aW9uPVwiNVwiIGRpc21pc3NhYmxlPlRoaXMgd2lsbCBnZXQgcmVhZFxuICogb3V0IGxvdWQgYnkgc2NyZWVuIHJlYWRlcnMgd2hlbmV2ZXIgaXQgY2hhbmdlczwvYWNjLXNuYWNrYmFyPlxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBTbmFja0JhckVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcblxuICAgIC8qKlxuICAgICAqIGR1cmF0aW9uIChpbiBzZWNvbmRzKSB0byBzdGF5IHZpc2libGUgYWZ0ZXIgbWVzc2FnZSBjaGFuZ2VzLFxuICAgICAqIGlmIDAsIHN0YXlzIHZpc2libGUgaW5kZWZpbml0ZWx5IG9yIHVudGlsIGRpc21pc3NlZFxuICAgICAqL1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciB9KVxuICAgIHB1YmxpYyBkdXJhdGlvbjpudW1iZXIgPSA0O1xuXG4gICAgLyoqXG4gICAgICogaWYgdHJ1ZSwgc2hvd3MgYSBcIkRJU01JU1NcIiBidXR0b24gdG8gY2xvc2VcbiAgICAgKi9cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pXG4gICAgcHVibGljIGRpc21pc3NhYmxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBpZiB0cnVlLCBzbmFja2JhciB3aWxsIGJlIHN0eWxlZCBhcyBhbiBhbGVydFxuICAgICAqL1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSlcbiAgICBwdWJsaWMgZXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHByaXZhdGUgX19sYXN0TWVzc2FnZUNoYW5nZTpudW1iZXI7XG4gICAgcHJpdmF0ZSBfX3ByZXZpb3VzRm9jdXM6SFRNTEVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBfX3Nsb3Q6SFRNTEVsZW1lbnQ7XG5cbiAgICBwdWJsaWMgZ2V0IG9wZW4oKSA6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoJ29wZW4nKTtcbiAgICB9XG5cblxuICAgIEBhdXRvYmluZFxuICAgIHByb3RlY3RlZCBfaGFuZGxlU2xvdENoYW5nZSgpe1xuICAgICAgICB0aGlzLnNob3coKTtcbiAgICB9XG5cblxuICAgIF9wcm9wZXJ0aWVzQ2hhbmdlZChwcm9wczphbnksIGNoYW5nZWQ6YW55PXt9LCBwcmV2OmFueT17fSl7XG4gICAgICAgIHN1cGVyLl9wcm9wZXJ0aWVzQ2hhbmdlZChwcm9wcywgY2hhbmdlZCwgcHJldik7XG4gICAgICAgIHNldEJvb2xlYW5BdHRyaWJ1dGUodGhpcywgJ2Vycm9yJywgcHJvcHMuZXJyb3IpO1xuICAgICAgICBpZihjaGFuZ2VkLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBzaG93KCl7XG4gICAgICAgIGNvbnN0IG5vdyA9IHRoaXMuX19sYXN0TWVzc2FnZUNoYW5nZSA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdvcGVuJywgJ3RydWUnKTtcbiAgICAgICAgaWYgKHRoaXMuZHVyYXRpb24gPiAwICYmICF0aGlzLmVycm9yKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpPT57XG4gICAgICAgICAgICAgICAgLy9pbiBjYXNlIGFub3RoZXIgbWVzc2FnZSBoYXMgYmVlbiBzZW50IHdoaWxlIGl0IHdhcyBvcGVuXG4gICAgICAgICAgICAgICAgLy9kb250IGNsb3NlIGl0IHVudGlsIHRoZSBsYXN0IG1lc3NhZ2UgaGFzIGl0cyBkdXJhdGlvblxuICAgICAgICAgICAgICAgIGlmKHRoaXMuX19sYXN0TWVzc2FnZUNoYW5nZSA9PT0gbm93KXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgdGhpcy5kdXJhdGlvbiAqIDEwMDApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZXJyb3Ipe1xuICAgICAgICAgICAgY29uc3QgdGV4dEVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigncCcpIGFzIEhUTUxFbGVtZW50XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0ZXh0RWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfSwgMTYpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3Nob3cnKSk7XG4gICAgfVxuXG4gICAgaGlkZSgpe1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoaWRlJykpO1xuICAgICAgICBpZiAodGhpcy5fX3ByZXZpb3VzRm9jdXMgJiYgdGhpcy5lcnJvcil7XG4gICAgICAgICAgICB0aGlzLl9fcHJldmlvdXNGb2N1cy5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX19wcmV2aW91c0ZvY3VzID0gbnVsbDtcbiAgICB9XG5cbiAgICBfZGlkUmVuZGVyKCkge1xuICAgICAgICBjb25zdCBjdXJyZW50Rm9jdXMgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50XG4gICAgICAgIGlmIChjdXJyZW50Rm9jdXMgIT09IHRoaXMgJiYgY3VycmVudEZvY3VzICE9PSBkb2N1bWVudC5ib2R5ICYmXG4gICAgICAgICAgICAgICAgY3VycmVudEZvY3VzICYmICEoY3VycmVudEZvY3VzIGluc3RhbmNlb2YgQWJzdHJhY3RNb2RhbEVsZW1lbnQpKXtcbiAgICAgICAgICAgIHRoaXMuX19wcmV2aW91c0ZvY3VzID0gY3VycmVudEZvY3VzXG4gICAgICAgIH1cblxuICAgICAgICBpZih0aGlzLl9fc2xvdCkge1xuICAgICAgICAgICAgdGhpcy5fX3Nsb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHRoaXMuX2hhbmRsZVNsb3RDaGFuZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNsb3QgPXRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdzbG90Jyk7XG4gICAgICAgIGlmKHNsb3QpIHtcbiAgICAgICAgICAgIHNsb3QuYWRkRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHRoaXMuX2hhbmRsZVNsb3RDaGFuZ2UpO1xuICAgICAgICAgICAgdGhpcy5fX3Nsb3QgPSBzbG90O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3JlbmRlcih7IGR1cmF0aW9uLCBtZXNzYWdlIH06YW55KXtcbiAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgICAgICA8c3R5bGU+XG4gICAgICAgICAgICAgICAgOmhvc3QoW29wZW5dKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDpob3N0IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgICAgICAgICAgICAgIGJvdHRvbTogNDBweDtcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogNTAlO1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAwJSk7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR7YmFja2dyb3VuZENvbG9yfTtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLDAsMCwwLjI1KTtcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICR7bGFiZWxDb2xvcn07XG4gICAgICAgICAgICAgICAgICAgIG1pbi13aWR0aDogMTAwcHg7XG4gICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgICAgICAgICAgICAgei1pbmRleDogMTAwMDA7XG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMXMgZWFzZS1pbjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAuY29udGFpbmVyIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMCAxNnB4O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC5jb250YWluZXJbZXJyb3Jde1xuICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDJweCBzb2xpZCByZWQ7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAwLCAwLCAwLjMxKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzdHJvbmcge1xuICAgICAgICAgICAgICAgICAgICBjb2xvcjogJHthY2NlbnRDb2xvcn07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLmNvbHVtbiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgICAgICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwIDhweDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAubGVmdCB7XG4gICAgICAgICAgICAgICAgICAgIG1heC13aWR0aDogNzUlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC5yaWdodCB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDogNTBweDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAubWVzc2FnZSB7XG4gICAgICAgICAgICAgICAgICAgIG1pbi13aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICAgICAgZmxvYXQ6IGxlZnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLmxlZnQgLm1lc3NhZ2Uge1xuICAgICAgICAgICAgICAgICAgICBtaW4td2lkdGg6IDc1JTtcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMjRweDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBidXR0b24ge1xuICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDEwMCU7XG4gICAgICAgICAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgICAgICAgICAgICAgZmxvYXQ6IGxlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlcjogMDtcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICR7YWNjZW50Q29sb3J9O1xuICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8L3N0eWxlPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiIGVycm9yPz0ke3RoaXMuZXJyb3J9PlxuICAgICAgICAgICAgICAgICR7KHRoaXMuZGlzbWlzc2FibGUpID9cbiAgICAgICAgICAgICAgICAgICAgaHRtbGBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIHRhYmluZGV4PVwiMFwiPjxzbG90IGNsYXNzPVwibWVzc2FnZVwiIGFyaWEtYXRvbWljPVwidHJ1ZVwiIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiIHRhYmluZGV4PVwiMFwiPjwvc2xvdD48L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG9uLWNsaWNrPSR7KCk9PiB0aGlzLmhpZGUoKX0+RElTTUlTUzwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIGAgOlxuICAgICAgICAgICAgICAgICAgICBodG1sYDxwPjxzbG90IGNsYXNzPVwibWVzc2FnZVwiIGFyaWEtYXRvbWljPVwidHJ1ZVwiIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPjwvc2xvdD48L3A+YFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgO1xuICAgIH1cbn1cblxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2FjYy1zbmFja2JhcicsIFNuYWNrQmFyRWxlbWVudCk7IiwiLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbmltcG9ydCB7IGNhbWVsQ2FzZVRvSHlwaGVuYXRlZCB9IGZyb20gJy4vLi4vdXRpbHMnO1xuXG4vKipcbiAqIEluZGl2aWR1YWxseSBkZWNsYXJlZCBzdHlsZXNcbiAqXG4gKiBhbnkgdmFyaWFibGUgaW50ZW5kZWQgdG8gYmUgZXhwb3NlcyBhcyBhIHRoZW1pbmcgY3NzIHZhcmlhYmxlIHNob3VsZFxuICogYmUgdGhlIHNhbWUgYXMgdmFyaWFibGUgbmFtZSBidXQgaHlwaGVuYXRlZCB3aXRoIHR3byBsZWFkaW5nIGRhc2hlc1xuICogaS5lLiBhY2NlbnRDb2xvciBpbiBjc3MgaXMgLS1hY2NlbnQtY29sb3JcbiAqL1xuXG5cbiAvKipcbiAgKiBvdXRsaW5lIHRoZSBzdHlsZXMgaGVyZVxuICAqL1xuY29uc3Qgc3R5bGVzOiBhbnkgPSB7XG4gICAgbGFiZWxDb2xvcjogJ2JsYWNrJyxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICd3aGl0ZScsXG4gICAgYnV0dG9uQm9yZGVyQ29sb3I6ICcjQUVCMEI1JyxcbiAgICBidXR0b25Cb3JkZXJXaWR0aDogJzJweCcsXG4gICAgYnV0dG9uRm9udFNpemU6JzE4cHgnLFxuICAgIGJ1dHRvbkZvbnRXZWlnaHQ6ICdub3JtYWwnLFxuICAgIGJ1dHRvbkp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICBhY2NlbnRDb2xvcjogJyMyMzVCRUMnLC8vJyMxNjU4RjUnLFxuICAgIGFjY2VudE9mZkNvbG9yOiAnI2FhYWFhYScsXG4gICAgYWNjZW50Qm9yZGVyUmFkaXVzOiAnMCUnLFxuICAgIGJvZHlGb250RmFtaWx5OiAnS2FybGEnLFxuICAgIHRpdGxlRm9udEZhbWlseTogJ1BvcHBpbnMnLFxuICAgIGljb25TaXplOiAnMjVweCcsXG4gICAgZmlsbENvbG9yOiAnYmxhY2snLFxuICAgIG91dGxpbmVCb3JkZXJDb2xvciA6ICcjQUVCMEI1Jyxcbn1cblxuXG4vKipcbiAqIG1ha2UgYSB2YWx1ZSBmcm9tIHN0eWxlcyBhIGNzcyB2YXJpYWJsZSBhdmFpbGFibGUgZm9yIHRoZW1lc1xuICogQHBhcmFtIHN0eWxlVmFyaWFibGUgdGhlIHZhcmlhYmxlIGZyb20gc3R5bGVzIHlvdSB0byBtYWtlIGEgQ1NTIHZhcmlhYmxlXG4gKi9cbmNvbnN0IGFwcGx5VmFyaWFibGUgPSAoIHN0eWxlVmFyaWFibGU6IHN0cmluZyApID0+XG4gICAgICAgIGB2YXIoLS0ke2NhbWVsQ2FzZVRvSHlwaGVuYXRlZChzdHlsZVZhcmlhYmxlKX0sICR7c3R5bGVzW3N0eWxlVmFyaWFibGVdfSlgO1xuXG5leHBvcnQgY29uc3QgbGFiZWxDb2xvciA9IGFwcGx5VmFyaWFibGUoJ2xhYmVsQ29sb3InKTtcbmV4cG9ydCBjb25zdCBiYWNrZ3JvdW5kQ29sb3IgPSBhcHBseVZhcmlhYmxlKCdiYWNrZ3JvdW5kQ29sb3InKTtcbmV4cG9ydCBjb25zdCB0aXRsZUZvbnRGYW1pbHkgPSBhcHBseVZhcmlhYmxlKCd0aXRsZUZvbnRGYW1pbHknKTtcbmV4cG9ydCBjb25zdCBib2R5Rm9udEZhbWlseSA9IGFwcGx5VmFyaWFibGUoJ2JvZHlGb250RmFtaWx5Jyk7XG5cbi8vIHRoaXMgaXMgb25lIGlzIG5lc3RlZCB3aXRoIHByaW9yaXR5IHRvIC0tYnV0dG9uLWJhY2tncm91bmQtY29sb3Jcbi8vIG90aGVyd2lzZSBkZWZhdWx0cyB0byAtLWJhY2tncm91bmQtY29sb3Igb3IgaXRzIGRlZmF1bHQgdmFsdWUgYWJvdmVcbmV4cG9ydCBjb25zdCBidXR0b25CYWNrZ3JvdW5kQ29sb3IgPSBgdmFyKC0tYnV0dG9uLWJhY2tncm91bmQtY29sb3IsICR7YmFja2dyb3VuZENvbG9yfSlgO1xuZXhwb3J0IGNvbnN0IGJ1dHRvbkJvcmRlckNvbG9yID0gYXBwbHlWYXJpYWJsZSgnYnV0dG9uQm9yZGVyQ29sb3InKTtcbmV4cG9ydCBjb25zdCBidXR0b25Cb3JkZXJXaWR0aCA9IGFwcGx5VmFyaWFibGUoJ2J1dHRvbkJvcmRlcldpZHRoJyk7XG5leHBvcnQgY29uc3QgYnV0dG9uRm9udFNpemUgPSBhcHBseVZhcmlhYmxlKCdidXR0b25Gb250U2l6ZScpO1xuZXhwb3J0IGNvbnN0IGJ1dHRvbkZvbnRXZWlnaHQgPSBhcHBseVZhcmlhYmxlKCdidXR0b25Gb250V2VpZ2h0Jyk7XG5leHBvcnQgY29uc3QgYnV0dG9uSnVzdGlmeUNvbnRlbnQgPSBhcHBseVZhcmlhYmxlKCdidXR0b25KdXN0aWZ5Q29udGVudCcpO1xuZXhwb3J0IGNvbnN0IGJ1dHRvbkxhYmVsQ29sb3IgPSBgdmFyKC0tYnV0dG9uLWxhYmVsLWNvbG9yLCAke2xhYmVsQ29sb3J9KWBcblxuZXhwb3J0IGNvbnN0IGFjY2VudENvbG9yID0gYXBwbHlWYXJpYWJsZSgnYWNjZW50Q29sb3InKTtcbmV4cG9ydCBjb25zdCBhY2NlbnRPZmZDb2xvciA9IGFwcGx5VmFyaWFibGUoJ2FjY2VudE9mZkNvbG9yJyk7XG5leHBvcnQgY29uc3QgYWNjZW50Qm9yZGVyUmFkaXVzID0gYXBwbHlWYXJpYWJsZSgnYWNjZW50Qm9yZGVyUmFkaXVzJyk7XG5cbmV4cG9ydCBjb25zdCBpY29uU2l6ZSA9IGFwcGx5VmFyaWFibGUoJ2ljb25TaXplJyk7XG5cbmV4cG9ydCBjb25zdCBmaWxsQ29sb3IgPSBhcHBseVZhcmlhYmxlKCdmaWxsQ29sb3InKTtcblxuZXhwb3J0IGNvbnN0IG91dGxpbmVCb3JkZXJDb2xvciA9IGFwcGx5VmFyaWFibGUoJ291dGxpbmVCb3JkZXJDb2xvcicpXG5cblxuXG5leHBvcnQgY29uc3QgbGFiZWxTdHlsZUNodW5rID0gKHNlbGVjdG9yOiBzdHJpbmc9ICdsYWJlbCcpID0+IGBcbiAgICAke3NlbGVjdG9yfSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiAke2JvZHlGb250RmFtaWx5fTtcbiAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICBwYWRkaW5nOiAwcHggMHB4IDIwcHggMHB4O1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgY29sb3I6ICR7bGFiZWxDb2xvcn07XG4gICAgfWA7IiwiLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbmltcG9ydCB7IEFic3RyYWN0VUlFbGVtZW50LCBVSVByb3BlcnRpZXMgfSBmcm9tICcuL2Fic3RyYWN0LXVpJztcbmltcG9ydCB7IGJvZHlGb250RmFtaWx5LCBsYWJlbENvbG9yLCBhY2NlbnRDb2xvciwgYWNjZW50T2ZmQ29sb3IgfSBmcm9tICcuL3N0eWxlcyc7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSAnQHBvbHltZXIvbGl0LWVsZW1lbnQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICcuL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgc2V0Qm9vbGVhbkF0dHJpYnV0ZSB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCBhdXRvYmluZCBmcm9tICdhdXRvYmluZC1kZWNvcmF0b3InO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9nZ2xlUHJvcGVydGllcyBleHRlbmRzIFVJUHJvcGVydGllcyB7XG4gICAgY2hlY2tlZDogYm9vbGVhbjtcbn1cblxuXG4vKipcbiAqIEFuIGA8YWNjLXRvZ2dsZT5gIGVsZW1lbnQgaXMgc2ltaWxhciB0byBhIGNoZWNrYm94LiBJdCBpcyBhIGJ1dHRvbiB3aGVyZSBpdHNcbiAqIGBjaGVja2VkYCB2YWx1ZSB0b2dnbGVzIGVhY2ggdGltZSBjbGlja2VkLiBUaGlzIGVsZW1lbnQgaGFuZGxlcyBsYWJlbGluZ1xuICogKGluY2x1ZGluZyBjaGVja2VkIHN0YXRlIGluZm9ybWF0aW9uKSBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgQVJJQSBhdHRyaWJ1dGVzLlxuICpcbiAqIEBleGFtcGxlIGBgYGh0bWxcbiAqXG4gKiA8YWNjLXRvZ2dsZSBsYWJlbD1cIlBlbiBEb3duXCIgY2hlY2tlZD48L2FjYy10b2dnbGU+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFRvZ2dsZUVsZW1lbnQgZXh0ZW5kcyBBYnN0cmFjdFVJRWxlbWVudCB7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pXG4gICAgcHVibGljIGNoZWNrZWQ6Ym9vbGVhbiA9IGZhbHNlO1xuXG5cbiAgICBwdWJsaWMgZ2V0IHZhbHVlKCkgOnN0cmluZyB7XG4gICAgICAgIHJldHVybiBTdHJpbmcodGhpcy5jaGVja2VkKTtcbiAgICB9XG5cblxuICAgIGZvY3VzKCl7XG4gICAgICAgIHN1cGVyLmZvY3VzKClcbiAgICAgICAgdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpLmZvY3VzKClcbiAgICB9XG5cbiAgICBAYXV0b2JpbmRcbiAgICBwcm90ZWN0ZWQgX2hhbmRsZVNob3J0Y3V0KCkge1xuICAgICAgICB0aGlzLmNoZWNrZWQgPSAhdGhpcy5jaGVja2VkO1xuICAgICAgICBzdXBlci5faGFuZGxlU2hvcnRjdXQoKTtcbiAgICB9XG5cbiAgICBfcmVuZGVyKHsgbGFiZWwsIHNob3J0Y3V0LCBjaGVja2VkIH06IFRvZ2dsZVByb3BlcnRpZXMpe1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIGxldCB0aXRsZSA9IGAke2xhYmVsfSwgdG9nZ2xlZCAke2NoZWNrZWQgPyAnb24nIDogJ29mZid9IGA7XG4gICAgICAgIGlmICghIXNob3J0Y3V0KSB7XG4gICAgICAgICAgICB0aXRsZSArPSBgICgke3Nob3J0Y3V0fSlgO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgICAgICA8c3R5bGU+XG4gICAgICAgICAgICAgICAgOmhvc3Qge1xuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogNTBweDtcbiAgICAgICAgICAgICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICR7bGFiZWxDb2xvcn07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnV0dG9uIHtcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLmluZGljYXRvciB7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgICAgICAgICAgdG9wOiA1MCU7XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAyMHB4O1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtNTAlKTtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDMycHg7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgOmhvc3QoW2Rpc2FibGVkXSkge1xuICAgICAgICAgICAgICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMC4yNTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAudGl0bGUge1xuICAgICAgICAgICAgICAgICAgICBjb2xvcjogJHtsYWJlbENvbG9yfTtcbiAgICAgICAgICAgICAgICAgICAgZm9udC1mYW1pbHk6ICR7Ym9keUZvbnRGYW1pbHl9O1xuICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE4cHg7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgOmhvc3QoW2NoZWNrZWRdKSAuaW5kaWNhdG9yIHtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC5hY2NlbnQge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiBmaWxsIDNzIGxpbmVhcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgI29uLWluZGljYXRvciAuYWNjZW50IHtcbiAgICAgICAgICAgICAgICAgICAgZmlsbDogJHthY2NlbnRDb2xvcn07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgI29mZi1pbmRpY2F0b3IgLmFjY2VudCB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGw6ICR7YWNjZW50T2ZmQ29sb3J9O1xuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICA8L3N0eWxlPlxuICAgICAgICAgICAgICAgIDxidXR0b24gcm9sZT1cImNoZWNrYm94XCIgYXJpYS1jaGVja2VkJD1cIiR7dGhpcy5jaGVja2VkfVwiIGRpc2FibGVkPz1cIiR7dGhpcy5kaXNhYmxlZH1cIiB0aXRsZT1cIiR7dGl0bGV9XCIgb24tY2xpY2s9JHsoKT0+IHRoaXMuY2hlY2tlZCA9ICF0aGlzLmNoZWNrZWR9PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIj4ke2xhYmVsfHx2YWx1ZX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluZGljYXRvclwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIGlkPVwib2ZmLWluZGljYXRvclwiIHN0eWxlJD1cImRpc3BsYXk6ICR7dGhpcy5jaGVja2VkID8gJ25vbmUnIDogJ2Jsb2NrJ31cIlxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCI0OXB4XCIgaGVpZ2h0PVwiMjhweFwiIHZpZXdCb3g9XCIwIDAgNDkgMjhcIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkN1cnJlbnRseSB0b2dnbGVkIG9mZjwvdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZyBzdHJva2U9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGNsYXNzPVwiYWNjZW50XCIgZD1cIk0zOC4zMTUyMTc0LDIxLjI1IEwxMi43NzE3MzkxLDIxLjI1IEM3Ljc5MDc2MDg3LDIxLjI1IDMuODMxNTIxNzQsMTcuMzc1IDMuODMxNTIxNzQsMTIuNSBDMy44MzE1MjE3NCw3LjYyNSA3Ljc5MDc2MDg3LDMuNzUgMTIuNzcxNzM5MSwzLjc1IEwzOC4zMTUyMTc0LDMuNzUgQzQzLjI5NjE5NTcsMy43NSA0Ny4yNTU0MzQ4LDcuNjI1IDQ3LjI1NTQzNDgsMTIuNSBDNDcuMjU1NDM0OCwxNy4zNzUgNDMuMjk2MTk1NywyMS4yNSAzOC4zMTUyMTc0LDIxLjI1IFpcIiBpZD1cInRyYWNrXCIgZmlsbC1vcGFjaXR5PVwiMC4yNlwiIGZpbGw9XCIjMjIxRjFGXCI+PC9wYXRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIGNsYXNzPVwiYWNjZW50XCIgY3g9XCIxMi43NzE3MzkxXCIgY3k9XCIxMi41XCIgcng9XCIxMi41MjE3MzkxXCIgcnk9XCIxMi4yNVwiPjwvZWxsaXBzZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBpZD1cIm9uLWluZGljYXRvclwiIHN0eWxlJD1cImRpc3BsYXk6ICR7dGhpcy5jaGVja2VkID8gJ2Jsb2NrJyA6ICdub25lJ31cIlxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCI0N3B4XCIgaGVpZ2h0PVwiMjdweFwiIHZpZXdCb3g9XCIwIDAgNDcgMjdcIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkN1cnJlbnRseSB0b2dnbGVkIG9uPC90aXRsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxnIHN0cm9rZT1cIm5vbmVcIiBzdHJva2Utd2lkdGg9XCIxXCIgZmlsbD1cIm5vbmVcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJhY2NlbnRcIiBkPVwiTTQyLjI3MDI3MDMsMTIuNSBDNDIuMjcwMjcwMywxNy4zNzUgMzguNDE2MjE2MiwyMS4yNSAzMy41Njc1Njc2LDIxLjI1IEw4LjcwMjcwMjcsMjEuMjUgQzMuODU0MDU0MDUsMjEuMjUgMCwxNy4zNzUgMCwxMi41IEwwLDEyLjUgQzAsNy42MjUgMy44NTQwNTQwNSwzLjc1IDguNzAyNzAyNywzLjc1IEwzMy41Njc1Njc2LDMuNzUgQzM4LjQxNjIxNjIsMy43NSA0Mi4yNzAyNzAzLDcuNjI1IDQyLjI3MDI3MDMsMTIuNSBMNDIuMjcwMjcwMywxMi41IEw0Mi4yNzAyNzAzLDEyLjUgWlwiIGlkPVwidHJhY2tcIiBmaWxsPVwiIzAwNTRGRlwiIG9wYWNpdHk9XCIwLjVcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgY2xhc3M9XCJhY2NlbnRcIiBjeD1cIjMzLjU2NzU2NzZcIiBjeT1cIjEyLjVcIiByeD1cIjEyLjE4MjQzMjRcIiByeT1cIjEyLjI1XCI+PC9lbGxpcHNlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICBgO1xuICAgIH1cblxuXG4gICAgX3Byb3BlcnRpZXNDaGFuZ2VkKHByb3BzOmFueSwgY2hhbmdlZFByb3BzOmFueSwgcHJldlByb3BzOmFueSl7XG4gICAgICAgIGlmKCFjaGFuZ2VkUHJvcHMgfHwgIXByZXZQcm9wcyl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmKGNoYW5nZWRQcm9wcy5jaGVja2VkICE9PSBwcmV2UHJvcHMuY2hlY2tlZCl7XG4gICAgICAgICAgICBzZXRCb29sZWFuQXR0cmlidXRlKHRoaXMsICdjaGVja2VkJywgcHJvcHMuY2hlY2tlZCk7XG4gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VkUHJvcHMuZGlzYWJsZWQgIT09IHByZXZQcm9wcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZDogdGhpcy5jaGVja2VkXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhbmdlJywgY3VzdG9tRXZlbnQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1cGVyLl9wcm9wZXJ0aWVzQ2hhbmdlZChwcm9wcywgY2hhbmdlZFByb3BzLCBwcmV2UHJvcHMpO1xuICAgIH1cblxuICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogYW55LCBvbGQ6IGFueSkge1xuICAgICAgICAvL3ByZXZlbnQgY2hlY2tlZCB2YWx1ZSBmcm9tIGNoYW5naW5nIGlmIGl0cyBkaXNhYmxlZFxuICAgICAgICBpZihwcm9wZXJ0eSA9PT0gJ2NoZWNrZWQnICYmIHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIuX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHByb3BlcnR5LCB2YWx1ZSwgb2xkKTtcbiAgICB9XG5cbn1cblxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2FjYy10b2dnbGUnLCBUb2dnbGVFbGVtZW50KTsiLCIvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuaW1wb3J0IHsgaHRtbCB9IGZyb20gJ0Bwb2x5bWVyL2xpdC1lbGVtZW50JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnLi9kZWNvcmF0b3JzJztcbmltcG9ydCAnLi9zbGlkZXNob3cnO1xuaW1wb3J0IHsgQWJzdHJhY3RNb2RhbEVsZW1lbnQgfSBmcm9tICcuL2Fic3RyYWN0LW1vZGFsJztcblxuLyoqXG4gKiBBIGA8YWNjLXR1dG9yaWFsPmAgZWxlbWVudCBwbGFjZXMgYSBgPGFjYy1zbGlkZXNob3c+YCBpbnRvIGEgZnVsbHNjcmVlblxuICogbW9kYWwgY29udGFpbmVyLlxuICovXG5leHBvcnQgY2xhc3MgVHV0b3JpYWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGFsRWxlbWVudCB7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgICBwdWJsaWMgY2xvc2VCdXR0b246IHN0cmluZyA9ICdTdGFydCBQbGF5aW5nJztcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnByaW9yaXR5ID0gMlxuICAgICAgICB0aGlzLmV4Y2x1c2l2ZSA9IHRydWVcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2hhbmRsZUNsb3NlQ2xpY2soKXtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKVxuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjbG9zZS1jbGlja2VkJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICB9XG5cbiAgICBmb2N1cygpe1xuICAgICAgICBzdXBlci5mb2N1cygpXG4gICAgICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdoMicpIGFzIEhUTUxFbGVtZW50XG4gICAgICAgIGlmIChoZWFkZXIpe1xuICAgICAgICAgICAgaGVhZGVyLmZvY3VzKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9yZW5kZXJNb2RhbEJvZHkoeyBjbG9zZUJ1dHRvbiB9OiBhbnkpIHtcblxuICAgICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgICAgIDxzdHlsZT5cblxuICAgICAgICAgICAgICAgIDpob3N0KFtkYXJrXSksIFtkYXJrXSB7XG4gICAgICAgICAgICAgICAgICAgIC0tYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7XG4gICAgICAgICAgICAgICAgICAgIC0tYnV0dG9uLWZpbGw6IGJsYWNrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDpob3N0IHtcbiAgICAgICAgICAgICAgICAgICAgLS1iYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICAgICAgICAgICAgICAgICAgLS1idXR0b24tZmlsbDogd2hpdGU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgI2NvbnRlbnQge1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iYWNrZ3JvdW5kLWNvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwcHg7XG4gICAgICAgICAgICAgICAgICAgIHRvcDogMHB4O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGFjYy1zbGlkZXNob3cge1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDUzMHB4O1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogNzAwcHg7XG4gICAgICAgICAgICAgICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgICAgICAgICAgdG9wOiA1MCU7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IDUwJTtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaDIge1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDBweDtcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDwvc3R5bGU+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxoMiB0YWJpbmRleD1cIi0xXCI+VHV0b3JpYWw8L2gyPlxuICAgICAgICAgICAgICAgIDxhY2Mtc2xpZGVzaG93IGNsb3NlQnV0dG9uPVwiJHtjbG9zZUJ1dHRvbn1cIiBvbi1jbG9zZT0ke3RoaXMuX2hhbmRsZUNsb3NlQ2xpY2suYmluZCh0aGlzKX0+XG4gICAgICAgICAgICAgICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgICAgICAgICAgICA8L2FjYy1zbGlkZXNob3c+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYFxuICAgIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdhY2MtdHV0b3JpYWwnLCBUdXRvcmlhbCk7IiwiLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JFdmVudERldGFpbHMge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgc3RhY2s/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQW4gRXZlbnQgZGVzY3JpYmluZyBhbiBlbmNvdW50ZXJlZCBlcnJvci5cbiAqIERpc3BhdGNoaW5nIEVycm9ycyBpcyBpbXBvcnRhbnQgdG8gYWNjZXNzaWJpbGl0eSwgaXQgYWxsb3dzIHRoZSBkZXZlbG9wZXJcbiAqIHRvIG5vdGlmeSB0aGUgdXNlciAoc3VjaCBhcyB3aXRoIGFyaWEtbGl2ZSkgdG8gYXNzaXN0IGF2b2lkaW5nIGNvbmZ1c2lvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIEFDQ0Vycm9yRXZlbnQgZXh0ZW5kcyBDdXN0b21FdmVudDxFcnJvckV2ZW50RGV0YWlscz4ge1xuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2hlZCB3aGVuZXZlciB0aGVyZSBpcyBhbiBlcnJvclxuICAgICAqIEBldmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgRVJST1I6IHN0cmluZyA9ICdlcnJvcic7XG5cbiAgICBjb25zdHJ1Y3RvcihlcnJvcjogRXJyb3IpIHtcbiAgICAgICAgc3VwZXIoQUNDRXJyb3JFdmVudC5FUlJPUiwge1xuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgbmFtZTogZXJyb3IubmFtZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIHN0YWNrOiBlcnJvci5zdGFja1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICBjb21wb3NlZDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuIiwiLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbmltcG9ydCB7IElucHV0VHlwZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvdHlwZXMnO1xuLyoqXG4gKiBhbnkgZXZlbnQgY29taW5nIGZyb20gYW4gQWJzdHJhY3RJbnB1dEVsZW1lbnQgc2hvdWxkIGluY2x1ZGVcbiAqIHRoZXNlIHByb3BlcnRpZXMgaW4gaXRzIGRldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnB1dEV2ZW50RGV0YWlscyB7XG4gICAgaW5wdXRUeXBlOklucHV0VHlwZTtcbiAgICBwb3NpdGlvbjpbbnVtYmVyLCBudW1iZXJdO1xufVxuXG4vKipcbiAqIGV4dGVuZCBDdXN0b21FdmVudEluaXQgdG8gbWFrZSBkZXRhaWxzIGEgcmVxdWlyZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IHR5cGUgQUNDSW5wdXRFdmVudEluaXQgPSBDdXN0b21FdmVudEluaXQ8SW5wdXRFdmVudERldGFpbHM+O1xuXG4vKipcbiAqIEV2ZXJ5IGV2ZW50IGNvbWluZyBmcm9tIGFuIEFic3RyYWN0SW5wdXRFbGVtZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBBQ0NJbnB1dEV2ZW50IGV4dGVuZHMgQ3VzdG9tRXZlbnQ8SW5wdXRFdmVudERldGFpbHM+IHtcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoZWQgd2hlbiBhbiBpbnB1dHMgcHJvcGVydGllcyBoYXZlIGNoYW5nZWRcbiAgICAgKiBAZXZlbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIENIQU5HRTogc3RyaW5nID0gJ2NoYW5nZSc7XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaGVkIHdoZW4gYW4gaW5wdXQncyBjb250cm9scyBtb2RhbCBjbG9zZXNcbiAgICAgKiBAZXZlbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIENPTlRST0xTX0NMT1NFOiBzdHJpbmcgPSAnY29udHJvbHNjbG9zZSc7XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaGVkIHdoZW4gYW4gaW5wdXQncyBjb250cm9scyBtb2RhbCBvcGVuc1xuICAgICAqIEBldmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgQ09OVFJPTFNfT1BFTjogc3RyaW5nID0nY29udHJvbHNvcGVuJztcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoZWQgd2hlbiB0aGUgaW5wdXQgaXMgYmVnaW5uaW5nIHRvIGluaXRpYWxpemUgYW5kIGxvYWQgaXRzZWxmXG4gICAgICogQGV2ZW50XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBJTklUSUFMSVpJTkc6IHN0cmluZyA9ICdpbml0aWFsaXppbmcnO1xuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2hlZCB3aGVuIHRoZSBpbnB1dCBoYXMgY29tcGxldGVkIGluaXRpYWxpemluZyBpdHNlbGZcbiAgICAgKiBAZXZlbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIFJFQURZOiBzdHJpbmcgPSAncmVhZHknO1xuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2hlZCBldmVyeSB0aW1lIHRoZXJlcyBhbiB1cGRhdGUsIHRoaXMgaXMgNjBmcHMgZm9yIHdlYmNhbXNcbiAgICAgKiBAZXZlbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIFRJQ0s6IHN0cmluZyA9ICd0aWNrJztcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoZXMgZXZlcnkgdGltZSB0aGVyZSBpcyBhIG5ldyB2YWx1ZSBmcm9tIHRoZSBpbnB1dFxuICAgICAqIEBldmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgSU5QVVQ6IHN0cmluZyA9ICdpbnB1dCc7XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaGVkIHdoZW4gdGhlIGlucHV0IGhhcyBiZWVuIHN0b3BwZWRcbiAgICAgKiBAZXZlbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIFNUT1A6IHN0cmluZyA9ICdzdG9wJztcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6c3RyaW5nLCBldmVudEluaXREaWN0OkFDQ0lucHV0RXZlbnRJbml0KXtcbiAgICAgICAgc3VwZXIodHlwZSwgZXZlbnRJbml0RGljdCk7XG4gICAgfVxufSIsIi8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG5cbi8qKlxuICogZWFjaCBvbmUgb2YgdGhlc2UgbW9kdWxlcyByZXByZXNlbnRzIGEgY29ycmVzcG9uZGluZyBIVE1MIHRhZ1xuICogaS5lLiA8YWNjLW1vdXNlLWlucHV0Lz5cbiAqL1xuaW1wb3J0ICcuL2NvbXBvbmVudHMvYnV0dG9uJztcbmltcG9ydCAnLi9jb21wb25lbnRzL2NvbnRlbnQnO1xuaW1wb3J0ICcuL2NvbXBvbmVudHMvZ3JvdXAnO1xuaW1wb3J0ICcuL2NvbXBvbmVudHMvaW5wdXQtbW9kZS1zZWxlY3QnO1xuaW1wb3J0ICcuL2NvbXBvbmVudHMvaXRlbSc7XG5pbXBvcnQgJy4vY29tcG9uZW50cy9tb3VzZS1pbnB1dCc7XG5pbXBvcnQgJy4vY29tcG9uZW50cy9tb3VzZS1pbnB1dC1jYWxpYnJhdGlvbic7XG5pbXBvcnQgJy4vY29tcG9uZW50cy9vcHRncm91cCc7XG5pbXBvcnQgJy4vY29tcG9uZW50cy9wb3NlLWlucHV0JztcbmltcG9ydCAnLi9jb21wb25lbnRzL3Bvc2UtaW5wdXQtY2FsaWJyYXRpb24nO1xuaW1wb3J0ICcuL2NvbXBvbmVudHMvcmFuZ2UnO1xuaW1wb3J0ICcuL2NvbXBvbmVudHMvc2lkZS1wYW5lbCc7XG5pbXBvcnQgJy4vY29tcG9uZW50cy9zZWxlY3QnO1xuaW1wb3J0ICcuL2NvbXBvbmVudHMvc25hY2tiYXInO1xuaW1wb3J0ICcuL2NvbXBvbmVudHMvdG9nZ2xlJztcblxuXG5pbXBvcnQgJy4vY29tcG9uZW50cy9zbGlkZSc7XG5pbXBvcnQgJy4vY29tcG9uZW50cy90dXRvcmlhbCc7XG5cbiIsIi8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG5pbXBvcnQgYXV0b2JpbmQgZnJvbSAnYXV0b2JpbmQtZGVjb3JhdG9yJztcblxuLyoqXG4gKiBLZXlib2FyZCBTaG9ydGN1dCBPYnNlcnZlclxuICogT2JzZXJ2ZSBrZXlib2FyZCBldmVudHMgb24gdGhlIGRvY3VtZW50LCBpZiB0aGUgZXZlbnQua2V5IGNvbWJpbmF0aW9uIG1hdGNoZXNcbiAqIHRoZSBwYXR0ZXJuIHByb3ZpZGVkIGludm9rZSB0aGUgcHJvdmlkZWQgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGNsYXNzIEtleWJvYXJkU2hvcnRjdXRPYnNlcnZlciB7XG5cbiAgICBwdWJsaWMgYWxsb3dQcm9wYWdhdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICAgIC8vdGhlIHZhbHVlIGFzIGl0IGlzIG9yaWdpbmFsbHkgc2V0IChub3QgYXMgcmVnZXhwKVxuICAgIHByaXZhdGUgX19kaXJlY3RTaG9ydGN1dDogc3RyaW5nIHwgUmVnRXhwO1xuICAgIHByaXZhdGUgX19zaG9ydGN1dFJlZ0V4cDogUmVnRXhwO1xuICAgIHByaXZhdGUgX19rZXlzRG93bjogc3RyaW5nW10gPSBbXTtcbiAgICBwcml2YXRlIF9faXNDb25uZWN0ZWQ6IGJvb2xlYW47XG5cblxuICAgIHB1YmxpYyBzZXQgcGF0dGVybihzOiBzdHJpbmcgfCBSZWdFeHApIHtcbiAgICAgICAgdGhpcy5fX2RpcmVjdFNob3J0Y3V0ID0gcztcbiAgICAgICAgaWYodHlwZW9mIHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAvL2Zvcm1hdFxuICAgICAgICAgICAgbGV0IHNob3J0ID0gc1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcuJywgJ1xcXFwuJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnKCcsICdcXFxcKCcpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJyknLCAnXFxcXCknKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCdbJywgJ1xcXFxbJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnXScsICdcXFxcXScpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLyhTcGFjZXxTcGFjZWJhcikvaSwgJyAnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oQ3RyfEN0cmwpL2ksICdDb250cm9sJyk7XG5cbiAgICAgICAgICAgIHRoaXMuX19zaG9ydGN1dFJlZ0V4cCA9IG5ldyBSZWdFeHAoc2hvcnQsICdnaScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fX3Nob3J0Y3V0UmVnRXhwID0gcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGF0dGVybigpOiBzdHJpbmcgfCBSZWdFeHAge1xuICAgICAgICByZXR1cm4gdGhpcy5fX2RpcmVjdFNob3J0Y3V0O1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgbmV3IG9ic2VydmVyIHRvIGxpc3RlbiB0byB0aGUga2V5Ym9hcmRcbiAgICAgKiBAcGFyYW0gcGF0dGVybiB0aGUga2V5Ym9hcmQgcGF0dGVybiB0byBsb29rIGZvciwgZXhhbXBsZXMgYXJlIFwiU2hpZnQgUFwiLCBcIkNvbnRyb2wgbVwiLCBcIk1ldGEgc1wiXG4gICAgICogQHBhcmFtIF9fb25UcmlnZ2VySGFuZGxlciB0aGUgaGFuZGxlciB0byBpbnZva2Ugd2hlbiBhIG1hdGNoIGlzIGZvdW5kXG4gICAgICogQHBhcmFtIG5hbWUgYSBuYW1lIHRvIGlkZW50aWZ5IHRoZSBzaG9ydGN1dFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwYXR0ZXJuOiBzdHJpbmcgfCBSZWdFeHAsXG4gICAgICAgIHByaXZhdGUgX19vblRyaWdnZXJIYW5kbGVyOiAoIG9ic2VydmVyOiBLZXlib2FyZFNob3J0Y3V0T2JzZXJ2ZXIgKSA9PiB2b2lkLFxuICAgICAgICBwdWJsaWMgbmFtZTogc3RyaW5nID0gJ3VubmFtZWQnXG4gICAgKXtcbiAgICAgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcbiAgICAgICAgdGhpcy5jb25uZWN0KCk7XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgY29ubmVjdCgpIHtcbiAgICAgICAgaWYodGhpcy5fX2lzQ29ubmVjdGVkKXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fX29uS2V5RG93biwgdHJ1ZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5fX29uS2V5VXAsIHRydWUpO1xuICAgICAgICB0aGlzLl9faXNDb25uZWN0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNjb25uZWN0KCkge1xuICAgICAgICBpZighdGhpcy5fX2lzQ29ubmVjdGVkKXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fX29uS2V5RG93biwgdHJ1ZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5fX29uS2V5VXAsIHRydWUpO1xuICAgICAgICB0aGlzLl9faXNDb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9faXNDb25uZWN0ZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYXRjaGVzKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBrZXlzID0gdGhpcy5fX2tleXNEb3duLmpvaW4oJyAnKTtcbiAgICAgICAgaWYodGhpcy5fX3Nob3J0Y3V0UmVnRXhwLnRlc3Qoa2V5cykpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBAYXV0b2JpbmRcbiAgICBwcml2YXRlIF9fb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmKCF0aGlzLnBhdHRlcm4pe1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX19rZXlzRG93bi5wdXNoKGV2ZW50LmtleSk7XG4gICAgfVxuXG4gICAgQGF1dG9iaW5kXG4gICAgcHJpdmF0ZSBfX29uS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLm5hbWUsIHRoaXMucGF0dGVybiwgJyA9PSAnLCB0aGlzLl9fa2V5c0Rvd24pO1xuICAgICAgICBpZighdGhpcy5wYXR0ZXJuKXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tYXRjaGVzKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX19vblRyaWdnZXJIYW5kbGVyKHRoaXMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuYWxsb3dQcm9wYWdhdGlvbikge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX19rZXlzRG93biA9IFtdO1xuICAgIH1cblxufSIsIi8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4vL2Jhc2VkIG9uIGpRdWVyeS5vZmZzZXQoKSBmcm9tIHYyLjAuM1xuXG50eXBlIFZlYzIgPSB7IHg6IG51bWJlciwgeTogbnVtYmVyIH07XG5cblxuXG5jb25zdCBpc1RvdWNoRXZlbnQgPSAoYzphbnkpOiBjIGlzIFRvdWNoRXZlbnQgPT5cbiAgICBjLnR5cGUuaW5kZXhPZigndG91Y2gnKSA9PT0gMCAmJiAhIWMudG91Y2hlcztcblxuLy93aW5kb3cgaGFzIGEgY2lyY3VsYXIgd2luZG93LndpbmRvdyByZWZlcmVuY2VcbmNvbnN0IGlzV2luZG93ID0gKGVsZW06YW55KT0+XG4gICAgZWxlbSAhPT0gbnVsbCAmJiBlbGVtID09PSBlbGVtLndpbmRvdztcblxuY29uc3QgZ2V0V2luZG93ID0gKCBlbGVtOmFueSApOiBXaW5kb3cgPT5cbiAgICBpc1dpbmRvdyhlbGVtKSA/IGVsZW0gOiBlbGVtLm5vZGVUeXBlID09PSA5ID8gZWxlbS5kZWZhdWx0VmlldyB8fCBlbGVtLnBhcmVudFdpbmRvdyA6IGZhbHNlO1xuXG5jb25zdCBpc0hUTUxFbGVtZW50ID0gKGVsZW06YW55ICk6IGVsZW0gaXMgSFRNTEVsZW1lbnQgPT5cbiAgICB0eXBlb2YgZWxlbS5hcHBlbmRDaGlsZCA9PT0gJ2Z1bmN0aW9uJztcblxuXG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBvZmZzZXQgb2YgZWxlbWVudFxuICogQHBhcmFtIGVsZW0gZWxlbWVudCBvciBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKSByZXN1bHQgdG8gY2FsY3VsYXRlIG9mZnNldCBvZlxuICogQHBhcmFtIGlnbm9yZVdpbmRvd09mZnNldCBzaG91bGQgdGhlIHdpbmRvd3Mgc2Nyb2xsIHBvc2l0aW9uIGJlIGluY2x1ZGVkIGluIHRoZSBvZmZzZXQ/IChmYWxzZSBpZiBvYmplY3QgaXMgZml4ZWQgcG9zaXRpb24pXG4gKiBAcGFyYW0gdGFyZ2V0Qm94IG9wdGlvbmFsbHkgcHJvdmlkZSBhbiBvYmplY3QgdG8gbXV0YXRlIHdpdGggdGhlIHJlc3VsdHMgKHRvIHJlZHVjZSBnYXJiYWdlIGNvbGxlY3Rpb24pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbGVtZW50T2Zmc2V0KCBlbGVtOkhUTUxFbGVtZW50fENsaWVudFJlY3R8RE9NUmVjdCwgaWdub3JlV2luZG93T2Zmc2V0OmJvb2xlYW49dHJ1ZSwgdGFyZ2V0Qm94OlZlYzI9e3g6MCx5OjB9KTogVmVjMiB7XG5cbiAgICAvL3N1cHBvcnQgZWxlbWVudHMgdGhhdCBtYXkgaGF2ZSBhIGRpZmZlcmVudCB3aW5kb3cgb3IgZG9jdW1lbnQgKGluIGlmcmFtZSlcbiAgICBsZXQgd2luOldpbmRvdztcbiAgICBsZXQgZG9jOkRvY3VtZW50O1xuXG4gICAgaWYoaXNIVE1MRWxlbWVudChlbGVtKSl7XG4gICAgICAgIGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDtcblxuICAgICAgICBpZiAoIWRvYykge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldEJveDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSBpdCdzIG5vdCBhIGRpc2Nvbm5lY3RlZCBET00gbm9kZVxuICAgICAgICBpZiAoIWRvYy5ib2R5LmNvbnRhaW5zKGVsZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0Qm94O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBnQkNSLCBqdXN0IHVzZSAwLDAgcmF0aGVyIHRoYW4gZXJyb3JcbiAgICAgICAgLy8gQmxhY2tCZXJyeSA1LCBpT1MgMyAob3JpZ2luYWwgaVBob25lKVxuICAgICAgICBpZiAodHlwZW9mIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY2xpZW50UmVjdCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICB0YXJnZXRCb3gueCA9IGNsaWVudFJlY3QubGVmdDtcbiAgICAgICAgICAgIHRhcmdldEJveC55ID0gY2xpZW50UmVjdC50b3A7XG4gICAgICAgIH1cblxuICAgICAgICAvL3RoaXNcbiAgICAgICAgd2luID0gZ2V0V2luZG93KGRvYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0Qm94LnggPSBlbGVtLmxlZnQ7XG4gICAgICAgIHRhcmdldEJveC55ID0gZWxlbS50b3A7XG4gICAgICAgIHdpbiA9IHdpbmRvdztcbiAgICAgICAgZG9jID0gZG9jdW1lbnQ7XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZSA9IHsgeDogMCwgeTogMCB9O1xuICAgIGNvbnN0IGRvY0VsZW0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICBpZiggIWlnbm9yZVdpbmRvd09mZnNldCApe1xuICAgICAgICBwYWdlLnkgPSB3aW4ucGFnZVlPZmZzZXQgfHwgZG9jRWxlbS5zY3JvbGxUb3A7XG4gICAgICAgIHBhZ2UueCA9IHdpbi5wYWdlWE9mZnNldCB8fCBkb2NFbGVtLnNjcm9sbExlZnQ7XG4gICAgfVxuICAgIHRhcmdldEJveC55ID0gdGFyZ2V0Qm94LnkgKyBwYWdlLnkgLSAoZG9jRWxlbS5jbGllbnRUb3AgfHwgMCk7XG4gICAgdGFyZ2V0Qm94LnggPSB0YXJnZXRCb3gueCArIHBhZ2UueCAtIChkb2NFbGVtLmNsaWVudExlZnQgfHwgMCk7XG5cbiAgICByZXR1cm4gdGFyZ2V0Qm94O1xufTtcblxuXG4vL3VzZWQgaW4gbW91c2VQb3NpdGlvbiB0byByZWR1Y2UgdW5uZWNjZXNzYXJ5IGdhcmJhZ2UgY29sbGVjdGlvblxuY29uc3QgX190bXBWZWMyID0geyB4OiAwLCB5OiAwIH07XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBwcm92aWRlZCB4LCB5IHZhbHVlcyB0byBiZSByZWxhdGl2ZSB0byB0aGUgcHJvdmlkZWQgZWxlbWVudHMgb2Zmc2V0XG4gKiBAcGFyYW0gY2xpZW50WCB0aGUgeCBwb3NpdGlvbiB0byB0cmFuc2Zvcm0gKGV2ZW50LmNsaWVudFgpIGZyb20gYSBNb3VzZUV2ZW50XG4gKiBAcGFyYW0gY2xpZW50WSB0aGUgeSBwb3NpdGlvbiB0byB0cmFuc2Zvcm0gKGV2ZW50LmNsaWVudFkpIGZyb20gYSBNb3VzZUV2ZW50XG4gKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBtYWtlIHRoZSBjb29yZGluYXRlIHJlbGF0aXZlIHRvIChwcm92aWRlIGVpdGhlciB0aGlzIG9yIG9mZnNldClcbiAqIEBwYXJhbSBvZmZzZXQgb3B0aW9uYWxseSBwcm92aWRlIHRoZSBlbGVtZW50cyBvZmZzZXQgKHJlZHVjZSB3b3JrIGlmIGFscmVhZHkgY2FsY3VsYXRlZClcbiAqIEBwYXJhbSB0YXJnZXQgb3B0aW9uYWxseSBwcm92aWRlIGFuIG9iamVjdCB0byBiZSBtdXRhdGVkIHdpdGggcmVzdWx0IChyZWR1Y2UgZ2FyYmFnZSBjb2xsZWN0aW9uKVxuICovXG5leHBvcnQgZnVuY3Rpb24gbW91c2VQb3NpdGlvbihjbGllbnRYOm51bWJlciwgY2xpZW50WTpudW1iZXIsIGVsZW1lbnQ/OkhUTUxFbGVtZW50fENsaWVudFJlY3R8RE9NUmVjdCwgb2Zmc2V0PzpWZWMyLCB0YXJnZXQ/OlZlYzIpOiBWZWMyIHtcbiAgICBpZighZWxlbWVudCAmJiAhb2Zmc2V0KXtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtb3VzZVBvc2l0aW9uIHJlcXVpcmVzIGVpdGhlciBlbGVtZW50IG9yIG9mZnNldCBiZSBwcm92aWRlZCcpO1xuICAgIH1cbiAgICAvL2NhbGN1bGF0ZSBvZmZzZXQgZm9yIGVsZW1lbnRcbiAgICBpZihlbGVtZW50ICYmICFvZmZzZXQpe1xuICAgICAgICBvZmZzZXQgPSBlbGVtZW50T2Zmc2V0KGVsZW1lbnQsIGZhbHNlLCBfX3RtcFZlYzIpO1xuICAgIH1cblxuICAgIC8vb3RoZXJ3aXNlIGlmIHdlIGRvIGhhdmUgYW4gb2Zmc2V0IChldmVuIGlmIHdlIGhhdmUgYW4gZWxlbWVudCksIGp1c3QgdXNlIHRoYXQgb2Zmc2V0XG4gICAgLy91c2UgISB0byBwcm9taXNlIFRTIGl0cyBub3QgbnVsbFxuICAgIG9mZnNldCA9IG9mZnNldCE7XG5cbiAgICB0YXJnZXQgPSB0YXJnZXQgfHwgeyB4Oi0xLCB5OiAtMX07XG5cbiAgICB0YXJnZXQueCA9IGNsaWVudFggLSBvZmZzZXQueDtcbiAgICB0YXJnZXQueSA9IGNsaWVudFkgLSBvZmZzZXQueTtcbiAgICByZXR1cm4gdGFyZ2V0O1xufTtcblxuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHByb3ZpZGVkIE1vdXNlRXZlbnQgb3IgVG91Y2hFdmVudCByZWxhdGl2ZSB0byB0aGUgcHJvdmlkZWQgZWxlbWVudFxuICogQHBhcmFtIGV2ZW50IHRoZSBNb3VzZUV2ZW50IG9yIFRvdWNoRXZlbnQgdG8gZ2V0IGNvb3JkaW5hdGUgZnJvbVxuICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gbWFrZSB0aGUgY29vcmRpbmF0ZSByZWxhdGl2ZSB0b1xuICogQHBhcmFtIG9mZnNldCBvcHRpb25hbGx5IHByb3ZpZGUgdGhlIGVsZW1lbnRzIG9mZnNldCAodG8gcmVkdWNlIHdvcmspXG4gKiBAcGFyYW0gdGFyZ2V0IG9wdGlvbmFsbHkgcHJvdmlkZSBhbiBvYmplY3QgdG8gYmUgbXV0YXRlZCB3aXRoIHJlc3VsdCAodG8gcmVkdWNlIGdhcmJhZ2UgY29sbGVjdGlvbilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vdXNlUG9zaXRpb25Gcm9tRXZlbnQoZXZlbnQ6TW91c2VFdmVudHxUb3VjaEV2ZW50LCBlbGVtZW50PzpIVE1MRWxlbWVudHxDbGllbnRSZWN0fERPTVJlY3QsIG9mZnNldD86VmVjMiwgdGFyZ2V0PzpWZWMyKTogVmVjMiB7XG4gICAgbGV0IHgsIHk7XG4gICAgaWYoaXNUb3VjaEV2ZW50KGV2ZW50KSl7XG4gICAgICAgIGlmKGV2ZW50LnRvdWNoZXMgJiYgZXZlbnQudG91Y2hlc1swXSkge1xuICAgICAgICAgICAgeCA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICAgICAgICAgIHkgPSBldmVudC50b3VjaGVzWzBdLmNsaWVudFk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB4ID0gTmFOO1xuICAgICAgICAgICAgeSA9IE5hTjtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHggPSBldmVudC5jbGllbnRYO1xuICAgICAgICB5ID0gZXZlbnQuY2xpZW50WTtcbiAgICB9XG5cbiAgICBpZighZWxlbWVudCAmJiBpc0hUTUxFbGVtZW50KGV2ZW50LnRhcmdldCkpe1xuICAgICAgICBlbGVtZW50ID0gZXZlbnQudGFyZ2V0O1xuICAgIH1cblxuICAgIGlmKCFlbGVtZW50KXtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtb3VzZVBvc2l0aW9uRnJvbUV2ZW50IHJlcXVpcmVzIGFuIGVsZW1lbnQgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vdXNlUG9zaXRpb24oeCwgeSwgZWxlbWVudCwgb2Zmc2V0LCB0YXJnZXQpO1xufTsiLCIvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuXG4vKipcbiAqIElzIHRoZSBub2RlIGFuIEVsZW1lbnQgTm9kZT8gaS5lLiBub3QgYSB0ZXh0IGl0ZW1cbiAqIEBwYXJhbSBub2RlXG4gKi9cbmV4cG9ydCBjb25zdCBpc0VsZW1lbnQgPSAobm9kZTphbnkpOiBub2RlIGlzIEVsZW1lbnQgPT4gbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREU7XG5cbmludGVyZmFjZSBNYW55IHtcbiAgICBsZW5ndGg6IG51bWJlcjtcbiAgICBbaW5kZXg6IG51bWJlcl06IGFueTtcbn1cblxudHlwZSBpdGVyYXRvciA9ICh2YWx1ZTogYW55LCBpbmRleDogbnVtYmVyLCBhcnJheT86IGFueSkgPT4gYW55O1xuLy8gZmFzdGVyIGBtYXBgIHRoYXQgb3B0aW9uYWxseSBjYW4gYmUgcHJvdmlkZWQgYSB0YXJnZXQgYG91dGAgYXJyYXlcbmV4cG9ydCBjb25zdCBmYXN0TWFwID0gPFQgZXh0ZW5kcyBNYW55PihhcnI6IFQsIGZuOiBpdGVyYXRvciwgb3V0PzogVCk6IFQgPT4ge1xuICAgIG91dCA9IChvdXQgfHwgW10pIGFzIFQ7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGggOyBpKyspIHtcbiAgICAgICAgb3V0W2ldID0gZm4oYXJyW2ldLCBpLCBhcnIpO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEVtcHR5IHRoZSBjb250ZW50cyBvZiBhbiBhcnJheVxuICovXG5leHBvcnQgY29uc3QgZW1wdHkgPSA8VD4oYXJyYXk6IFRbXSk6IFRbXSA9PiB7XG4gICAgd2hpbGUgKGFycmF5Lmxlbmd0aCkge1xuICAgICAgICBhcnJheS5wb3AoKTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xufTtcblxuXG5cblxuXG5jb25zdCB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQ7XG5leHBvcnQgY29uc3QgaXNJT1MxMSA9ICgpPT4gKHVhLmluZGV4T2YoJ2lQYWQnKSA+IDAgfHwgdWEuaW5kZXhPZignaVBob25lJykgPiAwKSAmJiB1YS5pbmRleE9mKCdPUyAxMV8nKSA+IDA7XG5cbi8vIGV4cG9ydCBjb25zdCBzY2FsZVRvRmlsbCA9IChlbGVtZW50OkhUTUxFbGVtZW50KT0+e1xuLy8gICAgIGNvbnN0IHd3ID0gd2luZG93LmlubmVyV2lkdGg7XG4vLyAgICAgY29uc3Qgd2ggPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4vLyAgICAgbGV0IHMgPSB3aCAvIGVsZW1lbnQuaGVpZ2h0O1xuLy8gICAgIGlmIChlbGVtZW50LndpZHRoICogcyA8IHd3KSB7XG4vLyAgICAgICAgIHMgPSB3dyAvIGVsZW1lbnQud2lkdGg7XG4vLyAgICAgfVxuXG4vLyAgICAgY29uc3QgaXcgPSBlbGVtZW50LndpZHRoICogcztcbi8vICAgICBjb25zdCBpaCA9IGVsZW1lbnQuaGVpZ2h0ICogcztcbi8vICAgICBjb25zdCBpeCA9ICh3dyAtIGl3KSAqIDAuNTtcbi8vICAgICBjb25zdCBpeSA9ICh3aCAtIGloKSAqIDAuNTtcbi8vICAgICBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9IFwiMCUgMCVcIjtcbi8vICAgICBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IFwibWF0cml4KFwiK3MrXCIsIDAsIDAsIFwiK3MrXCIsIFwiK2l4K1wiLCBcIitpeStcIilcIjtcbi8vIH07XG5cblxuXG5cblxuZXhwb3J0IGNvbnN0IGJpbmQgPSAoY29udGV4dDphbnksIGZuU3RyOnN0cmluZyk9PiBjb250ZXh0W2ZuU3RyXSA9IGNvbnRleHRbZm5TdHJdLmJpbmQoY29udGV4dCk7XG5leHBvcnQgY29uc3QgYmluZEFsbCA9IChjb250ZXh0OmFueSwgZm5BcnJheTpzdHJpbmdbXSk9PiBmbkFycmF5LmZvckVhY2goZm5TdHI9PiBiaW5kKGNvbnRleHQsIGZuU3RyKSk7XG5cbmV4cG9ydCBjb25zdCBjbGFtcCA9IChuOiBudW1iZXIsIG1pbjogbnVtYmVyPSAwLCBtYXg6IG51bWJlcj0gMSkgPT5cbiAgICBNYXRoLm1pbihtYXgsIE1hdGgubWF4KG1pbiwgbikpO1xuXG4vKipcbiAqIG1hcCBhIHZhbHVlIGZyb20gb25lIHJhbmdlIG9mIG51bWJlcnMgdG8gYW5vdGhlcixcbiAqIGkuZS4gc2NhbGVtYXAoMC41LCAwLCAyLCAxMCwgMjApID0gMTVcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIHN0YXJ0MVxuICogQHBhcmFtIHN0b3AxXG4gKiBAcGFyYW0gc3RhcnQyXG4gKiBAcGFyYW0gc3RvcDJcbiAqIEByZXR1cm5zIHsqfVxuICovXG5leHBvcnQgY29uc3Qgc2NhbGVtYXAgPSAoICB2YWx1ZTpudW1iZXIsICBzdGFydDE6bnVtYmVyLCAgc3RvcDE6bnVtYmVyLCAgc3RhcnQyOm51bWJlciwgIHN0b3AyOm51bWJlciApOiBudW1iZXIgPT5cbiAgICBzdGFydDIgKyAoc3RvcDIgLSBzdGFydDIpICogKCh2YWx1ZSAtIHN0YXJ0MSkgLyAoc3RvcDEgLSBzdGFydDEpKTtcblxuXG5pbnRlcmZhY2UgU2NhbGVCb3VuZHMge1xuICAgIHNjYWxlOm51bWJlcjtcbiAgICBsZWZ0Om51bWJlcjtcbiAgICB0b3A6bnVtYmVyO1xuICAgIHdpZHRoOm51bWJlcjtcbiAgICBoZWlnaHQ6bnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3Qgc2NhbGVUb0ZpbGwgPSAoc3JjV2lkdGg6bnVtYmVyLCBzcmNIZWlnaHQ6bnVtYmVyLCBjb250YWluZXJXaWR0aDpudW1iZXIsIGNvbnRhaW5lckhlaWdodDpudW1iZXIsIGJsZWVkID0gMCwgcmVzdWx0OiBhbnk9IHt9KTogU2NhbGVCb3VuZHMgPT4ge1xuICAgIC8vc3VidHJhY3QgJ2JsZWVkJyBweCB0byBlYWNoIHNpZGUgdG8gc2NhbGUgbGFyZ2VyIGFuZCBoaWRlIGEgYm9yZGVyXG4gICAgY29uc3QgdyA9IHNyY1dpZHRoIC0gKGJsZWVkICogMik7XG4gICAgY29uc3QgaCA9IHNyY0hlaWdodCAtIChibGVlZCAqIDIpO1xuICAgIGxldCBzID0gY29udGFpbmVySGVpZ2h0IC8gaDtcblxuICAgIGlmICh3ICogcyA8IGNvbnRhaW5lcldpZHRoKSB7XG4gICAgICAgIHMgPSBjb250YWluZXJXaWR0aCAvIHc7XG4gICAgfVxuXG4gICAgY29uc3QgaXcgPSBzcmNXaWR0aCAqIHM7XG4gICAgY29uc3QgaWggPSBzcmNIZWlnaHQgKiBzO1xuICAgIGNvbnN0IGl4ID0gKGNvbnRhaW5lcldpZHRoIC0gaXcpICogMC41O1xuICAgIGNvbnN0IGl5ID0gKGNvbnRhaW5lckhlaWdodCAtIGloKSAqIDAuNTtcblxuICAgIHJlc3VsdC5sZWZ0ID0gaXg7XG4gICAgcmVzdWx0LnRvcCA9IGl5O1xuICAgIHJlc3VsdC53aWR0aCA9IHNyY1dpZHRoICogcztcbiAgICByZXN1bHQuaGVpZ2h0ID0gc3JjSGVpZ2h0ICogcztcbiAgICByZXN1bHQuc2NhbGUgPSBzO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbmV4cG9ydCBjb25zdCBkaXN0YW5jZSA9IChhcnJBOltudW1iZXIsIG51bWJlcl0sIGFyckI6W251bWJlcixudW1iZXJdKT0+e1xuICAgIGNvbnN0IGQgPSBhcnJBLm1hcCgodiwgaSk9PiBhcnJCW2ldIC0gdik7XG4gICAgcmV0dXJuIE1hdGguc3FydChkWzBdKmRbMF0gKyBkWzFdKmRbMV0pO1xufTtcblxuXG4vKipcbiAqIHRvZ2dsZSBhbiBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudFxuICovXG5leHBvcnQgY29uc3Qgc2V0Qm9vbGVhbkF0dHJpYnV0ZSA9IChlbDogRWxlbWVudCwgYXR0cjogc3RyaW5nLCBpc1RydWU6IGJvb2xlYW4pPT5cbiAgICBpc1RydWUgPyBlbC5zZXRBdHRyaWJ1dGUoYXR0ciwgJ3RydWUnKSA6IGVsLnJlbW92ZUF0dHJpYnV0ZShhdHRyKTtcblxuXG4vKipcbiAqIENvbnZlcnQgYSBjYW1lbENhc2Ugc3RyaW5nIHRvIGEgbG93ZXJjYXNlIGh5cGhlbmF0ZWQgc3RyaW5nXG4gKiBpLmUuIG15RnVuVmFyaWFibGUgYmVjb21lcyBteS1mdW4tdmFyaWFibGVcbiAqIEBwYXJhbSBjYW1lbFN0cmluZyB0aGUgY2FtZWwtY2FzZSBzdHJpbmcgdG8gY29udmVydCB0byBhIGh5cGhlbmF0ZWQgc3RyaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBjYW1lbENhc2VUb0h5cGhlbmF0ZWQgPSAoIGNhbWVsU3RyaW5nOiBzdHJpbmcgKSA9PlxuICAgIGNhbWVsU3RyaW5nLnJlcGxhY2UoIC8oW2Etel0pKFtBLVpdKS9nLCAnJDEtJDInICkudG9Mb3dlckNhc2UoKTtcblxuXG5cbmV4cG9ydCBjb25zdCBjb21wdXRlU3R5bGVSZXN1bHQgPSAocGFyZW50OiBFbGVtZW50IHwgU2hhZG93Um9vdCwgc3R5bGVLZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHRtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRtcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRtcC5zdHlsZVtzdHlsZUtleSBhcyBhbnldID0gdmFsdWU7XG4gICAgcGFyZW50LmFwcGVuZENoaWxkKHRtcCk7XG4gICAgY29uc3QgY29tcHV0ZWQgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0bXApO1xuICAgIGNvbnN0IGNvbXB1dGVkVmFsdWUgPSBjb21wdXRlZFtzdHlsZUtleSBhcyBhbnldO1xuICAgIHRtcC5wYXJlbnRFbGVtZW50ICYmIHRtcC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRtcCk7XG4gICAgcmV0dXJuIGNvbXB1dGVkVmFsdWU7XG59O1xuXG5leHBvcnQgY29uc3QgY3NzQ29sb3JUb0FycmF5ID0gKGNzczogc3RyaW5nKSA9PiB7XG4gICAgZnVuY3Rpb24gZGlnaXRzKCl7XG4gICAgICAgIC8vaGFjayBvZmYgdGhlIHRyYWlsaW5nIClcbiAgICAgICAgdmFyIHN0ciA9IGNzcy5zdWJzdHIoMCwgY3NzLmxlbmd0aC0xKTtcbiAgICAgICAgLy9oYWNrIG9mZiByZ2IoLCByZ2JhKCwgaHNsKCwgaHNsYShcbiAgICAgICAgY29uc3QgZm5TdGFydEluZGV4ID0gc3RyLmluZGV4T2YoJygnKTtcbiAgICAgICAgcmV0dXJuIHN0ci5zdWJzdHIoIGZuU3RhcnRJbmRleCArIDEsIHN0ci5sZW5ndGgpLnNwbGl0KCcsJyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1ha2VOdW1iZXJzKCBkaWdpdFN0cmluZ3M6IHN0cmluZ1tdKXtcbiAgICAgICAgbGV0IGk9MCwgbCA9IGRpZ2l0U3RyaW5ncy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGRpZ2l0czogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgZm9yICggaT0wOyBpPGw7IGkrKyl7XG4gICAgICAgICAgICAvL2Nhc3QgdG8gbnVtYmVycyBmcm9tIFN0cmluZ3NcbiAgICAgICAgICAgIGRpZ2l0c1tpXSA9IHBhcnNlRmxvYXQoIGRpZ2l0U3RyaW5nc1tpXSApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkaWdpdHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VOdW1iZXJzKCBkaWdpdHMoKSApO1xufSIsIi8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG5pbXBvcnQgeyBmYXN0TWFwIH0gZnJvbSAnLi91dGlscyc7XG5cblxuZXhwb3J0IHR5cGUgdmVjMiA9IFtudW1iZXIsIG51bWJlcl07XG5jb25zdCBpc1ZlYzIgPSAodjogYW55KTogdiBpcyB2ZWMyID0+IEFycmF5LmlzQXJyYXkodikgJiYgdi5sZW5ndGggPT09IDIgJiYgdHlwZW9mIHZbMF0gPT09ICdudW1iZXInO1xuXG5jb25zdCBpZGVudGl0eSA9IDxUPih2OiBUKTogVCA9PiB2O1xuY29uc3Qgc3EgPSAodjogbnVtYmVyKSA9PiB2ICogdjtcblxuXG5leHBvcnQgY29uc3QgYWRkID0gKGE6IHZlYzIsIGI6IHZlYzIsIHJlc3VsdD86IHZlYzIpOiB2ZWMyID0+XG4gICAgZmFzdE1hcChhLCAodmFsOiBudW1iZXIsIGk6IG51bWJlcikgPT4gdmFsICsgYltpXSwgcmVzdWx0KSBhcyB2ZWMyO1xuXG5cbmV4cG9ydCBjb25zdCBhbmdsZUJldHdlZW4gPSAoYTogdmVjMiwgYjogdmVjMik6IG51bWJlciA9PlxuICAgIE1hdGguYXRhbjIoYlsxXSAtIGFbMV0sIGJbMF0gLSBhWzBdKTtcblxuXG5leHBvcnQgY29uc3QgY29weSA9IChhOiB2ZWMyLCByZXN1bHQ6IHZlYzI9IFtOYU4sIE5hTl0pOiB2ZWMyID0+XG4gICAgZmFzdE1hcChhLCBpZGVudGl0eSwgcmVzdWx0KTtcblxuXG5leHBvcnQgY29uc3QgZGlzdGFuY2UgPSAoYTogdmVjMiwgYjogdmVjMik6IG51bWJlciA9PlxuICAgIE1hdGguc3FydCggc3EoYlswXSAtIGFbMF0pICsgc3EoYlsxXSAtIGFbMV0pICk7XG5cblxuZXhwb3J0IGNvbnN0IGVxdWFsID0gKGE6IHZlYzIsIGI6IHZlYzIpOiBib29sZWFuID0+XG4gICAgYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBsZXJwKGE6IHZlYzIsIGI6IHZlYzIsIHQ6IG51bWJlciwgcmVzdWx0OiB2ZWMyPSBbTmFOLCBOYU5dKTogdmVjMiB7XG4gICAgcmVzdWx0WzBdID0gKGJbMF0gLSBhWzBdKSAqIHQgKyBhWzBdO1xuICAgIHJlc3VsdFsxXSA9IChiWzFdIC0gYVsxXSkgKiB0ICsgYVsxXTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgY29uc3QgbWFnbml0dWRlID0gKFt4LCB5XTogdmVjMik6IG51bWJlciA9PlxuICAgIHggKiB4ICsgeSAqIHk7XG5cblxuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZSA9IChhOiB2ZWMyLCByZXN1bHQ6IHZlYzI9IFsgTmFOLCBOYU4gXSkgPT4ge1xuICAgIGxldCBtYWcgPSBtYWduaXR1ZGUoYSk7XG4gICAgY29uc3QgW3gsIHldID0gYTtcbiAgICBpZiAobWFnID4gMCkge1xuICAgICAgICBtYWcgPSAxLjAgLyBNYXRoLnNxcnQobWFnKTtcbiAgICAgICAgcmVzdWx0WzBdID0geCAqIG1hZztcbiAgICAgICAgcmVzdWx0WzFdID0geSAqIG1hZztcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblxuZXhwb3J0IGNvbnN0IHNjYWxlID0gKGE6IHZlYzIsIGI6IHZlYzJ8bnVtYmVyLCByZXN1bHQ/OiB2ZWMyKTogdmVjMiA9PlxuICAgIGZhc3RNYXAoYSwgKHZhbDogbnVtYmVyLCBpOiBudW1iZXIpID0+IHZhbCAqIChpc1ZlYzIoYikgPyBiW2ldIDogIGIpLCByZXN1bHQpIGFzIHZlYzI7XG5cblxuZXhwb3J0IGNvbnN0IHN1YiA9IChhOiB2ZWMyLCBiOiB2ZWMyLCByZXN1bHQ/OiB2ZWMyKTogdmVjMiA9PlxuICAgIGZhc3RNYXAoYSwgKHZhbDogbnVtYmVyLCBpOiBudW1iZXIpID0+IHZhbCAtIGJbaV0sIHJlc3VsdCkgYXMgdmVjMjtcblxuXG5leHBvcnQgZnVuY3Rpb24gdG9DYXJ0ZXNpYW4oW3gsIHldOiB2ZWMyLCByZXN1bHQ6IHZlYzI9IFsgTmFOLCBOYU4gXSk6IHZlYzIge1xuICAgIHJlc3VsdFswXSA9IHggKiBNYXRoLmNvcyh5KTtcbiAgICByZXN1bHRbMV0gPSB4ICogTWF0aC5zaW4oeSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gdG9Qb2xhcihbeCwgeV06IHZlYzIsIHJlc3VsdDogdmVjMj0gWyBOYU4sIE5hTiBdKTogdmVjMiB7XG4gICAgcmVzdWx0WzBdID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xuICAgIHJlc3VsdFsxXSA9IE1hdGguYXRhbjIoeSwgeCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsIi8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG5jb25zdCBkZWZhdWx0VmlkZW9PcHRpb25zOk1lZGlhVHJhY2tDb25zdHJhaW50cyA9IHtcbiAgICBmYWNpbmdNb2RlOiAndXNlcicsXG4gICAgd2lkdGg6IDY0MCxcbiAgICBoZWlnaHQ6IDQ4MCxcbiAgICBmcmFtZVJhdGU6IDMwXG59O1xuXG4vKipcbiAqIHV0aWxpdHkgdG8gZ2V0IGEgd2ViY2FtIGZlZWQgaW4gYSB2aWRlbyBlbGVtZW50XG4gKiBAcmV0dXJucyBQcm9taXNlPEhUTUxWaWRlb0VsZW1lbnQ+XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWJjYW0odmlkZW86SFRNTFZpZGVvRWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpLCBvcHRpb25zOk1lZGlhVHJhY2tDb25zdHJhaW50cz1kZWZhdWx0VmlkZW9PcHRpb25zKXtcbiAgICBpZighd2luZG93Lm5hdmlnYXRvci5tZWRpYURldmljZXMgfHwgIXdpbmRvdy5uYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ1lvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFdlYlJUQy4gUGxlYXNlIHRyeSBhbm90aGVyIG9uZS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHdpbmRvdy5uYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IHZpZGVvOiBvcHRpb25zIH0pXG4gICAgICAgIC50aGVuKChtZWRpYVN0cmVhbSk9PntcbiAgICAgICAgICAgIHZpZGVvLnNyY09iamVjdCA9IG1lZGlhU3RyZWFtO1xuICAgICAgICAgICAgcmV0dXJuIHZpZGVvO1xuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ0NvdWxkIG5vdCBvcGVuIHlvdXIgY2FtZXJhLiBZb3UgbWF5IGhhdmUgZGVuaWVkIGFjY2Vzcy4nKTtcbiAgICAgICAgfSk7XG59O1xuXG5jb25zdCBoYXNNZWRpYVN0cmVhbSA9ICh2aWRlbzpIVE1MVmlkZW9FbGVtZW50KTogYm9vbGVhbiA9PlxuICAgIHZpZGVvLnNyY09iamVjdCAmJiB2aWRlby5zcmNPYmplY3QgaW5zdGFuY2VvZiBNZWRpYVN0cmVhbTtcblxuY29uc3QgZ2V0TWVkaWFTdHJlYW0gPSAodmlkZW86SFRNTFZpZGVvRWxlbWVudCk6IE1lZGlhU3RyZWFtID0+XG4gICAgaGFzTWVkaWFTdHJlYW0odmlkZW8pID8gdmlkZW8uc3JjT2JqZWN0IGFzIE1lZGlhU3RyZWFtIDogbnVsbDtcblxuLyoqXG4gKiBzdG9wIGFsbCB0cmFja3Mgb24gYSB2aWRlbyBhbmQgaXRzIHNyY09iamVjdFxuICovXG5leHBvcnQgY29uc3Qgc3RvcEFsbFRyYWNrcyA9ICh2aWRlbzpIVE1MVmlkZW9FbGVtZW50KT0+e1xuICAgIHZpZGVvLnBhdXNlKCk7XG4gICAgZ2V0TWVkaWFTdHJlYW0odmlkZW8pLmdldFRyYWNrcygpLmZvckVhY2godHJhY2s9PiB0cmFjay5zdG9wKCkpO1xufTtcblxuXG4vKipcbiAqIFdlYmNhbUNhbnZhcyBzaW1wbGlmaWVzIGluaXRpYWxpemluZyBhIFdlYlJUQyBmZWVkIGFuZCByZW5kZXJpbmcgaXQgdG8gYSBjYW52YXNcbiAqIGl0IGluY2x1ZGVzIGl0cyBvd24gcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGxvb3AgdXNpbmcgQW5pbWl0dGVyLCBwcm92aWRpbmdcbiAqIHN0YXJ0KCksIHN0b3AoKSBhbmQgZXZlbnRzIGZvciAndXBkYXRlJywgJ3N0YXJ0JywgJ3N0b3AnIGV0Y1xuICovXG5leHBvcnQgY2xhc3MgV2ViY2FtQ2FudmFzIHtcblxuICAgIHB1YmxpYyBkb21FbGVtZW50OkhUTUxDYW52YXNFbGVtZW50O1xuICAgIHB1YmxpYyBjdHg6Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICAgIHB1YmxpYyB2aWRlbzpIVE1MVmlkZW9FbGVtZW50O1xuXG4gICAgcHJpdmF0ZSBfX3Byb21pc2VHZXRXZWJjYW06UHJvbWlzZTxIVE1MVmlkZW9FbGVtZW50PjtcbiAgICBwcml2YXRlIF9fcHJvbWlzZUhhc1Jlc2l6ZWQ6UHJvbWlzZTx2b2lkPjtcblxuXG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5kb21FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIHRoaXMuZG9tRWxlbWVudC5jbGFzc0xpc3QuYWRkKCd3ZWJjYW0nKTtcbiAgICAgICAgdGhpcy5jdHggPSB0aGlzLmRvbUVsZW1lbnQuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgdGhpcy52aWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG5cbiAgICAgICAgdGhpcy5yZXNpemUgPSB0aGlzLnJlc2l6ZS5iaW5kKHRoaXMpO1xuXG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZSh2aWRlb09wdGlvbnM/Ok1lZGlhVHJhY2tDb25zdHJhaW50cyk6IFByb21pc2U8V2ViY2FtQ2FudmFzPiB7XG4gICAgICAgIC8vaWYgaXRzIGFscmVhZHkgaW5pdGlhbGl6ZWQgcmV0dXJuIHRoZSBvbGRlciBwcm9taXNlIGZvciBpbW1lZGlhdGUgcmVzb2x1dGlvblxuICAgICAgICBpZighdGhpcy5fX3Byb21pc2VHZXRXZWJjYW0gfHwgIXRoaXMuX19wcm9taXNlSGFzUmVzaXplZCl7XG4gICAgICAgICAgICAvL3RoZSBjYW52YXMgaGFzIGZpbmlzaGVkIGluaXRpYWxpemluZyB3aGVuIGl0IGhhc1xuICAgICAgICAgICAgLy9hIGNhbWVyYSBmZWVkIEFORCBoYXMgcmVzaXplZCB0byB0aGUgY2FtZXJhcyBzaXplXG5cbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy5fX3Byb21pc2VIYXNSZXNpemVkID0gbmV3IFByb21pc2UoKHJlc29sdmUpPT57XG4gICAgICAgICAgICAgICAgY29uc3Qgb25UaW1lVXBkYXRlID0gKCk9PntcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy52aWRlby52aWRlb1dpZHRoICogdGhpcy52aWRlby52aWRlb0hlaWdodCA8IDQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3ZpZGVvIG5vdCBzaXplZCB5ZXQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RpbWV1cGRhdGUnLCBvblRpbWVVcGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHRoaXMudmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsIG9uVGltZVVwZGF0ZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5fX3Byb21pc2VHZXRXZWJjYW0gPSBnZXRXZWJjYW0odGhpcy52aWRlbywgdmlkZW9PcHRpb25zKVxuICAgICAgICAgICAgICAgIC50aGVuKCh2aWRlbyk9PntcbiAgICAgICAgICAgICAgICAgICAgLy9wbGF5IHJldHVybnMgYSBwcm9taXNlIHdpdGhvdXQgYW55IHJldHVyblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlkZW8ucGxheSgpLnRoZW4oKCk9PnZpZGVvKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9nZXQgdGhlIHdlYmNhbSBhbmQgcmVzaXplIGl0LCByZXR1cm4gdGhlIFdlYmNhbUNhbnZhc1xuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFsgdGhpcy5fX3Byb21pc2VHZXRXZWJjYW0sIHRoaXMuX19wcm9taXNlSGFzUmVzaXplZCBdKVxuICAgICAgICAgICAgLnRoZW4oKCk9PiB0aGlzKTtcbiAgICB9XG5cbiAgICBnZXRGcmFtZVJhdGUoKXtcblxuICAgICAgICBjb25zdCBzdHJlYW0gPSBnZXRNZWRpYVN0cmVhbSh0aGlzLnZpZGVvKTtcbiAgICAgICAgaWYoc3RyZWFtKSB7XG4gICAgICAgICAgICBjb25zdCB2aWRlb1RyYWNrcyA9IHN0cmVhbS5nZXRWaWRlb1RyYWNrcygpO1xuICAgICAgICAgICAgaWYodmlkZW9UcmFja3MgJiYgdmlkZW9UcmFja3NbMF0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmlkZW9UcmFja3NbMF0uZ2V0U2V0dGluZ3MoKS5mcmFtZVJhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gMzA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IHRoZSBpbWFnZSBkYXRhIGZyb20gdGhlIGNhbnZhc1xuICAgICAqIEByZXR1cm5zIEltYWdlRGF0YVxuICAgICAqL1xuICAgIGdldEltYWdlRGF0YSh4Om51bWJlcj0wLCB5Om51bWJlcj0wLCB3Om51bWJlcj10aGlzLmRvbUVsZW1lbnQud2lkdGgsIGg6bnVtYmVyPXRoaXMuZG9tRWxlbWVudC5oZWlnaHQpe1xuICAgICAgICByZXR1cm4gdGhpcy5jdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHcsIGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHVwZGF0ZSB0aGUgcmVuZGVyaW5nIHRvIHRoZSBjYW52YXNcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZGVsdGFUaW1lLCBtaWxsaXNlY29uZHMgc2luY2UgbGFzdCB1cGRhdGVcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZWxhcHNlZFRpbWUsIHRvdGFsIG1pbGxpc2Vjb25kcyBydW5uaW5nXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGZyYW1lQ291bnQsIG51bWJlciBvZiB1cGRhdGVzIHRoYXQgaGF2ZSBvY2N1cnJlZFxuICAgICAqL1xuICAgIHVwZGF0ZSgpe1xuICAgICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oLTEuMCwgMCwgMCwgMSwgdGhpcy5kb21FbGVtZW50LndpZHRoLCAwKTsgLy8gbWlycm9yZWQgZm9yIGRyYXcgb2YgdmlkZW9cbiAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKHRoaXMudmlkZW8sIDAsIDAsIHRoaXMuZG9tRWxlbWVudC53aWR0aCwgdGhpcy5kb21FbGVtZW50LmhlaWdodCk7XG4gICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSggMS4wLCAwLCAwLCAxLCAwLCAwKTsgLy8gdW5taXJyb3JlZCBmb3IgZHJhdyBvZiByZXN1bHRzXG4gICAgfVxuXG4gICAgcmVzaXplKCl7XG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLmRvbUVsZW1lbnQud2lkdGggIT09IHRoaXMudmlkZW8udmlkZW9XaWR0aCB8fCB0aGlzLmRvbUVsZW1lbnQuaGVpZ2h0ICE9PSB0aGlzLnZpZGVvLnZpZGVvSGVpZ2h0O1xuICAgICAgICB0aGlzLmRvbUVsZW1lbnQud2lkdGggPSB0aGlzLnZpZGVvLnZpZGVvV2lkdGg7XG4gICAgICAgIHRoaXMuZG9tRWxlbWVudC5oZWlnaHQgPSB0aGlzLnZpZGVvLnZpZGVvSGVpZ2h0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBzdG9wKCk6UHJvbWlzZTx2b2lkPntcbiAgICAgICAgaWYoIXRoaXMuX19wcm9taXNlR2V0V2ViY2FtKXtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICAvL3ByZXZlbnQgdGhpcyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdXBkYXRlcy8yMDE3LzA2L3BsYXktcmVxdWVzdC13YXMtaW50ZXJydXB0ZWRcbiAgICAgICAgcmV0dXJuIHRoaXMuX19wcm9taXNlR2V0V2ViY2FtXG4gICAgICAgICAgICAudGhlbigoKT0+e1xuICAgICAgICAgICAgICAgIHN0b3BBbGxUcmFja3ModGhpcy52aWRlbylcbiAgICAgICAgICAgICAgICB0aGlzLl9fcHJvbWlzZUdldFdlYmNhbSA9IHRoaXMuX19wcm9taXNlSGFzUmVzaXplZCA9IG51bGw7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG59XG4iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iXSwic291cmNlUm9vdCI6IiJ9