(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.CartPage = undefined;

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _cart = require('./services/cart.service');

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var CartPage = exports.CartPage = function () {
  function CartPage(CONFIG) {
    _classCallCheck(this, CartPage);

    this.CONFIG = CONFIG;

    this.events();
    this.cartService = new _cart.CartService();
    this.onUpdateFunction = null;
    this.updates = true;
  }

  _createClass(CartPage, [{
    key: 'onUpdateEvent',
    value: function onUpdateEvent(cb) {
      this.onUpdateFunction = cb;
    }
  }, {
    key: 'events',
    value: function events() {
      var _this = this;

      /**
       * Удаление товара из корзины
       * После удаления обновляются все товары в корзине
       */
      $(document).on('click', '.remove-from-cart', function (event) {
        var $this = $(event.currentTarget);

        if ($this.hasClass('enrollment-page')) return;

        _this.cartService.deleteFromCart($(event.currentTarget).data('id'), null, null, $(event.currentTarget).data('viewBlock')).then(function () {
          document.dispatchEvent(new CustomEvent('remove-from-cart', {
            detail: {
              product: {
                id: $(event.currentTarget).data('sku')
              },
              quantity: $(event.currentTarget).closest('tr').find('.change_product_count').val()
            }
          }));
          if (_this.updates) {
            _this.cartService.refreshCart();
            _this.cartService.refreshHeaderCart();
            _this.cartService.refreshEnrollmentCart();
          }
        });
      });

      /**
       * Изменение автошипа товара в корзине
       */
      $(document).on('change', '.change__autoship', function (event) {
        _this.updateProduct($(event.currentTarget).closest('tr'), $(event.currentTarget).data('viewBlock'));
        if ($(event.currentTarget).prop('checked') && $(event.currentTarget).data('has_autoship')) {
          _this.greatChoiseAuthoshipPopup();
        }
      });

      $(document).on('change', '.change__autoship-in-popup', function (event) {
        _this.updateProductInPopup($(event.currentTarget).closest('tr'), $(event.currentTarget).data('viewBlock'));
        if ($(event.currentTarget).prop('checked') && $(event.currentTarget).data('has_autoship')) {
          _this.greatChoiseAuthoshipPopup();
        }
      });

      $(document).on('change', '.change_product_count-in-popup', function (event) {
        _this.updateProductInPopup($(event.currentTarget).closest('tr'), $(event.currentTarget).data('viewBlock'));
      });

      /**
       * Изменение количества товара в корзине
       */
      $(document).on('change', '.change_product_count', function (event) {
        _this.updateProduct($(event.currentTarget).closest('tr'), $(event.currentTarget).data('viewBlock'));
      });

      $(document).on('click', '.check-radio-label input', function (event) {
        _this.addToAutoshipInPopup(event);
      });
    }
  }, {
    key: 'greatChoiseAuthoshipPopup',
    value: function greatChoiseAuthoshipPopup() {
      $.getPopup('great-choise-autoship').then(function () {
        $('#great-choise-autoship').showPopup();
      });
    }

  }, {
    key: 'updateProductInPopup',
    value: function updateProductInPopup($item) {
      var _this2 = this;

      var actionPage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';

      var count = $item.find('.change_product_count-in-popup').val();
      var allQty = 0;

      $('.change_product_count').each(function () {
        var items = $(this).val();
        allQty += Number(items);
      });

      $.post(window.CONFIG.BASE_URL + 'cart/update-cart', {
          id: $item.data('id'),
          auto_ship: $item.find('.change__autoship-in-popup').prop('checked') ? 1 : 0,
          qty: count <= 1 ? 1 : count,
          shipping_address: localStorage.getItem('shipping_address'),
          shipMethod: localStorage.getItem('shipMethodCode'),
          actionPage: 'Update product cart from page:' + window.location.href + ' ' + actionPage
      }).then(function (res) {
        res.auto_ship == 0 ? $item.find('.cart__product__total__price_full:not(".member")').addClass('hidden') : $item.find('.cart__product__total__price_full').removeClass('hidden');
        $item.find('.cart__product__total__price_full').html(res.retail_price);
        $item.find('.cart__products__price').html(_this2.CONFIG.CURRENCY_SYMBOL + res.price_for_once);
        $item.find('.cart__product__total__price_f').html(res.price_with_currency);
        if ($item.find('.change__autoship').prop('checked') && res.is_product_in_autoship) {
          _this2.showIsInAutoshipPopup();
        }
        if (_this2.onUpdateFunction && typeof _this2.onUpdateFunction == 'function') _this2.onUpdateFunction();
      }, function (err) {
        var countError = JSON.parse(err.responseText);
        $($item).find('.error').text(countError.qty);
        setTimeout(function () {
          $($item).find('.error').text('');
        }, 3000);
      });
    }

    /**
     * Обновление продукта в корзине
     * @param $item - Jquery элемент tr таблицы
     */

  }, {
    key: 'updateProduct',
    value: function updateProduct($item) {
      var _this3 = this;

      var actionPage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';

      $('.loader').show();

      var allQty = 0;

      $('.change_product_count').each(function () {
        var items = $(this).val();
        allQty += Number(items);
      });

      this.cartService.updateCart($item, actionPage).then(function (res) {
        var response = res;
        _this3.updateCartItem($item, res);
        _this3.updateCartDatas(response);
        if ($item.find('.change__autoship').prop('checked') && res.is_product_in_autoship) {
          _this3.showIsInAutoshipPopup();
        }
        $('.total_in_cart').html(allQty);
        $('.cart_total_cv').text(res.get_total_cv + "CV");
        if (_this3.onUpdateFunction && typeof _this3.onUpdateFunction == 'function') _this3.onUpdateFunction();
        $(document).trigger('change-product-count');

        //for vbo-checkout
        $('.js-cart_products_container').html(response.views.first_order);
        $('.js-autoship_only_container').html(response.views.autoship_order);

        $('.loader').hide();
      }, function (err) {
        var countError = JSON.parse(err.responseText);
        $($item).find('.error').text(countError.qty);
        setTimeout(function () {
          $($item).find('.error').text('');
        }, 3000);
        $('.loader').hide();
      });
    }
  }, {
    key: 'showIsInAutoshipPopup',
    value: function showIsInAutoshipPopup() {
      $.getPopup('is-it-autoship').then(function () {
        $('#is-it-autoship').showPopup();
      });
    }

    /**
     * Обновление данных товара в корзине
     * @param $item - Jquery элемент tr таблицы
     * @param data - Данные товара возвращаемые после апдейта корзины
     */

  }, {
    key: 'updateCartItem',
    value: function updateCartItem($item, data) {
      var total__price_full = Math.round(data.price * data.qty_total * 100 / 100).toFixed(2);
      var total__price_full1 = (data.price * data.qty_total * 100 / 100).toFixed(2);

      $('.cart_total_price').html(data.cart_total_price);
      $item.find('.cart__product__total__price .cart__product__total__price_f').html(data.price_with_currency);
      $item.find('.cart__product__total__price .cart__product__total__price_f.retail-price').html(data.retail_price);
      $item.find('.cart__product__total__price_full').html(data.retail_price);
      $item.find('.cart__product__total__price .cv-by-product').text(data.total_cv);
      $item.find('.cart__product__total__cv').text(data.total_cv + ' CV');


      if (data.auto_ship) {
        $item.find('.cart__product__total__price_full').removeClass('hidden');
      } else {
        $item.find('.cart__product__total__price_full').addClass('hidden');
      }

      this.cartService.refreshHeaderCart();
      return true;
    }
  }, {
    key: 'updateCartDatas',


    /**
     *
     * @param data
     */
    value: function updateCartDatas(data) {
      if (CONFIG.PAGE !== "checkout") {
        $('.cart_total_price').html(data.cart_total_price);
        $('.cart_subtotal_price--checkout-subtotal').html(data.cart_total_price);
        $('.cart_subtotal_price').html(data.cart_total_price);
      }

      $('.cart_total_cv').text(data.get_total_cv + 'CV');
      $('.member-savings').text();
      $('.total_in_cart').text(data.cart_total_count);
    }
  }, {
    key: 'addToAutoshipInPopup',
    value: function addToAutoshipInPopup(event) {
      var productId = $(event.currentTarget).closest('tr').data('id');

      $('tr[data-id=' + productId + ']').find('input#good-' + productId).prop('checked', true);
    }
  }, {
    key: 'getFormattedPrice',
    value: function getFormattedPrice(price) {
        return window.CONFIG.CURRENCY_SYMBOL + (Math.floor(price * 100) / 100).toFixed(2);
    }
  }]);

  return CartPage;
}();

},{"./services/cart.service":9}],2:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
    value: true
});
exports.Goods = undefined;

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _cart = require("../cart.page");

var _cart2 = require("../services/cart.service");

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Goods = exports.Goods = function () {
    function Goods(CONFIG) {
        _classCallCheck(this, Goods);

        this.CONFIG = CONFIG;

        this.wasNotAutoshipPopup = null;
        this.currentPopup = null;
        this.lastAddedGood = null;

        this.buttonIsClicked = false;
        this.$clickedBtn = null;

        this.cart = new _cart.CartPage(CONFIG);
        this.cartService = new _cart2.CartService();

        this.events();
        this.plugins();
    }

    _createClass(Goods, [{
        key: "events",
        value: function events() {
            var _this = this;

            /**
             * У элемента по которому кликаем должен быть атрибут data-id с id товара,
             * если это страница enrollment, то добавляем атрибут data-enrollment="1"
             */
            $(document).on('click', '.add__product__to__cart', function (event) {
                if (_this.buttonIsClicked) return;

                var $btn = $(event.currentTarget),
                    enrollment = $btn.data('enrollment');

                _this.$clickedBtn = $btn;
                _this.toggleDisablingAddToCartBtn(true);

                _this.cartService.addToCart(
                  $btn.data('id'),
                  $btn
                    .closest('.cart__products__quantity')
                    .find('.product_count_from_add_to_cart')
                    .val(),
                    $('#with-autoship-' + $btn.data('id')).prop('checked')
                    ? 1
                    : 0, $btn.data('bundle_id'),
                    $btn.data('viewBlock')
                    )
                    .then(function (res) {
                      try {
                        let cart_details = res["cart_details"];
                        _learnq.push(['identify', {'$email' : window.CONFIG.USER.EMAIL}]);
                        _learnq.push([
                          "track",
                          "Added to Cart",
                          cart_details,
                        ]);

                        //Added in google tag manager
                        dataLayer.push({
                          "event" : 'nisl_addToCart',
                          'ecommerce' : {
                            'nisl_addToCart': {
                                'products' : cart_details,
                            }
                          },
                        });
                      } catch (error) {
                        console.log("Klaviyo Exception:", error);
                      }

                      // Google Tag Manager

                    if (enrollment) {
                        _this.cartService.refreshEnrollmentCart();
                        $('.switch-cart').removeClass('closed');
                        _this.cartService.vboCartPositioner(false);
                    } else {
                        _this.cartService.refreshHeaderCart();
                        _this.cartService.refreshEnrollmentCart();
                        _this.onAddToCart(res);
                    }

                    document.dispatchEvent(new CustomEvent('add-to-cart-success', {
                        detail: {
                            product: {
                                id: res.sku
                            },
                            quantity: $('#product_count_from_add_to_cart').val()
                        }
                    }));
                }, function (err) {

                    var errorsArray = JSON.parse(err.responseText);

                    if (enrollment) {
                        $btn.closest('.product__item__btns').find('.error').text(errorsArray.count[0]);
                    } else {
                        $btn.parent().find('.error').text(errorsArray.count);
                    }
                    _this.toggleDisablingAddToCartBtn(false);

                    setTimeout(function () {
                        $('.error').text('');
                    }, 3000);
                });
            });

            /**
             * Добавляет товар в автошип
             */
            $(document).on('click', '.add-to-autoship', function (event) {

                _this.cartService.addToAutoship(_this.lastAddedGood.id, _this.lastAddedGood.qty_total).then(function () {
                    _this.lastAddedGood = null;
                    _this.currentPopup.close();
                });
            });

            /**
             * Добавляет товар в корзину только в автошип.
             * Возможно на странице /vbo/catalog
             */
            $(document).on('click', '.js-add_to_autoship_only', function (event) {
                var $btn = $(event.currentTarget);
                _this.$clickedBtn = $btn;

                _this.toggleDisablingAddToCartBtn(true);

                _this.cartService.addToAutoshipOnly($btn.data('id'), $btn.closest('.cart__products__quantity').find('.product_count_from_add_to_cart').val()).then(function (res) {
                    _this.cartService.refreshEnrollmentCart();

                    $('.switch-cart').removeClass('closed');
                    _this.cartService.vboCartPositioner(false);

                    _this.toggleDisablingAddToCartBtn(false);

                    // TODO: is needed?
                    document.dispatchEvent(new CustomEvent('add-to-cart-success', {
                        detail: {
                            product: {
                                id: res.sku
                            },
                            quantity: $('#product_count_from_add_to_cart').val()
                        }
                    }));
                }, function (err) {

                    var errorsArray = JSON.parse(err.responseText);
                    $btn.parent().find('.error').text(errorsArray.count);
                    _this.toggleDisablingAddToCartBtn(false);

                    setTimeout(function () {
                        $('.error').text('');
                    }, 3000);
                });
            });

            /**
             * Разворачивает описание автошипа внутри попапа
             */
            $(document).on('click', '.more-about-autoship', function (event) {
                $(event.currentTarget).next().slideToggle(300, function () {
                    _this.wasNotAutoshipPopup.reposition(100);
                });
            });
        }
    }, {
        key: "plugins",
        value: function plugins() {}
    }, {
        key: "onAddToCart",
        value: function onAddToCart(res) {
            this.lastAddedGood = res;

            if (res.auto_ship == 1 || res.is_show_autoship == 0) {
                return this.showCartPopup();
            }

            /**
             * Если товар находится в автошипе то отображается этот попап
             */
            if (res.is_product_in_autoship) {
                return this.productInAutoship(res);
            }

            /**
             * Если у пользователя раньше был товар в автошипе то отображается один попап
             */
            if (CONFIG.HAS_AUTOSHIP) {
                return this.userHasAutoship(res);
            } else {
                return this.notHaveAutoship(res);
            }
        }

        /**
         * Попап для товара который находится в автошипе
         */

    }, {
        key: "productInAutoship",
        value: function productInAutoship(res) {
            var _this2 = this;

            return this.showPopup('great-choice', { onClose: function onClose() {
                    return _this2.showCartPopup();
                } }).then(function (popup) {
                _this2.toggleDisablingAddToCartBtn(false);
                _this2.currentPopup = popup;
            });
        }

        /**
         * Попап когда у пользователя раньше был автошип
         */

    }, {
        key: "userHasAutoship",
        value: function userHasAutoship(res) {
            var _this3 = this;

            return this.showPopup('was-autoship', { onClose: function onClose() {
                    return _this3.showCartPopup();
                } }).then(function (popup) {
                _this3.currentPopup = popup;
                _this3.refreshAutoshipPopupsData(res);
            });
        }

        /**
         * Попап когда у пользователя не было автошипа
         */

    }, {
        key: "notHaveAutoship",
        value: function notHaveAutoship(res) {
            var _this4 = this;

            return this.showPopup('was-not-autoship', { onClose: function onClose() {
                    return _this4.showCartPopup();
                } }).then(function (popup) {
                _this4.wasNotAutoshipPopup = popup;
                _this4.currentPopup = popup;
                _this4.refreshAutoshipPopupsData(res);
            });
        }

        /**
         * Обновление данных товара в попапе предлагающем добавить товар в автошип
         * @param data - Данные товара возвращаемые после добавления в корзину
         */

    }, {
        key: "refreshAutoshipPopupsData",
        value: function refreshAutoshipPopupsData(data) {
            $('.autoship_popup_product_image').attr('src', data.image);
            if (data.is_moderate) {
                $('.autoship_popup_product_name').html(data.name);
                $('.autoship_popup_product_name').attr('href', data.link);
            } else {
                $('.autoship_popup_product_name_span').html(data.name);
            }

            $('.autoship_popup_product_qty').html(data.qty_total);
            $('.autoship_popup_product_price').html(data.price_with_currency);
            $('#save-member-percent').html(data.memberSavePercent);
        }

        /**
         * Отображение попапа корзины
         */

    }, {
        key: "showCartPopup",
        value: function showCartPopup() {
            var _this5 = this;

            return $.getPopup('cart').then(function () {
                _this5.currentPopup = $('#cart').showPopup();
                _this5.$clickedBtn.attr('disabled', false);
                _this5.buttonIsClicked = false;
            });
        }

        /**
         * Отображает попап
         * Но сначала он получает его с сервера
         * @param popupName - Имя попапа, является и его айдишником
         * @param options - Опции для попапа
         */

    }, {
        key: "showPopup",
        value: function showPopup(popupName, options) {
            return $.getPopup(popupName).then(function () {
                return $('#' + popupName).showPopup(options);
            });
        }

        /**
         *
         * @param state: boolean
         */

    }, {
        key: "toggleDisablingAddToCartBtn",
        value: function toggleDisablingAddToCartBtn(state) {
            this.$clickedBtn.attr('disabled', state);
            this.buttonIsClicked = state;
        }
    }]);

    return Goods;
}();

},{"../cart.page":1,"../services/cart.service":9}],3:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
    value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Reviews = exports.Reviews = function () {
    function Reviews() {
        _classCallCheck(this, Reviews);

        this.events();
    }

    _createClass(Reviews, [{
        key: 'events',
        value: function events() {
            /**
             * Показать блок добавления отзыва
             */
            $(document).on('click', '#show-new-review-form', function (event) {
                $('#new__review__container').slideDown();
                $(event.currentTarget).hide();
            });

            /**
             * Скрыть блок добавления отзывы
             */
            $(document).on('click', '#hide-new-review-form', function () {
                $('#show-new-review-form').show();
                $('#new__review__container').slideUp();
            });

            /**
             * Запрос на добавление отзыва
             */
            $(document).on('submit', '#live-review', function () {

                var form = this;

                $.post(CONFIG.BASE_URL + 'review/?' + $(this).serialize()).then(function () {
                    window.location.reload();
                }, function (err) {
                    Validate($(form), err.responseJSON);
                });
            });
        }
    }]);

    return Reviews;
}();

},{}],4:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
    value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var ZurikAccordeon = exports.ZurikAccordeon = function () {
    function ZurikAccordeon(selector) {
        _classCallCheck(this, ZurikAccordeon);

        this.initPlugin();
        $(selector).zurikAccordeon();
    }

    _createClass(ZurikAccordeon, [{
        key: 'initPlugin',
        value: function initPlugin() {
            $.fn.zurikAccordeon = function () {

                var module = {};
                var $this = this;

                module.hideContent = function ($item, onInit) {
                    if (onInit) {
                        $item.find('.accordeon-content').hide();
                    } else {
                        $item.find('.accordeon-content').slideUp();
                    }
                };

                module.showContent = function ($item, onInit) {
                    if (onInit) {
                        $item.find('.accordeon-content').show();
                    } else {
                        $item.find('.accordeon-content').slideDown();
                    }
                };

                module.hideAllItems = function ($accordeon, onInit) {
                    module.hideContent($accordeon, onInit);
                    $accordeon.find('.accordeon-item').addClass('accordeon-hidden').removeClass('accordeon-opened');
                };

                module.showAccordeon = function ($accordeonItem, onInit) {
                    module.showContent($accordeonItem, onInit);
                    $accordeonItem.removeClass('accordeon-hidden').addClass('accordeon-opened');
                };

                module.hideAccordeon = function ($accordeonItem, onInit) {
                    module.hideContent($accordeonItem, onInit);
                    $accordeonItem.addClass('accordeon-hidden').removeClass('accordeon-opened');
                };

                module.addEvents = function ($toggles) {
                    $toggles.click(function () {

                        var $item = $(this).closest('.accordeon-item');
                        var isOpen = $item.data('open');

                        $toggles.closest('.accordeon-item').data('open', false);

                        if (isOpen) {
                            module.hideAccordeon($item);
                        } else {
                            module.hideAllItems($toggles.closest('.accordeon'));
                            module.showAccordeon($item);
                            $item.data('open', true);
                        }
                    });
                };

                module.init = function ($accordeon) {
                    module.hideAllItems($accordeon, true);
                    module.addEvents($accordeon.find('.accordeon-toggle'));
                };

                (function init() {
                    $this.each(function (index, element) {
                        module.init($(element));
                    });
                })();
            };
        }
    }]);

    return ZurikAccordeon;
}();

},{}],5:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
    value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var ZurikRating = exports.ZurikRating = function () {
    function ZurikRating(selector) {
        _classCallCheck(this, ZurikRating);

        if ($(selector).length > 0) {
            this.initRatingPlugin();
            $(selector).zurikRating();
        }
    }

    _createClass(ZurikRating, [{
        key: 'initRatingPlugin',
        value: function initRatingPlugin() {

            $.fn.zurikRating = function (options) {

                var opt = $.extend({
                    onChange: function onChange() {},
                    onInit: function onInit() {}
                }, options);

                var module = {};

                var CHECKED_CLASS = $(this).data('checked') || 'icon-star-big';
                var UNCHECKED_CLASS = $(this).data('default') || 'icon-star-big-disabled';

                module.init = function ($rating) {

                    $rating.hide();
                    $rating.wrap('<div class="rating-wrapper"/>');
                    var $wrapper = $rating.parent();
                    var $votes = module.getVote($rating.data('votes'));
                    var disabled = $rating.attr('disabled');
                    var value = $rating.val();

                    for (var i = 1; i <= 5; i++) {
                        var checked = false;
                        if (i <= value) {
                            checked = CHECKED_CLASS;
                        }
                        var $star = module.newStar(i, checked);
                        $wrapper.append($star);
                    }

                    if (!disabled) module.addEvents($wrapper);
                    if (disabled) $wrapper.append($votes);
                    if (disabled) $wrapper.addClass('rating-disabled');
                };

                module.newStar = function (value, checkedClass) {
                    var $star = $('<a href="javascript:void(0)"/>');
                    $star.addClass(UNCHECKED_CLASS);
                    $star.data('value', value);

                    if (checkedClass) {
                        $star.addClass(checkedClass);
                    }

                    return $star;
                };

                module.getVote = function (votes) {
                    if (!votes) {
                        return '';
                    }

                    var $votes = $('<span class="rating-votes"/>');
                    $votes.text('(' + (votes || 0) + ')');
                };

                module.addEvents = function ($wrapper) {

                    var $stars = $wrapper.find('a');
                    var $rating = $wrapper.find('input');

                    $stars.hover(function () {
                        $stars.removeClass(CHECKED_CLASS).addClass(UNCHECKED_CLASS);
                        $(this).addClass(CHECKED_CLASS);
                        $(this).prevAll('a').addClass(CHECKED_CLASS);
                    }, function () {
                        $stars.removeClass(CHECKED_CLASS);
                        if ($rating.val()) {
                            for (var i = 0; i < $rating.val(); i++) {
                                $stars.eq(i).addClass(CHECKED_CLASS).removeClass(UNCHECKED_CLASS);
                            }
                        }
                    });

                    $stars.click(function () {
                        $rating.val($(this).data('value'));
                    });
                };

                this.each(function (index, elem) {
                    module.init($(elem));
                });
            };
        }
    }]);

    return ZurikRating;
}();

},{}],6:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
    value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var ZurikTabs = exports.ZurikTabs = function () {
    function ZurikTabs(selector) {
        _classCallCheck(this, ZurikTabs);

        this.initPlugin();
        $(selector).zurikTabs();
    }

    _createClass(ZurikTabs, [{
        key: 'initPlugin',
        value: function initPlugin() {
            $.fn.zurikTabs = function (options) {

                const opt = $.extend({
                    onChange: function onChange() {
                    },
                    onInit: function onInit() {
                    }
                }, options);

                const module = {},
                    images = $(".product__images"),
                    tabToggles = this.find(".tab-header a"),
                    tabItems = this.find(".tab-item");

                function clearToggleStyles($toggle) {
                    if ($toggle.closest(".tab-bundles").length) {
                        images.removeClass("current_image");
                        images.eq(tabToggles.index($toggle)).addClass("current_image");
                    }

                    $toggle.closest(".product-tabs").find(".tab-header a").removeClass("current-tab");
                    $toggle.addClass("current-tab");
                }

                function showTab($tabToggle) {
                    const tabId = $tabToggle.attr("href");
                    $(tabId).show();
                    opt.onInit($(tabId));
                    clearToggleStyles($tabToggle);
                }

                function getClassNameFromUrl(current_url) {
                    let url_split = current_url.split("/product/")[1];

                    if (url_split.indexOf("?") > -1) {
                        url_split = url_split.split("?")[0];
                    }

                    let className = url_split.replace("#", "-");

                    // Handle pack number
                    if (current_url.includes("pack=")) {
                        const numberOfPack = current_url.split("pack=").pop().split("&")[0];
                        className += "-" + numberOfPack;
                        className = className.replace("pack=" + numberOfPack, "");
                    }

                    return className;
                }

                function activateProductTab(){
                    $(".tab-main .tab-item").hide();
                    let anyOpen = false;
                    const hash = window.location.hash;

                    if (hash) {
                        const tabHeader = $("[href='" + hash + "']");
                        clearToggleStyles(tabHeader);
                        const tabItem = $(hash);
                        tabItem.show();
                        anyOpen = true;
                    }

                    if (!anyOpen) {
                        showTab($(".tab-main .tab-header a").eq(0)); // activate first tab if no any activated
                    }
                }

                function activatePackTab(){
                    $(".tab-bundles .tab-item").hide();
                    let anyOpen = false;
                    const current_url = $(location).attr("href");

                    if (current_url.indexOf("pack=") > -1) {
                        const className = getClassNameFromUrl(current_url);
                        let tabHeader = $("." + className);
                        clearToggleStyles(tabHeader);
                        const tabId = $(tabHeader).attr("href");
                        const tabItem = $(tabId);
                        tabItem.show();
                        anyOpen = true;
                    }

                    if (!anyOpen) {
                        showTab($(".tab-bundles .tab-header a").eq(0)); // activate first tab if no any activated
                    }
                }

                module.init = function () {
                    activateProductTab();
                    activatePackTab();
                    module.events();
                };

                module.events = function () {
                    tabToggles.click(function (event) {
                        const tabId = $(this).attr("href");
                        tabItems.hide();
                        $(tabId).show();
                        clearToggleStyles($(this));

                        opt.onChange($(tabId));

                        const myEvent = new CustomEvent("tabChanged", {});
                        document.dispatchEvent(myEvent);

                        event.stopPropagation();
                        event.preventDefault();
                        return false;
                    });
                };

                module.init();
            };
        }
    }]);

    return ZurikTabs;
}();

},{}],7:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
    value: true
});
exports.ProductPage = undefined;

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _zurikAccordeon = require("./plugins/zurikAccordeon");

var _zurikTabs = require("./plugins/zurikTabs");

var _goods = require("./modules/goods");

var _review = require("./modules/review");

var _zurikRating = require("./plugins/zurikRating");

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var ProductPage = exports.ProductPage = function () {
    function ProductPage(CONFIG) {
        _classCallCheck(this, ProductPage);

        this.CONFIG = CONFIG;

        new _zurikTabs.ZurikTabs('.tab');
        new _zurikTabs.ZurikTabs('.tab-products');
        new _zurikAccordeon.ZurikAccordeon('.accordeon');
        new _zurikRating.ZurikRating('.add-rating');
        new _goods.Goods(CONFIG);
        new _review.Reviews();
        this.plugins();
        this.events();
    }

    _createClass(ProductPage, [{
        key: "plugins",
        value: function plugins() {
            $(".image-link, .video-link").magnificPopup({
                callbacks: {
                    elementParse: function elementParse(item) {
                        // the class name
                        if ($(item.el[0]).hasClass('video-link')) {
                            item.type = 'iframe';
                        } else {
                            item.type = 'image';
                        }
                    }
                },
                gallery: { enabled: true },
                type: 'image'
            });

            $(".mobile-image-link, .mobile-video-link").magnificPopup({
                callbacks: {
                    elementParse: function elementParse(item) {
                        // the class name
                        if ($(item.el[0]).hasClass('mobile-video-link')) {
                            item.type = 'iframe';
                        } else {
                            item.type = 'image';
                        }
                    }
                },
                gallery: { enabled: true },
                type: 'image'
            });
        }
    }, {
        key: "events",
        value: function events() {
            var _this = this;

            $('.open-about-autoship').on('click', function (event) {
                _this.showAboutAutoship(event.currentTarget);
            });

            $('input.autoship-radio').on('click', function (event) {
                _this.changeProductBuyingType(event);
            });

            $(document).on('click', '.ind_cnt', function (event) {
                $('#reviews').click();
                event.preventDefault();
                $('html, body').stop().animate({
                    scrollTop: $('#reviews').offset().top
                }, 1000);
            });

            $(document).on('tabChanged', function (e) {
                $('.product__images__mobile').slick('unslick');
                _this.slickInit();
            });

            this.slickInit();

            this.onLoadPage();
        }
    }, {
        key: "onLoadPage",
        value: function onLoadPage() {
            var param = window.location.hash ? window.location.hash.split('#')[1] : null;

            if (param) {
                if (param.split('=')[0] === 'bundle_id') {
                    $($('.tab-bundles li')[param.split('=')[1]]).find('a').click();
                }
            }
        }
    }, {
        key: "slickInit",
        value: function slickInit() {
            if (!$('.product__images__mobile').length) return;
            $('.product__images__mobile').slick({
                slidesToShow: 3,
                slidesToScroll: 1,
                dots: false,
                variableWidth: false,
                adaptiveHeight: false,
                arrows: true,
                swipeToSlide: true,
                prevArrow: '<button type="button" class="slick-prev"></button>',
                nextArrow: '<button type="button" class="slick-next"></button>',
                responsive: [{
                    breakpoint: 660,
                    settings: {
                        slidesToShow: 1,
                        slidesToScroll: 1,
                        infinite: true,
                        dots: true,
                        initialSlide: 0
                    }
                }]
            });
        }
    }, {
        key: "showAboutAutoship",
        value: function showAboutAutoship() {
            $.getPopup('about-autoship', true).then(function () {
                this.currentPopup = $('#about-autoship').showPopup();
            });
        }
    }, {
        key: "changeProductBuyingType",
        value: function changeProductBuyingType(event) {
            $('.checker-type li').removeClass('active');
            $(event.currentTarget).closest('li').addClass('active');
        }
    }]);

    return ProductPage;
}();

},{"./modules/goods":2,"./modules/review":3,"./plugins/zurikAccordeon":4,"./plugins/zurikRating":5,"./plugins/zurikTabs":6}],8:[function(require,module,exports){
"use strict";

var _zurikRating = require("../plugins/zurikRating");

var _product = require("../product.page");

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Product = function Product(CONFIG) {
    _classCallCheck(this, Product);

    this.CONFIG = CONFIG;

    new _zurikRating.ZurikRating('.show-rating');

    new _product.ProductPage(this.CONFIG);
};

$('body').ready(function () {
    new _zurikRating.ZurikRating('.show-rating');
    window.Product = new Product(window.CONFIG || {});
});

},{"../plugins/zurikRating":5,"../product.page":7}],9:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var CartService = exports.CartService = function () {
  function CartService(CONFIG) {
      _classCallCheck(this, CartService);

      this.CONFIG = CONFIG;
  }

  /**
   * Добавление в корзину
   * @param id - ИД товара
   * @param count - Количество товара
   * @returns {Promise}
   */


  _createClass(CartService, [{
    key: 'addToCart',
    value: function addToCart(id) {
      var count = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
      var auto_ship = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
      var bundle_id = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
      var actionPage = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '';

      if (count < 1) {
        count = 1;
      }
        return $.post(window.CONFIG.BASE_URL + 'cart/add-to-cart', {
            id: id,
            count: count,
            auto_ship: auto_ship,
            bundle_id: bundle_id,
            actionPage: 'Add product to cart from page:' + window.location.href + ' ' + actionPage
        });
    }
  }, {
    key: 'deleteFromCart',
    value: function deleteFromCart(id, address, method) {
      var actionPage = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';


        var url = window.CONFIG.BASE_URL + 'cart/remove-from-cart?id=' + id;

      if (address) {
        url += '&shipping_address=' + address;
      }

      if (method) {
        url += '&shipMethod=' + method;
      }

      return $.get(url, {
        actionPage: 'delete product from cart from page:' + window.location.href + ' ' + actionPage
      });
    }
  }, {
    key: 'deleteAutoshipOnlyFromCart',
    value: function deleteAutoshipOnlyFromCart(id, address, method, actionPage) {
        var url = window.CONFIG.BASE_URL + 'autoship-cart/remove-from-cart?product_id=' + id;

      if (address) {
        url += '&shipping_address=' + address;
      }

      if (method) {
        url += '&shipMethod=' + method;
      }

      return $.post(url, {
        actionPage: 'delete product from cart from page:' + window.location.href + ' ' + actionPage
      });
    }

    /**
     * Добавлени товара из корзины в автошип
     * @param id - id товара в корзине
     * @param count - количество
     */

  }, {
    key: 'addToAutoship',
    value: function addToAutoship(id) {
      var count = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;

        return $.post(window.CONFIG.BASE_URL + 'cart/update-cart', {
            id: id,
            auto_ship: 1,
            qty: count,
            shipping_address: localStorage.getItem('shipping_address'),
            shipMethod: localStorage.getItem('shipMethodCode')
        });
    }
  }, {
    key: 'addToAutoshipOnly',
    value: function addToAutoshipOnly(id) {
      var count = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;

      if (count < 1) {
        count = 1;
      }
        return $.post(window.CONFIG.BASE_URL + 'autoship-cart/add-to-cart', {
            product_id: id,
            qty: count
        });
    }

    /**
     * Обновление контента корзины
     */

  }, {
    key: 'refreshCart',
    value: function refreshCart() {
        $.get(window.CONFIG.BASE_URL + 'cart/cart-products').then(function (res) {
            $('#cart__content').html(res.view);
            var lazyLoadInstance = new LazyLoad({
                elements_selector: ".lazy"
            });
            lazyLoadInstance.update();
        });
    }
  }, {
    key: 'getCheckoutProducts',


    /**
     * Receive cart products on checkout step 4 page
     */
    value: function getCheckoutProducts(shipping, callback) {
        $.get(window.CONFIG.BASE_URL + 'checkout/products-list/' + shipping).then(function (res) {
            callback(res);
        });
    }

    /**
     * Обновление корзины при изменении параметров
     * @param $item - Jquery элемент tr таблицы
     */

  }, {
    key: 'updateCart',
    value: function updateCart($item) {
      var actionPage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';

      var count = $item.find('.change_product_count').val();
      var shippingAddress = $('input[name="shipping_address"]').val() || localStorage.getItem('shipping_address');
      var shippingMethod = $('input[name="shipMethod"]').val() || localStorage.getItem('shipMethodCode');
      var checkoutCart = $('#checkout__cart').length;

        return $.post(window.CONFIG.BASE_URL + 'cart/update-cart', {
            id: $item.data('id'),
            auto_ship: $item.find('.change__autoship').prop('checked') ? 1 : 0,
            qty: count <= 1 ? 1 : count,
            shipping_address: shippingAddress,
            shipMethod: shippingMethod,
            checkoutCart: checkoutCart,
            actionPage: 'Update product cart from page:' + window.location.href + ' ' + actionPage
        });
    }
  }, {
    key: 'refreshCheckoutCart',
    value: function refreshCheckoutCart(callback) {
        $.get(window.CONFIG.BASE_URL + 'checkout/cart-products/' + location.search).then(function (res) {
            if ($('.js-cart_products_container').length) {
                $('.js-cart_products_container').html(res);
            } else {
                $('#checkout__cart').html(res);
            }
            callback();
        });
    }
  }, {
    key: 'saveRewardPoints',
    value: function saveRewardPoints(form) {
        return $.post(window.CONFIG.BASE_URL + 'checkout/reward-points', form.serialize());
    }
  }, {
    key: 'changeUserType',
    value: function changeUserType(callback) {
        $.get(window.CONFIG.BASE_URL + 'change-user-type').then(function (res) {
            callback(res);
        });
    }

    /**
     * Получение шаблона корзины в шапке
     */

  }, {
    key: 'getHeaderCart',
    value: function getHeaderCart() {
        return $.get(window.CONFIG.BASE_URL + 'cart/header-cart').then(function (res) {
            return res.view;
        });
    }

    /**
     * Получение шаблона корзины на странице enrollment
     */

  }, {
    key: 'getEnrollmentCart',
    value: function getEnrollmentCart() {
      var isCheckout = location.pathname.split('/').indexOf('checkout') !== -1;
      var productParams = {};
      var shippingAddress = $('input[name="shipping_address"]').val() || localStorage.getItem('shipping_address');
      var shippingMethod = $('input[name="shipMethod"]').val() || localStorage.getItem('shipMethodCode');

      if (isCheckout) {
        productParams['from_checkout'] = 1;
        productParams['shipping_address'] = shippingAddress;
        productParams['shipMethod'] = shippingMethod;
      }

      return $.get(window.CONFIG.BASE_URL + 'vbo/side-cart', productParams).then(function (res) {
          if (res.is_cart_empty && location.pathname.indexOf('checkout') !== -1) {
              location.reload();
          }
          return res.view;
      });
    }

    /**
     * Обновление корзины в шапке
     */

  }, {
    key: 'refreshHeaderCart',
    value: function refreshHeaderCart() {
      this.getHeaderCart().then(function (view) {
        $('#header__cart__container').html(view);
      });
    }

    /**
     * Обновление корзины на странице enrollment
     */

  }, {
    key: 'refreshEnrollmentCart',
    value: function refreshEnrollmentCart() {
      this.getEnrollmentCart().then(function (view) {
        $('.sidebar-cart .cart-body').html(view);
      });
    }

    /**
     * Переключаем вид корзины (компактныый/полный)
     * и позиционируем корзину для отображения компактного
     * вида при загрузке страницы.
     * @param compact
     */

  }, {
    key: 'vboCartPositioner',
    value: function vboCartPositioner() {
      var compact = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;

      var $cart = $('.sidebar-cart');
      var cartWidth = $cart.innerWidth();
      var compactOffset = cartWidth - 55;

      //fix for IE cart body scroll
      var cartHeaderHeight = $('.header-cart').outerHeight();
      var cartBodyHeight = $('.sidebar-cart').height() - cartHeaderHeight;

      if (compact) {
        $cart.css('right', -compactOffset);
        $cart.find('.cart-body').css('visibility', 'hidden');
        $cart.addClass('compact');
        $cart.find('.switch-cart').addClass('closed');
      } else {
        $cart.css('right', 0);
        $cart.find('.cart-body').css({ 'visibility': 'visible', 'height': cartBodyHeight });
        $cart.removeClass('compact');
        $cart.find('.switch-cart').removeClass('closed');
      }
    }
  }, {
    key: 'showNotAddedToAutoshipProducts',
    value: function showNotAddedToAutoshipProducts() {
      var _this = this;

      var redirect_path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';

      var redirectPath = window.CONFIG.BASE_URL + 'checkout/';

      if (redirect_path) {
        redirectPath = redirect_path;
      }

      $.getPopup('not-added-to-autoship-products', true).then(function () {
        var goodsLength = $('#not-added-to-autoship-products .cart__products tbody').find('tr').length;

        if (goodsLength) {
          _this.currentPopup = $('#not-added-to-autoship-products').showPopup({
            onClose: function onClose() {
              _this.refreshCart();
            }
          });

          _this.currentPopup.reposition(100);
        } else {
          document.location.href = redirectPath;
        }

        $('.go-to-checkout').attr('disabled', false);
        $('.add__product__to__cart').attr('disabled', false);
      });
    }
  }, {
    key: 'setCCardYears',
    value: function setCCardYears() {
      var currentYear = new Date().getFullYear();
      var $option = '<option value=""></option>';

      for (var x = 0; x < 15; x++) {
        $('.select.select-card-year').append($option);
      }

      $('.select.select-card-year').find('option').each(function () {
        $(this).text(currentYear);
        $(this).val(currentYear);
        return currentYear++;
      });
    }
  }]);

  return CartService;
}();

},{}]},{},[8])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJqcy9jYXJ0LnBhZ2UuanMiLCJqcy9tb2R1bGVzL2dvb2RzLmpzIiwianMvbW9kdWxlcy9yZXZpZXcuanMiLCJqcy9wbHVnaW5zL3p1cmlrQWNjb3JkZW9uLmpzIiwianMvcGx1Z2lucy96dXJpa1JhdGluZy5qcyIsImpzL3BsdWdpbnMvenVyaWtUYWJzLmpzIiwianMvcHJvZHVjdC5wYWdlLmpzIiwianMvcm9vdC9wcm9kdWN0LmpzIiwianMvc2VydmljZXMvY2FydC5zZXJ2aWNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0FDQUE7Ozs7SUFFYSxRLFdBQUEsUTtBQUVYLG9CQUFZLE1BQVosRUFBb0I7QUFBQTs7QUFFbEIsU0FBSyxNQUFMLEdBQWMsTUFBZDs7QUFHQSxTQUFLLE1BQUw7QUFDQSxTQUFLLFdBQUwsR0FBbUIsSUFBSSxpQkFBSixFQUFuQjtBQUNBLFNBQUssZ0JBQUwsR0FBd0IsSUFBeEI7QUFDQSxTQUFLLE9BQUwsR0FBZSxJQUFmO0FBQ0Q7Ozs7a0NBRWEsRSxFQUFJO0FBQ2hCLFdBQUssZ0JBQUwsR0FBd0IsRUFBeEI7QUFDRDs7OzZCQUVRO0FBQUE7O0FBQ1A7Ozs7QUFJQSxRQUFFLFFBQUYsRUFBWSxFQUFaLENBQWUsT0FBZixFQUF3QixtQkFBeEIsRUFBNkMsaUJBQVM7QUFDcEQsWUFBSSxRQUFRLEVBQUUsTUFBTSxhQUFSLENBQVo7O0FBRUEsWUFBSSxNQUFNLFFBQU4sQ0FBZSxpQkFBZixDQUFKLEVBQXVDOztBQUV2QyxjQUFLLFdBQUwsQ0FBaUIsY0FBakIsQ0FBZ0MsRUFBRSxNQUFNLGFBQVIsRUFBdUIsSUFBdkIsQ0FBNEIsSUFBNUIsQ0FBaEMsRUFBb0UsSUFBcEUsRUFBMEUsSUFBMUUsRUFBZ0YsRUFBRSxNQUFNLGFBQVIsRUFBdUIsSUFBdkIsQ0FBNEIsV0FBNUIsQ0FBaEYsRUFDRyxJQURILENBQ1EsWUFBTTtBQUNW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InNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwiaW1wb3J0IHtDYXJ0U2VydmljZX0gZnJvbSBcIi4vc2VydmljZXMvY2FydC5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBjbGFzcyBDYXJ0UGFnZSB7XG5cbiAgY29uc3RydWN0b3IoQ09ORklHKSB7XG5cbiAgICB0aGlzLkNPTkZJRyA9IENPTkZJRztcblxuXG4gICAgdGhpcy5ldmVudHMoKTtcbiAgICB0aGlzLmNhcnRTZXJ2aWNlID0gbmV3IENhcnRTZXJ2aWNlKCk7XG4gICAgdGhpcy5vblVwZGF0ZUZ1bmN0aW9uID0gbnVsbDtcbiAgICB0aGlzLnVwZGF0ZXMgPSB0cnVlO1xuICB9XG5cbiAgb25VcGRhdGVFdmVudChjYikge1xuICAgIHRoaXMub25VcGRhdGVGdW5jdGlvbiA9IGNiO1xuICB9XG5cbiAgZXZlbnRzKCkge1xuICAgIC8qKlxuICAgICAqINCj0LTQsNC70LXQvdC40LUg0YLQvtCy0LDRgNCwINC40Lcg0LrQvtGA0LfQuNC90YtcbiAgICAgKiDQn9C+0YHQu9C1INGD0LTQsNC70LXQvdC40Y8g0L7QsdC90L7QstC70Y/RjtGC0YHRjyDQstGB0LUg0YLQvtCy0LDRgNGLINCyINC60L7RgNC30LjQvdC1XG4gICAgICovXG4gICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5yZW1vdmUtZnJvbS1jYXJ0JywgZXZlbnQgPT4ge1xuICAgICAgbGV0ICR0aGlzID0gJChldmVudC5jdXJyZW50VGFyZ2V0KTtcblxuICAgICAgaWYgKCR0aGlzLmhhc0NsYXNzKCdlbnJvbGxtZW50LXBhZ2UnKSkgcmV0dXJuO1xuXG4gICAgICB0aGlzLmNhcnRTZXJ2aWNlLmRlbGV0ZUZyb21DYXJ0KCQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YSgnaWQnKSwgIG51bGwsIG51bGwsICQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YSgndmlld0Jsb2NrJykpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgncmVtb3ZlLWZyb20tY2FydCcsIHtcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICBwcm9kdWN0OiB7XG4gICAgICAgICAgICAgICAgaWQ6ICQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YSgnc2t1JylcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcXVhbnRpdHk6ICQoZXZlbnQuY3VycmVudFRhcmdldCkuY2xvc2VzdCgndHInKS5maW5kKCcuY2hhbmdlX3Byb2R1Y3RfY291bnQnKS52YWwoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICBpZiAodGhpcy51cGRhdGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLnJlZnJlc2hDYXJ0KCk7XG4gICAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLnJlZnJlc2hIZWFkZXJDYXJ0KCk7XG4gICAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLnJlZnJlc2hFbnJvbGxtZW50Q2FydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiDQmNC30LzQtdC90LXQvdC40LUg0LDQstGC0L7RiNC40L/QsCDRgtC+0LLQsNGA0LAg0LIg0LrQvtGA0LfQuNC90LVcbiAgICAgKi9cbiAgICAkKGRvY3VtZW50KS5vbignY2hhbmdlJywgJy5jaGFuZ2VfX2F1dG9zaGlwJywgZXZlbnQgPT4ge1xuICAgICAgdGhpcy51cGRhdGVQcm9kdWN0KCQoZXZlbnQuY3VycmVudFRhcmdldCkuY2xvc2VzdCgndHInKSwgJChldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKCd2aWV3QmxvY2snKSk7XG4gICAgICBpZiAoJChldmVudC5jdXJyZW50VGFyZ2V0KS5wcm9wKCdjaGVja2VkJykgJiYgJChldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKCdoYXNfYXV0b3NoaXAnKSkge1xuICAgICAgICB0aGlzLmdyZWF0Q2hvaXNlQXV0aG9zaGlwUG9wdXAoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgICQoZG9jdW1lbnQpLm9uKCdjaGFuZ2UnLCAnLmNoYW5nZV9fYXV0b3NoaXAtaW4tcG9wdXAnLCBldmVudCA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVByb2R1Y3RJblBvcHVwKCQoZXZlbnQuY3VycmVudFRhcmdldCkuY2xvc2VzdCgndHInKSwgJChldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKCd2aWV3QmxvY2snKSk7XG4gICAgICBpZiAoJChldmVudC5jdXJyZW50VGFyZ2V0KS5wcm9wKCdjaGVja2VkJykgJiYgJChldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKCdoYXNfYXV0b3NoaXAnKSkge1xuICAgICAgICB0aGlzLmdyZWF0Q2hvaXNlQXV0aG9zaGlwUG9wdXAoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgICQoZG9jdW1lbnQpLm9uKCdjaGFuZ2UnLCAnLmNoYW5nZV9wcm9kdWN0X2NvdW50LWluLXBvcHVwJywgZXZlbnQgPT4ge1xuICAgICAgdGhpcy51cGRhdGVQcm9kdWN0SW5Qb3B1cCgkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmNsb3Nlc3QoJ3RyJyksICQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YSgndmlld0Jsb2NrJykpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICog0JjQt9C80LXQvdC10L3QuNC1INC60L7Qu9C40YfQtdGB0YLQstCwINGC0L7QstCw0YDQsCDQsiDQutC+0YDQt9C40L3QtVxuICAgICAqL1xuICAgICQoZG9jdW1lbnQpLm9uKCdjaGFuZ2UnLCAnLmNoYW5nZV9wcm9kdWN0X2NvdW50JywgZXZlbnQgPT4ge1xuICAgICAgdGhpcy51cGRhdGVQcm9kdWN0KCQoZXZlbnQuY3VycmVudFRhcmdldCkuY2xvc2VzdCgndHInKSwgJChldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKCd2aWV3QmxvY2snKSk7XG4gICAgfSk7XG5cbiAgICAvLyQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcuZ28tdG8tY2hlY2tvdXQnLCBldmVudCA9PiB7XG4gICAgLy8gICAgJCgnI2NhcnQsIC5iLW1vZGFsJykucmVtb3ZlKCk7XG4gICAgLy8gICAgdGhpcy5jYXJ0U2VydmljZS5zaG93Tm90QWRkZWRUb0F1dG9zaGlwUHJvZHVjdHMoKTtcbiAgICAvL30pO1xuXG4gICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5jaGVjay1yYWRpby1sYWJlbCBpbnB1dCcsIGV2ZW50ID0+IHtcbiAgICAgIHRoaXMuYWRkVG9BdXRvc2hpcEluUG9wdXAoZXZlbnQpO1xuICAgIH0pXG4gIH1cblxuICBncmVhdENob2lzZUF1dGhvc2hpcFBvcHVwKCkge1xuICAgICQuZ2V0UG9wdXAoJ2dyZWF0LWNob2lzZS1hdXRvc2hpcCcpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICQoJyNncmVhdC1jaG9pc2UtYXV0b3NoaXAnKS5zaG93UG9wdXAoKTtcbiAgICAgIH0pO1xuICB9XG5cblxuICAvL3Nob3dOb3RBZGRlZFRvQXV0b3NoaXBQcm9kdWN0cyAoKSB7XG4gIC8vICAgICQuZ2V0UG9wdXAoJ25vdC1hZGRlZC10by1hdXRvc2hpcC1wcm9kdWN0cycsIHRydWUpXG4gIC8vICAgICAgICAudGhlbigoKSA9PiB7XG4gIC8vICAgICAgICAgICAgdmFyIGdvb2RzTGVuZ3RoID0gJCgnI25vdC1hZGRlZC10by1hdXRvc2hpcC1wcm9kdWN0cyAuY2FydF9fcHJvZHVjdHMgdGJvZHknKS5maW5kKCd0cicpLmxlbmd0aDtcbiAgLy9cbiAgLy8gICAgICAgICAgICBjb25zb2xlLmxvZyhnb29kc0xlbmd0aCk7XG4gIC8vXG4gIC8vICAgICAgICAgICAgaWYoZ29vZHNMZW5ndGgpIHtcbiAgLy8gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UG9wdXAgPSAkKCcjbm90LWFkZGVkLXRvLWF1dG9zaGlwLXByb2R1Y3RzJykuc2hvd1BvcHVwKCk7XG4gIC8vICAgICAgICAgICAgfVxuICAvLyAgICAgICAgICAgIGVsc2Uge1xuICAvLyAgICAgICAgICAgICAgICBkb2N1bWVudC5sb2NhdGlvbi5ocmVmID0gYCR7dGhpcy5DT05GSUcuQkFTRV9VUkx9Y2hlY2tvdXQvMWA7XG4gIC8vICAgICAgICAgICAgfVxuICAvLyAgICAgICAgfSk7XG4gIC8vfVxuXG4gIHVwZGF0ZVByb2R1Y3RJblBvcHVwKCRpdGVtLCBhY3Rpb25QYWdlID0gJycpIHtcbiAgICBsZXQgY291bnQgPSAkaXRlbS5maW5kKCcuY2hhbmdlX3Byb2R1Y3RfY291bnQtaW4tcG9wdXAnKS52YWwoKTtcbiAgICBsZXQgYWxsUXR5ID0gMDtcblxuICAgICQoJy5jaGFuZ2VfcHJvZHVjdF9jb3VudCcpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGl0ZW1zID0gJCh0aGlzKS52YWwoKTtcbiAgICAgIGFsbFF0eSArPSBOdW1iZXIoaXRlbXMpO1xuICAgIH0pO1xuXG4gICAgJC5wb3N0KHRoaXMuQ09ORklHLkJBU0VfVVJMICsgJ2NhcnQvdXBkYXRlLWNhcnQnLCB7XG4gICAgICBpZDogJGl0ZW0uZGF0YSgnaWQnKSxcbiAgICAgIGF1dG9fc2hpcDogJGl0ZW0uZmluZCgnLmNoYW5nZV9fYXV0b3NoaXAtaW4tcG9wdXAnKS5wcm9wKCdjaGVja2VkJykgPyAxIDogMCxcbiAgICAgIHF0eTogKChjb3VudCA8PSAxKSA/IDEgOiBjb3VudCksXG4gICAgICBzaGlwcGluZ19hZGRyZXNzICAgIDogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3NoaXBwaW5nX2FkZHJlc3MnKSxcbiAgICAgIHNoaXBNZXRob2QgICAgICAgICAgOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc2hpcE1ldGhvZENvZGUnKSxcbiAgICAgIGFjdGlvblBhZ2UgOidVcGRhdGUgcHJvZHVjdCBjYXJ0IGZyb20gcGFnZTonICsgd2luZG93LmxvY2F0aW9uLmhyZWYrICcgJyArIGFjdGlvblBhZ2VcbiAgICB9KVxuICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICByZXMuYXV0b19zaGlwID09IDAgPyAkaXRlbS5maW5kKCcuY2FydF9fcHJvZHVjdF9fdG90YWxfX3ByaWNlX2Z1bGw6bm90KFwiLm1lbWJlclwiKScpLmFkZENsYXNzKCdoaWRkZW4nKSA6ICRpdGVtLmZpbmQoJy5jYXJ0X19wcm9kdWN0X190b3RhbF9fcHJpY2VfZnVsbCcpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgLy8gJGl0ZW0uZmluZCgnLmNhcnRfX3Byb2R1Y3RfX3RvdGFsX19wcmljZV9mdWxsJykudG9nZ2xlQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICAkaXRlbS5maW5kKCcuY2FydF9fcHJvZHVjdF9fdG90YWxfX3ByaWNlX2Z1bGwnKS5odG1sKHJlcy5yZXRhaWxfcHJpY2UpO1xuICAgICAgICAkaXRlbS5maW5kKCcuY2FydF9fcHJvZHVjdHNfX3ByaWNlJykuaHRtbCh0aGlzLkNPTkZJRy5DVVJSRU5DWV9TWU1CT0wgKyByZXMucHJpY2VfZm9yX29uY2UpO1xuICAgICAgICAkaXRlbS5maW5kKCcuY2FydF9fcHJvZHVjdF9fdG90YWxfX3ByaWNlX2YnKS5odG1sKHJlcy5wcmljZV93aXRoX2N1cnJlbmN5KTtcbiAgICAgICAgaWYgKCRpdGVtLmZpbmQoJy5jaGFuZ2VfX2F1dG9zaGlwJykucHJvcCgnY2hlY2tlZCcpICYmIHJlcy5pc19wcm9kdWN0X2luX2F1dG9zaGlwKSB7XG4gICAgICAgICAgdGhpcy5zaG93SXNJbkF1dG9zaGlwUG9wdXAoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vblVwZGF0ZUZ1bmN0aW9uICYmIHR5cGVvZiB0aGlzLm9uVXBkYXRlRnVuY3Rpb24gPT0gJ2Z1bmN0aW9uJykgdGhpcy5vblVwZGF0ZUZ1bmN0aW9uKCk7XG4gICAgICB9LCBlcnIgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnLmNoYW5nZV9wcm9kdWN0X2NvdW50JywgSlNPTi5wYXJzZShlcnIucmVzcG9uc2VUZXh0KSk7XG4gICAgICAgIGxldCBjb3VudEVycm9yID0gSlNPTi5wYXJzZShlcnIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgJCgkaXRlbSkuZmluZCgnLmVycm9yJykudGV4dChjb3VudEVycm9yLnF0eSk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICQoJGl0ZW0pLmZpbmQoJy5lcnJvcicpLnRleHQoJycpO1xuICAgICAgICB9LCAzMDAwKVxuXG4gICAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqINCe0LHQvdC+0LLQu9C10L3QuNC1INC/0YDQvtC00YPQutGC0LAg0LIg0LrQvtGA0LfQuNC90LVcbiAgICogQHBhcmFtICRpdGVtIC0gSnF1ZXJ5INGN0LvQtdC80LXQvdGCIHRyINGC0LDQsdC70LjRhtGLXG4gICAqL1xuICB1cGRhdGVQcm9kdWN0KCRpdGVtLCBhY3Rpb25QYWdlID0gJycpIHtcbiAgICAkKCcubG9hZGVyJykuc2hvdygpO1xuXG4gICAgbGV0IGFsbFF0eSA9IDA7XG5cbiAgICAkKCcuY2hhbmdlX3Byb2R1Y3RfY291bnQnKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBpdGVtcyA9ICQodGhpcykudmFsKCk7XG4gICAgICBhbGxRdHkgKz0gTnVtYmVyKGl0ZW1zKTtcbiAgICB9KTtcblxuXG4gICAgdGhpcy5jYXJ0U2VydmljZS51cGRhdGVDYXJ0KCRpdGVtLCBhY3Rpb25QYWdlKVxuICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSByZXM7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FydEl0ZW0oJGl0ZW0sIHJlcyk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FydERhdGFzKHJlc3BvbnNlKTtcbiAgICAgICAgaWYgKCRpdGVtLmZpbmQoJy5jaGFuZ2VfX2F1dG9zaGlwJykucHJvcCgnY2hlY2tlZCcpICYmIHJlcy5pc19wcm9kdWN0X2luX2F1dG9zaGlwKSB7XG4gICAgICAgICAgdGhpcy5zaG93SXNJbkF1dG9zaGlwUG9wdXAoKTtcbiAgICAgICAgfVxuICAgICAgICAkKCcudG90YWxfaW5fY2FydCcpLmh0bWwoYWxsUXR5KTtcbiAgICAgICAgJCgnLmNhcnRfdG90YWxfY3YnKS50ZXh0KHJlcy5nZXRfdG90YWxfY3YgKyBcIkNWXCIpO1xuICAgICAgICBpZiAodGhpcy5vblVwZGF0ZUZ1bmN0aW9uICYmIHR5cGVvZiB0aGlzLm9uVXBkYXRlRnVuY3Rpb24gPT0gJ2Z1bmN0aW9uJykgdGhpcy5vblVwZGF0ZUZ1bmN0aW9uKCk7XG4gICAgICAgICQoZG9jdW1lbnQpLnRyaWdnZXIoJ2NoYW5nZS1wcm9kdWN0LWNvdW50Jyk7XG5cbiAgICAgICAgLy9mb3IgdmJvLWNoZWNrb3V0XG4gICAgICAgICQoJy5qcy1jYXJ0X3Byb2R1Y3RzX2NvbnRhaW5lcicpLmh0bWwocmVzcG9uc2Uudmlld3MuZmlyc3Rfb3JkZXIpO1xuICAgICAgICAkKCcuanMtYXV0b3NoaXBfb25seV9jb250YWluZXInKS5odG1sKHJlc3BvbnNlLnZpZXdzLmF1dG9zaGlwX29yZGVyKTtcblxuICAgICAgICAkKCcubG9hZGVyJykuaGlkZSgpO1xuICAgICAgfSwgZXJyID0+IHtcbiAgICAgICAgbGV0IGNvdW50RXJyb3IgPSBKU09OLnBhcnNlKGVyci5yZXNwb25zZVRleHQpO1xuICAgICAgICAkKCRpdGVtKS5maW5kKCcuZXJyb3InKS50ZXh0KGNvdW50RXJyb3IucXR5KTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgJCgkaXRlbSkuZmluZCgnLmVycm9yJykudGV4dCgnJyk7XG4gICAgICAgIH0sIDMwMDApO1xuICAgICAgICAkKCcubG9hZGVyJykuaGlkZSgpO1xuXG4gICAgICB9KVxuICB9XG5cbiAgc2hvd0lzSW5BdXRvc2hpcFBvcHVwKCkge1xuICAgICQuZ2V0UG9wdXAoJ2lzLWl0LWF1dG9zaGlwJylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgJCgnI2lzLWl0LWF1dG9zaGlwJykuc2hvd1BvcHVwKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDQntCx0L3QvtCy0LvQtdC90LjQtSDQtNCw0L3QvdGL0YUg0YLQvtCy0LDRgNCwINCyINC60L7RgNC30LjQvdC1XG4gICAqIEBwYXJhbSAkaXRlbSAtIEpxdWVyeSDRjdC70LXQvNC10L3RgiB0ciDRgtCw0LHQu9C40YbRi1xuICAgKiBAcGFyYW0gZGF0YSAtINCU0LDQvdC90YvQtSDRgtC+0LLQsNGA0LAg0LLQvtC30LLRgNCw0YnQsNC10LzRi9C1INC/0L7RgdC70LUg0LDQv9C00LXQudGC0LAg0LrQvtGA0LfQuNC90YtcbiAgICovXG4gIHVwZGF0ZUNhcnRJdGVtKCRpdGVtLCBkYXRhKSB7XG4gICAgbGV0IHRvdGFsX19wcmljZV9mdWxsID0gTWF0aC5yb3VuZCgoZGF0YS5wcmljZSAqIGRhdGEucXR5X3RvdGFsICogMTAwKSAvIDEwMCkudG9GaXhlZCgyKTtcbiAgICBsZXQgdG90YWxfX3ByaWNlX2Z1bGwxID0gKChkYXRhLnByaWNlICogZGF0YS5xdHlfdG90YWwgKiAxMDApIC8gMTAwKS50b0ZpeGVkKDIpO1xuXG4gICAgJCgnLmNhcnRfdG90YWxfcHJpY2UnKS5odG1sKGRhdGEuY2FydF90b3RhbF9wcmljZSk7XG4gICAgJGl0ZW0uZmluZCgnLmNhcnRfX3Byb2R1Y3RfX3RvdGFsX19wcmljZSAuY2FydF9fcHJvZHVjdF9fdG90YWxfX3ByaWNlX2YnKS5odG1sKGRhdGEucHJpY2Vfd2l0aF9jdXJyZW5jeSk7XG4gICAgJGl0ZW0uZmluZCgnLmNhcnRfX3Byb2R1Y3RfX3RvdGFsX19wcmljZSAuY2FydF9fcHJvZHVjdF9fdG90YWxfX3ByaWNlX2YucmV0YWlsLXByaWNlJykuaHRtbChkYXRhLnJldGFpbF9wcmljZSk7XG4gICAgLy8gJGl0ZW0uZmluZCgnLmNhcnRfX3Byb2R1Y3RzX19wcmljZScpLmh0bWwoZGF0YS5wcmljZSk7XG5cbiAgICAvLyBjb25zb2xlLmxvZygnZGF0YScsIGRhdGEpXG5cbiAgICAkaXRlbS5maW5kKCcuY2FydF9fcHJvZHVjdF9fdG90YWxfX3ByaWNlX2Z1bGwnKS5odG1sKGRhdGEucmV0YWlsX3ByaWNlKTtcbiAgICAkaXRlbS5maW5kKCcuY2FydF9fcHJvZHVjdF9fdG90YWxfX3ByaWNlIC5jdi1ieS1wcm9kdWN0JykudGV4dChkYXRhLnRvdGFsX2N2KTtcbiAgICAkaXRlbS5maW5kKCcuY2FydF9fcHJvZHVjdF9fdG90YWxfX2N2JykudGV4dChkYXRhLnRvdGFsX2N2ICsgJyBDVicpO1xuICAgIC8vICRpdGVtLmZpbmQoJy5jYXJ0X19wcm9kdWN0c19fcHJpY2UnKS5odG1sKHRoaXMuQ09ORklHLkNVUlJFTkNZX1NZTUJPTCArIGRhdGEucHJpY2VfZm9yX29uY2UpO1xuXG5cbiAgICBpZiAoZGF0YS5hdXRvX3NoaXApIHtcbiAgICAgICRpdGVtLmZpbmQoJy5jYXJ0X19wcm9kdWN0X190b3RhbF9fcHJpY2VfZnVsbCcpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgJGl0ZW0uZmluZCgnLmNhcnRfX3Byb2R1Y3RfX3RvdGFsX19wcmljZV9mdWxsJykuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuICAgIH1cblxuICAgIHRoaXMuY2FydFNlcnZpY2UucmVmcmVzaEhlYWRlckNhcnQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGRhdGFcbiAgICovXG4gIHVwZGF0ZUNhcnREYXRhcyhkYXRhKSB7XG5cbiAgICAvLyBpZih0aGlzLnVwZGF0ZXMpIHtcbiAgICAvLyBjb25zb2xlLmxvZygndXBkYXRlQ2FydERhdGFzJywgZGF0YSk7XG5cbiAgICBpZiAoQ09ORklHLlBBR0UgIT0gXCJjaGVja291dFwiKSB7XG4gICAgICAkKCcuY2FydF90b3RhbF9wcmljZScpLmh0bWwoZGF0YS5jYXJ0X3RvdGFsX3ByaWNlKTtcbiAgICAgIC8vICQoJy5jYXJ0X3RvdGFsX3ByaWNlLS1jaGVja291dC10b3RhbCcpLmh0bWwodGhpcy5DT05GSUcuQ1VSUkVOQ1lfU1lNQk9MICsgZGF0YS5vcmRlcl90b3RhbCk7XG4gICAgICAkKCcuY2FydF9zdWJ0b3RhbF9wcmljZS0tY2hlY2tvdXQtc3VidG90YWwnKS5odG1sKGRhdGEuY2FydF90b3RhbF9wcmljZSk7XG4gICAgICAkKCcuY2FydF9zdWJ0b3RhbF9wcmljZScpLmh0bWwoZGF0YS5jYXJ0X3RvdGFsX3ByaWNlKTtcbiAgICB9XG5cblxuICAgICQoJy5jYXJ0X3RvdGFsX2N2JykudGV4dChkYXRhLmdldF90b3RhbF9jdiArICdDVicpO1xuICAgICQoJy5tZW1iZXItc2F2aW5ncycpLnRleHQoKTtcbiAgICAkKCcudG90YWxfaW5fY2FydCcpLnRleHQoZGF0YS5jYXJ0X3RvdGFsX2NvdW50KTtcbiAgICAvLyB9XG4gIH1cblxuICBhZGRUb0F1dG9zaGlwSW5Qb3B1cChldmVudCkge1xuICAgIGxldCBwcm9kdWN0SWQgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmNsb3Nlc3QoJ3RyJykuZGF0YSgnaWQnKTtcblxuICAgICQoYHRyW2RhdGEtaWQ9JHtwcm9kdWN0SWR9XWApLmZpbmQoYGlucHV0I2dvb2QtJHtwcm9kdWN0SWR9YCkucHJvcCgnY2hlY2tlZCcsIHRydWUpO1xuICB9XG5cbiAgZ2V0Rm9ybWF0dGVkUHJpY2UocHJpY2UpIHtcbiAgICByZXR1cm4gdGhpcy5DT05GSUcuQ1VSUkVOQ1lfU1lNQk9MICsgKE1hdGguZmxvb3IocHJpY2UgKiAxMDApIC8gMTAwKS50b0ZpeGVkKDIpXG4gIH1cbn1cbiIsImltcG9ydCB7Q2FydFBhZ2V9IGZyb20gXCIuLi9jYXJ0LnBhZ2VcIjtcbmltcG9ydCB7Q2FydFNlcnZpY2V9IGZyb20gXCIuLi9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2VcIjtcblxuZXhwb3J0IGNsYXNzIEdvb2RzIHtcblxuICAgIGNvbnN0cnVjdG9yKENPTkZJRykge1xuXG4gICAgICAgIHRoaXMuQ09ORklHID0gQ09ORklHO1xuXG4gICAgICAgIHRoaXMud2FzTm90QXV0b3NoaXBQb3B1cCA9IG51bGw7XG4gICAgICAgIHRoaXMuY3VycmVudFBvcHVwICAgICAgICA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdEFkZGVkR29vZCAgICAgICA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5idXR0b25Jc0NsaWNrZWQgICAgID0gZmFsc2U7XG4gICAgICAgIHRoaXMuJGNsaWNrZWRCdG4gICAgICAgICA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5jYXJ0ICAgICAgICA9IG5ldyBDYXJ0UGFnZShDT05GSUcpO1xuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlID0gbmV3IENhcnRTZXJ2aWNlKCk7XG4gICAgICAgIC8vIHRoaXMuZXZlbnRzSW5pdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXZlbnRzKCk7XG4gICAgICAgIHRoaXMucGx1Z2lucygpO1xuICAgIH1cblxuICAgIGV2ZW50cygpIHtcbiAgICAgIC8vIGlmKHRoaXMuZXZlbnRzSW5pdGVkKSByZXR1cm47XG5cbiAgICAgIC8vIHRoaXMuZXZlbnRzSW5pdGVkID0gdHJ1ZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICog0KMg0Y3Qu9C10LzQtdC90YLQsCDQv9C+INC60L7RgtC+0YDQvtC80YMg0LrQu9C40LrQsNC10Lwg0LTQvtC70LbQtdC9INCx0YvRgtGMINCw0YLRgNC40LHRg9GCIGRhdGEtaWQg0YEgaWQg0YLQvtCy0LDRgNCwLFxuICAgICAgICAgKiDQtdGB0LvQuCDRjdGC0L4g0YHRgtGA0LDQvdC40YbQsCBlbnJvbGxtZW50LCDRgtC+INC00L7QsdCw0LLQu9GP0LXQvCDQsNGC0YDQuNCx0YPRgiBkYXRhLWVucm9sbG1lbnQ9XCIxXCJcbiAgICAgICAgICovXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcuYWRkX19wcm9kdWN0X190b19fY2FydCcsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmKHRoaXMuYnV0dG9uSXNDbGlja2VkKSByZXR1cm47XG5cbiAgICAgICAgICAgIGxldCAkYnRuID0gJChldmVudC5jdXJyZW50VGFyZ2V0KSxcbiAgICAgICAgICAgICAgICBlbnJvbGxtZW50ID0gJGJ0bi5kYXRhKCdlbnJvbGxtZW50Jyk7XG5cbiAgICAgICAgICAgIHRoaXMuJGNsaWNrZWRCdG4gPSAkYnRuO1xuICAgICAgICAgICAgdGhpcy50b2dnbGVEaXNhYmxpbmdBZGRUb0NhcnRCdG4odHJ1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkVG9DYXJ0KFxuICAgICAgICAgICAgICAgICRidG4uZGF0YSgnaWQnKSxcbiAgICAgICAgICAgICAgICAkYnRuLmNsb3Nlc3QoJy5jYXJ0X19wcm9kdWN0c19fcXVhbnRpdHknKS5maW5kKCcucHJvZHVjdF9jb3VudF9mcm9tX2FkZF90b19jYXJ0JykudmFsKCksXG4gICAgICAgICAgICAgICAgJCgnI3dpdGgtYXV0b3NoaXAtJyskYnRuLmRhdGEoJ2lkJykpLnByb3AoJ2NoZWNrZWQnKSA/IDEgOiAwLFxuICAgICAgICAgICAgICAgICRidG4uZGF0YSgnYnVuZGxlX2lkJyksXG4gICAgICAgICAgICAgICAgJGJ0bi5kYXRhKCd2aWV3QmxvY2snKSlcbiAgICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYoZW5yb2xsbWVudCl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydFNlcnZpY2UucmVmcmVzaEVucm9sbG1lbnRDYXJ0KCk7XG4gICAgICAgICAgICAgICAgICAgICQoJy5zd2l0Y2gtY2FydCcpLnJlbW92ZUNsYXNzKCdjbG9zZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS52Ym9DYXJ0UG9zaXRpb25lcihmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLnJlZnJlc2hIZWFkZXJDYXJ0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydFNlcnZpY2UucmVmcmVzaEVucm9sbG1lbnRDYXJ0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25BZGRUb0NhcnQocmVzKTtcbiAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgLy9uZXcgdmVyc2lvblxuICAgICAgICAgICAgLy8gICAgICQoJy5zd2l0Y2gtY2FydCcpLnJlbW92ZUNsYXNzKCdjbG9zZWQnKTtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmNhcnRTZXJ2aWNlLnZib0NhcnRQb3NpdGlvbmVyKGZhbHNlKTtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmNhcnRTZXJ2aWNlLnJlZnJlc2hFbnJvbGxtZW50Q2FydCgpO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgICAgaWYoIWVucm9sbG1lbnQpe1xuICAgICAgICAgICAgLy8gICAgICAgdGhpcy5vbkFkZFRvQ2FydChyZXMpO1xuICAgICAgICAgICAgLy8gICAgICAgdGhpcy5jYXJ0U2VydmljZS5yZWZyZXNoSGVhZGVyQ2FydCgpO1xuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vZW5kIG5ldyB2ZXJzaW9uXG5cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnYWRkLXRvLWNhcnQtc3VjY2VzcycsIHtcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJlcy5za3VcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl0eTogJCgnI3Byb2R1Y3RfY291bnRfZnJvbV9hZGRfdG9fY2FydCcpLnZhbCgpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgIH0sIGVyciA9PiB7XG5cbiAgICAgICAgICAgICAgICBsZXQgZXJyb3JzQXJyYXkgPSBKU09OLnBhcnNlKGVyci5yZXNwb25zZVRleHQpO1xuXG4gICAgICAgICAgICAgICAgaWYoZW5yb2xsbWVudCl7XG4gICAgICAgICAgICAgICAgICAgICRidG4uY2xvc2VzdCgnLnByb2R1Y3RfX2l0ZW1fX2J0bnMnKS5maW5kKCcuZXJyb3InKS50ZXh0KGVycm9yc0FycmF5LmNvdW50WzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICRidG4ucGFyZW50KCkuZmluZCgnLmVycm9yJykudGV4dChlcnJvcnNBcnJheS5jb3VudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlRGlzYWJsaW5nQWRkVG9DYXJ0QnRuKGZhbHNlKTtcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCk9PntcbiAgICAgICAgICAgICAgICAgICAgJCgnLmVycm9yJykudGV4dCgnJyk7XG4gICAgICAgICAgICAgICAgfSwgMzAwMCk7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coSlNPTi5wYXJzZShlcnIucmVzcG9uc2VUZXh0KSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqINCU0L7QsdCw0LLQu9GP0LXRgiDRgtC+0LLQsNGAINCyINCw0LLRgtC+0YjQuNC/XG4gICAgICAgICAqL1xuICAgICAgICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLmFkZC10by1hdXRvc2hpcCcsIGV2ZW50ID0+IHtcblxuICAgICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0F1dG9zaGlwKFxuICAgICAgICAgICAgICAgIHRoaXMubGFzdEFkZGVkR29vZC5pZCxcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RBZGRlZEdvb2QucXR5X3RvdGFsXG4gICAgICAgICAgICApLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdEFkZGVkR29vZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UG9wdXAuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqINCU0L7QsdCw0LLQu9GP0LXRgiDRgtC+0LLQsNGAINCyINC60L7RgNC30LjQvdGDINGC0L7Qu9GM0LrQviDQsiDQsNCy0YLQvtGI0LjQvy5cbiAgICAgICAgICog0JLQvtC30LzQvtC20L3QviDQvdCwINGB0YLRgNCw0L3QuNGG0LUgL3Ziby9jYXRhbG9nXG4gICAgICAgICAqL1xuICAgICAgICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLmpzLWFkZF90b19hdXRvc2hpcF9vbmx5JywgZXZlbnQgPT4ge1xuICAgICAgICAgICAgbGV0ICRidG4gPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICAgICAgdGhpcy4kY2xpY2tlZEJ0biA9ICRidG47XG5cbiAgICAgICAgICAgIHRoaXMudG9nZ2xlRGlzYWJsaW5nQWRkVG9DYXJ0QnRuKHRydWUpO1xuXG4gICAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZFRvQXV0b3NoaXBPbmx5KFxuICAgICAgICAgICAgICAgICRidG4uZGF0YSgnaWQnKSxcbiAgICAgICAgICAgICAgICAkYnRuLmNsb3Nlc3QoJy5jYXJ0X19wcm9kdWN0c19fcXVhbnRpdHknKS5maW5kKCcucHJvZHVjdF9jb3VudF9mcm9tX2FkZF90b19jYXJ0JykudmFsKClcbiAgICAgICAgICAgICkudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FydFNlcnZpY2UucmVmcmVzaEVucm9sbG1lbnRDYXJ0KCk7XG5cbiAgICAgICAgICAgICAgICAkKCcuc3dpdGNoLWNhcnQnKS5yZW1vdmVDbGFzcygnY2xvc2VkJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS52Ym9DYXJ0UG9zaXRpb25lcihmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZURpc2FibGluZ0FkZFRvQ2FydEJ0bihmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBpcyBuZWVkZWQ/XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2FkZC10by1jYXJ0LXN1Y2Nlc3MnLCB7XG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiByZXMuc2t1XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6ICQoJyNwcm9kdWN0X2NvdW50X2Zyb21fYWRkX3RvX2NhcnQnKS52YWwoKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICB9LCBlcnIgPT4ge1xuXG4gICAgICAgICAgICAgICAgbGV0IGVycm9yc0FycmF5ID0gSlNPTi5wYXJzZShlcnIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAkYnRuLnBhcmVudCgpLmZpbmQoJy5lcnJvcicpLnRleHQoZXJyb3JzQXJyYXkuY291bnQpO1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlRGlzYWJsaW5nQWRkVG9DYXJ0QnRuKGZhbHNlKTtcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCk9PntcbiAgICAgICAgICAgICAgICAgICAgJCgnLmVycm9yJykudGV4dCgnJyk7XG4gICAgICAgICAgICAgICAgfSwgMzAwMClcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhKU09OLnBhcnNlKGVyci5yZXNwb25zZVRleHQpKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDQoNCw0LfQstC+0YDQsNGH0LjQstCw0LXRgiDQvtC/0LjRgdCw0L3QuNC1INCw0LLRgtC+0YjQuNC/0LAg0LLQvdGD0YLRgNC4INC/0L7Qv9Cw0L/QsFxuICAgICAgICAgKi9cbiAgICAgICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5tb3JlLWFib3V0LWF1dG9zaGlwJywgZXZlbnQgPT4ge1xuICAgICAgICAgICAgJChldmVudC5jdXJyZW50VGFyZ2V0KS5uZXh0KCkuc2xpZGVUb2dnbGUoMzAwLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53YXNOb3RBdXRvc2hpcFBvcHVwLnJlcG9zaXRpb24oMTAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwbHVnaW5zKCkge1xuICAgICAgICAvLyB0aGlzLmN1dERlc2NyaXB0aW9uKCk7XG5cblxuICAgIH1cblxuICAgIC8qY3V0RGVzY3JpcHRpb24oKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdjdXREZXNjcmlwdGlvbiAxJylcbiAgICAgICAgbGV0ICRkZXNjcmlwdGlvbiA9ICQoJy5wcm9kdWN0X19pdGVtX2Rlc2NyaXB0aW9uJyk7XG4gICAgICAgIGxldCB0ZXh0ID0gW107XG4gICAgICAgIGxldCAkZnVsbERlc2NyaXB0aW9uID0gbnVsbDtcbiAgICAgICAgbGV0IHRleHRQcmVwYXJlZCA9IFtdO1xuXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCAkZGVzY3JpcHRpb24ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRleHQucHVzaCgkKCRkZXNjcmlwdGlvbltpXSkudGV4dCgpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0ZXh0JywgdGV4dCk7XG5cbiAgICAgICAgICAgICQoJGRlc2NyaXB0aW9uW2ldKS5odG1sKCc8c3BhbiBjbGFzcz1cImZ1bGxfZGVzY3JpcHRpb25cIj4nICsgdGV4dFtpXSArICc8L3NwYW4+Jyk7XG5cbiAgICAgICAgICAgICRmdWxsRGVzY3JpcHRpb24gPSAkKCRkZXNjcmlwdGlvbltpXSkuZmluZCgnLmZ1bGxfZGVzY3JpcHRpb24nKTtcblxuICAgICAgICAgICAgaWYoJGZ1bGxEZXNjcmlwdGlvbi5pbm5lckhlaWdodCgpID4gMzUpIHtcbiAgICAgICAgICAgICAgICAkZnVsbERlc2NyaXB0aW9uLmh0bWwoJy4uLicpO1xuXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3RleHQgNycsIHRleHQsIHRleHRbaV0ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBmb3IgKCBsZXQgaiA9IDA7IGkgPCB0ZXh0W2ldLmxlbmd0aCAmJiAkZnVsbERlc2NyaXB0aW9uLmlubmVySGVpZ2h0KCkgPD0gMzU7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygkZnVsbERlc2NyaXB0aW9uLmhlaWdodCgpLCBqLCAkZnVsbERlc2NyaXB0aW9uLCAgJ2FzZCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICRmdWxsRGVzY3JpcHRpb24ucHJlcGVuZCh0ZXh0W2ldW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgdGV4dFByZXBhcmVkLnVuc2hpZnQodGV4dFtpXVtqXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYoJGZ1bGxEZXNjcmlwdGlvbi5oZWlnaHQoKSA+IDM1KXtcbiAgICAgICAgICAgICAgICAgICAgdGV4dFByZXBhcmVkLnNwbGljZSgtMSwgMTApO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGV4dFByZXBhcmVkJywgdGV4dFByZXBhcmVkKTtcbiAgICAgICAgICAgICAgICAgICAgJGZ1bGxEZXNjcmlwdGlvbi5odG1sKHRleHRQcmVwYXJlZC5qb2luKCcnKSkuYXBwZW5kKCcuLi4nKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyAkZnVsbERlc2NyaXB0aW9uLmh0bWwoJGZ1bGxEZXNjcmlwdGlvbi50ZXh0KCkuc3BsaXQoKS5zcGxpY2UoLTEsIDEwKS5qb2luKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuKi9cblxuICAgIG9uQWRkVG9DYXJ0KHJlcykge1xuICAgICAgICB0aGlzLmxhc3RBZGRlZEdvb2QgICAgPSByZXM7XG5cbiAgICAgICAgaWYocmVzLmF1dG9fc2hpcCA9PSAxIHx8IHJlcy5pc19zaG93X2F1dG9zaGlwID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNob3dDYXJ0UG9wdXAoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDQldGB0LvQuCDRgtC+0LLQsNGAINC90LDRhdC+0LTQuNGC0YHRjyDQsiDQsNCy0YLQvtGI0LjQv9C1INGC0L4g0L7RgtC+0LHRgNCw0LbQsNC10YLRgdGPINGN0YLQvtGCINC/0L7Qv9Cw0L9cbiAgICAgICAgICovXG4gICAgICAgIGlmKHJlcy5pc19wcm9kdWN0X2luX2F1dG9zaGlwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9kdWN0SW5BdXRvc2hpcChyZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqINCV0YHQu9C4INGDINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjyDRgNCw0L3RjNGI0LUg0LHRi9C7INGC0L7QstCw0YAg0LIg0LDQstGC0L7RiNC40L/QtSDRgtC+INC+0YLQvtCx0YDQsNC20LDQtdGC0YHRjyDQvtC00LjQvSDQv9C+0L/QsNC/XG4gICAgICAgICAqL1xuICAgICAgICBpZihDT05GSUcuSEFTX0FVVE9TSElQKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy51c2VySGFzQXV0b3NoaXAocmVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vdEhhdmVBdXRvc2hpcChyZXMpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9C+0L/QsNC/INC00LvRjyDRgtC+0LLQsNGA0LAg0LrQvtGC0L7RgNGL0Lkg0L3QsNGF0L7QtNC40YLRgdGPINCyINCw0LLRgtC+0YjQuNC/0LVcbiAgICAgKi9cbiAgICBwcm9kdWN0SW5BdXRvc2hpcChyZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvd1BvcHVwKCdncmVhdC1jaG9pY2UnLCB7IG9uQ2xvc2UgOiAoKSA9PiB0aGlzLnNob3dDYXJ0UG9wdXAoKSB9KVxuICAgICAgICAgICAgLnRoZW4oKHBvcHVwKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVEaXNhYmxpbmdBZGRUb0NhcnRCdG4oZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFBvcHVwID0gcG9wdXA7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9C+0L/QsNC/INC60L7Qs9C00LAg0YMg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GPINGA0LDQvdGM0YjQtSDQsdGL0Lsg0LDQstGC0L7RiNC40L9cbiAgICAgKi9cbiAgICB1c2VySGFzQXV0b3NoaXAocmVzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNob3dQb3B1cCgnd2FzLWF1dG9zaGlwJywgeyBvbkNsb3NlIDogKCkgPT4gdGhpcy5zaG93Q2FydFBvcHVwKCkgfSlcbiAgICAgICAgICAgIC50aGVuKChwb3B1cCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFBvcHVwID0gcG9wdXA7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQXV0b3NoaXBQb3B1cHNEYXRhKHJlcyk7XG5cbiAgICAgICAgICAgICAgICAvLyB0aGlzLnRvZ2dsZURpc2FibGluZ0FkZFRvQ2FydEJ0bihmYWxzZSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9C+0L/QsNC/INC60L7Qs9C00LAg0YMg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GPINC90LUg0LHRi9C70L4g0LDQstGC0L7RiNC40L/QsFxuICAgICAqL1xuICAgIG5vdEhhdmVBdXRvc2hpcChyZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvd1BvcHVwKCd3YXMtbm90LWF1dG9zaGlwJywgeyBvbkNsb3NlIDogKCkgPT4gdGhpcy5zaG93Q2FydFBvcHVwKCkgfSlcbiAgICAgICAgICAgIC50aGVuKChwb3B1cCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMud2FzTm90QXV0b3NoaXBQb3B1cCA9IHBvcHVwO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFBvcHVwICAgICAgICA9IHBvcHVwO1xuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaEF1dG9zaGlwUG9wdXBzRGF0YShyZXMpO1xuXG4gICAgICAgICAgICAgICAgLy8gdGhpcy50b2dnbGVEaXNhYmxpbmdBZGRUb0NhcnRCdG4oZmFsc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J7QsdC90L7QstC70LXQvdC40LUg0LTQsNC90L3Ri9GFINGC0L7QstCw0YDQsCDQsiDQv9C+0L/QsNC/0LUg0L/RgNC10LTQu9Cw0LPQsNGO0YnQtdC8INC00L7QsdCw0LLQuNGC0Ywg0YLQvtCy0LDRgCDQsiDQsNCy0YLQvtGI0LjQv1xuICAgICAqIEBwYXJhbSBkYXRhIC0g0JTQsNC90L3Ri9C1INGC0L7QstCw0YDQsCDQstC+0LfQstGA0LDRidCw0LXQvNGL0LUg0L/QvtGB0LvQtSDQtNC+0LHQsNCy0LvQtdC90LjRjyDQsiDQutC+0YDQt9C40L3Rg1xuICAgICAqL1xuICAgIHJlZnJlc2hBdXRvc2hpcFBvcHVwc0RhdGEoZGF0YSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhkYXRhKTtcbiAgICAgICAgJCgnLmF1dG9zaGlwX3BvcHVwX3Byb2R1Y3RfaW1hZ2UnKS5hdHRyKCdzcmMnLCBkYXRhLmltYWdlKTtcbiAgICAgICAgaWYoZGF0YS5pc19tb2RlcmF0ZSl7XG4gICAgICAgICAgICAkKCcuYXV0b3NoaXBfcG9wdXBfcHJvZHVjdF9uYW1lJykuaHRtbChkYXRhLm5hbWUpO1xuICAgICAgICAgICAgJCgnLmF1dG9zaGlwX3BvcHVwX3Byb2R1Y3RfbmFtZScpLmF0dHIoJ2hyZWYnLCBkYXRhLmxpbmspO1xuICAgICAgICB9ZWxzZSB7XG4gICAgICAgICAgICAkKCcuYXV0b3NoaXBfcG9wdXBfcHJvZHVjdF9uYW1lX3NwYW4nKS5odG1sKGRhdGEubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAkKCcuYXV0b3NoaXBfcG9wdXBfcHJvZHVjdF9xdHknKS5odG1sKGRhdGEucXR5X3RvdGFsKTtcbiAgICAgICAgJCgnLmF1dG9zaGlwX3BvcHVwX3Byb2R1Y3RfcHJpY2UnKS5odG1sKGRhdGEucHJpY2Vfd2l0aF9jdXJyZW5jeSk7XG4gICAgICAgICQoJyNzYXZlLW1lbWJlci1wZXJjZW50JykuaHRtbChkYXRhLm1lbWJlclNhdmVQZXJjZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntGC0L7QsdGA0LDQttC10L3QuNC1INC/0L7Qv9Cw0L/QsCDQutC+0YDQt9C40L3Ri1xuICAgICAqL1xuICAgIHNob3dDYXJ0UG9wdXAoKSB7XG4gICAgICAgIHJldHVybiAkLmdldFBvcHVwKCdjYXJ0JylcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRQb3B1cCA9ICQoJyNjYXJ0Jykuc2hvd1BvcHVwKCk7XG4gICAgICAgICAgICAgICAgdGhpcy4kY2xpY2tlZEJ0bi5hdHRyKCdkaXNhYmxlZCcsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1dHRvbklzQ2xpY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J7RgtC+0LHRgNCw0LbQsNC10YIg0L/QvtC/0LDQv1xuICAgICAqINCd0L4g0YHQvdCw0YfQsNC70LAg0L7QvSDQv9C+0LvRg9GH0LDQtdGCINC10LPQviDRgSDRgdC10YDQstC10YDQsFxuICAgICAqIEBwYXJhbSBwb3B1cE5hbWUgLSDQmNC80Y8g0L/QvtC/0LDQv9CwLCDRj9Cy0LvRj9C10YLRgdGPINC4INC10LPQviDQsNC50LTQuNGI0L3QuNC60L7QvFxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0g0J7Qv9GG0LjQuCDQtNC70Y8g0L/QvtC/0LDQv9CwXG4gICAgICovXG4gICAgc2hvd1BvcHVwKHBvcHVwTmFtZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gJC5nZXRQb3B1cChwb3B1cE5hbWUpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICQoJyMnK3BvcHVwTmFtZSkuc2hvd1BvcHVwKG9wdGlvbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RhdGU6IGJvb2xlYW5cbiAgICAgKi9cbiAgICB0b2dnbGVEaXNhYmxpbmdBZGRUb0NhcnRCdG4oc3RhdGUpIHtcbiAgICAgICAgdGhpcy4kY2xpY2tlZEJ0bi5hdHRyKCdkaXNhYmxlZCcsIHN0YXRlKTtcbiAgICAgICAgdGhpcy5idXR0b25Jc0NsaWNrZWQgPSBzdGF0ZTtcbiAgICB9XG59XG4iLCJleHBvcnQgY2xhc3MgUmV2aWV3cyB7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5ldmVudHMoKTtcbiAgICB9XG5cbiAgICBldmVudHMoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDQn9C+0LrQsNC30LDRgtGMINCx0LvQvtC6INC00L7QsdCw0LLQu9C10L3QuNGPINC+0YLQt9GL0LLQsFxuICAgICAgICAgKi9cbiAgICAgICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJyNzaG93LW5ldy1yZXZpZXctZm9ybScsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgICQoJyNuZXdfX3Jldmlld19fY29udGFpbmVyJykuc2xpZGVEb3duKCk7XG4gICAgICAgICAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmhpZGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqINCh0LrRgNGL0YLRjCDQsdC70L7QuiDQtNC+0LHQsNCy0LvQtdC90LjRjyDQvtGC0LfRi9Cy0YtcbiAgICAgICAgICovXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcjaGlkZS1uZXctcmV2aWV3LWZvcm0nLCAoKSA9PiB7XG4gICAgICAgICAgICAkKCcjc2hvdy1uZXctcmV2aWV3LWZvcm0nKS5zaG93KCk7XG4gICAgICAgICAgICAkKCcjbmV3X19yZXZpZXdfX2NvbnRhaW5lcicpLnNsaWRlVXAoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqINCX0LDQv9GA0L7RgSDQvdCwINC00L7QsdCw0LLQu9C10L3QuNC1INC+0YLQt9GL0LLQsFxuICAgICAgICAgKi9cbiAgICAgICAgJChkb2N1bWVudCkub24oJ3N1Ym1pdCcsICcjbGl2ZS1yZXZpZXcnLCBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgbGV0IGZvcm0gPSB0aGlzO1xuXG4gICAgICAgICAgICAkLnBvc3QoQ09ORklHLkJBU0VfVVJMKydyZXZpZXcvPycrJCh0aGlzKS5zZXJpYWxpemUoKSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgICAgICAgICB9LCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBWYWxpZGF0ZSgkKGZvcm0pLCBlcnIucmVzcG9uc2VKU09OKVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgfSk7XG4gICAgfVxuXG59IiwiZXhwb3J0IGNsYXNzIFp1cmlrQWNjb3JkZW9uIHtcblxuICAgIGNvbnN0cnVjdG9yKHNlbGVjdG9yKSB7XG4gICAgICAgIHRoaXMuaW5pdFBsdWdpbigpO1xuICAgICAgICAkKHNlbGVjdG9yKS56dXJpa0FjY29yZGVvbigpO1xuICAgIH1cblxuICAgIGluaXRQbHVnaW4oKSB7XG4gICAgICAgICQuZm4uenVyaWtBY2NvcmRlb24gPSBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyIG1vZHVsZSA9IHt9O1xuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgbW9kdWxlLmhpZGVDb250ZW50ID0gZnVuY3Rpb24oJGl0ZW0sIG9uSW5pdCkge1xuICAgICAgICAgICAgICAgIGlmKG9uSW5pdCkge1xuICAgICAgICAgICAgICAgICAgICAkaXRlbS5maW5kKCcuYWNjb3JkZW9uLWNvbnRlbnQnKS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAkaXRlbS5maW5kKCcuYWNjb3JkZW9uLWNvbnRlbnQnKS5zbGlkZVVwKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtb2R1bGUuc2hvd0NvbnRlbnQgPSBmdW5jdGlvbigkaXRlbSwgb25Jbml0KSB7XG4gICAgICAgICAgICAgICAgaWYob25Jbml0KSB7XG4gICAgICAgICAgICAgICAgICAgICRpdGVtLmZpbmQoJy5hY2NvcmRlb24tY29udGVudCcpLnNob3coKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICRpdGVtLmZpbmQoJy5hY2NvcmRlb24tY29udGVudCcpLnNsaWRlRG93bigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbW9kdWxlLmhpZGVBbGxJdGVtcyA9IGZ1bmN0aW9uKCRhY2NvcmRlb24sIG9uSW5pdCkge1xuICAgICAgICAgICAgICAgIG1vZHVsZS5oaWRlQ29udGVudCgkYWNjb3JkZW9uLCBvbkluaXQpO1xuICAgICAgICAgICAgICAgICRhY2NvcmRlb24uZmluZCgnLmFjY29yZGVvbi1pdGVtJykuYWRkQ2xhc3MoJ2FjY29yZGVvbi1oaWRkZW4nKS5yZW1vdmVDbGFzcygnYWNjb3JkZW9uLW9wZW5lZCcpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbW9kdWxlLnNob3dBY2NvcmRlb24gPSBmdW5jdGlvbigkYWNjb3JkZW9uSXRlbSwgb25Jbml0KSB7XG4gICAgICAgICAgICAgICAgbW9kdWxlLnNob3dDb250ZW50KCRhY2NvcmRlb25JdGVtLCBvbkluaXQpO1xuICAgICAgICAgICAgICAgICRhY2NvcmRlb25JdGVtLnJlbW92ZUNsYXNzKCdhY2NvcmRlb24taGlkZGVuJykuYWRkQ2xhc3MoJ2FjY29yZGVvbi1vcGVuZWQnKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIG1vZHVsZS5oaWRlQWNjb3JkZW9uID0gZnVuY3Rpb24oJGFjY29yZGVvbkl0ZW0sIG9uSW5pdCkge1xuICAgICAgICAgICAgICAgIG1vZHVsZS5oaWRlQ29udGVudCgkYWNjb3JkZW9uSXRlbSwgb25Jbml0KTtcbiAgICAgICAgICAgICAgICAkYWNjb3JkZW9uSXRlbS5hZGRDbGFzcygnYWNjb3JkZW9uLWhpZGRlbicpLnJlbW92ZUNsYXNzKCdhY2NvcmRlb24tb3BlbmVkJyk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBtb2R1bGUuYWRkRXZlbnRzID0gZnVuY3Rpb24oJHRvZ2dsZXMpIHtcbiAgICAgICAgICAgICAgICAkdG9nZ2xlcy5jbGljayhmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgJGl0ZW0gID0gJCh0aGlzKS5jbG9zZXN0KCcuYWNjb3JkZW9uLWl0ZW0nKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlzT3BlbiA9ICRpdGVtLmRhdGEoJ29wZW4nKTtcblxuICAgICAgICAgICAgICAgICAgICAkdG9nZ2xlcy5jbG9zZXN0KCcuYWNjb3JkZW9uLWl0ZW0nKS5kYXRhKCdvcGVuJywgZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmKGlzT3Blbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmhpZGVBY2NvcmRlb24oJGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmhpZGVBbGxJdGVtcygkdG9nZ2xlcy5jbG9zZXN0KCcuYWNjb3JkZW9uJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLnNob3dBY2NvcmRlb24oJGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW0uZGF0YSgnb3BlbicsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIG1vZHVsZS5pbml0ID0gZnVuY3Rpb24oJGFjY29yZGVvbikge1xuXG4gICAgICAgICAgICAgICAgLy92YXIgJG9wZW5lZCA9ICRhY2NvcmRlb24uZmluZCgnLmFjY29yZGVvbi1pdGVtW2RhdGEtb3Blbj1cInRydWVcIl0nKTtcblxuICAgICAgICAgICAgICAgIG1vZHVsZS5oaWRlQWxsSXRlbXMoJGFjY29yZGVvbiwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBpZigkb3BlbmVkLnNpemUoKSA8PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICRvcGVuZWQgPSAkYWNjb3JkZW9uLmZpbmQoJy5hY2NvcmRlb24taXRlbScpLmVxKDApO1xuICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgIC8vbW9kdWxlLnNob3dBY2NvcmRlb24oJG9wZW5lZCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBtb2R1bGUuYWRkRXZlbnRzKCRhY2NvcmRlb24uZmluZCgnLmFjY29yZGVvbi10b2dnbGUnKSk7XG5cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIChmdW5jdGlvbiBpbml0KCkge1xuXG4gICAgICAgICAgICAgICAgJHRoaXMuZWFjaChmdW5jdGlvbihpbmRleCwgZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBtb2R1bGUuaW5pdCgkKGVsZW1lbnQpKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfSkoKTtcblxuICAgICAgICB9XG4gICAgfVxuXG59IiwiZXhwb3J0IGNsYXNzIFp1cmlrUmF0aW5nIHtcblxuICAgIGNvbnN0cnVjdG9yKHNlbGVjdG9yKSB7XG4gICAgICAgIGlmKCQoc2VsZWN0b3IpLmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgdGhpcy5pbml0UmF0aW5nUGx1Z2luKCk7XG4gICAgICAgICAgICAkKHNlbGVjdG9yKS56dXJpa1JhdGluZygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdFJhdGluZ1BsdWdpbigpIHtcblxuICAgICAgICAkLmZuLnp1cmlrUmF0aW5nID0gZnVuY3Rpb24ob3B0aW9ucykge1xuXG4gICAgICAgICAgICB2YXIgb3B0ID0gJC5leHRlbmQoe1xuICAgICAgICAgICAgICAgIG9uQ2hhbmdlIDogZnVuY3Rpb24oKSB7fSxcbiAgICAgICAgICAgICAgICBvbkluaXQgOiBmdW5jdGlvbigpIHt9XG4gICAgICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICAgICAgdmFyIG1vZHVsZSA9IHt9O1xuXG4gICAgICAgICAgICB2YXIgQ0hFQ0tFRF9DTEFTUyAgID0gJCh0aGlzKS5kYXRhKCdjaGVja2VkJykgfHwgJ2ljb24tc3Rhci1iaWcnO1xuICAgICAgICAgICAgdmFyIFVOQ0hFQ0tFRF9DTEFTUyA9ICQodGhpcykuZGF0YSgnZGVmYXVsdCcpIHx8ICdpY29uLXN0YXItYmlnLWRpc2FibGVkJztcblxuICAgICAgICAgICAgbW9kdWxlLmluaXQgPSBmdW5jdGlvbigkcmF0aW5nKSB7XG5cbiAgICAgICAgICAgICAgICAkcmF0aW5nLmhpZGUoKTtcbiAgICAgICAgICAgICAgICAkcmF0aW5nLndyYXAoJzxkaXYgY2xhc3M9XCJyYXRpbmctd3JhcHBlclwiLz4nKTtcbiAgICAgICAgICAgICAgICB2YXIgJHdyYXBwZXIgPSAkcmF0aW5nLnBhcmVudCgpO1xuICAgICAgICAgICAgICAgIHZhciAkdm90ZXMgICA9IG1vZHVsZS5nZXRWb3RlKCRyYXRpbmcuZGF0YSgndm90ZXMnKSk7XG4gICAgICAgICAgICAgICAgdmFyIGRpc2FibGVkID0gJHJhdGluZy5hdHRyKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSAgICA9ICRyYXRpbmcudmFsKCk7XG5cbiAgICAgICAgICAgICAgICBmb3IodmFyIGkgPSAxOyBpIDw9IDU7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZihpIDw9IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkID0gQ0hFQ0tFRF9DTEFTUztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgJHN0YXIgPSBtb2R1bGUubmV3U3RhcihpLCBjaGVja2VkKTtcbiAgICAgICAgICAgICAgICAgICAgJHdyYXBwZXIuYXBwZW5kKCRzdGFyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZighZGlzYWJsZWQpIG1vZHVsZS5hZGRFdmVudHMoJHdyYXBwZXIpO1xuICAgICAgICAgICAgICAgIGlmKGRpc2FibGVkKSAkd3JhcHBlci5hcHBlbmQoJHZvdGVzKTtcbiAgICAgICAgICAgICAgICBpZihkaXNhYmxlZCkgJHdyYXBwZXIuYWRkQ2xhc3MoJ3JhdGluZy1kaXNhYmxlZCcpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbW9kdWxlLm5ld1N0YXIgPSBmdW5jdGlvbih2YWx1ZSwgY2hlY2tlZENsYXNzKSB7XG4gICAgICAgICAgICAgICAgdmFyICRzdGFyID0gJCgnPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiLz4nKTtcbiAgICAgICAgICAgICAgICAkc3Rhci5hZGRDbGFzcyhVTkNIRUNLRURfQ0xBU1MpO1xuICAgICAgICAgICAgICAgICRzdGFyLmRhdGEoJ3ZhbHVlJywgdmFsdWUpO1xuXG4gICAgICAgICAgICAgICAgaWYoY2hlY2tlZENsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICRzdGFyLmFkZENsYXNzKGNoZWNrZWRDbGFzcyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuICRzdGFyO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbW9kdWxlLmdldFZvdGUgPSBmdW5jdGlvbih2b3Rlcykge1xuICAgICAgICAgICAgICAgIGlmKCF2b3Rlcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyICR2b3RlcyA9ICQoJzxzcGFuIGNsYXNzPVwicmF0aW5nLXZvdGVzXCIvPicpO1xuICAgICAgICAgICAgICAgICR2b3Rlcy50ZXh0KCcoJysodm90ZXMgfHwgMCkrJyknKTtcblxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbW9kdWxlLmFkZEV2ZW50cyA9IGZ1bmN0aW9uKCR3cmFwcGVyKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgJHN0YXJzICA9ICR3cmFwcGVyLmZpbmQoJ2EnKTtcbiAgICAgICAgICAgICAgICB2YXIgJHJhdGluZyA9ICR3cmFwcGVyLmZpbmQoJ2lucHV0Jyk7XG5cbiAgICAgICAgICAgICAgICAkc3RhcnMuaG92ZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICRzdGFycy5yZW1vdmVDbGFzcyhDSEVDS0VEX0NMQVNTKS5hZGRDbGFzcyhVTkNIRUNLRURfQ0xBU1MpO1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKENIRUNLRURfQ0xBU1MpO1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnByZXZBbGwoJ2EnKS5hZGRDbGFzcyhDSEVDS0VEX0NMQVNTKTtcblxuICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAkc3RhcnMucmVtb3ZlQ2xhc3MoQ0hFQ0tFRF9DTEFTUyk7XG4gICAgICAgICAgICAgICAgICAgIGlmKCRyYXRpbmcudmFsKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCAkcmF0aW5nLnZhbCgpOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RhcnMuZXEoaSkuYWRkQ2xhc3MoQ0hFQ0tFRF9DTEFTUykucmVtb3ZlQ2xhc3MoVU5DSEVDS0VEX0NMQVNTKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgJHN0YXJzLmNsaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAkcmF0aW5nLnZhbCgkKHRoaXMpLmRhdGEoJ3ZhbHVlJykpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuXG5cbiAgICAgICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbihpbmRleCwgZWxlbSkge1xuICAgICAgICAgICAgICAgIG1vZHVsZS5pbml0KCQoZWxlbSkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfVxuXG4gICAgfVxuXG59XG4iLCJleHBvcnQgY2xhc3MgWnVyaWtUYWJzIHtcblxuICAgIGNvbnN0cnVjdG9yKHNlbGVjdG9yKSB7XG4gICAgICAgIHRoaXMuaW5pdFBsdWdpbigpO1xuICAgICAgICAkKHNlbGVjdG9yKS56dXJpa1RhYnMoKTtcbiAgICB9XG5cbiAgICBpbml0UGx1Z2luKCkge1xuICAgICAgICAkLmZuLnp1cmlrVGFicyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblxuICAgICAgICAgICAgdmFyIG9wdCA9ICQuZXh0ZW5kKHtcbiAgICAgICAgICAgICAgICBvbkNoYW5nZSA6IGZ1bmN0aW9uKCkge30sXG4gICAgICAgICAgICAgICAgb25Jbml0ICAgOiBmdW5jdGlvbigpIHt9XG4gICAgICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICAgICAgdmFyIG1vZHVsZSAgICAgPSB7fSxcbiAgICAgICAgICAgICAgICBpbWFnZXMgICAgID0gJCgnLnByb2R1Y3RfX2ltYWdlcycpLFxuICAgICAgICAgICAgICAgIHRhYlRvZ2dsZXMgPSB0aGlzLmZpbmQoJy50YWItaGVhZGVyIGEnKSxcbiAgICAgICAgICAgICAgICB0YWJJdGVtcyAgID0gdGhpcy5maW5kKCcudGFiLWl0ZW0nKTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gY2xlYXJUb2dnbGVTdHlsZXMoJHRvZ2dsZSkge1xuICAgICAgICAgICAgICAgIGlmKCR0b2dnbGUuY2xvc2VzdCgnLnRhYi1idW5kbGVzJykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlcy5yZW1vdmVDbGFzcygnY3VycmVudF9pbWFnZScpO1xuICAgICAgICAgICAgICAgICAgICBpbWFnZXMuZXEodGFiVG9nZ2xlcy5pbmRleCgkdG9nZ2xlKSkuYWRkQ2xhc3MoJ2N1cnJlbnRfaW1hZ2UnKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRhYlRvZ2dsZXMucmVtb3ZlQ2xhc3MoJ2N1cnJlbnQtdGFiJyk7XG4gICAgICAgICAgICAgICAgJHRvZ2dsZS5hZGRDbGFzcygnY3VycmVudC10YWInKTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBzaG93VGFiKCR0YWJUb2dnbGUpIHtcblxuICAgICAgICAgICAgICAgIHZhciB0YWJJZCA9ICR0YWJUb2dnbGUuYXR0cignaHJlZicpO1xuICAgICAgICAgICAgICAgICQodGFiSWQpLnNob3coKTtcbiAgICAgICAgICAgICAgICBvcHQub25Jbml0KCQodGFiSWQpKTtcbiAgICAgICAgICAgICAgICBjbGVhclRvZ2dsZVN0eWxlcygkdGFiVG9nZ2xlKTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtb2R1bGUuaW5pdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciBub3RPcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB2YXIgYW55T3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRhYkl0ZW1zLmhpZGUoKTtcbiAgICAgICAgICAgICAgICB0YWJUb2dnbGVzLmVhY2goZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIG9wZW4gID0gJCh0aGlzKS5kYXRhKCdvcGVuJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYob3BlbiAmJiBub3RPcGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RPcGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbnlPcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dUYWIoJCh0aGlzKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYoIWFueU9wZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgc2hvd1RhYih0YWJUb2dnbGVzLmVxKDApKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBtb2R1bGUuZXZlbnRzKCk7XG5cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIG1vZHVsZS5ldmVudHMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB0YWJUb2dnbGVzLmNsaWNrKGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdhYWEnLCAkKHRoaXMpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhYklkID0gJCh0aGlzKS5hdHRyKCdocmVmJyk7XG4gICAgICAgICAgICAgICAgICAgIHRhYkl0ZW1zLmhpZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgJCh0YWJJZCkuc2hvdygpO1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRvZ2dsZVN0eWxlcygkKHRoaXMpKTtcblxuICAgICAgICAgICAgICAgICAgICBvcHQub25DaGFuZ2UoJCh0YWJJZCkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBteUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KFwidGFiQ2hhbmdlZFwiLCB7fSk7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobXlFdmVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIG1vZHVsZS5pbml0KCk7XG5cbiAgICAgICAgfVxuICAgIH1cblxufSIsImltcG9ydCB7WnVyaWtBY2NvcmRlb259IGZyb20gXCIuL3BsdWdpbnMvenVyaWtBY2NvcmRlb25cIjtcbmltcG9ydCB7WnVyaWtUYWJzfSBmcm9tIFwiLi9wbHVnaW5zL3p1cmlrVGFic1wiO1xuaW1wb3J0IHtHb29kc30gZnJvbSBcIi4vbW9kdWxlcy9nb29kc1wiO1xuaW1wb3J0IHtSZXZpZXdzfSBmcm9tIFwiLi9tb2R1bGVzL3Jldmlld1wiO1xuaW1wb3J0IHtadXJpa1JhdGluZ30gZnJvbSBcIi4vcGx1Z2lucy96dXJpa1JhdGluZ1wiO1xuXG5leHBvcnQgY2xhc3MgUHJvZHVjdFBhZ2Uge1xuXG4gICAgY29uc3RydWN0b3IoQ09ORklHKSB7XG5cbiAgICAgICAgdGhpcy5DT05GSUcgPSBDT05GSUc7XG5cbiAgICAgICAgbmV3IFp1cmlrVGFicygnLnRhYicpO1xuICAgICAgICBuZXcgWnVyaWtUYWJzKCcudGFiLXByb2R1Y3RzJyk7XG4gICAgICAgIG5ldyBadXJpa0FjY29yZGVvbignLmFjY29yZGVvbicpO1xuICAgICAgICBuZXcgWnVyaWtSYXRpbmcoJy5hZGQtcmF0aW5nJyk7XG4gICAgICAgIG5ldyBHb29kcyhDT05GSUcpO1xuICAgICAgICBuZXcgUmV2aWV3cygpO1xuICAgICAgICB0aGlzLnBsdWdpbnMoKTtcbiAgICAgICAgdGhpcy5ldmVudHMoKTtcbiAgICB9XG5cbiAgICBwbHVnaW5zKCkge1xuICAgICAgICAvKiQoXCJhW3JlbF49J2dhbGxlcnknXVwiKS5tYWduaWZpY1BvcHVwKHtcbiAgICAgICAgICAgIHR5cGU6J2ltYWdlJyxcbiAgICAgICAgICAgIGdhbGxlcnk6IHtcbiAgICAgICAgICAgICAgICAvLyBvcHRpb25zIGZvciBnYWxsZXJ5XG4gICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZVxuICAgICAgICAgICAgfSx9KTsqL1xuXG4gICAgICAgICQoXCIuaW1hZ2UtbGluaywgLnZpZGVvLWxpbmtcIikubWFnbmlmaWNQb3B1cCh7XG4gICAgICAgICAgICBjYWxsYmFja3M6IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50UGFyc2U6IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNsYXNzIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgaWYoJChpdGVtLmVsWzBdKS5oYXNDbGFzcygndmlkZW8tbGluaycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnR5cGUgPSAnaWZyYW1lJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udHlwZSA9ICdpbWFnZSc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2FsbGVyeTp7ZW5hYmxlZDp0cnVlfSxcbiAgICAgICAgICAgIHR5cGU6ICdpbWFnZScsXG4gICAgICAgIH0pO1xuXG4gICAgICAgICQoXCIubW9iaWxlLWltYWdlLWxpbmssIC5tb2JpbGUtdmlkZW8tbGlua1wiKS5tYWduaWZpY1BvcHVwKHtcbiAgICAgICAgICAgIGNhbGxiYWNrczoge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRQYXJzZTogZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2xhc3MgbmFtZVxuICAgICAgICAgICAgICAgICAgICBpZigkKGl0ZW0uZWxbMF0pLmhhc0NsYXNzKCdtb2JpbGUtdmlkZW8tbGluaycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnR5cGUgPSAnaWZyYW1lJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udHlwZSA9ICdpbWFnZSc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2FsbGVyeTp7ZW5hYmxlZDp0cnVlfSxcbiAgICAgICAgICAgIHR5cGU6ICdpbWFnZScsXG4gICAgICAgIH0pO1xuXG4gICAgICAgLyogJChcImFbcmVsXj0nZ2FsbGVyeS12aWRlbyddXCIpLm1hZ25pZmljUG9wdXAoe1xuICAgICAgICAgICAgZGlzYWJsZU9uOiA3MDAsXG4gICAgICAgICAgICB0eXBlOiAnaWZyYW1lJyxcbiAgICAgICAgICAgIG1haW5DbGFzczogJ21mcC1mYWRlJyxcbiAgICAgICAgICAgIHJlbW92YWxEZWxheTogMTYwLFxuICAgICAgICAgICAgcHJlbG9hZGVyOiBmYWxzZSxcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICBmaXhlZENvbnRlbnRQb3M6IGZhbHNlXG4gICAgICAgIH0pOyovXG4gICAgfVxuICAgIGV2ZW50cygpIHtcbiAgICAgICAgJCgnLm9wZW4tYWJvdXQtYXV0b3NoaXAnKS5vbignY2xpY2snLCBldmVudCA9PiB7XG4gICAgICAgICAgICB0aGlzLnNob3dBYm91dEF1dG9zaGlwKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICB9KTtcblxuICAgICAgICAkKCdpbnB1dC5hdXRvc2hpcC1yYWRpbycpLm9uKCdjbGljaycsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlUHJvZHVjdEJ1eWluZ1R5cGUoZXZlbnQpXG4gICAgICAgIH0pO1xuXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcuaW5kX2NudCcsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgICQoJyNyZXZpZXdzJykuY2xpY2soKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAkKCdodG1sLCBib2R5Jykuc3RvcCgpLmFuaW1hdGUoe1xuICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogJCgnI3Jldmlld3MnKS5vZmZzZXQoKS50b3BcbiAgICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICB9KTtcblxuICAgICAgICAkKGRvY3VtZW50KS5vbigndGFiQ2hhbmdlZCcsIChlKSA9PiB7XG4gICAgICAgICAgICAkKCcucHJvZHVjdF9faW1hZ2VzX19tb2JpbGUnKS5zbGljaygndW5zbGljaycpO1xuICAgICAgICAgICAgdGhpcy5zbGlja0luaXQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zbGlja0luaXQoKTtcblxuICAgICAgICB0aGlzLm9uTG9hZFBhZ2UoKTtcblxuXG4gICAgfVxuXG4gICAgb25Mb2FkUGFnZSgpIHtcbiAgICAgICAgbGV0IHBhcmFtID0gd2luZG93LmxvY2F0aW9uLmhhc2ggPyB3aW5kb3cubG9jYXRpb24uaGFzaC5zcGxpdCgnIycpWzFdIDogbnVsbDtcblxuICAgICAgICBpZiAocGFyYW0pIHtcbiAgICAgICAgICAgIGlmIChwYXJhbS5zcGxpdCgnPScpWzBdID09ICdidW5kbGVfaWQnKSB7XG4gICAgICAgICAgICAgICAgJCgkKCcudGFiLWJ1bmRsZXMgbGknKVtwYXJhbS5zcGxpdCgnPScpWzFdXSkuZmluZCgnYScpLmNsaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHNsaWNrSW5pdCgpe1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnc2xpY2sgIGV4aXN0IG1vcmUnKVxuICAgICAgICBpZighJCgnLnByb2R1Y3RfX2ltYWdlc19fbW9iaWxlJykubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICQoJy5wcm9kdWN0X19pbWFnZXNfX21vYmlsZScpLnNsaWNrKHtcbiAgICAgICAgICAgIHNsaWRlc1RvU2hvdzogMyxcbiAgICAgICAgICAgIHNsaWRlc1RvU2Nyb2xsOiAxLFxuICAgICAgICAgICAgZG90czogZmFsc2UsXG4gICAgICAgICAgICB2YXJpYWJsZVdpZHRoOiBmYWxzZSxcbiAgICAgICAgICAgIGFkYXB0aXZlSGVpZ2h0OiBmYWxzZSxcbiAgICAgICAgICAgIGFycm93czogdHJ1ZSxcbiAgICAgICAgICAgIHN3aXBlVG9TbGlkZTogdHJ1ZSxcbiAgICAgICAgICAgIHByZXZBcnJvdzogJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2xpY2stcHJldlwiPjwvYnV0dG9uPicsXG4gICAgICAgICAgICBuZXh0QXJyb3c6ICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNsaWNrLW5leHRcIj48L2J1dHRvbj4nLFxuICAgICAgICAgICAgcmVzcG9uc2l2ZTogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludDogNjYwLFxuICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2xpZGVzVG9TaG93OiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2xpZGVzVG9TY3JvbGw6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmZpbml0ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvdHM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsU2xpZGU6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNlbnRlck1vZGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0pXG5cbiAgICB9XG5cbiAgICBzaG93QWJvdXRBdXRvc2hpcCgpIHtcbiAgICAgICAgJC5nZXRQb3B1cCgnYWJvdXQtYXV0b3NoaXAnLCB0cnVlKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFBvcHVwID0gJCgnI2Fib3V0LWF1dG9zaGlwJykuc2hvd1BvcHVwKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjaGFuZ2VQcm9kdWN0QnV5aW5nVHlwZShldmVudCkge1xuICAgICAgICAkKCcuY2hlY2tlci10eXBlIGxpJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmNsb3Nlc3QoJ2xpJykuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7WnVyaWtSYXRpbmd9IGZyb20gXCIuLi9wbHVnaW5zL3p1cmlrUmF0aW5nXCI7XG5pbXBvcnQge1Byb2R1Y3RQYWdlfSBmcm9tIFwiLi4vcHJvZHVjdC5wYWdlXCI7XG5cblxuY2xhc3MgUHJvZHVjdCB7XG4gICAgY29uc3RydWN0b3IoQ09ORklHKSB7XG4gICAgICAgIHRoaXMuQ09ORklHID0gQ09ORklHO1xuXG4gICAgICAgIC8vIG5ldyBIZWxwZXJzKCk7XG5cbiAgICAgICAgbmV3IFp1cmlrUmF0aW5nKCcuc2hvdy1yYXRpbmcnKTtcblxuICAgICAgICBuZXcgUHJvZHVjdFBhZ2UodGhpcy5DT05GSUcpO1xuXG4gICAgfVxufVxuXG5cbiQoJ2JvZHknKS5yZWFkeSgoKSA9PiB7XG4gICAgbmV3IFp1cmlrUmF0aW5nKCcuc2hvdy1yYXRpbmcnKTtcbiAgICB3aW5kb3cuUHJvZHVjdCA9IG5ldyBQcm9kdWN0KHdpbmRvdy5DT05GSUcgfHwge30pO1xufSk7XG4iLCJleHBvcnQgY2xhc3MgQ2FydFNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihDT05TRklHKSB7XG4gICAgdGhpcy5DT05GSUcgPSBDT05GSUc7XG4gIH1cblxuICAvKipcbiAgICog0JTQvtCx0LDQstC70LXQvdC40LUg0LIg0LrQvtGA0LfQuNC90YNcbiAgICogQHBhcmFtIGlkIC0g0JjQlCDRgtC+0LLQsNGA0LBcbiAgICogQHBhcmFtIGNvdW50IC0g0JrQvtC70LjRh9C10YHRgtCy0L4g0YLQvtCy0LDRgNCwXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgYWRkVG9DYXJ0KGlkLCBjb3VudCA9IDEsIGF1dG9fc2hpcCA9IDAsIGJ1bmRsZV9pZCA9IDAsIGFjdGlvblBhZ2UgPSAnJykge1xuICAgIGlmIChjb3VudCA8IDEpIHtcbiAgICAgIGNvdW50ID0gMTtcbiAgICB9XG4gICAgcmV0dXJuICQucG9zdCh0aGlzLkNPTkZJRy5CQVNFX1VSTCArICdjYXJ0L2FkZC10by1jYXJ0Jywge1xuICAgICAgaWQ6IGlkLFxuICAgICAgY291bnQ6IGNvdW50LFxuICAgICAgYXV0b19zaGlwOiBhdXRvX3NoaXAsXG4gICAgICBidW5kbGVfaWQ6IGJ1bmRsZV9pZCxcbiAgICAgIGFjdGlvblBhZ2U6ICdBZGQgcHJvZHVjdCB0byBjYXJ0IGZyb20gcGFnZTonICsgd2luZG93LmxvY2F0aW9uLmhyZWYgKyAnICcgKyBhY3Rpb25QYWdlXG4gICAgfSlcbiAgfVxuXG4gIGRlbGV0ZUZyb21DYXJ0KGlkLCBhZGRyZXNzLCBtZXRob2QsIGFjdGlvblBhZ2UgPSAnJykge1xuXG4gICAgbGV0IHVybCA9IHRoaXMuQ09ORklHLkJBU0VfVVJMICsgJ2NhcnQvcmVtb3ZlLWZyb20tY2FydD9pZD0nICsgaWQ7XG5cbiAgICBpZiAoYWRkcmVzcykge1xuICAgICAgdXJsICs9ICcmc2hpcHBpbmdfYWRkcmVzcz0nICsgYWRkcmVzcztcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kKSB7XG4gICAgICB1cmwgKz0gJyZzaGlwTWV0aG9kPScgKyBtZXRob2Q7XG4gICAgfVxuXG4gICAgcmV0dXJuICQuZ2V0KHVybCwge1xuICAgICAgYWN0aW9uUGFnZTogJ2RlbGV0ZSBwcm9kdWN0IGZyb20gY2FydCBmcm9tIHBhZ2U6JyArIHdpbmRvdy5sb2NhdGlvbi5ocmVmICsgJyAnICsgYWN0aW9uUGFnZVxuICAgIH0pO1xuICB9XG5cbiAgZGVsZXRlQXV0b3NoaXBPbmx5RnJvbUNhcnQoaWQsIGFkZHJlc3MsIG1ldGhvZCwgYWN0aW9uUGFnZSkge1xuICAgIGxldCB1cmwgPSB0aGlzLkNPTkZJRy5CQVNFX1VSTCArICdhdXRvc2hpcC1jYXJ0L3JlbW92ZS1mcm9tLWNhcnQ/cHJvZHVjdF9pZD0nICsgaWQ7XG5cbiAgICBpZiAoYWRkcmVzcykge1xuICAgICAgdXJsICs9ICcmc2hpcHBpbmdfYWRkcmVzcz0nICsgYWRkcmVzcztcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kKSB7XG4gICAgICB1cmwgKz0gJyZzaGlwTWV0aG9kPScgKyBtZXRob2Q7XG4gICAgfVxuXG4gICAgcmV0dXJuICQucG9zdCh1cmwsIHtcbiAgICAgIGFjdGlvblBhZ2U6ICdkZWxldGUgcHJvZHVjdCBmcm9tIGNhcnQgZnJvbSBwYWdlOicgKyB3aW5kb3cubG9jYXRpb24uaHJlZiArICcgJyArIGFjdGlvblBhZ2VcbiAgICB9KVxuICB9XG5cbiAgICAvKipcbiAgICAgKiDQlNC+0LHQsNCy0LvQtdC90Lgg0YLQvtCy0LDRgNCwINC40Lcg0LrQvtGA0LfQuNC90Ysg0LIg0LDQstGC0L7RiNC40L9cbiAgICAgKiBAcGFyYW0gaWQgLSBpZCDRgtC+0LLQsNGA0LAg0LIg0LrQvtGA0LfQuNC90LVcbiAgICAgKiBAcGFyYW0gY291bnQgLSDQutC+0LvQuNGH0LXRgdGC0LLQvlxuICAgICAqL1xuICAgIGFkZFRvQXV0b3NoaXAoaWQsIGNvdW50ID0gMSkge1xuICAgICAgICByZXR1cm4gJC5wb3N0KHRoaXMuQ09ORklHLkJBU0VfVVJMKydjYXJ0L3VwZGF0ZS1jYXJ0Jywge1xuICAgICAgICAgICAgaWQgOiBpZCxcbiAgICAgICAgICAgIGF1dG9fc2hpcCA6IDEsXG4gICAgICAgICAgICBxdHkgOiBjb3VudCxcbiAgICAgICAgICAgIHNoaXBwaW5nX2FkZHJlc3MgICAgOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc2hpcHBpbmdfYWRkcmVzcycpLFxuICAgICAgICAgICAgc2hpcE1ldGhvZCAgICAgICAgICA6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzaGlwTWV0aG9kQ29kZScpLFxuICAgICAgICB9KVxuICAgIH1cblxuICBhZGRUb0F1dG9zaGlwT25seShpZCwgY291bnQgPSAxKSB7XG4gICAgaWYgKGNvdW50IDwgMSkge1xuICAgICAgY291bnQgPSAxO1xuICAgIH1cbiAgICByZXR1cm4gJC5wb3N0KHRoaXMuQ09ORklHLkJBU0VfVVJMICsgJ2F1dG9zaGlwLWNhcnQvYWRkLXRvLWNhcnQnLCB7XG4gICAgICBwcm9kdWN0X2lkOiBpZCxcbiAgICAgIHF0eTogY291bnQsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiDQntCx0L3QvtCy0LvQtdC90LjQtSDQutC+0L3RgtC10L3RgtCwINC60L7RgNC30LjQvdGLXG4gICAqL1xuICByZWZyZXNoQ2FydCgpIHtcbiAgICAkLmdldCh0aGlzLkNPTkZJRy5CQVNFX1VSTCArICdjYXJ0L2NhcnQtcHJvZHVjdHMnKVxuICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAkKCcjY2FydF9fY29udGVudCcpLmh0bWwocmVzLnZpZXcpO1xuICAgICAgICBsZXQgbGF6eUxvYWRJbnN0YW5jZSA9IG5ldyBMYXp5TG9hZCh7XG4gICAgICAgICAgZWxlbWVudHNfc2VsZWN0b3I6IFwiLmxhenlcIlxuICAgICAgICAgIC8vIC4uLiBtb3JlIGN1c3RvbSBzZXR0aW5ncz9cbiAgICAgICAgfSk7XG4gICAgICAgIGxhenlMb2FkSW5zdGFuY2UudXBkYXRlKCk7XG4gICAgICB9KVxuICB9O1xuXG4gIC8qKlxuICAgKiBSZWNlaXZlIGNhcnQgcHJvZHVjdHMgb24gY2hlY2tvdXQgc3RlcCA0IHBhZ2VcbiAgICovXG4gIGdldENoZWNrb3V0UHJvZHVjdHMoc2hpcHBpbmcsIGNhbGxiYWNrKSB7XG4gICAgJC5nZXQodGhpcy5DT05GSUcuQkFTRV9VUkwgKyAnY2hlY2tvdXQvcHJvZHVjdHMtbGlzdC8nICsgc2hpcHBpbmcpXG4gICAgICAudGhlbihyZXMgPT4ge1xuICAgICAgICBjYWxsYmFjayhyZXMpO1xuICAgICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiDQntCx0L3QvtCy0LvQtdC90LjQtSDQutC+0YDQt9C40L3RiyDQv9GA0Lgg0LjQt9C80LXQvdC10L3QuNC4INC/0LDRgNCw0LzQtdGC0YDQvtCyXG4gICAqIEBwYXJhbSAkaXRlbSAtIEpxdWVyeSDRjdC70LXQvNC10L3RgiB0ciDRgtCw0LHQu9C40YbRi1xuICAgKi9cbiAgICB1cGRhdGVDYXJ0KCRpdGVtLCBhY3Rpb25QYWdlID0gJycpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdhc2QnKTtcbiAgICAgIGxldCBjb3VudCA9ICRpdGVtLmZpbmQoJy5jaGFuZ2VfcHJvZHVjdF9jb3VudCcpLnZhbCgpO1xuICAgICAgbGV0IHNoaXBwaW5nQWRkcmVzcyA9ICQoJ2lucHV0W25hbWU9XCJzaGlwcGluZ19hZGRyZXNzXCJdJykudmFsKCkgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3NoaXBwaW5nX2FkZHJlc3MnKTtcbiAgICAgIGxldCBzaGlwcGluZ01ldGhvZCA9ICQoJ2lucHV0W25hbWU9XCJzaGlwTWV0aG9kXCJdJykudmFsKCkgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3NoaXBNZXRob2RDb2RlJyk7XG4gICAgICBsZXQgY2hlY2tvdXRDYXJ0ID0gJCgnI2NoZWNrb3V0X19jYXJ0JykubGVuZ3RoO1xuXG4gICAgICByZXR1cm4gJC5wb3N0KHRoaXMuQ09ORklHLkJBU0VfVVJMKydjYXJ0L3VwZGF0ZS1jYXJ0Jywge1xuICAgICAgICBpZCAgICAgICAgICAgICAgICAgIDogJGl0ZW0uZGF0YSgnaWQnKSxcbiAgICAgICAgYXV0b19zaGlwICAgICAgICAgICA6ICRpdGVtLmZpbmQoJy5jaGFuZ2VfX2F1dG9zaGlwJykucHJvcCgnY2hlY2tlZCcpID8gMSA6IDAsXG4gICAgICAgIHF0eSAgICAgICAgICAgICAgICAgOiAoKGNvdW50IDw9IDEpID8gMSA6IGNvdW50KSxcbiAgICAgICAgc2hpcHBpbmdfYWRkcmVzcyAgICA6IHNoaXBwaW5nQWRkcmVzcyxcbiAgICAgICAgc2hpcE1ldGhvZCAgICAgICAgICA6IHNoaXBwaW5nTWV0aG9kLFxuICAgICAgICBjaGVja291dENhcnQgICAgICAgIDogY2hlY2tvdXRDYXJ0LFxuICAgICAgICBhY3Rpb25QYWdlIDonVXBkYXRlIHByb2R1Y3QgY2FydCBmcm9tIHBhZ2U6JyArIHdpbmRvdy5sb2NhdGlvbi5ocmVmKyAnICcgKyBhY3Rpb25QYWdlXG4gICAgICB9KVxuICAgIH07XG5cbiAgcmVmcmVzaENoZWNrb3V0Q2FydChjYWxsYmFjaykge1xuICAgICQuZ2V0KHRoaXMuQ09ORklHLkJBU0VfVVJMICsgJ2NoZWNrb3V0L2NhcnQtcHJvZHVjdHMvJyArIGxvY2F0aW9uLnNlYXJjaCApXG4gICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgIGlmICgkKCcuanMtY2FydF9wcm9kdWN0c19jb250YWluZXInKS5sZW5ndGgpIHtcbiAgICAgICAgICAkKCcuanMtY2FydF9wcm9kdWN0c19jb250YWluZXInKS5odG1sKHJlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJCgnI2NoZWNrb3V0X19jYXJ0JykuaHRtbChyZXMpO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9KVxuICB9O1xuXG4gIHNhdmVSZXdhcmRQb2ludHMoZm9ybSkge1xuICAgIHJldHVybiAkLnBvc3QodGhpcy5DT05GSUcuQkFTRV9VUkwgKyAnY2hlY2tvdXQvcmV3YXJkLXBvaW50cycsIGZvcm0uc2VyaWFsaXplKCkpO1xuICB9O1xuXG5cbiAgY2hhbmdlVXNlclR5cGUoY2FsbGJhY2spIHtcbiAgICAkLmdldCh0aGlzLkNPTkZJRy5CQVNFX1VSTCArICdjaGFuZ2UtdXNlci10eXBlJylcbiAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgY2FsbGJhY2socmVzKTtcbiAgICAgIH0pXG4gIH1cblxuICAvKipcbiAgICog0J/QvtC70YPRh9C10L3QuNC1INGI0LDQsdC70L7QvdCwINC60L7RgNC30LjQvdGLINCyINGI0LDQv9C60LVcbiAgICovXG4gIGdldEhlYWRlckNhcnQoKSB7XG4gICAgcmV0dXJuICQuZ2V0KHRoaXMuQ09ORklHLkJBU0VfVVJMICsgJ2NhcnQvaGVhZGVyLWNhcnQnKVxuICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICByZXR1cm4gcmVzLnZpZXc7XG4gICAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqINCf0L7Qu9GD0YfQtdC90LjQtSDRiNCw0LHQu9C+0L3QsCDQutC+0YDQt9C40L3RiyDQvdCwINGB0YLRgNCw0L3QuNGG0LUgZW5yb2xsbWVudFxuICAgKi9cbiAgZ2V0RW5yb2xsbWVudENhcnQoKSB7XG4gICAgbGV0IGlzQ2hlY2tvdXQgPSBsb2NhdGlvbi5wYXRobmFtZS5zcGxpdCgnLycpLmluZGV4T2YoJ2NoZWNrb3V0JykgIT09IC0xO1xuICAgIGxldCBwcm9kdWN0UGFyYW1zID0ge307XG4gICAgbGV0IHNoaXBwaW5nQWRkcmVzcyA9ICQoJ2lucHV0W25hbWU9XCJzaGlwcGluZ19hZGRyZXNzXCJdJykudmFsKCkgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3NoaXBwaW5nX2FkZHJlc3MnKTtcbiAgICBsZXQgc2hpcHBpbmdNZXRob2QgPSAkKCdpbnB1dFtuYW1lPVwic2hpcE1ldGhvZFwiXScpLnZhbCgpIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzaGlwTWV0aG9kQ29kZScpO1xuXG4gICAgaWYgKGlzQ2hlY2tvdXQpIHtcbiAgICAgIHByb2R1Y3RQYXJhbXNbJ2Zyb21fY2hlY2tvdXQnXSA9IDE7XG4gICAgICBwcm9kdWN0UGFyYW1zWydzaGlwcGluZ19hZGRyZXNzJ10gPSBzaGlwcGluZ0FkZHJlc3M7XG4gICAgICBwcm9kdWN0UGFyYW1zWydzaGlwTWV0aG9kJ10gPSBzaGlwcGluZ01ldGhvZDtcbiAgICB9XG5cbiAgICByZXR1cm4gJC5nZXQodGhpcy5DT05GSUcuQkFTRV9VUkwgKyAndmJvL3NpZGUtY2FydCcsIHByb2R1Y3RQYXJhbXMpXG4gICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgIGlmIChyZXMuaXNfY2FydF9lbXB0eSAmJiAobG9jYXRpb24ucGF0aG5hbWUuaW5kZXhPZignY2hlY2tvdXQnKSAhPT0gLTEpKSB7XG4gICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcy52aWV3O1xuICAgICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiDQntCx0L3QvtCy0LvQtdC90LjQtSDQutC+0YDQt9C40L3RiyDQsiDRiNCw0L/QutC1XG4gICAqL1xuICByZWZyZXNoSGVhZGVyQ2FydCgpIHtcbiAgICB0aGlzLmdldEhlYWRlckNhcnQoKVxuICAgICAgLnRoZW4oKHZpZXcpID0+IHtcbiAgICAgICAgJCgnI2hlYWRlcl9fY2FydF9fY29udGFpbmVyJykuaHRtbCh2aWV3KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqINCe0LHQvdC+0LLQu9C10L3QuNC1INC60L7RgNC30LjQvdGLINC90LAg0YHRgtGA0LDQvdC40YbQtSBlbnJvbGxtZW50XG4gICAqL1xuICByZWZyZXNoRW5yb2xsbWVudENhcnQoKSB7XG4gICAgdGhpcy5nZXRFbnJvbGxtZW50Q2FydCgpXG4gICAgICAudGhlbigodmlldykgPT4ge1xuICAgICAgICAkKCcuc2lkZWJhci1jYXJ0IC5jYXJ0LWJvZHknKS5odG1sKHZpZXcpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog0J/QtdGA0LXQutC70Y7Rh9Cw0LXQvCDQstC40LQg0LrQvtGA0LfQuNC90YsgKNC60L7QvNC/0LDQutGC0L3Ri9GL0Lkv0L/QvtC70L3Ri9C5KVxuICAgKiDQuCDQv9C+0LfQuNGG0LjQvtC90LjRgNGD0LXQvCDQutC+0YDQt9C40L3RgyDQtNC70Y8g0L7RgtC+0LHRgNCw0LbQtdC90LjRjyDQutC+0LzQv9Cw0LrRgtC90L7Qs9C+XG4gICAqINCy0LjQtNCwINC/0YDQuCDQt9Cw0LPRgNGD0LfQutC1INGB0YLRgNCw0L3QuNGG0YsuXG4gICAqIEBwYXJhbSBjb21wYWN0XG4gICAqL1xuICB2Ym9DYXJ0UG9zaXRpb25lcihjb21wYWN0ID0gdHJ1ZSkge1xuICAgIGxldCAkY2FydCA9ICQoJy5zaWRlYmFyLWNhcnQnKTtcbiAgICBsZXQgY2FydFdpZHRoID0gJGNhcnQuaW5uZXJXaWR0aCgpO1xuICAgIGxldCBjb21wYWN0T2Zmc2V0ID0gY2FydFdpZHRoIC0gNTU7XG5cbiAgICAvL2ZpeCBmb3IgSUUgY2FydCBib2R5IHNjcm9sbFxuICAgIGxldCBjYXJ0SGVhZGVySGVpZ2h0ID0gJCgnLmhlYWRlci1jYXJ0Jykub3V0ZXJIZWlnaHQoKTtcbiAgICBsZXQgY2FydEJvZHlIZWlnaHQgPSAkKCcuc2lkZWJhci1jYXJ0JykuaGVpZ2h0KCkgLSBjYXJ0SGVhZGVySGVpZ2h0O1xuXG4gICAgaWYgKGNvbXBhY3QpIHtcbiAgICAgICRjYXJ0LmNzcygncmlnaHQnLCAtY29tcGFjdE9mZnNldCk7XG4gICAgICAkY2FydC5maW5kKCcuY2FydC1ib2R5JykuY3NzKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpO1xuICAgICAgJGNhcnQuYWRkQ2xhc3MoJ2NvbXBhY3QnKTtcbiAgICAgICRjYXJ0LmZpbmQoJy5zd2l0Y2gtY2FydCcpLmFkZENsYXNzKCdjbG9zZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgJGNhcnQuY3NzKCdyaWdodCcsIDApO1xuICAgICAgJGNhcnQuZmluZCgnLmNhcnQtYm9keScpLmNzcyh7J3Zpc2liaWxpdHknOiAndmlzaWJsZScsICdoZWlnaHQnOiBjYXJ0Qm9keUhlaWdodH0pO1xuICAgICAgJGNhcnQucmVtb3ZlQ2xhc3MoJ2NvbXBhY3QnKTtcbiAgICAgICRjYXJ0LmZpbmQoJy5zd2l0Y2gtY2FydCcpLnJlbW92ZUNsYXNzKCdjbG9zZWQnKTtcbiAgICB9XG5cbiAgfVxuXG4gIHNob3dOb3RBZGRlZFRvQXV0b3NoaXBQcm9kdWN0cyhyZWRpcmVjdF9wYXRoID0gJycpIHtcbiAgICBsZXQgcmVkaXJlY3RQYXRoID0gYCR7dGhpcy5DT05GSUcuQkFTRV9VUkx9Y2hlY2tvdXQvYDtcblxuICAgIGlmIChyZWRpcmVjdF9wYXRoKSB7XG4gICAgICByZWRpcmVjdFBhdGggPSByZWRpcmVjdF9wYXRoO1xuICAgIH1cblxuICAgICQuZ2V0UG9wdXAoJ25vdC1hZGRlZC10by1hdXRvc2hpcC1wcm9kdWN0cycsIHRydWUpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHZhciBnb29kc0xlbmd0aCA9ICQoJyNub3QtYWRkZWQtdG8tYXV0b3NoaXAtcHJvZHVjdHMgLmNhcnRfX3Byb2R1Y3RzIHRib2R5JykuZmluZCgndHInKS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKGdvb2RzTGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50UG9wdXAgPSAkKCcjbm90LWFkZGVkLXRvLWF1dG9zaGlwLXByb2R1Y3RzJykuc2hvd1BvcHVwKHtcbiAgICAgICAgICAgIG9uQ2xvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ2FydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy5jdXJyZW50UG9wdXAucmVwb3NpdGlvbigxMDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYgPSByZWRpcmVjdFBhdGg7XG4gICAgICAgIH1cblxuICAgICAgICAkKCcuZ28tdG8tY2hlY2tvdXQnKS5hdHRyKCdkaXNhYmxlZCcsIGZhbHNlKTtcbiAgICAgICAgJCgnLmFkZF9fcHJvZHVjdF9fdG9fX2NhcnQnKS5hdHRyKCdkaXNhYmxlZCcsIGZhbHNlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgc2V0Q0NhcmRZZWFycygpIHtcbiAgICBsZXQgY3VycmVudFllYXIgPSAobmV3IERhdGUpLmdldEZ1bGxZZWFyKCk7XG4gICAgbGV0ICRvcHRpb24gPSBgPG9wdGlvbiB2YWx1ZT1cIlwiPjwvb3B0aW9uPmA7XG5cbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IDE1OyB4KyspIHtcbiAgICAgICQoJy5zZWxlY3Quc2VsZWN0LWNhcmQteWVhcicpLmFwcGVuZCgkb3B0aW9uKTtcbiAgICB9XG5cbiAgICAkKCcuc2VsZWN0LnNlbGVjdC1jYXJkLXllYXInKS5maW5kKCdvcHRpb24nKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICQodGhpcykudGV4dChjdXJyZW50WWVhcik7XG4gICAgICAkKHRoaXMpLnZhbChjdXJyZW50WWVhcik7XG4gICAgICByZXR1cm4gY3VycmVudFllYXIrK1xuICAgIH0pO1xuICB9XG5cblxufVxuIl19
